diff --git a/.changeset/funny-wolves-dream.md b/.changeset/funny-wolves-dream.md new file mode 100644 index 000000000000..3023efebdc4e --- /dev/null +++ b/.changeset/funny-wolves-dream.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Allows "slug" as a field in content layer data diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index 05c712be5c13..f67a7ad63d5b 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -167,11 +167,12 @@ export async function getEntryDataAndImages< pluginContext?: PluginContext, ): Promise<{ data: TOutputData; imageImports: Array }> { let data: TOutputData; - if (collectionConfig.type === 'data') { - data = entry.unvalidatedData as TOutputData; - } else { + // Legacy content collections have 'slug' removed + if (collectionConfig.type === 'content' || (collectionConfig as any)._legacy) { const { slug, ...unvalidatedData } = entry.unvalidatedData; data = unvalidatedData as TOutputData; + } else { + data = entry.unvalidatedData as TOutputData; } let schema = collectionConfig.schema; diff --git a/packages/astro/test/content-layer.test.js b/packages/astro/test/content-layer.test.js index a46da9a78783..5d89e82d839d 100644 --- a/packages/astro/test/content-layer.test.js +++ b/packages/astro/test/content-layer.test.js @@ -260,6 +260,10 @@ describe('Content Layer', () => { }); }); + it('allows "slug" as a field', async () => { + assert.equal(json.increment.data.slug, 'slimy'); + }); + it('updates the store on new builds', async () => { assert.equal(json.increment.data.lastValue, 1); assert.equal(json.entryWithReference.data.something?.content, 'transform me'); diff --git a/packages/astro/test/fixtures/content-layer/src/content/config.ts b/packages/astro/test/fixtures/content-layer/src/content/config.ts index 776c44f6811e..5a1f2ae1d958 100644 --- a/packages/astro/test/fixtures/content-layer/src/content/config.ts +++ b/packages/astro/test/fixtures/content-layer/src/content/config.ts @@ -198,16 +198,22 @@ const images = defineCollection({ const increment = defineCollection({ loader: { name: 'increment-loader', - load: async ({ store, refreshContextData }) => { + load: async ({ store, refreshContextData, parseData }) => { const entry = store.get<{ lastValue: number }>('value'); const lastValue = entry?.data.lastValue ?? 0; - store.set({ + const raw = { id: 'value', data: { lastValue: lastValue + 1, lastUpdated: new Date(), refreshContextData, + slug: 'slimy' }, + } + const parsed = await parseData(raw) + store.set({ + id: raw.id, + data: parsed, }); }, // Example of a loader that returns an async schema function @@ -215,7 +221,8 @@ const increment = defineCollection({ z.object({ lastValue: z.number(), lastUpdated: z.date(), - refreshContextData: z.record(z.unknown()), + refreshContextData: z.record(z.unknown()).optional(), + slug: z.string().optional(), }), }, });