From ab8746eea7dcbfadd7210c2fbfcb8b7dfca0ac3c Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 11 Jun 2024 16:57:40 +0100 Subject: [PATCH] fix(astro): handle symlinked content collection directories --- .changeset/fifty-clouds-clean.md | 5 +++ packages/astro/src/content/utils.ts | 40 ++++++++++++++++++ .../content/vite-plugin-content-imports.ts | 18 ++++++-- .../astro/test/content-collections.test.js | 22 ++++++++++ .../src/assets/the-future.jpg | Bin 0 -> 22792 bytes .../content-collections/src/content/config.ts | 23 +++++++++- .../src/content/with-symlinked-content | 1 + .../src/content/with-symlinked-data | 1 + .../src/pages/collections.json.js | 4 +- .../content-collection/first.md | 6 +++ .../content-collection/second.md | 6 +++ .../content-collection/third.md | 6 +++ .../data-collection/welcome.json | 4 ++ pnpm-lock.yaml | 1 - 14 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 .changeset/fifty-clouds-clean.md create mode 100644 packages/astro/test/fixtures/content-collections/src/assets/the-future.jpg create mode 120000 packages/astro/test/fixtures/content-collections/src/content/with-symlinked-content create mode 120000 packages/astro/test/fixtures/content-collections/src/content/with-symlinked-data create mode 100644 packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/first.md create mode 100644 packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/second.md create mode 100644 packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/third.md create mode 100644 packages/astro/test/fixtures/content-collections/symlinked-collections/data-collection/welcome.json diff --git a/.changeset/fifty-clouds-clean.md b/.changeset/fifty-clouds-clean.md new file mode 100644 index 000000000000..cb1c57811c59 --- /dev/null +++ b/.changeset/fifty-clouds-clean.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Supports symlinked content collection directories diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index b7a1175c0a31..3a71f2e1d0da 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -167,6 +167,46 @@ export function getEntryConfigByExtMap> { + const contentPaths = new Map(); + const contentDirPath = fileURLToPath(contentDir); + + const contentDirEntries = await fsMod.promises.readdir(contentDir, { withFileTypes: true }); + for (const entry of contentDirEntries) { + if (entry.isSymbolicLink()) { + const entryPath = path.join(contentDirPath, entry.name); + const realPath = await fsMod.promises.realpath(entryPath); + contentPaths.set(realPath, entry.name); + } + } + return contentPaths; +} + +export function reverseSymlinks({ + entry, + symlinks, + contentDir, +}: { + entry: string | URL; + contentDir: string | URL; + symlinks?: Map; +}): string { + const entryPath = typeof entry === 'string' ? entry : fileURLToPath(entry); + const contentDirPath = typeof contentDir === 'string' ? contentDir : fileURLToPath(contentDir); + if (!symlinks) { + return entryPath; + } + + for (const [realPath, symlinkName] of symlinks) { + if (entryPath.startsWith(realPath)) { + return path.join(contentDirPath, symlinkName, entryPath.replace(realPath, '')); + } + } + return entryPath; +} + export function getEntryCollectionName({ contentDir, entry, diff --git a/packages/astro/src/content/vite-plugin-content-imports.ts b/packages/astro/src/content/vite-plugin-content-imports.ts index 2589a9629444..ffc3aa68feb8 100644 --- a/packages/astro/src/content/vite-plugin-content-imports.ts +++ b/packages/astro/src/content/vite-plugin-content-imports.ts @@ -28,10 +28,12 @@ import { getEntryConfigByExtMap, getEntryData, getEntryType, + getSymlinkedContentCollections, globalContentConfigObserver, hasContentFlag, parseEntrySlug, reloadContentConfigObserver, + reverseSymlinks, } from './utils.js'; function getContentRendererByViteId( @@ -75,16 +77,26 @@ export function astroContentImportPlugin({ const dataEntryConfigByExt = getEntryConfigByExtMap(settings.dataEntryTypes); const { contentDir } = contentPaths; let shouldEmitFile = false; - + let symlinks: Map; const plugins: Plugin[] = [ { name: 'astro:content-imports', config(_config, env) { shouldEmitFile = env.command === 'build'; }, + async buildStart() { + // Get symlinks once at build start + symlinks = await getSymlinkedContentCollections(contentDir); + }, async transform(_, viteId) { if (hasContentFlag(viteId, DATA_FLAG)) { - const fileId = viteId.split('?')[0] ?? viteId; + // By default, Vite will resolve symlinks to their targets. We need to reverse this for + // content entries, so we can get the path relative to the content directory. + const fileId = reverseSymlinks({ + entry: viteId.split('?')[0] ?? viteId, + contentDir, + symlinks, + }); // Data collections don't need to rely on the module cache. // This cache only exists for the `render()` function specific to content. const { id, data, collection, _internal } = await getDataEntryModule({ @@ -109,7 +121,7 @@ export const _internal = { `; return code; } else if (hasContentFlag(viteId, CONTENT_FLAG)) { - const fileId = viteId.split('?')[0]; + const fileId = reverseSymlinks({ entry: viteId.split('?')[0], contentDir, symlinks }); const { id, slug, collection, body, data, _internal } = await getContentEntryModule({ fileId, entryConfigByExt: contentEntryConfigByExt, diff --git a/packages/astro/test/content-collections.test.js b/packages/astro/test/content-collections.test.js index 828e10940f38..fb518b261479 100644 --- a/packages/astro/test/content-collections.test.js +++ b/packages/astro/test/content-collections.test.js @@ -98,6 +98,28 @@ describe('Content Collections', () => { subject: 'My Newsletter', }); }); + + it('Handles symlinked content', async () => { + assert.ok(json.hasOwnProperty('withSymlinkedContent')); + assert.equal(Array.isArray(json.withSymlinkedContent), true); + + const ids = json.withSymlinkedContent.map((item) => item.id); + assert.deepEqual(ids, ['first.md', 'second.md', 'third.md']); + assert.equal(json.withSymlinkedContent[0].data.title, 'First Blog'); + }); + + it('Handles symlinked data', async () => { + assert.ok(json.hasOwnProperty('withSymlinkedData')); + assert.equal(Array.isArray(json.withSymlinkedData), true); + + const ids = json.withSymlinkedData.map((item) => item.id); + assert.deepEqual(ids, ['welcome']); + assert.equal( + json.withSymlinkedData[0].data.alt, + 'Futuristic landscape with chrome buildings and blue skies' + ); + assert.notEqual(json.withSymlinkedData[0].data.src.src, undefined); + }); }); describe('Propagation', () => { diff --git a/packages/astro/test/fixtures/content-collections/src/assets/the-future.jpg b/packages/astro/test/fixtures/content-collections/src/assets/the-future.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9caf02ab6ee318cdbfbcc70ac050e6d2cd36575 GIT binary patch literal 22792 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 giq|Gbr4^$y_?D}o2z=*>mGZ-~a#s literal 0 HcmV?d00001 diff --git a/packages/astro/test/fixtures/content-collections/src/content/config.ts b/packages/astro/test/fixtures/content-collections/src/content/config.ts index efe38f0d7385..de770acede7a 100644 --- a/packages/astro/test/fixtures/content-collections/src/content/config.ts +++ b/packages/astro/test/fixtures/content-collections/src/content/config.ts @@ -11,7 +11,7 @@ const withSchemaConfig = defineCollection({ isDraft: z.boolean().default(false), lang: z.enum(['en', 'fr', 'es']).default('en'), publishedAt: z.date().transform((val) => new Date(val)), - }) + }), }); const withUnionSchema = defineCollection({ @@ -28,8 +28,27 @@ const withUnionSchema = defineCollection({ ]), }); +const withSymlinkedData = defineCollection({ + type: 'data', + schema: ({ image }) => + z.object({ + alt: z.string(), + src: image(), + }), +}); + +const withSymlinkedContent = defineCollection({ + type: 'content', + schema: z.object({ + title: z.string(), + date: z.date(), + }), +}); + export const collections = { 'with-custom-slugs': withCustomSlugs, 'with-schema-config': withSchemaConfig, 'with-union-schema': withUnionSchema, -} + 'with-symlinked-data': withSymlinkedData, + 'with-symlinked-content': withSymlinkedContent, +}; diff --git a/packages/astro/test/fixtures/content-collections/src/content/with-symlinked-content b/packages/astro/test/fixtures/content-collections/src/content/with-symlinked-content new file mode 120000 index 000000000000..e66bf94bc1f0 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections/src/content/with-symlinked-content @@ -0,0 +1 @@ +../../symlinked-collections/content-collection \ No newline at end of file diff --git a/packages/astro/test/fixtures/content-collections/src/content/with-symlinked-data b/packages/astro/test/fixtures/content-collections/src/content/with-symlinked-data new file mode 120000 index 000000000000..f90d3eb907e7 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections/src/content/with-symlinked-data @@ -0,0 +1 @@ +../../symlinked-collections/data-collection \ No newline at end of file diff --git a/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js b/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js index b7b7d847253e..67bafdb93e1d 100644 --- a/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js +++ b/packages/astro/test/fixtures/content-collections/src/pages/collections.json.js @@ -7,8 +7,10 @@ export async function GET() { const withSchemaConfig = stripAllRenderFn(await getCollection('with-schema-config')); const withSlugConfig = stripAllRenderFn(await getCollection('with-custom-slugs')); const withUnionSchema = stripAllRenderFn(await getCollection('with-union-schema')); + const withSymlinkedContent = stripAllRenderFn(await getCollection('with-symlinked-content')); + const withSymlinkedData = stripAllRenderFn(await getCollection('with-symlinked-data')); return new Response( - devalue.stringify({ withoutConfig, withSchemaConfig, withSlugConfig, withUnionSchema }) + devalue.stringify({ withoutConfig, withSchemaConfig, withSlugConfig, withUnionSchema, withSymlinkedContent, withSymlinkedData }), ); } diff --git a/packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/first.md b/packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/first.md new file mode 100644 index 000000000000..0ecb2d8587b0 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/first.md @@ -0,0 +1,6 @@ +--- +title: "First Blog" +date: 2024-04-05 +--- + +First blog content. diff --git a/packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/second.md b/packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/second.md new file mode 100644 index 000000000000..dcded99ccf63 --- /dev/null +++ b/packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/second.md @@ -0,0 +1,6 @@ +--- +title: "Second Blog" +date: 2024-04-06 +--- + +Second blog content. diff --git a/packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/third.md b/packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/third.md new file mode 100644 index 000000000000..1adee317378b --- /dev/null +++ b/packages/astro/test/fixtures/content-collections/symlinked-collections/content-collection/third.md @@ -0,0 +1,6 @@ +--- +title: "Third Blog" +date: 2024-04-07 +--- + +Third blog content. diff --git a/packages/astro/test/fixtures/content-collections/symlinked-collections/data-collection/welcome.json b/packages/astro/test/fixtures/content-collections/symlinked-collections/data-collection/welcome.json new file mode 100644 index 000000000000..8ab06ff1f24f --- /dev/null +++ b/packages/astro/test/fixtures/content-collections/symlinked-collections/data-collection/welcome.json @@ -0,0 +1,4 @@ +{ + "alt": "Futuristic landscape with chrome buildings and blue skies", + "src": "../../assets/the-future.jpg" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8a8f8471758..439dfd84216d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9575,7 +9575,6 @@ packages: libsql@0.3.12: resolution: {integrity: sha512-to30hj8O3DjS97wpbKN6ERZ8k66MN1IaOfFLR6oHqd25GMiPJ/ZX0VaZ7w+TsPmxcFS3p71qArj/hiedCyvXCg==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lilconfig@2.1.0: