From 904ad47ea9588c0b1d8c583f3f04e4ae199474d9 Mon Sep 17 00:00:00 2001 From: Chris Swithinbank Date: Mon, 29 Jul 2024 15:22:08 +0200 Subject: Fix bug for projects with spaces in their pathname (#2156) --- .changeset/thirty-planes-divide.md | 5 +++++ packages/starlight/__e2e__/collection-config.test.ts | 4 +++- .../__e2e__/fixtures/custom src-dir/astro.config.mjs | 12 ++++++++++++ .../starlight/__e2e__/fixtures/custom src-dir/package.json | 9 +++++++++ .../__e2e__/fixtures/custom src-dir/www/content/config.ts | 6 ++++++ .../starlight/__e2e__/fixtures/custom src-dir/www/env.d.ts | 2 ++ .../__e2e__/fixtures/custom src-dir/www/pages/custom.astro | 7 +++++++ .../__e2e__/fixtures/custom-src-dir/astro.config.mjs | 12 ------------ .../starlight/__e2e__/fixtures/custom-src-dir/package.json | 9 --------- .../__e2e__/fixtures/custom-src-dir/www/content/config.ts | 6 ------ .../starlight/__e2e__/fixtures/custom-src-dir/www/env.d.ts | 2 -- .../__e2e__/fixtures/custom-src-dir/www/pages/custom.astro | 7 ------- packages/starlight/integrations/virtual-user-config.ts | 13 ++++++++++--- pnpm-lock.yaml | 2 +- 14 files changed, 55 insertions(+), 41 deletions(-) create mode 100644 .changeset/thirty-planes-divide.md create mode 100644 packages/starlight/__e2e__/fixtures/custom src-dir/astro.config.mjs create mode 100644 packages/starlight/__e2e__/fixtures/custom src-dir/package.json create mode 100644 packages/starlight/__e2e__/fixtures/custom src-dir/www/content/config.ts create mode 100644 packages/starlight/__e2e__/fixtures/custom src-dir/www/env.d.ts create mode 100644 packages/starlight/__e2e__/fixtures/custom src-dir/www/pages/custom.astro delete mode 100644 packages/starlight/__e2e__/fixtures/custom-src-dir/astro.config.mjs delete mode 100644 packages/starlight/__e2e__/fixtures/custom-src-dir/package.json delete mode 100644 packages/starlight/__e2e__/fixtures/custom-src-dir/www/content/config.ts delete mode 100644 packages/starlight/__e2e__/fixtures/custom-src-dir/www/env.d.ts delete mode 100644 packages/starlight/__e2e__/fixtures/custom-src-dir/www/pages/custom.astro diff --git a/.changeset/thirty-planes-divide.md b/.changeset/thirty-planes-divide.md new file mode 100644 index 00000000..bf74f696 --- /dev/null +++ b/.changeset/thirty-planes-divide.md @@ -0,0 +1,5 @@ +--- +"@astrojs/starlight": patch +--- + +Fixes builds for projects with a space in their pathname diff --git a/packages/starlight/__e2e__/collection-config.test.ts b/packages/starlight/__e2e__/collection-config.test.ts index 5b26f9dc..7e9d6d06 100644 --- a/packages/starlight/__e2e__/collection-config.test.ts +++ b/packages/starlight/__e2e__/collection-config.test.ts @@ -1,6 +1,8 @@ import { expect, testFactory } from './test-utils'; -const test = await testFactory('./fixtures/custom-src-dir/'); +// This fixture contains a space in the directory so that we have a smoke test for building +// Starlight projects with pathnames like this, which are a common source of bugs. +const test = await testFactory('./fixtures/custom src-dir/'); test('builds a custom page using the `` component and a custom `srcDir`', async ({ page, diff --git a/packages/starlight/__e2e__/fixtures/custom src-dir/astro.config.mjs b/packages/starlight/__e2e__/fixtures/custom src-dir/astro.config.mjs new file mode 100644 index 00000000..9e759d9e --- /dev/null +++ b/packages/starlight/__e2e__/fixtures/custom src-dir/astro.config.mjs @@ -0,0 +1,12 @@ +import starlight from '@astrojs/starlight'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + srcDir: './www', + integrations: [ + starlight({ + title: 'Custom src directory', + pagefind: false, + }), + ], +}); diff --git a/packages/starlight/__e2e__/fixtures/custom src-dir/package.json b/packages/starlight/__e2e__/fixtures/custom src-dir/package.json new file mode 100644 index 00000000..b6d71aca --- /dev/null +++ b/packages/starlight/__e2e__/fixtures/custom src-dir/package.json @@ -0,0 +1,9 @@ +{ + "name": "@e2e/custom-src-dir", + "version": "0.0.0", + "private": true, + "dependencies": { + "@astrojs/starlight": "workspace:*", + "astro": "^4.10.2" + } +} diff --git a/packages/starlight/__e2e__/fixtures/custom src-dir/www/content/config.ts b/packages/starlight/__e2e__/fixtures/custom src-dir/www/content/config.ts new file mode 100644 index 00000000..45f60b01 --- /dev/null +++ b/packages/starlight/__e2e__/fixtures/custom src-dir/www/content/config.ts @@ -0,0 +1,6 @@ +import { defineCollection } from 'astro:content'; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ schema: docsSchema() }), +}; diff --git a/packages/starlight/__e2e__/fixtures/custom src-dir/www/env.d.ts b/packages/starlight/__e2e__/fixtures/custom src-dir/www/env.d.ts new file mode 100644 index 00000000..acef35f1 --- /dev/null +++ b/packages/starlight/__e2e__/fixtures/custom src-dir/www/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/packages/starlight/__e2e__/fixtures/custom src-dir/www/pages/custom.astro b/packages/starlight/__e2e__/fixtures/custom src-dir/www/pages/custom.astro new file mode 100644 index 00000000..680eaaef --- /dev/null +++ b/packages/starlight/__e2e__/fixtures/custom src-dir/www/pages/custom.astro @@ -0,0 +1,7 @@ +--- +import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; +--- + + +

Hello

+
diff --git a/packages/starlight/__e2e__/fixtures/custom-src-dir/astro.config.mjs b/packages/starlight/__e2e__/fixtures/custom-src-dir/astro.config.mjs deleted file mode 100644 index 9e759d9e..00000000 --- a/packages/starlight/__e2e__/fixtures/custom-src-dir/astro.config.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import starlight from '@astrojs/starlight'; -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - srcDir: './www', - integrations: [ - starlight({ - title: 'Custom src directory', - pagefind: false, - }), - ], -}); diff --git a/packages/starlight/__e2e__/fixtures/custom-src-dir/package.json b/packages/starlight/__e2e__/fixtures/custom-src-dir/package.json deleted file mode 100644 index b6d71aca..00000000 --- a/packages/starlight/__e2e__/fixtures/custom-src-dir/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "@e2e/custom-src-dir", - "version": "0.0.0", - "private": true, - "dependencies": { - "@astrojs/starlight": "workspace:*", - "astro": "^4.10.2" - } -} diff --git a/packages/starlight/__e2e__/fixtures/custom-src-dir/www/content/config.ts b/packages/starlight/__e2e__/fixtures/custom-src-dir/www/content/config.ts deleted file mode 100644 index 45f60b01..00000000 --- a/packages/starlight/__e2e__/fixtures/custom-src-dir/www/content/config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { defineCollection } from 'astro:content'; -import { docsSchema } from '@astrojs/starlight/schema'; - -export const collections = { - docs: defineCollection({ schema: docsSchema() }), -}; diff --git a/packages/starlight/__e2e__/fixtures/custom-src-dir/www/env.d.ts b/packages/starlight/__e2e__/fixtures/custom-src-dir/www/env.d.ts deleted file mode 100644 index acef35f1..00000000 --- a/packages/starlight/__e2e__/fixtures/custom-src-dir/www/env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/packages/starlight/__e2e__/fixtures/custom-src-dir/www/pages/custom.astro b/packages/starlight/__e2e__/fixtures/custom-src-dir/www/pages/custom.astro deleted file mode 100644 index 680eaaef..00000000 --- a/packages/starlight/__e2e__/fixtures/custom-src-dir/www/pages/custom.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro'; ---- - - -

