diff options
60 files changed, 531 insertions, 733 deletions
diff --git a/packages/integrations/cloudflare/package.json b/packages/integrations/cloudflare/package.json index 04f6d86d5..dba54466e 100644 --- a/packages/integrations/cloudflare/package.json +++ b/packages/integrations/cloudflare/package.json @@ -27,20 +27,15 @@ "dist" ], "scripts": { - "build": "astro-scripts build \"src/**/*.ts\" && tsc", - "build:ci": "astro-scripts build \"src/**/*.ts\"", - "dev": "astro-scripts dev \"src/**/*.ts\"", + "build": "tsc", "test": "mocha --exit --timeout 30000 test/", "test:match": "mocha --exit --timeout 30000 -g" }, "dependencies": { - "@astrojs/underscore-redirects": "workspace:*", + "@astrojs/underscore-redirects": "^0.3.0", "@cloudflare/workers-types": "^4.20230821.0", - "miniflare": "^3.20230918.0", + "miniflare": "3.20231010.0", "@iarna/toml": "^2.2.5", - "@miniflare/cache": "^2.14.1", - "@miniflare/shared": "^2.14.1", - "@miniflare/storage-memory": "^2.14.1", "dotenv": "^16.3.1", "esbuild": "^0.19.2", "find-up": "^6.3.0", @@ -51,13 +46,15 @@ "astro": "workspace:^3.3.0" }, "devDependencies": { + "execa": "^8.0.1", + "fast-glob": "^3.3.1", "@types/iarna__toml": "^2.0.2", - "astro": "workspace:*", - "astro-scripts": "workspace:*", + "strip-ansi": "^7.1.0", + "astro": "^3.2.3", "chai": "^4.3.7", "cheerio": "1.0.0-rc.12", "mocha": "^10.2.0", - "wrangler": "^3.5.1" + "wrangler": "^3.11.0" }, "publishConfig": { "provenance": true diff --git a/packages/integrations/cloudflare/src/index.ts b/packages/integrations/cloudflare/src/index.ts index 36da696bb..77df09719 100644 --- a/packages/integrations/cloudflare/src/index.ts +++ b/packages/integrations/cloudflare/src/index.ts @@ -206,7 +206,12 @@ export default function createIntegration(args?: Options): AstroIntegration { vite.resolve ||= {}; vite.resolve.alias ||= {}; - const aliases = [{ find: 'react-dom/server', replacement: 'react-dom/server.browser' }]; + const aliases = [ + { + find: 'react-dom/server', + replacement: 'react-dom/server.browser', + }, + ]; if (Array.isArray(vite.resolve.alias)) { vite.resolve.alias = [...vite.resolve.alias, ...aliases]; diff --git a/packages/integrations/cloudflare/test/_test-utils.js b/packages/integrations/cloudflare/test/_test-utils.js new file mode 100644 index 000000000..04946cbfa --- /dev/null +++ b/packages/integrations/cloudflare/test/_test-utils.js @@ -0,0 +1,50 @@ +import { fileURLToPath } from "node:url"; +import { execa } from "execa"; +/** + * @typedef {{ stop: Promise<void>, port: number }} WranglerCLI + */ + +const astroPath = fileURLToPath( + new URL("../node_modules/.bin/astro", 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 Astro CLI. */ +export function wranglerCli(cwd) { + const spawned = execa( + wranglerPath, + [ + "pages", + "dev", + "dist", + "--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; +} diff --git a/packages/integrations/cloudflare/test/basics.test.js b/packages/integrations/cloudflare/test/basics.test.js deleted file mode 100644 index eb4509da1..000000000 --- a/packages/integrations/cloudflare/test/basics.test.js +++ /dev/null @@ -1,39 +0,0 @@ -import { loadFixture, runCLI } from './test-utils.js'; -import { expect } from 'chai'; -import * as cheerio from 'cheerio'; - -describe('Basic app', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; - /** @type {import('./test-utils').WranglerCLI} */ - let cli; - - before(async function () { - fixture = await loadFixture({ - root: './fixtures/basics/', - }); - await fixture.build(); - - cli = await runCLI('./fixtures/basics/', { - silent: true, - onTimeout: (ex) => { - console.log(ex); - // if fail to start, skip for now as it's very flaky - this.skip(); - }, - }); - }); - - after(async () => { - await cli?.stop(); - }); - - it('can render', async () => { - let res = await fetch(`http://127.0.0.1:${cli.port}/`); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - expect($('h1').text()).to.equal('Testing'); - expect($('#env').text()).to.equal('secret'); - }); -}); diff --git a/packages/integrations/cloudflare/test/cf.test.js b/packages/integrations/cloudflare/test/cf.test.js deleted file mode 100644 index 0078f3024..000000000 --- a/packages/integrations/cloudflare/test/cf.test.js +++ /dev/null @@ -1,127 +0,0 @@ -import { loadFixture, runCLI } from './test-utils.js'; -import { expect } from 'chai'; -import * as cheerio from 'cheerio'; -import cloudflare from '../dist/index.js'; - -describe('Wrangler Cloudflare Runtime', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; - /** @type {import('./test-utils').WranglerCLI} */ - let cli; - - before(async function () { - fixture = await loadFixture({ - root: './fixtures/cf/', - output: 'server', - adapter: cloudflare(), - }); - await fixture.build(); - - cli = await runCLI('./fixtures/cf/', { - silent: true, - onTimeout: (ex) => { - console.log(ex); - // if fail to start, skip for now as it's very flaky - this.skip(); - }, - }); - }); - - after(async () => { - await cli?.stop(); - }); - - it('Load cf and caches API', async () => { - let res = await fetch(`http://127.0.0.1:${cli.port}/`); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - - expect($('#hasRuntime').text()).to.equal('true'); - expect($('#hasCache').text()).to.equal('true'); - }); -}); - -describe('Astro Cloudflare Runtime', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; - let devServer; - - before(async () => { - fixture = await loadFixture({ - root: './fixtures/cf/', - output: 'server', - adapter: cloudflare({ - runtime: 'local', - }), - }); - process.chdir('./test/fixtures/cf'); - devServer = await fixture.startDevServer(); - }); - - after(async () => { - await devServer?.stop(); - }); - - it('adds cf object', async () => { - let res = await fixture.fetch('/'); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - expect($('#hasCF').text()).to.equal('true'); - }); - - it('adds cache mocking', async () => { - let res = await fixture.fetch('/caches'); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - expect($('#hasCACHE').text()).to.equal('true'); - }); - - it('adds D1 mocking', async () => { - expect(await fixture.pathExists('../.mf/d1')).to.be.true; - - let res = await fixture.fetch('/d1'); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - expect($('#hasDB').text()).to.equal('true'); - expect($('#hasPRODDB').text()).to.equal('true'); - expect($('#hasACCESS').text()).to.equal('true'); - }); - - it('adds R2 mocking', async () => { - expect(await fixture.pathExists('../.mf/r2')).to.be.true; - - let res = await fixture.fetch('/r2'); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - expect($('#hasBUCKET').text()).to.equal('true'); - expect($('#hasPRODBUCKET').text()).to.equal('true'); - expect($('#hasACCESS').text()).to.equal('true'); - }); - - it('adds KV mocking', async () => { - expect(await fixture.pathExists('../.mf/kv')).to.be.true; - - let res = await fixture.fetch('/kv'); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - expect($('#hasKV').text()).to.equal('true'); - expect($('#hasPRODKV').text()).to.equal('true'); - expect($('#hasACCESS').text()).to.equal('true'); - }); - - it('adds DO mocking', async () => { - expect(await fixture.pathExists('../.mf/do')).to.be.true; - - let res = await fixture.fetch('/do'); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - expect($('#hasDO').text()).to.equal('true'); - }); -}); diff --git a/packages/integrations/cloudflare/test/dev-runtime.test.js b/packages/integrations/cloudflare/test/dev-runtime.test.js new file mode 100644 index 000000000..45bd5474d --- /dev/null +++ b/packages/integrations/cloudflare/test/dev-runtime.test.js @@ -0,0 +1,82 @@ +import { expect } from "chai"; +import * as cheerio from "cheerio"; +import { fileURLToPath } from "node:url"; +import { astroCli } from "./_test-utils.js"; + +const root = new URL("./fixtures/dev-runtime/", import.meta.url); +describe("Runtime Astro Dev", () => { + 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(); + setTimeout(() => { + console.log("CLEANED"); + done(); + }, 1000); + }); + + it("exists", async () => { + let res = await fetch(`http://127.0.0.1:4321/`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasRuntime").text()).to.contain("true"); + }); + + it("adds cf object", async () => { + let res = await fetch(`http://127.0.0.1:4321/`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasCF").text()).to.equal("true"); + }); + + it("adds cache mocking", async () => { + let res = await fetch(`http://127.0.0.1:4321/caches`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasCACHE").text()).to.equal("true"); + }); + + it("adds D1 mocking", async () => { + let res = await fetch(`http://127.0.0.1:4321/d1`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasDB").text()).to.equal("true"); + expect($("#hasPRODDB").text()).to.equal("true"); + expect($("#hasACCESS").text()).to.equal("true"); + }); + + it("adds R2 mocking", async () => { + let res = await fetch(`http://127.0.0.1:4321/r2`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasBUCKET").text()).to.equal("true"); + expect($("#hasPRODBUCKET").text()).to.equal("true"); + expect($("#hasACCESS").text()).to.equal("true"); + }); + + it("adds KV mocking", async () => { + let res = await fetch(`http://127.0.0.1:4321/kv`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasKV").text()).to.equal("true"); + expect($("#hasPRODKV").text()).to.equal("true"); + expect($("#hasACCESS").text()).to.equal("true"); + }); + + it("adds DO mocking", async () => { + let res = await fetch(`http://127.0.0.1:4321/do`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasDO").text()).to.equal("true"); + }); +}); diff --git a/packages/integrations/cloudflare/test/directory-mode.test.js b/packages/integrations/cloudflare/test/directory-mode.test.js new file mode 100644 index 000000000..228e5e9f1 --- /dev/null +++ b/packages/integrations/cloudflare/test/directory-mode.test.js @@ -0,0 +1,32 @@ +import { expect } from 'chai'; +import { existsSync, readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { astroCli } from './_test-utils.js'; + +const root = new URL('./fixtures/directory-mode/', import.meta.url); +describe('Directory mode', () => { + before(async () => { + await astroCli(fileURLToPath(root), 'build'); + }); + + it('generates functions folder inside the project root', () => { + const testURL = new URL('functions', root); + expect(existsSync(fileURLToPath(testURL))).to.be.true; + }); + + it('generates functions file inside the project root', () => { + const testURL = new URL('functions/[[path]].js', root); + expect(existsSync(fileURLToPath(testURL))).to.be.true; + }); + + it('generates a redirects file', () => { + const testURL = new URL('dist/_redirects', root); + try { + let _redirects = readFileSync(fileURLToPath(testURL), 'utf-8'); + let parts = _redirects.split(/\s+/); + expect(parts).to.deep.equal(['/old', '/', '301']); + } catch (e) { + expect(false).to.equal(true); + } + }); +}); diff --git a/packages/integrations/cloudflare/test/directory.test.js b/packages/integrations/cloudflare/test/directory.test.js deleted file mode 100644 index 8390699e3..000000000 --- a/packages/integrations/cloudflare/test/directory.test.js +++ /dev/null @@ -1,36 +0,0 @@ -import { loadFixture } from './test-utils.js'; -import { expect } from 'chai'; -import cloudflare from '../dist/index.js'; - -/** @type {import('./test-utils').Fixture} */ -describe('mode: "directory"', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; - - before(async () => { - fixture = await loadFixture({ - root: './fixtures/basics/', - output: 'server', - adapter: cloudflare({ mode: 'directory' }), - redirects: { - '/old': '/', - }, - }); - await fixture.build(); - }); - - it('generates functions folder inside the project root', async () => { - expect(await fixture.pathExists('../functions')).to.be.true; - expect(await fixture.pathExists('../functions/[[path]].js')).to.be.true; - }); - - it('generates a redirects file', async () => { - try { - let _redirects = await fixture.readFile('/_redirects'); - let parts = _redirects.split(/\s+/); - expect(parts).to.deep.equal(['/old', '/', '301']); - } catch { - expect(false).to.equal(true); - } - }); -}); diff --git a/packages/integrations/cloudflare/test/fixtures/cf/.dev.vars b/packages/integrations/cloudflare/test/fixtures/dev-runtime/.dev.vars index 9296c384b..9296c384b 100644 --- a/packages/integrations/cloudflare/test/fixtures/cf/.dev.vars +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/.dev.vars diff --git a/packages/integrations/cloudflare/test/fixtures/dev-runtime/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/dev-runtime/astro.config.mjs new file mode 100644 index 000000000..71b246dec --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/astro.config.mjs @@ -0,0 +1,10 @@ +import { defineConfig } from 'astro/config'; +import cloudflare from '@astrojs/cloudflare'; + + +export default defineConfig({ + adapter: cloudflare({ + runtime: 'local' + }), + output: 'server', +}); diff --git a/packages/integrations/cloudflare/test/fixtures/basics/package.json b/packages/integrations/cloudflare/test/fixtures/dev-runtime/package.json index c7cc97455..a700fc27c 100644 --- a/packages/integrations/cloudflare/test/fixtures/basics/package.json +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/package.json @@ -1,9 +1,9 @@ { - "name": "@test/astro-cloudflare-basics", + "name": "@test/astro-cloudflare-dev-runtime", "version": "0.0.0", "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/env.d.ts new file mode 100644 index 000000000..8c34fb45e --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/env.d.ts @@ -0,0 +1 @@ +/// <reference types="astro/client" />
\ No newline at end of file diff --git a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/caches.astro b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/caches.astro index 743111721..743111721 100644 --- a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/caches.astro +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/caches.astro diff --git a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/d1.astro b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/d1.astro index a28940e9f..a28940e9f 100644 --- a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/d1.astro +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/d1.astro diff --git a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/do.astro b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/do.astro index e338c8e8f..e338c8e8f 100644 --- a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/do.astro +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/do.astro diff --git a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/index.astro index 5ba11985f..7d2ce1ef1 100644 --- a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/index.astro +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/index.astro @@ -7,6 +7,7 @@ const runtime = Astro.locals.runtime; </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/cf/src/pages/kv.astro b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/kv.astro index d21f163a0..d21f163a0 100644 --- a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/kv.astro +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/kv.astro diff --git a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/r2.astro b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/r2.astro index fbb9fc61b..fbb9fc61b 100644 --- a/packages/integrations/cloudflare/test/fixtures/cf/src/pages/r2.astro +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/src/pages/r2.astro diff --git a/packages/integrations/cloudflare/test/fixtures/cf/wrangler.toml b/packages/integrations/cloudflare/test/fixtures/dev-runtime/wrangler.toml index 17fd88ea5..17fd88ea5 100644 --- a/packages/integrations/cloudflare/test/fixtures/cf/wrangler.toml +++ b/packages/integrations/cloudflare/test/fixtures/dev-runtime/wrangler.toml diff --git a/packages/integrations/cloudflare/test/fixtures/directory-mode/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/directory-mode/astro.config.mjs new file mode 100644 index 000000000..9a1408cb0 --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/directory-mode/astro.config.mjs @@ -0,0 +1,10 @@ +import { defineConfig } from 'astro/config'; +import cloudflare from '@astrojs/cloudflare'; + +export default defineConfig({ + output: 'server', + adapter: cloudflare({ mode: 'directory' }), + redirects: { + '/old': '/', + }, +}); diff --git a/packages/integrations/cloudflare/test/fixtures/runtime/package.json b/packages/integrations/cloudflare/test/fixtures/directory-mode/package.json index 71ac16647..e3d826df7 100644 --- a/packages/integrations/cloudflare/test/fixtures/runtime/package.json +++ b/packages/integrations/cloudflare/test/fixtures/directory-mode/package.json @@ -1,9 +1,9 @@ { - "name": "@test/astro-cloudflare-runtime", + "name": "@test/astro-cloudflare-directory-mode", "version": "0.0.0", "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/directory-mode/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/directory-mode/src/env.d.ts new file mode 100644 index 000000000..8c34fb45e --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/directory-mode/src/env.d.ts @@ -0,0 +1 @@ +/// <reference types="astro/client" />
\ No newline at end of file diff --git a/packages/integrations/cloudflare/test/fixtures/basics/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/directory-mode/src/pages/index.astro index 8d372399c..8d372399c 100644 --- a/packages/integrations/cloudflare/test/fixtures/basics/src/pages/index.astro +++ b/packages/integrations/cloudflare/test/fixtures/directory-mode/src/pages/index.astro diff --git a/packages/integrations/cloudflare/test/fixtures/function-per-route/package.json b/packages/integrations/cloudflare/test/fixtures/function-per-route/package.json index 54dded9dd..2c358cbcb 100644 --- a/packages/integrations/cloudflare/test/fixtures/function-per-route/package.json +++ b/packages/integrations/cloudflare/test/fixtures/function-per-route/package.json @@ -4,6 +4,6 @@ "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/function-per-route/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/function-per-route/src/env.d.ts new file mode 100644 index 000000000..8c34fb45e --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/function-per-route/src/env.d.ts @@ -0,0 +1 @@ +/// <reference types="astro/client" />
\ No newline at end of file diff --git a/packages/integrations/cloudflare/test/fixtures/basics/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/hybrid/astro.config.mjs index 407dc4355..8cb9d4504 100644 --- a/packages/integrations/cloudflare/test/fixtures/basics/astro.config.mjs +++ b/packages/integrations/cloudflare/test/fixtures/hybrid/astro.config.mjs @@ -1,10 +1,7 @@ import { defineConfig } from 'astro/config'; import cloudflare from '@astrojs/cloudflare'; -// test env var -process.env.SECRET_STUFF = 'secret' - export default defineConfig({ adapter: cloudflare(), - output: 'server' + output: 'hybrid', }); diff --git a/packages/integrations/cloudflare/test/fixtures/cf/package.json b/packages/integrations/cloudflare/test/fixtures/hybrid/package.json index cf8ae0082..c3a430c9e 100644 --- a/packages/integrations/cloudflare/test/fixtures/cf/package.json +++ b/packages/integrations/cloudflare/test/fixtures/hybrid/package.json @@ -1,9 +1,9 @@ { - "name": "@test/astro-cloudflare-cf", + "name": "@test/astro-cloudflare-hybrid", "version": "0.0.0", "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/hybrid/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/hybrid/src/env.d.ts new file mode 100644 index 000000000..8c34fb45e --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/hybrid/src/env.d.ts @@ -0,0 +1 @@ +/// <reference types="astro/client" />
\ No newline at end of file diff --git a/packages/integrations/cloudflare/test/fixtures/hybrid/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/hybrid/src/pages/index.astro new file mode 100644 index 000000000..dfd71c3de --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/hybrid/src/pages/index.astro @@ -0,0 +1,8 @@ +<html> +<head> + <title>Testing</title> +</head> +<body> + <h1>Testing</h1> +</body> +</html> diff --git a/packages/integrations/cloudflare/test/fixtures/hybrid/src/pages/one.astro b/packages/integrations/cloudflare/test/fixtures/hybrid/src/pages/one.astro new file mode 100644 index 000000000..036ee25a3 --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/hybrid/src/pages/one.astro @@ -0,0 +1,11 @@ +--- +export const prerender = false; +--- +<html> +<head> + <title>Testing</title> +</head> +<body> + <h1>Testing</h1> +</body> +</html> diff --git a/packages/integrations/cloudflare/test/fixtures/no-output/package.json b/packages/integrations/cloudflare/test/fixtures/no-output/package.json index 569c30890..473ea0ce3 100644 --- a/packages/integrations/cloudflare/test/fixtures/no-output/package.json +++ b/packages/integrations/cloudflare/test/fixtures/no-output/package.json @@ -4,6 +4,6 @@ "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/prerender/package.json b/packages/integrations/cloudflare/test/fixtures/prerender/package.json index 3b2c5fef5..8cfbe8ae4 100644 --- a/packages/integrations/cloudflare/test/fixtures/prerender/package.json +++ b/packages/integrations/cloudflare/test/fixtures/prerender/package.json @@ -4,6 +4,6 @@ "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/prerender/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/prerender/src/env.d.ts new file mode 100644 index 000000000..8c34fb45e --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/prerender/src/env.d.ts @@ -0,0 +1 @@ +/// <reference types="astro/client" />
\ No newline at end of file diff --git a/packages/integrations/cloudflare/test/fixtures/prerender/src/pages/one.astro b/packages/integrations/cloudflare/test/fixtures/prerender/src/pages/one.astro index e11de7add..30386a625 100644 --- a/packages/integrations/cloudflare/test/fixtures/prerender/src/pages/one.astro +++ b/packages/integrations/cloudflare/test/fixtures/prerender/src/pages/one.astro @@ -1,5 +1,5 @@ --- -export const prerender = import.meta.env.PRERENDER; +export const prerender = true; --- <html> <head> diff --git a/packages/integrations/cloudflare/test/fixtures/routes-json/package.json b/packages/integrations/cloudflare/test/fixtures/routes-json/package.json index 4ff746f02..528c18a4d 100644 --- a/packages/integrations/cloudflare/test/fixtures/routes-json/package.json +++ b/packages/integrations/cloudflare/test/fixtures/routes-json/package.json @@ -4,6 +4,6 @@ "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/runtime/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/runtime/src/pages/index.astro deleted file mode 100644 index aa73ab8ea..000000000 --- a/packages/integrations/cloudflare/test/fixtures/runtime/src/pages/index.astro +++ /dev/null @@ -1,15 +0,0 @@ ---- -const runtime = Astro.locals.runtime; -const env = runtime.env; ---- -<html> - <head> - <title>Testing</title> - </head> - <body> - <h1>Testing</h1> - <div id="env">{JSON.stringify(env)}</div> - <div id="hasRuntime">{!!runtime.cf?.colo}</div> - <div id="hasCache">{!!runtime.caches}</div> - </body> -</html> diff --git a/packages/integrations/cloudflare/test/fixtures/wasm-directory/package.json b/packages/integrations/cloudflare/test/fixtures/wasm-directory/package.json index 859aa4f40..8306750ee 100644 --- a/packages/integrations/cloudflare/test/fixtures/wasm-directory/package.json +++ b/packages/integrations/cloudflare/test/fixtures/wasm-directory/package.json @@ -4,6 +4,6 @@ "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/wasm-function-per-route/package.json b/packages/integrations/cloudflare/test/fixtures/wasm-function-per-route/package.json index 238c1e313..bafa40cc5 100644 --- a/packages/integrations/cloudflare/test/fixtures/wasm-function-per-route/package.json +++ b/packages/integrations/cloudflare/test/fixtures/wasm-function-per-route/package.json @@ -4,6 +4,6 @@ "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/wasm/package.json b/packages/integrations/cloudflare/test/fixtures/wasm/package.json index 4abd8513c..03bcc6e75 100644 --- a/packages/integrations/cloudflare/test/fixtures/wasm/package.json +++ b/packages/integrations/cloudflare/test/fixtures/wasm/package.json @@ -4,6 +4,6 @@ "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "astro": "workspace:*" + "astro": "^3.2.3" } } diff --git a/packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json b/packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json index 55e344b21..5f9f339c2 100644 --- a/packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json +++ b/packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json @@ -4,8 +4,8 @@ "private": true, "dependencies": { "@astrojs/cloudflare": "workspace:*", - "@astrojs/solid-js": "workspace:*", - "astro": "workspace:*", + "@astrojs/solid-js": "^3.0.2", + "astro": "^3.2.3", "solid-js": "^1.7.11" } } diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/.dev.vars b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/.dev.vars new file mode 100644 index 000000000..9296c384b --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/.dev.vars @@ -0,0 +1 @@ +DATABASE_URL="postgresql://lorem" diff --git a/packages/integrations/cloudflare/test/fixtures/runtime/astro.config.mjs b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/astro.config.mjs index f92829843..f92829843 100644 --- a/packages/integrations/cloudflare/test/fixtures/runtime/astro.config.mjs +++ b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/astro.config.mjs diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/package.json b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/package.json new file mode 100644 index 000000000..3fb206e61 --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/astro-cloudflare-wrangler-runtime", + "version": "0.0.0", + "private": true, + "dependencies": { + "@astrojs/cloudflare": "workspace:*", + "astro": "^3.2.3" + } +} diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/src/env.d.ts b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/src/env.d.ts new file mode 100644 index 000000000..8c34fb45e --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/src/env.d.ts @@ -0,0 +1 @@ +/// <reference types="astro/client" />
\ No newline at end of file diff --git a/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/src/pages/index.astro b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/src/pages/index.astro new file mode 100644 index 000000000..8a3b20925 --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/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-runtime/wrangler.toml b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/wrangler.toml new file mode 100644 index 000000000..ba0fa64c4 --- /dev/null +++ b/packages/integrations/cloudflare/test/fixtures/wrangler-runtime/wrangler.toml @@ -0,0 +1,4 @@ +name = "test" + +[vars] +COOL = "ME" diff --git a/packages/integrations/cloudflare/test/function-per-route.test.js b/packages/integrations/cloudflare/test/function-per-route.test.js index f0287c717..19cbfde39 100644 --- a/packages/integrations/cloudflare/test/function-per-route.test.js +++ b/packages/integrations/cloudflare/test/function-per-route.test.js @@ -1,36 +1,33 @@ -import { loadFixture } from './test-utils.js'; import { expect } from 'chai'; +import { existsSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { astroCli } from './_test-utils.js'; -/** @type {import('./test-utils.js').Fixture} */ -describe('Cloudflare SSR functionPerRoute', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; +const root = new URL('./fixtures/function-per-route/', import.meta.url); +describe('Function per Route', () => { before(async () => { - fixture = await loadFixture({ - root: './fixtures/function-per-route/', - }); - await fixture.build(); + await astroCli(fileURLToPath(root), 'build'); }); - after(() => { - fixture?.clean(); + it('generates functions folder inside the project root', () => { + const testURL = new URL('functions', root); + expect(existsSync(fileURLToPath(testURL))).to.be.true; }); - it('generates functions folders inside the project root, and checks that each page is emitted by astro', async () => { - expect(await fixture.pathExists('../functions')).to.be.true; - expect(await fixture.pathExists('../functions/index.js')).to.be.true; - expect(await fixture.pathExists('../functions/blog/cool.js')).to.be.true; - expect(await fixture.pathExists('../functions/blog/[post].js')).to.be.true; - expect(await fixture.pathExists('../functions/[person]/[car].js')).to.be.true; - expect(await fixture.pathExists('../functions/files/[[path]].js')).to.be.true; - expect(await fixture.pathExists('../functions/[language]/files/[[path]].js')).to.be.true; - expect(await fixture.pathExists('../functions/trpc/[trpc].js')).to.be.true; - expect(await fixture.pathExists('../functions/javascript.js')).to.be.true; - expect(await fixture.pathExists('../functions/test.json.js')).to.be.true; + it('generates functions bundles for each page', () => { + expect(existsSync(fileURLToPath(new URL('functions/index.js', root)))).to.be.true; + expect(existsSync(fileURLToPath(new URL('functions/blog/cool.js', root)))).to.be.true; + expect(existsSync(fileURLToPath(new URL('functions/blog/[post].js', root)))).to.be.true; + expect(existsSync(fileURLToPath(new URL('functions/[person]/[car].js', root)))).to.be.true; + expect(existsSync(fileURLToPath(new URL('functions/files/[[path]].js', root)))).to.be.true; + expect(existsSync(fileURLToPath(new URL('functions/[language]/files/[[path]].js', root)))).to.be.true; + expect(existsSync(fileURLToPath(new URL('functions/trpc/[trpc].js', root)))).to.be.true; + expect(existsSync(fileURLToPath(new URL('functions/javascript.js', root)))).to.be.true; + expect(existsSync(fileURLToPath(new URL('functions/test.json.js', root)))).to.be.true; }); - it('generates pre-rendered files', async () => { - expect(await fixture.pathExists('./prerender/index.html')).to.be.true; + it('generates html files for pre-rendered routes', () => { + expect(existsSync(fileURLToPath(new URL('dist/prerender/index.html', root)))).to.be.true; }); }); diff --git a/packages/integrations/cloudflare/test/hybrid.test.js b/packages/integrations/cloudflare/test/hybrid.test.js new file mode 100644 index 000000000..f0f0e01e0 --- /dev/null +++ b/packages/integrations/cloudflare/test/hybrid.test.js @@ -0,0 +1,22 @@ +import { readFileSync } from 'fs'; +import { astroCli } from './_test-utils.js'; +import { expect } from 'chai'; +import { fileURLToPath } from 'url'; + +const root = new URL('./fixtures/hybrid/', import.meta.url); + +describe('Hybrid rendering', () => { + before(async () => { + await astroCli(fileURLToPath(root), 'build'); + }); + + it('includes non prerendered routes in the routes.json config', async () => { + const foundRoutes = JSON.parse(readFileSync(fileURLToPath(new URL('dist/_routes.json', root)))); + + expect(foundRoutes).to.deep.equal({ + version: 1, + include: ['/one', '/_image'], + exclude: [], + }); + }); +}); diff --git a/packages/integrations/cloudflare/test/no-output.test.js b/packages/integrations/cloudflare/test/no-output.test.js index af4d9c2b6..2320e0559 100644 --- a/packages/integrations/cloudflare/test/no-output.test.js +++ b/packages/integrations/cloudflare/test/no-output.test.js @@ -1,20 +1,14 @@ -import { loadFixture } from './test-utils.js'; import { expect } from 'chai'; +import { fileURLToPath } from 'node:url'; +import { astroCli } from './_test-utils.js'; -describe('Missing output config', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; - - before(async () => { - fixture = await loadFixture({ - root: './fixtures/no-output/', - }); - }); +const root = new URL('./fixtures/no-output/', import.meta.url); +describe('Missing output config', () => { it('throws during the build', async () => { let error = undefined; try { - await fixture.build(); + await astroCli(fileURLToPath(root), 'build'); } catch (err) { error = err; } diff --git a/packages/integrations/cloudflare/test/prerender.test.js b/packages/integrations/cloudflare/test/prerender.test.js index 6c2b8c5bb..8ba43f9e5 100644 --- a/packages/integrations/cloudflare/test/prerender.test.js +++ b/packages/integrations/cloudflare/test/prerender.test.js @@ -1,25 +1,17 @@ -import { loadFixture } from './test-utils.js'; +import { readFileSync } from 'fs'; +import { astroCli } from './_test-utils.js'; import { expect } from 'chai'; +import { fileURLToPath } from 'url'; -describe('Prerendering', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; +const root = new URL('./fixtures/prerender/', import.meta.url); +describe('Prerendering', () => { before(async () => { - process.env.PRERENDER = true; - fixture = await loadFixture({ - root: './fixtures/prerender/', - }); - await fixture.build(); - }); - - after(() => { - delete process.env.PRERENDER; - fixture.clean(); + await astroCli(fileURLToPath(root), 'build'); }); it('includes non prerendered routes in the routes.json config', async () => { - const foundRoutes = JSON.parse(await fixture.readFile('/_routes.json')); + const foundRoutes = JSON.parse(readFileSync(fileURLToPath(new URL('dist/_routes.json', root)))); expect(foundRoutes).to.deep.equal({ version: 1, @@ -28,31 +20,3 @@ describe('Prerendering', () => { }); }); }); - -describe('Hybrid rendering', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; - - before(async () => { - process.env.PRERENDER = false; - fixture = await loadFixture({ - root: './fixtures/prerender/', - output: 'hybrid', - }); - await fixture.build(); - }); - - after(() => { - delete process.env.PRERENDER; - }); - - it('includes non prerendered routes in the routes.json config', async () => { - const foundRoutes = JSON.parse(await fixture.readFile('/_routes.json')); - - expect(foundRoutes).to.deep.equal({ - version: 1, - include: ['/one', '/_image'], - exclude: [], - }); - }); -}); diff --git a/packages/integrations/cloudflare/test/routes-json.test.js b/packages/integrations/cloudflare/test/routes-json.test.js index 9c5cfad4a..d4cab6d60 100644 --- a/packages/integrations/cloudflare/test/routes-json.test.js +++ b/packages/integrations/cloudflare/test/routes-json.test.js @@ -1,15 +1,13 @@ import { expect } from 'chai'; -import { loadFixture } from './test-utils.js'; -import cloudflare from '../dist/index.js'; +import { astroCli } from './_test-utils.js'; + +const root = new URL('./fixtures/routes-json/', import.meta.url); -/** @type {import('./test-utils.js').Fixture} */ describe('_routes.json generation', () => { for (const mode of ['directory', 'advanced']) { for (const functionPerRoute of [false, true]) { describe(`with mode=${mode}, functionPerRoute=${functionPerRoute}`, () => { describe('of both functions and static files', () => { - let fixture; - before(async () => { fixture = await loadFixture({ root: './fixtures/routes-json/', diff --git a/packages/integrations/cloudflare/test/runtime.test.js b/packages/integrations/cloudflare/test/runtime.test.js deleted file mode 100644 index e0d77d5c6..000000000 --- a/packages/integrations/cloudflare/test/runtime.test.js +++ /dev/null @@ -1,44 +0,0 @@ -import { loadFixture, runCLI } from './test-utils.js'; -import { expect } from 'chai'; -import * as cheerio from 'cheerio'; -import cloudflare from '../dist/index.js'; - -describe('Runtime Locals', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; - /** @type {import('./test-utils.js').WranglerCLI} */ - let cli; - - before(async function () { - fixture = await loadFixture({ - root: './fixtures/runtime/', - output: 'server', - adapter: cloudflare(), - }); - await fixture.build(); - - cli = await runCLI('./fixtures/runtime/', { - silent: true, - onTimeout: (ex) => { - console.log(ex); - // if fail to start, skip for now as it's very flaky - this.skip(); - }, - }); - }); - - after(async () => { - await cli?.stop(); - }); - - it('has CF and Caches', async () => { - let res = await fetch(`http://127.0.0.1:${cli.port}/`); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - expect($('#env').text()).to.contain('SECRET_STUFF'); - expect($('#env').text()).to.contain('secret'); - expect($('#hasRuntime').text()).to.contain('true'); - expect($('#hasCache').text()).to.equal('true'); - }); -}); diff --git a/packages/integrations/cloudflare/test/test-utils.js b/packages/integrations/cloudflare/test/test-utils.js deleted file mode 100644 index 5e0c698f4..000000000 --- a/packages/integrations/cloudflare/test/test-utils.js +++ /dev/null @@ -1,169 +0,0 @@ -import { spawn } from 'node:child_process'; -import { fileURLToPath } from 'node:url'; -import { loadFixture as baseLoadFixture } from '../../../astro/test/test-utils.js'; -import * as net from 'node:net'; -export { fixLineEndings } from '../../../astro/test/test-utils.js'; -/** - * @typedef {{ stop: Promise<void>, port: number }} WranglerCLI - * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture - */ - -export function loadFixture(config) { - if (config?.root) { - config.root = new URL(config.root, import.meta.url); - } - return baseLoadFixture(config); -} - -const wranglerPath = fileURLToPath( - new URL('../node_modules/wrangler/bin/wrangler.js', import.meta.url) -); - -let lastPort = 8788; - -/** - * @returns {Promise<WranglerCLI>} - */ -export async function runCLI( - basePath, - { - silent, - maxAttempts = 3, - timeoutMillis = 2500, // really short because it often seems to just hang on the first try, but work subsequently, no matter the wait - backoffFactor = 2, // | - 2.5s -- 5s ---- 10s -> onTimeout - onTimeout = (ex) => { - new Error(`Timed out starting the wrangler CLI after ${maxAttempts} tries.`, { cause: ex }); - }, - } -) { - let triesRemaining = maxAttempts; - let timeout = timeoutMillis; - let cli; - let lastErr; - while (triesRemaining > 0) { - cli = await tryRunCLI(basePath, { - silent, - timeout, - forceRotatePort: triesRemaining !== maxAttempts, - }); - try { - await cli.ready; - return cli; - } catch (err) { - lastErr = err; - console.error((err.message || err.name || err) + ' after ' + timeout + 'ms'); - cli.stop(); - triesRemaining -= 1; - timeout *= backoffFactor; - } - } - onTimeout(lastErr); - return cli; -} - -async function tryRunCLI(basePath, { silent, timeout, forceRotatePort = false }) { - const port = await getNextOpenPort(lastPort + (forceRotatePort ? 1 : 0)); - lastPort = port; - - const fixtureDir = fileURLToPath(new URL(`${basePath}`, import.meta.url)); - const p = spawn( - 'node', - [ - wranglerPath, - 'pages', - 'dev', - 'dist', - '--port', - port, - '--log-level', - 'info', - '--persist-to', - '.wrangler/state', - ], - { - cwd: fixtureDir, - } - ); - - p.stderr.setEncoding('utf-8'); - p.stdout.setEncoding('utf-8'); - - const ready = new Promise(async (resolve, reject) => { - const failed = setTimeout(() => { - p.kill('SIGKILL'); - reject(new Error(`Timed out starting the wrangler CLI`)); - }, timeout); - - const success = () => { - clearTimeout(failed); - resolve(); - }; - - p.on('exit', (code) => reject(`wrangler terminated unexpectedly with exit code ${code}`)); - - p.stderr.on('data', (data) => { - if (!silent) { - process.stdout.write(data); - } - }); - let allData = ''; - p.stdout.on('data', (data) => { - if (!silent) { - process.stdout.write(data); - } - allData += data; - if (allData.includes(`[mf:inf] Ready on`)) { - success(); - } - }); - }); - - return { - port, - ready, - stop() { - return new Promise((resolve, reject) => { - const timer = setTimeout(() => { - p.kill('SIGKILL'); - }, 1000); - p.on('close', () => { - clearTimeout(timer); - resolve(); - }); - p.on('error', (err) => reject(err)); - p.kill(); - }); - }, - }; -} - -const isPortOpen = async (port) => { - return new Promise((resolve, reject) => { - let s = net.createServer(); - s.once('error', (err) => { - s.close(); - if (err['code'] == 'EADDRINUSE') { - resolve(false); - } else { - reject(err); - } - }); - s.once('listening', () => { - resolve(true); - s.close(); - }); - s.listen(port, '0.0.0.0'); - }); -}; - -const getNextOpenPort = async (startFrom) => { - let openPort = null; - while (startFrom < 65535 || !!openPort) { - if (await isPortOpen(startFrom)) { - openPort = startFrom; - break; - } - startFrom++; - } - return openPort; -}; diff --git a/packages/integrations/cloudflare/test/wasm-directory.test.js b/packages/integrations/cloudflare/test/wasm-directory.test.js index 0f387a660..30d709ad3 100644 --- a/packages/integrations/cloudflare/test/wasm-directory.test.js +++ b/packages/integrations/cloudflare/test/wasm-directory.test.js @@ -1,36 +1,38 @@ -import { loadFixture, runCLI } from './test-utils.js'; -import { expect } from 'chai'; +import { expect } from "chai"; +import { fileURLToPath } from "node:url"; +import { astroCli, wranglerCli } from "./_test-utils.js"; -describe('Wasm directory mode import', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; - /** @type {import('./test-utils.js').WranglerCLI} */ - let cli; +const root = new URL("./fixtures/wasm-directory/", import.meta.url); - before(async function () { - fixture = await loadFixture({ - root: './fixtures/wasm-directory/', - }); - await fixture.build(); +describe("Wasm directory mode import", () => { + let wrangler; + before(async () => { + await astroCli(fileURLToPath(root), "build"); - cli = await runCLI('./fixtures/wasm-directory/', { - silent: true, - onTimeout: (ex) => { - console.log(ex); - // if fail to start, skip for now as it's very flaky - this.skip(); - }, - }); - }); + 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(async () => { - await cli?.stop(); - }); + after((done) => { + wrangler.kill(); + setTimeout(() => { + console.log("CLEANED"); + done(); + }, 1000); + }); - it('can render', async () => { - let res = await fetch(`http://127.0.0.1:${cli.port}/`); - expect(res.status).to.equal(200); - const json = await res.json(); - expect(json).to.deep.equal({ answer: 42 }); - }); + it("can render", async () => { + let res = await fetch(`http://127.0.0.1:8788/`); + expect(res.status).to.equal(200); + const json = await res.json(); + expect(json).to.deep.equal({ answer: 42 }); + }); }); diff --git a/packages/integrations/cloudflare/test/wasm-function-per-route.test.js b/packages/integrations/cloudflare/test/wasm-function-per-route.test.js index f751f1ff4..140bb90b7 100644 --- a/packages/integrations/cloudflare/test/wasm-function-per-route.test.js +++ b/packages/integrations/cloudflare/test/wasm-function-per-route.test.js @@ -1,41 +1,43 @@ -import { loadFixture, runCLI } from './test-utils.js'; -import { expect } from 'chai'; +import { expect } from "chai"; +import { fileURLToPath } from "node:url"; +import { astroCli, wranglerCli } from "./_test-utils.js"; -describe('Wasm function per route import', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; - /** @type {import('./test-utils.js').WranglerCLI} */ - let cli; +const root = new URL("./fixtures/wasm-function-per-route/", import.meta.url); - before(async function () { - fixture = await loadFixture({ - root: './fixtures/wasm-function-per-route/', - }); - await fixture.build(); +describe("Wasm function per route import", () => { + let wrangler; + before(async () => { + await astroCli(fileURLToPath(root), "build"); - cli = await runCLI('./fixtures/wasm-function-per-route/', { - silent: true, - onTimeout: (ex) => { - console.log(ex); - // if fail to start, skip for now as it's very flaky - this.skip(); - }, - }); - }); + 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(async () => { - await cli?.stop(); - }); + after((done) => { + wrangler.kill(); + setTimeout(() => { + console.log("CLEANED"); + done(); + }, 1000); + }); - it('can render', async () => { - let res = await fetch(`http://127.0.0.1:${cli.port}/`); - expect(res.status).to.equal(200); - let json = await res.json(); - expect(json).to.deep.equal({ answer: 42 }); + it("can render", async () => { + let res = await fetch(`http://127.0.0.1:8788/`); + expect(res.status).to.equal(200); + let json = await res.json(); + expect(json).to.deep.equal({ answer: 42 }); - res = await fetch(`http://127.0.0.1:${cli.port}/deeply/nested/route`); - expect(res.status).to.equal(200); - json = await res.json(); - expect(json).to.deep.equal({ answer: 84 }); - }); + res = await fetch(`http://127.0.0.1:8788/deeply/nested/route`); + expect(res.status).to.equal(200); + json = await res.json(); + expect(json).to.deep.equal({ answer: 84 }); + }); }); diff --git a/packages/integrations/cloudflare/test/wasm.test.js b/packages/integrations/cloudflare/test/wasm.test.js index 279a00cd1..7f440922e 100644 --- a/packages/integrations/cloudflare/test/wasm.test.js +++ b/packages/integrations/cloudflare/test/wasm.test.js @@ -1,85 +1,37 @@ -import { loadFixture, runCLI } from './test-utils.js'; -import { expect } from 'chai'; -import cloudflare from '../dist/index.js'; - -describe('Wasm import', () => { - describe('in cloudflare workerd', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; - /** @type {import('./test-utils.js').WranglerCLI} */ - let cli; - - before(async function () { - fixture = await loadFixture({ - root: './fixtures/wasm/', - }); - await fixture.build(); - - cli = await runCLI('./fixtures/wasm/', { - silent: true, - onTimeout: (ex) => { - console.log(ex); - // if fail to start, skip for now as it's very flaky - this.skip(); - }, - }); - }); - - after(async () => { - await cli?.stop(); - }); - - it('can render', async () => { - let res = await fetch(`http://127.0.0.1:${cli.port}/add/40/2`); - expect(res.status).to.equal(200); - const json = await res.json(); - expect(json).to.deep.equal({ answer: 42 }); - }); - }); - describe('astro dev server', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; - let devServer; - - before(async () => { - fixture = await loadFixture({ - root: './fixtures/wasm/', - }); - devServer = undefined; - }); - - after(async () => { - await devServer?.stop(); - }); - - it('can serve wasm', async () => { - devServer = await fixture.startDevServer(); - let res = await fetch(`http://localhost:${devServer.address.port}/add/60/3`); - expect(res.status).to.equal(200); - const json = await res.json(); - expect(json).to.deep.equal({ answer: 63 }); - }); - - it('fails to build intelligently when wasm is disabled', async () => { - let ex; - try { - await fixture.build({ - adapter: cloudflare({ - wasmModuleImports: false, - }), - }); - } catch (err) { - ex = err; - } - expect(ex?.message).to.have.string('add `wasmModuleImports: true` to your astro config'); - }); - - it('can import wasm in both SSR and SSG pages', async () => { - await fixture.build({ output: 'hybrid' }); - const staticContents = await fixture.readFile('./hybrid'); - expect(staticContents).to.be.equal('{"answer":21}'); - const assets = await fixture.readdir('./_astro'); - expect(assets.map((x) => x.slice(x.lastIndexOf('.')))).to.contain('.wasm'); - }); - }); +import { expect } from "chai"; +import { fileURLToPath } from "node:url"; +import { astroCli, wranglerCli } from "./_test-utils.js"; + +const root = new URL("./fixtures/wasm/", import.meta.url); + +describe("Wasm import", () => { + before(async function () { + 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(); + setTimeout(() => { + console.log("CLEANED"); + done(); + }, 1000); + }); + + it("can render", async () => { + let res = await fetch(`http://127.0.0.1:8788/add/40/2`); + expect(res.status).to.equal(200); + const json = await res.json(); + expect(json).to.deep.equal({ answer: 42 }); + }); }); diff --git a/packages/integrations/cloudflare/test/with-solid-js.test.js b/packages/integrations/cloudflare/test/with-solid-js.test.js index 501a947d0..dd097b700 100644 --- a/packages/integrations/cloudflare/test/with-solid-js.test.js +++ b/packages/integrations/cloudflare/test/with-solid-js.test.js @@ -1,38 +1,40 @@ -import { loadFixture, runCLI } from './test-utils.js'; -import { expect } from 'chai'; -import * as cheerio from 'cheerio'; +import { expect } from "chai"; +import * as cheerio from "cheerio"; +import { fileURLToPath } from "node:url"; +import { astroCli, wranglerCli } from "./_test-utils.js"; -describe('With SolidJS', () => { - /** @type {import('./test-utils').Fixture} */ - let fixture; - /** @type {import('./test-utils').WranglerCLI} */ - let cli; +const root = new URL("./fixtures/with-solid-js/", import.meta.url); - before(async function () { - fixture = await loadFixture({ - root: './fixtures/with-solid-js/', - }); - await fixture.build(); +describe("With SolidJS", () => { + let wrangler; + before(async () => { + await astroCli(fileURLToPath(root), "build"); - cli = await runCLI('./fixtures/with-solid-js/', { - silent: true, - onTimeout: (ex) => { - console.log(ex); - // if fail to start, skip for now as it's very flaky - this.skip(); - }, - }); - }); + 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(async () => { - await cli?.stop(); - }); + after((done) => { + wrangler.kill(); + setTimeout(() => { + console.log("CLEANED"); + done(); + }, 1000); + }); - it('renders the solid component', async () => { - let res = await fetch(`http://127.0.0.1:${cli.port}/`); - expect(res.status).to.equal(200); - let html = await res.text(); - let $ = cheerio.load(html); - expect($('.solid').text()).to.equal('Solid Content'); - }); + it("renders the solid component", async () => { + let res = await fetch(`http://127.0.0.1:8788/`); + expect(res.status).to.equal(200); + let html = await res.text(); + let $ = cheerio.load(html); + expect($(".solid").text()).to.equal("Solid Content"); + }); }); diff --git a/packages/integrations/cloudflare/test/wrangler-runtime.test.js b/packages/integrations/cloudflare/test/wrangler-runtime.test.js new file mode 100644 index 000000000..c843cfd6c --- /dev/null +++ b/packages/integrations/cloudflare/test/wrangler-runtime.test.js @@ -0,0 +1,61 @@ +import { expect } from "chai"; +import * as cheerio from "cheerio"; +import { fileURLToPath } from "node:url"; +import { astroCli, wranglerCli } from "./_test-utils.js"; + +const root = new URL("./fixtures/wrangler-runtime/", import.meta.url); + +describe("Runtime Wrangler", () => { + 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(); + setTimeout(() => { + console.log("CLEANED"); + done(); + }, 1000); + }); + + it("exists", async () => { + let res = await fetch(`http://127.0.0.1:8788/`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasRuntime").text()).to.contain("true"); + }); + + it("has environment variables", async () => { + let res = await fetch(`http://127.0.0.1:8788/`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasENV").text()).to.contain("true"); + }); + + it("has Cloudflare request object", async () => { + let res = await fetch(`http://127.0.0.1:8788/`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasCF").text()).to.contain("true"); + }); + + it("has Cloudflare cache", async () => { + let res = await fetch(`http://127.0.0.1:8788/`); + let html = await res.text(); + let $ = cheerio.load(html); + expect($("#hasCACHES").text()).to.contain("true"); + }); +}); diff --git a/packages/integrations/cloudflare/test/wrangler.toml b/packages/integrations/cloudflare/test/wrangler.toml deleted file mode 100644 index 2c1acb55a..000000000 --- a/packages/integrations/cloudflare/test/wrangler.toml +++ /dev/null @@ -1,6 +0,0 @@ -# for tests only - -send_metrics = false - -[vars] -SECRET_STUFF = "secret" diff --git a/packages/integrations/cloudflare/tsconfig.json b/packages/integrations/cloudflare/tsconfig.json index 1504b4b6d..b9feb9b9b 100644 --- a/packages/integrations/cloudflare/tsconfig.json +++ b/packages/integrations/cloudflare/tsconfig.json @@ -1,6 +1,8 @@ { - "extends": "../../../tsconfig.base.json", - "include": ["src"], + "extends": "../../tsconfig.base.json", + "include": [ + "src" + ], "compilerOptions": { "outDir": "./dist" } |