diff --git a/.changeset/tiny-cameras-teach.md b/.changeset/tiny-cameras-teach.md new file mode 100644 index 000000000000..dd56299b863c --- /dev/null +++ b/.changeset/tiny-cameras-teach.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Fix `defineLiveCollection()` so `LiveLoader` data types declared as interfaces are accepted. diff --git a/packages/astro/src/content/loaders/types.ts b/packages/astro/src/content/loaders/types.ts index c171214ca0e4..c2e199694ba3 100644 --- a/packages/astro/src/content/loaders/types.ts +++ b/packages/astro/src/content/loaders/types.ts @@ -84,7 +84,7 @@ export interface LoadCollectionContext { } export interface LiveLoader< - TData extends Record = Record, + TData extends Record = Record, TEntryFilter extends Record | never = never, TCollectionFilter extends Record | never = never, TError extends Error = Error, diff --git a/packages/astro/src/types/public/content.ts b/packages/astro/src/types/public/content.ts index a4d1631e8cbc..207ba8bff291 100644 --- a/packages/astro/src/types/public/content.ts +++ b/packages/astro/src/types/public/content.ts @@ -162,7 +162,7 @@ export interface CacheHint { lastModified?: Date; } -export interface LiveDataEntry = Record> { +export interface LiveDataEntry = Record> { /** The ID of the entry. Unique per collection. */ id: string; /** The parsed entry data */ @@ -175,14 +175,14 @@ export interface LiveDataEntry = Record = Record> { +export interface LiveDataCollection = Record> { entries: Array>; /** A hint for how to cache this collection. Individual entries can also have cache hints */ cacheHint?: CacheHint; } export interface LiveDataCollectionResult< - TData extends Record = Record, + TData extends Record = Record, TError extends Error = Error, > { entries?: Array>; @@ -191,7 +191,7 @@ export interface LiveDataCollectionResult< } export interface LiveDataEntryResult< - TData extends Record = Record, + TData extends Record = Record, TError extends Error = Error, > { entry?: LiveDataEntry; diff --git a/packages/astro/test/types/define-live-collection.ts b/packages/astro/test/types/define-live-collection.ts new file mode 100644 index 000000000000..f5c9e2cf606f --- /dev/null +++ b/packages/astro/test/types/define-live-collection.ts @@ -0,0 +1,36 @@ +import { describe, it } from 'node:test'; +import { expectTypeOf } from 'expect-type'; +import { defineLiveCollection } from 'astro/content/config'; +import type { LiveLoader } from 'astro/loaders'; + +function assertType(data: T, cb: (data: NoInfer) => void) { + cb(data); +} + +interface Data { + body: string; +} + +const loader: LiveLoader = { + name: 'test-loader', + loadEntry: async () => ({ + id: 'hello-world', + data: { body: 'Hello world' }, + }), + loadCollection: async () => ({ + entries: [ + { + id: 'hello-world', + data: { body: 'Hello world' }, + }, + ], + }), +}; + +describe('defineLiveCollection()', () => { + it('accepts live loaders whose data type is declared as an interface', () => { + assertType(defineLiveCollection({ loader }), (config) => { + expectTypeOf(config.loader).toEqualTypeOf>(); + }); + }); +});