diff options
author | 2025-06-05 14:25:23 +0000 | |
---|---|---|
committer | 2025-06-05 14:25:23 +0000 | |
commit | e586d7d704d475afe3373a1de6ae20d504f79d6d (patch) | |
tree | 7e3fa24807cebd48a86bd40f866d792181191ee9 /packages/integrations/cloudflare/test | |
download | astro-e586d7d704d475afe3373a1de6ae20d504f79d6d.tar.gz astro-e586d7d704d475afe3373a1de6ae20d504f79d6d.tar.zst astro-e586d7d704d475afe3373a1de6ae20d504f79d6d.zip |
Sync from a8e1c0a7402940e0fc5beef669522b315052df1blatest
Diffstat (limited to 'packages/integrations/cloudflare/test')
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' +--- + + 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 Binary files differnew file mode 100644 index 000000000..f4fc88e29 --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/compile-image-service/src/content/blog/post/placeholder.jpg 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 Binary files differnew file mode 100644 index 000000000..357f72da7 --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/add.wasm 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 Binary files differnew file mode 100644 index 000000000..b0ecc2680 --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/module-loader/src/util/file.bin 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); + }); +}); |