From 0342a97303bd21f37f917a2bc363c51b064e2f34 Mon Sep 17 00:00:00 2001 From: Felmon Fekadu Date: Fri, 20 Mar 2026 21:00:58 -0600 Subject: [PATCH 1/3] Fix defineLiveCollection interface loader typing --- .changeset/tiny-cameras-teach.md | 5 +++ packages/astro/src/content/loaders/types.ts | 2 +- packages/astro/src/types/public/content.ts | 8 ++--- .../test/types/define-live-collection.ts | 36 +++++++++++++++++++ 4 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 .changeset/tiny-cameras-teach.md create mode 100644 packages/astro/test/types/define-live-collection.ts 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>(); + }); + }); +}); From 3df80b34b326a54ca2d2c69b6686ef81b194a42e Mon Sep 17 00:00:00 2001 From: Felmon Fekadu Date: Sat, 21 Mar 2026 00:27:10 -0600 Subject: [PATCH 2/3] Retrigger CI From 3d5756308ced62dee966e83fae19fa8cc1979566 Mon Sep 17 00:00:00 2001 From: Felmon Fekadu Date: Sat, 21 Mar 2026 00:51:37 -0600 Subject: [PATCH 3/3] Retrigger CI