diff --git a/packages/vite-plugin-cloudflare/package.json b/packages/vite-plugin-cloudflare/package.json index b2e3f681..c7cd94dc 100644 --- a/packages/vite-plugin-cloudflare/package.json +++ b/packages/vite-plugin-cloudflare/package.json @@ -20,7 +20,7 @@ "dependencies": { "@hattip/adapter-node": "^0.0.48", "cjs-module-lexer": "^1.4.1", - "miniflare": "^3.20241004.0" + "miniflare": "^3.20241106.0" }, "devDependencies": { "@cloudflare/workers-shared": "^0.7.0", diff --git a/packages/vite-plugin-cloudflare/src/cloudflare-environment.ts b/packages/vite-plugin-cloudflare/src/cloudflare-environment.ts index b663a662..4efd04c5 100644 --- a/packages/vite-plugin-cloudflare/src/cloudflare-environment.ts +++ b/packages/vite-plugin-cloudflare/src/cloudflare-environment.ts @@ -1,4 +1,5 @@ import { builtinModules } from 'node:module'; +import * as path from 'node:path'; import * as vite from 'vite'; import { getNodeCompatExternals } from './node-js-compat'; import { INIT_PATH, invariant, UNKNOWN_HOST } from './shared'; @@ -123,6 +124,7 @@ const cloudflareBuiltInModules = [ export function createCloudflareEnvironmentOptions( options: WorkerOptions, + userConfig: vite.UserConfig, ): vite.EnvironmentOptions { return vite.mergeConfig( { @@ -142,13 +144,17 @@ export function createCloudflareEnvironmentOptions( createEnvironment(name, config) { return new vite.BuildEnvironment(name, config); }, + // This is a bit of a hack to make sure the user can't override the output directory at the environment level + outDir: userConfig.build?.outDir ?? 'dist', ssr: true, rollupOptions: { // Note: vite starts dev pre-bundling crawling from either optimizeDeps.entries or rollupOptions.input // so the input value here serves both as the build input as well as the starting point for // dev pre-bundling crawling (were we not to set this input field we'd have to appropriately set // optimizeDeps.entries in the dev config) - input: options.main, + input: userConfig.root + ? path.resolve(userConfig.root, options.main) + : path.resolve(options.main), external: [...cloudflareBuiltInModules, ...getNodeCompatExternals()], }, }, diff --git a/packages/vite-plugin-cloudflare/src/index.ts b/packages/vite-plugin-cloudflare/src/index.ts index bf60f2d0..c4c944f7 100644 --- a/packages/vite-plugin-cloudflare/src/index.ts +++ b/packages/vite-plugin-cloudflare/src/index.ts @@ -1,3 +1,4 @@ +import * as fs from 'node:fs'; import path from 'node:path'; import { createMiddleware } from '@hattip/adapter-node'; import { Miniflare } from 'miniflare'; @@ -7,7 +8,10 @@ import { createCloudflareEnvironmentOptions, initRunners, } from './cloudflare-environment'; -import { getMiniflareOptions } from './miniflare-options'; +import { + getDevMiniflareOptions, + getPreviewMiniflareOptions, +} from './miniflare-options'; import { getNodeCompatAliases, injectGlobalCode, @@ -30,7 +34,7 @@ export function cloudflare>( return { name: 'vite-plugin-cloudflare', - config() { + config(userConfig) { return { resolve: { alias: getNodeCompatAliases(), @@ -38,17 +42,33 @@ export function cloudflare>( appType: 'custom', builder: { async buildApp(builder) { - const environments = Object.keys(pluginConfig.workers ?? {}).map( - (name) => { - const environment = builder.environments[name]; - invariant(environment, `${name} environment not found`); - - return environment; - }, + const client = builder.environments.client; + const defaultHtmlPath = path.resolve( + builder.config.root, + 'index.html', ); + if ( + client && + (client.config.build.rollupOptions.input || + fs.existsSync(defaultHtmlPath)) + ) { + await builder.build(client); + } + + const workerEnvironments = Object.keys( + pluginConfig.workers ?? {}, + ).map((name) => { + const environment = builder.environments[name]; + invariant(environment, `${name} environment not found`); + + return environment; + }); + await Promise.all( - environments.map((environment) => builder.build(environment)), + workerEnvironments.map((environment) => + builder.build(environment), + ), ); }, }, @@ -57,7 +77,7 @@ export function cloudflare>( Object.entries(pluginConfig.workers ?? {}).map( ([name, workerOptions]) => [ name, - createCloudflareEnvironmentOptions(workerOptions), + createCloudflareEnvironmentOptions(workerOptions, userConfig), ], ), ), @@ -65,8 +85,9 @@ export function cloudflare>( }, configEnvironment(name, options) { options.build = { - outDir: path.join('dist', name), ...options.build, + // Puts all environment builds in subdirectories of the same build directory + outDir: path.join(options.build?.outDir ?? 'dist', name), }; }, configResolved(resolvedConfig) { @@ -102,7 +123,11 @@ export function cloudflare>( let error: unknown; const miniflare = new Miniflare( - getMiniflareOptions(normalizedPluginConfig, viteConfig, viteDevServer), + getDevMiniflareOptions( + normalizedPluginConfig, + viteConfig, + viteDevServer, + ), ); await initRunners(normalizedPluginConfig, miniflare, viteDevServer); @@ -114,7 +139,7 @@ export function cloudflare>( try { await miniflare.setOptions( - getMiniflareOptions( + getDevMiniflareOptions( normalizedPluginConfig, viteConfig, viteDevServer, @@ -150,6 +175,31 @@ export function cloudflare>( return; } + middleware(req, res, next); + }); + }; + }, + configurePreviewServer(vitePreviewServer) { + const miniflare = new Miniflare( + getPreviewMiniflareOptions(normalizedPluginConfig, viteConfig), + ); + + const middleware = createMiddleware( + ({ request }) => { + return miniflare.dispatchFetch(toMiniflareRequest(request), { + redirect: 'manual', + }) as any; + }, + { alwaysCallNext: false }, + ); + + return () => { + vitePreviewServer.middlewares.use((req, res, next) => { + if (!middleware) { + next(); + return; + } + middleware(req, res, next); }); }; diff --git a/packages/vite-plugin-cloudflare/src/miniflare-options.ts b/packages/vite-plugin-cloudflare/src/miniflare-options.ts index b812c7d7..f66ff419 100644 --- a/packages/vite-plugin-cloudflare/src/miniflare-options.ts +++ b/packages/vite-plugin-cloudflare/src/miniflare-options.ts @@ -121,7 +121,7 @@ const ASSET_WORKER_PATH = './assets/asset-worker.js'; const WRAPPER_PATH = '__VITE_WORKER_ENTRY__'; const RUNNER_PATH = './runner/index.js'; -export function getMiniflareOptions( +export function getDevMiniflareOptions( normalizedPluginConfig: NormalizedPluginConfig, viteConfig: vite.ResolvedConfig, viteDevServer: vite.ViteDevServer, @@ -216,21 +216,19 @@ export function getMiniflareOptions( const userWorkers = Object.values(normalizedPluginConfig.workers).map( (worker) => { - const { ratelimits, ...workerOptions } = worker.workerOptions; - return { - ...workerOptions, - name: worker.name, + ...worker.workerOptions, modulesRoot: miniflareModulesRoot, unsafeEvalBinding: '__VITE_UNSAFE_EVAL__', bindings: { - ...workerOptions.bindings, + ...worker.workerOptions.bindings, __VITE_ROOT__: viteConfig.root, __VITE_ENTRY_PATH__: worker.entryPath, }, serviceBindings: { - ...workerOptions.serviceBindings, - ...(worker.assetsBinding + ...worker.workerOptions.serviceBindings, + ...(worker.workerOptions.name === + normalizedPluginConfig.entryWorkerName && worker.assetsBinding ? { [worker.assetsBinding]: ASSET_WORKER_NAME } : {}), }, @@ -361,6 +359,111 @@ export function getMiniflareOptions( }; } +export function getPreviewMiniflareOptions( + normalizedPluginConfig: NormalizedPluginConfig, + viteConfig: vite.ResolvedConfig, +): MiniflareOptions { + const entryWorkerConfig = normalizedPluginConfig.entryWorkerName + ? normalizedPluginConfig.workers[normalizedPluginConfig.entryWorkerName] + : undefined; + + const assetsDirectory = path.resolve( + viteConfig.root, + viteConfig.build.outDir, + 'client', + ); + const hasAssets = fs.existsSync(assetsDirectory); + const assetsOptions = hasAssets + ? { + assets: { + routingConfig: { + has_user_worker: entryWorkerConfig ? true : false, + }, + assetConfig: { + ...(normalizedPluginConfig.assets.htmlHandling + ? { html_handling: normalizedPluginConfig.assets.htmlHandling } + : {}), + ...(normalizedPluginConfig.assets.notFoundHandling + ? { + not_found_handling: + normalizedPluginConfig.assets.notFoundHandling, + } + : {}), + }, + directory: assetsDirectory, + ...(entryWorkerConfig?.assetsBinding + ? { binding: entryWorkerConfig.assetsBinding } + : {}), + }, + } + : {}; + + const workers: Array = [ + ...(entryWorkerConfig + ? [ + { + ...entryWorkerConfig.workerOptions, + ...assetsOptions, + modules: [ + { + type: 'ESModule', + path: path.resolve( + viteConfig.root, + viteConfig.build.outDir, + entryWorkerConfig.workerOptions.name, + 'index.js', + ), + } as const, + ], + }, + ] + : [ + { + ...assetsOptions, + name: 'assets-only', + script: '', + modules: true, + }, + ]), + ...Object.values(normalizedPluginConfig.workers) + .filter( + (config) => + config.workerOptions.name !== normalizedPluginConfig.entryWorkerName, + ) + .map((config) => { + return { + ...config.workerOptions, + modules: [ + { + type: 'ESModule', + path: path.resolve( + viteConfig.root, + viteConfig.build.outDir, + config.workerOptions.name, + 'index.js', + ), + } as const, + ], + }; + }), + ]; + + const logger = new ViteMiniflareLogger(viteConfig); + + return { + log: logger, + handleRuntimeStdio(stdout, stderr) { + const decoder = new TextDecoder(); + stdout.forEach((data) => logger.info(decoder.decode(data))); + stderr.forEach((error) => + logger.logWithLevel(LogLevel.ERROR, decoder.decode(error)), + ); + }, + ...getPersistence(normalizedPluginConfig.persistPath), + workers, + }; +} + /** * A Miniflare logger that forwards messages onto a Vite logger. */ diff --git a/packages/vite-plugin-cloudflare/src/plugin-config.ts b/packages/vite-plugin-cloudflare/src/plugin-config.ts index fe18ed83..cb614fe8 100644 --- a/packages/vite-plugin-cloudflare/src/plugin-config.ts +++ b/packages/vite-plugin-cloudflare/src/plugin-config.ts @@ -29,11 +29,10 @@ export interface NormalizedPluginConfig { workers: Record< string, { - name: string; entryPath: string; wranglerConfigPath: string; assetsBinding?: string; - workerOptions: SourcelessWorkerOptions; + workerOptions: SourcelessWorkerOptions & { name: string }; } >; entryWorkerName?: string; @@ -64,17 +63,19 @@ export function normalizePluginConfig( wranglerConfigPaths.add(wranglerConfigPath); - const { workerOptions } = + const miniflareWorkerOptions = unstable_getMiniflareWorkerOptions(wranglerConfigPath); + const { ratelimits, ...workerOptions } = + miniflareWorkerOptions.workerOptions; + return [ name, { - name, entryPath: options.main, wranglerConfigPath, assetsBinding: options.assetsBinding, - workerOptions, + workerOptions: { ...workerOptions, name }, }, ]; }), diff --git a/playground/durable-objects/__tests__/durable-objects.spec.ts b/playground/durable-objects/__tests__/durable-objects.spec.ts index 822f1cf7..1844f7c6 100644 --- a/playground/durable-objects/__tests__/durable-objects.spec.ts +++ b/playground/durable-objects/__tests__/durable-objects.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from 'vitest'; -import { getTextResponse, isBuild } from '../../__test-utils__'; +import { getTextResponse } from '../../__test-utils__'; -describe.runIf(!isBuild)('in-worker defined durable objects', async () => { +describe('in-worker defined durable objects', async () => { test('can bind and use a Durable Object defined in the worker', async () => { expect(await getTextResponse('/?name=my-do')).toEqual( "Durable Object 'my-do' count: 0", diff --git a/playground/durable-objects/package.json b/playground/durable-objects/package.json index 9e8589a1..87ca7a09 100644 --- a/playground/durable-objects/package.json +++ b/playground/durable-objects/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "vite build --app", "check:types": "tsc --build", - "dev": "vite dev" + "dev": "vite dev", + "preview": "vite preview" }, "devDependencies": { "@cloudflare/workers-types": "catalog:default", diff --git a/playground/external-durable-objects/__tests__/external-durable-object.spec.ts b/playground/external-durable-objects/__tests__/external-durable-object.spec.ts index 40cc4b74..bcb9b0db 100644 --- a/playground/external-durable-objects/__tests__/external-durable-object.spec.ts +++ b/playground/external-durable-objects/__tests__/external-durable-object.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from 'vitest'; -import { getTextResponse, isBuild } from '../../__test-utils__'; +import { getTextResponse } from '../../__test-utils__'; -describe.runIf(!isBuild)('external durable objects', async () => { +describe('external durable objects', async () => { test('can use `scriptName` to bind to a Durable Object defined in another Worker', async () => { expect(await getTextResponse('/?name=my-do')).toEqual( 'From worker-a: {"name":"my-do","count":0}', diff --git a/playground/external-durable-objects/package.json b/playground/external-durable-objects/package.json index cd4edf95..47915dd6 100644 --- a/playground/external-durable-objects/package.json +++ b/playground/external-durable-objects/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "vite build --app", "check:types": "tsc --build", - "dev": "vite dev" + "dev": "vite dev", + "preview": "vite preview" }, "devDependencies": { "@cloudflare/workers-types": "catalog:default", diff --git a/playground/module-resolution/__tests__/module-resolution.spec.ts b/playground/module-resolution/__tests__/module-resolution.spec.ts index a806c858..df393de6 100644 --- a/playground/module-resolution/__tests__/module-resolution.spec.ts +++ b/playground/module-resolution/__tests__/module-resolution.spec.ts @@ -8,6 +8,7 @@ import { viteTestUrl, } from '../../__test-utils__'; +// TODO: test build describe.runIf(!isBuild)('module resolution', async () => { afterAll(() => { const unexpectedErrors = serverLogs.errors.filter( diff --git a/playground/module-resolution/__tests__/no-prebundling/module-respolution-no-prebundling.spec.ts b/playground/module-resolution/__tests__/no-prebundling/module-respolution-no-prebundling.spec.ts index 89e2db9a..f6473ad4 100644 --- a/playground/module-resolution/__tests__/no-prebundling/module-respolution-no-prebundling.spec.ts +++ b/playground/module-resolution/__tests__/no-prebundling/module-respolution-no-prebundling.spec.ts @@ -6,6 +6,7 @@ import { viteTestUrl, } from '../../../__test-utils__'; +// TODO: test build describe.runIf(!isBuild)('module resolution without prebundling', async () => { test('importing a non-prebundled `@cloudflare-dev-module-resolution/requires/no-ext`', async () => { await page.goto(`${viteTestUrl}/require-no-ext`); diff --git a/playground/module-resolution/package.json b/playground/module-resolution/package.json index b7a9f7e1..3d53bc43 100644 --- a/playground/module-resolution/package.json +++ b/playground/module-resolution/package.json @@ -7,7 +7,9 @@ "build:no-prebundling": "vite build --app -c ./vite.config.no-prebundling.ts", "check:types": "tsc --build", "dev": "vite dev", - "dev:no-prebundling": "vite dev -c ./vite.config.no-prebundling.ts" + "dev:no-prebundling": "vite dev -c ./vite.config.no-prebundling.ts", + "preview": "vite preview", + "preview:no-prebundling": "vite preview -c ./vite.config.no-prebundling.ts" }, "devDependencies": { "@cloudflare-dev-module-resolution/imports": "file:./packages/imports", diff --git a/playground/multi-worker/__tests__/basic.spec.ts b/playground/multi-worker/__tests__/basic.spec.ts index 5cdba1a1..eef76d91 100644 --- a/playground/multi-worker/__tests__/basic.spec.ts +++ b/playground/multi-worker/__tests__/basic.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from 'vitest'; -import { getJsonResponse, isBuild } from '../../__test-utils__'; +import { getJsonResponse } from '../../__test-utils__'; -describe.runIf(!isBuild)('multi-worker basic functionality', async () => { +describe('multi-worker basic functionality', async () => { test('entry worker returns a response', async () => { const result = await getJsonResponse(); expect(result).toEqual({ name: 'Worker A' }); diff --git a/playground/multi-worker/__tests__/service-bindings.spec.ts b/playground/multi-worker/__tests__/service-bindings.spec.ts index 202ce988..c9a2c2a2 100644 --- a/playground/multi-worker/__tests__/service-bindings.spec.ts +++ b/playground/multi-worker/__tests__/service-bindings.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from 'vitest'; -import { getJsonResponse, isBuild } from '../../__test-utils__'; +import { getJsonResponse } from '../../__test-utils__'; -describe.runIf(!isBuild)('multi-worker service bindings', async () => { +describe('multi-worker service bindings', async () => { test('returns a response from another worker', async () => { const result = await getJsonResponse('/fetch'); expect(result).toEqual({ result: { name: 'Worker B' } }); diff --git a/playground/multi-worker/package.json b/playground/multi-worker/package.json index 59bb4b6b..e32fbabc 100644 --- a/playground/multi-worker/package.json +++ b/playground/multi-worker/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "vite build --app", "check:types": "tsc --build", - "dev": "vite dev" + "dev": "vite dev", + "preview": "vite preview" }, "devDependencies": { "@cloudflare/workers-types": "catalog:default", diff --git a/playground/node-compat/__tests__/worker-basic/basic.spec.ts b/playground/node-compat/__tests__/worker-basic/basic.spec.ts index 46d62a4a..b9b9482f 100644 --- a/playground/node-compat/__tests__/worker-basic/basic.spec.ts +++ b/playground/node-compat/__tests__/worker-basic/basic.spec.ts @@ -1,6 +1,7 @@ import { expect, test } from 'vitest'; import { getTextResponse, isBuild } from '../../../__test-utils__'; +// TODO: test build test.runIf(!isBuild)('basic nodejs properties', async () => { const result = await getTextResponse(); expect(result).toBe(`"OK!"`); diff --git a/playground/node-compat/__tests__/worker-cross-env/cross-env.spec.ts b/playground/node-compat/__tests__/worker-cross-env/cross-env.spec.ts index 1274c62c..974a1dff 100644 --- a/playground/node-compat/__tests__/worker-cross-env/cross-env.spec.ts +++ b/playground/node-compat/__tests__/worker-cross-env/cross-env.spec.ts @@ -1,10 +1,7 @@ import { expect, test } from 'vitest'; -import { getTextResponse, isBuild } from '../../../__test-utils__'; +import { getTextResponse } from '../../../__test-utils__'; -test.runIf(!isBuild)( - 'import unenv aliased 3rd party packages (e.g. cross-env)', - async () => { - const result = await getTextResponse(); - expect(result).toBe(`"OK!"`); - }, -); +test('import unenv aliased 3rd party packages (e.g. cross-env)', async () => { + const result = await getTextResponse(); + expect(result).toBe(`"OK!"`); +}); diff --git a/playground/node-compat/__tests__/worker-crypto/crypto.spec.ts b/playground/node-compat/__tests__/worker-crypto/crypto.spec.ts index 4041ecb7..6b183912 100644 --- a/playground/node-compat/__tests__/worker-crypto/crypto.spec.ts +++ b/playground/node-compat/__tests__/worker-crypto/crypto.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from 'vitest'; -import { getTextResponse, isBuild } from '../../../__test-utils__'; +import { getTextResponse } from '../../../__test-utils__'; -test.runIf(!isBuild)('crypto.X509Certificate is implemented', async () => { +test('crypto.X509Certificate is implemented', async () => { const result = await getTextResponse(); expect(result).toMatchInlineSnapshot(` ""OK!": -----BEGIN CERTIFICATE----- diff --git a/playground/node-compat/__tests__/worker-postgres/postgres.spec.ts b/playground/node-compat/__tests__/worker-postgres/postgres.spec.ts index b0a62986..c7b2e553 100644 --- a/playground/node-compat/__tests__/worker-postgres/postgres.spec.ts +++ b/playground/node-compat/__tests__/worker-postgres/postgres.spec.ts @@ -1,18 +1,14 @@ import { expect, test } from 'vitest'; -import { - getJsonResponse, - getTextResponse, - isBuild, -} from '../../../__test-utils__'; +import { getJsonResponse, getTextResponse } from '../../../__test-utils__'; -test.runIf(!isBuild)('should be able to create a pg Client', async () => { +test('should be able to create a pg Client', async () => { const result = await getTextResponse(); expect(result).toMatchInlineSnapshot(`"hh-pgsql-public.ebi.ac.uk"`); }); // Disabling actually querying the database in CI since we are getting this error: // > too many connections for role 'reader' -test.runIf(!isBuild && !process.env.CI)( +test.runIf(!process.env.CI)( 'should be able to use pg library to send a query', async () => { const result = await getJsonResponse('/send-query'); diff --git a/playground/node-compat/__tests__/worker-process/process.spec.ts b/playground/node-compat/__tests__/worker-process/process.spec.ts index f947490d..1db04d38 100644 --- a/playground/node-compat/__tests__/worker-process/process.spec.ts +++ b/playground/node-compat/__tests__/worker-process/process.spec.ts @@ -1,7 +1,7 @@ import { expect, test } from 'vitest'; -import { getTextResponse, isBuild } from '../../../__test-utils__'; +import { getTextResponse } from '../../../__test-utils__'; -test.runIf(!isBuild)('should support process global', async () => { +test('should support process global', async () => { const result = await getTextResponse(); expect(result).toBe(`OK!`); }); diff --git a/playground/node-compat/__tests__/worker-random/random.spec.ts b/playground/node-compat/__tests__/worker-random/random.spec.ts index 33331bb7..05007568 100644 --- a/playground/node-compat/__tests__/worker-random/random.spec.ts +++ b/playground/node-compat/__tests__/worker-random/random.spec.ts @@ -1,9 +1,9 @@ import { expect, test } from 'vitest'; -import { getJsonResponse, isBuild } from '../../../__test-utils__'; +import { getJsonResponse } from '../../../__test-utils__'; // Disabling actually querying the database in CI since we are getting this error: // > too many connections for role 'reader' -test.runIf(!isBuild && !process.env.CI)( +test.runIf(!process.env.CI)( 'should be able to call `getRandomValues()` bound to any object', async () => { const result = await getJsonResponse(); diff --git a/playground/node-compat/package.json b/playground/node-compat/package.json index cb43458c..b749d570 100644 --- a/playground/node-compat/package.json +++ b/playground/node-compat/package.json @@ -5,28 +5,34 @@ "scripts": { "basic:build": "vite build --app -c vite.config.worker-basic.ts", "basic:dev": "vite dev -c vite.config.worker-basic.ts", + "basic:preview": "vite preview -c vite.config.worker-basic.ts", "basic:test": "pnpm -w test-serve worker-basic", "basic:typegen": "cd worker-basic && wrangler types -c wrangler.toml", "build": "pnpm run basic:build && pnpm run cross-env:build && pnpm run crypto:build && pnpm run postgres:build && pnpm run process:build && pnpm run random:build", "check:types": "tsc --build", "cross-env:build": "vite build --app -c vite.config.worker-cross-env.ts", "cross-env:dev": "vite dev -c vite.config.worker-cross-env.ts", + "cross-env:preview": "vite preview -c vite.config.worker-cross-env.ts", "cross-env:test": "pnpm -w test-serve worker-cross-env", "cross-env:typegen": "cd worker-cross-env && wrangler types -c wrangler.toml", "crypto:build": "vite build --app -c vite.config.worker-crypto.ts", "crypto:dev": "vite dev -c vite.config.worker-crypto.ts", + "crypto:preview": "vite preview -c vite.config.worker-crypto.ts", "crypto:test": "pnpm -w test-serve worker-crypto", "crypto:typegen": "cd worker-crypto && wrangler types -c wrangler.toml", "postgres:build": "vite build --app -c vite.config.worker-postgres.ts", "postgres:dev": "vite dev -c vite.config.worker-postgres.ts", + "postgres:preview": "vite preview -c vite.config.worker-postgres.ts", "postgres:test": "pnpm -w test-serve worker-postgres", "postgres:typegen": "cd worker-postgres && wrangler types -c wrangler.toml", "process:build": "vite build --app -c vite.config.worker-process.ts", "process:dev": "vite dev -c vite.config.worker-process.ts", + "process:preview": "vite preview -c vite.config.worker-process.ts", "process:test": "pnpm -w test-serve worker-process", "process:typegen": "cd worker-process && wrangler types -c wrangler.toml", "random:build": "vite build --app -c vite.config.worker-random.ts", "random:dev": "vite dev -c vite.config.worker-random.ts", + "random:preview": "vite preview -c vite.config.worker-random.ts", "random:test": "pnpm -w test-serve worker-random", "random:typegen": "cd worker-random && wrangler types -c wrangler.toml" }, diff --git a/playground/react-spa/__tests__/assets.spec.ts b/playground/react-spa/__tests__/assets.spec.ts index bef653e3..dce1beaf 100644 --- a/playground/react-spa/__tests__/assets.spec.ts +++ b/playground/react-spa/__tests__/assets.spec.ts @@ -1,12 +1,12 @@ import { expect, test } from 'vitest'; -import { isBuild, page, viteTestUrl } from '../../__test-utils__'; +import { page, viteTestUrl } from '../../__test-utils__'; -test.runIf(!isBuild)('returns the correct home page', async () => { +test('returns the correct home page', async () => { const content = await page.textContent('h1'); expect(content).toBe('Vite + React'); }); -test.runIf(!isBuild)('allows updating state', async () => { +test('allows updating state', async () => { const button = page.getByRole('button', { name: 'increment' }); const contentBefore = await button.innerText(); expect(contentBefore).toBe('count is 0'); @@ -15,7 +15,7 @@ test.runIf(!isBuild)('allows updating state', async () => { expect(contentAfter).toBe('count is 1'); }); -test.runIf(!isBuild)('returns the home page for not found routes', async () => { +test('returns the home page for not found routes', async () => { await page.goto(`${viteTestUrl}/random-page`); const content = await page.textContent('h1'); expect(content).toBe('Vite + React'); diff --git a/playground/react-spa/package.json b/playground/react-spa/package.json index dfdac3b2..b0506e8d 100644 --- a/playground/react-spa/package.json +++ b/playground/react-spa/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "vite build --app", "check:types": "tsc --build", - "dev": "vite dev" + "dev": "vite dev", + "preview": "vite preview" }, "dependencies": { "react": "18.3.1", diff --git a/playground/spa-with-api/__tests__/assets.spec.ts b/playground/spa-with-api/__tests__/assets.spec.ts index dfdc311b..ea9f2f58 100644 --- a/playground/spa-with-api/__tests__/assets.spec.ts +++ b/playground/spa-with-api/__tests__/assets.spec.ts @@ -1,17 +1,20 @@ import { expect, test } from 'vitest'; -import { isBuild, page, viteTestUrl } from '../../__test-utils__'; +import { page } from '../../__test-utils__'; -test.runIf(!isBuild)('returns the correct home page', async () => { +test('returns the correct home page', async () => { const content = await page.textContent('h1'); expect(content).toBe('Vite + React'); }); -test.runIf(!isBuild)('returns the response from the API', async () => { +test('returns the response from the API', async () => { const button = page.getByRole('button', { name: 'get-name' }); const contentBefore = await button.innerText(); expect(contentBefore).toBe('Name from API is: unknown'); + const responsePromise = page.waitForResponse((response) => + response.url().endsWith('/api/'), + ); await button.click(); - await page.waitForResponse((response) => response.url().endsWith('/api/')); + await responsePromise; const contentAfter = await button.innerText(); expect(contentAfter).toBe('Name from API is: Jack'); }); diff --git a/playground/spa-with-api/package.json b/playground/spa-with-api/package.json index f0d9ec0c..a6e6f125 100644 --- a/playground/spa-with-api/package.json +++ b/playground/spa-with-api/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "vite build --app", "check:types": "tsc --build", - "dev": "vite dev" + "dev": "vite dev", + "preview": "vite preview" }, "dependencies": { "react": "18.3.1", diff --git a/playground/static-mpa/__tests__/assets.spec.ts b/playground/static-mpa/__tests__/assets.spec.ts index d3df485f..f08b2561 100644 --- a/playground/static-mpa/__tests__/assets.spec.ts +++ b/playground/static-mpa/__tests__/assets.spec.ts @@ -1,36 +1,36 @@ import { expect, test } from 'vitest'; -import { isBuild, page, viteTestUrl } from '../../__test-utils__'; +import { page, viteTestUrl } from '../../__test-utils__'; -test.runIf(!isBuild)('returns the correct home page', async () => { +test('returns the correct home page', async () => { const content = await page.textContent('h1'); expect(content).toBe('Home'); }); -test.runIf(!isBuild)('returns the correct contact page', async () => { +test('returns the correct contact page', async () => { await page.goto(`${viteTestUrl}/contact`); const content = await page.textContent('h1'); expect(content).toBe('Contact'); }); -test.runIf(!isBuild)('returns the correct about page', async () => { +test('returns the correct about page', async () => { await page.goto(`${viteTestUrl}/about`); const content = await page.textContent('h1'); expect(content).toBe('About'); }); -test.runIf(!isBuild)('returns the correct canonical URL', async () => { +test('returns the correct canonical URL', async () => { await page.goto(`${viteTestUrl}/about`); const url = page.url(); expect(url).toBe(`${viteTestUrl}/about/`); }); -test.runIf(!isBuild)('returns the correct root 404 page', async () => { +test('returns the correct root 404 page', async () => { await page.goto(`${viteTestUrl}/random-page`); const content = await page.textContent('h1'); expect(content).toBe('Root 404'); }); -test.runIf(!isBuild)('returns the correct nested 404 page', async () => { +test('returns the correct nested 404 page', async () => { await page.goto(`${viteTestUrl}/about/random-page`); const content = await page.textContent('h1'); expect(content).toBe('About 404'); diff --git a/playground/static-mpa/package.json b/playground/static-mpa/package.json index d719513a..0f3ec45a 100644 --- a/playground/static-mpa/package.json +++ b/playground/static-mpa/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "vite build --app", "check:types": "tsc --build", - "dev": "vite dev" + "dev": "vite dev", + "preview": "vite preview" }, "devDependencies": { "@cloudflare/workers-types": "catalog:default", diff --git a/playground/static-mpa/vite.config.ts b/playground/static-mpa/vite.config.ts index 3b277bc9..0c815ed2 100644 --- a/playground/static-mpa/vite.config.ts +++ b/playground/static-mpa/vite.config.ts @@ -1,7 +1,23 @@ +import * as path from 'node:path'; import { cloudflare } from '@flarelabs-net/vite-plugin-cloudflare'; import { defineConfig } from 'vite'; export default defineConfig({ + environments: { + client: { + build: { + rollupOptions: { + input: { + main: path.resolve(__dirname, 'index.html'), + contact: path.resolve(__dirname, 'contact.html'), + '404': path.resolve(__dirname, '404.html'), + about: path.resolve(__dirname, 'about/index.html'), + about404: path.resolve(__dirname, 'about/404.html'), + }, + }, + }, + }, + }, plugins: [ cloudflare({ assets: { diff --git a/playground/vitest-setup.ts b/playground/vitest-setup.ts index 87804c69..bee0a405 100644 --- a/playground/vitest-setup.ts +++ b/playground/vitest-setup.ts @@ -2,7 +2,6 @@ import fs from 'node:fs'; import path from 'node:path'; import { chromium } from 'playwright-chromium'; import { - build, createBuilder, createServer, loadConfigFromFile, @@ -269,26 +268,16 @@ export async function startDefaultServe(): Promise { }, }); const buildConfig = mergeConfig( - await loadConfig({ command: 'build', mode: 'production' }), + await loadConfig({ + command: 'build', + mode: 'production', + }), { plugins: [resolvedPlugin()], }, ); - if (buildConfig.builder) { - const builder = await createBuilder(buildConfig); - await builder.buildApp(); - } else { - const rollupOutput = await build(buildConfig); - const isWatch = !!resolvedConfig!.build.watch; - // in build watch,call startStaticServer after the build is complete - if (isWatch) { - watcher = rollupOutput as Rollup.RollupWatcher; - await notifyRebuildComplete(watcher); - } - if (buildConfig.__test__) { - buildConfig.__test__(); - } - } + const builder = await createBuilder(buildConfig); + await builder.buildApp(); // TODO: the step below spins up a vite preview server, instead of this we // want something that actually runs workers such as `startMultiWorker` @@ -303,6 +292,9 @@ export async function startDefaultServe(): Promise { // prevent preview change NODE_ENV process.env.NODE_ENV = _nodeEnv; viteTestUrl = previewServer!.resolvedUrls!.local[0]!; + if (previewServer.config.base === '/') { + viteTestUrl = viteTestUrl.replace(/\/$/, ''); + } await page.goto(viteTestUrl); } } diff --git a/playground/worker/__tests__/basic-functionality.spec.ts b/playground/worker/__tests__/basic-functionality.spec.ts index 3303bd2b..a34c5ce7 100644 --- a/playground/worker/__tests__/basic-functionality.spec.ts +++ b/playground/worker/__tests__/basic-functionality.spec.ts @@ -1,11 +1,11 @@ import { expect, test } from 'vitest'; -import { getTextResponse, isBuild, serverLogs } from '../../__test-utils__'; +import { getTextResponse, serverLogs } from '../../__test-utils__'; -test.runIf(!isBuild)('basic hello-world functionality', async () => { +test('basic hello-world functionality', async () => { expect(await getTextResponse()).toEqual('Hello World!'); }); -test.runIf(!isBuild)('basic dev logging', async () => { +test('basic dev logging', async () => { expect(serverLogs.info.join()).toContain('__console log__'); expect(serverLogs.errors.join()).toContain('__console error__'); expect(serverLogs.errors.join()).toContain('__console warn__'); diff --git a/playground/worker/package.json b/playground/worker/package.json index f7c47c39..a5d11817 100644 --- a/playground/worker/package.json +++ b/playground/worker/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "vite build --app", "check:types": "tsc --build", - "dev": "vite dev" + "dev": "vite dev", + "preview": "vite preview" }, "devDependencies": { "@cloudflare/workers-types": "catalog:default", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 001bf398..05020ea1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: default: '@cloudflare/workers-types': - specifier: ^4.20240919.0 - version: 4.20241011.0 + specifier: ^4.20241112.0 + version: 4.20241112.0 '@types/node': specifier: ^22.8.7 version: 22.9.0 @@ -22,8 +22,8 @@ catalogs: specifier: 6.0.0-beta.10 version: 6.0.0-beta.10 wrangler: - specifier: ^3.80.4 - version: 3.80.4 + specifier: ^3.87.0 + version: 3.87.0 importers: @@ -63,15 +63,15 @@ importers: specifier: ^1.4.1 version: 1.4.1 miniflare: - specifier: ^3.20241004.0 - version: 3.20241004.0 + specifier: ^3.20241106.0 + version: 3.20241106.0 devDependencies: '@cloudflare/workers-shared': specifier: ^0.7.0 version: 0.7.0 '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@types/node': specifier: catalog:default version: 22.9.0 @@ -95,7 +95,7 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground: devDependencies: @@ -110,7 +110,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare @@ -125,13 +125,13 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground/external-durable-objects: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare @@ -146,13 +146,13 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground/hot-channel: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare @@ -167,7 +167,7 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground/module-resolution: devDependencies: @@ -179,13 +179,13 @@ importers: version: '@playground/module-resolution-requires@file:playground/module-resolution/packages/requires' '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare '@remix-run/cloudflare': specifier: 2.12.0 - version: 2.12.0(@cloudflare/workers-types@4.20241011.0)(typescript@5.6.2) + version: 2.12.0(@cloudflare/workers-types@4.20241112.0)(typescript@5.6.2) '@types/react': specifier: ^18.3.11 version: 18.3.12 @@ -209,13 +209,13 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground/multi-worker: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare @@ -230,13 +230,13 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground/node-compat: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare @@ -269,7 +269,7 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground/react-spa: dependencies: @@ -282,7 +282,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare @@ -306,7 +306,7 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground/spa-with-api: dependencies: @@ -319,7 +319,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare @@ -343,13 +343,13 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground/static-mpa: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare @@ -364,13 +364,13 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) playground/worker: devDependencies: '@cloudflare/workers-types': specifier: catalog:default - version: 4.20241011.0 + version: 4.20241112.0 '@flarelabs-net/vite-plugin-cloudflare': specifier: workspace:* version: link:../../packages/vite-plugin-cloudflare @@ -385,7 +385,7 @@ importers: version: 6.0.0-beta.10(@types/node@22.9.0) wrangler: specifier: catalog:default - version: 3.80.4(@cloudflare/workers-types@4.20241011.0) + version: 3.87.0(@cloudflare/workers-types@4.20241112.0) packages: @@ -487,46 +487,46 @@ packages: resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} - '@cloudflare/workerd-darwin-64@1.20241004.0': - resolution: {integrity: sha512-c2afR486NXDRcPm7RaTSRDnffFklPCXde/IeNVhEhBJ8O+pQhBOdDcGIy8zXPwMu0CYga0iHNZmpbsl+ZcHttA==} + '@cloudflare/workerd-darwin-64@1.20241106.1': + resolution: {integrity: sha512-zxvaToi1m0qzAScrxFt7UvFVqU8DxrCO2CinM1yQkv5no7pA1HolpIrwZ0xOhR3ny64Is2s/J6BrRjpO5dM9Zw==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20241004.0': - resolution: {integrity: sha512-siD9fexv5lr2IpBczWV7OPgJvHj8/fJUrRAYCMcBURkfiwssK91coQeZlN1NdQ85aYELVgxDFoG+p86OS+ZzLw==} + '@cloudflare/workerd-darwin-arm64@1.20241106.1': + resolution: {integrity: sha512-j3dg/42D/bPgfNP3cRUBxF+4waCKO/5YKwXNj+lnVOwHxDu+ne5pFw9TIkKYcWTcwn0ZUkbNZNM5rhJqRn4xbg==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20241004.0': - resolution: {integrity: sha512-EtKGXO5fzRgX6UhDDLhjjEsB1QtliHb12zavZ/S0C8hKPz76II7MQ3Lls9kfB62fbdMP8L6vcqWPObEUcw6GSw==} + '@cloudflare/workerd-linux-64@1.20241106.1': + resolution: {integrity: sha512-Ih+Ye8E1DMBXcKrJktGfGztFqHKaX1CeByqshmTbODnWKHt6O65ax3oTecUwyC0+abuyraOpAtdhHNpFMhUkmw==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20241004.0': - resolution: {integrity: sha512-XO7VBE1YaFf/o9tKO1PqDqaxkU2eAR2DLX7R0+R8p+q92sUDXyoxo48T3yJDfxWndnKJ6hSJfvKanw3Mq9Tisw==} + '@cloudflare/workerd-linux-arm64@1.20241106.1': + resolution: {integrity: sha512-mdQFPk4+14Yywn7n1xIzI+6olWM8Ybz10R7H3h+rk0XulMumCWUCy1CzIDauOx6GyIcSgKIibYMssVHZR30ObA==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20241004.0': - resolution: {integrity: sha512-o+TmCYGq58jNUDbG73xOvd648XvJ2TicI++2BBoySklJXG6f4But5AwA8TxQgmeujR3vpBjPZKexEzcZSUOTtA==} + '@cloudflare/workerd-windows-64@1.20241106.1': + resolution: {integrity: sha512-4rtcss31E/Rb/PeFocZfr+B9i1MdrkhsTBWizh8siNR4KMmkslU2xs2wPaH1z8+ErxkOsHrKRa5EPLh5rIiFeg==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-shared@0.6.0': - resolution: {integrity: sha512-rfUCvb3hx4AsvdUZsxgk9lmgEnQehqV3jdtXLP/Xr0+P56n11T/0nXNMzmn7Nnv+IJFOV6X9NmFhuMz4sBPw7w==} - engines: {node: '>=16.7.0'} - '@cloudflare/workers-shared@0.7.0': resolution: {integrity: sha512-LLQRTqx7lKC7o2eCYMpyc5FXV8d0pUX6r3A+agzhqS9aoR5A6zCPefwQGcvbKx83ozX22ATZcemwxQXn12UofQ==} engines: {node: '>=16.7.0'} - '@cloudflare/workers-types@4.20241011.0': - resolution: {integrity: sha512-emwBnuFB/2lS1z6NXAeBqrSL8Xwnr7YpgdLuchOmgu/igqBsLLNPBb4Qmgh3neFWUe9wbzQyx030836YF3c3Xw==} + '@cloudflare/workers-shared@0.7.1': + resolution: {integrity: sha512-46cP5FCrl3TrvHeoHLb5SRuiDMKH5kc9Yvo36SAfzt8dqJI/qJRoY1GP3ioHn/gP7v2QIoUOTAzIl7Ml7MnfrA==} + engines: {node: '>=16.7.0'} + + '@cloudflare/workers-types@4.20241112.0': + resolution: {integrity: sha512-Q4p9bAWZrX14bSCKY9to19xl0KMU7nsO5sJ2cTVspHoypsjPUMeQCsjHjmsO2C4Myo8/LPeDvmqFmkyNAPPYZw==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -1553,6 +1553,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + cjs-module-lexer@1.4.1: resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} @@ -1606,6 +1610,9 @@ packages: data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -1823,6 +1830,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + itty-time@1.0.6: + resolution: {integrity: sha512-+P8IZaLLBtFv8hCkIjcymZOp4UJ+xW6bSlQsXGqrkmJh7vSiMFSlNne0mCYagEE0N7HDNR5jJBRxwN0oYv61Rw==} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -1915,8 +1925,8 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - miniflare@3.20241004.0: - resolution: {integrity: sha512-QSSmCR2V1AJnnpYwlyLXobKLSGiY1FlAiZYULMdGgOUThV7HJeSysDxsmPmrH+D4GQbmUERnmDdB6M6Rrz7uPg==} + miniflare@3.20241106.0: + resolution: {integrity: sha512-PjOoJKjUUofCueQskfhXlGvvHxZj36UAJAp1DnquMK88MFF50zCULblh0KXMSNM+bXeQYA94Gj06a7kfmBGxPw==} engines: {node: '>=16.13'} hasBin: true @@ -2183,6 +2193,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -2453,9 +2467,6 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - unenv-nightly@2.0.0-20241009-125958-e8ea22f: - resolution: {integrity: sha512-hRxmKz1iSVRmuFx/vBdPsx7rX4o7Cas9vdjDNeUeWpQTK2LzU3Xy3Jz0zbo7MJX0bpqo/LEFCA+GPwsbl6zKEQ==} - unenv-nightly@2.0.0-20241024-111401-d4156ac: resolution: {integrity: sha512-xJO1hfY+Te+/XnfCYrCbFbRcgu6XEODND1s5wnVbaBCkuQX7JXF7fHEXPrukFE2j8EOH848P8QN19VO47XN8hw==} @@ -2591,17 +2602,17 @@ packages: engines: {node: '>=8'} hasBin: true - workerd@1.20241004.0: - resolution: {integrity: sha512-TCFJ7Zw7svR3adg1fnlPWj/yXhjBnQloLEIJqdu57hli/GsgwlbomwrbM3mdMgbS+K9zYeaYqknXiBN0EXk3QQ==} + workerd@1.20241106.1: + resolution: {integrity: sha512-1GdKl0kDw8rrirr/ThcK66Kbl4/jd4h8uHx5g7YHBrnenY5SX1UPuop2cnCzYUxlg55kPjzIqqYslz1muRFgFw==} engines: {node: '>=16'} hasBin: true - wrangler@3.80.4: - resolution: {integrity: sha512-DyNvShtVH3k7ZyBndlIiwyRDXqtHr3g01hxwn4FfwKlAaT6EL0wb3KL3UGbsdpeM/xbJiUQxFQ4WuFBWgZS18Q==} + wrangler@3.87.0: + resolution: {integrity: sha512-BExktnSLeGgG+uxgnr4h9eZ5nefdpTVcTHR+gEIWRvqk07XL04nJwpPYAOIPKPpB7E2tMdDJgNLGQN/CY6e1xQ==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20241004.0 + '@cloudflare/workers-types': ^4.20241106.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -2781,32 +2792,32 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/workerd-darwin-64@1.20241004.0': + '@cloudflare/workerd-darwin-64@1.20241106.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20241004.0': + '@cloudflare/workerd-darwin-arm64@1.20241106.1': optional: true - '@cloudflare/workerd-linux-64@1.20241004.0': + '@cloudflare/workerd-linux-64@1.20241106.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20241004.0': + '@cloudflare/workerd-linux-arm64@1.20241106.1': optional: true - '@cloudflare/workerd-windows-64@1.20241004.0': + '@cloudflare/workerd-windows-64@1.20241106.1': optional: true - '@cloudflare/workers-shared@0.6.0': + '@cloudflare/workers-shared@0.7.0': dependencies: mime: 3.0.0 zod: 3.23.8 - '@cloudflare/workers-shared@0.7.0': + '@cloudflare/workers-shared@0.7.1': dependencies: mime: 3.0.0 zod: 3.23.8 - '@cloudflare/workers-types@4.20241011.0': {} + '@cloudflare/workers-types@4.20241112.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -3193,10 +3204,10 @@ snapshots: '@playground/module-resolution-requires@file:playground/module-resolution/packages/requires': {} - '@remix-run/cloudflare@2.12.0(@cloudflare/workers-types@4.20241011.0)(typescript@5.6.2)': + '@remix-run/cloudflare@2.12.0(@cloudflare/workers-types@4.20241112.0)(typescript@5.6.2)': dependencies: '@cloudflare/kv-asset-handler': 0.1.3 - '@cloudflare/workers-types': 4.20241011.0 + '@cloudflare/workers-types': 4.20241112.0 '@remix-run/server-runtime': 2.12.0(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 @@ -3530,6 +3541,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.1: + dependencies: + readdirp: 4.0.2 + cjs-module-lexer@1.4.1: {} color-convert@1.9.3: @@ -3574,6 +3589,8 @@ snapshots: data-uri-to-buffer@2.0.2: {} + date-fns@4.1.0: {} + debug@4.3.7: dependencies: ms: 2.1.3 @@ -3841,6 +3858,8 @@ snapshots: isexe@2.0.0: {} + itty-time@1.0.6: {} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -3910,7 +3929,7 @@ snapshots: mimic-fn@2.1.0: {} - miniflare@3.20241004.0: + miniflare@3.20241106.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.12.1 @@ -3920,7 +3939,7 @@ snapshots: glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.4 - workerd: 1.20241004.0 + workerd: 1.20241106.1 ws: 8.18.0 youch: 3.3.3 zod: 3.23.8 @@ -4125,6 +4144,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.0.2: {} + resolve-from@5.0.0: {} resolve.exports@2.0.2: {} @@ -4400,13 +4421,6 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - unenv-nightly@2.0.0-20241009-125958-e8ea22f: - dependencies: - defu: 6.1.4 - ohash: 1.1.4 - pathe: 1.1.2 - ufo: 1.5.4 - unenv-nightly@2.0.0-20241024-111401-d4156ac: dependencies: defu: 6.1.4 @@ -4515,35 +4529,37 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - workerd@1.20241004.0: + workerd@1.20241106.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20241004.0 - '@cloudflare/workerd-darwin-arm64': 1.20241004.0 - '@cloudflare/workerd-linux-64': 1.20241004.0 - '@cloudflare/workerd-linux-arm64': 1.20241004.0 - '@cloudflare/workerd-windows-64': 1.20241004.0 + '@cloudflare/workerd-darwin-64': 1.20241106.1 + '@cloudflare/workerd-darwin-arm64': 1.20241106.1 + '@cloudflare/workerd-linux-64': 1.20241106.1 + '@cloudflare/workerd-linux-arm64': 1.20241106.1 + '@cloudflare/workerd-windows-64': 1.20241106.1 - wrangler@3.80.4(@cloudflare/workers-types@4.20241011.0): + wrangler@3.87.0(@cloudflare/workers-types@4.20241112.0): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 - '@cloudflare/workers-shared': 0.6.0 + '@cloudflare/workers-shared': 0.7.1 '@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 - chokidar: 3.6.0 + chokidar: 4.0.1 + date-fns: 4.1.0 esbuild: 0.17.19 - miniflare: 3.20241004.0 + itty-time: 1.0.6 + miniflare: 3.20241106.0 nanoid: 3.3.7 path-to-regexp: 6.3.0 resolve: 1.22.8 resolve.exports: 2.0.2 selfsigned: 2.4.1 source-map: 0.6.1 - unenv: unenv-nightly@2.0.0-20241009-125958-e8ea22f - workerd: 1.20241004.0 + unenv: unenv-nightly@2.0.0-20241024-111401-d4156ac + workerd: 1.20241106.1 xxhash-wasm: 1.0.2 optionalDependencies: - '@cloudflare/workers-types': 4.20241011.0 + '@cloudflare/workers-types': 4.20241112.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 68e32a5d..9a644f3c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,9 +4,9 @@ packages: - 'playground/*' catalog: - '@cloudflare/workers-types': ^4.20240919.0 + '@cloudflare/workers-types': ^4.20241112.0 'typescript': ^5.6.2 'vite': '6.0.0-beta.10' - 'wrangler': '^3.80.4' + 'wrangler': '^3.87.0' '@types/node': '^22.8.7' 'unenv': 'npm:unenv-nightly@2.0.0-20241024-111401-d4156ac'