diff options
-rw-r--r-- | .changeset/early-planets-knock.md | 5 | ||||
-rw-r--r-- | packages/astro/src/core/build/static-build.ts | 20 | ||||
-rw-r--r-- | packages/astro/test/units/build/static-build.test.js | 58 |
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) + }); + }); +}); |