summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/early-planets-knock.md5
-rw-r--r--packages/astro/src/core/build/static-build.ts20
-rw-r--r--packages/astro/test/units/build/static-build.test.js58
3 files changed, 67 insertions, 16 deletions
diff --git a/.changeset/early-planets-knock.md b/.changeset/early-planets-knock.md
new file mode 100644
index 000000000..378e2f4b2
--- /dev/null
+++ b/.changeset/early-planets-knock.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Fix filename generation for `.astro` pages
diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts
index 8e3cf8fa8..95027fd5b 100644
--- a/packages/astro/src/core/build/static-build.ts
+++ b/packages/astro/src/core/build/static-build.ts
@@ -445,22 +445,10 @@ export function makeAstroPageEntryPointFileName(
facadeModuleId: string,
routes: RouteData[]
) {
- const pageModuleId = facadeModuleId
- .replace(prefix, '')
- .replace(ASTRO_PAGE_EXTENSION_POST_PATTERN, '.');
- let route = routes.find((routeData) => {
- return routeData.route === pageModuleId;
- });
- let name = pageModuleId;
- if (route) {
- name = route.route;
- }
- if (name.endsWith('/')) name += 'index';
- const fileName = `${name.replaceAll('[', '_').replaceAll(']', '_').replaceAll('...', '---')}.mjs`;
- if (name.startsWith('..')) {
- return `pages${fileName}`;
- }
- return fileName;
+ const pageModuleId = facadeModuleId.replace(prefix, '').replace(ASTRO_PAGE_EXTENSION_POST_PATTERN, '.');
+ const route = routes.find((routeData) => routeData.component === pageModuleId);
+ const name = route?.route ?? pageModuleId;
+ return `pages${name.replace(/\/$/, '/index').replaceAll(/[\[\]]/g, '_').replaceAll('...', '---')}.astro.mjs`;
}
/**
diff --git a/packages/astro/test/units/build/static-build.test.js b/packages/astro/test/units/build/static-build.test.js
new file mode 100644
index 000000000..632b1c429
--- /dev/null
+++ b/packages/astro/test/units/build/static-build.test.js
@@ -0,0 +1,58 @@
+import { expect } from 'chai';
+import { makeAstroPageEntryPointFileName } from '../../../dist/core/build/static-build.js';
+
+describe('astro/src/core/build', () => {
+ describe('makeAstroPageEntryPointFileName', () => {
+ const routes = [
+ {
+ route: '/',
+ component: 'src/pages/index.astro',
+ pathname: '/',
+ },
+ {
+ route: '/injected',
+ component: '../node_modules/my-dep/injected.astro',
+ pathname: '/injected',
+ },
+ {
+ route: '/injected-workspace',
+ component: '../../packages/demo/[...all].astro',
+ pathname: undefined,
+ },
+ {
+ route: '/blog/[year]/[...slug]',
+ component: 'src/pages/blog/[year]/[...slug].astro',
+ pathname: undefined,
+ },
+ ]
+
+ it('handles local pages', async () => {
+ const input = '@astro-page:src/pages/index@_@astro';
+ const output = 'pages/index.astro.mjs';
+ const result = makeAstroPageEntryPointFileName('@astro-page:', input, routes);
+ expect(result).to.equal(output)
+ });
+
+ it('handles dynamic pages', async () => {
+ const input = '@astro-page:src/pages/blog/[year]/[...slug]@_@astro';
+ const output = 'pages/blog/_year_/_---slug_.astro.mjs';
+ const result = makeAstroPageEntryPointFileName('@astro-page:', input, routes);
+ expect(result).to.equal(output)
+ });
+
+ it('handles node_modules pages', async () => {
+ const input = '@astro-page:../node_modules/my-dep/injected@_@astro';
+ const output = 'pages/injected.astro.mjs';
+ const result = makeAstroPageEntryPointFileName('@astro-page:', input, routes);
+ expect(result).to.equal(output)
+ });
+
+ // Fix #7561
+ it('handles local workspace pages', async () => {
+ const input = '@astro-page:../../packages/demo/[...all]@_@astro';
+ const output = 'pages/injected-workspace.astro.mjs';
+ const result = makeAstroPageEntryPointFileName('@astro-page:', input, routes);
+ expect(result).to.equal(output)
+ });
+ });
+});