diff --git a/.changeset/smart-owls-trade.md b/.changeset/smart-owls-trade.md new file mode 100644 index 000000000000..576b467b6134 --- /dev/null +++ b/.changeset/smart-owls-trade.md @@ -0,0 +1,53 @@ +--- +'@sveltejs/adapter-cloudflare-workers': major +--- + +feat: use the new Workers Static Assets feature from Cloudflare + +This changes the adapter to stop using the old Workers Sites (kv-asset-handler) approach. +Instead, making use of the new Workers Static Assets feature, which is embedded into Cloudflare natively. + +Also this change removes the extra esbuild step that was being run inside the adapter, relying upon Wrangler to do the bundling. +The extra esbuild step required a hardcoded list of Node.js compatible modules. +This is no longer needed since Wrangler now manages all of that. + +## Breaking changes and migration + +- This version of the adapter requires Wrangler version 3.87.0 or later. + + Run `npm add -D wrangler@latest` (or similar) in your project to update Wrangler. +- The user's Wrangler configuration (`wrangler.toml`) must be migrated from using Workers Sites to using Workers Assets. + + Previously a user's `wrangler.toml` might look like: + + ```toml + name = "" + account_id = "" + compatibility_date = "2021-11-12" + main = "./.cloudflare/worker.js" + + # Workers Sites configuration + site.bucket = "./.cloudflare/public" + ``` + + Change it to to look like: + + ```toml + name = "" + account_id = "" + compatibility_date = "2021-11-12"` + main = ".svelte-kit/cloudflare/server/index.js" + + # Workers Assets configuration + assets = { directory = ".svelte-kit/cloudflare/client" } + ``` + +- Workers Assets defaults to serving assets directly for a matching request, rather than routing it through the Worker code. + + The previous adapter would add custom headers to assets responses (such as `cache-control`, `content-type`, and `x-robots-tag`. Such direct asset responses no longer contain these headers - but the will include eTag headers that have proven (in Pages) to be an effective caching strategy for assets. + + If you wish to always run the Worker before every request then add `serve_directly = false` to the assets configuration section. For example: + + ```toml + assets = { directory = ".svelte-kit/cloudflare/client", serve_directly = false } + ``` diff --git a/packages/adapter-cloudflare-workers/README.md b/packages/adapter-cloudflare-workers/README.md index a3805020a4aa..ecf995809db8 100644 --- a/packages/adapter-cloudflare-workers/README.md +++ b/packages/adapter-cloudflare-workers/README.md @@ -2,7 +2,7 @@ SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering. -**Requires [Wrangler v2](https://developers.cloudflare.com/workers/wrangler/get-started/).** Wrangler v1 is no longer supported. +**Requires [Wrangler v3 or later](https://developers.cloudflare.com/workers/wrangler/get-started/).**. ## Docs diff --git a/packages/adapter-cloudflare-workers/files/_package.json b/packages/adapter-cloudflare-workers/files/_package.json deleted file mode 100644 index bc4c8d4aabac..000000000000 --- a/packages/adapter-cloudflare-workers/files/_package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "private": true, - "version": "0.0.1", - "description": "Worker site generated by SvelteKit", - "main": "index.js", - "dependencies": { - "@cloudflare/kv-asset-handler": "~0.1.3" - } -} diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js index 5f022e5096b9..997eee746884 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -1,8 +1,5 @@ import { Server } from 'SERVER'; import { manifest, prerendered, base_path } from 'MANIFEST'; -import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler'; -import static_asset_manifest_json from '__STATIC_CONTENT_MANIFEST'; -const static_asset_manifest = JSON.parse(static_asset_manifest_json); const server = new Server(manifest); @@ -25,7 +22,7 @@ export default { // static assets if (url.pathname.startsWith(app_path)) { /** @type {Response} */ - const res = await get_asset_from_kv(req, env, context); + const res = await env.ASSETS.fetch(req); if (is_error(res.status)) return res; const cache_control = url.pathname.startsWith(immutable) @@ -65,20 +62,11 @@ export default { let location = pathname.at(-1) === '/' ? stripped_pathname : pathname + '/'; - if ( - is_static_asset || - prerendered.has(pathname) || - pathname === version_file || - pathname.startsWith(immutable) - ) { - return get_asset_from_kv(req, env, context, (request, options) => { - if (prerendered.has(pathname)) { - url.pathname = '/' + prerendered.get(pathname).file; - return new Request(url.toString(), request); - } - - return mapRequestToAsset(request, options); - }); + if (prerendered.has(pathname)) { + url.pathname = '/' + prerendered.get(pathname).file; + return env.ASSETS.fetch(new Request(url.toString(), req)); + } else if (is_static_asset || pathname === version_file || pathname.startsWith(immutable)) { + return env.ASSETS.fetch(req); } else if (location && prerendered.has(location)) { if (search) location += search; return new Response('', { @@ -106,27 +94,6 @@ export default { } }; -/** - * @param {Request} req - * @param {any} env - * @param {any} context - */ -async function get_asset_from_kv(req, env, context, map = mapRequestToAsset) { - return await getAssetFromKV( - { - request: req, - waitUntil(promise) { - return context.waitUntil(promise); - } - }, - { - ASSET_NAMESPACE: env.__STATIC_CONTENT, - ASSET_MANIFEST: static_asset_manifest, - mapRequestToAsset: map - } - ); -} - /** * @param {number} status * @returns {boolean} diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index be1d98245cbd..ab98000a9fb1 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -1,7 +1,5 @@ import { existsSync, readFileSync, writeFileSync } from 'node:fs'; import { posix, dirname } from 'node:path'; -import { execSync } from 'node:child_process'; -import esbuild from 'esbuild'; import toml from '@iarna/toml'; import { fileURLToPath } from 'node:url'; import { getPlatformProxy } from 'wrangler'; @@ -9,144 +7,58 @@ import { getPlatformProxy } from 'wrangler'; /** * @typedef {{ * main: string; - * site: { - * bucket: string; + * assets: { + * directory: string; + * binding: string; * } - * compatibility_flags?: string[]; * }} WranglerConfig */ -// list from https://developers.cloudflare.com/workers/runtime-apis/nodejs/ -const compatible_node_modules = [ - 'assert', - 'async_hooks', - 'buffer', - 'crypto', - 'diagnostics_channel', - 'events', - 'path', - 'process', - 'stream', - 'string_decoder', - 'util' -]; - /** @type {import('./index.js').default} */ export default function ({ config = 'wrangler.toml', platformProxy = {} } = {}) { return { name: '@sveltejs/adapter-cloudflare-workers', - async adapt(builder) { - const { main, site, compatibility_flags } = validate_config(builder, config); - + adapt(builder) { + const { main, assets } = validate_config(builder, config); const files = fileURLToPath(new URL('./files', import.meta.url).href); - const tmp = builder.getBuildDirectory('cloudflare-workers-tmp'); - - builder.rimraf(site.bucket); - builder.rimraf(dirname(main)); - - builder.log.info('Installing worker dependencies...'); - builder.copy(`${files}/_package.json`, `${tmp}/package.json`); - - // TODO would be cool if we could make this step unnecessary somehow - const stdout = execSync('npm install', { cwd: tmp }); - builder.log.info(stdout.toString()); + const outDir = dirname(main); + const relativePath = posix.relative(outDir, builder.getServerDirectory()); builder.log.minor('Generating worker...'); - const relativePath = posix.relative(tmp, builder.getServerDirectory()); - builder.copy(`${files}/entry.js`, `${tmp}/entry.js`, { + // Clear out old files + builder.rimraf(assets.directory); + builder.rimraf(outDir); + + // Create the entry-point for the Worker + builder.copy(`${files}/entry.js`, main, { replace: { SERVER: `${relativePath}/index.js`, - MANIFEST: './manifest.js' + MANIFEST: './manifest.js', + ASSETS: assets.binding || 'ASSETS' } }); + // Create the manifest for the Worker let prerendered_entries = Array.from(builder.prerendered.pages.entries()); - if (builder.config.kit.paths.base) { prerendered_entries = prerendered_entries.map(([path, { file }]) => [ path, { file: `${builder.config.kit.paths.base}/${file}` } ]); } - writeFileSync( - `${tmp}/manifest.js`, + `${outDir}/manifest.js`, `export const manifest = ${builder.generateManifest({ relativePath })};\n\n` + `export const prerendered = new Map(${JSON.stringify(prerendered_entries)});\n\n` + `export const base_path = ${JSON.stringify(builder.config.kit.paths.base)};\n` ); - const external = ['__STATIC_CONTENT_MANIFEST', 'cloudflare:*']; - if (compatibility_flags && compatibility_flags.includes('nodejs_compat')) { - external.push(...compatible_node_modules.map((id) => `node:${id}`)); - } - - try { - const result = await esbuild.build({ - platform: 'browser', - // https://github.com/cloudflare/workers-sdk/blob/a12b2786ce745f24475174bcec994ad691e65b0f/packages/wrangler/src/deployment-bundle/bundle.ts#L35-L36 - conditions: ['workerd', 'worker', 'browser'], - sourcemap: 'linked', - target: 'es2022', - entryPoints: [`${tmp}/entry.js`], - outfile: main, - bundle: true, - external, - alias: Object.fromEntries(compatible_node_modules.map((id) => [id, `node:${id}`])), - format: 'esm', - loader: { - '.wasm': 'copy', - '.woff': 'copy', - '.woff2': 'copy', - '.ttf': 'copy', - '.eot': 'copy', - '.otf': 'copy' - }, - logLevel: 'silent' - }); - - if (result.warnings.length > 0) { - const formatted = await esbuild.formatMessages(result.warnings, { - kind: 'warning', - color: true - }); - - console.error(formatted.join('\n')); - } - } catch (error) { - for (const e of error.errors) { - for (const node of e.notes) { - const match = - /The package "(.+)" wasn't found on the file system but is built into node/.exec( - node.text - ); - - if (match) { - node.text = `Cannot use "${match[1]}" when deploying to Cloudflare.`; - } - } - } - - const formatted = await esbuild.formatMessages(error.errors, { - kind: 'error', - color: true - }); - - console.error(formatted.join('\n')); - - throw new Error( - `Bundling with esbuild failed with ${error.errors.length} ${ - error.errors.length === 1 ? 'error' : 'errors' - }` - ); - } - builder.log.minor('Copying assets...'); - const bucket_dir = `${site.bucket}${builder.config.kit.paths.base}`; - builder.writeClient(bucket_dir); - builder.writePrerendered(bucket_dir); + const assets_dir = `${assets.directory}${builder.config.kit.paths.base}`; + builder.writeClient(assets_dir); + builder.writePrerendered(assets_dir); }, emulate() { @@ -214,9 +126,9 @@ function validate_config(builder, config_file) { throw err; } - if (!wrangler_config.site?.bucket) { + if (!wrangler_config.assets?.directory) { throw new Error( - `You must specify site.bucket in ${config_file}. Consult https://developers.cloudflare.com/workers/platform/sites/configuration` + `You must specify assets.directory in ${config_file}. Consult https://developers.cloudflare.com/workers/platform/sites/configuration` ); } @@ -239,14 +151,10 @@ function validate_config(builder, config_file) { name = "" account_id = "" - - main = "./.cloudflare/worker.js" - site.bucket = "./.cloudflare/public" - + main = ".svelte-kit/cloudflare/server/index.js" + assets = { directory = ".svelte-kit/cloudflare/client" } build.command = "npm run build" - - compatibility_date = "2021-11-12" - workers_dev = true` + compatibility_date = "2021-11-12"` .replace(/^\t+/gm, '') .trim() ); diff --git a/packages/adapter-cloudflare-workers/internal.d.ts b/packages/adapter-cloudflare-workers/internal.d.ts index 3877ad52f4a5..50b543eb1452 100644 --- a/packages/adapter-cloudflare-workers/internal.d.ts +++ b/packages/adapter-cloudflare-workers/internal.d.ts @@ -9,8 +9,3 @@ declare module 'MANIFEST' { export const prerendered: Map; export const base_path: string; } - -declare module '__STATIC_CONTENT_MANIFEST' { - const json: string; - export default json; -} diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index 49104f8155f8..1f94f2879f47 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -38,18 +38,17 @@ "check": "tsc --skipLibCheck" }, "dependencies": { - "@cloudflare/workers-types": "^4.20231121.0", + "@cloudflare/workers-types": "^4.20241218.0", "@iarna/toml": "^2.2.5", "esbuild": "^0.24.0" }, "devDependencies": { - "@cloudflare/kv-asset-handler": "^0.3.0", "@sveltejs/kit": "workspace:^", "@types/node": "^18.19.48", "typescript": "^5.3.3" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0", - "wrangler": "^3.28.4" + "wrangler": "^3.87.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0db7e238b763..61cdb788122f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,7 +59,7 @@ importers: dependencies: '@cloudflare/workers-types': specifier: ^4.20241106.0 - version: 4.20241205.0 + version: 4.20241224.0 esbuild: specifier: ^0.24.0 version: 0.24.2 @@ -68,7 +68,7 @@ importers: version: 0.8.0-next.18 wrangler: specifier: ^3.87.0 - version: 3.94.0(@cloudflare/workers-types@4.20241205.0) + version: 3.99.0(@cloudflare/workers-types@4.20241224.0) devDependencies: '@sveltejs/kit': specifier: workspace:^ @@ -86,8 +86,8 @@ importers: packages/adapter-cloudflare-workers: dependencies: '@cloudflare/workers-types': - specifier: ^4.20231121.0 - version: 4.20241205.0 + specifier: ^4.20241218.0 + version: 4.20241224.0 '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -95,12 +95,9 @@ importers: specifier: ^0.24.0 version: 0.24.2 wrangler: - specifier: ^3.28.4 - version: 3.94.0(@cloudflare/workers-types@4.20241205.0) + specifier: ^3.87.0 + version: 3.99.0(@cloudflare/workers-types@4.20241224.0) devDependencies: - '@cloudflare/kv-asset-handler': - specifier: ^0.3.0 - version: 0.3.4 '@sveltejs/kit': specifier: workspace:^ version: link:../kit @@ -1234,42 +1231,38 @@ packages: resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} - '@cloudflare/workerd-darwin-64@1.20241205.0': - resolution: {integrity: sha512-TArEZkSZkHJyEwnlWWkSpCI99cF6lJ14OVeEoI9Um/+cD9CKZLM9vCmsLeKglKheJ0KcdCnkA+DbeD15t3VaWg==} + '@cloudflare/workerd-darwin-64@1.20241218.0': + resolution: {integrity: sha512-8rveQoxtUvlmORKqTWgjv2ycM8uqWox0u9evn3zd2iWKdou5sncFwH517ZRLI3rq9P31ZLmCQBZ0gloFsTeY6w==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20241205.0': - resolution: {integrity: sha512-u5eqKa9QRdA8MugfgCoD+ADDjY6EpKbv3hSYJETmmUh17l7WXjWBzv4pUvOKIX67C0UzMUy4jZYwC53MymhX3w==} + '@cloudflare/workerd-darwin-arm64@1.20241218.0': + resolution: {integrity: sha512-be59Ad9nmM9lCkhHqmTs/uZ3JVZt8NJ9Z0PY+B0xnc5z6WwmV2lj0RVLtq7xJhQsQJA189zt5rXqDP6J+2mu7Q==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20241205.0': - resolution: {integrity: sha512-OYA7S5zpumMamWEW+IhhBU6YojIEocyE5X/YFPiTOCrDE3dsfr9t6oqNE7hxGm1VAAu+Irtl+a/5LwmBOU681w==} + '@cloudflare/workerd-linux-64@1.20241218.0': + resolution: {integrity: sha512-MzpSBcfZXRxrYWxQ4pVDYDrUbkQuM62ssl4ZtHH8J35OAeGsWFAYji6MkS2SpVwVcvacPwJXIF4JSzp4xKImKw==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20241205.0': - resolution: {integrity: sha512-qAzecONjFJGIAVJZKExQ5dlbic0f3d4A+GdKa+H6SoUJtPaWiE3K6WuePo4JOT7W3/Zfh25McmX+MmpMUUcM5Q==} + '@cloudflare/workerd-linux-arm64@1.20241218.0': + resolution: {integrity: sha512-RIuJjPxpNqvwIs52vQsXeRMttvhIjgg9NLjjFa3jK8Ijnj8c3ZDru9Wqi48lJP07yDFIRr4uDMMqh/y29YQi2A==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20241205.0': - resolution: {integrity: sha512-BEab+HiUgCdl6GXAT7EI2yaRtDPiRJlB94XLvRvXi1ZcmQqsrq6awGo6apctFo4WUL29V7c09LxmN4HQ3X2Tvg==} + '@cloudflare/workerd-windows-64@1.20241218.0': + resolution: {integrity: sha512-tO1VjlvK3F6Yb2d1jgEy/QBYl//9Pyv3K0j+lq8Eu7qdfm0IgKwSRgDWLept84/qmNsQfausZ4JdNGxTf9xsxQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-shared@0.11.0': - resolution: {integrity: sha512-A+lQ8xp7992qSeMmuQ0ssL6CPmm+ZmAv6Ddikan0n1jjpMAic+97l7xtVIsswSn9iLMFPYQ9uNN/8Fl0AgARIQ==} - engines: {node: '>=16.7.0'} - - '@cloudflare/workers-types@4.20241205.0': - resolution: {integrity: sha512-pj1VKRHT/ScQbHOIMFODZaNAlJHQHdBSZXNIdr9ebJzwBff9Qz8VdqhbhggV7f+aUEh8WSbrsPIo4a+WtgjUvw==} + '@cloudflare/workers-types@4.20241224.0': + resolution: {integrity: sha512-1ZmFc8qqM7S/HUGmLplc4P8n8DoMqiJmc47r9Lr7VbuaotoqCXVljz09w1V1mc4K3pbFPgvqSy4XYStZ08HrlQ==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -2281,6 +2274,10 @@ packages: engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2378,8 +2375,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -2533,8 +2530,8 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.4.0: - resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2628,8 +2625,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.14.0: - resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + globals@15.13.0: + resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} engines: {node: '>=18'} globalyzer@0.1.0: @@ -2894,8 +2891,8 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - miniflare@3.20241205.0: - resolution: {integrity: sha512-Z0cTtIf6ZrcAJ3SrOI9EUM3s4dkGhNeU6Ubl8sroYhsPVD+rtz3m5+p6McHFWCkcMff1o60X5XEKVTmkz0gbpA==} + miniflare@3.20241218.0: + resolution: {integrity: sha512-spYFDArH0wd+wJSTrzBrWrXJrbyJhRMJa35mat947y1jYhVV8I5V8vnD3LwjfpLr0SaEilojz1OIW7ekmnRe+w==} engines: {node: '>=16.13'} hasBin: true @@ -3161,8 +3158,8 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readdirp@4.0.1: - resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} regenerator-runtime@0.14.1: @@ -3622,8 +3619,8 @@ packages: engines: {node: '>=8'} hasBin: true - workerd@1.20241205.0: - resolution: {integrity: sha512-vso/2n0c5SdBDWiD+Sx5gM7unA6SiZXRVUHDqH1euoP/9mFVHZF8icoYsNLB87b/TX8zNgpae+I5N/xFpd9v0g==} + workerd@1.20241218.0: + resolution: {integrity: sha512-7Z3D4vOVChMz9mWDffE299oQxUWm/pbkeAWx1btVamPcAK/2IuoNBhwflWo3jyuKuxvYuFAdIucgYxc8ICqXiA==} engines: {node: '>=16'} hasBin: true @@ -3631,12 +3628,12 @@ packages: resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} engines: {node: '>=12'} - wrangler@3.94.0: - resolution: {integrity: sha512-4yw8FKp6SI6WQkALnRlWYjehmgliaaMroLLnymWS9qHndjqrZIPZ16trrhl1HvAEDov/rIg0jZ4nxo5n6K0a/Q==} + wrangler@3.99.0: + resolution: {integrity: sha512-k0x4rT3G/QCbxcoZY7CHRVlAIS8WMmKdga6lf4d2c3gXFqssh44vwlTDuARA9QANBxKJTcA7JPTJRfUDhd9QBA==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20241205.0 + '@cloudflare/workers-types': ^4.20241218.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -3854,27 +3851,22 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/workerd-darwin-64@1.20241205.0': + '@cloudflare/workerd-darwin-64@1.20241218.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20241205.0': + '@cloudflare/workerd-darwin-arm64@1.20241218.0': optional: true - '@cloudflare/workerd-linux-64@1.20241205.0': + '@cloudflare/workerd-linux-64@1.20241218.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20241205.0': + '@cloudflare/workerd-linux-arm64@1.20241218.0': optional: true - '@cloudflare/workerd-windows-64@1.20241205.0': + '@cloudflare/workerd-windows-64@1.20241218.0': optional: true - '@cloudflare/workers-shared@0.11.0': - dependencies: - mime: 3.0.0 - zod: 3.22.4 - - '@cloudflare/workers-types@4.20241205.0': {} + '@cloudflare/workers-types@4.20241224.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -4262,7 +4254,7 @@ snapshots: '@rollup/pluginutils': 5.1.3(rollup@4.30.1) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.0(picomatch@4.0.2) + fdir: 6.4.2(picomatch@4.0.2) is-reference: 1.2.1 magic-string: 0.30.17 picomatch: 4.0.2 @@ -4365,7 +4357,7 @@ snapshots: eslint-config-prettier: 9.1.0(eslint@9.6.0) eslint-plugin-n: 17.9.0(eslint@9.6.0) eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.2.9) - globals: 15.14.0 + globals: 15.13.0 typescript: 5.6.3 typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) @@ -4689,7 +4681,7 @@ snapshots: chokidar@4.0.1: dependencies: - readdirp: 4.0.1 + readdirp: 4.0.2 chownr@3.0.0: {} @@ -4725,7 +4717,13 @@ snapshots: cross-env@7.0.3: dependencies: - cross-spawn: 7.0.6 + cross-spawn: 7.0.3 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 cross-spawn@7.0.6: dependencies: @@ -4797,7 +4795,7 @@ snapshots: emoji-regex@9.2.2: {} - enhanced-resolve@5.18.0: + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -4883,11 +4881,11 @@ snapshots: eslint-plugin-n@17.9.0(eslint@9.6.0): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) - enhanced-resolve: 5.18.0 + enhanced-resolve: 5.17.1 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) get-tsconfig: 4.8.1 - globals: 15.14.0 + globals: 15.13.0 ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 @@ -5035,7 +5033,7 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.4.0(picomatch@4.0.2): + fdir@6.4.2(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -5068,7 +5066,7 @@ snapshots: foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.6 + cross-spawn: 7.0.3 signal-exit: 4.1.0 fs-extra@7.0.1: @@ -5134,7 +5132,7 @@ snapshots: globals@14.0.0: {} - globals@15.14.0: {} + globals@15.13.0: {} globalyzer@0.1.0: {} @@ -5357,7 +5355,7 @@ snapshots: min-indent@1.0.1: {} - miniflare@3.20241205.0: + miniflare@3.20241218.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -5367,7 +5365,7 @@ snapshots: glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.4 - workerd: 1.20241205.0 + workerd: 1.20241218.0 ws: 8.18.0 youch: 3.3.3 zod: 3.22.4 @@ -5579,7 +5577,7 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readdirp@4.0.1: {} + readdirp@4.0.2: {} regenerator-runtime@0.14.1: {} @@ -5784,7 +5782,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.1 - fdir: 6.4.0(picomatch@4.0.2) + fdir: 6.4.2(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 svelte: 5.2.9 @@ -6038,23 +6036,22 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - workerd@1.20241205.0: + workerd@1.20241218.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20241205.0 - '@cloudflare/workerd-darwin-arm64': 1.20241205.0 - '@cloudflare/workerd-linux-64': 1.20241205.0 - '@cloudflare/workerd-linux-arm64': 1.20241205.0 - '@cloudflare/workerd-windows-64': 1.20241205.0 + '@cloudflare/workerd-darwin-64': 1.20241218.0 + '@cloudflare/workerd-darwin-arm64': 1.20241218.0 + '@cloudflare/workerd-linux-64': 1.20241218.0 + '@cloudflare/workerd-linux-arm64': 1.20241218.0 + '@cloudflare/workerd-windows-64': 1.20241218.0 worktop@0.8.0-next.18: dependencies: mrmime: 2.0.0 regexparam: 3.0.0 - wrangler@3.94.0(@cloudflare/workers-types@4.20241205.0): + wrangler@3.99.0(@cloudflare/workers-types@4.20241224.0): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 - '@cloudflare/workers-shared': 0.11.0 '@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 @@ -6062,17 +6059,17 @@ snapshots: date-fns: 4.1.0 esbuild: 0.17.19 itty-time: 1.0.6 - miniflare: 3.20241205.0 + miniflare: 3.20241218.0 nanoid: 3.3.8 path-to-regexp: 6.3.0 resolve: 1.22.8 selfsigned: 2.4.1 source-map: 0.6.1 unenv: unenv-nightly@2.0.0-20241204-140205-a5d5190 - workerd: 1.20241205.0 + workerd: 1.20241218.0 xxhash-wasm: 1.0.2 optionalDependencies: - '@cloudflare/workers-types': 4.20241205.0 + '@cloudflare/workers-types': 4.20241224.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil