aboutsummaryrefslogtreecommitdiff
path: root/packages/integrations/cloudflare/test
diff options
context:
space:
mode:
authorGravatar github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> 2025-06-05 14:25:23 +0000
committerGravatar github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> 2025-06-05 14:25:23 +0000
commite586d7d704d475afe3373a1de6ae20d504f79d6d (patch)
tree7e3fa24807cebd48a86bd40f866d792181191ee9 /packages/integrations/cloudflare/test
downloadastro-e586d7d704d475afe3373a1de6ae20d504f79d6d.tar.gz
astro-e586d7d704d475afe3373a1de6ae20d504f79d6d.tar.zst
astro-e586d7d704d475afe3373a1de6ae20d504f79d6d.zip
Sync from a8e1c0a7402940e0fc5beef669522b315052df1blatest
Diffstat (limited to 'packages/integrations/cloudflare/test')
-rw-r--r--packages/integrations/cloudflare/test/_test-utils.js67
-rw-r--r--packages/integrations/cloudflare/test/astro-dev-platform.test.js72
-rw-r--r--packages/integrations/cloudflare/test/astro-env.test.js72
-rw-r--r--packages/integrations/cloudflare/test/external-image-service.test.js22
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/.dev.vars1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/astro.config.ts11
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/package.json12
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/env.d.ts1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/caches.astro15
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/d1.astro21
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/index.astro13
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/kv.astro20
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/r2.astro20
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-dev-platform/wrangler.toml29
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/.dev.vars1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/astro.config.ts14
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/package.json12
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/src/actions.ts12
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/src/env.d.ts13
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/src/middleware.ts9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/src/pages/index.astro27
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/src/pages/test.astro6
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/tsconfig.json3
-rw-r--r--packages/integrations/cloudflare/test/fixtures/astro-env/wrangler.toml5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/compile-image-service/astro.config.mjs9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/compile-image-service/package.json9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/blog/post/index.md5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/blog/post/placeholder.jpgbin0 -> 38690 bytes
-rw-r--r--packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/config.ts23
-rw-r--r--packages/integrations/cloudflare/test/fixtures/compile-image-service/src/env.d.ts1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/compile-image-service/src/pages/blog/[...slug].astro34
-rw-r--r--packages/integrations/cloudflare/test/fixtures/external-image-service/astro.config.mjs9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/external-image-service/package.json9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/external-image-service/src/env.d.ts1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/astro.config.mjs7
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/package.json9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/env.d.ts1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/add/[a]/[b].ts20
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/bin.ts16
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/compound.ts17
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/hybrid.ts16
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/hybridshared.ts16
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/shared/[a]/[b].ts18
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/text.ts16
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/util/add.ts8
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/util/add.wasmbin0 -> 41 bytes
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.1.md.txt1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.binbin0 -> 26 bytes
-rw-r--r--packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.txt1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/no-output/astro.config.mjs6
-rw-r--r--packages/integrations/cloudflare/test/fixtures/no-output/package.json9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/astro.config.mjs8
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/package.json9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/public/_redirects1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/public/public.txt1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/env.d.ts2
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic1.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic2.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic3.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/index.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/env.d.ts1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/pages/[id].astro16
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/pages/dynamic.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/env.d.ts1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/404.astro0
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/[id].astro16
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/dynamic.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/env.d.ts2
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/404.astro3
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/[...rest].astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/[id].astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/endpoint.ts1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/index.astro1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/b/index.html1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/env.d.ts2
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/404.astro3
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic1.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic2.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic3.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/index.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/dynamic.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/static.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/subfolder/dynamic.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/subfolder/static.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static1.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static2.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static3.astro5
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/env.d.ts2
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/pages/404.astro3
-rw-r--r--packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/pages/index.astro1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/astro.config.mjs12
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/package.json17
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/src/actions/index.ts36
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/src/middleware.ts49
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/src/pages/api.ts13
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/src/pages/cart.astro24
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/src/pages/destroy.ts6
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/src/pages/index.astro13
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/src/pages/regenerate.ts6
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/src/pages/update.ts10
-rw-r--r--packages/integrations/cloudflare/test/fixtures/sessions/wrangler.json22
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-base/astro.config.mjs12
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-base/package.json9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-base/src/pages/index.astro4
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-base/src/pages/static.astro4
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-solid-js/astro.config.mjs9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json11
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-solid-js/src/components/Component.tsx1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-solid-js/src/env.d.ts1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-solid-js/src/pages/index.astro13
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-svelte/astro.config.mjs9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-svelte/package.json11
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-svelte/src/components/Component.svelte1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-svelte/src/pages/index.astro13
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-vue/astro.config.mjs9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-vue/package.json11
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-vue/src/components/Component.vue3
-rw-r--r--packages/integrations/cloudflare/test/fixtures/with-vue/src/pages/index.astro13
-rw-r--r--packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/.dev.vars1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/astro.config.mjs8
-rw-r--r--packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/package.json9
-rw-r--r--packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/src/env.d.ts1
-rw-r--r--packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/src/pages/index.astro15
-rw-r--r--packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/wrangler.toml4
-rw-r--r--packages/integrations/cloudflare/test/module-loader.test.js72
-rw-r--r--packages/integrations/cloudflare/test/routes-json.test.js347
-rw-r--r--packages/integrations/cloudflare/test/sessions.test.js93
-rw-r--r--packages/integrations/cloudflare/test/with-solid-js.test.js37
-rw-r--r--packages/integrations/cloudflare/test/with-svelte.test.js37
-rw-r--r--packages/integrations/cloudflare/test/with-vue.test.js37
-rw-r--r--packages/integrations/cloudflare/test/wrangler-preview-platform.test.js58
131 files changed, 1969 insertions, 0 deletions
diff --git a/packages/integrations/cloudflare/test/_test-utils.js b/packages/integrations/cloudflare/test/_test-utils.js
new file mode 100644
index 000000000..381c66a8b
--- /dev/null
+++ b/packages/integrations/cloudflare/test/_test-utils.js
@@ -0,0 +1,67 @@
+import { fileURLToPath } from 'node:url';
+import { execa } from 'execa';
+import { loadFixture as baseLoadFixture } from '../../../astro/test/test-utils.js';
+
+/**
+ * @typedef {{ stop: Promise<void>, port: number }} WranglerCLI
+ */
+
+const astroPath = fileURLToPath(new URL('../node_modules/astro/astro.js', import.meta.url));
+/** Returns a process running the Astro CLI. */
+export function astroCli(cwd, /** @type {string[]} */ ...args) {
+ const spawned = execa(astroPath, [...args], {
+ env: { ASTRO_TELEMETRY_DISABLED: true },
+ cwd: cwd,
+ });
+
+ spawned.stdout.setEncoding('utf8');
+
+ return spawned;
+}
+
+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 = execa(
+ wranglerPath,
+ [
+ 'pages',
+ 'dev',
+ 'dist',
+ '--ip',
+ '127.0.0.1',
+ '--port',
+ '8788',
+ '--compatibility-date',
+ new Date().toISOString().slice(0, 10),
+ '--log-level',
+ 'info',
+ ],
+ {
+ env: { CI: 1, CF_PAGES: 1 },
+ cwd: cwd,
+ },
+ );
+
+ spawned.stdout.setEncoding('utf8');
+ spawned.stderr.setEncoding('utf8');
+
+ return spawned;
+}
+
+/**
+ * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture
+ */
+export function loadFixture(inlineConfig) {
+ if (!inlineConfig?.root) throw new Error("Must provide { root: './fixtures/...' }");
+
+ // resolve the relative root (i.e. "./fixtures/tailwindcss") to a full filepath
+ // without this, the main `loadFixture` helper will resolve relative to `packages/astro/test`
+ return baseLoadFixture({
+ ...inlineConfig,
+ root: new URL(inlineConfig.root, import.meta.url).toString(),
+ });
+}
diff --git a/packages/integrations/cloudflare/test/astro-dev-platform.test.js b/packages/integrations/cloudflare/test/astro-dev-platform.test.js
new file mode 100644
index 000000000..ab47e0aa4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/astro-dev-platform.test.js
@@ -0,0 +1,72 @@
+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';
+
+const root = new URL('./fixtures/astro-dev-platform/', import.meta.url);
+describe('AstroDevPlatform', () => {
+ let cli;
+ before(async () => {
+ cli = astroCli(fileURLToPath(root), 'dev', '--host', '127.0.0.1');
+ await new Promise((resolve) => {
+ cli.stdout.on('data', (data) => {
+ if (data.includes('http://127.0.0.1:4321/')) {
+ resolve();
+ }
+ });
+ });
+ });
+
+ after((_done) => {
+ cli.kill();
+ });
+
+ it('exists', async () => {
+ const res = await fetch('http://127.0.0.1:4321/');
+ 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 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 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 html = await res.text();
+ const $ = cheerio.load(html);
+ assert.equal($('#hasDB').text(), 'true');
+ assert.equal($('#hasPRODDB').text(), 'true');
+ assert.equal($('#hasACCESS').text(), 'true');
+ });
+
+ it('adds R2 mocking', async () => {
+ const res = await fetch('http://127.0.0.1:4321/r2');
+ const html = await res.text();
+ const $ = cheerio.load(html);
+ assert.equal($('#hasBUCKET').text(), 'true');
+ assert.equal($('#hasPRODBUCKET').text(), 'true');
+ assert.equal($('#hasACCESS').text(), 'true');
+ });
+
+ it('adds KV mocking', async () => {
+ const res = await fetch('http://127.0.0.1:4321/kv');
+ const html = await res.text();
+ const $ = cheerio.load(html);
+ assert.equal($('#hasKV').text(), 'true');
+ assert.equal($('#hasPRODKV').text(), 'true');
+ assert.equal($('#hasACCESS').text(), 'true');
+ });
+});
diff --git a/packages/integrations/cloudflare/test/astro-env.test.js b/packages/integrations/cloudflare/test/astro-env.test.js
new file mode 100644
index 000000000..af1a366e0
--- /dev/null
+++ b/packages/integrations/cloudflare/test/astro-env.test.js
@@ -0,0 +1,72 @@
+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', () => {
+ let wrangler;
+
+ before(async () => {
+ process.env.API_URL = 'https://google.de';
+ process.env.PORT = '4322';
+ await astroCli(fileURLToPath(root), 'build');
+
+ 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());
+ });
+ });
+ });
+
+ after(() => {
+ wrangler.kill();
+ });
+
+ 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 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 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 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 fetch('http://127.0.0.1:8788/test');
+ const html = await res.text();
+ const $ = cheerio.load(html);
+ assert.equal($('#secret').text().includes('123456789'), true);
+ });
+});
diff --git a/packages/integrations/cloudflare/test/external-image-service.test.js b/packages/integrations/cloudflare/test/external-image-service.test.js
new file mode 100644
index 000000000..28ef544ca
--- /dev/null
+++ b/packages/integrations/cloudflare/test/external-image-service.test.js
@@ -0,0 +1,22 @@
+import * as assert from 'node:assert/strict';
+import { readFileSync } from 'node:fs';
+import { describe, it } from 'node:test';
+import { fileURLToPath } from 'node:url';
+import { glob } from 'tinyglobby';
+import { astroCli } from './_test-utils.js';
+
+const root = new URL('./fixtures/external-image-service/', import.meta.url);
+
+describe('ExternalImageService', () => {
+ it('has correct image service', async () => {
+ await astroCli(fileURLToPath(root), 'build');
+ const files = await glob('**/image-service_*.mjs', {
+ cwd: fileURLToPath(new URL('dist/_worker.js', root)),
+ filesOnly: true,
+ absolute: true,
+ flush: true,
+ });
+ 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/.dev.vars b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/.dev.vars
new file mode 100644
index 000000000..641dd0791
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/.dev.vars
@@ -0,0 +1 @@
+DATABASE_URL="postgresql://loremMe"
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/astro.config.ts b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/astro.config.ts
new file mode 100644
index 000000000..95234c069
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/astro.config.ts
@@ -0,0 +1,11 @@
+import cloudflare from '@astrojs/cloudflare';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: cloudflare({
+ platformProxy: {
+ enabled: true,
+ },
+ }),
+ output: 'server',
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/package.json b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/package.json
new file mode 100644
index 000000000..bccdd58c4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "@test/astro-cloudflare-astro-dev-platform",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "astro": "workspace:*"
+ },
+ "devDependencies": {
+ "wrangler": "^4.14.1"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/env.d.ts
new file mode 100644
index 000000000..9bc5cb41c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/env.d.ts
@@ -0,0 +1 @@
+/// <reference path="../.astro/types.d.ts" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/caches.astro b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/caches.astro
new file mode 100644
index 000000000..743111721
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/caches.astro
@@ -0,0 +1,15 @@
+---
+const runtime = Astro.locals.runtime;
+---
+
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>CACHES</title>
+ </head>
+ <body>
+ <pre id="hasCACHE">{!!runtime.caches}</pre>
+ </body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/d1.astro b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/d1.astro
new file mode 100644
index 000000000..a28940e9f
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/d1.astro
@@ -0,0 +1,21 @@
+---
+const runtime = Astro.locals.runtime;
+const db = runtime.env?.D1;
+await db.exec("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)");
+await db.exec("INSERT INTO test (name) VALUES ('true')");
+const result = await db.prepare("SELECT * FROM test").all();
+---
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>D1</title>
+</head>
+<body>
+ <pre id="hasDB">{!!runtime.env?.D1}</pre>
+ <pre id="hasPRODDB">{!!runtime.env?.D1_PROD}</pre>
+ <pre id="hasACCESS">{!!result.results[0].name}</pre>
+</body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/index.astro
new file mode 100644
index 000000000..7d2ce1ef1
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/index.astro
@@ -0,0 +1,13 @@
+---
+const runtime = Astro.locals.runtime;
+---
+<html>
+ <head>
+ <title>Testing</title>
+ </head>
+ <body>
+ <h1>Testing</h1>
+ <div id="hasRuntime">{!!runtime}</div>
+ <div id="hasCF">{!!runtime.cf?.colo}</div>
+ </body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/kv.astro b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/kv.astro
new file mode 100644
index 000000000..d21f163a0
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/kv.astro
@@ -0,0 +1,20 @@
+---
+const runtime = Astro.locals.runtime;
+const kv = runtime.env?.KV;
+await kv.put("test", "true");
+const result = await kv.get("test")
+---
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>KV</title>
+</head>
+<body>
+ <pre id="hasKV">{!!runtime.env?.KV}</pre>
+ <pre id="hasPRODKV">{!!runtime.env?.KV_PROD}</pre>
+ <pre id="hasACCESS">{!!result}</pre>
+</body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/r2.astro b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/r2.astro
new file mode 100644
index 000000000..fbb9fc61b
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/src/pages/r2.astro
@@ -0,0 +1,20 @@
+---
+const runtime = Astro.locals.runtime;
+const bucket = runtime.env?.R2;
+await bucket.put("test", "true");
+const result = await (await bucket.get("test")).text()
+---
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>R2</title>
+</head>
+<body>
+ <pre id="hasBUCKET">{!!runtime.env?.R2}</pre>
+ <pre id="hasPRODBUCKET">{!!runtime.env?.R2_PROD}</pre>
+ <pre id="hasACCESS">{!!result}</pre>
+</body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/wrangler.toml b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/wrangler.toml
new file mode 100644
index 000000000..3119ab45b
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/wrangler.toml
@@ -0,0 +1,29 @@
+name = "test"
+
+kv_namespaces = [
+ { binding = "KV", id = "<YOUR_ID>", preview_id = "<YOUR_ID>" },
+ { binding = "KV_PROD", id = "<YOUR_ID>", preview_id = "<YOUR_ID>" },
+]
+
+[vars]
+COOL = "ME"
+
+[[d1_databases]]
+binding = "D1"
+database_name = "<DATABASE_NAME>"
+database_id = "<unique-ID-for-your-database>"
+preview_database_id = "D1"
+
+[[d1_databases]]
+binding = "D1_PROD"
+database_name = "<DATABASE_NAME>"
+database_id = "<unique-ID-for-your-database>"
+preview_database_id = "D1_PROD"
+
+[[r2_buckets]]
+binding = 'R2'
+bucket_name = '<YOUR_BUCKET_NAME>'
+
+[[r2_buckets]]
+binding = 'R2_PROD'
+bucket_name = '<YOUR_BUCKET_NAME>'
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/.dev.vars b/packages/integrations/cloudflare/test/fixtures/astro-env/.dev.vars
new file mode 100644
index 000000000..3cf69c1f5
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/.dev.vars
@@ -0,0 +1 @@
+API_SECRET=123456789
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/astro.config.ts b/packages/integrations/cloudflare/test/fixtures/astro-env/astro.config.ts
new file mode 100644
index 000000000..b7d556b3b
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/astro.config.ts
@@ -0,0 +1,14 @@
+import cloudflare from '@astrojs/cloudflare';
+import { defineConfig, envField } from 'astro/config';
+
+export default defineConfig({
+ env: {
+ schema: {
+ API_URL: envField.string({ context: 'client', access: 'public', optional: true }),
+ PORT: envField.number({ context: 'server', access: 'public', default: 4321 }),
+ API_SECRET: envField.string({ context: 'server', access: 'secret' }),
+ },
+ },
+ adapter: cloudflare(),
+ output: 'server',
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/package.json b/packages/integrations/cloudflare/test/fixtures/astro-env/package.json
new file mode 100644
index 000000000..d726e88fd
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "@test/astro-cloudflare-astro-env",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "astro": "workspace:*"
+ },
+ "devDependencies": {
+ "wrangler": "^4.14.1"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/src/actions.ts b/packages/integrations/cloudflare/test/fixtures/astro-env/src/actions.ts
new file mode 100644
index 000000000..79d675a37
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/src/actions.ts
@@ -0,0 +1,12 @@
+import { defineAction } from "astro:actions";
+import { API_SECRET } from "astro:env/server";
+
+export const server = {
+ getSecret: defineAction({
+ handler(_input, _context) {
+ return {
+ secret: API_SECRET,
+ };
+ },
+ }),
+}; \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/astro-env/src/env.d.ts
new file mode 100644
index 000000000..60f5ec0d0
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/src/env.d.ts
@@ -0,0 +1,13 @@
+/// <reference path="../.astro/types.d.ts" />
+/// <reference path="../.astro/env.d.ts" />
+/// <reference types="astro/client" />
+
+type Runtime = import('@astrojs/cloudflare').Runtime;
+
+declare namespace App {
+ interface Locals extends Runtime {
+ otherLocals: {
+ test: string;
+ };
+ }
+} \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/src/middleware.ts b/packages/integrations/cloudflare/test/fixtures/astro-env/src/middleware.ts
new file mode 100644
index 000000000..e0985dc8f
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/src/middleware.ts
@@ -0,0 +1,9 @@
+import { defineMiddleware } from 'astro/middleware'
+import { API_SECRET } from 'astro:env/server'
+
+const secret = API_SECRET
+
+export const onRequest = defineMiddleware((_ctx, next) => {
+ console.log({ secret })
+ return next()
+}) \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/astro-env/src/pages/index.astro
new file mode 100644
index 000000000..7e50474ed
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/src/pages/index.astro
@@ -0,0 +1,27 @@
+---
+import { API_URL } from "astro:env/client"
+import { PORT, API_SECRET } from "astro:env/server"
+
+const runtime = Astro.locals.runtime;
+---
+<html>
+ <head>
+ <title>Astro Env</title>
+ </head>
+ <body>
+ <h1>Astro Env</h1>
+ <pre id="runtime">{JSON.stringify(runtime.env, null, 2)}</pre>
+ <div>
+ <span>API_URL</span>
+ <span id="client">{API_URL}</span>
+ </div>
+ <div>
+ <span>PORT</span>
+ <span id="server">{PORT}</span>
+ </div>
+ <div>
+ <span>API_SECRET</span>
+ <span id="secret">{API_SECRET}</span>
+ </div>
+ </body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/src/pages/test.astro b/packages/integrations/cloudflare/test/fixtures/astro-env/src/pages/test.astro
new file mode 100644
index 000000000..74e4223a7
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/src/pages/test.astro
@@ -0,0 +1,6 @@
+---
+import { actions } from "astro:actions";
+const { data } = await Astro.callAction(actions.getSecret, {});
+---
+
+<span id="secret">{data?.secret}</span> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/tsconfig.json b/packages/integrations/cloudflare/test/fixtures/astro-env/tsconfig.json
new file mode 100644
index 000000000..c02b48a37
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/tsconfig.json
@@ -0,0 +1,3 @@
+{
+ "extends": "astro/tsconfigs/strict"
+} \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/wrangler.toml b/packages/integrations/cloudflare/test/fixtures/astro-env/wrangler.toml
new file mode 100644
index 000000000..121ab5993
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/astro-env/wrangler.toml
@@ -0,0 +1,5 @@
+name = "astro-env"
+
+[vars]
+API_URL = "https://google.de"
+PORT = 4322
diff --git a/packages/integrations/cloudflare/test/fixtures/compile-image-service/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/compile-image-service/astro.config.mjs
new file mode 100644
index 000000000..7c98bbb98
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/compile-image-service/astro.config.mjs
@@ -0,0 +1,9 @@
+import cloudflare from '@astrojs/cloudflare';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: cloudflare({
+ imageService: 'compile',
+ }),
+ output: 'static',
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/compile-image-service/package.json b/packages/integrations/cloudflare/test/fixtures/compile-image-service/package.json
new file mode 100644
index 000000000..4dd1c0bb7
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/compile-image-service/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-cloudflare-compile-image-service",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/blog/post/index.md b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/blog/post/index.md
new file mode 100644
index 000000000..01654f3ea
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/blog/post/index.md
@@ -0,0 +1,5 @@
+---
+image: './placeholder.jpg'
+---
+
+![placeholder](./placeholder.jpg)
diff --git a/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/blog/post/placeholder.jpg b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/blog/post/placeholder.jpg
new file mode 100644
index 000000000..f4fc88e29
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/blog/post/placeholder.jpg
Binary files differ
diff --git a/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/config.ts b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/config.ts
new file mode 100644
index 000000000..ce06042f6
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/config.ts
@@ -0,0 +1,23 @@
+import type { ImageMetadata } from 'astro';
+import { defineCollection, z } from 'astro:content';
+
+const blog = defineCollection({
+ schema: ({ image }) =>
+ z.object({
+ image: z
+ .string()
+ .regex(/^https:.*/)
+ .transform(
+ (url) =>
+ ({
+ src: url,
+ width: 1200,
+ height: 630,
+ format: 'jpeg',
+ }) satisfies ImageMetadata
+ )
+ .or(image()),
+ }),
+});
+
+export const collections = { blog };
diff --git a/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/env.d.ts
new file mode 100644
index 000000000..9bc5cb41c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/env.d.ts
@@ -0,0 +1 @@
+/// <reference path="../.astro/types.d.ts" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/pages/blog/[...slug].astro b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/pages/blog/[...slug].astro
new file mode 100644
index 000000000..f5f8ed847
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/pages/blog/[...slug].astro
@@ -0,0 +1,34 @@
+---
+import { Image } from "astro:assets";
+import { getEntry, type CollectionEntry } from "astro:content";
+
+export const prerender = false;
+
+type Props = CollectionEntry<"blog">;
+
+const post = await getEntry("blog", Astro.params.slug!);
+if (!post) return Astro.rewrite("/404");
+
+const { Content } = await post.render();
+
+---
+
+<html lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width" />
+ <meta name="generator" content={Astro.generator} />
+ <title>Document</title>
+ </head>
+ <body>
+ <div class="aspect-video w-full overflow-hidden flex items-end rounded-lg">
+ <Image
+ class="aspect-[4/3] object-cover object-left w-full"
+ src={post.data.image}
+ alt=""
+ />
+ </div>
+
+ <Content />
+ </body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/external-image-service/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/external-image-service/astro.config.mjs
new file mode 100644
index 000000000..f8c5f63a7
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/external-image-service/astro.config.mjs
@@ -0,0 +1,9 @@
+import cloudflare from '@astrojs/cloudflare';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: cloudflare({
+ imageService: 'cloudflare',
+ }),
+ output: 'server',
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/external-image-service/package.json b/packages/integrations/cloudflare/test/fixtures/external-image-service/package.json
new file mode 100644
index 000000000..2b9646ed9
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/external-image-service/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-cloudflare-external-image-service",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/external-image-service/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/external-image-service/src/env.d.ts
new file mode 100644
index 000000000..9bc5cb41c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/external-image-service/src/env.d.ts
@@ -0,0 +1 @@
+/// <reference path="../.astro/types.d.ts" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/module-loader/astro.config.mjs
new file mode 100644
index 000000000..38365a374
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/astro.config.mjs
@@ -0,0 +1,7 @@
+import cloudflare from '@astrojs/cloudflare';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: cloudflare({}),
+ output: 'static'
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/package.json b/packages/integrations/cloudflare/test/fixtures/module-loader/package.json
new file mode 100644
index 000000000..4abd8513c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-cloudflare-wasm",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/module-loader/src/env.d.ts
new file mode 100644
index 000000000..9bc5cb41c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/env.d.ts
@@ -0,0 +1 @@
+/// <reference path="../.astro/types.d.ts" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/add/[a]/[b].ts b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/add/[a]/[b].ts
new file mode 100644
index 000000000..0f09faa0a
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/add/[a]/[b].ts
@@ -0,0 +1,20 @@
+import { type APIContext } from 'astro';
+// @ts-ignore
+import mod from '../../../util/add.wasm?module';
+
+const addModule: any = new WebAssembly.Instance(mod);
+
+export const prerender = false;
+
+export async function GET(
+ context: APIContext
+): Promise<Response> {
+ const a = Number.parseInt(context.params.a!);
+ const b = Number.parseInt(context.params.b!);
+ return new Response(JSON.stringify({ answer: addModule.exports.add(a, b) }), {
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/bin.ts b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/bin.ts
new file mode 100644
index 000000000..a4e097782
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/bin.ts
@@ -0,0 +1,16 @@
+import { type APIContext } from 'astro';
+
+import data from '../util/file.bin';
+
+export const prerender = false;
+
+export async function GET(
+ context: APIContext
+): Promise<Response> {
+ return new Response(data, {
+ status: 200,
+ headers: {
+ 'Content-Type': 'binary/octet-stream',
+ },
+ });
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/compound.ts b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/compound.ts
new file mode 100644
index 000000000..9dde18380
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/compound.ts
@@ -0,0 +1,17 @@
+
+import { type APIContext } from 'astro';
+
+import text from '../util/file.1.md.txt';
+
+export const prerender = false;
+
+export async function GET(
+ context: APIContext
+): Promise<Response> {
+ return new Response(text, {
+ status: 200,
+ headers: {
+ 'Content-Type': 'text/plain; charset=utf-8',
+ },
+ });
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/hybrid.ts b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/hybrid.ts
new file mode 100644
index 000000000..14d3d0fbe
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/hybrid.ts
@@ -0,0 +1,16 @@
+import { type APIContext } from 'astro';
+// @ts-ignore
+import mod from '../util/add.wasm';
+
+const addModule: any = new WebAssembly.Instance(mod);
+
+export async function GET(
+ context: APIContext
+): Promise<Response> {
+ return new Response(JSON.stringify({ answer: addModule.exports.add(20, 1) }), {
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/hybridshared.ts b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/hybridshared.ts
new file mode 100644
index 000000000..ea04408f7
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/hybridshared.ts
@@ -0,0 +1,16 @@
+import { type APIContext } from 'astro';
+
+import {add} from '../util/add';
+
+export const prerender = true
+
+export async function GET(
+ context: APIContext
+): Promise<Response> {
+ return new Response(JSON.stringify({ answer: add(20, 1) }), {
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/shared/[a]/[b].ts b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/shared/[a]/[b].ts
new file mode 100644
index 000000000..9a8283d85
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/shared/[a]/[b].ts
@@ -0,0 +1,18 @@
+import { type APIContext } from 'astro';
+import { add } from '../../../util/add';
+
+
+export const prerender = false;
+
+export async function GET(
+ context: APIContext
+): Promise<Response> {
+ const a = Number.parseInt(context.params.a ?? "0");
+ const b = Number.parseInt(context.params.b ?? "0");
+ return new Response(JSON.stringify({ answer: add(a, b) }), {
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/text.ts b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/text.ts
new file mode 100644
index 000000000..7306a5b06
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/pages/text.ts
@@ -0,0 +1,16 @@
+import { type APIContext } from 'astro';
+
+import text from '../util/file.txt';
+
+export const prerender = false;
+
+export async function GET(
+ context: APIContext
+): Promise<Response> {
+ return new Response(text, {
+ status: 200,
+ headers: {
+ 'Content-Type': 'text/plain; charset=utf-8',
+ },
+ });
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/add.ts b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/add.ts
new file mode 100644
index 000000000..ccdb73103
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/add.ts
@@ -0,0 +1,8 @@
+import mod from './add.wasm';
+
+
+const addModule: any = new WebAssembly.Instance(mod);
+
+export function add(a, b) {
+ return addModule.exports.add(a, b);
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/add.wasm b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/add.wasm
new file mode 100644
index 000000000..357f72da7
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/add.wasm
Binary files differ
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.1.md.txt b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.1.md.txt
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.1.md.txt
@@ -0,0 +1 @@
+Hello
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.bin b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.bin
new file mode 100644
index 000000000..b0ecc2680
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.bin
Binary files differ
diff --git a/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.txt b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.txt
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.txt
@@ -0,0 +1 @@
+Hello
diff --git a/packages/integrations/cloudflare/test/fixtures/no-output/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/no-output/astro.config.mjs
new file mode 100644
index 000000000..f445bcd48
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/no-output/astro.config.mjs
@@ -0,0 +1,6 @@
+import cloudflare from '@astrojs/cloudflare';
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ adapter: cloudflare()
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/no-output/package.json b/packages/integrations/cloudflare/test/fixtures/no-output/package.json
new file mode 100644
index 000000000..569c30890
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/no-output/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-cloudflare-no-output",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/routes-json/astro.config.mjs
new file mode 100644
index 000000000..3aaa37d9a
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/astro.config.mjs
@@ -0,0 +1,8 @@
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ output: 'static',
+ redirects: {
+ '/a/redirect': '/',
+ },
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/package.json b/packages/integrations/cloudflare/test/fixtures/routes-json/package.json
new file mode 100644
index 000000000..4ff746f02
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-cloudflare-routes-json",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/public/_redirects b/packages/integrations/cloudflare/test/fixtures/routes-json/public/_redirects
new file mode 100644
index 000000000..14e38c465
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/public/_redirects
@@ -0,0 +1 @@
+/redirectme / 302
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/public/public.txt b/packages/integrations/cloudflare/test/fixtures/routes-json/public/public.txt
new file mode 100644
index 000000000..9766475a4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/public/public.txt
@@ -0,0 +1 @@
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/env.d.ts b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/env.d.ts
new file mode 100644
index 000000000..2da76ba24
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/env.d.ts
@@ -0,0 +1,2 @@
+/// <reference path="../../.astro/types.d.ts" />
+/// <reference types="astro/client" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic1.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic1.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic1.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic2.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic2.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic2.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic3.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic3.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/dynamic3.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/index.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/dynamicOnly/pages/index.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/env.d.ts b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/env.d.ts
new file mode 100644
index 000000000..4e6b85c4a
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/env.d.ts
@@ -0,0 +1 @@
+/// <reference path="../../.astro/types.d.ts" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/pages/[id].astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/pages/[id].astro
new file mode 100644
index 000000000..1931fc8a6
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/pages/[id].astro
@@ -0,0 +1,16 @@
+---
+import type { GetStaticPaths } from "astro";
+
+export const getStaticPaths = (() => {
+
+ return Array.from({length:100}).map((_, i) => ({
+ params: {
+ id: i.toString()
+ }
+ }));
+}) satisfies GetStaticPaths;
+
+const { id } = Astro.params;
+---
+
+id={id}
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/pages/dynamic.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/pages/dynamic.astro
new file mode 100644
index 000000000..13502d70c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStatic/pages/dynamic.astro
@@ -0,0 +1,5 @@
+---
+export const prerender = false;
+---
+
+dynamic
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/env.d.ts b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/env.d.ts
new file mode 100644
index 000000000..4e6b85c4a
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/env.d.ts
@@ -0,0 +1 @@
+/// <reference path="../../.astro/types.d.ts" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/404.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/404.astro
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/404.astro
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/[id].astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/[id].astro
new file mode 100644
index 000000000..1931fc8a6
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/[id].astro
@@ -0,0 +1,16 @@
+---
+import type { GetStaticPaths } from "astro";
+
+export const getStaticPaths = (() => {
+
+ return Array.from({length:100}).map((_, i) => ({
+ params: {
+ id: i.toString()
+ }
+ }));
+}) satisfies GetStaticPaths;
+
+const { id } = Astro.params;
+---
+
+id={id}
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/dynamic.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/dynamic.astro
new file mode 100644
index 000000000..13502d70c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/manyStaticWith404/pages/dynamic.astro
@@ -0,0 +1,5 @@
+---
+export const prerender = false;
+---
+
+dynamic
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/env.d.ts b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/env.d.ts
new file mode 100644
index 000000000..1fc1db459
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/env.d.ts
@@ -0,0 +1,2 @@
+/// <reference path="../../.astro/types.d.ts" />
+/// <reference types="astro/client" />
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/404.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/404.astro
new file mode 100644
index 000000000..42af67a78
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/404.astro
@@ -0,0 +1,3 @@
+---
+export const prerender = true;
+---
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/[...rest].astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/[...rest].astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/[...rest].astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/[id].astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/[id].astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/[id].astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/endpoint.ts b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/endpoint.ts
new file mode 100644
index 000000000..d43d0cd2a
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/endpoint.ts
@@ -0,0 +1 @@
+export const prerender = false;
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/index.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/index.astro
new file mode 100644
index 000000000..9766475a4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/a/index.astro
@@ -0,0 +1 @@
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/b/index.html b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/b/index.html
new file mode 100644
index 000000000..9766475a4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/mixed/pages/b/index.html
@@ -0,0 +1 @@
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/env.d.ts b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/env.d.ts
new file mode 100644
index 000000000..2da76ba24
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/env.d.ts
@@ -0,0 +1,2 @@
+/// <reference path="../../.astro/types.d.ts" />
+/// <reference types="astro/client" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/404.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/404.astro
new file mode 100644
index 000000000..42af67a78
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/404.astro
@@ -0,0 +1,3 @@
+---
+export const prerender = true;
+---
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic1.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic1.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic1.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic2.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic2.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic2.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic3.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic3.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/dynamicPages/dynamic3.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/index.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/index.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/dynamic.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/dynamic.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/dynamic.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/static.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/static.astro
new file mode 100644
index 000000000..d5683c216
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/static.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=true;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/subfolder/dynamic.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/subfolder/dynamic.astro
new file mode 100644
index 000000000..9a2306b86
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/subfolder/dynamic.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=false;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/subfolder/static.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/subfolder/static.astro
new file mode 100644
index 000000000..d5683c216
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/mixedPages/subfolder/static.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=true;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static1.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static1.astro
new file mode 100644
index 000000000..d5683c216
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static1.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=true;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static2.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static2.astro
new file mode 100644
index 000000000..d5683c216
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static2.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=true;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static3.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static3.astro
new file mode 100644
index 000000000..d5683c216
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/reduceComplexity/pages/staticPages/static3.astro
@@ -0,0 +1,5 @@
+---
+export const prerender=true;
+---
+
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/env.d.ts b/packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/env.d.ts
new file mode 100644
index 000000000..2da76ba24
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/env.d.ts
@@ -0,0 +1,2 @@
+/// <reference path="../../.astro/types.d.ts" />
+/// <reference types="astro/client" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/pages/404.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/pages/404.astro
new file mode 100644
index 000000000..42af67a78
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/pages/404.astro
@@ -0,0 +1,3 @@
+---
+export const prerender = true;
+---
diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/pages/index.astro
new file mode 100644
index 000000000..9766475a4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/routes-json/src/staticOnly/pages/index.astro
@@ -0,0 +1 @@
+ok
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/sessions/astro.config.mjs
new file mode 100644
index 000000000..b5f6fc107
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/astro.config.mjs
@@ -0,0 +1,12 @@
+// @ts-check
+import { defineConfig } from 'astro/config';
+import cloudflare from '@astrojs/cloudflare';
+export default defineConfig({
+ output: 'server',
+ site: `http://example.com`,
+ adapter: cloudflare({
+ platformProxy: {
+ enabled: true,
+ },
+ }),
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/package.json b/packages/integrations/cloudflare/test/fixtures/sessions/package.json
new file mode 100644
index 000000000..0b868065b
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "@test/astro-cloudflare-sessions",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*"
+ },
+ "devDependencies": {
+ "astro": "workspace:*",
+ "wrangler": "^4.14.1"
+ },
+ "scripts": {
+ "build": "astro build",
+ "preview": "astro build && wrangler dev",
+ "start": "astro dev"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/src/actions/index.ts b/packages/integrations/cloudflare/test/fixtures/sessions/src/actions/index.ts
new file mode 100644
index 000000000..856f68ba8
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/src/actions/index.ts
@@ -0,0 +1,36 @@
+import { defineAction } from 'astro:actions';
+import { z } from 'astro:schema';
+
+export const server = {
+ addToCart: defineAction({
+ accept: 'form',
+ input: z.object({ productId: z.string() }),
+ handler: async (input, context) => {
+ const cart: Array<string> = (await context.session.get('cart')) || [];
+ cart.push(input.productId);
+ await context.session.set('cart', cart);
+ return { cart, message: 'Product added to cart at ' + new Date().toTimeString() };
+ },
+ }),
+ getCart: defineAction({
+ handler: async (input, context) => {
+ return await context.session.get('cart');
+ },
+ }),
+ clearCart: defineAction({
+ accept: 'json',
+ handler: async (input, context) => {
+ await context.session.set('cart', []);
+ return { cart: [], message: 'Cart cleared at ' + new Date().toTimeString() };
+ },
+ }),
+ addUrl: defineAction({
+ input: z.object({ favoriteUrl: z.string().url() }),
+ handler: async (input, context) => {
+ const previousFavoriteUrl = await context.session.get<URL>('favoriteUrl');
+ const url = new URL(input.favoriteUrl);
+ context.session.set('favoriteUrl', url);
+ return { message: 'Favorite URL set to ' + url.href + ' from ' + (previousFavoriteUrl?.href ?? "nothing") };
+ }
+ })
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/src/middleware.ts b/packages/integrations/cloudflare/test/fixtures/sessions/src/middleware.ts
new file mode 100644
index 000000000..7f56f11f3
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/src/middleware.ts
@@ -0,0 +1,49 @@
+import { defineMiddleware } from 'astro:middleware';
+import { getActionContext } from 'astro:actions';
+
+const ACTION_SESSION_KEY = 'actionResult'
+
+export const onRequest = defineMiddleware(async (context, next) => {
+ // Skip requests for prerendered pages
+ if (context.isPrerendered) return next();
+
+ const { action, setActionResult, serializeActionResult } =
+ getActionContext(context);
+
+ console.log(action?.name)
+
+ const actionPayload = await context.session.get(ACTION_SESSION_KEY);
+
+ if (actionPayload) {
+ setActionResult(actionPayload.actionName, actionPayload.actionResult);
+ context.session.delete(ACTION_SESSION_KEY);
+ return next();
+ }
+
+ // If an action was called from an HTML form action,
+ // call the action handler and redirect to the destination page
+ if (action?.calledFrom === "form") {
+ const actionResult = await action.handler();
+
+ context.session.set(ACTION_SESSION_KEY, {
+ actionName: action.name,
+ actionResult: serializeActionResult(actionResult),
+ });
+
+
+ // Redirect back to the previous page on error
+ if (actionResult.error) {
+ const referer = context.request.headers.get("Referer");
+ if (!referer) {
+ throw new Error(
+ "Internal: Referer unexpectedly missing from Action POST request.",
+ );
+ }
+ return context.redirect(referer);
+ }
+ // Redirect to the destination page on success
+ return context.redirect(context.originPathname);
+ }
+
+ return next();
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/api.ts b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/api.ts
new file mode 100644
index 000000000..21793c78a
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/api.ts
@@ -0,0 +1,13 @@
+import type { APIRoute } from 'astro';
+
+export const GET: APIRoute = async (context) => {
+ const url = new URL(context.url, 'http://localhost');
+ let value = url.searchParams.get('set');
+ if (value) {
+ context.session.set('value', value);
+ } else {
+ value = await context.session.get('value');
+ }
+ const cart = await context.session.get('cart');
+ return Response.json({ value, cart });
+};
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/cart.astro b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/cart.astro
new file mode 100644
index 000000000..e69a9e5e1
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/cart.astro
@@ -0,0 +1,24 @@
+---
+import { actions } from "astro:actions";
+
+const result = Astro.getActionResult(actions.addToCart);
+
+const cart = result?.data?.cart ?? await Astro.session.get('cart');
+const message = result?.data?.message ?? 'Add something to your cart!';
+---
+<p>Cart: <span id="cart">{JSON.stringify(cart)}</span></p>
+<p id="message">{message}</p>
+<form action={actions.addToCart} method="POST">
+ <input type="text" name="productId" value="shoe" />
+ <button type="submit">Add to Cart</button>
+</form>
+<input type="button" value="Clear Cart" id="clearCart" />
+<script>
+ import { actions } from "astro:actions";
+ async function clearCart() {
+ const result = await actions.clearCart({});
+ document.getElementById('cart').textContent = JSON.stringify(result.data.cart);
+ document.getElementById('message').textContent = result.data.message;
+ }
+ document.getElementById('clearCart').addEventListener('click', clearCart);
+</script>
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/destroy.ts b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/destroy.ts
new file mode 100644
index 000000000..e83f6e4b6
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/destroy.ts
@@ -0,0 +1,6 @@
+import type { APIRoute } from 'astro';
+
+export const GET: APIRoute = async (context) => {
+ await context.session.destroy();
+ return Response.json({});
+};
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/index.astro
new file mode 100644
index 000000000..30d6a1618
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/index.astro
@@ -0,0 +1,13 @@
+---
+const value = await Astro.session.get('value');
+---
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <title>Hi</title>
+</head>
+
+<h1>Hi</h1>
+<p>{value}</p>
+<a href="/cart" style="font-size: 36px">🛒</a>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/regenerate.ts b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/regenerate.ts
new file mode 100644
index 000000000..6f2240588
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/regenerate.ts
@@ -0,0 +1,6 @@
+import type { APIRoute } from 'astro';
+
+export const GET: APIRoute = async (context) => {
+ await context.session.regenerate();
+ return Response.json({});
+};
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/update.ts b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/update.ts
new file mode 100644
index 000000000..71b058e75
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/src/pages/update.ts
@@ -0,0 +1,10 @@
+import type { APIRoute } from 'astro';
+
+export const GET: APIRoute = async (context) => {
+ const previousObject = await context.session.get("key") ?? { value: "none" };
+ const previousValue = previousObject.value;
+ const sessionData = { value: "expected" };
+ context.session.set("key", sessionData);
+ sessionData.value = "unexpected";
+ return Response.json({previousValue});
+};
diff --git a/packages/integrations/cloudflare/test/fixtures/sessions/wrangler.json b/packages/integrations/cloudflare/test/fixtures/sessions/wrangler.json
new file mode 100644
index 000000000..479d56c32
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/sessions/wrangler.json
@@ -0,0 +1,22 @@
+{
+ "name": "astro-cf-session",
+ "compatibility_date": "2024-11-01",
+ "compatibility_flags": [
+ "nodejs_compat"
+ ],
+ "main": "./dist/_worker.js/index.js",
+ "assets": {
+ "directory": "./dist",
+ "binding": "ASSETS"
+ },
+ "observability": {
+ "enabled": true
+ },
+ "kv_namespaces": [
+ {
+ "binding": "SESSION",
+ "id": "<SESSION_ID>"
+ }
+ ],
+ "upload_source_maps": true
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/with-base/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/with-base/astro.config.mjs
new file mode 100644
index 000000000..04fce6d57
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-base/astro.config.mjs
@@ -0,0 +1,12 @@
+// @ts-check
+import { defineConfig } from 'astro/config';
+import cloudflare from '@astrojs/cloudflare';
+
+export default defineConfig({
+ base: '/blog/',
+ output: 'server',
+ adapter: cloudflare(),
+ redirects: {
+ '/a/redirect': '/',
+ },
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/with-base/package.json b/packages/integrations/cloudflare/test/fixtures/with-base/package.json
new file mode 100644
index 000000000..66f76081a
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-base/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-cloudflare-with-base",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/with-base/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/with-base/src/pages/index.astro
new file mode 100644
index 000000000..530b283a1
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-base/src/pages/index.astro
@@ -0,0 +1,4 @@
+---
+export const prerender = false;
+---
+<h1>Hello</h1>
diff --git a/packages/integrations/cloudflare/test/fixtures/with-base/src/pages/static.astro b/packages/integrations/cloudflare/test/fixtures/with-base/src/pages/static.astro
new file mode 100644
index 000000000..677d2ccfc
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-base/src/pages/static.astro
@@ -0,0 +1,4 @@
+---
+export const prerender = true;
+---
+<h1>Hello</h1>
diff --git a/packages/integrations/cloudflare/test/fixtures/with-solid-js/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/with-solid-js/astro.config.mjs
new file mode 100644
index 000000000..b4358ad99
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-solid-js/astro.config.mjs
@@ -0,0 +1,9 @@
+import cloudflare from '@astrojs/cloudflare';
+import solidJs from "@astrojs/solid-js";
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ integrations: [solidJs()],
+ adapter: cloudflare(),
+ output: 'server',
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json b/packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json
new file mode 100644
index 000000000..13f057af3
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "@test/astro-cloudflare-with-solid-js",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "@astrojs/solid-js": "^5.0.10",
+ "astro": "workspace:*",
+ "solid-js": "^1.9.6"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/with-solid-js/src/components/Component.tsx b/packages/integrations/cloudflare/test/fixtures/with-solid-js/src/components/Component.tsx
new file mode 100644
index 000000000..d223d4f1c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-solid-js/src/components/Component.tsx
@@ -0,0 +1 @@
+export const Component = () => <div class="solid">Solid Content</div>
diff --git a/packages/integrations/cloudflare/test/fixtures/with-solid-js/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/with-solid-js/src/env.d.ts
new file mode 100644
index 000000000..9bc5cb41c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-solid-js/src/env.d.ts
@@ -0,0 +1 @@
+/// <reference path="../.astro/types.d.ts" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/with-solid-js/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/with-solid-js/src/pages/index.astro
new file mode 100644
index 000000000..f185a95d3
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-solid-js/src/pages/index.astro
@@ -0,0 +1,13 @@
+---
+import {Component} from "../components/Component";
+---
+
+<html>
+<head>
+ <title>Testing</title>
+</head>
+<body>
+<h1>Testing</h1>
+<Component />
+</body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/with-svelte/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/with-svelte/astro.config.mjs
new file mode 100644
index 000000000..a98a7eade
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-svelte/astro.config.mjs
@@ -0,0 +1,9 @@
+import cloudflare from '@astrojs/cloudflare';
+import svelte from "@astrojs/svelte";
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ integrations: [svelte()],
+ adapter: cloudflare(),
+ output: 'server',
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/with-svelte/package.json b/packages/integrations/cloudflare/test/fixtures/with-svelte/package.json
new file mode 100644
index 000000000..8a7bc1185
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-svelte/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "@test/astro-cloudflare-with-svelte",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "@astrojs/svelte": "^7.0.13",
+ "astro": "workspace:*",
+ "svelte": "^5.28.2"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/with-svelte/src/components/Component.svelte b/packages/integrations/cloudflare/test/fixtures/with-svelte/src/components/Component.svelte
new file mode 100644
index 000000000..a8a85aeb4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-svelte/src/components/Component.svelte
@@ -0,0 +1 @@
+<div class="svelte">Svelte Content</div>
diff --git a/packages/integrations/cloudflare/test/fixtures/with-svelte/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/with-svelte/src/pages/index.astro
new file mode 100644
index 000000000..dc3e227d3
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-svelte/src/pages/index.astro
@@ -0,0 +1,13 @@
+---
+import Component from '../components/Component.svelte';
+---
+
+<html>
+<head>
+ <title>Testing</title>
+</head>
+<body>
+<h1>Testing</h1>
+<Component />
+</body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/with-vue/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/with-vue/astro.config.mjs
new file mode 100644
index 000000000..4a4fbd8a4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-vue/astro.config.mjs
@@ -0,0 +1,9 @@
+import cloudflare from '@astrojs/cloudflare';
+import vue from "@astrojs/vue";
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ integrations: [vue()],
+ adapter: cloudflare(),
+ output: 'server',
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/with-vue/package.json b/packages/integrations/cloudflare/test/fixtures/with-vue/package.json
new file mode 100644
index 000000000..74451144c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-vue/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "@test/astro-cloudflare-with-vue",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "@astrojs/vue": "^5.0.13",
+ "astro": "workspace:*",
+ "vue": "^3.5.13"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/with-vue/src/components/Component.vue b/packages/integrations/cloudflare/test/fixtures/with-vue/src/components/Component.vue
new file mode 100644
index 000000000..70630a9a4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-vue/src/components/Component.vue
@@ -0,0 +1,3 @@
+<template>
+ <div class="vue">Vue Content</div>
+</template>
diff --git a/packages/integrations/cloudflare/test/fixtures/with-vue/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/with-vue/src/pages/index.astro
new file mode 100644
index 000000000..fc04d52ac
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/with-vue/src/pages/index.astro
@@ -0,0 +1,13 @@
+---
+import Component from '../components/Component.vue';
+---
+
+<html>
+<head>
+ <title>Testing</title>
+</head>
+<body>
+<h1>Testing</h1>
+<Component />
+</body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/.dev.vars b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/.dev.vars
new file mode 100644
index 000000000..9296c384b
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/.dev.vars
@@ -0,0 +1 @@
+DATABASE_URL="postgresql://lorem"
diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/astro.config.mjs
new file mode 100644
index 000000000..238964217
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/astro.config.mjs
@@ -0,0 +1,8 @@
+import cloudflare from '@astrojs/cloudflare';
+import { defineConfig } from 'astro/config';
+
+
+export default defineConfig({
+ adapter: cloudflare(),
+ output: 'server',
+});
diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/package.json b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/package.json
new file mode 100644
index 000000000..25ab99120
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/astro-cloudflare-wrangler-preview-platform",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/cloudflare": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/src/env.d.ts
new file mode 100644
index 000000000..9bc5cb41c
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/src/env.d.ts
@@ -0,0 +1 @@
+/// <reference path="../.astro/types.d.ts" /> \ No newline at end of file
diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/src/pages/index.astro
new file mode 100644
index 000000000..8a3b20925
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/src/pages/index.astro
@@ -0,0 +1,15 @@
+---
+const runtime = Astro.locals.runtime;
+---
+<html>
+ <head>
+ <title>Testing</title>
+ </head>
+ <body>
+ <h1>Testing</h1>
+ <div id="hasRuntime">{!!runtime}</div>
+ <div id="hasENV">{!!runtime.env?.COOL}</div>
+ <div id="hasCF">{!!runtime.cf?.colo}</div>
+ <div id="hasCACHES">{!!runtime.caches}</div>
+ </body>
+</html>
diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/wrangler.toml b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/wrangler.toml
new file mode 100644
index 000000000..ba0fa64c4
--- /dev/null
+++ b/packages/integrations/cloudflare/test/fixtures/wrangler-preview-platform/wrangler.toml
@@ -0,0 +1,4 @@
+name = "test"
+
+[vars]
+COOL = "ME"
diff --git a/packages/integrations/cloudflare/test/module-loader.test.js b/packages/integrations/cloudflare/test/module-loader.test.js
new file mode 100644
index 000000000..a455ccdec
--- /dev/null
+++ b/packages/integrations/cloudflare/test/module-loader.test.js
@@ -0,0 +1,72 @@
+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';
+
+const root = new URL('./fixtures/module-loader/', import.meta.url);
+
+describe('CloudflareModuleLoading', () => {
+ let wrangler;
+ before(async () => {
+ await astroCli(fileURLToPath(root), 'build');
+
+ 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());
+ });
+ });
+ });
+
+ after((_done) => {
+ wrangler.kill();
+ });
+
+ it('can render server side', async () => {
+ const res = await fetch('http://127.0.0.1:8788/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');
+ 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');
+ 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');
+ 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');
+ 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');
+ 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');
+ 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
new file mode 100644
index 000000000..547739fea
--- /dev/null
+++ b/packages/integrations/cloudflare/test/routes-json.test.js
@@ -0,0 +1,347 @@
+import * as assert from 'node:assert/strict';
+import { before, describe, it } from 'node:test';
+import cloudflare from '../dist/index.js';
+import { loadFixture } from './_test-utils.js';
+
+describe('_routes.json generation', () => {
+ describe('of on-demand and prerenderd', () => {
+ /** @type {import('../../../astro/test/test-utils').Fixture} */
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
+ srcDir: './src/mixed',
+ adapter: cloudflare({}),
+ });
+ await fixture.build();
+ });
+
+ it('creates `include` for on-demand and `exclude` for prerenderd', async () => {
+ const _routesJson = await fixture.readFile('/_routes.json');
+ const routes = JSON.parse(_routesJson);
+
+ assert.deepEqual(routes, {
+ version: 1,
+ include: ['/_server-islands/*', '/_image', '/a/*'],
+ exclude: ['/_astro/*', '/redirectme', '/public.txt', '/a', '/a/redirect', '/404', '/b'],
+ });
+ });
+ });
+
+ describe('of only on-demand', () => {
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
+ srcDir: './src/dynamicOnly',
+ adapter: cloudflare({}),
+ });
+ await fixture.build();
+ });
+
+ it('creates a wildcard `include` and `exclude` only for static assets and redirects', async () => {
+ const _routesJson = await fixture.readFile('/_routes.json');
+ const routes = JSON.parse(_routesJson);
+
+ assert.deepEqual(routes, {
+ version: 1,
+ include: ['/*'],
+ exclude: ['/_astro/*', '/redirectme', '/public.txt', '/a/*'],
+ });
+ });
+ });
+
+ describe('of only prerenderd', () => {
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
+ srcDir: './src/staticOnly',
+ adapter: cloudflare({}),
+ });
+ await fixture.build();
+ });
+
+ it(
+ 'create only one `include` and `exclude` that are supposed to match nothing',
+ { todo: 'Review test, because the expectation is to have empty include and exclude.' },
+ async () => {
+ const _routesJson = await fixture.readFile('/_routes.json');
+ const routes = JSON.parse(_routesJson);
+
+ assert.deepEqual(routes, {
+ version: 1,
+ include: ['/_server-islands/*'],
+ exclude: ['/', '/_astro/*', '/redirectme', '/public.txt', '/a/*', '/404'],
+ });
+ },
+ );
+ });
+
+ describe('with additional `include` entries', () => {
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
+ srcDir: './src/mixed',
+ adapter: cloudflare({
+ routes: {
+ extend: {
+ include: [{ pattern: '/another' }],
+ },
+ },
+ }),
+ });
+ await fixture.build();
+ });
+
+ it('creates `include` for functions and `exclude` for static files where needed', async () => {
+ const _routesJson = await fixture.readFile('/_routes.json');
+ const routes = JSON.parse(_routesJson);
+
+ assert.deepEqual(routes, {
+ version: 1,
+ include: ['/_server-islands/*', '/_image', '/a/*', '/another'],
+ exclude: ['/_astro/*', '/redirectme', '/public.txt', '/a', '/a/redirect', '/404', '/b'],
+ });
+ });
+ });
+
+ describe('with additional `exclude` entries', () => {
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
+ srcDir: './src/mixed',
+ adapter: cloudflare({
+ routes: {
+ extend: {
+ exclude: [{ pattern: '/another' }, { pattern: '/a/index.html' }],
+ },
+ },
+ }),
+ });
+ await fixture.build();
+ });
+
+ it('creates `include` for functions and `exclude` for static files where needed', async () => {
+ const _routesJson = await fixture.readFile('/_routes.json');
+ const routes = JSON.parse(_routesJson);
+
+ assert.deepEqual(routes, {
+ version: 1,
+ include: ['/_server-islands/*', '/_image', '/a/*'],
+ exclude: [
+ '/_astro/*',
+ '/redirectme',
+ '/public.txt',
+ '/a',
+ '/a/redirect',
+ '/404',
+ '/b',
+ '/another',
+ '/a/index.html',
+ ],
+ });
+ });
+ });
+
+ describe('with nested on demand and prerendered routes', () => {
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
+ srcDir: './src/reduceComplexity',
+ adapter: cloudflare({}),
+ });
+ await fixture.build();
+ });
+
+ it('reduces the amount of include and exclude entries by applying wildcards wherever possible', async () => {
+ const _routesJson = await fixture.readFile('/_routes.json');
+ const routes = JSON.parse(_routesJson);
+
+ assert.deepEqual(routes, {
+ version: 1,
+ include: [
+ '/',
+ '/_server-islands/*',
+ '/_image',
+ '/dynamicPages/*',
+ '/mixedPages/dynamic',
+ '/mixedPages/subfolder/dynamic',
+ ],
+ exclude: [
+ '/_astro/*',
+ '/redirectme',
+ '/public.txt',
+ '/a/*',
+ '/404',
+ '/mixedPages/static',
+ '/mixedPages/subfolder/static',
+ '/staticPages/*',
+ ],
+ });
+ });
+ });
+
+ describe('with many static files', () => {
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
+ srcDir: './src/manyStatic',
+ adapter: cloudflare({}),
+ });
+ await fixture.build();
+ });
+
+ it('creates a wildcard `include` and `exclude` for as many static assets and redirects as possible, truncating after 100 rules', async () => {
+ const _routesJson = await fixture.readFile('/_routes.json');
+ const routes = JSON.parse(_routesJson);
+
+ assert.deepEqual(routes, {
+ version: 1,
+ include: ['/*'],
+ exclude: [
+ '/_astro/*',
+ '/redirectme',
+ '/public.txt',
+ '/a/*',
+ ...Array.from({ length: 95 }, (_, i) => `/${i}`),
+ ],
+ });
+ });
+ });
+
+ describe('with many static files when a static 404 is present', () => {
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
+ srcDir: './src/manyStaticWith404',
+ adapter: cloudflare({}),
+ });
+ await fixture.build();
+ });
+
+ it('creates `include` for on-demand and `exclude` that are supposed to match nothing', async () => {
+ const _routesJson = await fixture.readFile('/_routes.json');
+ const routes = JSON.parse(_routesJson);
+
+ assert.deepEqual(routes, {
+ version: 1,
+ include: ['/*'],
+ exclude: [
+ '/_astro/*',
+ '/redirectme',
+ '/public.txt',
+ '/a/*',
+ '/404',
+ '/0',
+ '/1',
+ '/2',
+ '/3',
+ '/4',
+ '/5',
+ '/6',
+ '/7',
+ '/8',
+ '/9',
+ '/10',
+ '/11',
+ '/12',
+ '/13',
+ '/14',
+ '/15',
+ '/16',
+ '/17',
+ '/18',
+ '/19',
+ '/20',
+ '/21',
+ '/22',
+ '/23',
+ '/24',
+ '/25',
+ '/26',
+ '/27',
+ '/28',
+ '/29',
+ '/30',
+ '/31',
+ '/32',
+ '/33',
+ '/34',
+ '/35',
+ '/36',
+ '/37',
+ '/38',
+ '/39',
+ '/40',
+ '/41',
+ '/42',
+ '/43',
+ '/44',
+ '/45',
+ '/46',
+ '/47',
+ '/48',
+ '/49',
+ '/50',
+ '/51',
+ '/52',
+ '/53',
+ '/54',
+ '/55',
+ '/56',
+ '/57',
+ '/58',
+ '/59',
+ '/60',
+ '/61',
+ '/62',
+ '/63',
+ '/64',
+ '/65',
+ '/66',
+ '/67',
+ '/68',
+ '/69',
+ '/70',
+ '/71',
+ '/72',
+ '/73',
+ '/74',
+ '/75',
+ '/76',
+ '/77',
+ '/78',
+ '/79',
+ '/80',
+ '/81',
+ '/82',
+ '/83',
+ '/84',
+ '/85',
+ '/86',
+ '/87',
+ '/88',
+ '/89',
+ '/90',
+ '/91',
+ '/92',
+ '/93',
+ ],
+ });
+ });
+ });
+});
diff --git a/packages/integrations/cloudflare/test/sessions.test.js b/packages/integrations/cloudflare/test/sessions.test.js
new file mode 100644
index 000000000..d8c187425
--- /dev/null
+++ b/packages/integrations/cloudflare/test/sessions.test.js
@@ -0,0 +1,93 @@
+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 { astroCli, wranglerCli } from './_test-utils.js';
+
+const root = new URL('./fixtures/sessions/', import.meta.url);
+
+describe('astro:env', () => {
+ let wrangler;
+
+ before(async () => {
+ await astroCli(fileURLToPath(root), 'build');
+
+ 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());
+ });
+ });
+ });
+
+ after(() => {
+ wrangler.kill();
+ });
+
+ it('can regenerate session cookies upon request', async () => {
+ const firstResponse = await fetch('http://127.0.0.1:8788/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', {
+ method: 'GET',
+ headers: {
+ cookie: `astro-session=${firstSessionId}`,
+ },
+ });
+ const secondHeaders = secondResponse.headers.get('set-cookie').split(',');
+ const secondSessionId = secondHeaders[0].split(';')[0].split('=')[1];
+ assert.notEqual(firstSessionId, secondSessionId);
+ });
+
+ it('can save session data by value', async () => {
+ const firstResponse = await fetch('http://127.0.0.1:8788/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', {
+ method: 'GET',
+ headers: {
+ cookie: `astro-session=${firstSessionId}`,
+ },
+ });
+ const secondValue = await secondResponse.json();
+ assert.equal(secondValue.previousValue, 'expected');
+ });
+
+ it('can save and restore URLs in session data', async () => {
+ const firstResponse = await fetch('http://127.0.0.1:8788/_actions/addUrl', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ favoriteUrl: 'https://domain.invalid' }),
+ });
+
+ assert.equal(firstResponse.ok, true);
+ const firstHeaders = firstResponse.headers.get('set-cookie').split(',');
+ const firstSessionId = firstHeaders[0].split(';')[0].split('=')[1];
+
+ 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', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ cookie: `astro-session=${firstSessionId}`,
+ },
+ body: JSON.stringify({ favoriteUrl: 'https://example.com' }),
+ });
+ const secondData = devalue.parse(await secondResponse.text());
+ assert.equal(
+ secondData.message,
+ 'Favorite URL set to https://example.com/ from https://domain.invalid/',
+ );
+ });
+});
diff --git a/packages/integrations/cloudflare/test/with-solid-js.test.js b/packages/integrations/cloudflare/test/with-solid-js.test.js
new file mode 100644
index 000000000..465274422
--- /dev/null
+++ b/packages/integrations/cloudflare/test/with-solid-js.test.js
@@ -0,0 +1,37 @@
+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/with-solid-js/', import.meta.url);
+
+describe('SolidJS', () => {
+ let wrangler;
+ before(async () => {
+ await astroCli(fileURLToPath(root), 'build');
+
+ 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());
+ });
+ });
+ });
+
+ after((_done) => {
+ wrangler.kill();
+ });
+
+ it('renders the solid component', async () => {
+ const res = await fetch('http://127.0.0.1:8788/');
+ assert.equal(res.status, 200);
+ const html = await res.text();
+ const $ = cheerio.load(html);
+ assert.equal($('.solid').text(), 'Solid Content');
+ });
+});
diff --git a/packages/integrations/cloudflare/test/with-svelte.test.js b/packages/integrations/cloudflare/test/with-svelte.test.js
new file mode 100644
index 000000000..4f1e72a7d
--- /dev/null
+++ b/packages/integrations/cloudflare/test/with-svelte.test.js
@@ -0,0 +1,37 @@
+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/with-svelte/', import.meta.url);
+
+describe('Svelte', () => {
+ let wrangler;
+ before(async () => {
+ await astroCli(fileURLToPath(root), 'build');
+
+ 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());
+ });
+ });
+ });
+
+ after((_done) => {
+ wrangler.kill();
+ });
+
+ it('renders the svelte component', async () => {
+ const res = await fetch('http://127.0.0.1:8788/');
+ assert.equal(res.status, 200);
+ const html = await res.text();
+ const $ = cheerio.load(html);
+ assert.equal($('.svelte').text(), 'Svelte Content');
+ });
+});
diff --git a/packages/integrations/cloudflare/test/with-vue.test.js b/packages/integrations/cloudflare/test/with-vue.test.js
new file mode 100644
index 000000000..8e7befae6
--- /dev/null
+++ b/packages/integrations/cloudflare/test/with-vue.test.js
@@ -0,0 +1,37 @@
+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/with-vue/', import.meta.url);
+
+describe('Vue', () => {
+ let wrangler;
+ before(async () => {
+ await astroCli(fileURLToPath(root), 'build');
+
+ 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());
+ });
+ });
+ });
+
+ after((_done) => {
+ wrangler.kill();
+ });
+
+ it('renders the vue component', async () => {
+ const res = await fetch('http://127.0.0.1:8788/');
+ assert.equal(res.status, 200);
+ const html = await res.text();
+ const $ = cheerio.load(html);
+ assert.equal($('.vue').text(), 'Vue Content');
+ });
+});
diff --git a/packages/integrations/cloudflare/test/wrangler-preview-platform.test.js b/packages/integrations/cloudflare/test/wrangler-preview-platform.test.js
new file mode 100644
index 000000000..bf1fb5c47
--- /dev/null
+++ b/packages/integrations/cloudflare/test/wrangler-preview-platform.test.js
@@ -0,0 +1,58 @@
+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');
+
+ 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());
+ });
+ });
+ });
+
+ after((_done) => {
+ wrangler.kill();
+ });
+
+ 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('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 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 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);
+ });
+});