summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Nworm <35765846+1574242600@users.noreply.github.com> 2024-03-15 18:27:07 +0800
committerGravatar GitHub <noreply@github.com> 2024-03-15 10:27:07 +0000
commit3776ecf0aa9e08a992d3ae76e90682fd04093721 (patch)
tree2d0ff5672ea274165944fe9176615b8ec1aceb12
parent464bea398ba0552b15a7fd687634c09999102be8 (diff)
downloadastro-3776ecf0aa9e08a992d3ae76e90682fd04093721.tar.gz
astro-3776ecf0aa9e08a992d3ae76e90682fd04093721.tar.zst
astro-3776ecf0aa9e08a992d3ae76e90682fd04093721.zip
fix(routing): partially dynamic segments are being truncated (#10379)
* fix(routing): partially dynamic segments are being truncated and affecting routing. * test: fix "/static should be higher priority than /static-" * Update .changeset/five-colts-rescue.md Co-authored-by: Florian Lefebvre <contact@florian-lefebvre.dev> * test: fix the check that was wrongly deleted. * other: improve code readability. --------- Co-authored-by: Florian Lefebvre <contact@florian-lefebvre.dev>
-rw-r--r--.changeset/five-colts-rescue.md5
-rw-r--r--packages/astro/src/core/routing/manifest/create.ts20
-rw-r--r--packages/astro/test/units/routing/manifest.test.js48
3 files changed, 62 insertions, 11 deletions
diff --git a/.changeset/five-colts-rescue.md b/.changeset/five-colts-rescue.md
new file mode 100644
index 000000000..617617967
--- /dev/null
+++ b/.changeset/five-colts-rescue.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Fixes a routing issue with partially truncated dynamic segments.
diff --git a/packages/astro/src/core/routing/manifest/create.ts b/packages/astro/src/core/routing/manifest/create.ts
index 00b87a049..e30440fa4 100644
--- a/packages/astro/src/core/routing/manifest/create.ts
+++ b/packages/astro/src/core/routing/manifest/create.ts
@@ -401,9 +401,7 @@ function createFileBasedRoutes(
const pathname = segments.every((segment) => segment.length === 1 && !segment[0].dynamic)
? `/${segments.map((segment) => segment[0].content).join('/')}`
: null;
- const route = `/${segments
- .map(([{ dynamic, content }]) => (dynamic ? `[${content}]` : content))
- .join('/')}`.toLowerCase();
+ const route = joinSegments(segments);
routes.push({
route,
isIndex: item.isIndex,
@@ -478,9 +476,7 @@ function createInjectedRoutes({ settings, cwd }: CreateRouteManifestParams): Pri
.flat()
.filter((p) => p.dynamic)
.map((p) => p.content);
- const route = `/${segments
- .map(([{ dynamic, content }]) => (dynamic ? `[${content}]` : content))
- .join('/')}`.toLowerCase();
+ const route = joinSegments(segments);
routes[priority].push({
type,
@@ -536,9 +532,7 @@ function createRedirectRoutes(
.flat()
.filter((p) => p.dynamic)
.map((p) => p.content);
- const route = `/${segments
- .map(([{ dynamic, content }]) => (dynamic ? `[${content}]` : content))
- .join('/')}`.toLowerCase();
+ const route = joinSegments(segments);
let destination: string;
if (typeof to === 'string') {
@@ -899,3 +893,11 @@ function computeRoutePriority(config: AstroConfig): RoutePriorityOverride {
}
return 'legacy';
}
+
+function joinSegments(segments: RoutePart[][]): string {
+ const arr = segments.map((segment) => {
+ return segment.map((rp) => (rp.dynamic ? `[${rp.content}]` : rp.content)).join('');
+ });
+
+ return `/${arr.join('/')}`.toLowerCase();
+}
diff --git a/packages/astro/test/units/routing/manifest.test.js b/packages/astro/test/units/routing/manifest.test.js
index 91816d1bc..e5fa35729 100644
--- a/packages/astro/test/units/routing/manifest.test.js
+++ b/packages/astro/test/units/routing/manifest.test.js
@@ -144,8 +144,8 @@ describe('routing - createRouteManifest', () => {
assertRouteRelations(getManifestRoutes(manifest), [
['/', '/[...rest]'],
- ['/static', '/static-'],
- ['/static-', '/[dynamic]'],
+ ['/static', '/static-[dynamic]'],
+ ['/static-[dynamic]', '/[dynamic]'],
['/static', '/[dynamic]'],
['/static', '/[...rest]'],
['/[dynamic]', '/[...rest]'],
@@ -567,4 +567,48 @@ describe('routing - createRouteManifest', () => {
},
]);
});
+
+ it('should concatenate each part of the segment. issues#10122', async () => {
+ const fs = createFs(
+ {
+ '/src/pages/a-[b].astro': `<h1>test</h1>`,
+ '/src/pages/blog/a-[b].233.ts': ``,
+ },
+ root
+ );
+
+ const settings = await createBasicSettings({
+ root: fileURLToPath(root),
+ output: 'server',
+ base: '/search',
+ trailingSlash: 'never',
+ redirects: {
+ '/posts/a-[b].233': '/blog/a-[b].233',
+ },
+ experimental: {
+ globalRoutePriority: true,
+ },
+ });
+
+ settings.injectedRoutes = [
+ {
+ pattern: '/[c]-d',
+ entrypoint: '@lib/legacy/dynamic.astro',
+ priority: 'normal',
+ },
+ ];
+
+ const manifest = createRouteManifest({
+ cwd: fileURLToPath(root),
+ settings,
+ fsMod: fs,
+ });
+
+ assert.deepEqual(getManifestRoutes(manifest), [
+ { type: 'endpoint', route: '/blog/a-[b].233' },
+ { type: 'redirect', route: '/posts/a-[b].233' },
+ { type: 'page', route: '/[c]-d' },
+ { type: 'page', route: '/a-[b]' },
+ ]);
+ });
});