diff --git a/.changeset/bump-vulnerable-deps-create-cloudflare.md b/.changeset/bump-vulnerable-deps-create-cloudflare.md new file mode 100644 index 000000000000..db589591f4fa --- /dev/null +++ b/.changeset/bump-vulnerable-deps-create-cloudflare.md @@ -0,0 +1,5 @@ +--- +"create-cloudflare": patch +--- + +Bump glob to ^10.5.0 to address command injection vulnerability in glob CLI diff --git a/.changeset/bump-vulnerable-deps-miniflare.md b/.changeset/bump-vulnerable-deps-miniflare.md new file mode 100644 index 000000000000..cf821c06dfc1 --- /dev/null +++ b/.changeset/bump-vulnerable-deps-miniflare.md @@ -0,0 +1,7 @@ +--- +"miniflare": patch +--- + +Bump hono to ^4.12.5 and devalue to ^5.6.3 to address security vulnerabilities + +Hono had multiple advisories including arbitrary file access via serveStatic, JWT algorithm confusion, and XSS through ErrorBoundary. Devalue had denial of service vulnerabilities in devalue.parse. These are bundled dependencies so the fix is delivered via this patch. diff --git a/.changeset/bump-vulnerable-deps-pages-shared.md b/.changeset/bump-vulnerable-deps-pages-shared.md new file mode 100644 index 000000000000..ce537b85d775 --- /dev/null +++ b/.changeset/bump-vulnerable-deps-pages-shared.md @@ -0,0 +1,5 @@ +--- +"@cloudflare/pages-shared": patch +--- + +Bump glob to ^10.5.0 to address command injection vulnerability in glob CLI diff --git a/.changeset/bump-vulnerable-deps-vitest-pool-workers.md b/.changeset/bump-vulnerable-deps-vitest-pool-workers.md new file mode 100644 index 000000000000..9895c4d31dd1 --- /dev/null +++ b/.changeset/bump-vulnerable-deps-vitest-pool-workers.md @@ -0,0 +1,7 @@ +--- +"@cloudflare/vitest-pool-workers": patch +--- + +Bump devalue to ^5.6.3 to address security vulnerabilities + +Devalue had denial of service and prototype pollution vulnerabilities. This is a bundled dependency. diff --git a/.changeset/bump-vulnerable-deps-wrangler.md b/.changeset/bump-vulnerable-deps-wrangler.md new file mode 100644 index 000000000000..c674145e1476 --- /dev/null +++ b/.changeset/bump-vulnerable-deps-wrangler.md @@ -0,0 +1,7 @@ +--- +"wrangler": patch +--- + +Bump node-forge to ^1.3.2 to address security vulnerabilities + +node-forge had ASN.1 unbounded recursion, OID integer truncation, and ASN.1 validator desynchronization vulnerabilities. This is a bundled dependency used for local HTTPS certificate handling. diff --git a/.changeset/dependabot-update-12795.md b/.changeset/dependabot-update-12795.md new file mode 100644 index 000000000000..eceb8015fd98 --- /dev/null +++ b/.changeset/dependabot-update-12795.md @@ -0,0 +1,12 @@ +--- +"miniflare": patch +"wrangler": patch +--- + +Update dependencies of "miniflare", "wrangler" + +The following dependency versions have been updated: + +| Dependency | From | To | +| ---------- | ------------ | ------------ | +| workerd | 1.20260301.1 | 1.20260306.1 | diff --git a/.changeset/evil-rivers-draw.md b/.changeset/evil-rivers-draw.md new file mode 100644 index 000000000000..1fdaee9ca344 --- /dev/null +++ b/.changeset/evil-rivers-draw.md @@ -0,0 +1,24 @@ +--- +"wrangler": minor +--- + +Add support for inheritable bindings in type generation + +When using `wrangler types` with multiple environments, bindings from inheritable config properties (like `assets`) are now correctly inherited from the top-level config in all named environments. Previously, if you defined `assets.binding` at the top level with named environments, the binding would be marked as optional in the generated `Env` type because the type generation didn't account for inheritance. + +Example: + +```json +{ + "assets": { + "binding": "ASSETS", + "directory": "./public" + }, + "env": { + "staging": {}, + "production": {} + } +} +``` + +Before this change, `ASSETS` would be typed as `ASSETS?: Fetcher` (optional). Now, `ASSETS` is correctly typed as `ASSETS: Fetcher` (required). This fix currently applies to the `assets` binding, with an extensible mechanism to support additional inheritable bindings in the future. diff --git a/.changeset/thirty-mammals-live.md b/.changeset/thirty-mammals-live.md new file mode 100644 index 000000000000..0d540a9ff013 --- /dev/null +++ b/.changeset/thirty-mammals-live.md @@ -0,0 +1,7 @@ +--- +"@cloudflare/local-explorer-ui": patch +--- + +Refactors KV & sidebar to use route loaders. + +This change improves the user experience of the Local Explorer dashboard by ensuring that the data used for the initial render is fetched server-side and passed down to the client. This avoids the initial flicker when loading in. Both D1 & Durable Object routes already incorporate this system. diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml index 19361679ef9f..c246c8edaff6 100644 --- a/.github/actions/install-dependencies/action.yml +++ b/.github/actions/install-dependencies/action.yml @@ -17,7 +17,7 @@ runs: using: "composite" steps: - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 with: version: 9.12.0 diff --git a/.github/actions/install-python-uv/action.yml b/.github/actions/install-python-uv/action.yml index ed136706db6f..53e991ae5320 100644 --- a/.github/actions/install-python-uv/action.yml +++ b/.github/actions/install-python-uv/action.yml @@ -3,7 +3,7 @@ runs: using: "composite" steps: - name: Install uv for Python - uses: astral-sh/setup-uv@v6 + uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6 with: version: "0.9.3" enable-cache: false diff --git a/.github/workflows/auto-assign-issues.yml b/.github/workflows/auto-assign-issues.yml index c1bb7f7a56b6..5283fb0c06a7 100644 --- a/.github/workflows/auto-assign-issues.yml +++ b/.github/workflows/auto-assign-issues.yml @@ -22,7 +22,7 @@ jobs: node-version: 22 # need this version for `Set` methods - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 with: version: 9.12.0 diff --git a/.github/workflows/c3-e2e.yml b/.github/workflows/c3-e2e.yml index 99c4e87bb141..7c228674c5ff 100644 --- a/.github/workflows/c3-e2e.yml +++ b/.github/workflows/c3-e2e.yml @@ -38,7 +38,7 @@ jobs: with: fetch-depth: 0 - - uses: dorny/paths-filter@v3 + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 id: changes with: filters: | diff --git a/.github/workflows/changeset-review.yml b/.github/workflows/changeset-review.yml index 1d26f703d7b4..172c9334d3e5 100644 --- a/.github/workflows/changeset-review.yml +++ b/.github/workflows/changeset-review.yml @@ -35,7 +35,7 @@ jobs: - name: Get changed changeset files id: changed-changesets - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@48d8f15b2aaa3d255ca5af3eba4870f807ce6b3c # v45 with: files: | .changeset/*.md @@ -79,7 +79,7 @@ jobs: - name: Post review comment if: steps.opencode-review.outcome == 'success' - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: header: changeset-review path: changeset-review.md diff --git a/.github/workflows/changesets.yml b/.github/workflows/changesets.yml index 23673caaf18c..9bd868518885 100644 --- a/.github/workflows/changesets.yml +++ b/.github/workflows/changesets.yml @@ -54,7 +54,7 @@ jobs: - name: Create Version PR or Publish to NPM id: changesets - uses: changesets/action@v1 + uses: changesets/action@6a0a831ff30acef54f2c6aa1cbbc1096b066edaf # v1 with: version: node .github/changeset-version.js publish: pnpm exec changeset publish diff --git a/.github/workflows/deploy-pages-previews.yml b/.github/workflows/deploy-pages-previews.yml index 842901527e22..1618aaaa9fc6 100644 --- a/.github/workflows/deploy-pages-previews.yml +++ b/.github/workflows/deploy-pages-previews.yml @@ -83,7 +83,7 @@ jobs: - name: "Comment on PR with Devtools Link" if: contains(github.event.*.labels.*.name, 'preview:chrome-devtools-patches') - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: header: ${{ steps.finder.outputs.pr }} message: | @@ -102,7 +102,7 @@ jobs: - name: "Comment on PR with Combined Link" if: contains(github.event.*.labels.*.name, 'preview:chrome-devtools-patches') && contains(github.event.*.labels.*.name, 'preview:workers-playground') - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: header: ${{ steps.finder.outputs.pr }} append: true diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 8bd33719d371..547cbc12017e 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -32,7 +32,7 @@ jobs: with: fetch-depth: 0 - - uses: dorny/paths-filter@v3 + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 id: changes with: filters: | @@ -106,7 +106,7 @@ jobs: with: fetch-depth: 0 - - uses: dorny/paths-filter@v3 + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 id: changes with: filters: | diff --git a/.github/workflows/hotfix-release.yml b/.github/workflows/hotfix-release.yml index 91fd66ccb7a2..8808e4b2c7ff 100644 --- a/.github/workflows/hotfix-release.yml +++ b/.github/workflows/hotfix-release.yml @@ -31,7 +31,7 @@ jobs: fetch-depth: 0 - name: Check user for team affiliation - uses: tspascoal/get-user-teams-membership@v2 + uses: tspascoal/get-user-teams-membership@ba78054988f58bea69b7c6136d563236f8ed2fc0 # v2 id: teamAffiliation with: GITHUB_TOKEN: ${{ secrets.READ_ONLY_ORG_GITHUB_TOKEN }} diff --git a/.github/workflows/test-and-check-other-node.yml b/.github/workflows/test-and-check-other-node.yml index 3745213b0e75..189a20391522 100644 --- a/.github/workflows/test-and-check-other-node.yml +++ b/.github/workflows/test-and-check-other-node.yml @@ -35,7 +35,7 @@ jobs: fetch-depth: 1 - name: Filter changed paths - uses: dorny/paths-filter@v3 + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 id: changes with: filters: | diff --git a/.github/workflows/test-and-check.yml b/.github/workflows/test-and-check.yml index 0df567fb2c9d..d61a8f91d507 100644 --- a/.github/workflows/test-and-check.yml +++ b/.github/workflows/test-and-check.yml @@ -98,7 +98,7 @@ jobs: fetch-depth: 0 - name: Filter changed paths - uses: dorny/paths-filter@v3 + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 id: changes with: filters: | diff --git a/.github/workflows/validate-pr-description.yml b/.github/workflows/validate-pr-description.yml index ba71bf93c16c..88a380b6689a 100644 --- a/.github/workflows/validate-pr-description.yml +++ b/.github/workflows/validate-pr-description.yml @@ -33,7 +33,7 @@ jobs: with: fetch-depth: 1 - - uses: dorny/paths-filter@v3 + - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 id: changes with: filters: | @@ -52,7 +52,7 @@ jobs: - name: List changed files if: steps.changes.outputs.everything_but_markdown == 'true' id: files - uses: Ana06/get-changed-files@v2.3.0 + uses: Ana06/get-changed-files@25f79e676e7ea1868813e21465014798211fad8c # v2.3.0 with: format: "json" diff --git a/.github/workflows/vite-plugin-playgrounds.yml b/.github/workflows/vite-plugin-playgrounds.yml index fefee48b5593..bd973038d9bf 100644 --- a/.github/workflows/vite-plugin-playgrounds.yml +++ b/.github/workflows/vite-plugin-playgrounds.yml @@ -34,7 +34,7 @@ jobs: - name: Checkout Repo uses: actions/checkout@v4 - name: Filter changed paths - uses: dorny/paths-filter@v3 + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 id: changes with: filters: | diff --git a/fixtures/nodejs-hybrid-app/tests/index.test.ts b/fixtures/nodejs-hybrid-app/tests/index.test.ts index 728b7b52512e..f5d444847e21 100644 --- a/fixtures/nodejs-hybrid-app/tests/index.test.ts +++ b/fixtures/nodejs-hybrid-app/tests/index.test.ts @@ -1,21 +1,32 @@ import { resolve } from "node:path"; import { fetch } from "undici"; import { afterAll, beforeAll, describe, it, test } from "vitest"; +import { createMockPostgresServer } from "../../shared/src/mock-postgres-server"; import { runWranglerDev } from "../../shared/src/run-wrangler-long-lived"; describe("nodejs compat", () => { let wrangler: Awaited>; + let mockPg: Awaited>; beforeAll(async () => { + // Start a local mock Postgres server that returns canned results + mockPg = await createMockPostgresServer({ + rows: [{ id: "1", name: "test-row" }], + }); + wrangler = await runWranglerDev(resolve(__dirname, "../src"), [ "--port=0", "--inspector-port=0", + `--var`, + `DB_PORT:${mockPg.port}`, ]); }); afterAll(async () => { await wrangler.stop(); + await mockPg.stop(); }); + it("should work when running code requiring polyfills", async ({ expect, }) => { @@ -23,14 +34,6 @@ describe("nodejs compat", () => { const response = await fetch(`http://${ip}:${port}/test-process`); const body = await response.text(); expect(body).toMatchInlineSnapshot(`"OK!"`); - - // Disabling actually querying the database since we are getting this error: - // > too many connections for role 'reader' - // const response = await fetch(`http://${ip}:${port}/query`); - // const body = await response.text(); - // console.log(body); - // const result = JSON.parse(body) as { id: string }; - // expect(result.id).toEqual("1"); }); it("should be able to call `getRandomValues()` bound to any object", async ({ @@ -113,7 +116,7 @@ describe("nodejs compat", () => { const { ip, port } = wrangler; const response = await fetch(`http://${ip}:${port}/process-env`); await expect(response.json()).resolves.toMatchObject({ - DB_HOSTNAME: "hh-pgsql-public.ebi.ac.uk", + DB_HOSTNAME: "127.0.0.1", DEV_VAR_FROM_DOT_ENV: "dev-var-from-dot-env", }); }); @@ -122,7 +125,7 @@ describe("nodejs compat", () => { const { ip, port } = wrangler; const response = await fetch(`http://${ip}:${port}/env`); await expect(response.json()).resolves.toMatchObject({ - DB_HOSTNAME: "hh-pgsql-public.ebi.ac.uk", + DB_HOSTNAME: "127.0.0.1", DEV_VAR_FROM_DOT_ENV: "dev-var-from-dot-env", }); }); @@ -131,5 +134,7 @@ describe("nodejs compat", () => { const { ip, port } = wrangler; const response = await fetch(`http://${ip}:${port}/query`); expect(response.status).toBe(200); + const body = await response.json(); + expect(body).toMatchObject({ id: "1" }); }); }); diff --git a/fixtures/nodejs-hybrid-app/worker-configuration.d.ts b/fixtures/nodejs-hybrid-app/worker-configuration.d.ts index b6b7d77d04cd..f7c75b2d00b1 100644 --- a/fixtures/nodejs-hybrid-app/worker-configuration.d.ts +++ b/fixtures/nodejs-hybrid-app/worker-configuration.d.ts @@ -1,10 +1,9 @@ -// Generated by Wrangler on Tue Mar 05 2024 16:04:07 GMT+0000 (Greenwich Mean Time) -// by running `wrangler types` +// Generated by Wrangler by running `wrangler types` interface Env { - DB_HOSTNAME: "hh-pgsql-public.ebi.ac.uk"; - DB_PORT: "5432"; - DB_NAME: "pfmegrnargs"; - DB_USERNAME: "reader"; - DB_PASSWORD: "NWDMCE5xdipIjRrp"; + DB_HOSTNAME: string; + DB_PORT: string; + DB_NAME: string; + DB_USERNAME: string; + DB_PASSWORD: string; } diff --git a/fixtures/nodejs-hybrid-app/wrangler.jsonc b/fixtures/nodejs-hybrid-app/wrangler.jsonc index 3e7c57d0517c..6bbdccf82656 100644 --- a/fixtures/nodejs-hybrid-app/wrangler.jsonc +++ b/fixtures/nodejs-hybrid-app/wrangler.jsonc @@ -5,17 +5,14 @@ // Setting compat date after 2025/04/01 means we don't need to use `nodejs_compat_populate_process_env` "compatibility_date": "2025-07-01", "compatibility_flags": ["nodejs_compat"], - /* - These DB connection values are to a public database containing information about - RNA, genes, etc. See https://rnacentral.org/help/public-database. - In case GitGuardian complains in future PRs, this is public information so a false positive. - */ + // Default DB connection values point at 127.0.0.1. + // Tests override DB_PORT at runtime to point at a local mock Postgres server. "vars": { - "DB_HOSTNAME": "hh-pgsql-public.ebi.ac.uk", + "DB_HOSTNAME": "127.0.0.1", "DB_PORT": "5432", - "DB_NAME": "pfmegrnargs", - "DB_USERNAME": "reader", - "DB_PASSWORD": "NWDMCE5xdipIjRrp", + "DB_NAME": "testdb", + "DB_USERNAME": "testuser", + "DB_PASSWORD": "testpassword", "DEBUG": "example:*,test", }, } diff --git a/fixtures/shared/src/mock-postgres-server.ts b/fixtures/shared/src/mock-postgres-server.ts new file mode 100644 index 000000000000..511ac1953438 --- /dev/null +++ b/fixtures/shared/src/mock-postgres-server.ts @@ -0,0 +1,212 @@ +import assert from "node:assert"; +import events from "node:events"; +import net from "node:net"; +import util from "node:util"; + +/** + * The 8-byte Postgres SSLRequest packet. + * Length=8, Code=80877103 (0x04D2162F). + */ +export const POSTGRES_SSL_REQUEST_PACKET = Buffer.from([ + 0x00, 0x00, 0x00, 0x08, 0x04, 0xd2, 0x16, 0x2f, +]); + +// ── Postgres wire protocol helper functions ────────────────────────────────── + +/** Build a single Postgres backend message: type (1 byte) + int32 length + payload. */ +function pgMsg(type: string, payload: Buffer): Buffer { + const len = 4 + payload.length; // length field includes itself but not the type byte + const buf = Buffer.alloc(1 + 4 + payload.length); + buf.write(type, 0, 1, "ascii"); + buf.writeInt32BE(len, 1); + payload.copy(buf, 5); + return buf; +} + +/** AuthenticationOk — type 'R', auth status 0. */ +function authenticationOk(): Buffer { + const payload = Buffer.alloc(4); + payload.writeInt32BE(0, 0); // auth type 0 = OK + return pgMsg("R", payload); +} + +/** ParameterStatus — type 'S', name + value (both null-terminated). */ +function parameterStatus(name: string, value: string): Buffer { + const payload = Buffer.from(`${name}\0${value}\0`, "utf8"); + return pgMsg("S", payload); +} + +/** BackendKeyData — type 'K', process ID + secret key. */ +function backendKeyData(pid: number, key: number): Buffer { + const payload = Buffer.alloc(8); + payload.writeInt32BE(pid, 0); + payload.writeInt32BE(key, 4); + return pgMsg("K", payload); +} + +/** ReadyForQuery — type 'Z', transaction status indicator. */ +function readyForQuery(status: "I" | "T" | "E" = "I"): Buffer { + return pgMsg("Z", Buffer.from(status, "ascii")); +} + +/** RowDescription — type 'T', field definitions for one or more columns. */ +function rowDescription(columns: string[]): Buffer { + // int16 field count, then for each field: + // name (null-terminated), table OID (int32), column attr (int16), + // type OID (int32), type size (int16), type modifier (int32), format code (int16) + const parts: Buffer[] = []; + const fieldCount = Buffer.alloc(2); + fieldCount.writeInt16BE(columns.length, 0); + parts.push(fieldCount); + + for (const col of columns) { + const name = Buffer.from(`${col}\0`, "utf8"); + const meta = Buffer.alloc(18); + meta.writeInt32BE(0, 0); // table OID + meta.writeInt16BE(0, 4); // column attribute number + meta.writeInt32BE(25, 6); // type OID: 25 = text + meta.writeInt16BE(-1, 10); // type size: -1 = variable length + meta.writeInt32BE(-1, 12); // type modifier + meta.writeInt16BE(0, 16); // format code: 0 = text + parts.push(name, meta); + } + + return pgMsg("T", Buffer.concat(parts)); +} + +/** DataRow — type 'D', column values as text. */ +function dataRow(values: string[]): Buffer { + const parts: Buffer[] = []; + const colCount = Buffer.alloc(2); + colCount.writeInt16BE(values.length, 0); + parts.push(colCount); + + for (const val of values) { + const valBuf = Buffer.from(val, "utf8"); + const lenBuf = Buffer.alloc(4); + lenBuf.writeInt32BE(valBuf.length, 0); + parts.push(lenBuf, valBuf); + } + + return pgMsg("D", Buffer.concat(parts)); +} + +/** CommandComplete — type 'C', command tag (null-terminated). */ +function commandComplete(tag: string): Buffer { + return pgMsg("C", Buffer.from(`${tag}\0`, "utf8")); +} + +// ── Mock server ────────────────────────────────────────────────────────────── + +export interface MockPgServerOptions { + /** Canned rows to return for any query. Defaults to [{ id: "1" }]. */ + rows?: Record[]; +} + +/** + * Creates a minimal mock Postgres server that speaks enough of the wire protocol + * for the `pg` (node-postgres) library to successfully connect, authenticate, + * and execute simple queries. + * + * Handles: SSLRequest, StartupMessage, SimpleQuery (Q), Terminate (X). + * Returns canned result rows for any query. + */ +export async function createMockPostgresServer( + options?: MockPgServerOptions +): Promise<{ server: net.Server; port: number; stop: () => Promise }> { + const rows = options?.rows ?? [{ id: "1" }]; + + const server = net.createServer((socket) => { + let startupHandled = false; + + socket.on("data", (chunk: Buffer) => { + // 1. SSLRequest — respond with 'N' (no SSL) + if (POSTGRES_SSL_REQUEST_PACKET.equals(chunk)) { + socket.write("N"); + return; + } + + // 2. StartupMessage — no type byte prefix; starts with int32 length + int32 version (196608 = 3.0) + if (!startupHandled) { + // Validate it looks like a StartupMessage (version 3.0) + if (chunk.length >= 8) { + const version = chunk.readInt32BE(4); + if (version === 196608) { + startupHandled = true; + socket.write( + Buffer.concat([ + authenticationOk(), + parameterStatus("server_version", "15.0"), + parameterStatus("client_encoding", "UTF8"), + backendKeyData(1, 1), + readyForQuery("I"), + ]) + ); + return; + } + } + } + + // 3. Parse typed messages (first byte = type, next 4 bytes = length) + let offset = 0; + while (offset < chunk.length) { + const typeByte = chunk[offset]; + if (typeByte === undefined || offset + 5 > chunk.length) { + break; + } + const msgType = String.fromCharCode(typeByte); + const msgLen = chunk.readInt32BE(offset + 1); + // Total message size = 1 (type) + msgLen + const msgEnd = offset + 1 + msgLen; + + switch (msgType) { + case "Q": { + // SimpleQuery — return canned rows + const firstRow = rows[0]; + const columns = firstRow ? Object.keys(firstRow) : []; + const parts: Buffer[] = [rowDescription(columns)]; + + for (const row of rows) { + parts.push(dataRow(columns.map((col) => row[col] ?? ""))); + } + + parts.push(commandComplete(`SELECT ${rows.length}`)); + parts.push(readyForQuery("I")); + socket.write(Buffer.concat(parts)); + break; + } + case "X": { + // Terminate + socket.end(); + return; + } + default: { + // Unknown message — ignore + break; + } + } + + offset = msgEnd; + } + }); + + // Prevent socket errors (e.g. ECONNRESET from abrupt client disconnects) + // from becoming uncaught exceptions — Node.js EventEmitters throw if an + // 'error' event fires with no listener attached. + socket.on("error", () => {}); + }); + + const listeningPromise = events.once(server, "listening"); + server.listen(0, "127.0.0.1"); + await listeningPromise; + + const address = server.address(); + assert(typeof address === "object" && address !== null); + const port = address.port; + + const stop = async () => { + await util.promisify(server.close.bind(server))(); + }; + + return { server, port, stop }; +} diff --git a/package.json b/package.json index 1c93ca4bed7c..52aebdb5d6c6 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@types/react-transition-group>@types/react": "^18", "@cloudflare/elements>@types/react": "^18", "@types/node": "$@types/node", - "vitest>vite": "^5.0.0", + "vitest>vite": "catalog:default", "@types/node>undici-types": "catalog:default" }, "patchedDependencies": { diff --git a/packages/create-cloudflare/package.json b/packages/create-cloudflare/package.json index 4e81708da68c..e8d7eb539259 100644 --- a/packages/create-cloudflare/package.json +++ b/packages/create-cloudflare/package.json @@ -70,7 +70,7 @@ "execa": "^7.1.1", "exit-hook": "2.2.1", "get-port": "^7.1.0", - "glob": "^10.3.3", + "glob": "^10.5.0", "haikunator": "^2.1.2", "indent-string": "^5.0.0", "jsonc-parser": "catalog:default", diff --git a/packages/local-explorer-ui/src/components/Sidebar.tsx b/packages/local-explorer-ui/src/components/Sidebar.tsx index 3c6025c7dfa9..830f1c38e51f 100644 --- a/packages/local-explorer-ui/src/components/Sidebar.tsx +++ b/packages/local-explorer-ui/src/components/Sidebar.tsx @@ -26,7 +26,6 @@ interface SidebarItemGroupProps { to: FileRouteTypes["to"]; }; }>; - loading: boolean; title: string; } @@ -35,7 +34,6 @@ function SidebarItemGroup({ error, icon: Icon, items, - loading, title, }: SidebarItemGroupProps): JSX.Element { return ( @@ -51,17 +49,11 @@ function SidebarItemGroup({
    - {loading ? ( -
  • - Loading... -
  • - ) : null} - {error ? (
  • {error}
  • ) : null} - {!loading && !error + {!error ? items.map((item) => (
  • {emptyLabel}
  • @@ -100,7 +92,6 @@ interface SidebarProps { doNamespaces: WorkersNamespace[]; kvError: string | null; kvNamespaces: WorkersKvNamespace[]; - loading: boolean; } export function Sidebar({ @@ -111,7 +102,6 @@ export function Sidebar({ doNamespaces, kvError, kvNamespaces, - loading, }: SidebarProps) { return ( diff --git a/packages/local-explorer-ui/src/routes/__root.tsx b/packages/local-explorer-ui/src/routes/__root.tsx index 50cd4927df16..2d0b36f57e37 100644 --- a/packages/local-explorer-ui/src/routes/__root.tsx +++ b/packages/local-explorer-ui/src/routes/__root.tsx @@ -3,7 +3,6 @@ import { Outlet, useRouterState, } from "@tanstack/react-router"; -import { useEffect, useState } from "react"; import { cloudflareD1ListDatabases, durableObjectsNamespaceListNamespaces, @@ -18,73 +17,65 @@ import type { export const Route = createRootRoute({ component: RootLayout, -}); + loader: async () => { + const [kvResponse, d1Response, doResponse] = await Promise.allSettled([ + workersKvNamespaceListNamespaces(), + cloudflareD1ListDatabases(), + durableObjectsNamespaceListNamespaces(), + ]); -function RootLayout() { - const [loading, setLoading] = useState(true); + let kvNamespaces = new Array(); + let kvError: string | null = null; + if (kvResponse.status === "fulfilled") { + kvNamespaces = kvResponse.value.data?.result ?? []; + } else { + kvError = `KV Error: ${kvResponse.reason instanceof Error ? kvResponse.reason.message : JSON.stringify(kvResponse.reason)}`; + } - const [kvNamespaces, setKvNamespaces] = useState([]); - const [kvError, setKvError] = useState(null); + let databases = new Array(); + let d1Error: string | null = null; + if (d1Response.status === "fulfilled") { + databases = d1Response.value.data?.result ?? []; + } else { + d1Error = `D1 Error: ${d1Response.reason instanceof Error ? d1Response.reason.message : JSON.stringify(d1Response.reason)}`; + } - const [d1Error, setD1Error] = useState(null); - const [databases, setDatabases] = useState([]); + let doNamespaces = new Array(); + let doError: string | null = null; + if (doResponse.status === "fulfilled") { + // Only show namespaces that use SQLite storage + const allDoNamespaces = doResponse.value.data?.result ?? []; + doNamespaces = allDoNamespaces.filter((ns) => ns.use_sqlite === true); + } else { + doError = `DO Error: ${doResponse.reason instanceof Error ? doResponse.reason.message : JSON.stringify(doResponse.reason)}`; + } - const [doNamespaces, setDoNamespaces] = useState([]); - const [doError, setDoError] = useState(null); + return { + d1Error, + databases, + doError, + doNamespaces, + kvError, + kvNamespaces, + }; + }, +}); +function RootLayout() { + const loaderData = Route.useLoaderData(); const routerState = useRouterState(); const currentPath = routerState.location.pathname; - useEffect(() => { - async function fetchData() { - const [kvResponse, d1Response, doResponse] = await Promise.allSettled([ - workersKvNamespaceListNamespaces(), - cloudflareD1ListDatabases(), - durableObjectsNamespaceListNamespaces(), - ]); - - if (kvResponse.status === "fulfilled") { - setKvNamespaces(kvResponse.value.data?.result ?? []); - } else { - setKvError( - `KV Error: ${kvResponse.reason instanceof Error ? kvResponse.reason.message : JSON.stringify(kvResponse.reason)}` - ); - } - - if (d1Response.status === "fulfilled") { - setDatabases(d1Response.value.data?.result ?? []); - } else { - setD1Error( - `D1 Error: ${d1Response.reason instanceof Error ? d1Response.reason.message : JSON.stringify(d1Response.reason)}` - ); - } - - if (doResponse.status === "fulfilled") { - // Only show namespaces that use SQLite storage - const allDoNamespaces = doResponse.value.data?.result ?? []; - setDoNamespaces(allDoNamespaces.filter((ns) => ns.use_sqlite === true)); - } else { - setDoError( - `DO Error: ${doResponse.reason instanceof Error ? doResponse.reason.message : JSON.stringify(doResponse.reason)}` - ); - } - - setLoading(false); - } - void fetchData(); - }, []); - return (
    diff --git a/packages/local-explorer-ui/src/routes/do/$className/index.tsx b/packages/local-explorer-ui/src/routes/do/$className/index.tsx index 2ad10ecb26df..d79e32deea8e 100644 --- a/packages/local-explorer-ui/src/routes/do/$className/index.tsx +++ b/packages/local-explorer-ui/src/routes/do/$className/index.tsx @@ -12,7 +12,6 @@ import type { WorkersObject } from "../../../api"; export const Route = createFileRoute("/do/$className/")({ component: NamespaceView, loader: async ({ params }) => { - // Resolve className to namespaceId const response = await durableObjectsNamespaceListNamespaces(); const namespaces = response.data?.result ?? []; const namespace = namespaces.find( @@ -25,8 +24,23 @@ export const Route = createFileRoute("/do/$className/")({ throw new Error(`Durable Object class "${params.className}" not found`); } + const objectsResponse = await durableObjectsNamespaceListObjects({ + path: { + id: namespace.id, + }, + query: { + limit: 50, + }, + }); + + const objects = objectsResponse.data?.result ?? []; + const cursor = objectsResponse.data?.result_info?.cursor ?? null; + return { + cursor, + hasMore: !!cursor, namespaceId: namespace.id, + objects, }; }, }); @@ -36,12 +50,21 @@ function NamespaceView() { const loaderData = Route.useLoaderData(); const { namespaceId } = loaderData; - const [cursor, setCursor] = useState(null); + const [cursor, setCursor] = useState(loaderData.cursor); const [error, setError] = useState(null); - const [hasMore, setHasMore] = useState(false); - const [loading, setLoading] = useState(true); + const [hasMore, setHasMore] = useState(loaderData.hasMore); + const [loading, setLoading] = useState(false); const [loadingMore, setLoadingMore] = useState(false); - const [objects, setObjects] = useState([]); + const [objects, setObjects] = useState(loaderData.objects); + + useEffect((): void => { + setObjects(loaderData.objects); + setCursor(loaderData.cursor); + setHasMore(loaderData.hasMore); + setError(null); + setLoading(false); + setLoadingMore(false); + }, [loaderData]); const fetchObjects = useCallback( async (nextCursor?: string): Promise => { @@ -87,11 +110,6 @@ function NamespaceView() { [namespaceId] ); - useEffect((): void => { - setError(null); - void fetchObjects(); - }, [namespaceId, fetchObjects]); - function handleLoadMore(): void { if (cursor && !loadingMore) { void fetchObjects(cursor); diff --git a/packages/local-explorer-ui/src/routes/kv/$namespaceId.tsx b/packages/local-explorer-ui/src/routes/kv/$namespaceId.tsx index 0a6092e70da9..c48d5165aed0 100644 --- a/packages/local-explorer-ui/src/routes/kv/$namespaceId.tsx +++ b/packages/local-explorer-ui/src/routes/kv/$namespaceId.tsx @@ -18,6 +18,43 @@ import type { KVEntry } from "../../api"; export const Route = createFileRoute("/kv/$namespaceId")({ component: NamespaceView, + loader: async ({ params }) => { + const keysResponse = await workersKvNamespaceListANamespace_SKeys({ + path: { namespace_id: params.namespaceId }, + query: { limit: 50 }, + }); + const keys = keysResponse.data?.result ?? []; + + let values: Record = {}; + if (keys.length > 0) { + const valuesResponse = await workersKvNamespaceGetMultipleKeyValuePairs({ + path: { + namespace_id: params.namespaceId, + }, + body: { + keys: keys.map((k) => k.name), + }, + }); + values = (valuesResponse.data?.result?.values ?? {}) as Record< + string, + string | null + >; + } + + const cursor = keysResponse.data?.result_info?.cursor ?? null; + const entries = keys.map( + (key): KVEntry => ({ + key, + value: values[key.name] ?? null, + }) + ); + + return { + cursor, + entries, + hasMore: !!cursor, + }; + }, }); // Helper functions for optimistic entry state updates @@ -41,29 +78,46 @@ const entryVisible = (entries: KVEntry[], key: string): boolean => function NamespaceView() { const { namespaceId } = Route.useParams(); - const [entries, setEntries] = useState([]); - const [loading, setLoading] = useState(true); + const loaderData = Route.useLoaderData(); + + const [entries, setEntries] = useState(loaderData.entries); + const [cursor, setCursor] = useState(loaderData.cursor); + const [hasMore, setHasMore] = useState(loaderData.hasMore); + // Global (not individal validation) errors like fetch failures, shown in a // banner. Set by fetchEntries, handleAdd, handleEditSave, // handleConfirmOverwrite, handleConfirmDelete - const [error, setError] = useState(null); - const [cursor, setCursor] = useState(null); - const [hasMore, setHasMore] = useState(false); - const [loadingMore, setLoadingMore] = useState(false); const [deleteTarget, setDeleteTarget] = useState(null); - const [deleting, setDeleting] = useState(false); + const [deleting, setDeleting] = useState(false); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + const [loadingMore, setLoadingMore] = useState(false); // State for overwrite confirmation dialog const [overwriteConfirm, setOverwriteConfirm] = useState<{ key: string; value: string; originalKey?: string; // undefined for add, set for edit } | null>(null); - const [overwriting, setOverwriting] = useState(false); + const [overwriting, setOverwriting] = useState(false); // Signal to clear AddKVForm after successful overwrite - const [clearAddForm, setClearAddForm] = useState(0); + const [clearAddForm, setClearAddForm] = useState(0); // Search prefix filter const [prefix, setPrefix] = useState(undefined); + useEffect(() => { + setEntries(loaderData.entries); + setCursor(loaderData.cursor); + setHasMore(loaderData.hasMore); + setDeleteTarget(null); + setDeleting(false); + setOverwriteConfirm(null); + setOverwriting(false); + setError(null); + setPrefix(undefined); + setLoading(false); + setLoadingMore(false); + }, [loaderData]); + const fetchEntries = useCallback( async (nextCursor?: string, prefixParam?: string) => { try { @@ -120,14 +174,6 @@ function NamespaceView() { [namespaceId] ); - useEffect(() => { - setDeleteTarget(null); - setOverwriteConfirm(null); - setError(null); - setPrefix(undefined); - void fetchEntries(undefined, undefined); - }, [namespaceId, fetchEntries]); - const handleLoadMore = () => { if (cursor && !loadingMore) { void fetchEntries(cursor, prefix); diff --git a/packages/miniflare/package.json b/packages/miniflare/package.json index cbf77d04f6a8..f2cfa184a1d0 100644 --- a/packages/miniflare/package.json +++ b/packages/miniflare/package.json @@ -50,7 +50,7 @@ "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "catalog:default", - "workerd": "1.20260301.1", + "workerd": "1.20260306.1", "ws": "catalog:default", "youch": "4.1.0-beta.10" }, @@ -83,7 +83,7 @@ "chokidar": "^4.0.1", "ci-info": "catalog:default", "concurrently": "^8.2.2", - "devalue": "^5.3.2", + "devalue": "^5.6.3", "devtools-protocol": "^0.0.1182435", "esbuild": "catalog:default", "eslint": "catalog:default", @@ -92,7 +92,7 @@ "get-port": "^7.1.0", "glob-to-regexp": "0.4.1", "heap-js": "^2.5.0", - "hono": "^4.11.5", + "hono": "^4.12.5", "http-cache-semantics": "^4.1.0", "jsonc-parser": "catalog:default", "kleur": "^4.1.5", diff --git a/packages/miniflare/src/workers/local-explorer/resources/d1.ts b/packages/miniflare/src/workers/local-explorer/resources/d1.ts index c5e715ece2d3..43fa40bc0d5d 100644 --- a/packages/miniflare/src/workers/local-explorer/resources/d1.ts +++ b/packages/miniflare/src/workers/local-explorer/resources/d1.ts @@ -138,6 +138,9 @@ export async function rawD1Database( body: RawDatabaseBody ): Promise { const databaseId = c.req.param("database_id"); + if (!databaseId) { + return errorResponse(400, 10000, "Missing database_id parameter"); + } const db = getD1Binding(c.env, databaseId); if (!db) { diff --git a/packages/miniflare/src/workers/local-explorer/resources/kv.ts b/packages/miniflare/src/workers/local-explorer/resources/kv.ts index 3b77382ebb50..26811b511c98 100644 --- a/packages/miniflare/src/workers/local-explorer/resources/kv.ts +++ b/packages/miniflare/src/workers/local-explorer/resources/kv.ts @@ -78,6 +78,9 @@ type ListKeysQuery = NonNullable< */ export async function listKVKeys(c: AppContext, query: ListKeysQuery) { const namespace_id = c.req.param("namespace_id"); + if (!namespace_id) { + return errorResponse(400, 10000, "Missing namespace_id parameter"); + } const cursor = query.cursor; const limit = query.limit; const prefix = query.prefix; @@ -112,6 +115,9 @@ export async function listKVKeys(c: AppContext, query: ListKeysQuery) { export async function getKVValue(c: AppContext) { const namespace_id = c.req.param("namespace_id"); const key_name = c.req.param("key_name"); + if (!namespace_id || !key_name) { + return errorResponse(400, 10000, "Missing required path parameters"); + } const kv = getKVBinding(c.env, namespace_id); if (!kv) { @@ -134,6 +140,9 @@ export async function getKVValue(c: AppContext) { export async function putKVValue(c: AppContext) { const namespace_id = c.req.param("namespace_id"); const key_name = c.req.param("key_name"); + if (!namespace_id || !key_name) { + return errorResponse(400, 10000, "Missing required path parameters"); + } const kv = getKVBinding(c.env, namespace_id); if (!kv) { @@ -195,6 +204,9 @@ export async function putKVValue(c: AppContext) { export async function deleteKVValue(c: AppContext) { const namespace_id = c.req.param("namespace_id"); const key_name = c.req.param("key_name"); + if (!namespace_id || !key_name) { + return errorResponse(400, 10000, "Missing required path parameters"); + } const kv = getKVBinding(c.env, namespace_id); if (!kv) { @@ -214,6 +226,9 @@ type BulkGetBody = NonNullable< */ export async function bulkGetKVValues(c: AppContext, body: BulkGetBody) { const namespace_id = c.req.param("namespace_id"); + if (!namespace_id) { + return errorResponse(400, 10000, "Missing namespace_id parameter"); + } const { keys } = body; const kv = getKVBinding(c.env, namespace_id); diff --git a/packages/pages-shared/package.json b/packages/pages-shared/package.json index c4ee4ade5b86..4ffe91b4015c 100644 --- a/packages/pages-shared/package.json +++ b/packages/pages-shared/package.json @@ -33,7 +33,7 @@ "concurrently": "^8.2.2", "esbuild": "catalog:default", "eslint": "catalog:default", - "glob": "^10.4.5", + "glob": "^10.5.0", "html-rewriter-wasm": "^0.4.1", "typescript": "catalog:default", "vitest": "catalog:default" diff --git a/packages/playground-preview-worker/package.json b/packages/playground-preview-worker/package.json index 162115fa1e11..37bfce945d31 100644 --- a/packages/playground-preview-worker/package.json +++ b/packages/playground-preview-worker/package.json @@ -14,7 +14,7 @@ "test:e2e": "vitest run --test-timeout 30000" }, "dependencies": { - "hono": "^4.7.0", + "hono": "^4.12.5", "zod": "^3.22.3" }, "devDependencies": { diff --git a/packages/turbo-r2-archive/package.json b/packages/turbo-r2-archive/package.json index 4000b28c537b..e762dd41b6ed 100644 --- a/packages/turbo-r2-archive/package.json +++ b/packages/turbo-r2-archive/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@hono/zod-validator": "^0.4.2", - "hono": "^4.7.0", + "hono": "^4.12.5", "zod": "^3.22.3" }, "devDependencies": { diff --git a/packages/vite-plugin-cloudflare/playground/node-compat/__tests__/worker-postgres/postgres.spec.ts b/packages/vite-plugin-cloudflare/playground/node-compat/__tests__/worker-postgres/postgres.spec.ts index cbd4425263bd..00d95769d10c 100644 --- a/packages/vite-plugin-cloudflare/playground/node-compat/__tests__/worker-postgres/postgres.spec.ts +++ b/packages/vite-plugin-cloudflare/playground/node-compat/__tests__/worker-postgres/postgres.spec.ts @@ -8,24 +8,17 @@ import { test("should be able to create a pg Client", async ({ expect }) => { await vi.waitFor( async () => - expect(await getTextResponse()).toMatchInlineSnapshot( - `"hh-pgsql-public.ebi.ac.uk"` - ), + expect(await getTextResponse()).toMatchInlineSnapshot(`"127.0.0.1"`), WAIT_FOR_OPTIONS ); }); -// Disabling actually querying the database in CI since we are getting this error: -// > too many connections for role 'reader' -test.runIf(!process.env.CI)( - "should be able to use pg library to send a query", - async ({ expect }) => { - await vi.waitFor( - async () => - expect(await getJsonResponse("/send-query")).toEqual( - expect.objectContaining({ id: "21" }) - ), - WAIT_FOR_OPTIONS - ); - } -); +test("should be able to use pg library to send a query", async ({ expect }) => { + await vi.waitFor( + async () => + expect(await getJsonResponse("/send-query")).toEqual( + expect.objectContaining({ id: "21" }) + ), + WAIT_FOR_OPTIONS + ); +}); diff --git a/packages/vite-plugin-cloudflare/playground/node-compat/__tests__/worker-postgres/serve.ts b/packages/vite-plugin-cloudflare/playground/node-compat/__tests__/worker-postgres/serve.ts new file mode 100644 index 000000000000..4e6d36ece793 --- /dev/null +++ b/packages/vite-plugin-cloudflare/playground/node-compat/__tests__/worker-postgres/serve.ts @@ -0,0 +1,25 @@ +import { createMockPostgresServer } from "@fixture/shared/src/mock-postgres-server"; +import { startDefaultServe } from "../../../vitest-setup"; + +let mockPg: Awaited>; + +/** + * Start a local mock Postgres server before the Vite dev server starts. + * The mock port is passed to the worker via the vite config customizer + * (see vite.config.worker-postgres.ts). + */ +export async function preServe() { + mockPg = await createMockPostgresServer({ + rows: [{ id: "21", name: "mock-row" }], + }); + // eslint-disable-next-line turbo/no-undeclared-env-vars + process.env.MOCK_PG_PORT = String(mockPg.port); +} + +export async function postServe() { + await mockPg?.stop(); +} + +export async function serve() { + return startDefaultServe(); +} diff --git a/packages/vite-plugin-cloudflare/playground/node-compat/package.json b/packages/vite-plugin-cloudflare/playground/node-compat/package.json index 5a76acc7e8fc..e1a1ede25d80 100644 --- a/packages/vite-plugin-cloudflare/playground/node-compat/package.json +++ b/packages/vite-plugin-cloudflare/playground/node-compat/package.json @@ -52,6 +52,7 @@ "@cloudflare/vite-plugin": "workspace:*", "@cloudflare/workers-tsconfig": "workspace:*", "@cloudflare/workers-types": "catalog:default", + "@fixture/shared": "workspace:*", "@types/debug": "^4.1.12", "@types/node": "catalog:vite-plugin", "@types/pg": "^8.15.4", diff --git a/packages/vite-plugin-cloudflare/playground/node-compat/vite.config.worker-postgres.ts b/packages/vite-plugin-cloudflare/playground/node-compat/vite.config.worker-postgres.ts index e8b8d20370f5..834290ba3853 100644 --- a/packages/vite-plugin-cloudflare/playground/node-compat/vite.config.worker-postgres.ts +++ b/packages/vite-plugin-cloudflare/playground/node-compat/vite.config.worker-postgres.ts @@ -8,6 +8,20 @@ export default defineConfig({ plugins: [ cloudflare({ configPath: "./worker-postgres/wrangler.jsonc", + // Inject the mock Postgres server port set by serve.ts preServe() + config: () => { + // eslint-disable-next-line turbo/no-undeclared-env-vars + const mockPgPort = process.env.MOCK_PG_PORT; + if (mockPgPort) { + return { + vars: { + DB_HOSTNAME: "127.0.0.1", + DB_PORT: mockPgPort, + }, + }; + } + return {}; + }, inspectorPort: false, persistState: false, }), diff --git a/packages/vite-plugin-cloudflare/playground/node-compat/worker-postgres/wrangler.jsonc b/packages/vite-plugin-cloudflare/playground/node-compat/worker-postgres/wrangler.jsonc index 7cc3f9a4d917..9ac8cdf0b601 100644 --- a/packages/vite-plugin-cloudflare/playground/node-compat/worker-postgres/wrangler.jsonc +++ b/packages/vite-plugin-cloudflare/playground/node-compat/worker-postgres/wrangler.jsonc @@ -3,11 +3,14 @@ "main": "./index.ts", "compatibility_date": "2024-12-30", "compatibility_flags": ["nodejs_compat"], + // Default DB connection values point at 127.0.0.1. + // Tests override DB_HOSTNAME and DB_PORT at runtime via the vite config + // customizer to point at a local mock Postgres server. "vars": { - "DB_HOSTNAME": "hh-pgsql-public.ebi.ac.uk", + "DB_HOSTNAME": "127.0.0.1", "DB_PORT": "5432", - "DB_NAME": "pfmegrnargs", - "DB_USERNAME": "reader", - "DB_PASSWORD": "NWDMCE5xdipIjRrp", + "DB_NAME": "testdb", + "DB_USERNAME": "testuser", + "DB_PASSWORD": "testpassword", }, } diff --git a/packages/vite-plugin-cloudflare/playground/node-compat/worker-random/wrangler.jsonc b/packages/vite-plugin-cloudflare/playground/node-compat/worker-random/wrangler.jsonc index 7cc3f9a4d917..cd5109139bac 100644 --- a/packages/vite-plugin-cloudflare/playground/node-compat/worker-random/wrangler.jsonc +++ b/packages/vite-plugin-cloudflare/playground/node-compat/worker-random/wrangler.jsonc @@ -3,11 +3,4 @@ "main": "./index.ts", "compatibility_date": "2024-12-30", "compatibility_flags": ["nodejs_compat"], - "vars": { - "DB_HOSTNAME": "hh-pgsql-public.ebi.ac.uk", - "DB_PORT": "5432", - "DB_NAME": "pfmegrnargs", - "DB_USERNAME": "reader", - "DB_PASSWORD": "NWDMCE5xdipIjRrp", - }, } diff --git a/packages/vite-plugin-cloudflare/playground/vitest-setup.ts b/packages/vite-plugin-cloudflare/playground/vitest-setup.ts index 72cc192245c2..fd4a69f7b67f 100644 --- a/packages/vite-plugin-cloudflare/playground/vitest-setup.ts +++ b/packages/vite-plugin-cloudflare/playground/vitest-setup.ts @@ -91,6 +91,7 @@ export function resetServerLogs() { beforeAll(async (s) => { let server: ViteDevServer | PreviewServer | undefined; + let postServe: (() => Promise) | undefined; const suite = s as RunnerTestFile; @@ -172,6 +173,7 @@ beforeAll(async (s) => { const mod = await import(testCustomServe); const serve = mod.serve || mod.default?.serve; const preServe = mod.preServe || mod.default?.preServe; + postServe = mod.postServe || mod.default?.postServe; if (preServe) { await preServe(); } @@ -193,6 +195,9 @@ beforeAll(async (s) => { // a timeout with an exception that hides the real error in the console. await page.close(); await server?.close(); + if (postServe) { + await postServe(); + } throw e; } @@ -204,6 +209,9 @@ beforeAll(async (s) => { // @ts-expect-error TODO: fix await watcher?.close(); await browser?.close(); + if (postServe) { + await postServe(); + } }; }, 40_000); diff --git a/packages/vitest-pool-workers/package.json b/packages/vitest-pool-workers/package.json index 6dc2c6631ea3..7a2e6de10622 100644 --- a/packages/vitest-pool-workers/package.json +++ b/packages/vitest-pool-workers/package.json @@ -71,7 +71,7 @@ "@vitest/snapshot": "catalog:default", "birpc": "0.2.14", "capnp-es": "catalog:default", - "devalue": "^5.3.2", + "devalue": "^5.6.3", "eslint": "catalog:default", "get-port": "^7.1.0", "semver": "^7.7.1", diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json index 4ae7a547808c..e7bb950ec998 100644 --- a/packages/wrangler/package.json +++ b/packages/wrangler/package.json @@ -73,7 +73,7 @@ "miniflare": "workspace:*", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", - "workerd": "1.20260301.1" + "workerd": "1.20260306.1" }, "devDependencies": { "@aws-sdk/client-s3": "^3.721.0", @@ -143,7 +143,7 @@ "minimatch": "^5.1.0", "mock-socket": "^9.3.1", "msw": "2.12.0", - "node-forge": "^1.3.1", + "node-forge": "^1.3.2", "open": "^8.4.0", "p-queue": "^9.0.0", "patch-console": "^1.0.0", diff --git a/packages/wrangler/src/__tests__/type-generation.test.ts b/packages/wrangler/src/__tests__/type-generation.test.ts index 08ffe7d8d444..2f1155d2d130 100644 --- a/packages/wrangler/src/__tests__/type-generation.test.ts +++ b/packages/wrangler/src/__tests__/type-generation.test.ts @@ -2593,6 +2593,242 @@ describe("generate types", () => { `); }); + it("should mark inheritable bindings as required when defined at top-level", async ({ + expect, + }) => { + fs.writeFileSync( + "./wrangler.jsonc", + JSON.stringify({ + assets: { + binding: "ASSETS", + directory: "/assets", + }, + env: { + staging: { + kv_namespaces: [ + { + binding: "KV_STAGING", + id: "staging-kv", + }, + ], + }, + production: { + kv_namespaces: [ + { + binding: "KV_PROD", + id: "prod-kv", + }, + ], + }, + }, + }), + "utf-8" + ); + + await runWrangler("types --include-runtime=false"); + + expect(std.out).toMatchInlineSnapshot(` + " + ⛅️ wrangler x.x.x + ────────────────── + Generating project types... + + declare namespace Cloudflare { + interface StagingEnv { + KV_STAGING: KVNamespace; + ASSETS: Fetcher; + } + interface ProductionEnv { + KV_PROD: KVNamespace; + ASSETS: Fetcher; + } + interface Env { + KV_STAGING?: KVNamespace; + ASSETS: Fetcher; + KV_PROD?: KVNamespace; + } + } + interface Env extends Cloudflare.Env {} + + ──────────────────────────────────────────────────────────── + ✨ Types written to worker-configuration.d.ts + + 📣 Remember to rerun 'wrangler types' after you change your wrangler.jsonc file. + " + `); + }); + + it("should allow inheritable bindings to be overridden in named environments", async ({ + expect, + }) => { + fs.writeFileSync( + "./wrangler.jsonc", + JSON.stringify({ + assets: { + binding: "ASSETS", + directory: "/assets", + }, + env: { + staging: { + assets: { + binding: "STAGING_ASSETS", + directory: "/staging-assets", + }, + }, + production: { + // Uses inherited `ASSETS` binding from top-level + }, + }, + }), + "utf-8" + ); + + await runWrangler("types --include-runtime=false"); + + expect(std.out).toMatchInlineSnapshot(` + " + ⛅️ wrangler x.x.x + ────────────────── + Generating project types... + + declare namespace Cloudflare { + interface StagingEnv { + STAGING_ASSETS: Fetcher; + } + interface ProductionEnv { + ASSETS: Fetcher; + } + interface Env { + STAGING_ASSETS?: Fetcher; + ASSETS?: Fetcher; + } + } + interface Env extends Cloudflare.Env {} + + ──────────────────────────────────────────────────────────── + ✨ Types written to worker-configuration.d.ts + + 📣 Remember to rerun 'wrangler types' after you change your wrangler.jsonc file. + " + `); + }); + + it("should mark inheritable bindings as optional when only defined in some environments", async ({ + expect, + }) => { + fs.writeFileSync( + "./wrangler.jsonc", + JSON.stringify({ + env: { + staging: { + assets: { + binding: "ASSETS", + directory: "/assets", + }, + }, + production: { + kv_namespaces: [ + { + binding: "KV_PROD", + id: "prod-kv", + }, + ], + }, + }, + }), + "utf-8" + ); + + await runWrangler("types --include-runtime=false"); + + expect(std.out).toMatchInlineSnapshot(` + " + ⛅️ wrangler x.x.x + ────────────────── + Generating project types... + + declare namespace Cloudflare { + interface StagingEnv { + ASSETS: Fetcher; + } + interface ProductionEnv { + KV_PROD: KVNamespace; + } + interface Env { + ASSETS?: Fetcher; + KV_PROD?: KVNamespace; + } + } + interface Env extends Cloudflare.Env {} + + ──────────────────────────────────────────────────────────── + ✨ Types written to worker-configuration.d.ts + + 📣 Remember to rerun 'wrangler types' after you change your wrangler.jsonc file. + " + `); + }); + + it("should not inherit top-level inheritable bindings when env defines the property without a binding", async ({ + expect, + }) => { + fs.writeFileSync( + "./wrangler.jsonc", + JSON.stringify({ + assets: { + binding: "ASSETS", + directory: "/assets", + }, + env: { + staging: { + // Defines assets but without a `binding` property - should NOT inherit top-level binding + assets: { + directory: "/staging-assets", + }, + }, + production: { + // Does NOT define `assets` at all - should inherit top-level binding + kv_namespaces: [ + { + binding: "KV_PROD", + id: "prod-kv", + }, + ], + }, + }, + }), + "utf-8" + ); + + await runWrangler("types --include-runtime=false"); + + expect(std.out).toMatchInlineSnapshot(` + " + ⛅️ wrangler x.x.x + ────────────────── + Generating project types... + + declare namespace Cloudflare { + interface StagingEnv {} + interface ProductionEnv { + KV_PROD: KVNamespace; + ASSETS: Fetcher; + } + interface Env { + KV_PROD?: KVNamespace; + ASSETS?: Fetcher; + } + } + interface Env extends Cloudflare.Env {} + + ──────────────────────────────────────────────────────────── + ✨ Types written to worker-configuration.d.ts + + 📣 Remember to rerun 'wrangler types' after you change your wrangler.jsonc file. + " + `); + }); + it("should produce union types for vars with different values across environments", async ({ expect, }) => { diff --git a/packages/wrangler/src/type-generation/index.ts b/packages/wrangler/src/type-generation/index.ts index cddbff968adf..95597b43cc21 100644 --- a/packages/wrangler/src/type-generation/index.ts +++ b/packages/wrangler/src/type-generation/index.ts @@ -2332,6 +2332,53 @@ interface PerEnvBinding { type: string; } +interface InheritableBindingDefinition { + /** + * The category name for this binding (used for identification) + */ + bindingCategory: string; + + /** + * Extract the binding name from the raw environment config + */ + getBindingName: (env: RawEnvironment | undefined) => string | undefined; + + /** + * Check if the environment defines this inheritable property at all. + * + * This is used to determine if inheritance should be skipped, even when + * the environment doesn't define a binding. + * + * For example, if an environment defines `assets: { directory: "/path" }` + * without a `binding`, this method returns `true`, indicating the property + * is defined and inheritance should be skipped. + */ + hasProperty: (env: RawEnvironment | undefined) => boolean; + + /** + * The TypeScript type for this binding + */ + type: string; +} + +/** + * List of bindings that come from inheritable config properties. + * + * These bindings, when defined at the top-level config, are inherited by + * all named environments. + * + * The type generation needs to account for this inheritance when determining + * if a binding should be required or optional in the aggregated `Env` interface. + */ +const INHERITABLE_BINDINGS = [ + { + bindingCategory: "assets", + getBindingName: (env) => env?.assets?.binding, + hasProperty: (env) => env?.assets !== undefined, + type: "Fetcher", + }, +] satisfies InheritableBindingDefinition[]; + /** * Collects vars per environment, returning a map from environment name to vars. * @@ -2823,6 +2870,26 @@ function collectCoreBindingsPerEnvironment( const { rawConfig } = experimental_readRawConfig(args); + const topLevelInheritableBindings: Array<{ + binding: PerEnvBinding; + definition: InheritableBindingDefinition; + }> = []; + for (const inheritableDef of INHERITABLE_BINDINGS) { + const bindingName = inheritableDef.getBindingName(rawConfig); + if (!bindingName) { + continue; + } + + topLevelInheritableBindings.push({ + binding: { + bindingCategory: inheritableDef.bindingCategory, + name: bindingName, + type: inheritableDef.type, + }, + definition: inheritableDef, + }); + } + const topLevelBindings = collectEnvironmentBindings( rawConfig, TOP_LEVEL_ENV_NAME @@ -2833,6 +2900,25 @@ function collectCoreBindingsPerEnvironment( for (const [envName, env] of Object.entries(rawConfig.env ?? {})) { const envBindings = collectEnvironmentBindings(env, envName); + + // Add top-level inheritable bindings if not already present in this environment + // (i.e., the environment doesn't override the inheritable property) + for (const inheritable of topLevelInheritableBindings) { + const alreadyHasBinding = envBindings.some( + (b) => b.bindingCategory === inheritable.binding.bindingCategory + ); + if (alreadyHasBinding) { + continue; + } + + // Skip inheriting if the env defines the property at all (even without a binding) + if (inheritable.definition.hasProperty(env)) { + continue; + } + + envBindings.push(inheritable.binding); + } + if (envBindings.length > 0) { result.set(envName, envBindings); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 837919b5bedc..d5ba71b66337 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: ^0.10.11 version: 0.10.15 '@cloudflare/workers-types': - specifier: ^4.20260226.1 - version: 4.20260305.0 + specifier: ^4.20260306.1 + version: 4.20260306.1 '@typescript-eslint/eslint-plugin': specifier: ^8.35.1 version: 8.46.3 @@ -61,8 +61,8 @@ catalogs: specifier: 7.18.2 version: 7.18.2 vite: - specifier: ^5.4.14 - version: 5.4.14 + specifier: ^5.4.21 + version: 5.4.21 vitest: specifier: ~3.2.0 version: 3.2.3 @@ -80,7 +80,7 @@ overrides: '@types/react-transition-group>@types/react': ^18 '@cloudflare/elements>@types/react': ^18 '@types/node': ^20.19.9 - vitest>vite: ^5.0.0 + vitest>vite: ^5.4.21 '@types/node>undici-types': 7.18.2 patchedDependencies: @@ -157,7 +157,7 @@ importers: version: 5.8.3 vite: specifier: catalog:default - version: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + version: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vitest: specifier: catalog:default version: 3.2.3(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(supports-color@9.2.2)(tsx@4.21.0)(yaml@2.8.1) @@ -172,7 +172,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@fixture/shared': specifier: workspace:* version: link:../shared @@ -223,7 +223,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 ts-dedent: specifier: ^2.2.0 version: 2.2.0 @@ -244,7 +244,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -268,7 +268,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -295,7 +295,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -337,7 +337,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 undici: specifier: catalog:default version: 7.18.2 @@ -352,7 +352,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/mimetext': specifier: ^2.0.4 version: 2.0.4 @@ -397,7 +397,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/jest-image-snapshot': specifier: ^6.4.0 version: 6.4.0 @@ -427,7 +427,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 miniflare: specifier: workspace:* version: link:../../packages/miniflare @@ -503,7 +503,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/node': specifier: ^20.19.9 version: 20.19.9 @@ -527,7 +527,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/is-even': specifier: ^1.0.2 version: 1.0.2 @@ -570,7 +570,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -601,7 +601,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/node': specifier: ^20.19.9 version: 20.19.9 @@ -634,7 +634,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 undici: specifier: catalog:default version: 7.18.2 @@ -655,7 +655,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/debug': specifier: 4.1.12 version: 4.1.12 @@ -691,7 +691,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -715,7 +715,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -743,7 +743,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@fixture/pages-plugin': specifier: workspace:* version: link:../pages-plugin-example @@ -770,7 +770,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -815,7 +815,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -839,7 +839,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -863,7 +863,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -881,7 +881,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 is-odd: specifier: ^3.0.1 version: 3.0.1 @@ -903,7 +903,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@fixture/pages-plugin': specifier: workspace:* version: link:../pages-plugin-example @@ -972,7 +972,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -996,7 +996,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1200,19 +1200,19 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 fixtures/rules-app: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 fixtures/secrets-store: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 wrangler: specifier: workspace:* version: link:../../packages/wrangler @@ -1239,7 +1239,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/is-even': specifier: ^1.0.2 version: 1.0.2 @@ -1266,7 +1266,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 vitest: specifier: catalog:default version: 3.2.3(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.1) @@ -1281,7 +1281,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 esbuild: specifier: catalog:default version: 0.27.3 @@ -1308,7 +1308,7 @@ importers: version: link:../../packages/vitest-pool-workers '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@microlabs/otel-cf-workers': specifier: 1.0.0-rc.45 version: 1.0.0-rc.45(@opentelemetry/api@1.7.0) @@ -1344,7 +1344,7 @@ importers: version: 5.8.3 vite: specifier: catalog:default - version: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + version: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vitest: specifier: catalog:default version: 3.2.3(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(supports-color@9.2.2)(tsx@4.21.0)(yaml@2.8.1) @@ -1382,7 +1382,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@fixture/shared': specifier: workspace:* version: link:../shared @@ -1443,7 +1443,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 wrangler: specifier: workspace:* version: link:../../packages/wrangler @@ -1458,7 +1458,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 miniflare: specifier: workspace:* version: link:../../packages/miniflare @@ -1512,7 +1512,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 run-script-os: specifier: ^1.1.6 version: 1.1.6 @@ -1539,7 +1539,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1563,7 +1563,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1587,7 +1587,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1611,7 +1611,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1635,7 +1635,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/jest-image-snapshot': specifier: ^6.4.0 version: 6.4.0 @@ -1671,7 +1671,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 playwright-chromium: specifier: catalog:default version: 1.56.1 @@ -1698,7 +1698,7 @@ importers: version: link:../../packages/workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1719,7 +1719,7 @@ importers: version: link:../../packages/eslint-config-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -1819,7 +1819,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -1890,8 +1890,8 @@ importers: specifier: ^7.1.0 version: 7.1.0 glob: - specifier: ^10.3.3 - version: 10.4.5 + specifier: ^10.5.0 + version: 10.5.0 haikunator: specifier: ^2.1.2 version: 2.1.2 @@ -1927,10 +1927,10 @@ importers: version: 7.18.2 vite: specifier: catalog:default - version: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + version: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vite-tsconfig-paths: specifier: ^4.0.8 - version: 4.2.0(typescript@5.8.3)(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + version: 4.2.0(typescript@5.8.3)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) vitest: specifier: catalog:default version: 3.2.3(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(supports-color@9.2.2)(tsx@4.21.0)(yaml@2.8.1) @@ -1957,7 +1957,7 @@ importers: version: link:../eslint-config-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@octokit/types': specifier: ^13.8.0 version: 13.8.0 @@ -1981,10 +1981,10 @@ importers: version: link:../eslint-config-shared '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.10.15(@cloudflare/workers-types@4.20260305.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) + version: 0.10.15(@cloudflare/workers-types@4.20260306.1)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/cookie': specifier: ^0.6.0 version: 0.6.0 @@ -2053,7 +2053,7 @@ importers: version: link:../eslint-config-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 eslint: specifier: catalog:default version: 9.39.1(jiti@2.6.1) @@ -2083,10 +2083,10 @@ importers: version: link:../eslint-config-shared '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.10.15(@cloudflare/workers-types@4.20260305.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9) + version: 0.10.15(@cloudflare/workers-types@4.20260306.1)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9) '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/mime': specifier: ^3.0.4 version: 3.0.4 @@ -2158,7 +2158,7 @@ importers: version: 2.1.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tailwindcss/vite': specifier: ^4.0.15 - version: 4.1.18(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + version: 4.1.18(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) '@tanstack/react-router': specifier: ^1.158.0 version: 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -2189,7 +2189,7 @@ importers: version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.159.4)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-plugin': specifier: ^1.158.0 - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) '@types/react': specifier: ^19.2.0 version: 19.2.13 @@ -2198,7 +2198,7 @@ importers: version: 19.2.3(@types/react@19.2.13) '@vitejs/plugin-react': specifier: ^4.4.1 - version: 4.7.0(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + version: 4.7.0(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) concurrently: specifier: ^9.0.0 version: 9.2.1 @@ -2207,10 +2207,10 @@ importers: version: 5.8.3 vite: specifier: catalog:default - version: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + version: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vite-plugin-svgr: specifier: ^4.3.0 - version: 4.5.0(rollup@4.57.1)(typescript@5.8.3)(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + version: 4.5.0(rollup@4.57.1)(typescript@5.8.3)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) vitest: specifier: catalog:default version: 3.2.3(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(supports-color@9.2.2)(tsx@4.21.0)(yaml@2.8.1) @@ -2227,8 +2227,8 @@ importers: specifier: catalog:default version: 7.18.2 workerd: - specifier: 1.20260301.1 - version: 1.20260301.1 + specifier: 1.20260306.1 + version: 1.20260306.1 ws: specifier: catalog:default version: 8.18.0 @@ -2256,7 +2256,7 @@ importers: version: link:../workers-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -2321,8 +2321,8 @@ importers: specifier: ^8.2.2 version: 8.2.2 devalue: - specifier: ^5.3.2 - version: 5.3.2 + specifier: ^5.6.3 + version: 5.6.3 devtools-protocol: specifier: ^0.0.1182435 version: 0.0.1182435 @@ -2348,8 +2348,8 @@ importers: specifier: ^2.5.0 version: 2.5.0 hono: - specifier: ^4.11.5 - version: 4.11.5 + specifier: ^4.12.5 + version: 4.12.5 http-cache-semantics: specifier: ^4.1.0 version: 4.1.1 @@ -2437,7 +2437,7 @@ importers: version: link:../eslint-config-shared '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.10.15(@cloudflare/workers-types@4.20260305.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) + version: 0.10.15(@cloudflare/workers-types@4.20260306.1)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) '@cloudflare/workers-shared': specifier: workspace:* version: link:../workers-shared @@ -2446,7 +2446,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -2457,8 +2457,8 @@ importers: specifier: catalog:default version: 9.39.1(jiti@2.6.1) glob: - specifier: ^10.4.5 - version: 10.4.5 + specifier: ^10.5.0 + version: 10.5.0 html-rewriter-wasm: specifier: ^0.4.1 version: 0.4.1 @@ -2472,8 +2472,8 @@ importers: packages/playground-preview-worker: dependencies: hono: - specifier: ^4.7.0 - version: 4.7.1 + specifier: ^4.12.5 + version: 4.12.5 zod: specifier: ^3.22.3 version: 3.22.3 @@ -2483,7 +2483,7 @@ importers: version: link:../eslint-config-shared '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/cookie': specifier: ^0.6.0 version: 0.6.0 @@ -2523,7 +2523,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/node': specifier: ^20.19.9 version: 20.19.9 @@ -2553,7 +2553,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 esbuild: specifier: catalog:default version: 0.27.3 @@ -2570,10 +2570,10 @@ importers: dependencies: '@hono/zod-validator': specifier: ^0.4.2 - version: 0.4.2(hono@4.7.1)(zod@3.22.3) + version: 0.4.2(hono@4.12.5)(zod@3.22.3) hono: - specifier: ^4.7.0 - version: 4.7.1 + specifier: ^4.12.5 + version: 4.12.5 zod: specifier: ^3.22.3 version: 3.22.3 @@ -2642,7 +2642,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -2726,7 +2726,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2747,7 +2747,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2768,7 +2768,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2789,7 +2789,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2810,7 +2810,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2831,7 +2831,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2852,7 +2852,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2873,7 +2873,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2894,7 +2894,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2915,7 +2915,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2936,7 +2936,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2957,7 +2957,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2978,7 +2978,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -2999,7 +2999,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3020,7 +3020,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3041,7 +3041,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3062,7 +3062,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/mimetext': specifier: ^2.0.4 version: 2.0.4 @@ -3095,7 +3095,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3116,7 +3116,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3137,7 +3137,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3158,7 +3158,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3179,7 +3179,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3200,7 +3200,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3221,7 +3221,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@playground/main-resolution-package': specifier: file:./package version: file:packages/vite-plugin-cloudflare/playground/main-resolution/package @@ -3245,7 +3245,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/express': specifier: ^5.0.1 version: 5.0.1 @@ -3272,7 +3272,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@playground/module-resolution-excludes': specifier: file:./packages/excludes version: file:packages/vite-plugin-cloudflare/playground/module-resolution/packages/excludes @@ -3284,7 +3284,7 @@ importers: version: file:packages/vite-plugin-cloudflare/playground/module-resolution/packages/requires '@remix-run/cloudflare': specifier: 2.12.0 - version: 2.12.0(@cloudflare/workers-types@4.20260305.0)(typescript@5.8.3) + version: 2.12.0(@cloudflare/workers-types@4.20260306.1)(typescript@5.8.3) '@types/react': specifier: ^18.3.11 version: 18.3.18 @@ -3317,7 +3317,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3338,7 +3338,10 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 + '@fixture/shared': + specifier: workspace:* + version: link:../../../../fixtures/shared '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -3387,7 +3390,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/react': specifier: 19.1.0 version: 19.1.0 @@ -3408,7 +3411,7 @@ importers: dependencies: partyserver: specifier: ^0.0.64 - version: 0.0.64(@cloudflare/workers-types@4.20260305.0) + version: 0.0.64(@cloudflare/workers-types@4.20260306.1) partysocket: specifier: ^1.0.3 version: 1.0.3 @@ -3427,7 +3430,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@tailwindcss/vite': specifier: ^4.0.15 version: 4.0.15(vite@7.1.12(@types/node@20.19.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1)) @@ -3463,7 +3466,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3484,7 +3487,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../../../workers-utils @@ -3524,7 +3527,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/react': specifier: 19.1.0 version: 19.1.0 @@ -3554,7 +3557,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3575,7 +3578,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3603,7 +3606,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/react': specifier: 19.1.0 version: 19.1.0 @@ -3636,7 +3639,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3657,7 +3660,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3678,7 +3681,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@vitejs/plugin-basic-ssl': specifier: ^2.0.0 version: 2.0.0(vite@7.1.12(@types/node@20.19.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1)) @@ -3702,7 +3705,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3723,7 +3726,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3744,7 +3747,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3765,7 +3768,7 @@ importers: version: link:../../../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 typescript: specifier: catalog:default version: 5.8.3 @@ -3802,7 +3805,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -3828,8 +3831,8 @@ importers: specifier: catalog:default version: 0.0.14(typescript@5.8.3) devalue: - specifier: ^5.3.2 - version: 5.3.2 + specifier: ^5.6.3 + version: 5.6.3 eslint: specifier: catalog:default version: 9.39.1(jiti@2.6.1) @@ -3881,7 +3884,7 @@ importers: version: 18.3.3 '@vitejs/plugin-react': specifier: ^4.3.3 - version: 4.3.3(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + version: 4.3.3(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) eslint: specifier: catalog:default version: 9.39.1(jiti@2.6.1) @@ -3896,10 +3899,10 @@ importers: version: 5.8.3 vite: specifier: catalog:default - version: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + version: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vite-plugin-dts: specifier: ^4.0.1 - version: 4.0.1(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.8.3)(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + version: 4.0.1(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.8.3)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) packages/workers-playground: dependencies: @@ -4002,7 +4005,7 @@ importers: version: 9.0.4 '@vitejs/plugin-react': specifier: ^4.3.3 - version: 4.3.3(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + version: 4.3.3(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) eslint: specifier: catalog:default version: 9.39.1(jiti@2.6.1) @@ -4017,7 +4020,7 @@ importers: version: 7.18.2 vite: specifier: catalog:default - version: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + version: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) wrangler: specifier: workspace:^ version: link:../wrangler @@ -4029,13 +4032,13 @@ importers: version: link:../eslint-config-shared '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.10.15(@cloudflare/workers-types@4.20260305.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9) + version: 0.10.15(@cloudflare/workers-types@4.20260306.1)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9) '@cloudflare/workers-tsconfig': specifier: workspace:* version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@sentry/cli': specifier: ^2.37.0 version: 2.41.1(encoding@0.1.13) @@ -4146,13 +4149,13 @@ importers: version: link:../eslint-config-shared '@cloudflare/vitest-pool-workers': specifier: catalog:default - version: 0.10.15(@cloudflare/workers-types@4.20260305.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) + version: 0.10.15(@cloudflare/workers-types@4.20260306.1)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3) '@cloudflare/workers-tsconfig': specifier: workspace:* version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@types/mime': specifier: ^3.0.4 version: 3.0.4 @@ -4193,8 +4196,8 @@ importers: specifier: 2.0.0-rc.24 version: 2.0.0-rc.24 workerd: - specifier: 1.20260301.1 - version: 1.20260301.1 + specifier: 1.20260306.1 + version: 1.20260306.1 optionalDependencies: fsevents: specifier: ~2.3.2 @@ -4229,7 +4232,7 @@ importers: version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: catalog:default - version: 4.20260305.0 + version: 4.20260306.1 '@cloudflare/workers-utils': specifier: workspace:* version: link:../workers-utils @@ -4402,8 +4405,8 @@ importers: specifier: 2.12.0 version: 2.12.0(@types/node@20.19.9)(typescript@5.8.3) node-forge: - specifier: ^1.3.1 - version: 1.3.1 + specifier: ^1.3.2 + version: 1.3.3 open: specifier: ^8.4.0 version: 8.4.0 @@ -5301,6 +5304,12 @@ packages: cpu: [x64] os: [darwin] + '@cloudflare/workerd-darwin-64@1.20260306.1': + resolution: {integrity: sha512-+NpKFdxeCdpysFtdqjVu5jhHXBTClyLXqNKw4JTRHO0MTgem0npW6XtAthxINvoSQw3K3rTqDNjxbMOGJfcUug==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + '@cloudflare/workerd-darwin-arm64@1.20251210.0': resolution: {integrity: sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw==} engines: {node: '>=16'} @@ -5313,6 +5322,12 @@ packages: cpu: [arm64] os: [darwin] + '@cloudflare/workerd-darwin-arm64@1.20260306.1': + resolution: {integrity: sha512-TVGVZfm87UYeGkNrR8ssHVeU130meA5Gnbm1EHOaycYazNcDqcylA0bEiQsOb3RJyIHdwUGX0EHnoWNCYW9krA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + '@cloudflare/workerd-linux-64@1.20251210.0': resolution: {integrity: sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g==} engines: {node: '>=16'} @@ -5325,6 +5340,12 @@ packages: cpu: [x64] os: [linux] + '@cloudflare/workerd-linux-64@1.20260306.1': + resolution: {integrity: sha512-Vm79Rhg2GFveBcwZcwsS98s4q0EoGtlaT/B5Xaf70iddPACMaQNSTAlz9mhSp/dQMlnY4bvQN5Srnc4X9rdqag==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + '@cloudflare/workerd-linux-arm64@1.20251210.0': resolution: {integrity: sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA==} engines: {node: '>=16'} @@ -5337,6 +5358,12 @@ packages: cpu: [arm64] os: [linux] + '@cloudflare/workerd-linux-arm64@1.20260306.1': + resolution: {integrity: sha512-i+6+wlpSQcxna576uXRT0bamJX0lppQmLkXDBJs5daMsINri58qa5cc9bt8tKQt6thO5kJ1vRZUkyKnHcUCCoQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + '@cloudflare/workerd-windows-64@1.20251210.0': resolution: {integrity: sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw==} engines: {node: '>=16'} @@ -5349,6 +5376,12 @@ packages: cpu: [x64] os: [win32] + '@cloudflare/workerd-windows-64@1.20260306.1': + resolution: {integrity: sha512-3Nro0uFHFnx0GLdb2RzA+wWXDDKkcTYvcWygQa9VHRooeVwhbf1Za2qrwtUWoji+tnFaptyf8IDbdrfagDSdIA==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + '@cloudflare/workers-editor-shared@0.1.1': resolution: {integrity: sha512-tk7dZ3rj61o8oPL2JIfJbjAldBOJZNHHIWlkfY5X5ftw7QhAIccACz4zW7LFcMyw6HHexmHhIPlcdENqqnp28w==} peerDependencies: @@ -5357,8 +5390,8 @@ packages: react: ^17.0.2 || ^18.2.21 react-dom: ^17.0.2 || ^18.2.21 - '@cloudflare/workers-types@4.20260305.0': - resolution: {integrity: sha512-sCgPFnQ03SVpC2OVW8wysONLZW/A8hlp9Mq2ckG/h1oId4kr9NawA6vUiOmOjCWRn2hIohejBYVQ+Vu20rCdKA==} + '@cloudflare/workers-types@4.20260306.1': + resolution: {integrity: sha512-1gtiB0nm0Uji6VKHprvL1ZyFtdHZSR907lU2fbBioMurJAF4tQPoafJFJp4oeViUiMVUEqkp0Eh0dcbcKoHoow==} '@codemirror/autocomplete@6.20.0': resolution: {integrity: sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==} @@ -10385,6 +10418,9 @@ packages: devalue@5.3.2: resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} + devalue@5.6.3: + resolution: {integrity: sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==} + devtools-protocol@0.0.1182435: resolution: {integrity: sha512-EmlkWb62wSbQNE1gRZZsi4KZYRaF5Skpp183LhRU7+sadKR06O1dHCjZmFSEG6Kv7P6S/UYLxcY3NlYwqKM99w==} @@ -11050,14 +11086,13 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.3.4: + resolution: {integrity: sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -11225,8 +11260,8 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true @@ -11358,12 +11393,8 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hono@4.11.5: - resolution: {integrity: sha512-WemPi9/WfyMwZs+ZUXdiwcCh9Y+m7L+8vki9MzDw3jJ+W9Lc+12HGsd368Qc1vZi1xwW8BWMMsnK5efYKPdt4g==} - engines: {node: '>=16.9.0'} - - hono@4.7.1: - resolution: {integrity: sha512-V3eWoPkBxoNgFCkSc5Y5rpLF6YoQQx1pkYO4qrF6YfOw8RZbujUNlJLZCxh0z9gZct70+je2Ih7Zrdpv21hP9w==} + hono@4.12.5: + resolution: {integrity: sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==} engines: {node: '>=16.9.0'} hono@4.7.10: @@ -12598,8 +12629,8 @@ packages: encoding: optional: true - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + node-forge@1.3.3: + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} engines: {node: '>= 6.13.0'} node-polyglot@2.5.0: @@ -14981,8 +15012,8 @@ packages: vite: optional: true - vite@5.4.14: - resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -15238,6 +15269,11 @@ packages: engines: {node: '>=16'} hasBin: true + workerd@1.20260306.1: + resolution: {integrity: sha512-FeZAijrCXpuFvnZbxht/sAnU9NGq4S7/hG9thOInqJovaAgq8y/OPZ11JGKMkuSC9sLoeS1aOh5ZxhUDP5HEDg==} + engines: {node: '>=16'} + hasBin: true + wrangler@4.54.0: resolution: {integrity: sha512-bANFsjDwJLbprYoBK+hUDZsVbUv2SqJd8QvArLIcZk+fPq4h/Ohtj5vkKXD3k0s2bD1DXLk08D+hYmeNH+xC6A==} engines: {node: '>=20.0.0'} @@ -16755,7 +16791,7 @@ snapshots: lodash.memoize: 4.1.2 marked: 0.3.19 - '@cloudflare/vitest-pool-workers@0.10.15(@cloudflare/workers-types@4.20260305.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9)': + '@cloudflare/vitest-pool-workers@0.10.15(@cloudflare/workers-types@4.20260306.1)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@2.1.9)': dependencies: '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -16765,14 +16801,14 @@ snapshots: miniflare: 4.20251210.0 semver: 7.7.3 vitest: 2.1.9(@types/node@20.19.9)(@vitest/ui@2.1.9)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3)) - wrangler: 4.54.0(@cloudflare/workers-types@4.20260305.0) + wrangler: 4.54.0(@cloudflare/workers-types@4.20260306.1) zod: 3.25.76 transitivePeerDependencies: - '@cloudflare/workers-types' - bufferutil - utf-8-validate - '@cloudflare/vitest-pool-workers@0.10.15(@cloudflare/workers-types@4.20260305.0)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3)': + '@cloudflare/vitest-pool-workers@0.10.15(@cloudflare/workers-types@4.20260306.1)(@vitest/runner@3.2.3)(@vitest/snapshot@3.2.3)(vitest@3.2.3)': dependencies: '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -16782,7 +16818,7 @@ snapshots: miniflare: 4.20251210.0 semver: 7.7.3 vitest: 3.2.3(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.1) - wrangler: 4.54.0(@cloudflare/workers-types@4.20260305.0) + wrangler: 4.54.0(@cloudflare/workers-types@4.20260306.1) zod: 3.25.76 transitivePeerDependencies: - '@cloudflare/workers-types' @@ -16795,30 +16831,45 @@ snapshots: '@cloudflare/workerd-darwin-64@1.20260301.1': optional: true + '@cloudflare/workerd-darwin-64@1.20260306.1': + optional: true + '@cloudflare/workerd-darwin-arm64@1.20251210.0': optional: true '@cloudflare/workerd-darwin-arm64@1.20260301.1': optional: true + '@cloudflare/workerd-darwin-arm64@1.20260306.1': + optional: true + '@cloudflare/workerd-linux-64@1.20251210.0': optional: true '@cloudflare/workerd-linux-64@1.20260301.1': optional: true + '@cloudflare/workerd-linux-64@1.20260306.1': + optional: true + '@cloudflare/workerd-linux-arm64@1.20251210.0': optional: true '@cloudflare/workerd-linux-arm64@1.20260301.1': optional: true + '@cloudflare/workerd-linux-arm64@1.20260306.1': + optional: true + '@cloudflare/workerd-windows-64@1.20251210.0': optional: true '@cloudflare/workerd-windows-64@1.20260301.1': optional: true + '@cloudflare/workerd-windows-64@1.20260306.1': + optional: true + '@cloudflare/workers-editor-shared@0.1.1(@cloudflare/style-const@6.1.3(react@19.2.4))(@cloudflare/style-container@7.12.2(@cloudflare/style-const@6.1.3(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@cloudflare/style-const': 6.1.3(react@19.2.4) @@ -16827,7 +16878,7 @@ snapshots: react-dom: 19.2.4(react@19.2.4) react-split-pane: 0.1.92(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@cloudflare/workers-types@4.20260305.0': {} + '@cloudflare/workers-types@4.20260306.1': {} '@codemirror/autocomplete@6.20.0': dependencies: @@ -17645,9 +17696,9 @@ snapshots: dependencies: hono: 4.7.10 - '@hono/zod-validator@0.4.2(hono@4.7.1)(zod@3.22.3)': + '@hono/zod-validator@0.4.2(hono@4.12.5)(zod@3.22.3)': dependencies: - hono: 4.7.1 + hono: 4.12.5 zod: 3.22.3 '@humanfs/core@0.19.1': {} @@ -18338,7 +18389,7 @@ snapshots: '@prisma/adapter-d1@7.0.1': dependencies: - '@cloudflare/workers-types': 4.20260305.0 + '@cloudflare/workers-types': 4.20260306.1 '@prisma/driver-adapter-utils': 7.0.1 ky: 1.7.5 @@ -18565,10 +18616,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@remix-run/cloudflare@2.12.0(@cloudflare/workers-types@4.20260305.0)(typescript@5.8.3)': + '@remix-run/cloudflare@2.12.0(@cloudflare/workers-types@4.20260306.1)(typescript@5.8.3)': dependencies: '@cloudflare/kv-asset-handler': 0.1.3 - '@cloudflare/workers-types': 4.20260305.0 + '@cloudflare/workers-types': 4.20260306.1 '@remix-run/server-runtime': 2.12.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -19663,12 +19714,12 @@ snapshots: tailwindcss: 4.0.15 vite: 7.1.12(@types/node@20.19.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1) - '@tailwindcss/vite@4.1.18(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2))': + '@tailwindcss/vite@4.1.18(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) '@tanstack/history@1.154.14': {} @@ -19733,7 +19784,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2))': + '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -19750,7 +19801,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.159.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) transitivePeerDependencies: - supports-color @@ -20332,18 +20383,18 @@ snapshots: dependencies: vite: 7.1.12(@types/node@20.19.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.1) - '@vitejs/plugin-react@4.3.3(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2))': + '@vitejs/plugin-react@4.3.3(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.7.0(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2))': + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -20351,7 +20402,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) transitivePeerDependencies: - supports-color @@ -20382,50 +20433,50 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@2.1.9(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2))': + '@vitest/mocker@2.1.9(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.0(@types/node@20.19.9)(typescript@5.8.3) - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) - '@vitest/mocker@2.1.9(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2))': + '@vitest/mocker@2.1.9(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.0(@types/node@20.19.9)(typescript@5.9.3) - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) - '@vitest/mocker@3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.2))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2))': + '@vitest/mocker@3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.2))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2))': dependencies: '@vitest/spy': 3.2.3 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.0(@types/node@20.19.9)(typescript@5.8.2) - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) - '@vitest/mocker@3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2))': + '@vitest/mocker@3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2))': dependencies: '@vitest/spy': 3.2.3 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.0(@types/node@20.19.9)(typescript@5.8.3) - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) - '@vitest/mocker@3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2))': + '@vitest/mocker@3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2))': dependencies: '@vitest/spy': 3.2.3 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.0(@types/node@20.19.9)(typescript@5.9.3) - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) '@vitest/pretty-format@2.1.8': dependencies: @@ -20474,7 +20525,7 @@ snapshots: dependencies: '@vitest/utils': 2.1.9 fflate: 0.8.2 - flatted: 3.3.3 + flatted: 3.3.4 pathe: 1.1.2 sirv: 3.0.2 tinyglobby: 0.2.15 @@ -21699,6 +21750,8 @@ snapshots: devalue@5.3.2: {} + devalue@5.6.3: {} + devtools-protocol@0.0.1182435: {} devtools-protocol@0.0.1273771: {} @@ -22812,15 +22865,13 @@ snapshots: flatted@3.3.3: {} + flatted@3.3.4: + optional: true + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -23001,9 +23052,9 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.4.5: + glob@10.5.0: dependencies: - foreground-child: 3.1.1 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -23149,9 +23200,7 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hono@4.11.5: {} - - hono@4.7.1: {} + hono@4.12.5: {} hono@4.7.10: {} @@ -24306,7 +24355,7 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-forge@1.3.1: {} + node-forge@1.3.3: {} node-polyglot@2.5.0: dependencies: @@ -24562,9 +24611,9 @@ snapshots: parseurl@1.3.3: {} - partyserver@0.0.64(@cloudflare/workers-types@4.20260305.0): + partyserver@0.0.64(@cloudflare/workers-types@4.20260306.1): dependencies: - '@cloudflare/workers-types': 4.20260305.0 + '@cloudflare/workers-types': 4.20260306.1 nanoid: 5.1.0 partysocket@1.0.3: @@ -26253,7 +26302,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 - glob: 10.4.5 + glob: 10.5.0 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -27041,7 +27090,7 @@ snapshots: debug: 4.4.1(supports-color@9.2.2) es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) transitivePeerDependencies: - '@types/node' - less @@ -27074,7 +27123,7 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.0.1(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.8.3)(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)): + vite-plugin-dts@4.0.1(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.8.3)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)): dependencies: '@microsoft/api-extractor': 7.47.4(@types/node@20.19.9) '@rollup/pluginutils': 5.1.0(rollup@4.57.1) @@ -27088,35 +27137,35 @@ snapshots: typescript: 5.8.3 vue-tsc: 2.0.29(typescript@5.8.3) optionalDependencies: - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-svgr@4.5.0(rollup@4.57.1)(typescript@5.8.3)(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)): + vite-plugin-svgr@4.5.0(rollup@4.57.1)(typescript@5.8.3)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.57.1) '@svgr/core': 8.1.0(typescript@5.8.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@4.2.0(typescript@5.8.3)(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)): + vite-tsconfig-paths@4.2.0(typescript@5.8.3)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)): dependencies: debug: 4.4.1(supports-color@9.2.2) globrex: 0.1.2 tsconfck: 2.1.1(typescript@5.8.3) optionalDependencies: - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) transitivePeerDependencies: - supports-color - typescript - vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2): + vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -27167,7 +27216,7 @@ snapshots: vitest@2.1.9(@types/node@20.19.9)(@vitest/ui@2.1.9)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3)): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + '@vitest/mocker': 2.1.9(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -27183,7 +27232,7 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vite-node: 2.1.9(@types/node@20.19.9)(lightningcss@1.30.2) why-is-node-running: 2.3.0 optionalDependencies: @@ -27203,7 +27252,7 @@ snapshots: vitest@2.1.9(@types/node@20.19.9)(@vitest/ui@2.1.9)(lightningcss@1.30.2)(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3)): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + '@vitest/mocker': 2.1.9(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -27219,7 +27268,7 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vite-node: 2.1.9(@types/node@20.19.9)(lightningcss@1.30.2) why-is-node-running: 2.3.0 optionalDependencies: @@ -27240,7 +27289,7 @@ snapshots: dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.2))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + '@vitest/mocker': 3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.2))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) '@vitest/pretty-format': 3.2.3 '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -27258,7 +27307,7 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vite-node: 3.2.3(@types/node@20.19.9)(jiti@2.6.1)(lightningcss@1.30.2)(supports-color@9.2.2)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: @@ -27283,7 +27332,7 @@ snapshots: dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + '@vitest/mocker': 3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) '@vitest/pretty-format': 3.2.3 '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -27301,7 +27350,7 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vite-node: 3.2.3(@types/node@20.19.9)(jiti@2.6.1)(lightningcss@1.30.2)(supports-color@9.2.2)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: @@ -27326,7 +27375,7 @@ snapshots: dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + '@vitest/mocker': 3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.9.3))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) '@vitest/pretty-format': 3.2.3 '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -27344,7 +27393,7 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vite-node: 3.2.3(@types/node@20.19.9)(jiti@2.6.1)(lightningcss@1.30.2)(supports-color@9.2.2)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: @@ -27369,7 +27418,7 @@ snapshots: dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.14(@types/node@20.19.9)(lightningcss@1.30.2)) + '@vitest/mocker': 3.2.3(msw@2.12.0(@types/node@20.19.9)(typescript@5.8.3))(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.30.2)) '@vitest/pretty-format': 3.2.3 '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -27387,7 +27436,7 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 5.4.14(@types/node@20.19.9)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.30.2) vite-node: 3.2.3(@types/node@20.19.9)(jiti@2.6.1)(lightningcss@1.30.2)(supports-color@9.2.2)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: @@ -27538,7 +27587,15 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20260301.1 '@cloudflare/workerd-windows-64': 1.20260301.1 - wrangler@4.54.0(@cloudflare/workers-types@4.20260305.0): + workerd@1.20260306.1: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20260306.1 + '@cloudflare/workerd-darwin-arm64': 1.20260306.1 + '@cloudflare/workerd-linux-64': 1.20260306.1 + '@cloudflare/workerd-linux-arm64': 1.20260306.1 + '@cloudflare/workerd-windows-64': 1.20260306.1 + + wrangler@4.54.0(@cloudflare/workers-types@4.20260306.1): dependencies: '@cloudflare/kv-asset-handler': 0.4.1 '@cloudflare/unenv-preset': 2.7.13(unenv@2.0.0-rc.24)(workerd@1.20251210.0) @@ -27549,7 +27606,7 @@ snapshots: unenv: 2.0.0-rc.24 workerd: 1.20251210.0 optionalDependencies: - '@cloudflare/workers-types': 4.20260305.0 + '@cloudflare/workers-types': 4.20260306.1 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7795d5cad087..ade204321fcc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -28,12 +28,12 @@ catalog: # version of Undici undici-types: "7.18.2" vitest: "~3.2.0" - vite: "^5.4.14" + vite: "^5.4.21" "ws": "8.18.0" esbuild: "0.27.3" playwright-chromium: "^1.56.1" - "@cloudflare/workers-types": "^4.20260226.1" - workerd: "1.20260301.1" + "@cloudflare/workers-types": "^4.20260306.1" + workerd: "1.20260306.1" eslint: "^9.39.1" jsonc-parser: "^3.2.0" smol-toml: "^1.5.2" diff --git a/tools/deployments/__tests__/validate-changesets.test.ts b/tools/deployments/__tests__/validate-changesets.test.ts index b8f17b61c18b..7d18322eebd5 100644 --- a/tools/deployments/__tests__/validate-changesets.test.ts +++ b/tools/deployments/__tests__/validate-changesets.test.ts @@ -94,7 +94,6 @@ describe("validateChangesets()", () => { ["package-a", { name: "package-a" }], ["package-b", { name: "package-b" }], ["package-c", { name: "package-c" }], - ["package-d", { name: "package-d", "workers-sdk": { deploy: true } }], ]), [ { @@ -152,15 +151,6 @@ describe("validateChangesets()", () => { docs: test`, }, - { - file: "deployable-package.md", - contents: dedent` - --- - "package-d": patch - --- - - fix: test`, - }, ] ); expect(errors).toMatchInlineSnapshot(` @@ -168,7 +158,6 @@ describe("validateChangesets()", () => { "Error: could not parse changeset - invalid frontmatter: at file "invalid-frontmatter.md"", "Unknown package name "package-invalid" in changeset at "invalid-package.md".", "Invalid type "foo" for package "package-a" in changeset at "invalid-type.md".", - "Currently we are not allowing changes to package "package-d" in changeset at "deployable-package.md" since it would trigger a Worker/Pages deployment.", ] `); }); diff --git a/tools/deployments/validate-changesets.ts b/tools/deployments/validate-changesets.ts index d03d7101cffa..63f2f33d86d4 100644 --- a/tools/deployments/validate-changesets.ts +++ b/tools/deployments/validate-changesets.ts @@ -30,24 +30,6 @@ export function validateChangesets( ); } - // TEMPORARILY BLOCK PACKAGES THAT WOULD DEPLOY WORKERS - const ALLOWED_PRIVATE_PACKAGES = [ - "@cloudflare/workers-shared", - "@cloudflare/quick-edit", - "@cloudflare/devprod-status-bot", - "@cloudflare/workers-playground", - ]; - if ( - packages.get(release.name)?.["workers-sdk"]?.deploy && - // Exception: deployments for these workers are allowed now - !ALLOWED_PRIVATE_PACKAGES.includes(release.name) - ) { - errors.push( - `Currently we are not allowing changes to package "${release.name}" in changeset at "${file}" since it would trigger a Worker/Pages deployment.` - ); - } - // END TEMPORARILY BLOCK PACKAGES THAT WOULD DEPLOY WORKERS - if (release.type === "major") { errors.push( `Major version bumps are not allowed for package "${release.name}" in changeset at "${file}".`