diff --git a/.changeset/seven-flies-repair.md b/.changeset/seven-flies-repair.md new file mode 100644 index 000000000000..b74e64213a8b --- /dev/null +++ b/.changeset/seven-flies-repair.md @@ -0,0 +1,5 @@ +--- +"@cloudflare/pages-shared": patch +--- + +Remove Miniflare 2 diff --git a/packages/pages-shared/__tests__/asset-server/handler.test.ts b/packages/pages-shared/__tests__/asset-server/handler.test.ts index 388533f9f4c8..49daa5bd4054 100644 --- a/packages/pages-shared/__tests__/asset-server/handler.test.ts +++ b/packages/pages-shared/__tests__/asset-server/handler.test.ts @@ -1,5 +1,3 @@ -import { Cache } from "@miniflare/cache"; -import { MemoryStorage } from "@miniflare/storage-memory"; import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; import { CACHE_PRESERVATION_WRITE_FREQUENCY, @@ -10,7 +8,6 @@ import { createMetadataObject } from "../../metadata-generator/createMetadataObj import type { HandlerContext } from "../../asset-server/handler"; import type { Metadata } from "../../asset-server/metadata"; import type { RedirectRule } from "../../metadata-generator/types"; -import type { Cache as WorkersCache } from "@cloudflare/workers-types/experimental"; describe("asset-server handler", () => { test("Returns appropriate status codes", async () => { @@ -457,9 +454,6 @@ describe("asset-server handler", () => { ) ); - // Create cache storage to reuse between requests - const { caches } = createCacheStorage(); - const getResponse = async () => getTestResponse({ request: new Request("https://example.com/"), @@ -563,9 +557,6 @@ describe("asset-server handler", () => { return null; }; - // Create cache storage to reuse between requests - const { caches } = createCacheStorage(); - const getResponse = async () => getTestResponse({ request: new Request("https://example.com/"), @@ -650,7 +641,6 @@ describe("asset-server handler", () => { test("preservationCacheV2", async () => { const deploymentId = "deployment-" + Math.random(); const metadata = createMetadataObject({ deploymentId }) as Metadata; - const { caches } = createCacheStorage(); let findAssetEntryForPath = async (path: string) => { if (path === "/foo.html") { @@ -729,7 +719,7 @@ describe("asset-server handler", () => { expect(response3.status).toBe(200); expect(await response3.text()).toMatchInlineSnapshot('"hello world!"'); // Cached responses have the same headers with a few changes/additions: - expect(Object.fromEntries(response3.headers)).toStrictEqual({ + expect(Object.fromEntries(response3.headers)).toMatchObject({ ...expectedHeaders, "cache-control": "public, s-maxage=604800", "x-robots-tag": "noindex", @@ -743,7 +733,14 @@ describe("asset-server handler", () => { findAssetEntryForPath, fetchAsset: () => Promise.resolve(Object.assign(new Response("hello world!"))), + // @ts-expect-error Create a dummy fake cache to simulate a fresh cache + caches: { + open(cacheName) { + return caches.open("fresh" + cacheName); + }, + }, }); + expect(response4.status).toBe(404); expect(Object.fromEntries(response4.headers)).toMatchInlineSnapshot(` { @@ -1080,39 +1077,6 @@ interface HandlerSpies { getAssetKey: number; negotiateContent: number; waitUntil: Promise[]; - caches: { - [key: string]: WorkersCache; - } & { default: WorkersCache }; -} - -function createMemoryCache(): WorkersCache { - // Miniflare RequestInit is missing CfProperties so we need to cast - return new Cache(new MemoryStorage()) as unknown as WorkersCache; -} - -function createCacheStorage(): { - caches: CacheStorage; - cacheSpy: { - [key: string]: WorkersCache; - } & { default: WorkersCache }; -} { - const cacheSpy: { [key: string]: WorkersCache } & { - default: WorkersCache; - } = { - default: createMemoryCache(), - }; - const caches = { - open(cacheName: string): Promise { - if (cacheSpy[cacheName]) { - return Promise.resolve(cacheSpy[cacheName]); - } - const cache = createMemoryCache(); - cacheSpy[cacheName] = cache; - return Promise.resolve(cache); - }, - default: cacheSpy.default, - }; - return { caches, cacheSpy }; } async function getTestResponse({ @@ -1151,9 +1115,6 @@ async function getTestResponse({ getAssetKey: 0, negotiateContent: 0, waitUntil: [], - caches: { - default: createMemoryCache(), - }, }; const response = await generateHandler({ @@ -1185,14 +1146,7 @@ async function getTestResponse({ waitUntil: async (promise: Promise) => { spies.waitUntil.push(promise); }, - caches: options.caches ?? { - open(cacheName) { - const cache = createMemoryCache(); - spies.caches[cacheName] = cache; - return Promise.resolve(cache); - }, - ...spies.caches, - }, + caches: options.caches ?? caches, }); return { response, spies }; diff --git a/packages/pages-shared/environment-polyfills/html-rewriter.ts b/packages/pages-shared/environment-polyfills/html-rewriter.ts new file mode 100644 index 000000000000..b6e78f7960a1 --- /dev/null +++ b/packages/pages-shared/environment-polyfills/html-rewriter.ts @@ -0,0 +1,85 @@ +import { TransformStream } from "stream/web"; +import { Response } from "miniflare"; +import type { + HTMLRewriter as BaseHTMLRewriter, + DocumentHandlers, + ElementHandlers, +} from "html-rewriter-wasm"; +import type { ReadableStream } from "stream/web"; + +// Vendored from Miniflare v2: https://github.com/cloudflare/miniflare/blob/master/packages/html-rewriter/src/rewriter.ts + +type SelectorElementHandlers = [selector: string, handlers: ElementHandlers]; + +export class HTMLRewriter { + readonly #elementHandlers: SelectorElementHandlers[] = []; + readonly #documentHandlers: DocumentHandlers[] = []; + + on(selector: string, handlers: ElementHandlers): this { + this.#elementHandlers.push([selector, handlers]); + return this; + } + + onDocument(handlers: DocumentHandlers): this { + this.#documentHandlers.push(handlers); + return this; + } + + transform(response: Response): Response { + const body = response.body as ReadableStream | null; + // HTMLRewriter doesn't run the end handler if the body is null, so it's + // pointless to setup the transform stream. + if (body === null) { + return new Response(body, response); + } + + // Make sure we validate chunks are BufferSources and convert them to + // Uint8Arrays as required by the Rust glue code. + response = new Response(response.body, response); + + let rewriter: BaseHTMLRewriter; + const transformStream = new TransformStream({ + start: async (controller) => { + // Create a rewriter instance for this transformation that writes its + // output to the transformed response's stream. Note that each + // BaseHTMLRewriter can only be used once. Importing html-rewriter-wasm + // will also synchronously compile a WebAssembly module, so delay doing + // this until we really need it. + // TODO: async compile the WebAssembly module + const { + HTMLRewriter: BaseHTMLRewriter, + // eslint-disable-next-line @typescript-eslint/consistent-type-imports + }: typeof import("html-rewriter-wasm") = await import( + "html-rewriter-wasm" + ); + rewriter = new BaseHTMLRewriter((output) => { + // enqueue will throw on empty chunks + if (output.length !== 0) { + controller.enqueue(output); + } + }); + // Add all registered handlers + for (const [selector, handlers] of this.#elementHandlers) { + rewriter.on(selector, handlers); + } + for (const handlers of this.#documentHandlers) { + rewriter.onDocument(handlers); + } + }, + // The finally() below will ensure the rewriter is always freed. + // chunk is guaranteed to be a Uint8Array as we're using the + // @miniflare/core Response class, which transforms to a byte stream. + transform: (chunk) => rewriter.write(chunk), + flush: () => rewriter.end(), + }); + const promise = body.pipeTo(transformStream.writable); + promise.catch(() => {}).finally(() => rewriter.free()); + + // Return a response with the transformed body, copying over headers, etc + const res = new Response(transformStream.readable, response); + // If Content-Length is set, it's probably going to be wrong, since we're + // rewriting content, so remove it + res.headers.delete("Content-Length"); + return res; + } +} diff --git a/packages/pages-shared/environment-polyfills/miniflare.ts b/packages/pages-shared/environment-polyfills/miniflare.ts index 3aad1df379b8..b35e4a44a73d 100644 --- a/packages/pages-shared/environment-polyfills/miniflare.ts +++ b/packages/pages-shared/environment-polyfills/miniflare.ts @@ -1,7 +1,7 @@ import { polyfill } from "."; export default async () => { - const { HTMLRewriter } = await import("@miniflare/html-rewriter"); + const { HTMLRewriter } = await import("./html-rewriter"); const mf = await import("miniflare"); polyfill({ fetch: mf.fetch, diff --git a/packages/pages-shared/package.json b/packages/pages-shared/package.json index ed828b9a96cc..78b0dc54a2bb 100644 --- a/packages/pages-shared/package.json +++ b/packages/pages-shared/package.json @@ -22,15 +22,13 @@ "miniflare": "workspace:*" }, "devDependencies": { + "@cloudflare/vitest-pool-workers": "0.7.0", "@cloudflare/workers-tsconfig": "workspace:*", "@cloudflare/workers-types": "^4.20250214.0", - "@miniflare/cache": "^2.14.4", - "@miniflare/core": "^2.14.4", - "@miniflare/html-rewriter": "^2.14.4", - "@miniflare/storage-memory": "^2.14.4", "concurrently": "^8.2.2", "glob": "^10.4.5", - "vitest": "~2.1.0" + "html-rewriter-wasm": "^0.4.1", + "vitest": "catalog:default" }, "volta": { "extends": "../../package.json" diff --git a/packages/pages-shared/vite.setup.ts b/packages/pages-shared/vite.setup.ts deleted file mode 100644 index 42a9d4e98941..000000000000 --- a/packages/pages-shared/vite.setup.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { fetch, Headers, Request, Response } from "@miniflare/core"; -import { HTMLRewriter } from "@miniflare/html-rewriter"; -import { polyfill } from "./environment-polyfills"; - -polyfill({ - fetch, - Headers, - Request, - Response, - HTMLRewriter, -}); diff --git a/packages/pages-shared/vitest.config.mts b/packages/pages-shared/vitest.config.mts index 219f797390da..0661d7382795 100644 --- a/packages/pages-shared/vitest.config.mts +++ b/packages/pages-shared/vitest.config.mts @@ -1,12 +1,15 @@ -import { defineProject, mergeConfig } from "vitest/config"; -import configShared from "../../vitest.shared"; +import { defineWorkersProject } from "@cloudflare/vitest-pool-workers/config"; -export default mergeConfig( - configShared, - defineProject({ - test: { - include: ["**/__tests__/**/*.{test,spec}.{ts,js,tsx,jsx}"], - setupFiles: "./vite.setup.ts", +export default defineWorkersProject({ + test: { + poolOptions: { + workers: { + isolatedStorage: false, + singleWorker: true, + miniflare: { + compatibilityDate: "2025-01-01", + }, + }, }, - }) -); + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4fdcaa34fedb..a815a1491464 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1585,33 +1585,27 @@ importers: specifier: workspace:* version: link:../miniflare devDependencies: + '@cloudflare/vitest-pool-workers': + specifier: 0.7.0 + version: 0.7.0(@cloudflare/workers-types@4.20250214.0)(@vitest/runner@3.0.5)(@vitest/snapshot@3.0.5)(vitest@3.0.5) '@cloudflare/workers-tsconfig': specifier: workspace:* version: link:../workers-tsconfig '@cloudflare/workers-types': specifier: ^4.20250214.0 version: 4.20250214.0 - '@miniflare/cache': - specifier: ^2.14.4 - version: 2.14.4 - '@miniflare/core': - specifier: ^2.14.4 - version: 2.14.4 - '@miniflare/html-rewriter': - specifier: ^2.14.4 - version: 2.14.4 - '@miniflare/storage-memory': - specifier: ^2.14.4 - version: 2.14.4 concurrently: specifier: ^8.2.2 version: 8.2.2 glob: specifier: ^10.4.5 version: 10.4.5 + html-rewriter-wasm: + specifier: ^0.4.1 + version: 0.4.1 vitest: - specifier: ~2.1.0 - version: 2.1.9(@types/node@18.19.76)(@vitest/ui@2.1.9) + specifier: catalog:default + version: 3.0.5(@types/node@18.19.76)(@vitest/ui@3.0.5)(jiti@2.4.2)(msw@2.4.3(typescript@5.7.3))(supports-color@9.2.2) packages/playground-preview-worker: dependencies: @@ -3597,6 +3591,13 @@ packages: '@vitest/snapshot': 2.0.x - 2.1.x vitest: 2.0.x - 2.1.x + '@cloudflare/vitest-pool-workers@0.7.0': + resolution: {integrity: sha512-FVsqeyj5/GeIRmg79PJakg+Yz8fjsmjzDd/BmELNVQiL0ynMzvX8+dg6aL/l8BF9+cupjs8UkQyppbmyyHGHKw==} + peerDependencies: + '@vitest/runner': 2.0.x - 3.0.x + '@vitest/snapshot': 2.0.x - 3.0.x + vitest: 2.0.x - 3.0.x + '@cloudflare/workerd-darwin-64@1.20241230.0': resolution: {integrity: sha512-BZHLg4bbhNQoaY1Uan81O3FV/zcmWueC55juhnaI7NAobiQth9RppadPNpxNAmS9fK2mR5z8xrwMQSQrHmztyQ==} engines: {node: '>=16'} @@ -4522,9 +4523,6 @@ packages: '@vue/compiler-sfc': optional: true - '@iarna/toml@2.2.5': - resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - '@iarna/toml@3.0.0': resolution: {integrity: sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==} @@ -4743,34 +4741,6 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@miniflare/cache@2.14.4': - resolution: {integrity: sha512-ayzdjhcj+4mjydbNK7ZGDpIXNliDbQY4GPcY2KrYw0v1OSUdj5kZUkygD09fqoGRfAks0d91VelkyRsAXX8FQA==} - engines: {node: '>=16.13'} - - '@miniflare/core@2.14.4': - resolution: {integrity: sha512-FMmZcC1f54YpF4pDWPtdQPIO8NXfgUxCoR9uyrhxKJdZu7M6n8QKopPVNuaxR40jcsdxb7yKoQoFWnHfzJD9GQ==} - engines: {node: '>=16.13'} - - '@miniflare/html-rewriter@2.14.4': - resolution: {integrity: sha512-GB/vZn7oLbnhw+815SGF+HU5EZqSxbhIa3mu2L5MzZ2q5VOD5NHC833qG8c2GzDPhIaZ99ITY+ZJmbR4d+4aNQ==} - engines: {node: '>=16.13'} - - '@miniflare/queues@2.14.4': - resolution: {integrity: sha512-aXQ5Ik8Iq1KGMBzGenmd6Js/jJgqyYvjom95/N9GptCGpiVWE5F0XqC1SL5rCwURbHN+aWY191o8XOFyY2nCUA==} - engines: {node: '>=16.7'} - - '@miniflare/shared@2.14.4': - resolution: {integrity: sha512-upl4RSB3hyCnITOFmRZjJj4A72GmkVrtfZTilkdq5Qe5TTlzsjVeDJp7AuNUM9bM8vswRo+N5jOiot6O4PVwwQ==} - engines: {node: '>=16.13'} - - '@miniflare/storage-memory@2.14.4': - resolution: {integrity: sha512-9jB5BqNkMZ3SFjbPFeiVkLi1BuSahMhc/W1Y9H0W89qFDrrD+z7EgRgDtHTG1ZRyi9gIlNtt9qhkO1B6W2qb2A==} - engines: {node: '>=16.13'} - - '@miniflare/watcher@2.14.4': - resolution: {integrity: sha512-PYn05ET2USfBAeXF6NZfWl0O32KVyE8ncQ/ngysrh3hoIV7l3qGGH7ubeFx+D8VWQ682qYhwGygUzQv2j1tGGg==} - engines: {node: '>=16.13'} - '@mswjs/interceptors@0.29.1': resolution: {integrity: sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==} engines: {node: '>=18'} @@ -5751,9 +5721,6 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/better-sqlite3@7.6.8': - resolution: {integrity: sha512-ASndM4rdGrzk7iXXqyNC4fbwt4UEjpK0i3j4q4FyeQrLAthfB6s7EF135ZJE0qQxtKIMFwmyT6x0switET7uIw==} - '@types/command-exists@1.2.0': resolution: {integrity: sha512-ugsxEJfsCuqMLSuCD4PIJkp5Uk2z6TCMRCgYVuhRo5cYQY3+1xXTQkSlPtkpGHuvWMjS2KTeVQXxkXRACMbM6A==} @@ -6333,10 +6300,6 @@ packages: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -6681,9 +6644,6 @@ packages: resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} engines: {node: '>=0.2.0'} - builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} @@ -7355,10 +7315,6 @@ packages: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} - dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - dotenv@16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} @@ -8993,6 +8949,11 @@ packages: engines: {node: '>=16.13'} hasBin: true + miniflare@3.20250214.0: + resolution: {integrity: sha512-XKwn+X/V2CEpbRhoeaIcJHpV/Duz5Md5rxVT8I6S1oqd3aLZkn8cUX1tuxHpUvfQSPuXwWH+2ESLNnTf9PKEWg==} + engines: {node: '>=16.13'} + hasBin: true + minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} @@ -9228,9 +9189,6 @@ packages: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. - npx-import@1.1.4: - resolution: {integrity: sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -9412,9 +9370,6 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} - parse-package-name@1.0.0: - resolution: {integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==} - parse-semver@1.1.1: resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} @@ -11125,10 +11080,6 @@ packages: undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} - undici@5.28.5: resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==} engines: {node: '>=14.0'} @@ -11204,9 +11155,6 @@ packages: urlpattern-polyfill@10.0.0: resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} - urlpattern-polyfill@4.0.3: - resolution: {integrity: sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==} - use-sync-external-store@1.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -11230,10 +11178,6 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - validate-npm-package-name@4.0.0: - resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -11549,6 +11493,16 @@ packages: '@cloudflare/workers-types': optional: true + wrangler@3.109.2: + resolution: {integrity: sha512-CT8izugPBth5o1o4gLNcQrDkHKSX2Jthy6gkyhaWiy2pFrx+536NMn/atWilLA1t1uhIgddEI5BXDNudIkPPHA==} + engines: {node: '>=16.17.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20250214.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -11674,9 +11628,6 @@ packages: youch@3.2.3: resolution: {integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==} - youch@3.3.4: - resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} - zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} @@ -12892,6 +12843,24 @@ snapshots: - supports-color - utf-8-validate + '@cloudflare/vitest-pool-workers@0.7.0(@cloudflare/workers-types@4.20250214.0)(@vitest/runner@3.0.5)(@vitest/snapshot@3.0.5)(vitest@3.0.5)': + dependencies: + '@vitest/runner': 3.0.5 + '@vitest/snapshot': 3.0.5 + birpc: 0.2.14 + cjs-module-lexer: 1.2.3 + devalue: 4.3.2 + esbuild: 0.17.19 + miniflare: 3.20250214.0 + semver: 7.7.1 + vitest: 3.0.5(@types/node@18.19.76)(@vitest/ui@3.0.5)(jiti@2.4.2)(msw@2.4.3(typescript@5.7.3))(supports-color@9.2.2) + wrangler: 3.109.2(@cloudflare/workers-types@4.20250214.0) + zod: 3.22.3 + transitivePeerDependencies: + - '@cloudflare/workers-types' + - bufferutil + - utf-8-validate + '@cloudflare/workerd-darwin-64@1.20241230.0': optional: true @@ -13442,8 +13411,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@iarna/toml@2.2.5': {} - '@iarna/toml@3.0.0': {} '@img/sharp-darwin-arm64@0.33.5': @@ -13733,52 +13700,6 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@miniflare/cache@2.14.4': - dependencies: - '@miniflare/core': 2.14.4 - '@miniflare/shared': 2.14.4 - http-cache-semantics: 4.1.1 - undici: 5.28.4 - - '@miniflare/core@2.14.4': - dependencies: - '@iarna/toml': 2.2.5 - '@miniflare/queues': 2.14.4 - '@miniflare/shared': 2.14.4 - '@miniflare/watcher': 2.14.4 - busboy: 1.6.0 - dotenv: 10.0.0 - kleur: 4.1.5 - set-cookie-parser: 2.6.0 - undici: 5.28.4 - urlpattern-polyfill: 4.0.3 - - '@miniflare/html-rewriter@2.14.4': - dependencies: - '@miniflare/core': 2.14.4 - '@miniflare/shared': 2.14.4 - html-rewriter-wasm: 0.4.1 - undici: 5.28.4 - - '@miniflare/queues@2.14.4': - dependencies: - '@miniflare/shared': 2.14.4 - - '@miniflare/shared@2.14.4': - dependencies: - '@types/better-sqlite3': 7.6.8 - kleur: 4.1.5 - npx-import: 1.1.4 - picomatch: 2.3.1 - - '@miniflare/storage-memory@2.14.4': - dependencies: - '@miniflare/shared': 2.14.4 - - '@miniflare/watcher@2.14.4': - dependencies: - '@miniflare/shared': 2.14.4 - '@mswjs/interceptors@0.29.1': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -14915,10 +14836,6 @@ snapshots: dependencies: '@babel/types': 7.26.3 - '@types/better-sqlite3@7.6.8': - dependencies: - '@types/node': 18.19.76 - '@types/command-exists@1.2.0': {} '@types/cookie@0.6.0': {} @@ -15726,10 +15643,6 @@ snapshots: acorn-walk@8.3.2: {} - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.0 - acorn@8.14.0: {} agent-base@6.0.2(supports-color@9.2.2): @@ -16144,10 +16057,6 @@ snapshots: buffers@0.1.1: {} - builtins@5.0.1: - dependencies: - semver: 7.7.1 - bundle-name@3.0.0: dependencies: run-applescript: 5.0.0 @@ -16817,8 +16726,6 @@ snapshots: dotenv-expand@10.0.0: {} - dotenv@10.0.0: {} - dotenv@16.0.3: {} dotenv@16.3.1: {} @@ -18325,7 +18232,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.3 + semver: 7.7.1 jsprim@2.0.2: dependencies: @@ -18625,7 +18532,7 @@ snapshots: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 - acorn-walk: 8.3.4 + acorn-walk: 8.3.2 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 @@ -18633,7 +18540,7 @@ snapshots: undici: 5.28.5 workerd: 1.20241230.0 ws: 8.18.0 - youch: 3.3.4 + youch: 3.2.3 zod: 3.22.3 transitivePeerDependencies: - bufferutil @@ -18657,6 +18564,23 @@ snapshots: - bufferutil - utf-8-validate + miniflare@3.20250214.0: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.14.0 + acorn-walk: 8.3.2 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.28.5 + workerd: 1.20250214.0 + ws: 8.18.0 + youch: 3.2.3 + zod: 3.22.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + minimatch@3.0.8: dependencies: brace-expansion: 1.1.11 @@ -18887,13 +18811,6 @@ snapshots: gauge: 3.0.2 set-blocking: 2.0.0 - npx-import@1.1.4: - dependencies: - execa: 6.1.0 - parse-package-name: 1.0.0 - semver: 7.7.1 - validate-npm-package-name: 4.0.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -19078,8 +18995,6 @@ snapshots: parse-ms@4.0.0: {} - parse-package-name@1.0.0: {} - parse-semver@1.1.1: dependencies: semver: 5.7.2 @@ -20896,10 +20811,6 @@ snapshots: undici-types@6.20.0: {} - undici@5.28.4: - dependencies: - '@fastify/busboy': 2.1.1 - undici@5.28.5: dependencies: '@fastify/busboy': 2.1.1 @@ -20982,8 +20893,6 @@ snapshots: urlpattern-polyfill@10.0.0: {} - urlpattern-polyfill@4.0.3: {} - use-sync-external-store@1.2.0(react@18.3.1): dependencies: react: 18.3.1 @@ -21004,10 +20913,6 @@ snapshots: uuid@9.0.1: {} - validate-npm-package-name@4.0.0: - dependencies: - builtins: 5.0.1 - validate-npm-package-name@5.0.1: {} validator@13.12.0: {} @@ -21459,6 +21364,25 @@ snapshots: - bufferutil - utf-8-validate + wrangler@3.109.2(@cloudflare/workers-types@4.20250214.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.3.4 + '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) + '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) + blake3-wasm: 2.1.5 + esbuild: 0.17.19 + miniflare: 3.20250214.0 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.1 + workerd: 1.20250214.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20250214.0 + fsevents: 2.3.3 + sharp: 0.33.5 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -21584,12 +21508,6 @@ snapshots: mustache: 4.2.0 stacktracey: 2.1.8 - youch@3.3.4: - dependencies: - cookie: 0.7.2 - mustache: 4.2.0 - stacktracey: 2.1.8 - zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2