From 5aaeff8df657a9f1221f27b3c550b18dde08c2ed Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 25 Nov 2025 11:45:43 +0000 Subject: [PATCH 1/3] fix(cloudflare): remove wrangler CLI utils --- packages/astro/src/core/create-vite.ts | 2 +- packages/astro/src/entrypoints/prerender.ts | 7 +- packages/astro/src/manifest/serialized.ts | 4 +- packages/integrations/cloudflare/package.json | 6 +- packages/integrations/cloudflare/src/index.ts | 52 ++++- .../src/utils/cloudflare-module-loader.ts | 4 +- .../test/astro-dev-platform.test.js | 34 ++- .../cloudflare/test/astro-env.test.js | 207 ++++++++--------- .../test/compile-image-service.test.js | 114 +++++---- .../cloudflare/test/custom-entryfile.test.js | 14 +- .../test/external-image-service.test.js | 15 +- .../fixtures/astro-dev-platform/wrangler.toml | 1 + .../test/fixtures/astro-env/wrangler.toml | 1 + .../fixtures/custom-entryfile/wrangler.jsonc | 2 +- .../test/fixtures/sessions/wrangler.json | 2 +- .../wrangler-preview-platform/wrangler.toml | 1 + .../cloudflare/test/module-loader.test.js | 48 ++-- .../cloudflare/test/routes-json.test.js | 2 +- .../cloudflare/test/sessions.test.js | 42 ++-- .../cloudflare/test/with-solid-js.test.js | 31 +-- .../cloudflare/test/with-svelte.test.js | 31 +-- .../cloudflare/test/with-vue.test.js | 31 +-- .../test/wrangler-preview-platform.test.js | 90 ++++---- .../test/functions/skew-protection.test.js | 4 +- packages/integrations/vercel/test/isr.test.js | 9 + pnpm-lock.yaml | 218 ++++++++---------- 26 files changed, 472 insertions(+), 500 deletions(-) diff --git a/packages/astro/src/core/create-vite.ts b/packages/astro/src/core/create-vite.ts index 5a8b7901f5f1..6bde81c1dd8a 100644 --- a/packages/astro/src/core/create-vite.ts +++ b/packages/astro/src/core/create-vite.ts @@ -149,7 +149,7 @@ export async function createVite( exclude: ['astro', 'node-fetch'], }, plugins: [ - serializedManifestPlugin({ settings, command }), + serializedManifestPlugin({ settings, command, sync }), vitePluginRenderers({ settings }), await astroPluginRoutes({ routesList, settings, logger, fsMod: fs }), astroVirtualManifestPlugin(), diff --git a/packages/astro/src/entrypoints/prerender.ts b/packages/astro/src/entrypoints/prerender.ts index 04ec63ba1b73..9d3127edaec2 100644 --- a/packages/astro/src/entrypoints/prerender.ts +++ b/packages/astro/src/entrypoints/prerender.ts @@ -1,11 +1,6 @@ -import { server as actions } from 'virtual:astro:actions/entrypoint'; import { manifest } from 'virtual:astro:manifest'; import { BuildApp } from '../core/build/app.js'; const app = new BuildApp(manifest); -const { renderers } = manifest; -// Export middleware lazy-loaded -const middleware = () => import('virtual:astro:middleware'); - -export { app, manifest, renderers, middleware, actions }; +export { app, manifest }; diff --git a/packages/astro/src/manifest/serialized.ts b/packages/astro/src/manifest/serialized.ts index 2eede8e3077e..c1ae1cb21b6c 100644 --- a/packages/astro/src/manifest/serialized.ts +++ b/packages/astro/src/manifest/serialized.ts @@ -29,9 +29,11 @@ export const SERIALIZED_MANIFEST_RESOLVED_ID = '\0' + SERIALIZED_MANIFEST_ID; export function serializedManifestPlugin({ settings, command, + sync }: { settings: AstroSettings; command: 'dev' | 'build'; + sync: boolean; }): Plugin { return { name: SERIALIZED_MANIFEST_ID, @@ -53,7 +55,7 @@ export function serializedManifestPlugin({ async load(id) { if (id === SERIALIZED_MANIFEST_RESOLVED_ID) { let manifestData: string; - if (command === 'build') { + if (command === 'build' && !sync) { // Emit placeholder token that will be replaced by plugin-manifest.ts in build:post // See plugin-manifest.ts for full architecture explanation manifestData = `'${MANIFEST_REPLACE}'`; diff --git a/packages/integrations/cloudflare/package.json b/packages/integrations/cloudflare/package.json index fdf546fea094..de587581c91c 100644 --- a/packages/integrations/cloudflare/package.json +++ b/packages/integrations/cloudflare/package.json @@ -40,11 +40,11 @@ "dependencies": { "@astrojs/internal-helpers": "workspace:*", "@astrojs/underscore-redirects": "workspace:*", - "@cloudflare/vite-plugin": "^1.13.14", - "@cloudflare/workers-types": "^4.20251014.0", + "@cloudflare/vite-plugin": "^1.15.2", + "@cloudflare/workers-types": "^4.20251125.0", "tinyglobby": "^0.2.15", "vite": "^7.1.12", - "wrangler": "4.44.0" + "wrangler": "4.50.0" }, "peerDependencies": { "astro": "^6.0.0-alpha.0" diff --git a/packages/integrations/cloudflare/src/index.ts b/packages/integrations/cloudflare/src/index.ts index bfaad68b1049..12bb30e11f2b 100644 --- a/packages/integrations/cloudflare/src/index.ts +++ b/packages/integrations/cloudflare/src/index.ts @@ -1,4 +1,4 @@ -import { createReadStream } from 'node:fs'; +import { createReadStream, existsSync, writeFileSync } from 'node:fs'; import { appendFile, stat } from 'node:fs/promises'; import { createRequire } from 'node:module'; import { createInterface } from 'node:readline/promises'; @@ -9,7 +9,7 @@ import { removeLeadingForwardSlash, } from '@astrojs/internal-helpers/path'; import { createRedirectsFromAstroRoutes, printAsRedirects } from '@astrojs/underscore-redirects'; -import { cloudflare as cfVitePlugin } from '@cloudflare/vite-plugin'; +import { cloudflare as cfVitePlugin, type PluginConfig } from '@cloudflare/vite-plugin'; import type { AstroConfig, AstroIntegration, @@ -20,9 +20,7 @@ import { AstroError } from 'astro/errors'; import type { PluginOption } from 'vite'; import { defaultClientConditions } from 'vite'; import { type GetPlatformProxyOptions, getPlatformProxy } from 'wrangler'; -import { - cloudflareModuleLoader, -} from './utils/cloudflare-module-loader.js'; +import { cloudflareModuleLoader } from './utils/cloudflare-module-loader.js'; import { createGetEnv } from './utils/env.js'; import { createRoutesFile, getParts } from './utils/generate-routes-json.js'; import { type ImageService, setImageConfig } from './utils/image-config.js'; @@ -179,6 +177,7 @@ export default function createIntegration(args?: Options): AstroIntegration { logger, addWatchFile, addMiddleware, + createCodegenDir, }) => { let session = config.session; @@ -210,6 +209,13 @@ export default function createIntegration(args?: Options): AstroIntegration { }, }; } + const cfPluginConfig: PluginConfig = { viteEnvironment: { name: 'ssr' } }; + if (!hasWranglerConfig(config.root)) { + const codegenDir = createCodegenDir(); + const cachedFile = new URL('wrangler.json', codegenDir); + writeFileSync(cachedFile, wranglerTemplate(), 'utf-8'); + cfPluginConfig.configPath = cachedFile.pathname; + } updateConfig({ build: { @@ -221,7 +227,7 @@ export default function createIntegration(args?: Options): AstroIntegration { session, vite: { plugins: [ - cfVitePlugin({ viteEnvironment: { name: 'ssr' } }), + cfVitePlugin(cfPluginConfig), // https://developers.cloudflare.com/pages/functions/module-support/ // Allows imports of '.wasm', '.bin', and '.txt' file types cloudflareModulePlugin, @@ -254,6 +260,7 @@ export default function createIntegration(args?: Options): AstroIntegration { }, image: setImageConfig(args?.imageService ?? 'compile', config.image, command, logger), }); + if (args?.platformProxy?.configPath) { addWatchFile(new URL(args.platformProxy.configPath, config.root)); } else { @@ -261,6 +268,7 @@ export default function createIntegration(args?: Options): AstroIntegration { addWatchFile(new URL('./wrangler.json', config.root)); addWatchFile(new URL('./wrangler.jsonc', config.root)); } + addMiddleware({ entrypoint: '@astrojs/cloudflare/entrypoints/middleware.js', order: 'pre', @@ -478,3 +486,35 @@ export default function createIntegration(args?: Options): AstroIntegration { }, }; } + +function hasWranglerConfig(root: URL) { + return ( + existsSync(new URL('wrangler.jsonc', root)) || + existsSync(new URL('wranger.toml', root)) || + existsSync(new URL('wranger.json', root)) + ); +} + +function wranglerTemplate(): string { + const wrangler = { + // TODO: better way to handle name, maybe package.json#name ? + name: 'test-application', + compatibility_date: '2024-11-01', + main: '@astrojs/cloudflare/entrypoints/server', + assets: { + directory: './dist', + binding: 'ASSETS', + }, + images: { + binding: 'IMAGES', + }, + kv_namespaces: [ + { + binding: 'SESSION', + id: 'SESSION', + }, + ], + }; + + return JSON.stringify(wrangler, null, 2); +} diff --git a/packages/integrations/cloudflare/src/utils/cloudflare-module-loader.ts b/packages/integrations/cloudflare/src/utils/cloudflare-module-loader.ts index 8bbbac7e9cf3..d5fdca267313 100644 --- a/packages/integrations/cloudflare/src/utils/cloudflare-module-loader.ts +++ b/packages/integrations/cloudflare/src/utils/cloudflare-module-loader.ts @@ -19,9 +19,7 @@ type ModuleType = 'CompiledWasm' | 'Text' | 'Data'; * @param enabled - if true, will load all cloudflare pages supported types * @returns Vite plugin with additional extension method to hook into astro build */ -export function cloudflareModuleLoader( - enabled: boolean, -): PluginOption { +export function cloudflareModuleLoader(enabled: boolean): PluginOption { /** * It's likely that eventually cloudflare will add support for custom extensions, like they do in vanilla cloudflare workers, * by adding rules to your wrangler.tome diff --git a/packages/integrations/cloudflare/test/astro-dev-platform.test.js b/packages/integrations/cloudflare/test/astro-dev-platform.test.js index e85a2b38b7ef..729ed0e7d735 100644 --- a/packages/integrations/cloudflare/test/astro-dev-platform.test.js +++ b/packages/integrations/cloudflare/test/astro-dev-platform.test.js @@ -1,50 +1,46 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; import * as cheerio from 'cheerio'; -import { astroCli } from './_test-utils.js'; +import { loadFixture } from './_test-utils.js'; -const root = new URL('./fixtures/astro-dev-platform/', import.meta.url); describe('AstroDevPlatform', () => { - let cli; + let fixture; + let devServer; before(async () => { - cli = astroCli(fileURLToPath(root), 'dev', '--host', '127.0.0.1').proc; - await new Promise((resolve) => { - cli.stdout.on('data', (data) => { - if (data.includes('http://127.0.0.1:4321/')) { - resolve(); - } - }); + fixture = await loadFixture({ + root: './fixtures/astro-dev-platform/', + logLevel: 'debug', }); + devServer = await fixture.startDevServer(); }); - after((_done) => { - cli.kill(); + after(async () => { + await devServer.stop(); }); it('exists', async () => { - const res = await fetch('http://127.0.0.1:4321/'); + const res = await fixture.fetch('/'); const html = await res.text(); const $ = cheerio.load(html); assert.equal($('#hasRuntime').text().includes('true'), true); }); it('adds cf object', async () => { - const res = await fetch('http://127.0.0.1:4321/'); + const res = await fixture.fetch('/'); const html = await res.text(); const $ = cheerio.load(html); assert.equal($('#hasCF').text(), 'true'); }); it('adds cache mocking', async () => { - const res = await fetch('http://127.0.0.1:4321/caches'); + const res = await fixture.fetch('/caches'); const html = await res.text(); const $ = cheerio.load(html); assert.equal($('#hasCACHE').text(), 'true'); }); it('adds D1 mocking', async () => { - const res = await fetch('http://127.0.0.1:4321/d1'); + const res = await fixture.fetch('/d1'); const html = await res.text(); const $ = cheerio.load(html); assert.equal($('#hasDB').text(), 'true'); @@ -53,7 +49,7 @@ describe('AstroDevPlatform', () => { }); it('adds R2 mocking', async () => { - const res = await fetch('http://127.0.0.1:4321/r2'); + const res = await fixture.fetch('/r2'); const html = await res.text(); const $ = cheerio.load(html); assert.equal($('#hasBUCKET').text(), 'true'); @@ -62,7 +58,7 @@ describe('AstroDevPlatform', () => { }); it('adds KV mocking', async () => { - const res = await fetch('http://127.0.0.1:4321/kv'); + const res = await fixture.fetch('/kv'); const html = await res.text(); const $ = cheerio.load(html); assert.equal($('#hasKV').text(), 'true'); diff --git a/packages/integrations/cloudflare/test/astro-env.test.js b/packages/integrations/cloudflare/test/astro-env.test.js index 2d6bf6ea83b3..b05a176804de 100644 --- a/packages/integrations/cloudflare/test/astro-env.test.js +++ b/packages/integrations/cloudflare/test/astro-env.test.js @@ -1,132 +1,119 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; import * as cheerio from 'cheerio'; -import { astroCli, wranglerCli } from './_test-utils.js'; - -const root = new URL('./fixtures/astro-env/', import.meta.url); - -describe('astro:env', () => { - describe('ssr', () => { - let wrangler; - - before(async () => { - process.env.API_URL = 'https://google.de'; - process.env.PORT = '4322'; - await astroCli(fileURLToPath(root), 'build').getResult(); - - wrangler = wranglerCli(fileURLToPath(root)); - await new Promise((resolve) => { - wrangler.stdout.on('data', (data) => { - // console.log('[stdout]', data.toString()); - if (data.toString().includes('http://127.0.0.1:8788')) resolve(); - }); - wrangler.stderr.on('data', (_data) => { - // console.log('[stderr]', data.toString()); +import { loadFixture } from './_test-utils.js'; + +describe( + 'astro:env', + { todo: 'Make secrets work again', skip: 'At the moment, private secrets are broken' }, + () => { + describe('ssr', () => { + let fixture; + before(async () => { + process.env.API_URL = 'https://google.de'; + process.env.PORT = '4322'; + fixture = await loadFixture({ + root: './fixtures/astro-env/', }); + await fixture.build(); }); - }); - after(() => { - wrangler.kill(); - }); + it('runtime', async () => { + const res = await fixture.read('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal( + $('#runtime').text().includes('https://google.de') && + $('#runtime').text().includes('4322') && + $('#runtime').text().includes('123456789'), + true, + ); + }); - it('runtime', async () => { - const res = await fetch('http://127.0.0.1:8788/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal( - $('#runtime').text().includes('https://google.de') && - $('#runtime').text().includes('4322') && - $('#runtime').text().includes('123456789'), - true, - ); - }); + it('client', async () => { + const res = await fixture.read('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#client').text().includes('https://google.de'), true); + }); - it('client', async () => { - const res = await fetch('http://127.0.0.1:8788/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#client').text().includes('https://google.de'), true); - }); + it('server', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#server').text().includes('4322'), true); + }); - it('server', async () => { - const res = await fetch('http://127.0.0.1:8788/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#server').text().includes('4322'), true); - }); + it('secret', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#secret').text().includes('123456789'), true); + }); - it('secret', async () => { - const res = await fetch('http://127.0.0.1:8788/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#secret').text().includes('123456789'), true); + it('action secret', async () => { + const res = await fixture.read('/test'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#secret').text().includes('123456789'), true); + }); }); - it('action secret', async () => { - const res = await fetch('http://127.0.0.1:8788/test'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#secret').text().includes('123456789'), true); - }); - }); + describe('dev', () => { + let devServer; + let fixture; - describe('dev', () => { - let cli; - before(async () => { - cli = astroCli(fileURLToPath(root), 'dev', '--host', '127.0.0.1').proc; - await new Promise((resolve) => { - cli.stdout.on('data', (data) => { - if (data.includes('http://127.0.0.1:4321/')) { - resolve(); - } + before(async () => { + fixture = await loadFixture({ + root: './fixtures/astro-env/', }); + devServer = await fixture.startDevServer(); }); - }); - after((_done) => { - cli.kill(); - }); + after(async () => { + await devServer.stop(); + }); - it('runtime', async () => { - const res = await fetch('http://127.0.0.1:4321/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal( - $('#runtime').text().includes('https://google.de') && - $('#runtime').text().includes('4322') && - $('#runtime').text().includes('123456789'), - true, - ); - }); + it('runtime', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + console.log(html); + const $ = cheerio.load(html); + assert.equal( + $('#runtime').text().includes('https://google.de') && + $('#runtime').text().includes('4322') && + $('#runtime').text().includes('123456789'), + true, + ); + }); - it('client', async () => { - const res = await fetch('http://127.0.0.1:4321/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#client').text().includes('https://google.de'), true); - }); + it('client', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#client').text().includes('https://google.de'), true); + }); - it('server', async () => { - const res = await fetch('http://127.0.0.1:4321/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#server').text().includes('4322'), true); - }); + it('server', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#server').text().includes('4322'), true); + }); - it('secret', async () => { - const res = await fetch('http://127.0.0.1:4321/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#secret').text().includes('123456789'), true); - }); + it('secret', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#secret').text().includes('123456789'), true); + }); - it('action secret', async () => { - const res = await fetch('http://127.0.0.1:4321/test'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#secret').text().includes('123456789'), true); + it('action secret', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#secret').text().includes('123456789'), true); + }); }); - }); -}); + }, +); diff --git a/packages/integrations/cloudflare/test/compile-image-service.test.js b/packages/integrations/cloudflare/test/compile-image-service.test.js index 980198316f25..50d777bc31aa 100644 --- a/packages/integrations/cloudflare/test/compile-image-service.test.js +++ b/packages/integrations/cloudflare/test/compile-image-service.test.js @@ -1,71 +1,67 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; -import { astroCli, wranglerCli } from './_test-utils.js'; +import { loadFixture } from './_test-utils.js'; -const root = new URL('./fixtures/compile-image-service/', import.meta.url); +describe( + 'CompileImageService', + { skip: 'Requires the preview server', todo: 'Enable once the preview server is supported' }, + () => { + let fixture; + let previewServer; -describe('CompileImageService', () => { - let wrangler; - before(async () => { - await astroCli(fileURLToPath(root), 'build').getResult(); - - wrangler = wranglerCli(fileURLToPath(root)); - await new Promise((resolve) => { - wrangler.stdout.on('data', (data) => { - // console.log('[stdout]', data.toString()); - if (data.toString().includes('http://127.0.0.1:8788')) resolve(); - }); - wrangler.stderr.on('data', (_data) => { - // console.log('[stderr]', data.toString()); + before(async () => { + fixture = await loadFixture({ + root: './fixtures/compile-image-service/', }); + await fixture.build(); + previewServer = await fixture.preview(); }); - }); - after(() => { - wrangler.kill(); - }); + after(async () => { + await previewServer.stop(); + }); - it('forbids http://', async () => { - const res = await fetch('http://127.0.0.1:8788/_image?href=http://placehold.co/600x400'); - const html = await res.text(); - const status = res.status; - assert.equal(html, 'Forbidden'); - assert.equal(status, 403); - }); + it('forbids http://', async () => { + const res = await fixture.fetch('/_image?href=http://placehold.co/600x400'); + const html = await res.text(); + const status = res.status; + assert.equal(html, 'Forbidden'); + assert.equal(status, 403); + }); - it('forbids https://', async () => { - const res = await fetch('http://127.0.0.1:8788/_image?href=https://placehold.co/600x400'); - const html = await res.text(); - const status = res.status; - assert.equal(html, 'Forbidden'); - assert.equal(status, 403); - }); + it('forbids https://', async () => { + const res = await fixture.fetch('/_image?href=https://placehold.co/600x400'); + const html = await res.text(); + const status = res.status; + assert.equal(html, 'Forbidden'); + assert.equal(status, 403); + }); - it('forbids //', async () => { - const res = await fetch('http://127.0.0.1:8788/_image?href=//placehold.co/600x400'); - const html = await res.text(); - const status = res.status; - assert.equal(html, 'Forbidden'); - assert.equal(status, 403); - }); + it('forbids //', async () => { + const res = await fixture.fetch('/_image?href=//placehold.co/600x400'); + const html = await res.text(); + const status = res.status; + assert.equal(html, 'Forbidden'); + assert.equal(status, 403); + }); - it('allows trusted with redirect', async () => { - const res = await fetch( - 'http://127.0.0.1:8788/_image?href=https://astro.build/_astro/HeroBackground.B0iWl89K_2hpsgp.webp', - { redirect: 'manual' }, - ); - const header = res.headers.get('location'); - const status = res.status; - assert.equal(header, 'https://astro.build/_astro/HeroBackground.B0iWl89K_2hpsgp.webp'); - assert.equal(status, 302); - }); + it('allows trusted with redirect', async () => { + const res = await fixture.fetch( + '/_image?href=https://astro.build/_astro/HeroBackground.B0iWl89K_2hpsgp.webp', + { redirect: 'manual' }, + ); + const header = res.headers.get('location'); + const status = res.status; + assert.equal(header, 'https://astro.build/_astro/HeroBackground.B0iWl89K_2hpsgp.webp'); + assert.equal(status, 302); + }); - it('allows local', async () => { - const res = await fetch('http://127.0.0.1:8788/_image?href=/_astro/placeholder.gLBdjEDe.jpg'); - const blob = await res.blob(); - const status = res.status; - assert.equal(blob.type, 'image/jpeg'); - assert.equal(status, 200); - }); -}); + it('allows local', async () => { + const res = await fixture.fetch('/_image?href=/_astro/placeholder.gLBdjEDe.jpg'); + const blob = await res.blob(); + const status = res.status; + assert.equal(blob.type, 'image/jpeg'); + assert.equal(status, 200); + }); + }, +); diff --git a/packages/integrations/cloudflare/test/custom-entryfile.test.js b/packages/integrations/cloudflare/test/custom-entryfile.test.js index 80f4a55bf982..123345e97623 100644 --- a/packages/integrations/cloudflare/test/custom-entryfile.test.js +++ b/packages/integrations/cloudflare/test/custom-entryfile.test.js @@ -1,14 +1,22 @@ import * as assert from 'node:assert/strict'; import { existsSync } from 'node:fs'; -import { describe, it } from 'node:test'; +import { before, describe, it } from 'node:test'; import { fileURLToPath } from 'node:url'; -import { astroCli } from './_test-utils.js'; +import { loadFixture } from './_test-utils.js'; const root = new URL('./fixtures/custom-entryfile/', import.meta.url); describe('Custom entry file', () => { + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/custom-entryfile/', + }); + await fixture.build(); + }); + it('filters out duplicate "default" export and builds', async () => { - await astroCli(fileURLToPath(root), 'build').getResult(); const filePath = fileURLToPath(new URL('dist/_worker.js', root)); const hasBuilt = existsSync(filePath); assert.equal(hasBuilt, true, `Expected ${filePath} to exist after build`); diff --git a/packages/integrations/cloudflare/test/external-image-service.test.js b/packages/integrations/cloudflare/test/external-image-service.test.js index fdff2df819c7..9e94270c5701 100644 --- a/packages/integrations/cloudflare/test/external-image-service.test.js +++ b/packages/integrations/cloudflare/test/external-image-service.test.js @@ -1,21 +1,30 @@ import * as assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; -import { describe, it } from 'node:test'; +import { before, describe, it } from 'node:test'; import { fileURLToPath } from 'node:url'; import { glob } from 'tinyglobby'; -import { astroCli } from './_test-utils.js'; +import { loadFixture } from './_test-utils.js'; const root = new URL('./fixtures/external-image-service/', import.meta.url); describe('ExternalImageService', () => { + let fixture; + + before(async () => { + fixture = await loadFixture({ + root: './fixtures/external-image-service/', + }); + await fixture.build(); + }); + it('has correct image service', async () => { - await astroCli(fileURLToPath(root), 'build').getResult(); const files = await glob('**/image-service_*.mjs', { cwd: fileURLToPath(new URL('dist/_worker.js', root)), filesOnly: true, absolute: true, flush: true, }); + console.log(files); const outFileToCheck = readFileSync(files[0], 'utf-8'); assert.equal(outFileToCheck.includes('cdn-cgi/image'), true); }); diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/wrangler.toml b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/wrangler.toml index 3119ab45b902..49f7edf0413d 100644 --- a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/wrangler.toml +++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/wrangler.toml @@ -1,4 +1,5 @@ name = "test" +main = "@astrojs/cloudflare/entrypoints/server" kv_namespaces = [ { binding = "KV", id = "", preview_id = "" }, diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/wrangler.toml b/packages/integrations/cloudflare/test/fixtures/astro-env/wrangler.toml index 121ab5993ac1..ca042ab2b0c0 100644 --- a/packages/integrations/cloudflare/test/fixtures/astro-env/wrangler.toml +++ b/packages/integrations/cloudflare/test/fixtures/astro-env/wrangler.toml @@ -1,4 +1,5 @@ name = "astro-env" +main = "@astrojs/cloudflare/entrypoints/server" [vars] API_URL = "https://google.de" diff --git a/packages/integrations/cloudflare/test/fixtures/custom-entryfile/wrangler.jsonc b/packages/integrations/cloudflare/test/fixtures/custom-entryfile/wrangler.jsonc index cfe4b45d6b4a..074108186bd1 100644 --- a/packages/integrations/cloudflare/test/fixtures/custom-entryfile/wrangler.jsonc +++ b/packages/integrations/cloudflare/test/fixtures/custom-entryfile/wrangler.jsonc @@ -1,6 +1,6 @@ { "compatibility_date": "2025-05-21", - "main": "dist/_worker.js/index.js", + "main": "@astrojs/cloudflare/entrypoints/server", "name": "astro-cloudflare-custom-entryfile", "assets": { "directory": "./dist", diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/wrangler.json b/packages/integrations/cloudflare/test/fixtures/sessions/wrangler.json index 479d56c32dd2..3781b5a93d17 100644 --- a/packages/integrations/cloudflare/test/fixtures/sessions/wrangler.json +++ b/packages/integrations/cloudflare/test/fixtures/sessions/wrangler.json @@ -4,7 +4,7 @@ "compatibility_flags": [ "nodejs_compat" ], - "main": "./dist/_worker.js/index.js", + "main": "@astrojs/cloudflare/entrypoints/server", "assets": { "directory": "./dist", "binding": "ASSETS" diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/wrangler.toml b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/wrangler.toml index ba0fa64c4b09..a63edd51a510 100644 --- a/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/wrangler.toml +++ b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/wrangler.toml @@ -1,4 +1,5 @@ name = "test" +main = "@astrojs/cloudflare/entrypoint/server" [vars] COOL = "ME" diff --git a/packages/integrations/cloudflare/test/module-loader.test.js b/packages/integrations/cloudflare/test/module-loader.test.js index f0a19be8c275..780d4e398370 100644 --- a/packages/integrations/cloudflare/test/module-loader.test.js +++ b/packages/integrations/cloudflare/test/module-loader.test.js @@ -1,70 +1,62 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; import zlib from 'node:zlib'; -import { astroCli, wranglerCli } from './_test-utils.js'; +import { loadFixture } from './_test-utils.js'; -const root = new URL('./fixtures/module-loader/', import.meta.url); - -describe('CloudflareModuleLoading', () => { - let wrangler; +describe('CloudflareModuleLoading', { skip: 'Requires the preview server', todo: 'Enable once the preview server is supported' }, + () => { + let fixture; + let previewServer; before(async () => { - await astroCli(fileURLToPath(root), 'build').getResult(); - - wrangler = wranglerCli(fileURLToPath(root)); - await new Promise((resolve) => { - wrangler.stdout.on('data', (data) => { - // console.log('[stdout]', data.toString()); - if (data.toString().includes('http://127.0.0.1:8788')) resolve(); - }); - wrangler.stderr.on('data', (_data) => { - // console.log('[stderr]', data.toString()); - }); + fixture = await loadFixture({ + root: './fixtures/module-loader/', }); + await fixture.build(); + previewServer = await fixture.preview(); }); - - after((_done) => { - wrangler.kill(); - }); + + after(async () => { + await previewServer.stop(); + }) it('can render server side', async () => { - const res = await fetch('http://127.0.0.1:8788/add/40/2'); + const res = await fixture.fetch('/add/40/2'); assert.equal(res.status, 200); const json = await res.json(); assert.deepEqual(json, { answer: 42 }); }); it('can render static', async () => { - const res = await fetch('http://127.0.0.1:8788/hybrid'); + const res = await fixture.fetch('/hybrid'); assert.equal(res.status, 200); const json = await res.json(); assert.deepEqual(json, { answer: 21 }); }); it('can render shared', async () => { - const res = await fetch('http://127.0.0.1:8788/shared/40/2'); + const res = await fixture.fetch('/shared/40/2'); assert.equal(res.status, 200); const json = await res.json(); assert.deepEqual(json, { answer: 42 }); }); it('can render static shared', async () => { - const res = await fetch('http://127.0.0.1:8788/hybridshared'); + const res = await fixture.fetch('/hybridshared'); assert.equal(res.status, 200); const json = await res.json(); assert.deepEqual(json, { answer: 21 }); }); it('can render txt', async () => { - const res = await fetch('http://127.0.0.1:8788/text'); + const res = await fixture.fetch('/text'); assert.equal(res.status, 200); const text = await res.text(); assert.equal(text, 'Hello\n'); }); it('can render binary', async () => { - const res = await fetch('http://127.0.0.1:8788/bin'); + const res = await fixture.fetch('/bin'); assert.equal(res.status, 200); const text = zlib.gunzipSync(await res.arrayBuffer()).toString('utf-8'); assert.equal(text, 'Hello\n'); }); it('can render compound paths', async () => { - const res = await fetch('http://127.0.0.1:8788/compound'); + const res = await fixture.fetch('/compound'); assert.equal(res.status, 200); const text = await res.text(); assert.equal(text, 'Hello\n'); diff --git a/packages/integrations/cloudflare/test/routes-json.test.js b/packages/integrations/cloudflare/test/routes-json.test.js index 547739fea017..abbffd7476be 100644 --- a/packages/integrations/cloudflare/test/routes-json.test.js +++ b/packages/integrations/cloudflare/test/routes-json.test.js @@ -74,7 +74,7 @@ describe('_routes.json generation', () => { assert.deepEqual(routes, { version: 1, - include: ['/_server-islands/*'], + include: ['/_server-islands/*', '/_image'], exclude: ['/', '/_astro/*', '/redirectme', '/public.txt', '/a/*', '/404'], }); }, diff --git a/packages/integrations/cloudflare/test/sessions.test.js b/packages/integrations/cloudflare/test/sessions.test.js index 4d8b0206682c..a69d88cf2d1c 100644 --- a/packages/integrations/cloudflare/test/sessions.test.js +++ b/packages/integrations/cloudflare/test/sessions.test.js @@ -1,40 +1,32 @@ import assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; import * as devalue from 'devalue'; import cloudflare from '../dist/index.js'; -import { astroCli, loadFixture, wranglerCli } from './_test-utils.js'; +import { loadFixture } from './_test-utils.js'; -const root = new URL('./fixtures/sessions/', import.meta.url); - -describe('sessions', () => { - let wrangler; +describe('sessions', { skip: 'Requires the preview server', todo: 'Enable once the preview server is supported' }, + () => { + let fixture; + let previewServer; before(async () => { - await astroCli(fileURLToPath(root), 'build').getResult(); - - wrangler = wranglerCli(fileURLToPath(root)); - await new Promise((resolve) => { - wrangler.stdout.on('data', (data) => { - // console.log('[stdout]', data.toString()); - if (data.toString().includes('http://127.0.0.1:8788')) resolve(); - }); - wrangler.stderr.on('data', (_data) => { - // console.log('[stderr]', _data.toString()); - }); + fixture = await loadFixture({ + root: './fixtures/sessions/', }); + await fixture.build(); + previewServer = await fixture.preview(); }); - after(() => { - wrangler.kill(); + after(async () => { + await previewServer.stop(); }); it('can regenerate session cookies upon request', async () => { - const firstResponse = await fetch('http://127.0.0.1:8788/regenerate', { method: 'GET' }); + const firstResponse = await fixture.fetch('/regenerate', { method: 'GET' }); const firstHeaders = firstResponse.headers.get('set-cookie').split(','); const firstSessionId = firstHeaders[0].split(';')[0].split('=')[1]; - const secondResponse = await fetch('http://127.0.0.1:8788/regenerate', { + const secondResponse = await fixture.fetch('/regenerate', { method: 'GET', headers: { cookie: `astro-session=${firstSessionId}`, @@ -46,13 +38,13 @@ describe('sessions', () => { }); it('can save session data by value', async () => { - const firstResponse = await fetch('http://127.0.0.1:8788/update', { method: 'GET' }); + const firstResponse = await fixture.fetch('/update', { method: 'GET' }); const firstValue = await firstResponse.json(); assert.equal(firstValue.previousValue, 'none'); const firstHeaders = firstResponse.headers.get('set-cookie').split(','); const firstSessionId = firstHeaders[0].split(';')[0].split('=')[1]; - const secondResponse = await fetch('http://127.0.0.1:8788/update', { + const secondResponse = await fixture.fetch('/update', { method: 'GET', headers: { cookie: `astro-session=${firstSessionId}`, @@ -63,7 +55,7 @@ describe('sessions', () => { }); it('can save and restore URLs in session data', async () => { - const firstResponse = await fetch('http://127.0.0.1:8788/_actions/addUrl', { + const firstResponse = await fixture.fetch('/_actions/addUrl', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -77,7 +69,7 @@ describe('sessions', () => { const data = devalue.parse(await firstResponse.text()); assert.equal(data.message, 'Favorite URL set to https://domain.invalid/ from nothing'); - const secondResponse = await fetch('http://127.0.0.1:8788/_actions/addUrl', { + const secondResponse = await fixture.fetch('/_actions/addUrl', { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/packages/integrations/cloudflare/test/with-solid-js.test.js b/packages/integrations/cloudflare/test/with-solid-js.test.js index 9a8ec7a05a2a..b4046111ab2a 100644 --- a/packages/integrations/cloudflare/test/with-solid-js.test.js +++ b/packages/integrations/cloudflare/test/with-solid-js.test.js @@ -1,34 +1,27 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; import * as cheerio from 'cheerio'; -import { astroCli, wranglerCli } from './_test-utils.js'; +import { loadFixture } from './_test-utils.js'; -const root = new URL('./fixtures/with-solid-js/', import.meta.url); +describe('SolidJS', { skip: 'Requires the preview server', todo: 'Enable once the preview server is supported' }, + () => { + let fixture; + let previewServer; -describe('SolidJS', () => { - let wrangler; before(async () => { - await astroCli(fileURLToPath(root), 'build').getResult(); - - wrangler = wranglerCli(fileURLToPath(root)); - await new Promise((resolve) => { - wrangler.stdout.on('data', (data) => { - // console.log('[stdout]', data.toString()); - if (data.toString().includes('http://127.0.0.1:8788')) resolve(); - }); - wrangler.stderr.on('data', (_data) => { - // console.log('[stderr]', data.toString()); - }); + fixture = await loadFixture({ + root: './fixtures/with-svelte/', }); + await fixture.build(); + previewServer = await fixture.preview(); }); - after((_done) => { - wrangler.kill(); + after(async () => { + await previewServer.stop(); }); it('renders the solid component', async () => { - const res = await fetch('http://127.0.0.1:8788/'); + const res = await fixture.fetch('/'); assert.equal(res.status, 200); const html = await res.text(); const $ = cheerio.load(html); diff --git a/packages/integrations/cloudflare/test/with-svelte.test.js b/packages/integrations/cloudflare/test/with-svelte.test.js index d63ab5f84684..437ae5855396 100644 --- a/packages/integrations/cloudflare/test/with-svelte.test.js +++ b/packages/integrations/cloudflare/test/with-svelte.test.js @@ -1,34 +1,27 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; import * as cheerio from 'cheerio'; -import { astroCli, wranglerCli } from './_test-utils.js'; +import { loadFixture } from './_test-utils.js'; -const root = new URL('./fixtures/with-svelte/', import.meta.url); +describe('Svelte', { skip: 'Requires the preview server', todo: 'Enable once the preview server is supported' }, + () => { + let fixture; + let previewServer; -describe('Svelte', () => { - let wrangler; before(async () => { - await astroCli(fileURLToPath(root), 'build').getResult(); - - wrangler = wranglerCli(fileURLToPath(root)); - await new Promise((resolve) => { - wrangler.stdout.on('data', (data) => { - // console.log('[stdout]', data.toString()); - if (data.toString().includes('http://127.0.0.1:8788')) resolve(); - }); - wrangler.stderr.on('data', (_data) => { - // console.log('[stderr]', data.toString()); - }); + fixture = await loadFixture({ + root: './fixtures/with-svelte/', }); + await fixture.build(); + previewServer = await fixture.preview(); }); - after((_done) => { - wrangler.kill(); + after(async () => { + await previewServer.stop(); }); it('renders the svelte component', async () => { - const res = await fetch('http://127.0.0.1:8788/'); + const res = await fixture.fetch('/'); assert.equal(res.status, 200); const html = await res.text(); const $ = cheerio.load(html); diff --git a/packages/integrations/cloudflare/test/with-vue.test.js b/packages/integrations/cloudflare/test/with-vue.test.js index 6687a4dc9074..a10f0f8dfa63 100644 --- a/packages/integrations/cloudflare/test/with-vue.test.js +++ b/packages/integrations/cloudflare/test/with-vue.test.js @@ -1,34 +1,27 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; import * as cheerio from 'cheerio'; -import { astroCli, wranglerCli } from './_test-utils.js'; +import { loadFixture } from './_test-utils.js'; -const root = new URL('./fixtures/with-vue/', import.meta.url); +describe('Vue', { skip: 'Requires the preview server', todo: 'Enable once the preview server is supported' }, + () => { + let fixture; + let previewServer; -describe('Vue', () => { - let wrangler; before(async () => { - await astroCli(fileURLToPath(root), 'build').getResult(); - - wrangler = wranglerCli(fileURLToPath(root)); - await new Promise((resolve) => { - wrangler.stdout.on('data', (data) => { - // console.log('[stdout]', data.toString()); - if (data.toString().includes('http://127.0.0.1:8788')) resolve(); - }); - wrangler.stderr.on('data', (_data) => { - // console.log('[stderr]', data.toString()); - }); + fixture = await loadFixture({ + root: './fixtures/with-vue/', }); + await fixture.build(); + previewServer = await fixture.preview(); }); - after((_done) => { - wrangler.kill(); + after(async () => { + await previewServer.stop(); }); it('renders the vue component', async () => { - const res = await fetch('http://127.0.0.1:8788/'); + const res = await fixture.fetch('/'); assert.equal(res.status, 200); const html = await res.text(); const $ = cheerio.load(html); diff --git a/packages/integrations/cloudflare/test/wrangler-preview-platform.test.js b/packages/integrations/cloudflare/test/wrangler-preview-platform.test.js index 176af8f68601..5ebaf1aa29e0 100644 --- a/packages/integrations/cloudflare/test/wrangler-preview-platform.test.js +++ b/packages/integrations/cloudflare/test/wrangler-preview-platform.test.js @@ -1,58 +1,52 @@ import * as assert from 'node:assert/strict'; import { after, before, describe, it } from 'node:test'; -import { fileURLToPath } from 'node:url'; import * as cheerio from 'cheerio'; -import { astroCli, wranglerCli } from './_test-utils.js'; - -const root = new URL('./fixtures/wrangler-preview-platform/', import.meta.url); - -describe('WranglerPreviewPlatform', () => { - let wrangler; - - before(async () => { - await astroCli(fileURLToPath(root), 'build').getResult(); - - wrangler = wranglerCli(fileURLToPath(root)); - await new Promise((resolve) => { - wrangler.stdout.on('data', (data) => { - // console.log('[stdout]', data.toString()); - if (data.toString().includes('http://127.0.0.1:8788')) resolve(); - }); - wrangler.stderr.on('data', (_data) => { - // console.log('[stderr]', data.toString()); +import { loadFixture } from './_test-utils.js'; + +describe( + 'WranglerPreviewPlatform', + { skip: 'Requires the preview server', todo: 'Enable once the preview server is supported' }, + () => { + let fixture; + let previewServer; + before(async () => { + fixture = await loadFixture({ + root: './fixtures/wrangler-preview-platform/', }); + await fixture.build(); + previewServer = await fixture.preview(); }); - }); - after((_done) => { - wrangler.kill(); - }); + after(async () => { + previewServer.stop(); + }); - it('exists', async () => { - const res = await fetch('http://127.0.0.1:8788/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#hasRuntime').text().includes('true'), true); - }); + it('exists', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#hasRuntime').text().includes('true'), true); + }); - it('has environment variables', async () => { - const res = await fetch('http://127.0.0.1:8788/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#hasENV').text().includes('true'), true); - }); + it('has environment variables', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#hasENV').text().includes('true'), true); + }); - it('has Cloudflare request object', async () => { - const res = await fetch('http://127.0.0.1:8788/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#hasCF').text().includes('true'), true); - }); + it('has Cloudflare request object', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#hasCF').text().includes('true'), true); + }); - it('has Cloudflare cache', async () => { - const res = await fetch('http://127.0.0.1:8788/'); - const html = await res.text(); - const $ = cheerio.load(html); - assert.equal($('#hasCACHES').text().includes('true'), true); - }); -}); + it('has Cloudflare cache', async () => { + const res = await fixture.fetch('/'); + const html = await res.text(); + const $ = cheerio.load(html); + assert.equal($('#hasCACHES').text().includes('true'), true); + }); + }, +); diff --git a/packages/integrations/netlify/test/functions/skew-protection.test.js b/packages/integrations/netlify/test/functions/skew-protection.test.js index 28959e4be8d4..bfdeb5f92ef0 100644 --- a/packages/integrations/netlify/test/functions/skew-protection.test.js +++ b/packages/integrations/netlify/test/functions/skew-protection.test.js @@ -42,12 +42,12 @@ describe( it('Manifest contains internalFetchHeaders', async () => { // The manifest is embedded in the build output // Check the manifest file which contains the serialized manifest - const manifestURL = new URL('./fixtures/skew-protection/.netlify/build/', import.meta.url); + const manifestURL = new URL('./fixtures/skew-protection/.netlify/build/chunks/', import.meta.url); // Find the manifest file (it has a hash in the name) const { readdir } = await import('node:fs/promises'); const files = await readdir(manifestURL); - const manifestFile = files.find((f) => f.startsWith('manifest_') && f.endsWith('.mjs')); + const manifestFile = files.find((f) => f.startsWith('_virtual_astro_legacy') && f.endsWith('.mjs')); assert.ok(manifestFile, 'Expected to find a manifest file'); const manifestContent = await readFile(new URL(manifestFile, manifestURL), 'utf-8'); diff --git a/packages/integrations/vercel/test/isr.test.js b/packages/integrations/vercel/test/isr.test.js index 25dfe1dba04a..2433a33f7dcc 100644 --- a/packages/integrations/vercel/test/isr.test.js +++ b/packages/integrations/vercel/test/isr.test.js @@ -61,6 +61,15 @@ describe('ISR', () => { src: '^/one/?$', dest: '/_isr?x_astro_path=$0', }, + { + src: '^/404/?$', + dest: '/_isr?x_astro_path=$0' + }, + { + dest: '_render', + src: '^/.*$', + status: 404 + } ]); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 472e27444f26..4ba67d8f4318 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4149,12 +4149,6 @@ importers: specifier: workspace:* version: link:../../.. - packages/astro/test/fixtures/ssr-manifest: - dependencies: - astro: - specifier: workspace:* - version: link:../../.. - packages/astro/test/fixtures/ssr-markdown: dependencies: astro: @@ -4521,7 +4515,7 @@ importers: version: 1.0.2 drizzle-orm: specifier: ^0.42.0 - version: 0.42.0(@cloudflare/workers-types@4.20251014.0)(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0) + version: 0.42.0(@cloudflare/workers-types@4.20251125.0)(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0) nanoid: specifier: ^5.1.6 version: 5.1.6 @@ -4776,11 +4770,11 @@ importers: specifier: workspace:* version: link:../../underscore-redirects '@cloudflare/vite-plugin': - specifier: ^1.13.14 - version: 1.13.14(vite@7.1.12(@types/node@22.18.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.0)(tsx@4.20.6)(yaml@2.8.1))(workerd@1.20251105.0)(wrangler@4.44.0(@cloudflare/workers-types@4.20251014.0)) + specifier: ^1.15.2 + version: 1.15.2(vite@7.1.12(@types/node@22.18.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.0)(tsx@4.20.6)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.50.0(@cloudflare/workers-types@4.20251125.0)) '@cloudflare/workers-types': - specifier: ^4.20251014.0 - version: 4.20251014.0 + specifier: ^4.20251125.0 + version: 4.20251125.0 tinyglobby: specifier: ^0.2.15 version: 0.2.15 @@ -4788,8 +4782,8 @@ importers: specifier: ^7.1.12 version: 7.1.12(@types/node@22.18.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.0)(tsx@4.20.6)(yaml@2.8.1) wrangler: - specifier: 4.44.0 - version: 4.44.0(@cloudflare/workers-types@4.20251014.0) + specifier: 4.50.0 + version: 4.50.0(@cloudflare/workers-types@4.20251125.0) devDependencies: astro: specifier: workspace:* @@ -4818,7 +4812,7 @@ importers: devDependencies: wrangler: specifier: 4.46.0 - version: 4.46.0(@cloudflare/workers-types@4.20251014.0) + version: 4.46.0(@cloudflare/workers-types@4.20251125.0) packages/integrations/cloudflare/test/fixtures/astro-env: dependencies: @@ -4831,7 +4825,7 @@ importers: devDependencies: wrangler: specifier: 4.46.0 - version: 4.46.0(@cloudflare/workers-types@4.20251014.0) + version: 4.46.0(@cloudflare/workers-types@4.20251125.0) packages/integrations/cloudflare/test/fixtures/compile-image-service: dependencies: @@ -4898,7 +4892,7 @@ importers: version: link:../../../../../astro wrangler: specifier: 4.46.0 - version: 4.46.0(@cloudflare/workers-types@4.20251014.0) + version: 4.46.0(@cloudflare/workers-types@4.20251125.0) packages/integrations/cloudflare/test/fixtures/vite-plugin: dependencies: @@ -7300,11 +7294,11 @@ packages: resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} - '@cloudflare/unenv-preset@2.7.8': - resolution: {integrity: sha512-Ky929MfHh+qPhwCapYrRPwPVHtA2Ioex/DbGZyskGyNRDe9Ru3WThYZivyNVaPy5ergQSgMs9OKrM9Ajtz9F6w==} + '@cloudflare/unenv-preset@2.7.11': + resolution: {integrity: sha512-se23f1D4PxKrMKOq+Stz+Yn7AJ9ITHcEecXo2Yjb+UgbUDCEBch1FXQC6hx6uT5fNA3kmX3mfzeZiUmpK1W9IQ==} peerDependencies: - unenv: 2.0.0-rc.21 - workerd: ^1.20250927.0 + unenv: 2.0.0-rc.24 + workerd: ^1.20251106.1 peerDependenciesMeta: workerd: optional: true @@ -7318,17 +7312,11 @@ packages: workerd: optional: true - '@cloudflare/vite-plugin@1.13.14': - resolution: {integrity: sha512-aSqUV3YjFUY5eeR9rHGSaSqdND84Qjh9zJKZ5WFCqqWaxkPw911ISJNpRw+m4GVEMGYAlFlWfg17E6PLn8GzFw==} + '@cloudflare/vite-plugin@1.15.2': + resolution: {integrity: sha512-SPMxsesbABOjzcAa4IzW+yM+fTIjx3GG1doh229Pg16FjSEZJhknyRpcld4gnaZioK3JKwG9FWdKsUhbplKY8w==} peerDependencies: vite: ^6.1.0 || ^7.0.0 - wrangler: ^4.44.0 - - '@cloudflare/workerd-darwin-64@1.20251011.0': - resolution: {integrity: sha512-0DirVP+Z82RtZLlK2B+VhLOkk+ShBqDYO/jhcRw4oVlp0TOvk3cOVZChrt3+y3NV8Y/PYgTEywzLKFSziK4wCg==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] + wrangler: ^4.50.0 '@cloudflare/workerd-darwin-64@1.20251105.0': resolution: {integrity: sha512-nztUP35wTtUKM+681dBWtUNSySNWELTV+LY43oWy7ZhK19/iBJPQoFY7xpvF7zy4qOOShtise259B65DS4/71Q==} @@ -7336,10 +7324,10 @@ packages: cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20251011.0': - resolution: {integrity: sha512-1WuFBGwZd15p4xssGN/48OE2oqokIuc51YvHvyNivyV8IYnAs3G9bJNGWth1X7iMDPe4g44pZrKhRnISS2+5dA==} + '@cloudflare/workerd-darwin-64@1.20251118.0': + resolution: {integrity: sha512-UmWmYEYS/LkK/4HFKN6xf3Hk8cw70PviR+ftr3hUvs9HYZS92IseZEp16pkL6ZBETrPRpZC7OrzoYF7ky6kHsg==} engines: {node: '>=16'} - cpu: [arm64] + cpu: [x64] os: [darwin] '@cloudflare/workerd-darwin-arm64@1.20251105.0': @@ -7348,11 +7336,11 @@ packages: cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20251011.0': - resolution: {integrity: sha512-BccMiBzFlWZyFghIw2szanmYJrJGBGHomw2y/GV6pYXChFzMGZkeCEMfmCyJj29xczZXxcZmUVJxNy4eJxO8QA==} + '@cloudflare/workerd-darwin-arm64@1.20251118.0': + resolution: {integrity: sha512-RockU7Qzf4rxNfY1lx3j4rvwutNLjTIX7rr2hogbQ4mzLo8Ea40/oZTzXVxl+on75joLBrt0YpenGW8o/r44QA==} engines: {node: '>=16'} - cpu: [x64] - os: [linux] + cpu: [arm64] + os: [darwin] '@cloudflare/workerd-linux-64@1.20251105.0': resolution: {integrity: sha512-RdHRHo/hpjR6sNw529FkmslVSz/K3Pb1+i3fIoqUrHCrZOUYzFyz3nLeZh4EYaAhcztLWiSTwBv54bcl4sG3wA==} @@ -7360,10 +7348,10 @@ packages: cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20251011.0': - resolution: {integrity: sha512-79o/216lsbAbKEVDZYXR24ivEIE2ysDL9jvo0rDTkViLWju9dAp3CpyetglpJatbSi3uWBPKZBEOqN68zIjVsQ==} + '@cloudflare/workerd-linux-64@1.20251118.0': + resolution: {integrity: sha512-aT97GnOAbJDuuOG0zPVhgRk0xFtB1dzBMrxMZ09eubDLoU4djH4BuORaqvxNRMmHgKfa4T6drthckT0NjUvBdw==} engines: {node: '>=16'} - cpu: [arm64] + cpu: [x64] os: [linux] '@cloudflare/workerd-linux-arm64@1.20251105.0': @@ -7372,11 +7360,11 @@ packages: cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20251011.0': - resolution: {integrity: sha512-RIXUQRchFdqEvaUqn1cXZXSKjpqMaSaVAkI5jNZ8XzAw/bw2bcdOVUtakrflgxDprltjFb0PTNtuss1FKtH9Jg==} + '@cloudflare/workerd-linux-arm64@1.20251118.0': + resolution: {integrity: sha512-bXZPJcwlq00MPOXqP7DMWjr+goYj0+Fqyw6zgEC2M3FR1+SWla4yjghnZ4IdpN+H1t7VbUrsi5np2LzMUFs0NA==} engines: {node: '>=16'} - cpu: [x64] - os: [win32] + cpu: [arm64] + os: [linux] '@cloudflare/workerd-windows-64@1.20251105.0': resolution: {integrity: sha512-6BpkfjBIbGR+4FBOcZGcWDLM0XQuoI6R9Dublj/BKf4pv0/xJ4zHdnaYUb5NIlC75L55Ouqw0CEJasoKlMjgnw==} @@ -7384,8 +7372,14 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20251014.0': - resolution: {integrity: sha512-tEW98J/kOa0TdylIUOrLKRdwkUw0rvvYVlo+Ce0mqRH3c8kSoxLzUH9gfCvwLe0M89z1RkzFovSKAW2Nwtyn3w==} + '@cloudflare/workerd-windows-64@1.20251118.0': + resolution: {integrity: sha512-2LV99AHSlpr8WcCb/BYbU2QsYkXLUL1izN6YKWkN9Eibv80JKX0RtgmD3dfmajE5sNvClavxZejgzVvHD9N9Ag==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@4.20251125.0': + resolution: {integrity: sha512-YZdO/IX10DiHb2v+7H2CL5SKAbxJQIG22jNefgtW86YMf5LvQk6f75v5T/j1ju56MBwm6RzcqvsECF+cXs2h3g==} '@codspeed/core@4.0.1': resolution: {integrity: sha512-fJ53arfgtzCDZa8DuGJhpTZ3Ll9A1uW5nQ2jSJnfO4Hl5MRD2cP8P4vPvIUAGbdbjwCxR1jat6cW8OloMJkJXw==} @@ -11865,9 +11859,6 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} - exsolve@1.0.7: - resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -13286,13 +13277,13 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - miniflare@4.20251011.0: - resolution: {integrity: sha512-DlZ7vR5q/RE9eLsxsrXzfSZIF2f6O5k0YsFrSKhWUtdefyGtJt4sSpR6V+Af/waaZ6+zIFy9lsknHBCm49sEYA==} + miniflare@4.20251105.0: + resolution: {integrity: sha512-n+lCQbGLPjHFm5EKMohxCl+hLIki9rIlJSU9FkYKdJ62cGacetmTH5IgWUZhUFFM+NqhqZLOuWXTAsoZTm0hog==} engines: {node: '>=18.0.0'} hasBin: true - miniflare@4.20251105.0: - resolution: {integrity: sha512-n+lCQbGLPjHFm5EKMohxCl+hLIki9rIlJSU9FkYKdJ62cGacetmTH5IgWUZhUFFM+NqhqZLOuWXTAsoZTm0hog==} + miniflare@4.20251118.1: + resolution: {integrity: sha512-uLSAE/DvOm392fiaig4LOaatxLjM7xzIniFRG5Y3yF9IduOYLLK/pkCPQNCgKQH3ou0YJRHnTN+09LPfqYNTQQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -15172,9 +15163,6 @@ packages: resolution: {integrity: sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==} engines: {node: '>=20.18.1'} - unenv@2.0.0-rc.21: - resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} - unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} @@ -15920,13 +15908,13 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerd@1.20251011.0: - resolution: {integrity: sha512-Dq35TLPEJAw7BuYQMkN3p9rge34zWMU2Gnd4DSJFeVqld4+DAO2aPG7+We2dNIAyM97S8Y9BmHulbQ00E0HC7Q==} + workerd@1.20251105.0: + resolution: {integrity: sha512-8D1UmsxrRr3Go7enbYCsYoiWeGn66u1WFNojPSgtjp7z8pV2cXskjr05vQ1OOzl7+rg1hDDofnCJqVwChMym8g==} engines: {node: '>=16'} hasBin: true - workerd@1.20251105.0: - resolution: {integrity: sha512-8D1UmsxrRr3Go7enbYCsYoiWeGn66u1WFNojPSgtjp7z8pV2cXskjr05vQ1OOzl7+rg1hDDofnCJqVwChMym8g==} + workerd@1.20251118.0: + resolution: {integrity: sha512-Om5ns0Lyx/LKtYI04IV0bjIrkBgoFNg0p6urzr2asekJlfP18RqFzyqMFZKf0i9Gnjtz/JfAS/Ol6tjCe5JJsQ==} engines: {node: '>=16'} hasBin: true @@ -15936,22 +15924,22 @@ packages: workerpool@9.3.4: resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} - wrangler@4.44.0: - resolution: {integrity: sha512-BLOUigckcWZ0r4rm7b5PuaTpb9KP9as0XeCRSJ8kqcNgXcKoUD3Ij8FlPvN25KybLnFnetaO0ZdfRYUPWle4qw==} + wrangler@4.46.0: + resolution: {integrity: sha512-WRROO7CL+MW/E44RMT4X7w32qPjufiPpGdey5D6H7iKzzVqfUkTRULxYBfWANiU1yGnsiCXQtu3Ap0G2TmohtA==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20251011.0 + '@cloudflare/workers-types': ^4.20251014.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true - wrangler@4.46.0: - resolution: {integrity: sha512-WRROO7CL+MW/E44RMT4X7w32qPjufiPpGdey5D6H7iKzzVqfUkTRULxYBfWANiU1yGnsiCXQtu3Ap0G2TmohtA==} - engines: {node: '>=18.0.0'} + wrangler@4.50.0: + resolution: {integrity: sha512-+nuZuHZxDdKmAyXOSrHlciGshCoAPiy5dM+t6mEohWm7HpXvTHmWQGUf/na9jjWlWJHCJYOWzkA1P5HBJqrIEA==} + engines: {node: '>=20.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20251014.0 + '@cloudflare/workers-types': ^4.20251118.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -16992,17 +16980,11 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/unenv-preset@2.7.8(unenv@2.0.0-rc.21)(workerd@1.20251011.0)': + '@cloudflare/unenv-preset@2.7.11(unenv@2.0.0-rc.24)(workerd@1.20251118.0)': dependencies: - unenv: 2.0.0-rc.21 + unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20251011.0 - - '@cloudflare/unenv-preset@2.7.8(unenv@2.0.0-rc.21)(workerd@1.20251105.0)': - dependencies: - unenv: 2.0.0-rc.21 - optionalDependencies: - workerd: 1.20251105.0 + workerd: 1.20251118.0 '@cloudflare/unenv-preset@2.7.9(unenv@2.0.0-rc.24)(workerd@1.20251105.0)': dependencies: @@ -17010,54 +16992,54 @@ snapshots: optionalDependencies: workerd: 1.20251105.0 - '@cloudflare/vite-plugin@1.13.14(vite@7.1.12(@types/node@22.18.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.0)(tsx@4.20.6)(yaml@2.8.1))(workerd@1.20251105.0)(wrangler@4.44.0(@cloudflare/workers-types@4.20251014.0))': + '@cloudflare/vite-plugin@1.15.2(vite@7.1.12(@types/node@22.18.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.0)(tsx@4.20.6)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.50.0(@cloudflare/workers-types@4.20251125.0))': dependencies: - '@cloudflare/unenv-preset': 2.7.8(unenv@2.0.0-rc.21)(workerd@1.20251105.0) + '@cloudflare/unenv-preset': 2.7.11(unenv@2.0.0-rc.24)(workerd@1.20251118.0) '@remix-run/node-fetch-server': 0.8.0 get-port: 7.1.0 - miniflare: 4.20251011.0 + miniflare: 4.20251118.1 picocolors: 1.1.1 tinyglobby: 0.2.15 - unenv: 2.0.0-rc.21 + unenv: 2.0.0-rc.24 vite: 7.1.12(@types/node@22.18.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.0)(tsx@4.20.6)(yaml@2.8.1) - wrangler: 4.44.0(@cloudflare/workers-types@4.20251014.0) + wrangler: 4.50.0(@cloudflare/workers-types@4.20251125.0) ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate - workerd - '@cloudflare/workerd-darwin-64@1.20251011.0': - optional: true - '@cloudflare/workerd-darwin-64@1.20251105.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20251011.0': + '@cloudflare/workerd-darwin-64@1.20251118.0': optional: true '@cloudflare/workerd-darwin-arm64@1.20251105.0': optional: true - '@cloudflare/workerd-linux-64@1.20251011.0': + '@cloudflare/workerd-darwin-arm64@1.20251118.0': optional: true '@cloudflare/workerd-linux-64@1.20251105.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20251011.0': + '@cloudflare/workerd-linux-64@1.20251118.0': optional: true '@cloudflare/workerd-linux-arm64@1.20251105.0': optional: true - '@cloudflare/workerd-windows-64@1.20251011.0': + '@cloudflare/workerd-linux-arm64@1.20251118.0': optional: true '@cloudflare/workerd-windows-64@1.20251105.0': optional: true - '@cloudflare/workers-types@4.20251014.0': {} + '@cloudflare/workerd-windows-64@1.20251118.0': + optional: true + + '@cloudflare/workers-types@4.20251125.0': {} '@codspeed/core@4.0.1': dependencies: @@ -21334,9 +21316,9 @@ snapshots: dotenv@8.6.0: {} - drizzle-orm@0.42.0(@cloudflare/workers-types@4.20251014.0)(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0): + drizzle-orm@0.42.0(@cloudflare/workers-types@4.20251125.0)(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0): optionalDependencies: - '@cloudflare/workers-types': 4.20251014.0 + '@cloudflare/workers-types': 4.20251125.0 '@libsql/client': 0.15.15 '@opentelemetry/api': 1.9.0 @@ -21815,8 +21797,6 @@ snapshots: transitivePeerDependencies: - supports-color - exsolve@1.0.7: {} - extend@3.0.2: {} extendable-error@0.1.7: {} @@ -23634,7 +23614,7 @@ snapshots: mimic-response@3.1.0: optional: true - miniflare@4.20251011.0: + miniflare@4.20251105.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -23644,7 +23624,7 @@ snapshots: sharp: 0.33.5 stoppable: 1.1.0 undici: 7.14.0 - workerd: 1.20251011.0 + workerd: 1.20251105.0 ws: 8.18.0 youch: 4.1.0-beta.10 zod: 3.22.3 @@ -23652,7 +23632,7 @@ snapshots: - bufferutil - utf-8-validate - miniflare@4.20251105.0: + miniflare@4.20251118.1: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -23662,7 +23642,7 @@ snapshots: sharp: 0.33.5 stoppable: 1.1.0 undici: 7.14.0 - workerd: 1.20251105.0 + workerd: 1.20251118.0 ws: 8.18.0 youch: 4.1.0-beta.10 zod: 3.22.3 @@ -25915,14 +25895,6 @@ snapshots: undici@7.15.0: {} - unenv@2.0.0-rc.21: - dependencies: - defu: 6.1.4 - exsolve: 1.0.7 - ohash: 2.0.11 - pathe: 2.0.3 - ufo: 1.6.1 - unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3 @@ -26689,14 +26661,6 @@ snapshots: word-wrap@1.2.5: {} - workerd@1.20251011.0: - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20251011.0 - '@cloudflare/workerd-darwin-arm64': 1.20251011.0 - '@cloudflare/workerd-linux-64': 1.20251011.0 - '@cloudflare/workerd-linux-arm64': 1.20251011.0 - '@cloudflare/workerd-windows-64': 1.20251011.0 - workerd@1.20251105.0: optionalDependencies: '@cloudflare/workerd-darwin-64': 1.20251105.0 @@ -26705,39 +26669,47 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20251105.0 '@cloudflare/workerd-windows-64': 1.20251105.0 + workerd@1.20251118.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20251118.0 + '@cloudflare/workerd-darwin-arm64': 1.20251118.0 + '@cloudflare/workerd-linux-64': 1.20251118.0 + '@cloudflare/workerd-linux-arm64': 1.20251118.0 + '@cloudflare/workerd-windows-64': 1.20251118.0 + workerpool@6.5.1: {} workerpool@9.3.4: {} - wrangler@4.44.0(@cloudflare/workers-types@4.20251014.0): + wrangler@4.46.0(@cloudflare/workers-types@4.20251125.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.7.8(unenv@2.0.0-rc.21)(workerd@1.20251011.0) + '@cloudflare/unenv-preset': 2.7.9(unenv@2.0.0-rc.24)(workerd@1.20251105.0) blake3-wasm: 2.1.5 esbuild: 0.25.4 - miniflare: 4.20251011.0 + miniflare: 4.20251105.0 path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.21 - workerd: 1.20251011.0 + unenv: 2.0.0-rc.24 + workerd: 1.20251105.0 optionalDependencies: - '@cloudflare/workers-types': 4.20251014.0 + '@cloudflare/workers-types': 4.20251125.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil - utf-8-validate - wrangler@4.46.0(@cloudflare/workers-types@4.20251014.0): + wrangler@4.50.0(@cloudflare/workers-types@4.20251125.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.7.9(unenv@2.0.0-rc.24)(workerd@1.20251105.0) + '@cloudflare/unenv-preset': 2.7.11(unenv@2.0.0-rc.24)(workerd@1.20251118.0) blake3-wasm: 2.1.5 esbuild: 0.25.4 - miniflare: 4.20251105.0 + miniflare: 4.20251118.1 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20251105.0 + workerd: 1.20251118.0 optionalDependencies: - '@cloudflare/workers-types': 4.20251014.0 + '@cloudflare/workers-types': 4.20251125.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil From 18d9a82adb122ffae310c915a8ab217a508ed172 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 25 Nov 2025 13:36:13 +0000 Subject: [PATCH 2/3] feedback --- packages/integrations/cloudflare/test/astro-env.test.js | 1 - .../integrations/cloudflare/test/external-image-service.test.js | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/integrations/cloudflare/test/astro-env.test.js b/packages/integrations/cloudflare/test/astro-env.test.js index b05a176804de..3dd5deb17bc3 100644 --- a/packages/integrations/cloudflare/test/astro-env.test.js +++ b/packages/integrations/cloudflare/test/astro-env.test.js @@ -77,7 +77,6 @@ describe( it('runtime', async () => { const res = await fixture.fetch('/'); const html = await res.text(); - console.log(html); const $ = cheerio.load(html); assert.equal( $('#runtime').text().includes('https://google.de') && diff --git a/packages/integrations/cloudflare/test/external-image-service.test.js b/packages/integrations/cloudflare/test/external-image-service.test.js index 9e94270c5701..993e0de1e4c5 100644 --- a/packages/integrations/cloudflare/test/external-image-service.test.js +++ b/packages/integrations/cloudflare/test/external-image-service.test.js @@ -24,7 +24,6 @@ describe('ExternalImageService', () => { absolute: true, flush: true, }); - console.log(files); const outFileToCheck = readFileSync(files[0], 'utf-8'); assert.equal(outFileToCheck.includes('cdn-cgi/image'), true); }); From e3b6ff4f3410e5a91442166c461cc1f4fd8e33d9 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Tue, 25 Nov 2025 15:18:50 +0000 Subject: [PATCH 3/3] remove unused stuff --- .../cloudflare/test/_test-utils.js | 76 ------------------- 1 file changed, 76 deletions(-) diff --git a/packages/integrations/cloudflare/test/_test-utils.js b/packages/integrations/cloudflare/test/_test-utils.js index bb35e07815c3..48735bec0f5e 100644 --- a/packages/integrations/cloudflare/test/_test-utils.js +++ b/packages/integrations/cloudflare/test/_test-utils.js @@ -1,81 +1,5 @@ -import { spawn } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; import { loadFixture as baseLoadFixture } from '../../../astro/test/test-utils.js'; -/** - * @typedef {{ stop: Promise, port: number }} WranglerCLI - */ - -const astroPath = fileURLToPath(new URL('../node_modules/astro/bin/astro.mjs', import.meta.url)); -/** Returns a process running the Astro CLI. */ -export function astroCli(cwd, /** @type {string[]} */ ...args) { - const proc = spawn('node', [astroPath, ...args], { - env: { ...process.env, ASTRO_TELEMETRY_DISABLED: 'true' }, - cwd, - }); - proc.stdout.setEncoding('utf-8'); - - return { - proc, - getResult: () => - new Promise((resolve) => { - let stdout = ''; - let stderr = ''; - proc.stdout.on('data', (chunk) => { - stdout += chunk; - }); - proc.stderr.on('data', (chunk) => { - stderr += chunk; - }); - proc.on('close', (exitCode) => { - resolve({ - exitCode, - stdout, - stderr, - }); - }); - }), - }; -} - -const wranglerPath = fileURLToPath( - new URL('../node_modules/wrangler/bin/wrangler.js', import.meta.url), -); - -/** Returns a process running the Wrangler CLI. */ -export function wranglerCli(cwd) { - const spawned = spawn( - 'node', - [ - wranglerPath, - 'pages', - 'dev', - 'dist', - '--ip', - '127.0.0.1', - '--port', - '8788', - '--compatibility-date', - new Date().toISOString().slice(0, 10), - '--log-level', - 'info', - ], - { - env: { - ...process.env, - CI: '1', - CF_PAGES: '1', - }, - cwd, - }, - ); - - spawned.stdout.setEncoding('utf8'); - spawned.stderr.setEncoding('utf8'); - - return spawned; -} - /** * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture */