diff --git a/.github/workflows/deploy-cloudflare-workers.yml b/.github/workflows/deploy-cloudflare-workers.yml index 2b33c04..a58815f 100644 --- a/.github/workflows/deploy-cloudflare-workers.yml +++ b/.github/workflows/deploy-cloudflare-workers.yml @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup pnpm - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 with: version: 10.34.5 @@ -70,7 +70,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup pnpm - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 with: version: 10.34.5 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2e51cb7..2e9d882 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup pnpm - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 + uses: pnpm/action-setup@73e46992e05b19abd31f2f3c20e0e7370d762115 # v6.1.1 with: version: 10.34.5 diff --git a/docs/changelog.md b/docs/changelog.md index 5bcc706..dd5d53f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,9 @@ # Changelog +## 2026-11-10 — Clarify managed payment recovery + +- Offer a check of the existing payment after returning from Paystack, and show supported provider observations and reservation expiry separately without inferring payment from the hold. Preserve verified fulfillment and refund precedence and support older EMS responses. + ## 2026-11-07 — Add online events to calendars - Add individual online events to Google Calendar or download an .ics file for Apple Calendar, Outlook and other apps, including the public meeting link. Preserve registration and live viewing actions. diff --git a/docs/devcon26-attendance-counter.md b/docs/devcon26-attendance-counter.md index fb55f73..550c825 100644 --- a/docs/devcon26-attendance-counter.md +++ b/docs/devcon26-attendance-counter.md @@ -1,5 +1,7 @@ # DevCon26 attendance counter -The website reads the public 2026 attendance counter from EMS at runtime. An EMS Owner publishes the estimate or actual count from Registration. The website does not calculate or publish a count; it hides the readout when the endpoint returns an unpublished value, an invalid response, or an error. +The website reads the public 2026 attendance counter from EMS at runtime. EMS calculates the counter from a starting count and net fulfilled live ticket purchases. The website does not calculate or publish a count; it hides the readout when the endpoint returns an unpublished value, an invalid response, or an error. `PUBLIC_DEVCON26_API_ORIGIN` selects the API origin at build time and defaults to `https://em.devcongress.org`. The production website reads that origin directly. For the website-owned Workers preview URLs using the default API origin, the Worker relays the fixed public counter endpoint because EMS only permits the production website origin. The relay forwards no visitor headers, query parameters, or credentials, and does not cache the response. A custom configured origin is called directly and needs its own CORS and CSP configuration. + +Deploy the reader and relay before activating the EMS `ticket_count` source. The reader also accepts the legacy sources during rollout. It refreshes on return to the page, after a verified live purchase in the same page or another same-origin tab, and periodically while visible; bounded retries accommodate delayed confirmation. Cross-origin tabs are picked up by visibility or periodic refresh. Fetch failures hide the counter. diff --git a/docs/devcon26-flexible-checkout.md b/docs/devcon26-flexible-checkout.md index c533614..0c5e83a 100644 --- a/docs/devcon26-flexible-checkout.md +++ b/docs/devcon26-flexible-checkout.md @@ -132,6 +132,8 @@ The payment badge editor opens the photo adjuster after a new image is selected ## Failure recovery +Returning from managed Paystack checkout offers a link to check the existing reference with its saved browser grant. It never starts a replacement payment automatically. Managed confirmation can show an optional, allowlisted provider observation and a separate expired reservation notice; these are historical context, not proof of fulfillment or that a new charge is safe. Verified fulfillment and order-level refund states take precedence, and older EMS responses without this metadata retain a safe fallback. + An order that cannot accept payment retains its request identity; the buyer is directed to check email or contact the organizer before starting again. The payment confirmation page hides Retry if its browser grant is absent and directs the buyer to their private ticket email. This does not infer that payment failed or authorize a new charge. The admission backend separately reconciles stored payment references. The missing-access state uses a centered, narrow layout on the existing cream background, with a fixed-size ticket-and-envelope illustration beside the heading on desktop and mobile. It displays the buyer-formatted reference as a support identifier and includes it in the contact-email subject; it is not proof of payment. Other confirmation states hide and clear these recovery details. diff --git a/package.json b/package.json index a80ba66..85256bc 100644 --- a/package.json +++ b/package.json @@ -18,12 +18,12 @@ }, "dependencies": { "@inttegro/js": "0.7.2", - "astro": "^7.4.4", + "astro": "^7.4.7", "zod": "^4.6.7" }, "devDependencies": { - "@cloudflare/workers-types": "5.20261030.1", - "wrangler": "^4.156.0" + "@cloudflare/workers-types": "5.20261106.1", + "wrangler": "^4.158.0" }, "pnpm": { "overrides": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6fb65f5..96a893f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,18 +16,18 @@ importers: specifier: 0.7.2 version: 0.7.2 astro: - specifier: ^7.4.4 - version: 7.4.4(esbuild@0.28.2)(yaml@2.9.1) + specifier: ^7.4.7 + version: 7.4.7(esbuild@0.28.2)(yaml@2.9.1) zod: specifier: ^4.6.7 version: 4.6.7 devDependencies: '@cloudflare/workers-types': - specifier: 5.20261030.1 - version: 5.20261030.1 + specifier: 5.20261106.1 + version: 5.20261106.1 wrangler: - specifier: ^4.156.0 - version: 4.156.0(@cloudflare/workers-types@5.20261030.1) + specifier: ^4.158.0 + version: 4.158.0(@cloudflare/workers-types@5.20261106.1) packages: @@ -102,11 +102,11 @@ packages: resolution: {integrity: sha512-IvwYLB8t1M86rKO4oPdBi9GP4gzXcgrVlNgocjwos1jeeUuEIV8d9Crn1PvYD/5IKteWOxpIHomf7e8iYlkE+Q==} engines: {node: '>=22.12.0'} - '@astrojs/internal-helpers@0.13.0': - resolution: {integrity: sha512-20jxQqnSmpskcGyad7N5l6Xf1gz0UCa6lNde44bEBdaXGpncEYfAZJ142r2ZgzBaG4dUyzGmhqZWv1INU2eiHQ==} + '@astrojs/internal-helpers@0.13.1': + resolution: {integrity: sha512-LgGLGzoC0wCT3mjDYrxz+hct/tws0enpWsLJW3bswHR3PKgusp/H9xRIT8rTdsyvLM0TcRhhvRL30J2oaZNcqA==} - '@astrojs/markdown-satteri@0.4.6': - resolution: {integrity: sha512-6biKp2lEAYycF3jhv91br+Otyf4EgDFkF1oRL9ks0u/m/YRGmI7XkGQ2MgaM35DslT03f7NtozKtlqfBNkp6bw==} + '@astrojs/markdown-satteri@0.4.7': + resolution: {integrity: sha512-MZvnec/898GGGHQZfkArVbkdZmL1imjIM8RWkmzbAmse737zr8D9inUjFQ5eLBXV3vPobOUs/ZRV/D6Po/bVDg==} '@astrojs/prism@4.1.2': resolution: {integrity: sha512-jMrUEpFDarDO1KWPvVc9eSa8DSfwBlwEOHwX+8zvZQpiqXRGDxFnOXHsYqV6DP7w+0qIgTr98gS1GdQlm8ypWg==} @@ -116,16 +116,16 @@ packages: resolution: {integrity: sha512-2JOMRUxJrBSfiVDfeKLv1wBmvSIx1Y6u2YEO8awZ9qSq3u/rNAiUyFdOYi8dHv91kHrmYEQX7pRDw0J4xyj3UA==} engines: {node: '>=22.23.4'} - '@babel/helper-string-parser@7.29.11': - resolution: {integrity: sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==} + '@babel/helper-string-parser@7.29.13': + resolution: {integrity: sha512-fWegr+WsEsiMVW4KUNdIIzzMTZSzNiqhy0//6+2MRi2d5NFNsL/AYwBQW8eBnRbTBVRnDVzjaJEUqKaCWjMMdQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.12': - resolution: {integrity: sha512-WJ7JBp/Q4+z/ImydtI7jS6NVco5++632ExBemSX+Ysb+G1lCwQ5BVo3SY+jGGOcZXI4ZccbZSUSJLNBW6eEpJg==} + '@babel/parser@7.29.13': + resolution: {integrity: sha512-fJM50YYjlTiBhgdkGmC1tBpv+FMAyo4annf2X6Aks+0yRlaiVkYW/3f07xAfVVkYIoZ9fFZp+mEThUFnuybhkQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -133,52 +133,62 @@ packages: resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==} engines: {node: '>=6.9.0'} - '@bruits/satteri-darwin-arm64@0.10.5': - resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==} + '@bruits/satteri-android-arm64@0.11.6': + resolution: {integrity: sha512-9Cb6ZRDn29c0kluGA9urp/So/JnJOJJSf4J40xYLAIAj3GuqTNsCyquS4A1/yLuuHE2ngYJNnCylAQnDM3L9ow==} + cpu: [arm64] + os: [android] + + '@bruits/satteri-darwin-arm64@0.11.6': + resolution: {integrity: sha512-kcr7QOPGrckuyhMZmUKYcyoXgjQN4vJ/6tCWHE2866mztZPNrTuy5itTwSAbIs1tK0XpTW42tBQ+XPNnkg0XIg==} cpu: [arm64] os: [darwin] - '@bruits/satteri-darwin-x64@0.10.5': - resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==} + '@bruits/satteri-darwin-x64@0.11.6': + resolution: {integrity: sha512-nwh4Atd/Cxw2SNS6+Gs0Esf/w2i4qyHzwcECaTgoFyxse3m0dpBpu8eqkqqIPfBc1lWhfe4i9LXuk7rG+4pwQw==} cpu: [x64] os: [darwin] - '@bruits/satteri-linux-arm64-gnu@0.10.5': - resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==} + '@bruits/satteri-freebsd-x64@0.11.6': + resolution: {integrity: sha512-qMkNZRYN3cLshfYawQYjfDS05A208QCOVh1adtEteYH+03MkuOoVVhYkzDRIKhWdfM3gFFEaUjXDOGfVqGjEJg==} + cpu: [x64] + os: [freebsd] + + '@bruits/satteri-linux-arm64-gnu@0.11.6': + resolution: {integrity: sha512-A7cHeCZQkvF3oTgQ6/5LvVriauE1dHo3u3gAME6H1X/+KMeum5Wras3Y7rYUcvPym1CxdmzjZh9WlYD62Ul1xg==} cpu: [arm64] os: [linux] libc: [glibc] - '@bruits/satteri-linux-arm64-musl@0.10.5': - resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==} + '@bruits/satteri-linux-arm64-musl@0.11.6': + resolution: {integrity: sha512-P/YAudp6VmUr63SFaZefwPIefsw92oZ1wQ6vqrtO/GY9qB3OxLqUVjSIcnKAtqMp4kDW8xBEdSwHz4GZU7P2+g==} cpu: [arm64] os: [linux] libc: [musl] - '@bruits/satteri-linux-x64-gnu@0.10.5': - resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==} + '@bruits/satteri-linux-x64-gnu@0.11.6': + resolution: {integrity: sha512-nhj90eZFLSA+Icd6n+oYpAi/UXr/mppLGd8jdEOB/larvWAZ/ewFxpT7CLzuNCg7r75+gkdHv9JuRb5eERY1Kg==} cpu: [x64] os: [linux] libc: [glibc] - '@bruits/satteri-linux-x64-musl@0.10.5': - resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==} + '@bruits/satteri-linux-x64-musl@0.11.6': + resolution: {integrity: sha512-mkWxwHd5Q2dDs+OZK/P1tZFvSPrh2Bb69utWHcBNM0wyJCRWd61T4jU1tF21lGL1C5dy7P+LvaT0y6PQDJj89Q==} cpu: [x64] os: [linux] libc: [musl] - '@bruits/satteri-wasm32-wasi@0.10.5': - resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==} + '@bruits/satteri-wasm32-wasi@0.11.6': + resolution: {integrity: sha512-GrjNThC6BfA0u8LZwGpOeEFVKoJZsriowLtj/rBYj18fW7/UZouyzn/0Tsxg+tMaxMUgC9HFA078EmfAsdVONg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@bruits/satteri-win32-arm64-msvc@0.10.5': - resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==} + '@bruits/satteri-win32-arm64-msvc@0.11.6': + resolution: {integrity: sha512-Plesa0QYtJoa3nlObg1Ypj9oD1VOioHMldHUUtG61T/JNU11EcN0pyj0tDsT3DW2pAxKrV0Q8xrfzGtBHuSjfg==} cpu: [arm64] os: [win32] - '@bruits/satteri-win32-x64-msvc@0.10.5': - resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==} + '@bruits/satteri-win32-x64-msvc@0.11.6': + resolution: {integrity: sha512-fGs5d/7jBIPkYmXkhm9unoEfDuRZ5r66NLxbr+6c8bm0f7ywgPHgW3HJ9L7fKvyqhw49ePtbT4vkWREju8/U6w==} cpu: [x64] os: [win32] @@ -207,38 +217,38 @@ packages: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20261023.1': - resolution: {integrity: sha512-lsEx0i7nR0PNG/erUFFHmQmiidEhLfDE5uQmAL9421/y4/ycuxDDOSaxu3VGGYFFPK5sduyUeMmjIlX4CwOBFg==} + '@cloudflare/workerd-darwin-64@1.20261104.1': + resolution: {integrity: sha512-5Bl+P1HT1/Ezk7Yrhyd+QkJ4VC/3naO0L3so/AkpgdaAHG3bmUmcCJBAtwH7O4JdVt8SMfm6EV89seiPpdjHJQ==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20261023.1': - resolution: {integrity: sha512-5e79fHgabdDD8EgmjOhJ1S+xMsf6DbC7fL7IgTBizMnzOp0P2isDn7pYmUxI9AJZE9FVQ4RUilH/I36YNg+GQQ==} + '@cloudflare/workerd-darwin-arm64@1.20261104.1': + resolution: {integrity: sha512-2fM+0klAjspAQ3Jl0iw0gVyGpNnkvPiZ50WHigPLhWQRiS+zhabFXVR07zz1RaPGkJHrMjEpWoEfjjm8nU5IOg==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20261023.1': - resolution: {integrity: sha512-VHQ6jKFSihjR2+x1buby8XTdBLLJztVnYiB7OLOTYO8aDXB+c1Rd2410PdgFuFYc4AgFEk6PCJLyCLL5L1KBnw==} + '@cloudflare/workerd-linux-64@1.20261104.1': + resolution: {integrity: sha512-VgpZIOooZHjSxjEZIJ1hkyt/jTfL3KeavkWCc0x7xxVu9zgkplaJF78Iv6CzoCTamQXyZeBaRQHS2bbAc70Vgg==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20261023.1': - resolution: {integrity: sha512-ilpRHzfDN8YFRM5CLRKuFw40x/LJBS89yVdhdQmxehlVDuBqjKpJB++zPFbTgKRRFaNupgnXc8RHktXAIhgCmQ==} + '@cloudflare/workerd-linux-arm64@1.20261104.1': + resolution: {integrity: sha512-uEBJJHh2SbeQauRGrad7tIFIrpUQ5LUqZX40l7IKwYd0yeemvsno8f57w34Bx/pPpaSsNYVcV5oNFVbv+v/BOw==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20261023.1': - resolution: {integrity: sha512-279WLVjNsMycAwr0EZNiNEf0l2SY6NUtsN80NwZzbTHzakmiN+WSx4w38muxPm+PAU0oSPPAPXKVD+H6Hya8xw==} + '@cloudflare/workerd-windows-64@1.20261104.1': + resolution: {integrity: sha512-b/fnEU1leVm8UrI2EHQ4MSrK2vmnWdR1jefRyEUDZe3ucpKY0PWi4bVxWh5niZdlL0MIc4C5tXNXTlAMZpKDdA==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@5.20261030.1': - resolution: {integrity: sha512-oKHewMzKBtXq3dWiYL9GpHFnBfg8juBOir9PPREMPT8G2MHotAxIBIQ2w1rpO1xCN9etRlAxJaeoQbMGSlXqlQ==} + '@cloudflare/workers-types@5.20261106.1': + resolution: {integrity: sha512-uQtZyYehF0hwImaFi0/z/BWeTC/DMKpEo+nCySs5WZwoMhnIqLnN3sVjS7GCBc222EWf+F6khsHPWIvPEaP6JA==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -250,18 +260,27 @@ packages: '@emnapi/core@1.11.3': resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + '@emnapi/core@2.0.0-beta.2': + resolution: {integrity: sha512-MzCVoWtcg4Pm2B3je5mMvYMvj3MmBKw+fU7vbsJc9/iT8ip6/eYIHo/Dsm/mr+wsHB6SEyJDuxB09Yy6r/8+4A==} + '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} '@emnapi/runtime@1.11.3': resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@emnapi/runtime@2.0.0-beta.2': + resolution: {integrity: sha512-JcrSPzPvZuNZvJqPTF9Fw25LbOJ8avzFVlaf2grmH4Cku0oGP47tRgqPZadcfj3YoZMHkFVnCYFbQM8I+i5QEw==} + '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} '@emnapi/wasi-threads@1.2.3': resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} + '@emnapi/wasi-threads@2.2.0': + resolution: {integrity: sha512-JP7OYH38Q7+pyTAe14raZHLQIK7BDKbdwji+Xi3pcd/6QkJYQH3SX4wu6EplGrGJWRepoNzedfm0G3B9Z4e9Rw==} + '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} @@ -601,12 +620,22 @@ packages: '@emnapi/core': ^1.7.1 || 2.0.0-beta.2 '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2 + '@napi-rs/wasm-runtime@1.2.7': + resolution: {integrity: sha512-zJccwplOAbgfZju95IUHazLnx9RAPtPN2YGJXI6UbrgeaR9QfPjGrQL6ERkSAtnVCA4Q+83ApGyaX5zdpCaKkQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 + '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} '@oxc-project/types@0.156.0': resolution: {integrity: sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw==} + '@oxc-project/types@0.157.0': + resolution: {integrity: sha512-95iTox1qdt6WGWce3xwNOVayByOfLaYAq+qGPpub6NWbBh9sv0GG3+zyfh9ZBCO/jVu5A0EWI+qQI7g6fevjxg==} + '@poppinss/colors@4.1.6': resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} @@ -622,36 +651,72 @@ packages: cpu: [arm] os: [android] + '@rolldown/binding-android-arm-eabi@1.3.0': + resolution: {integrity: sha512-zjq+pUSE36RJG9nJXqrRfMCOxekzVhlaYMtFELHaOcRH4UqTnkWhbTbEixKEawsb0ZTVMRbn8RLYcuU4DYk8qg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + '@rolldown/binding-android-arm64@1.2.16': resolution: {integrity: sha512-kx5wBiMB6E7TEvpl2B9gjLU004BkvEm2Dr941BFjx/SontPwSzNuQUIoVKxHHoSjpFIfHMmcguyLOtyn0hObRg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.3.0': + resolution: {integrity: sha512-HdnCiSmMGgEILGVLU1o4dcOblLGj8sMnqEFrDY/S7KRti1nTQHAqGGs2AniPspbK90AFS3pM23K/R0J3hPQXYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.2.16': resolution: {integrity: sha512-qslZrXnKJU4cUpjoAmtAo/KQM9e2IRMlmpig6Zpwj+8KWxW8v+nkAf9216Bsek9lOC1jvg2yCjygCFo2f83msQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.3.0': + resolution: {integrity: sha512-TkQ2JGC8/9UxoCeH5dSJj1gxuFhzw200QTJJd2YNPRXznSSM4XvpKV2Cs+RM2BcM8sa6xa4rmXNuiJ64+1993g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.2.16': resolution: {integrity: sha512-FdF+y48ND13eAyM2mQn+85kvAqNlvRWROy2rhgA463X/0Gv4vGtazZtfaF1mRBLscYvtOlh4QnLjOWiFzX69OQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.3.0': + resolution: {integrity: sha512-Gr+iZW50RJZo4BPUazaDh/Azx7W0Rl04sy2MkXD+H4RkxzUX5hIrjaVw1BK+XHsccKExQAmCy6DhvRLlUzaYUg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.2.16': resolution: {integrity: sha512-ddjqFM5e95AgLbUPtKIS7V1KTVlA0RUgCVr5mn+/IEhsdy3pr+Vuj/HZ7nlMN2FyxIwUktOH1LEPIQXO1v9y1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.3.0': + resolution: {integrity: sha512-RwAtx8peSqUoBf8pxE0L62xKXBNnA3BtdFV+07t13t0TQoASCtV9tnU67aKKMRZSiD06SU07chB5B8fWFdW3gQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.2.16': resolution: {integrity: sha512-tHdKWbFkFBI687iim3LIyIvyL7j66VvQYkDPss5Stn/qyE2tWkR1YD0dXmXPFKKqT/o5ZEJVsaRsWS2meQwGOA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.3.0': + resolution: {integrity: sha512-ow8fq6kYaIx75D0EVT5GeF4DcawcEYYXJ2CvEaOzyygW1jtVDQU/9o5YYidctHBRDUgPzGaTNB6n/VMTmd1ymw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.2.16': resolution: {integrity: sha512-FJiLGAblPBMlBEdbOqw6kW6QcXDWAf/oJu7gYs9ZJZwmg+K+/zjFLxPTIY9izJUzxzc24FHvmseyA0IvJSl17w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -659,6 +724,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.3.0': + resolution: {integrity: sha512-PLOWuiz+rdqSgiLgN7bxvy6DjXLj8gnJxzRS243LNnLi96VeyB7VFsC3eblcKv3Xwd3jQqJfbCWRhLijTIZyvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.2.16': resolution: {integrity: sha512-hrJpblMsrQ58U9veWpbXzkhV5zStunds6HWLprqq1qauvgBr1E6P+24kLj6lSLI9vjRn/RYpjprhkHQPKGWpNg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -666,6 +738,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.3.0': + resolution: {integrity: sha512-CQ/k85cc342j5SnZ/gT9p132NXZRGTgLRhfItdYqUg+jpvL5HYFve0GB+zQDCYGwDjtDWIoqKSOitkmZMZc/tw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.2.16': resolution: {integrity: sha512-qJd/dC6j6CwLG9/s/RP2nb1RZ0GIgj7Ioj7x/SYa3RzjVrlzrmH0fhIOpfvqQDeIsdP0loi+kHaMhJzY1PBIaA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -673,6 +752,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.3.0': + resolution: {integrity: sha512-wk+ZG7xDP2px3cQRFoNoNp52/w1O5hTTtciHxuastreMOp8isYUTCpcG/rEYnSQBI+nycN+B9d9pBGua+qvV7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.2.16': resolution: {integrity: sha512-Vx7Xg5uUJuNcujJjI70OICaH0EYj80BtOLZTSN7uOYg8QOLlyKnaG0IW7Fn/J0IpJsaKzmDKMhOQv1JBM9m9vg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -680,6 +766,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.3.0': + resolution: {integrity: sha512-sEgyZt72Rj7V5q6OZ7A4U2I5v4EMGEv3Fp5QmoncmKbUMTrGmpyH7MwENfERGbfUYjxdBmktw4JJLys5I1aQNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.2.16': resolution: {integrity: sha512-TNKhgE3uJTsTzatUSSYt0Kgo+Oa2uSlSjz4r1aEIea7HX6ULBym4fAlYUhG1i6pjNf2njfCUAfKwr6C3E9Xg1w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -687,6 +780,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.3.0': + resolution: {integrity: sha512-PvL0BoBUwVugK1pFd+zyVk1L9F6ucmQ7oF2dpy8zKPHNlbW2zrU9Jst3fWYfG7z3owjxqhwAvi5G4o0AikrJMw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.2.16': resolution: {integrity: sha512-7chXdpjXZ8qG0+mIxECN3cT9kvhZ3/oZhMX6Pp876P7CDrIy8nJswva6Mq357JR7eYXfuskwZxMeV1SzoZdHrA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -694,53 +794,83 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.3.0': + resolution: {integrity: sha512-5N4DdzAmLtnyuh027H6ViC99BeoA4T0RwKS6qUrl6zY70AKRsNDrnEZeWnqrKmDRFxXmv8zf9yhF2DxN/SfyGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.2.16': resolution: {integrity: sha512-Kwjt+7uNTJK5/MDkGWGVO2KQPnj8yAV75dMpfwyHZrJSXWHrniOB0aUEWlVYf3H1hOqFLIStLdM5QXq6bnKmOQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.3.0': + resolution: {integrity: sha512-Tz+2b+yF5eVRGX3DWebn2JIvZkNYI1gkafI+nF2fau2zeQDOpBAS8w1PxHi4ke//NIOE6+2DNYyq1veIjzAXqQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.3.0': + resolution: {integrity: sha512-ntK6OFor3nQtS1TenZP5wX59oPpkKEmour3AipGHB32u+Z8QXxjVdG+7vNSvgerRWIj6vjg4XpKu42slb0vlXQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.2.16': resolution: {integrity: sha512-/LH6WfjDRXXJz/p5xl4TmU+jpcnwcxbKEQBW/GZE0JHfN0lGIyTtsUEGaQ/q/GikkGJ2yLKe6pwm7AnEWO8pdw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.3.0': + resolution: {integrity: sha512-ldH38lBlOpS+b4fbSG9euQjhYXLE18PIz5hyvf6gvFfyVLodRE/Tsu4jV8UmPqjjce6lotmUUwscxPuer4lczQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.2.16': resolution: {integrity: sha512-1lv1KvX0Z871zfk7vw+dnXMMnHNyDwMzWG8Kv3HxDXMOhzCX4SHc7HK319fInP0i+0p9D8brkfzL7pJOaGl+tw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.3.0': + resolution: {integrity: sha512-HglhUzUPuXNTGFt5ZwJalSEvavhFSl+nxpQM9urkzkt+2oGI1ZSwgyytk9aGw15/0kk1TCHPc57nv3DdiG8/yQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@shikijs/core@4.5.0': - resolution: {integrity: sha512-6CIgwq+bt2JZ3OSjb/nBkkwEf/CfpHcbam+Mg5Pllco7HAGRQ2/EFhZrrJtbyNTgKwknfVS+llsXGygiDGwJWw==} + '@shikijs/core@4.6.0': + resolution: {integrity: sha512-bfd4OKgvoyXYiYmMRuleA656P4V7M/Du9lcTl38Ngm6KszMj7bq4J1IGZwSYR4c95Tv5UQALtYNWUwaI9UT3xw==} engines: {node: '>=20'} - '@shikijs/engine-javascript@4.5.0': - resolution: {integrity: sha512-Ed6UdEj84LyYkwnxM5CvSMWAD+id9ExTYri0/+x41U9zrgNifPSS9lZm0JqBP0VfYI8yr8tY5nbNq9+p9R0kFA==} + '@shikijs/engine-javascript@4.6.0': + resolution: {integrity: sha512-K0oqxFoL+kEMdz89mHLFO15Tsbv3kFZ6WR1cXZKMvLSc+oqaM00A6pyga1qSeXB22dP0tTiSApRcGBaKWsEccg==} engines: {node: '>=20'} - '@shikijs/engine-oniguruma@4.5.0': - resolution: {integrity: sha512-dKVmbJecVdB9recl8a/CU4jdpNXyjJQrIcesIkpS70s5HS02ohpnCSpMUbotPnEUzbAcLQ+S4hwZYbkBBiTcJw==} + '@shikijs/engine-oniguruma@4.6.0': + resolution: {integrity: sha512-aggd6Q7SuJOXNnsUbfG2XesxBJKBMAw/PDTUo9PyRjMaaJJ2dNrI+q0C+25ARXAK9yLHAlwxc9oRT2u68YKZ7w==} engines: {node: '>=20'} - '@shikijs/langs@4.5.0': - resolution: {integrity: sha512-wwBTqwduXSz0X4v9Qa2EWeFaYJEw1clCncWjoRNQRbVDu3SPRTRWucnouYapKj3b8Q+sk/41Vbc4B5c8nuYzLA==} + '@shikijs/langs@4.6.0': + resolution: {integrity: sha512-1yMEX3oCVV54LUq/ovfpRkDQoYDkcvjSWFFa/YLUDMiSoRzMi2uxLJYbv41ahT8Lu9lFMaa7hecd3Q39trqUyg==} engines: {node: '>=20'} - '@shikijs/primitive@4.5.0': - resolution: {integrity: sha512-UM7ShlA8oz0OWxLLO8BmO9Ip6fVqdkt8yF0EH7nOCqHfrx1eEAzF0ZUVK7L+I8NEgeu1PEWSRlxaiPPeCb4iDg==} + '@shikijs/primitive@4.6.0': + resolution: {integrity: sha512-c54+TQEo9ToqgfL/AU8FpjnV09+GA9Oa7M5ROkkXteZfp5XzpAJGXjjvZQFQioJOwm/w/6Z3lIzQstAkl8coag==} engines: {node: '>=20'} - '@shikijs/themes@4.5.0': - resolution: {integrity: sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q==} + '@shikijs/themes@4.6.0': + resolution: {integrity: sha512-qHAVAs80RiGD+IRuH9G+JPDOEc9A/kHsng4EzCUCwB9bLzW6Z0y9WETh2YyCcADJBmfrIaJ1Jp7KBNP6FHkgtQ==} engines: {node: '>=20'} - '@shikijs/types@4.5.0': - resolution: {integrity: sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw==} + '@shikijs/types@4.6.0': + resolution: {integrity: sha512-+ENG1adsKt/X7cRYw1Nl7BEpBmPOjmQ7bR/eGmHuMlT8gtOFf3KEi5l31DJYyAWhW6Y6bjP1plU7FmaxWGENFw==} engines: {node: '>=20'} '@shikijs/vscode-textmate@10.1.0': @@ -789,8 +919,8 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - astro@7.4.4: - resolution: {integrity: sha512-e+BzhGCaIY/H1tV/BQPTbOPZVZ8wuu6+bbpc+3oSMH2UgoB1l9peSGASk6nswtYra9PO9OoMREhldKtQkZ5TVw==} + astro@7.4.7: + resolution: {integrity: sha512-fH54IOaCkZY1paEjygKn8CPfuJ3w8ns7PourcPML5AouJkQuTBqBQ2RbbIbBhutZbg2qn5se6Yl9DYybzqjC0Q==} engines: {node: '>=22.23.4', npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true peerDependencies: @@ -851,8 +981,8 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} - cookie@2.0.1: - resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==} + cookie@2.0.2: + resolution: {integrity: sha512-SL0cVuEdETEp7pN0FuZb01toc3vnODEfVUCooxG1SJN0yIirh7JMb9X9bvfCFf0vzzbT68RdbKDHYTiWy7a7iw==} engines: {node: '>=22'} crossws@0.3.5: @@ -934,9 +1064,6 @@ packages: engines: {node: '>=18'} hasBin: true - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1129,8 +1256,8 @@ packages: micromark-util-types@2.0.3: resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} - miniflare@5.20261023.3-beta: - resolution: {integrity: sha512-thdXzlktu5GE1o/BlmMAPeJ0Cu6Tu5LpMbRlyfRrpVvMRrhd6p52TMqcITCZZLVzt1UO92VGBkLDhLOpryUAyQ==} + miniflare@5.20261104.0-beta: + resolution: {integrity: sha512-pYZ2n85+FYUb7s0oIVcQxO63/+wgaknm+A/kQjctJqshvHPJs3UtnzaIZ7xrrHMOk8atD7yAfauf6G9VAv7Upg==} engines: {node: '>=22.0.0'} mrmime@2.0.1: @@ -1179,13 +1306,9 @@ packages: resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==} engines: {node: '>=20'} - p-queue@9.3.5: - resolution: {integrity: sha512-Lki/zhXFVmDhesBUn/yHRLW9Bte7mE7xoFHzTR8sIomV7a2z+LxYAPkGvdfidNiu4fKSfjtawixxSHcZci5QcQ==} - engines: {node: '>=20'} - - p-timeout@7.0.2: - resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==} - engines: {node: '>=20'} + p-queue@10.0.0: + resolution: {integrity: sha512-P2wrCri3bhGLPo3kX7qYVXbo/5GvaVATU0DpO24CbeT53Y4z35t8JUWku04ERpXHUYB5rPMi3TkWE3fmJgx5rA==} + engines: {node: '>=22'} package-manager-detector@1.9.0: resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==} @@ -1252,15 +1375,20 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - satteri@0.10.5: - resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==} + rolldown@1.3.0: + resolution: {integrity: sha512-7j1jdVlzWzbRat9EDMsB/QmyMcc6hOO0vbcma8LGjBTmKlpS5Hem+5fpntc/HoRV5tLrG+Qo6I1ZHV/ZuL5S8g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + satteri@0.11.6: + resolution: {integrity: sha512-ddGCTqSfwL+A+odhdjj8E+ZMu1h0QEnG3VTmu7fPJL2+80GdjxDh1AeCw8mn2aa95eQSosG4e2QBYYfCc5nyiA==} sax@1.6.1: resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + semver@7.8.6: + resolution: {integrity: sha512-9lpSSU4Mly3mrtruwLs1eLK6+gzbzqeBFwRNjIjE+9LuDpWdYctrQlQ3ej1Ilgi7gknpsTRnPoLP8DpCHqHIJw==} engines: {node: '>=10'} hasBin: true @@ -1273,8 +1401,8 @@ packages: '@types/node': optional: true - shiki@4.5.0: - resolution: {integrity: sha512-OcRW72ngQvc+MSVWBRIovC/BTW589iUE/Vxav7VeM4RcY9MUjqB+IR6ILG1k9nuW6LiG/nct9uma4/MBtnZbmQ==} + shiki@4.6.0: + resolution: {integrity: sha512-imjLsVHgPuWhvpU3P+zOekvMYqnel7QmKsFC4Sn0fCuAvaaalBsxwKEsrU8Ko5BdFnZA6Go/8a0RzahS634UgA==} engines: {node: '>=20'} sisteransi@1.0.5: @@ -1330,8 +1458,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tslib@2.9.1: + resolution: {integrity: sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==} ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -1346,8 +1474,8 @@ packages: resolution: {integrity: sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==} engines: {node: '>=20.18.1'} - undici@8.12.3: - resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} + undici@8.12.4: + resolution: {integrity: sha512-8Mx+uNKKER2bA4AdtedkqRbwUCIJFr2nJckXRe5yrDqzePqwLP7VNcctN8/XdmDSbF7mS+jJKIszlL+vbam1VA==} engines: {node: '>=22.19.0'} unenv@2.0.0-rc.24: @@ -1446,8 +1574,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.3.5: - resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==} + vite@8.3.6: + resolution: {integrity: sha512-UI7dK29NnS54Fk+mmo7o+jI6U8Fp7hDl+X5Q1k45WH+d4dSlbLVUETGQ+hfkNgvLQGyoElPj837nZyv4MBc0VA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1497,17 +1625,17 @@ packages: vite: optional: true - workerd@1.20261023.1: - resolution: {integrity: sha512-NeofJFyaYNpqKpFRJW3ApuonaerPd6/JWlfTtLDYf2A6ygqrDEFnYgEXmc0hhOxqnJsSM+kXJN6VebPojzRrsg==} + workerd@1.20261104.1: + resolution: {integrity: sha512-JuiKY9k/4V4UE2xsupaTvZ1SF6o2a8sg+/zfq/DaSDwvH+o7t2ZEFuIWNEnryfeFdP47/tz/p828Kvl4ptPlrA==} engines: {node: '>=16'} hasBin: true - wrangler@4.156.0: - resolution: {integrity: sha512-kVLAShuLiNgE3jcrmXcymDf/iPKDPrSxACe5ueugW/33HeNB9E9CkKYchudCeBwgmsnl4k+1zt4NO7vqb/fRuQ==} + wrangler@4.158.0: + resolution: {integrity: sha512-qZdTxIOU8smBVTHzTJVwHiPZB2lJ9+Js79fqKK05l+AbU5hXLWLUHO6oO1vni5G4hjYQTSBAHoGHtSocWPG0FA==} engines: {node: '>=22.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^5.20261023.1 + '@cloudflare/workers-types': ^5.20261104.1 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -1579,7 +1707,7 @@ snapshots: dependencies: '@emnapi/core': 1.11.3 '@emnapi/runtime': 1.11.3 - '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + '@napi-rs/wasm-runtime': 1.2.7(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) optional: true '@astrojs/compiler-binding-win32-arm64-msvc@0.5.2': @@ -1605,23 +1733,23 @@ snapshots: dependencies: '@astrojs/compiler-binding': 0.5.2 - '@astrojs/internal-helpers@0.13.0': + '@astrojs/internal-helpers@0.13.1': dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 picomatch: 4.0.7 retext-smartypants: 6.2.0 - shiki: 4.5.0 + shiki: 4.6.0 smol-toml: 1.9.1 unified: 11.0.5 yaml: 2.9.1 - '@astrojs/markdown-satteri@0.4.6': + '@astrojs/markdown-satteri@0.4.7': dependencies: - '@astrojs/internal-helpers': 0.13.0 + '@astrojs/internal-helpers': 0.13.1 '@astrojs/prism': 4.1.2 github-slugger: 2.0.0 - satteri: 0.10.5 + satteri: 0.11.6 '@astrojs/prism@4.1.2': dependencies: @@ -1634,48 +1762,54 @@ snapshots: is-docker: 4.0.0 package-manager-detector: 1.9.0 - '@babel/helper-string-parser@7.29.11': {} + '@babel/helper-string-parser@7.29.13': {} '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.12': + '@babel/parser@7.29.13': dependencies: '@babel/types': 7.29.11 '@babel/types@7.29.11': dependencies: - '@babel/helper-string-parser': 7.29.11 + '@babel/helper-string-parser': 7.29.13 '@babel/helper-validator-identifier': 7.29.7 - '@bruits/satteri-darwin-arm64@0.10.5': + '@bruits/satteri-android-arm64@0.11.6': + optional: true + + '@bruits/satteri-darwin-arm64@0.11.6': + optional: true + + '@bruits/satteri-darwin-x64@0.11.6': optional: true - '@bruits/satteri-darwin-x64@0.10.5': + '@bruits/satteri-freebsd-x64@0.11.6': optional: true - '@bruits/satteri-linux-arm64-gnu@0.10.5': + '@bruits/satteri-linux-arm64-gnu@0.11.6': optional: true - '@bruits/satteri-linux-arm64-musl@0.10.5': + '@bruits/satteri-linux-arm64-musl@0.11.6': optional: true - '@bruits/satteri-linux-x64-gnu@0.10.5': + '@bruits/satteri-linux-x64-gnu@0.11.6': optional: true - '@bruits/satteri-linux-x64-musl@0.10.5': + '@bruits/satteri-linux-x64-musl@0.11.6': optional: true - '@bruits/satteri-wasm32-wasi@0.10.5': + '@bruits/satteri-wasm32-wasi@0.11.6': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.2.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@bruits/satteri-win32-arm64-msvc@0.10.5': + '@bruits/satteri-win32-arm64-msvc@0.11.6': optional: true - '@bruits/satteri-win32-x64-msvc@0.10.5': + '@bruits/satteri-win32-x64-msvc@0.11.6': optional: true '@capsizecss/unpack@4.0.1': @@ -1696,28 +1830,28 @@ snapshots: '@cloudflare/kv-asset-handler@0.5.0': {} - '@cloudflare/unenv-preset@2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261023.1)': + '@cloudflare/unenv-preset@2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261104.1)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20261023.1 + workerd: 1.20261104.1 - '@cloudflare/workerd-darwin-64@1.20261023.1': + '@cloudflare/workerd-darwin-64@1.20261104.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20261023.1': + '@cloudflare/workerd-darwin-arm64@1.20261104.1': optional: true - '@cloudflare/workerd-linux-64@1.20261023.1': + '@cloudflare/workerd-linux-64@1.20261104.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20261023.1': + '@cloudflare/workerd-linux-arm64@1.20261104.1': optional: true - '@cloudflare/workerd-windows-64@1.20261023.1': + '@cloudflare/workerd-windows-64@1.20261104.1': optional: true - '@cloudflare/workers-types@5.20261030.1': {} + '@cloudflare/workers-types@5.20261106.1': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -1726,33 +1860,49 @@ snapshots: '@emnapi/core@1.11.1': dependencies: '@emnapi/wasi-threads': 1.2.2 - tslib: 2.8.1 + tslib: 2.9.1 optional: true '@emnapi/core@1.11.3': dependencies: '@emnapi/wasi-threads': 1.2.3 - tslib: 2.8.1 + tslib: 2.9.1 + optional: true + + '@emnapi/core@2.0.0-beta.2': + dependencies: + '@emnapi/wasi-threads': 2.2.0 + tslib: 2.9.1 optional: true '@emnapi/runtime@1.11.1': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 optional: true '@emnapi/runtime@1.11.3': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 + optional: true + + '@emnapi/runtime@2.0.0-beta.2': + dependencies: + tslib: 2.9.1 optional: true '@emnapi/wasi-threads@1.2.2': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 optional: true '@emnapi/wasi-threads@1.2.3': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 + optional: true + + '@emnapi/wasi-threads@2.2.0': + dependencies: + tslib: 2.9.1 optional: true '@esbuild/aix-ppc64@0.28.2': @@ -1950,14 +2100,21 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 - '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@2.0.0-beta.2)(@emnapi/runtime@2.0.0-beta.2)': + dependencies: + '@emnapi/core': 2.0.0-beta.2 + '@emnapi/runtime': 2.0.0-beta.2 + '@tybys/wasm-util': 0.10.4 + optional: true + + '@napi-rs/wasm-runtime@1.2.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 '@tybys/wasm-util': 0.10.4 optional: true - '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + '@napi-rs/wasm-runtime@1.2.7(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': dependencies: '@emnapi/core': 1.11.3 '@emnapi/runtime': 1.11.3 @@ -1968,6 +2125,8 @@ snapshots: '@oxc-project/types@0.156.0': {} + '@oxc-project/types@0.157.0': {} + '@poppinss/colors@4.1.6': dependencies: kleur: 4.1.5 @@ -1983,84 +2142,136 @@ snapshots: '@rolldown/binding-android-arm-eabi@1.2.16': optional: true + '@rolldown/binding-android-arm-eabi@1.3.0': + optional: true + '@rolldown/binding-android-arm64@1.2.16': optional: true + '@rolldown/binding-android-arm64@1.3.0': + optional: true + '@rolldown/binding-darwin-arm64@1.2.16': optional: true + '@rolldown/binding-darwin-arm64@1.3.0': + optional: true + '@rolldown/binding-darwin-x64@1.2.16': optional: true + '@rolldown/binding-darwin-x64@1.3.0': + optional: true + '@rolldown/binding-freebsd-x64@1.2.16': optional: true + '@rolldown/binding-freebsd-x64@1.3.0': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.2.16': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.3.0': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.2.16': optional: true + '@rolldown/binding-linux-arm64-gnu@1.3.0': + optional: true + '@rolldown/binding-linux-arm64-musl@1.2.16': optional: true + '@rolldown/binding-linux-arm64-musl@1.3.0': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.2.16': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.3.0': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.2.16': optional: true + '@rolldown/binding-linux-s390x-gnu@1.3.0': + optional: true + '@rolldown/binding-linux-x64-gnu@1.2.16': optional: true + '@rolldown/binding-linux-x64-gnu@1.3.0': + optional: true + '@rolldown/binding-linux-x64-musl@1.2.16': optional: true + '@rolldown/binding-linux-x64-musl@1.3.0': + optional: true + '@rolldown/binding-openharmony-arm64@1.2.16': optional: true + '@rolldown/binding-openharmony-arm64@1.3.0': + optional: true + + '@rolldown/binding-wasm32-wasi@1.3.0': + dependencies: + '@emnapi/core': 2.0.0-beta.2 + '@emnapi/runtime': 2.0.0-beta.2 + '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@2.0.0-beta.2)(@emnapi/runtime@2.0.0-beta.2) + optional: true + '@rolldown/binding-win32-arm64-msvc@1.2.16': optional: true + '@rolldown/binding-win32-arm64-msvc@1.3.0': + optional: true + '@rolldown/binding-win32-x64-msvc@1.2.16': optional: true + '@rolldown/binding-win32-x64-msvc@1.3.0': + optional: true + '@rolldown/pluginutils@1.0.1': {} - '@shikijs/core@4.5.0': + '@shikijs/core@4.6.0': dependencies: - '@shikijs/primitive': 4.5.0 - '@shikijs/types': 4.5.0 + '@shikijs/primitive': 4.6.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 '@types/hast': 3.0.5 hast-util-to-html: 9.0.6 - '@shikijs/engine-javascript@4.5.0': + '@shikijs/engine-javascript@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 oniguruma-to-es: 4.3.6 - '@shikijs/engine-oniguruma@4.5.0': + '@shikijs/engine-oniguruma@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 - '@shikijs/langs@4.5.0': + '@shikijs/langs@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 - '@shikijs/primitive@4.5.0': + '@shikijs/primitive@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 '@types/hast': 3.0.5 - '@shikijs/themes@4.5.0': + '@shikijs/themes@4.6.0': dependencies: - '@shikijs/types': 4.5.0 + '@shikijs/types': 4.6.0 - '@shikijs/types@4.5.0': + '@shikijs/types@4.6.0': dependencies: '@shikijs/vscode-textmate': 10.1.0 '@types/hast': 3.0.5 @@ -2073,7 +2284,7 @@ snapshots: '@tybys/wasm-util@0.10.4': dependencies: - tslib: 2.8.1 + tslib: 2.9.1 optional: true '@types/estree-jsx@1.0.5': @@ -2109,11 +2320,11 @@ snapshots: aria-query@5.3.2: {} - astro@7.4.4(esbuild@0.28.2)(yaml@2.9.1): + astro@7.4.7(esbuild@0.28.2)(yaml@2.9.1): dependencies: '@astrojs/compiler-rs': 0.5.2 - '@astrojs/internal-helpers': 0.13.0 - '@astrojs/markdown-satteri': 0.4.6 + '@astrojs/internal-helpers': 0.13.1 + '@astrojs/markdown-satteri': 0.4.7 '@astrojs/telemetry': 3.4.2 '@capsizecss/unpack': 4.0.1 '@clack/prompts': 1.8.1 @@ -2124,7 +2335,7 @@ snapshots: ci-info: 4.4.0 clsx: 2.1.1 common-ancestor-path: 2.0.0 - cookie: 2.0.1 + cookie: 2.0.2 devalue: 6.0.3 diff: 9.0.0 dset: 3.1.4 @@ -2142,12 +2353,12 @@ snapshots: neotraverse: 1.0.1 obug: 3.0.0 p-limit: 7.3.3 - p-queue: 9.3.5 + p-queue: 10.0.0 package-manager-detector: 1.9.0 piccolore: 0.1.3 picomatch: 4.0.7 - rolldown: 1.2.16 - shiki: 4.5.0 + rolldown: 1.3.0 + shiki: 4.6.0 smol-toml: 1.9.1 svgo: 4.1.0 tinyclip: 1.0.3 @@ -2158,8 +2369,8 @@ snapshots: unifont: 1.0.3 unstorage: 1.17.6 verkit: 0.5.0 - vite: 8.3.5(esbuild@0.28.2)(yaml@2.9.1) - vitefu: 1.1.3(vite@8.3.5(esbuild@0.28.2)(yaml@2.9.1)) + vite: 8.3.6(esbuild@0.28.2)(yaml@2.9.1) + vitefu: 1.1.3(vite@8.3.6(esbuild@0.28.2)(yaml@2.9.1)) xxhash-wasm: 1.1.0 yargs-parser: 22.0.0 zod: 4.6.7 @@ -2230,7 +2441,7 @@ snapshots: cookie@1.1.1: {} - cookie@2.0.1: {} + cookie@2.0.2: {} crossws@0.3.5: dependencies: @@ -2331,8 +2542,6 @@ snapshots: '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 - eventemitter3@5.0.4: {} - extend@3.0.2: {} fast-string-truncated-width@3.0.3: {} @@ -2473,7 +2682,7 @@ snapshots: magicast@0.5.5: dependencies: - '@babel/parser': 7.29.12 + '@babel/parser': 7.29.13 '@babel/types': 7.29.11 source-map-js: 1.2.2 @@ -2510,12 +2719,12 @@ snapshots: micromark-util-types@2.0.3: {} - miniflare@5.20261023.3-beta: + miniflare@5.20261104.0-beta: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.35.5 undici: 7.30.1 - workerd: 1.20261023.1 + workerd: 1.20261104.1 ws: 8.21.0 youch: 4.1.0-beta.10 transitivePeerDependencies: @@ -2563,12 +2772,7 @@ snapshots: dependencies: yocto-queue: 1.2.2 - p-queue@9.3.5: - dependencies: - eventemitter3: 5.0.4 - p-timeout: 7.0.2 - - p-timeout@7.0.2: {} + p-queue@10.0.0: {} package-manager-detector@1.9.0: {} @@ -2639,32 +2843,56 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.16 '@rolldown/binding-win32-x64-msvc': 1.2.16 - satteri@0.10.5: + rolldown@1.3.0: + dependencies: + '@oxc-project/types': 0.157.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.3.0 + '@rolldown/binding-android-arm64': 1.3.0 + '@rolldown/binding-darwin-arm64': 1.3.0 + '@rolldown/binding-darwin-x64': 1.3.0 + '@rolldown/binding-freebsd-x64': 1.3.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.3.0 + '@rolldown/binding-linux-arm64-gnu': 1.3.0 + '@rolldown/binding-linux-arm64-musl': 1.3.0 + '@rolldown/binding-linux-ppc64-gnu': 1.3.0 + '@rolldown/binding-linux-s390x-gnu': 1.3.0 + '@rolldown/binding-linux-x64-gnu': 1.3.0 + '@rolldown/binding-linux-x64-musl': 1.3.0 + '@rolldown/binding-openharmony-arm64': 1.3.0 + '@rolldown/binding-wasm32-wasi': 1.3.0 + '@rolldown/binding-win32-arm64-msvc': 1.3.0 + '@rolldown/binding-win32-x64-msvc': 1.3.0 + + satteri@0.11.6: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/unist': 3.0.3 optionalDependencies: - '@bruits/satteri-darwin-arm64': 0.10.5 - '@bruits/satteri-darwin-x64': 0.10.5 - '@bruits/satteri-linux-arm64-gnu': 0.10.5 - '@bruits/satteri-linux-arm64-musl': 0.10.5 - '@bruits/satteri-linux-x64-gnu': 0.10.5 - '@bruits/satteri-linux-x64-musl': 0.10.5 - '@bruits/satteri-wasm32-wasi': 0.10.5 - '@bruits/satteri-win32-arm64-msvc': 0.10.5 - '@bruits/satteri-win32-x64-msvc': 0.10.5 + '@bruits/satteri-android-arm64': 0.11.6 + '@bruits/satteri-darwin-arm64': 0.11.6 + '@bruits/satteri-darwin-x64': 0.11.6 + '@bruits/satteri-freebsd-x64': 0.11.6 + '@bruits/satteri-linux-arm64-gnu': 0.11.6 + '@bruits/satteri-linux-arm64-musl': 0.11.6 + '@bruits/satteri-linux-x64-gnu': 0.11.6 + '@bruits/satteri-linux-x64-musl': 0.11.6 + '@bruits/satteri-wasm32-wasi': 0.11.6 + '@bruits/satteri-win32-arm64-msvc': 0.11.6 + '@bruits/satteri-win32-x64-msvc': 0.11.6 sax@1.6.1: {} - semver@7.8.5: {} + semver@7.8.6: {} sharp@0.35.5: dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.8.5 + semver: 7.8.6 optionalDependencies: '@img/sharp-darwin-arm64': 0.35.5 '@img/sharp-darwin-x64': 0.35.5 @@ -2692,14 +2920,14 @@ snapshots: '@img/sharp-win32-ia32': 0.35.5 '@img/sharp-win32-x64': 0.35.5 - shiki@4.5.0: + shiki@4.6.0: dependencies: - '@shikijs/core': 4.5.0 - '@shikijs/engine-javascript': 4.5.0 - '@shikijs/engine-oniguruma': 4.5.0 - '@shikijs/langs': 4.5.0 - '@shikijs/themes': 4.5.0 - '@shikijs/types': 4.5.0 + '@shikijs/core': 4.6.0 + '@shikijs/engine-javascript': 4.6.0 + '@shikijs/engine-oniguruma': 4.6.0 + '@shikijs/langs': 4.6.0 + '@shikijs/themes': 4.6.0 + '@shikijs/types': 4.6.0 '@shikijs/vscode-textmate': 10.1.0 '@types/hast': 3.0.5 @@ -2747,7 +2975,7 @@ snapshots: trough@2.2.0: {} - tslib@2.8.1: + tslib@2.9.1: optional: true ufo@1.6.4: {} @@ -2758,7 +2986,7 @@ snapshots: undici@7.30.1: {} - undici@8.12.3: {} + undici@8.12.4: {} unenv@2.0.0-rc.24: dependencies: @@ -2779,7 +3007,7 @@ snapshots: css-tree: 3.2.1 fnv1a-64: 0.1.2 std-env: 4.3.0 - undici: 8.12.3 + undici: 8.12.4 unist-util-is@6.0.1: dependencies: @@ -2827,7 +3055,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.3.5(esbuild@0.28.2)(yaml@2.9.1): + vite@8.3.6(esbuild@0.28.2)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -2839,30 +3067,31 @@ snapshots: fsevents: 2.3.3 yaml: 2.9.1 - vitefu@1.1.3(vite@8.3.5(esbuild@0.28.2)(yaml@2.9.1)): + vitefu@1.1.3(vite@8.3.6(esbuild@0.28.2)(yaml@2.9.1)): optionalDependencies: - vite: 8.3.5(esbuild@0.28.2)(yaml@2.9.1) + vite: 8.3.6(esbuild@0.28.2)(yaml@2.9.1) - workerd@1.20261023.1: + workerd@1.20261104.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20261023.1 - '@cloudflare/workerd-darwin-arm64': 1.20261023.1 - '@cloudflare/workerd-linux-64': 1.20261023.1 - '@cloudflare/workerd-linux-arm64': 1.20261023.1 - '@cloudflare/workerd-windows-64': 1.20261023.1 + '@cloudflare/workerd-darwin-64': 1.20261104.1 + '@cloudflare/workerd-darwin-arm64': 1.20261104.1 + '@cloudflare/workerd-linux-64': 1.20261104.1 + '@cloudflare/workerd-linux-arm64': 1.20261104.1 + '@cloudflare/workerd-windows-64': 1.20261104.1 - wrangler@4.156.0(@cloudflare/workers-types@5.20261030.1): + wrangler@4.158.0(@cloudflare/workers-types@5.20261106.1): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 - '@cloudflare/unenv-preset': 2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261023.1) + '@cloudflare/unenv-preset': 2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261104.1) + '@cspotcode/source-map-support': 0.8.1 blake3-wasm: 2.1.5 esbuild: 0.28.2 - miniflare: 5.20261023.3-beta + miniflare: 5.20261104.0-beta path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20261023.1 + workerd: 1.20261104.1 optionalDependencies: - '@cloudflare/workers-types': 5.20261030.1 + '@cloudflare/workers-types': 5.20261106.1 fsevents: 2.3.3 transitivePeerDependencies: - '@types/node' diff --git a/scripts/check-devcon26-attendance-counter.mjs b/scripts/check-devcon26-attendance-counter.mjs index 464f4fd..9985a09 100644 --- a/scripts/check-devcon26-attendance-counter.mjs +++ b/scripts/check-devcon26-attendance-counter.mjs @@ -22,7 +22,8 @@ const context = { module: counterModule, URL, AbortSignal, - window: { location: { origin: 'https://devcongress.org' } }, + window: { location: { origin: 'https://devcongress.org' }, addEventListener() {}, removeEventListener() {}, setInterval() { return 1; }, setTimeout() { return 1; }, clearInterval() {}, clearTimeout() {} }, + document: { visibilityState: 'visible', addEventListener() {}, removeEventListener() {} }, fetch: async (url, options) => { requests.push({ url, options }); if (fail) throw new Error('Network failure'); @@ -49,13 +50,14 @@ assert.equal(attendanceEndpoint('https://em.devcongress.org', 'https://devcongre function fixture() { const count = { textContent: '' }; const estimate = { hidden: true }; - return { hidden: true, count, estimate, querySelector: (selector) => selector.includes('count]') ? count : estimate }; + return { hidden: true, count, estimate, querySelector: (selector) => selector === '[data-attendance-count]' ? count : selector === '[data-attendance-estimate]' ? estimate : null }; } for (const [input, label, estimated] of [ [{ count: 0, source: 'actual' }, '0 people are attending', false], [{ count: 1, source: 'actual' }, '1 person is attending', false], [{ count: 1250, source: 'estimate' }, '1,250 people are attending', true], + [{ count: 25, source: 'ticket_count' }, '25 tickets', false], ]) { payload = input; const root = fixture(); @@ -108,6 +110,52 @@ assert.equal(requests[0].options.credentials, 'omit'); assert.equal(requests[0].options.cache, 'no-store'); assert.ok(requests[0].options.signal); +// Exercise refresh signals and ensure a slow response cannot overlap a newer read. +const listeners = {}; +const timers = []; +let refreshPayload = { count: 20, source: 'ticket_count' }; +let calls = 0; +let release; +const lifecycleModule = { exports: {} }; +const lifecycleContext = { + module: lifecycleModule, URL, AbortSignal, + window: { + location: { origin: 'https://devcongress.org' }, + addEventListener(name, callback) { listeners[name] = callback; }, + removeEventListener() {}, + setTimeout(callback) { timers.push(callback); return timers.length; }, + clearTimeout() {}, setInterval(callback) { listeners.interval = callback; return 1; }, clearInterval() {}, + }, + document: { visibilityState: 'visible', addEventListener(name, callback) { listeners[name] = callback; }, removeEventListener() {} }, + fetch: async () => { + calls += 1; + if (release) await new Promise((resolve) => { release = resolve; }); + return { ok: true, json: async () => refreshPayload }; + }, +}; +vm.runInNewContext(await bundle('src/lib/devcon26-attendance-counter.ts'), lifecycleContext); +const lifecycleRoot = fixture(); +await lifecycleModule.exports.initializeAttendanceCounter([lifecycleRoot], 'https://em.devcongress.org'); +assert.equal(lifecycleRoot.count.textContent, '20 tickets'); +refreshPayload = { count: 25, source: 'ticket_count' }; +listeners.storage({ key: 'devcon26-ticket-counter-refresh' }); +await new Promise((resolve) => setImmediate(resolve)); +assert.equal(lifecycleRoot.count.textContent, '25 tickets'); +assert.equal(timers.length, 3); +refreshPayload = { count: 26, source: 'ticket_count' }; +listeners.visibilitychange(); +await new Promise((resolve) => setImmediate(resolve)); +assert.equal(lifecycleRoot.count.textContent, '26 tickets'); +release = true; +listeners.interval(); +listeners.interval(); +const duringRequest = calls; +release(); +release = null; +await new Promise((resolve) => setImmediate(resolve)); +assert.equal(calls, duringRequest + 1, 'overlapping signals coalesce into one follow-up read'); +listeners.pagehide({ persisted: false }); + const workerModule = { exports: {} }; let upstreamRequest; let upstreamFails = false; @@ -118,12 +166,12 @@ vm.runInNewContext(await bundle('src/worker.ts'), { upstreamRequest = { url: String(url), options }; if (upstreamFails) throw new Error('Unavailable'); if (upstreamRedirects) return Response.redirect('https://example.com/', 302); - return Response.json({ count: 42, source: 'estimate', private: 'discarded' }); + return Response.json({ count: 42, source: 'ticket_count', private: 'discarded' }); }, }); const worker = workerModule.exports.default; const response = await worker.fetch(new Request('https://preview.workers.dev/api/devcon26/attendance-counter?other=1', { headers: { Cookie: 'secret', Authorization: 'secret' } }), { ASSETS: {} }, {}); -assert.deepEqual(await response.json(), { count: 42, source: 'estimate' }); +assert.deepEqual(await response.json(), { count: 42, source: 'ticket_count' }); assert.equal(response.headers.get('Cache-Control'), 'no-store'); assert.equal(upstreamRequest.url, 'https://em.devcongress.org/api/public/annual-conference/2026/attendance-counter'); assert.deepEqual(Object.keys(upstreamRequest.options.headers), ['Accept']); diff --git a/scripts/check-devcon26-managed-checkout.mjs b/scripts/check-devcon26-managed-checkout.mjs index 0c6ee98..3fbae11 100644 --- a/scripts/check-devcon26-managed-checkout.mjs +++ b/scripts/check-devcon26-managed-checkout.mjs @@ -172,7 +172,7 @@ function checkoutFixture(handler) { module, document, URL, URLSearchParams, AbortController, crypto: { randomUUID }, console: { warn() {} }, FormData: class { get() { return challenge; } }, - sessionStorage: { setItem: (key, value) => storage.set(key, value) }, + sessionStorage: { setItem: (key, value) => storage.set(key, value), getItem: (key) => storage.get(key) ?? null }, window: { setTimeout, clearTimeout, matchMedia: (query) => ({ matches: query.includes('reduced-motion'), addEventListener() {} }), @@ -314,6 +314,19 @@ await tick(); assert.equal(departed.steps[0].hidden, false, 'BFCache restoration notices a settings change and requires review'); assert.equal(departed.requests.filter((request) => request.body).length, 1, 'Restoration only refreshes the catalog'); + +let returnedFixture; +returnedFixture = checkoutFixture((request) => response(request.body ? initialized() : catalog())); +await tick(); +await returnedFixture.review(); +await returnedFixture.form.fire('submit'); +await returnedFixture.windowEvents.fire('pagehide'); +await returnedFixture.windowEvents.fire('pageshow', { persisted: true }); +await tick(); +assert.equal(returnedFixture.page.querySelector('[data-existing-checkout]').hidden, false); +assert.match(returnedFixture.page.querySelector('[data-existing-checkout-link]').href, /#reference=devcon26-managed-test-/); +assert.equal(returnedFixture.requests.filter((request) => request.body).length, 1, 'Returning never initializes a replacement checkout'); + let retryCount = 0; const retry = checkoutFixture((request) => { if (!request.body) return response(catalog('live')); @@ -380,17 +393,20 @@ function confirmationFixture(reference, mode, options = {}) { const root = new Element(); const requests = []; const badgeCalls = []; + const signals = []; const module = { exports: {} }; root.dataset.checkoutApiOrigin = apiOrigin; vm.runInNewContext(confirmationCode, { - module, URL, URLSearchParams, AbortController, document: {}, + module, URL, URLSearchParams, AbortController, Event, document: {}, + localStorage: { setItem: (key) => signals.push(key) }, sessionStorage: { getItem: () => options.missingGrant ? null : JSON.stringify({ reference, checkout_grant: 'scoped-grant', checkout_verifier: verifier, }) }, window: { location: { search: '?reference=' + reference, hash: '', pathname: '/devcon26/payment-confirmation/' }, history: { replaceState() {} }, setTimeout, clearTimeout, addEventListener() {}, + dispatchEvent: (event) => signals.push(event.type), }, fetch: async (url, init) => { requests.push({ url, body: JSON.parse(init.body) }); @@ -398,13 +414,14 @@ function confirmationFixture(reference, mode, options = {}) { return response({ mode: options.responseMode ?? mode, status: options.status ?? 'verified', currency: 'GHS', quantity: 1, ticket_amount_minor: 15000, processing_fee_minor: 299, amount_paid_minor: 15299, - card_quantity: 1, buyer_grant: 'self-seat-grant', - }); + card_quantity: options.cardQuantity ?? 1, buyer_grant: 'self-seat-grant', + ...options.extra, + }, options.httpStatus ?? 200); }, }); module.exports.initializeDevcon26PaymentConfirmation(root, (...args) => badgeCalls.push(args)); - return { root, requests, badgeCalls, exports: module.exports }; + return { root, requests, badgeCalls, signals, exports: module.exports }; } for (const mode of ['test', 'live']) { @@ -414,6 +431,7 @@ for (const mode of ['test', 'live']) { assert.equal(fixture.requests[0].url, apiOrigin + path + '/verify'); assert.deepEqual(Object.keys(fixture.requests[0].body).sort(), ['checkout_grant', 'checkout_verifier', 'reference']); assert.equal(fixture.root.dataset.paymentState, 'verified'); + assert.deepEqual(fixture.signals, mode === 'live' ? ['devcon26-ticket-counter-refresh', 'devcon26-ticket-counter-refresh'] : []); assert.equal(fixture.root.querySelector('[data-payment-mode-notice]').hidden, mode !== 'test'); assert.equal(fixture.root.querySelector('[data-payment-fee-row]').hidden, false); assert.equal(fixture.root.querySelector('[data-payment-fee]').textContent, 'GHS 2.99'); @@ -424,6 +442,87 @@ for (const mode of ['test', 'live']) { assert.equal(fixture.exports.devcon26ConfirmationReference('#reference=' + shown), initialized(mode).reference); } +const communityConfirmation = confirmationFixture(initialized('live').reference, 'live', { cardQuantity: 0 }); +await tick(); +assert.equal(communityConfirmation.root.dataset.paymentState, 'verified'); +assert.deepEqual(communityConfirmation.signals, ['devcon26-ticket-counter-refresh', 'devcon26-ticket-counter-refresh']); +assert.equal(communityConfirmation.badgeCalls.length, 0); + +const pendingConfirmation = confirmationFixture(initialized('live').reference, 'live', { status: 'pending' }); +await tick(); +assert.equal(pendingConfirmation.root.dataset.paymentState, 'pending'); +assert.deepEqual(pendingConfirmation.signals, []); + + +for (const mode of ['test', 'live']) { + const failed = confirmationFixture(initialized(mode).reference, mode, { + status: 'failed', + extra: { payment_observation: { status: 'abandoned', reason: 'customer_cancelled', check_failed: true }, checkout_hold: { status: 'expired' } }, + }); + + await tick(); + assert.equal(failed.root.dataset.paymentState, 'failed'); + assert.match(failed.root.querySelector('[data-payment-outcome-detail]').textContent, /cancelled.*out of date.*reservation has expired/); + assert.equal(failed.root.querySelector('[data-payment-retry]').hidden, false); + assert.equal(failed.root.querySelector('[data-payment-receipt]').hidden, true); + assert.equal(failed.badgeCalls.length, 0); + await failed.root.querySelector('[data-payment-retry]').fire('click'); + await tick(); + assert.deepEqual(failed.requests[1].body, failed.requests[0].body, 'Retry checks the same granted reference'); + + const verified = confirmationFixture(initialized(mode).reference, mode, { + extra: { payment_observation: { status: 'failed', reason: 'declined', check_failed: true }, checkout_hold: { status: 'expired' } }, + }); + + await tick(); + assert.equal(verified.root.dataset.paymentState, 'verified'); + assert.equal(verified.root.querySelector('[data-payment-outcome-detail]').hidden, true, 'Verified fulfillment overrides stale observations'); + + const refund = confirmationFixture(initialized(mode).reference, mode, { + status: 'refund_required', extra: { refund_status: 'refunded', payment_observation: { status: 'success' } }, + }); + + await tick(); + assert.match(refund.root.querySelector('[data-payment-copy]').textContent, /has been refunded/); + assert.equal(refund.root.querySelector('[data-payment-receipt]').hidden, true); + assert.equal(refund.root.querySelector('[data-payment-outcome-detail]').hidden, true); +} + +for (const httpStatus of [429, 503]) { + const unavailable = confirmationFixture(initialized('live').reference, 'live', { httpStatus }); + + await tick(); + assert.equal(unavailable.root.dataset.paymentState, 'error'); + assert.equal(unavailable.root.querySelector('[data-payment-retry]').hidden, false); + assert.equal(unavailable.root.querySelector('[data-payment-receipt]').hidden, true); + assert.equal(unavailable.badgeCalls.length, 0); +} + +const unavailableDetail = confirmationFixture(initialized('live').reference, 'live', { + httpStatus: 503, extra: { payment_observation: { status: 'success', check_failed: true }, checkout_hold: { status: 'expired' } }, +}); +await tick(); +assert.equal(unavailableDetail.root.dataset.paymentState, 'error'); +assert.match(unavailableDetail.root.querySelector('[data-payment-outcome-detail]').textContent, /still being confirmed.*out of date.*reservation has expired/); +assert.equal(unavailableDetail.root.querySelector('[data-payment-receipt]').hidden, true); +assert.equal(unavailableDetail.badgeCalls.length, 0); + +const pendingSuccess = confirmationFixture(initialized('live').reference, 'live', { + status: 'pending', extra: { payment_observation: { status: 'success' } }, +}); +await tick(); +assert.equal(pendingSuccess.root.dataset.paymentState, 'pending'); +assert.match(pendingSuccess.root.querySelector('[data-payment-outcome-detail]').textContent, /still being confirmed/); +assert.equal(pendingSuccess.root.querySelector('[data-payment-receipt]').hidden, true); +assert.equal(pendingSuccess.badgeCalls.length, 0); + +const unknownMetadata = confirmationFixture(initialized('live').reference, 'live', { + status: 'pending', extra: { payment_observation: { status: 'unknown-provider-text', reason: '' }, checkout_hold: { status: 'unknown' } }, +}); +await tick(); +assert.equal(unknownMetadata.root.querySelector('[data-payment-outcome-detail]').hidden, true); + + for (const options of [{ missingGrant: true }, { responseMode: 'live' }]) { const fixture = confirmationFixture(initialized('test').reference, 'test', options); diff --git a/src/components/MissionSection.astro b/src/components/MissionSection.astro index 8b75879..e3316ce 100644 --- a/src/components/MissionSection.astro +++ b/src/components/MissionSection.astro @@ -119,6 +119,14 @@ const headlineParts = parseEmphasis(mission.headline); font-size: var(--text-lg); } + @media (max-width: 899px) { + .btn-mission { + min-height: 44px; + padding: var(--s3) var(--s6); + font-size: var(--text-sm); + } + } + .mission-body { font-size: var(--text-base); color: var(--text-mid); diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro index 17e0826..3213895 100644 --- a/src/components/Navbar.astro +++ b/src/components/Navbar.astro @@ -40,18 +40,21 @@ const links = conference ? [ + + diff --git a/src/pages/devcon26/index.astro b/src/pages/devcon26/index.astro index b817b94..5c95757 100644 --- a/src/pages/devcon26/index.astro +++ b/src/pages/devcon26/index.astro @@ -225,10 +225,10 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) {

