diff --git a/.changeset/dry-peas-beg.md b/.changeset/dry-peas-beg.md new file mode 100644 index 000000000000..1ed173d0cc56 --- /dev/null +++ b/.changeset/dry-peas-beg.md @@ -0,0 +1,5 @@ +--- +"wrangler": patch +--- + +patch: This release fixes some regressions related to running `wrangler dev` that were caused by internal refactoring of the dev server architecture ([#3960](https://github.com/cloudflare/workers-sdk/pull/3960)). The change has been reverted, and will be added back in a future release. diff --git a/fixtures/dev-env/.gitignore b/fixtures/dev-env/.gitignore deleted file mode 100644 index 1521c8b7652b..000000000000 --- a/fixtures/dev-env/.gitignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/fixtures/dev-env/package.json b/fixtures/dev-env/package.json deleted file mode 100644 index 5502c9d0e0b8..000000000000 --- a/fixtures/dev-env/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "dev-env", - "version": "1.0.1", - "private": true, - "description": "", - "license": "ISC", - "author": "", - "main": "src/index.js", - "scripts": { - "test": "npx vitest run", - "test:ci": "npx vitest run", - "test:watch": "npx vitest", - "type:tests": "tsc -p ./tests/tsconfig.json" - }, - "devDependencies": { - "@types/ws": "^8.5.7", - "@cloudflare/workers-tsconfig": "workspace:^", - "get-port": "^7.0.0", - "miniflare": "3.20231002.1", - "undici": "^5.23.0", - "wrangler": "workspace:*", - "ws": "^8.14.2" - }, - "dependencies": {} -} diff --git a/fixtures/dev-env/tests/index.test.ts b/fixtures/dev-env/tests/index.test.ts deleted file mode 100644 index 83e7baa04b83..000000000000 --- a/fixtures/dev-env/tests/index.test.ts +++ /dev/null @@ -1,552 +0,0 @@ -import assert from "node:assert"; -import getPort from "get-port"; -import { - Miniflare, - type Response as MiniflareResponse, - type MiniflareOptions, - Log, -} from "miniflare"; -import * as undici from "undici"; -import { WebSocket } from "ws"; -import { beforeEach, afterEach, describe, test, expect, vi } from "vitest"; -import { unstable_DevEnv as DevEnv } from "wrangler"; -import type { ProxyData } from "wrangler/src/api"; -import type { StartDevWorkerOptions } from "wrangler/src/api/startDevWorker/types"; -import type { EsbuildBundle } from "wrangler/src/dev/use-esbuild"; - -const fakeBundle = {} as EsbuildBundle; - -let devEnv: DevEnv; -let mf: Miniflare | undefined; -let res: MiniflareResponse | undici.Response | undefined; -let ws: WebSocket | undefined; - -type OptionalKeys = Omit & Partial>; - -beforeEach(() => { - devEnv = new DevEnv(); - mf = undefined; - res = undefined; - ws = undefined; -}); -afterEach(async () => { - await devEnv?.teardown(); - await mf?.dispose(); - await ws?.close(); - - vi.resetAllMocks(); -}); - -async function fakeStartUserWorker(options: { - script: string; - name?: string; - mfOpts?: Partial; - config?: OptionalKeys; -}) { - const config: StartDevWorkerOptions = { - ...options.config, - name: options.name ?? "test-worker", - script: { contents: options.script }, - }; - const mfOpts: MiniflareOptions = Object.assign( - { - port: 0, - inspectorPort: 0, - modules: true, - compatibilityDate: "2023-08-01", - name: config.name, - script: options.script, - log: Object.assign(new Log(), { error() {} }), // TODO: remove when this bug is fixed https://jira.cfdata.org/browse/DEVX-983 - }, - options.mfOpts - ); - - assert("script" in mfOpts); - - fakeConfigUpdate(config); - fakeReloadStart(config); - - const worker = devEnv.startWorker(config); - const { proxyWorker, inspectorProxyWorker } = await devEnv.proxy.ready - .promise; - const proxyWorkerUrl = await proxyWorker.ready; - const inspectorProxyWorkerUrl = await inspectorProxyWorker.ready; - - mf = new Miniflare(mfOpts); - - const userWorkerUrl = await mf.ready; - const userWorkerInspectorUrl = await mf.getInspectorURL(); - fakeReloadComplete(config, mfOpts, userWorkerUrl, userWorkerInspectorUrl); - - return { - worker, - mf, - mfOpts, - config, - userWorkerUrl, - userWorkerInspectorUrl, - proxyWorkerUrl, - inspectorProxyWorkerUrl, - }; -} - -async function fakeUserWorkerChanges({ - script, - mfOpts, - config, -}: { - script?: string; - mfOpts: MiniflareOptions; - config: StartDevWorkerOptions; -}) { - assert(mf); - assert("script" in mfOpts); - - config = { - ...config, - script: { - ...config.script, - ...(script ? { contents: script } : undefined), - }, - }; - mfOpts = { - ...mfOpts, - script: script ?? mfOpts.script, - }; - - fakeReloadStart(config); - - await mf.setOptions(mfOpts); - - const userWorkerUrl = await mf.ready; - const userWorkerInspectorUrl = await mf.getInspectorURL(); - fakeReloadComplete( - config, - mfOpts, - userWorkerUrl, - userWorkerInspectorUrl, - 1000 - ); - - return { mfOpts, config, mf, userWorkerUrl, userWorkerInspectorUrl }; -} - -function fireAndForgetFakeUserWorkerChanges( - ...args: Parameters -) { - // fire and forget the reload -- this let's us test request buffering - void fakeUserWorkerChanges(...args); -} - -function fakeConfigUpdate(config: StartDevWorkerOptions) { - devEnv.proxy.onConfigUpdate({ - type: "configUpdate", - config, - }); - - return config; // convenience to allow calling and defining new config inline but also store the new object -} -function fakeReloadStart(config: StartDevWorkerOptions) { - devEnv.proxy.onReloadStart({ - type: "reloadStart", - config, - bundle: fakeBundle, - }); - - return config; -} -function fakeReloadComplete( - config: StartDevWorkerOptions, - mfOpts: MiniflareOptions, - userWorkerUrl: URL, - userWorkerInspectorUrl: URL, - delay = 100 -) { - const proxyData: ProxyData = { - userWorkerUrl: { - protocol: userWorkerUrl.protocol, - hostname: userWorkerUrl.hostname, - port: userWorkerUrl.port, - }, - userWorkerInspectorUrl: { - protocol: userWorkerInspectorUrl.protocol, - hostname: userWorkerInspectorUrl.hostname, - port: userWorkerInspectorUrl.port, - pathname: `/core:user:${config.name}`, - }, - userWorkerInnerUrlOverrides: { - protocol: config?.dev?.urlOverrides?.secure ? "https:" : "http:", - hostname: config?.dev?.urlOverrides?.hostname, - }, - headers: {}, - liveReload: config.dev?.liveReload, - }; - - setTimeout(() => { - devEnv.proxy.onReloadComplete({ - type: "reloadComplete", - config, - bundle: fakeBundle, - proxyData, - }); - }, delay); - - return { config, mfOpts }; // convenience to allow calling and defining new config/mfOpts inline but also store the new objects -} - -describe("startDevWorker: ProxyController", () => { - test("ProxyWorker buffers requests while runtime reloads", async () => { - const run = await fakeStartUserWorker({ - script: ` - export default { - fetch() { - return new Response("body:1"); - } - } - `, - }); - - res = await run.worker.fetch("http://dummy"); - await expect(res.text()).resolves.toBe("body:1"); - - fireAndForgetFakeUserWorkerChanges({ - mfOpts: run.mfOpts, - config: run.config, - script: run.mfOpts.script.replace("1", "2"), - }); - - res = await run.worker.fetch("http://dummy"); - await expect(res.text()).resolves.toBe("body:2"); - }); - - test("InspectorProxyWorker discovery endpoints + devtools websocket connection", async () => { - const run = await fakeStartUserWorker({ - script: ` - export default { - fetch() { - console.log('Inside mock user worker'); - - return new Response("body:1"); - } - } - `, - }); - - await devEnv.proxy.ready; - res = await undici.fetch(`http://${run.inspectorProxyWorkerUrl.host}/json`); - - await expect(res.json()).resolves.toBeInstanceOf(Array); - - ws = new WebSocket( - `ws://${run.inspectorProxyWorkerUrl.host}/core:user:${run.config.name}` - ); - const openPromise = new Promise((resolve) => { - ws?.addEventListener("open", resolve); - }); - const consoleAPICalledPromise = new Promise((resolve) => { - ws?.addEventListener("message", (event) => { - assert(typeof event.data === "string"); - if (event.data.includes("Runtime.consoleAPICalled")) { - resolve(JSON.parse(event.data)); - } - }); - }); - const executionContextCreatedPromise = new Promise((resolve) => { - ws?.addEventListener("message", (event) => { - assert(typeof event.data === "string"); - if (event.data.includes("Runtime.executionContextCreated")) { - resolve(JSON.parse(event.data)); - } - }); - }); - - await openPromise; - await run.worker.fetch("http://localhost"); - - await expect(consoleAPICalledPromise).resolves.toMatchObject({ - method: "Runtime.consoleAPICalled", - params: { - args: expect.arrayContaining([ - { type: "string", value: "Inside mock user worker" }, - ]), - }, - }); - await expect(executionContextCreatedPromise).resolves.toMatchObject({ - method: "Runtime.executionContextCreated", - params: { - context: { id: expect.any(Number) }, - }, - }); - }); - - test("User worker exception", async () => { - const consoleErrorSpy = vi.spyOn(console, "error"); - - const run = await fakeStartUserWorker({ - script: ` - export default { - fetch() { - throw new Error('Boom!'); - - return new Response("body:1"); - } - } - `, - }); - - res = await run.worker.fetch("http://dummy"); - await expect(res.text()).resolves.toBe("Error: Boom!"); - - await new Promise((r) => setTimeout(r, 100)); // allow some time for the error to be logged (TODO: replace with retry/waitUntil helper) - expect(consoleErrorSpy).toBeCalledWith( - expect.stringContaining("Error: Boom!") - ); - - // test changes causing a new error cause the new error to propogate - fireAndForgetFakeUserWorkerChanges({ - script: ` - export default { - fetch() { - throw new Error('Boom 2!'); - - return new Response("body:2"); - } - } - `, - mfOpts: run.mfOpts, - config: run.config, - }); - - res = await run.worker.fetch("http://dummy"); - await expect(res.text()).resolves.toBe("Error: Boom 2!"); - - await new Promise((r) => setTimeout(r, 100)); // allow some time for the error to be logged (TODO: replace with retry/waitUntil helper) - expect(consoleErrorSpy).toBeCalledWith( - expect.stringContaining("Error: Boom 2!") - ); - - // test eyeball requests receive the pretty error page - fireAndForgetFakeUserWorkerChanges({ - script: ` - export default { - fetch() { - const e = new Error('Boom 3!'); - - // this is how errors are serialised after they are caught by wrangler/miniflare3 middlewares - const error = { name: e.name, message: e.message, stack: e.stack }; - return Response.json(error, { - status: 500, - headers: { "MF-Experimental-Error-Stack": "true" }, - }); - } - } - `, - mfOpts: run.mfOpts, - config: run.config, - }); - - const proxyWorkerUrl = await devEnv.proxy.proxyWorker?.ready; - assert(proxyWorkerUrl); - res = await undici.fetch(proxyWorkerUrl, { - headers: { Accept: "text/html" }, - }); - await expect(res.text()).resolves.toEqual( - expect.stringContaining(`

Boom 3!

`) // pretty error page html snippet - ); - - // test further changes that fix the code - fireAndForgetFakeUserWorkerChanges({ - script: ` - export default { - fetch() { - return new Response("body:3"); - } - } - `, - mfOpts: run.mfOpts, - config: run.config, - }); - - res = await run.worker.fetch("http://dummy"); - await expect(res.text()).resolves.toBe("body:3"); - - consoleErrorSpy.mockReset(); - res = await run.worker.fetch("http://dummy"); - await expect(res.text()).resolves.toBe("body:3"); - - await new Promise((r) => setTimeout(r, 100)); // allow some time for the error to be logged (TODO: replace with retry/waitUntil helper) - expect(consoleErrorSpy).not.toHaveBeenCalled(); - }); - - test("config.dev.{server,inspector} changes, restart the server instance", async () => { - const run = await fakeStartUserWorker({ - script: ` - export default { - fetch() { - return new Response("body:1"); - } - } - `, - config: { - dev: { - server: { port: await getPort() }, - inspector: { port: await getPort() }, - }, - }, - }); - - res = await run.worker.fetch("http://dummy"); - await expect(res.text()).resolves.toBe("body:1"); - - const oldPort = run.config.dev?.server?.port; - res = await undici.fetch(`http://127.0.0.1:${oldPort}`); - await expect(res.text()).resolves.toBe("body:1"); - - const config2 = fakeConfigUpdate({ - ...run.config, - dev: { - server: { port: await getPort() }, - inspector: { port: await getPort() }, - }, - }); - fakeReloadStart(config2); - fakeReloadComplete( - config2, - run.mfOpts, - run.userWorkerUrl, - run.userWorkerInspectorUrl - ); - - const newPort = config2.dev?.server?.port; - - res = await run.worker.fetch("http://dummy"); - await expect(res.text()).resolves.toBe("body:1"); - - res = await undici.fetch(`http://127.0.0.1:${newPort}`); - await expect(res.text()).resolves.toBe("body:1"); - - await expect( - undici.fetch(`http://127.0.0.1:${oldPort}`).then((r) => r.text()) - ).rejects.toMatchInlineSnapshot("[TypeError: fetch failed]"); - }); - - test("liveReload", async () => { - let resText: string; - const scriptRegex = / - `, - { html: true } - ); - } - }, - }); - - return htmlRewriter.transform(response); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0081d494b59..620d509757eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -102,30 +102,6 @@ importers: specifier: workspace:* version: link:../../packages/wrangler - fixtures/dev-env: - devDependencies: - '@cloudflare/workers-tsconfig': - specifier: workspace:^ - version: link:../../packages/workers-tsconfig - '@types/ws': - specifier: ^8.5.7 - version: 8.5.7 - get-port: - specifier: ^7.0.0 - version: 7.0.0 - miniflare: - specifier: 3.20231002.1 - version: 3.20231002.1 - undici: - specifier: ^5.23.0 - version: 5.23.0 - wrangler: - specifier: workspace:* - version: link:../../packages/wrangler - ws: - specifier: ^8.14.2 - version: 8.14.2 - fixtures/external-durable-objects-app: devDependencies: '@cloudflare/workers-tsconfig': @@ -642,7 +618,7 @@ importers: version: 8.49.0 eslint-config-turbo: specifier: latest - version: 1.10.15(eslint@8.49.0) + version: 1.10.13(eslint@8.49.0) eslint-plugin-import: specifier: 2.26.x version: 2.26.0(@typescript-eslint/parser@6.7.2)(eslint@8.49.0) @@ -3428,15 +3404,6 @@ packages: marked: 0.3.19 dev: false - /@cloudflare/workerd-darwin-64@1.20231002.0: - resolution: {integrity: sha512-sgtjzVO/wtI/6S7O0bk4zQAv2xlvqOxB18AXzlit6uXgbYFGeQedRHjhKVMOacGmWEnM4C3ir/fxJGsc3Pyxng==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@cloudflare/workerd-darwin-64@1.20231010.0: resolution: {integrity: sha512-LM9ePAh88EGoQkYisAfdLMEDzcaMinRer0mY11GOiN4A9ZU+6APRVvhh5JBRzI0F6Dkb8nHtrzhisioWCRaY1w==} engines: {node: '>=16'} @@ -3445,15 +3412,6 @@ packages: requiresBuild: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20231002.0: - resolution: {integrity: sha512-dv8nztYFaTYYgBpyy80vc4hdMYv9mhyNbvBsZywm8S7ivcIpzogi0UKkGU4E/G0lYK6W3WtwTBqwRe+pXJ1+Ww==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@cloudflare/workerd-darwin-arm64@1.20231010.0: resolution: {integrity: sha512-Vr7Z1O+vJRCnVeWaF0YSv0EMHiMRY7yYCxr7O509FzvJAXsZuXZ7DYC5TAD7a8HSeeqsxFTAbF9jg0y9A2wKVw==} engines: {node: '>=16'} @@ -3462,15 +3420,6 @@ packages: requiresBuild: true optional: true - /@cloudflare/workerd-linux-64@1.20231002.0: - resolution: {integrity: sha512-UG8SlLcGzaQDSSw6FR4+Zf408925wkLOCAi8w5qEoFYu3g4Ef7ZenstesCOsyWL7qBDKx0/iwk6+a76W5IHI0Q==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@cloudflare/workerd-linux-64@1.20231010.0: resolution: {integrity: sha512-l9oDVPVhPEOHr1JpcGnLSsIf1h8sZnvcIC2Tl1zt+3p/KGFyGqGyAZJMLUoMJ54Q07oRE1x3KAu+JcWWEvdxpg==} engines: {node: '>=16'} @@ -3479,15 +3428,6 @@ packages: requiresBuild: true optional: true - /@cloudflare/workerd-linux-arm64@1.20231002.0: - resolution: {integrity: sha512-GPaa66ZSq1gK09r87c5CJbHIApcIU//LVHz3rnUxK0//00YCwUuGUUK1dn/ylg+fVqDQxIDmH+ABnobBanvcDA==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@cloudflare/workerd-linux-arm64@1.20231010.0: resolution: {integrity: sha512-NBmYsJu+ns2W8WHcDnglfqLV5O3FP7lXpoTSTvpM64mhexmemdMlOJX5gpRuarTula3fA+GzEehinUojwM9/1g==} engines: {node: '>=16'} @@ -3496,15 +3436,6 @@ packages: requiresBuild: true optional: true - /@cloudflare/workerd-windows-64@1.20231002.0: - resolution: {integrity: sha512-ybIy+sCme0VO0RscndXvqWNBaRMUOc8vhi+1N2h/KDsKfNLsfEQph+XWecfKzJseUy1yE2rV1xei3BaNmaa6vg==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@cloudflare/workerd-windows-64@1.20231010.0: resolution: {integrity: sha512-jWiG71Rvuh4FYdEpOP1+BAygdguTlMYYy+v5d4ZOjxDkl+V8aR86EEtDQrv/QLUJFbpcoEX25SxXnN5UMKtjhQ==} engines: {node: '>=16'} @@ -6030,12 +5961,6 @@ packages: '@types/node': 20.1.7 dev: true - /@types/ws@8.5.7: - resolution: {integrity: sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==} - dependencies: - '@types/node': 20.1.7 - dev: true - /@types/yargs-parser@20.2.1: resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} dev: true @@ -6773,6 +6698,14 @@ packages: dependencies: acorn: 8.10.0 + /acorn-jsx@5.3.2(acorn@8.8.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: true + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -8980,13 +8913,13 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-turbo@1.10.15(eslint@8.49.0): - resolution: {integrity: sha512-76mpx2x818JZE26euen14utYcFDxOahZ9NaWA+6Xa4pY2ezVKVschuOxS96EQz3o3ZRSmcgBOapw/gHbN+EKxQ==} + /eslint-config-turbo@1.10.13(eslint@8.49.0): + resolution: {integrity: sha512-Ffa0SxkRCPMtfUX/HDanEqsWoLwZTQTAXO9W4IsOtycb2MzJDrVcLmoFW5sMwCrg7gjqbrC4ZJoD+1SPPzIVqg==} peerDependencies: eslint: '>6.6.0' dependencies: eslint: 8.49.0 - eslint-plugin-turbo: 1.10.15(eslint@8.49.0) + eslint-plugin-turbo: 1.10.13(eslint@8.49.0) dev: false /eslint-import-resolver-node@0.3.7: @@ -9321,8 +9254,8 @@ packages: - typescript dev: true - /eslint-plugin-turbo@1.10.15(eslint@8.49.0): - resolution: {integrity: sha512-Tv4QSKV/U56qGcTqS/UgOvb9HcKFmWOQcVh3HEaj7of94lfaENgfrtK48E2CckQf7amhKs1i+imhCsNCKjkQyA==} + /eslint-plugin-turbo@1.10.13(eslint@8.49.0): + resolution: {integrity: sha512-el4AAmn0zXmvHEyp1h0IQMfse10Vy8g5Vbg4IU3+vD9CSj5sDbX07iFVt8sCKg7og9Q5FAa9mXzlCf7t4vYgzg==} peerDependencies: eslint: '>6.6.0' dependencies: @@ -9495,8 +9428,8 @@ packages: resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) eslint-visitor-keys: 3.4.1 dev: true @@ -10225,11 +10158,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /get-port@7.0.0: - resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} - engines: {node: '>=16'} - dev: true - /get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} dependencies: @@ -13030,28 +12958,6 @@ packages: engines: {node: '>=4'} dev: false - /miniflare@3.20231002.1: - resolution: {integrity: sha512-4xJ8FezJkQqHzCm71lovb9L/wJ0VV/odMFf5CIxfLTunsx97kTIlZnhS6aHuvcbzdztbWp1RR71K/1qFUHdpdQ==} - engines: {node: '>=16.13'} - dependencies: - acorn: 8.10.0 - acorn-walk: 8.2.0 - capnp-ts: 0.7.0(supports-color@9.2.2) - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - source-map-support: 0.5.21 - stoppable: 1.1.0 - undici: 5.23.0 - workerd: 1.20231002.0 - ws: 8.14.2 - youch: 3.2.3 - zod: 3.22.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /miniflare@3.20231010.0(supports-color@9.2.2): resolution: {integrity: sha512-VETY+/OhJ1RN+yrFpPUqBZysb2R8wXvyx3vzaRZS2qO1aGNKeGASa/vxCvNcBF+gt8UdbWMOalSXX8zY0IgWZA==} engines: {node: '>=16.13'} @@ -13065,7 +12971,7 @@ packages: stoppable: 1.1.0 undici: 5.23.0 workerd: 1.20231010.0 - ws: 8.14.2 + ws: 8.13.0 youch: 3.2.3 zod: 3.22.2 transitivePeerDependencies: @@ -17404,19 +17310,6 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true - /workerd@1.20231002.0: - resolution: {integrity: sha512-NFuUQBj30ZguDoPZ6bL40hINiu8aP2Pvxr/3xAdhWOwVFLuObPOiSdQ8qm4JYZ7jovxWjWE4Z7VR2avjIzEksQ==} - engines: {node: '>=16'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20231002.0 - '@cloudflare/workerd-darwin-arm64': 1.20231002.0 - '@cloudflare/workerd-linux-64': 1.20231002.0 - '@cloudflare/workerd-linux-arm64': 1.20231002.0 - '@cloudflare/workerd-windows-64': 1.20231002.0 - dev: true - /workerd@1.20231010.0: resolution: {integrity: sha512-ghxfBU8fBSBDa8fCBPfzWivYsWpewYftgy70N308C+acQ5AaKNM1QTdkQNm9YWeC5Jpl1YvBX04ojt7lCc3juw==} engines: {node: '>=16'} @@ -17499,8 +17392,8 @@ packages: optional: true dev: true - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1