Hello

-
diff --git a/packages/starlight/integrations/virtual-user-config.ts b/packages/starlight/integrations/virtual-user-config.ts index d955ad50..75bdd0d0 100644 --- a/packages/starlight/integrations/virtual-user-config.ts +++ b/packages/starlight/integrations/virtual-user-config.ts @@ -19,8 +19,15 @@ export function vitePluginStarlightUserConfig( build: Pick; } ): NonNullable[number] { - const resolveId = (id: string) => - JSON.stringify(id.startsWith('.') ? resolve(fileURLToPath(root), id) : id); + /** + * Resolves module IDs to a usable format: + * - Relative paths (e.g. `'./module.js'`) are resolved against `base` and formatted as an absolute path. + * - Package identifiers (e.g. `'module'`) are returned unchanged. + * + * By default, `base` is the project root directory. + */ + const resolveId = (id: string, base = root) => + JSON.stringify(id.startsWith('.') ? resolve(fileURLToPath(base), id) : id); const virtualComponentModules = Object.fromEntries( Object.entries(opts.components).map(([name, path]) => [ @@ -50,7 +57,7 @@ export function vitePluginStarlightUserConfig( : 'export const logos = {};', 'virtual:starlight/collection-config': `let userCollections; try { - userCollections = (await import('${new URL('./content/config.ts', srcDir).pathname}')).collections; + userCollections = (await import(${resolveId('./content/config.ts', srcDir)})).collections; } catch {} export const collections = userCollections;`, ...virtualComponentModules, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da143b36..36f068d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -222,7 +222,7 @@ importers: specifier: ^4.10.2 version: 4.10.2(@types/node@18.16.19)(typescript@5.4.5) - packages/starlight/__e2e__/fixtures/custom-src-dir: + packages/starlight/__e2e__/fixtures/custom src-dir: dependencies: '@astrojs/starlight': specifier: workspace:* -- cgit