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: '
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.
@@ -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 +Your payment may still complete. Please don’t pay again.
Keep this reference handy when contacting the event team.