Technology for the Next Generation

Innovation • Community • Impact

-

With a gathering of builders, researchers, designers, security professionals, product managers and marketers. Come gain knowledge and exchange knowledge at DevCon26

+

With a gathering of builders, researchers, designers, security professionals, product managers and marketers. Come gain knowledge and exchange knowledge at DevCon26Meet Ghana’s builders, researchers and creators. Share ideas and learn together at DevCon26.

+

19 December 2026
Accra Digital Center

Buy tickets -

19 December 2026
Accra Digital Center

@@ -706,6 +706,10 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { text-wrap: pretty; } + .hero-summary-mobile, .hero-details-separator { + display: none; + } + .hero-actions { display: flex; align-items: center; @@ -717,6 +721,7 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { } .hero-actions p { + order: 1; font-size: 12px; line-height: 1.6; } @@ -2134,7 +2139,7 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { } .hero h1 { - font-size: clamp(30px, 8.8vw, 42px); + font-size: clamp(36px, 9vw, 40px); letter-spacing: -0.025em; } @@ -2144,7 +2149,7 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { .hero-tagline { margin-top: 12px; - text-align: center; + text-align: left; font-size: 15px; line-height: 1.4; } @@ -2152,27 +2157,41 @@ function packageEnquiryLink(sponsorship: (typeof sponsorshipPackages)[number]) { .hero-summary { max-width: none; margin-top: 20px; - margin-inline: auto; - text-align: center; + text-align: left; font-size: 16px; line-height: 1.55; } + .hero-summary-desktop, .hero-actions p br { + display: none; + } + + .hero-summary-mobile, .hero-details-separator { + display: inline; + } + .hero-actions { flex-direction: column; - justify-content: center; + align-items: stretch; gap: 16px; margin-top: 20px; - text-align: center; + text-align: left; } .hero-actions p { - max-width: 32ch; - text-wrap: balance; + order: 0; font-size: 14px; letter-spacing: 0; } + .hero-actions .button { + min-height: 50px; + } + + .hero-actions .button span { + font-size: 18px; + } + .hero-images { gap: 6px; } diff --git a/src/pages/devcon26/payment-confirmation.astro b/src/pages/devcon26/payment-confirmation.astro index 65ad35c..563a8e6 100644 --- a/src/pages/devcon26/payment-confirmation.astro +++ b/src/pages/devcon26/payment-confirmation.astro @@ -38,6 +38,7 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ Payment received + @@ -183,9 +184,10 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/
- Back to DevCon26 - - Contact us +
@@ -1420,8 +1422,6 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ .confirmation-actions { display: block; margin-top: 24px; - padding-top: 16px; - border-top: 1px solid var(--border); } .confirmation-actions .payment-actions { @@ -1514,6 +1514,13 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ align-items: center; } + .payment-secondary-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 4px 20px; + } + .confirmation-actions .support-link { font-size: 13px; color: var(--text-mid); @@ -1551,9 +1558,9 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ } .confirmation-actions .payment-actions { - flex-direction: row; - justify-content: center; - gap: 0 12px; + flex-direction: column; + align-items: flex-start; + gap: 4px; } .confirmation-actions .support-link { @@ -1564,10 +1571,6 @@ const checkoutApiOrigin = import.meta.env.PUBLIC_DEVCON26_API_ORIGIN || 'https:/ } } - .footer-divider { - color: var(--text-mid); - } - @media (hover: hover) and (pointer: fine) { .confirmation-actions .support-link:hover { color: var(--pink);