diff options
20 files changed, 158 insertions, 16 deletions
diff --git a/packages/integrations/cloudflare/CHANGELOG.md b/packages/integrations/cloudflare/CHANGELOG.md index 2a481aa86..18bce6fc1 100644 --- a/packages/integrations/cloudflare/CHANGELOG.md +++ b/packages/integrations/cloudflare/CHANGELOG.md @@ -48,6 +48,18 @@ - [#392](https://github.com/withastro/adapters/pull/392) [`3a49eb7`](https://github.com/withastro/adapters/commit/3a49eb7802c44212ccfab06034b7dc5f2b060e94) Thanks [@Princesseuh](https://github.com/Princesseuh)! - Updates internal code for Astro 5 changes. No changes is required to your project, apart from using Astro 5 +## 11.1.0 + +### Minor Changes + +- [#394](https://github.com/withastro/adapters/pull/394) [`44dfa99`](https://github.com/withastro/adapters/commit/44dfa9935e22edab16490d625a88aaa0f1942a19) Thanks [@veitbjarsch](https://github.com/veitbjarsch)! - Added functionality to compare include and exclude rules to reduce the amount of cloudflare rules + +## 11.0.5 + +### Patch Changes + +- [#387](https://github.com/withastro/adapters/pull/387) [`04e5c38`](https://github.com/withastro/adapters/commit/04e5c389f251efa02fe7b973ed95cdc61fad3389) Thanks [@veitbjarsch](https://github.com/veitbjarsch)! - Fixes a bug which was caused on windows when splitting static file paths + ## 11.0.4 ### Patch Changes diff --git a/packages/integrations/cloudflare/package.json b/packages/integrations/cloudflare/package.json index 5c1bd36b5..0cb3e0636 100644 --- a/packages/integrations/cloudflare/package.json +++ b/packages/integrations/cloudflare/package.json @@ -30,14 +30,14 @@ "dependencies": { "@astrojs/internal-helpers": "0.4.1", "@astrojs/underscore-redirects": "^0.4.0-alpha.0", - "@cloudflare/workers-types": "^4.20240903.0", + "@cloudflare/workers-types": "^4.20240925.0", "esbuild": "^0.23.1", "estree-walker": "^3.0.3", "magic-string": "^0.30.11", - "miniflare": "^3.20240821.1", + "miniflare": "^3.20240925.0", "tiny-glob": "^0.2.9", - "wrangler": "^3.75.0", - "@inox-tools/astro-when": "^0.2.2" + "wrangler": "^3.78.12", + "@inox-tools/astro-when": "^0.2.3" }, "peerDependencies": { "astro": "^5.0.0-alpha.8" @@ -49,9 +49,9 @@ "cheerio": "1.0.0", "execa": "^8.0.1", "fast-glob": "^3.3.2", - "rollup": "^4.21.2", + "rollup": "^4.22.5", "strip-ansi": "^7.1.0", - "vite": "^5.4.3" + "vite": "^5.4.8" }, "publishConfig": { "provenance": true diff --git a/packages/integrations/cloudflare/src/utils/generate-routes-json.ts b/packages/integrations/cloudflare/src/utils/generate-routes-json.ts index a87e59308..43adeb675 100644 --- a/packages/integrations/cloudflare/src/utils/generate-routes-json.ts +++ b/packages/integrations/cloudflare/src/utils/generate-routes-json.ts @@ -2,7 +2,7 @@ import type { AstroConfig, AstroIntegrationLogger, IntegrationRouteData, RoutePa import { existsSync } from 'node:fs'; import { writeFile } from 'node:fs/promises'; -import { posix } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { prependForwardSlash, @@ -128,6 +128,31 @@ class PathTrie { } } + /** + * The reduce function is used to remove unnecessary paths from the trie. + * It receives a trie node to compare with the current node. + */ + private reduce(compNode: TrieNode, node: TrieNode): void { + if (node.hasWildcardChild || compNode.hasWildcardChild) return; + + for (const [segment, childNode] of node.children) { + if (childNode.children.size === 0) continue; + + const compChildNode = compNode.children.get(segment); + if (compChildNode === undefined) { + childNode.hasWildcardChild = true; + continue; + } + + this.reduce(compChildNode, childNode); + } + } + + reduceAllPaths(compTrie: PathTrie): this { + this.reduce(compTrie.root, this.root); + return this; + } + getAllPaths(): [string[][], boolean] { const allPaths: string[][] = []; this.dfs(this.root, [], allPaths); @@ -186,7 +211,7 @@ export async function createRoutesFile( const staticPath = staticFile; const segments = removeLeadingForwardSlash(staticPath) - .split(posix.sep) + .split(path.sep) .filter(Boolean) .map((s: string) => { return getParts(s); @@ -232,7 +257,7 @@ export async function createRoutesFile( for (const page of pages) { if (page.pathname === '404') hasPrerendered404 = true; const pageSegments = removeLeadingForwardSlash(page.pathname) - .split(posix.sep) + .split(path.posix.sep) .filter(Boolean) .map((s) => { return getParts(s); @@ -244,7 +269,6 @@ export async function createRoutesFile( for (const includePath of includePaths) { includeTrie.insert(includePath); } - const [deduplicatedIncludePaths, includedPathsHaveWildcard] = includeTrie.getAllPaths(); const excludeTrie = new PathTrie(); for (const excludePath of excludePaths) { @@ -256,7 +280,14 @@ export async function createRoutesFile( if (excludePath[0] === '*') continue; excludeTrie.insert(excludePath); } - const [deduplicatedExcludePaths, _excludedPathsHaveWildcard] = excludeTrie.getAllPaths(); + + const [deduplicatedIncludePaths, includedPathsHaveWildcard] = includeTrie + .reduceAllPaths(excludeTrie) + .getAllPaths(); + + const [deduplicatedExcludePaths, _excludedPathsHaveWildcard] = excludeTrie + .reduceAllPaths(includeTrie) + .getAllPaths(); /** * Cloudflare allows no more than 100 include/exclude rules combined diff --git a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/package.json b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/package.json index 1f9b7f249..2392c6172 100644 --- a/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/package.json +++ b/packages/integrations/cloudflare/test/fixtures/astro-dev-platform/package.json @@ -7,6 +7,6 @@ "astro": "^5.0.0-alpha.8" }, "devDependencies": { - "wrangler": "^3.75.0" + "wrangler": "^3.78.12" } } diff --git a/packages/integrations/cloudflare/test/fixtures/astro-env/package.json b/packages/integrations/cloudflare/test/fixtures/astro-env/package.json index 23028a77c..2598bee1a 100644 --- a/packages/integrations/cloudflare/test/fixtures/astro-env/package.json +++ b/packages/integrations/cloudflare/test/fixtures/astro-env/package.json @@ -7,6 +7,6 @@ "astro": "^5.0.0-alpha.8" }, "devDependencies": { - "wrangler": "^3.75.0" + "wrangler": "^3.78.12" } } 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/with-solid-js/package.json b/packages/integrations/cloudflare/test/fixtures/with-solid-js/package.json index 9f96b1017..13df3b222 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": "^4.4.1", + "@astrojs/solid-js": "^4.4.2", "astro": "^5.0.0-alpha.8", - "solid-js": "^1.8.21" + "solid-js": "^1.9.1" } } diff --git a/packages/integrations/cloudflare/test/routes-json.test.js b/packages/integrations/cloudflare/test/routes-json.test.js index 1442ddfed..95a50c306 100644 --- a/packages/integrations/cloudflare/test/routes-json.test.js +++ b/packages/integrations/cloudflare/test/routes-json.test.js @@ -48,7 +48,7 @@ describe('_routes.json generation', () => { assert.deepEqual(routes, { version: 1, include: ['/*'], - exclude: ['/_astro/*', '/redirectme', '/public.txt', '/a/redirect'], + exclude: ['/_astro/*', '/redirectme', '/public.txt', '/a/*'], }); }); }); @@ -146,4 +146,43 @@ describe('_routes.json generation', () => { }); }); }); + + 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: [ + '/', + '/dynamicPages/*', + '/mixedPages/dynamic', + '/mixedPages/subfolder/dynamic', + '/_image', + ], + exclude: [ + '/_astro/*', + '/redirectme', + '/public.txt', + '/a/*', + '/404', + '/mixedPages/static', + '/mixedPages/subfolder/static', + '/staticPages/*', + ], + }); + }); + }); }); |