@lemonadecms/client 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +41 -7
- package/bin/cli/create-migration.mjs +10 -3
- package/bin/cli/network.mjs +2 -1
- package/bin/cli/schema.mjs +18 -1
- package/bin/codegen/csharp.mjs +6 -1
- package/bin/codegen/python.mjs +6 -1
- package/bin/generate-types.mjs +17 -3
- package/bin/relationships.mjs +87 -0
- package/bin/rich-text-schema.mjs +54 -0
- package/bin/schema-extensions.mjs +6 -0
- package/bin/unique-identifiers.mjs +50 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.js +1 -1
- package/dist/rich-text-v2.d.ts +20 -0
- package/dist/rich-text-v2.js +242 -0
- package/dist/rich-text.d.ts +3 -1
- package/dist/rich-text.js +60 -25
- package/dist/server.d.ts +5 -4
- package/dist/server.js +1 -1
- package/dist/transport.d.ts +5 -2
- package/dist/transport.js +97 -9
- package/dist/types.d.ts +56 -7
- package/package.json +1 -1
package/dist/types.d.ts
CHANGED
|
@@ -3,7 +3,14 @@ export type ModelMap<Models> = {
|
|
|
3
3
|
};
|
|
4
4
|
export type UntypedModels = Record<string, Record<string, unknown>>;
|
|
5
5
|
export type FieldName<Fields> = Extract<keyof Fields, string>;
|
|
6
|
-
|
|
6
|
+
/** Generated reverse names point to source model keys; no relationship data is fetched eagerly. */
|
|
7
|
+
export type RelationshipMap<Models> = {
|
|
8
|
+
[Model in Extract<keyof Models, string>]?: Record<string, Extract<keyof Models, string>>;
|
|
9
|
+
};
|
|
10
|
+
export type RelationshipName<Relationships, Model extends string> = keyof Relationships extends never ? string : Model extends keyof Relationships ? Extract<keyof Relationships[Model], string> : never;
|
|
11
|
+
export type RelatedModel<Models, Relationships, Model extends string, Relation extends string> = Model extends keyof Relationships ? Relation extends keyof Relationships[Model] ? Extract<Relationships[Model][Relation], Extract<keyof Models, string>> : never : string;
|
|
12
|
+
export type RelatedFields<Models, Relationships, Model extends string, Relation extends string> = RelatedModel<Models, Relationships, Model, Relation> extends keyof Models ? Models[RelatedModel<Models, Relationships, Model, Relation>] : Record<string, unknown>;
|
|
13
|
+
export interface CMSBaseOptions<Models extends ModelMap<Models> = {}> {
|
|
7
14
|
/** Requests always use https://api.lemonadecms.com. Custom CMS hosts are unsupported. */
|
|
8
15
|
url?: never;
|
|
9
16
|
projectId: string;
|
|
@@ -14,11 +21,19 @@ export interface CMSBaseOptions {
|
|
|
14
21
|
* No default deadline. Combining with a caller signal requires AbortSignal.any.
|
|
15
22
|
*/
|
|
16
23
|
timeoutMs?: number;
|
|
24
|
+
/** Explicitly accept opt-in rich-text v2 documents. Defaults to the v1 contract. */
|
|
25
|
+
richTextVersion?: 1 | 2;
|
|
26
|
+
/** Query conveniences, never an authorization boundary. Filters combine with AND. */
|
|
27
|
+
defaults?: keyof Models extends never ? never : CMSQueryDefaults<Models[Extract<keyof Models, string>]>;
|
|
28
|
+
/** Checked model names and source fields; scalar values override global defaults. */
|
|
29
|
+
collections?: keyof Models extends never ? never : {
|
|
30
|
+
[Model in Extract<keyof Models, string>]?: CMSQueryDefaults<Models[Model]>;
|
|
31
|
+
};
|
|
17
32
|
}
|
|
18
|
-
export interface CMSClientOptions extends CMSBaseOptions {
|
|
33
|
+
export interface CMSClientOptions<Models extends ModelMap<Models> = {}> extends CMSBaseOptions<Models> {
|
|
19
34
|
publicKey: string;
|
|
20
35
|
}
|
|
21
|
-
export interface CMSPreviewOptions extends CMSBaseOptions {
|
|
36
|
+
export interface CMSPreviewOptions<Models extends ModelMap<Models> = {}> extends CMSBaseOptions<Models> {
|
|
22
37
|
secretKey: string;
|
|
23
38
|
}
|
|
24
39
|
type Scalar = string | number | boolean;
|
|
@@ -51,6 +66,30 @@ type ChoicesContentFilter<Fields> = {
|
|
|
51
66
|
value: readonly ChoicesValue<Fields[Key]>[];
|
|
52
67
|
};
|
|
53
68
|
}[ChoicesField<Fields>];
|
|
69
|
+
type ReferenceIdentity = {
|
|
70
|
+
id: string;
|
|
71
|
+
url?: never;
|
|
72
|
+
};
|
|
73
|
+
type ReferenceField<Fields, Many extends boolean> = {
|
|
74
|
+
[Key in FieldName<Fields>]: unknown extends Fields[Key] ? never : [NonNullable<Fields[Key]>] extends [never] ? never : NonNullable<Fields[Key]> extends (Many extends true ? readonly ReferenceIdentity[] : ReferenceIdentity) ? Key : never;
|
|
75
|
+
}[FieldName<Fields>];
|
|
76
|
+
type ReferenceContentFilter<Fields> = {
|
|
77
|
+
[Key in ReferenceField<Fields, false>]: {
|
|
78
|
+
field: Key;
|
|
79
|
+
op: "eq" | "ne";
|
|
80
|
+
value: string | null;
|
|
81
|
+
} | {
|
|
82
|
+
field: Key;
|
|
83
|
+
op: "in" | "not_in";
|
|
84
|
+
value: readonly string[];
|
|
85
|
+
};
|
|
86
|
+
}[ReferenceField<Fields, false>] | {
|
|
87
|
+
[Key in ReferenceField<Fields, true>]: {
|
|
88
|
+
field: Key;
|
|
89
|
+
op: "contains_any" | "contains_all";
|
|
90
|
+
value: readonly string[];
|
|
91
|
+
};
|
|
92
|
+
}[ReferenceField<Fields, true>];
|
|
54
93
|
export type TextField<Fields> = {
|
|
55
94
|
[Key in FieldName<Fields>]: unknown extends Fields[Key] ? Key : NonNullable<Fields[Key]> extends string ? Key : never;
|
|
56
95
|
}[FieldName<Fields>];
|
|
@@ -61,7 +100,7 @@ type TextContentFilter<Fields> = {
|
|
|
61
100
|
value: string;
|
|
62
101
|
};
|
|
63
102
|
}[TextField<Fields>];
|
|
64
|
-
export type ContentFilter<Fields> = ScalarContentFilter<Fields> | ChoicesContentFilter<Fields> | TextContentFilter<Fields> | {
|
|
103
|
+
export type ContentFilter<Fields> = ScalarContentFilter<Fields> | ChoicesContentFilter<Fields> | TextContentFilter<Fields> | ReferenceContentFilter<Fields> | {
|
|
65
104
|
and: readonly ContentFilter<Fields>[];
|
|
66
105
|
} | {
|
|
67
106
|
or: readonly ContentFilter<Fields>[];
|
|
@@ -90,6 +129,14 @@ interface BaseListOptions<Key extends string, Fields> {
|
|
|
90
129
|
/** Explicit live enrichment, independently cached from the saved publication. */
|
|
91
130
|
includeRemote?: boolean;
|
|
92
131
|
}
|
|
132
|
+
/** Defaults never include projections, cursors, search text or cancellation signals.
|
|
133
|
+
* ID reads inherit locale/includeRemote only; statistics inherit locale/filters only.
|
|
134
|
+
* Global fields must be valid on every collection queried with those defaults.
|
|
135
|
+
*/
|
|
136
|
+
export type CMSQueryDefaults<Fields = Record<string, unknown>> = Pick<BaseListOptions<string, Fields>, "locale" | "limit" | "filters" | "sort" | "includeRemote"> & {
|
|
137
|
+
/** Forward traversal only. Default 1,000; maximum 10,000. */
|
|
138
|
+
maxPages?: number;
|
|
139
|
+
};
|
|
93
140
|
/** Follow a returned boundary in exactly one direction; or request a numbered page; modes cannot be combined. */
|
|
94
141
|
export type ListOptions<Key extends string = string, Fields = Record<string, unknown>> = BaseListOptions<Key, Fields> & ({
|
|
95
142
|
after?: string;
|
|
@@ -170,7 +217,9 @@ export interface ContentPage<Fields, Model extends string = string> {
|
|
|
170
217
|
hasPreviousPage?: boolean;
|
|
171
218
|
};
|
|
172
219
|
}
|
|
173
|
-
export interface ContentCollection<Fields extends object, Model extends string = string> {
|
|
220
|
+
export interface ContentCollection<Fields extends object, Model extends string = string, Models extends ModelMap<Models> = UntypedModels, Relationships extends RelationshipMap<Models> = {}> {
|
|
221
|
+
/** Read one explicitly configured reverse collection; edit its source references in Studio. */
|
|
222
|
+
related<Relation extends RelationshipName<Relationships, Model>, const Key extends FieldName<RelatedFields<Models, Relationships, Model, Relation>> = FieldName<RelatedFields<Models, Relationships, Model, Relation>>>(id: string, relation: Relation, options?: ListOptions<Key, RelatedFields<Models, Relationships, Model, Relation>>): Promise<ContentPage<Pick<RelatedFields<Models, Relationships, Model, Relation>, Key>, RelatedModel<Models, Relationships, Model, Relation>>>;
|
|
174
223
|
list<const Key extends FieldName<Fields> = FieldName<Fields>>(options?: ListOptions<Key, Fields>): Promise<ContentPage<Pick<Fields, Key>, Model>>;
|
|
175
224
|
/** One page of plain text matches; relevance order unless an explicit sort is supplied. */
|
|
176
225
|
search<const Key extends FieldName<Fields> = FieldName<Fields>>(query: string, options?: SearchOptions<Key, Fields>): Promise<ContentPage<Pick<Fields, Key>, Model>>;
|
|
@@ -190,8 +239,8 @@ export interface ContentCollection<Fields extends object, Model extends string =
|
|
|
190
239
|
entries<const Key extends FieldName<Fields> = FieldName<Fields>>(options?: PaginationOptions<Key, Fields>): AsyncIterableIterator<ContentEntry<Pick<Fields, Key>, Model>>;
|
|
191
240
|
get<const Key extends FieldName<Fields> = FieldName<Fields>>(id: string, options?: Pick<ListOptions<Key, Fields>, "select" | "locale" | "signal" | "includeRemote">): Promise<ContentEntry<Pick<Fields, Key>, Model>>;
|
|
192
241
|
}
|
|
193
|
-
export interface CMSClient<Models extends ModelMap<Models> = UntypedModels> {
|
|
194
|
-
content<Model extends Extract<keyof Models, string>>(model: Model): ContentCollection<Models[Model], Model>;
|
|
242
|
+
export interface CMSClient<Models extends ModelMap<Models> = UntypedModels, Relationships extends RelationshipMap<Models> = {}> {
|
|
243
|
+
content<Model extends Extract<keyof Models, string>>(model: Model): ContentCollection<Models[Model], Model, Models, Relationships>;
|
|
195
244
|
}
|
|
196
245
|
/** A draft may omit required fields or contain nulls until it is published. */
|
|
197
246
|
export type PreviewModels<Models> = {
|
package/package.json
CHANGED