@cogenta/schema 0.1.0
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/dist/define-collection.d.ts +8 -0
- package/dist/define-collection.d.ts.map +1 -0
- package/dist/define-collection.js +311 -0
- package/dist/define-collection.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/fields.d.ts +117 -0
- package/dist/fields.d.ts.map +1 -0
- package/dist/fields.js +107 -0
- package/dist/fields.js.map +1 -0
- package/dist/generate-schema-json.d.ts +61 -0
- package/dist/generate-schema-json.d.ts.map +1 -0
- package/dist/generate-schema-json.js +128 -0
- package/dist/generate-schema-json.js.map +1 -0
- package/dist/generate-types.d.ts +5 -0
- package/dist/generate-types.d.ts.map +1 -0
- package/dist/generate-types.js +220 -0
- package/dist/generate-types.js.map +1 -0
- package/dist/id.d.ts +8 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +8 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/rich-text.d.ts +164 -0
- package/dist/rich-text.d.ts.map +1 -0
- package/dist/rich-text.js +97 -0
- package/dist/rich-text.js.map +1 -0
- package/dist/routing/ids.d.ts +18 -0
- package/dist/routing/ids.d.ts.map +1 -0
- package/dist/routing/ids.js +41 -0
- package/dist/routing/ids.js.map +1 -0
- package/dist/routing/index.d.ts +13 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +7 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/redirects.d.ts +76 -0
- package/dist/routing/redirects.d.ts.map +1 -0
- package/dist/routing/redirects.js +237 -0
- package/dist/routing/redirects.js.map +1 -0
- package/dist/routing/resolve.d.ts +38 -0
- package/dist/routing/resolve.d.ts.map +1 -0
- package/dist/routing/resolve.js +23 -0
- package/dist/routing/resolve.js.map +1 -0
- package/dist/routing/router.d.ts +51 -0
- package/dist/routing/router.d.ts.map +1 -0
- package/dist/routing/router.js +132 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/routing/slug-change.d.ts +39 -0
- package/dist/routing/slug-change.d.ts.map +1 -0
- package/dist/routing/slug-change.js +44 -0
- package/dist/routing/slug-change.js.map +1 -0
- package/dist/routing/slug.d.ts +82 -0
- package/dist/routing/slug.d.ts.map +1 -0
- package/dist/routing/slug.js +124 -0
- package/dist/routing/slug.js.map +1 -0
- package/dist/routing/slugify.d.ts +29 -0
- package/dist/routing/slugify.d.ts.map +1 -0
- package/dist/routing/slugify.js +104 -0
- package/dist/routing/slugify.js.map +1 -0
- package/dist/scheduling/index.d.ts +3 -0
- package/dist/scheduling/index.d.ts.map +1 -0
- package/dist/scheduling/index.js +2 -0
- package/dist/scheduling/index.js.map +1 -0
- package/dist/scheduling/publish.d.ts +71 -0
- package/dist/scheduling/publish.d.ts.map +1 -0
- package/dist/scheduling/publish.js +122 -0
- package/dist/scheduling/publish.js.map +1 -0
- package/dist/search/extract.d.ts +25 -0
- package/dist/search/extract.d.ts.map +1 -0
- package/dist/search/extract.js +188 -0
- package/dist/search/extract.js.map +1 -0
- package/dist/search/index.d.ts +36 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +44 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/mysql.d.ts +7 -0
- package/dist/search/mysql.d.ts.map +1 -0
- package/dist/search/mysql.js +121 -0
- package/dist/search/mysql.js.map +1 -0
- package/dist/search/postgres.d.ts +9 -0
- package/dist/search/postgres.d.ts.map +1 -0
- package/dist/search/postgres.js +167 -0
- package/dist/search/postgres.js.map +1 -0
- package/dist/search/query.d.ts +35 -0
- package/dist/search/query.d.ts.map +1 -0
- package/dist/search/query.js +116 -0
- package/dist/search/query.js.map +1 -0
- package/dist/search/sqlite.d.ts +16 -0
- package/dist/search/sqlite.d.ts.map +1 -0
- package/dist/search/sqlite.js +166 -0
- package/dist/search/sqlite.js.map +1 -0
- package/dist/search/table.d.ts +49 -0
- package/dist/search/table.d.ts.map +1 -0
- package/dist/search/table.js +86 -0
- package/dist/search/table.js.map +1 -0
- package/dist/search/text.d.ts +42 -0
- package/dist/search/text.d.ts.map +1 -0
- package/dist/search/text.js +56 -0
- package/dist/search/text.js.map +1 -0
- package/dist/search/types.d.ts +98 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/search/types.js +2 -0
- package/dist/search/types.js.map +1 -0
- package/dist/store/columns.d.ts +33 -0
- package/dist/store/columns.d.ts.map +1 -0
- package/dist/store/columns.js +113 -0
- package/dist/store/columns.js.map +1 -0
- package/dist/store/cursor.d.ts +23 -0
- package/dist/store/cursor.d.ts.map +1 -0
- package/dist/store/cursor.js +36 -0
- package/dist/store/cursor.js.map +1 -0
- package/dist/store/diff.d.ts +59 -0
- package/dist/store/diff.d.ts.map +1 -0
- package/dist/store/diff.js +124 -0
- package/dist/store/diff.js.map +1 -0
- package/dist/store/fragments.d.ts +13 -0
- package/dist/store/fragments.d.ts.map +1 -0
- package/dist/store/fragments.js +25 -0
- package/dist/store/fragments.js.map +1 -0
- package/dist/store/index.d.ts +22 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +16 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/naming.d.ts +25 -0
- package/dist/store/naming.d.ts.map +1 -0
- package/dist/store/naming.js +80 -0
- package/dist/store/naming.js.map +1 -0
- package/dist/store/read-only.d.ts +16 -0
- package/dist/store/read-only.d.ts.map +1 -0
- package/dist/store/read-only.js +36 -0
- package/dist/store/read-only.js.map +1 -0
- package/dist/store/store.d.ts +52 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +706 -0
- package/dist/store/store.js.map +1 -0
- package/dist/store/tables.d.ts +40 -0
- package/dist/store/tables.d.ts.map +1 -0
- package/dist/store/tables.js +267 -0
- package/dist/store/tables.js.map +1 -0
- package/dist/store/types.d.ts +105 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +2 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/uuid.d.ts +6 -0
- package/dist/store/uuid.d.ts.map +1 -0
- package/dist/store/uuid.js +64 -0
- package/dist/store/uuid.js.map +1 -0
- package/dist/store/values.d.ts +40 -0
- package/dist/store/values.d.ts.map +1 -0
- package/dist/store/values.js +160 -0
- package/dist/store/values.js.map +1 -0
- package/dist/system-fields.d.ts +60 -0
- package/dist/system-fields.d.ts.map +1 -0
- package/dist/system-fields.js +73 -0
- package/dist/system-fields.js.map +1 -0
- package/dist/types.d.ts +101 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +54 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +183 -0
- package/dist/validation.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type SystemFieldDescriptor } from './system-fields.js';
|
|
2
|
+
import type { CollectionDefinition, CollectionPermissions, CollectionRouting, CollectionVersioning, FieldKind } from './types.js';
|
|
3
|
+
import type { JsonValue } from './validation.js';
|
|
4
|
+
/**
|
|
5
|
+
* Renders `.cogenta/schema.json`, the description the admin reads to build its
|
|
6
|
+
* interface (L1 § "Génération").
|
|
7
|
+
*
|
|
8
|
+
* The admin never imports the schema modules: it is a browser application, and
|
|
9
|
+
* a collection file is Node code that may import anything. JSON is the seam.
|
|
10
|
+
* Which is also why a `validate` function cannot cross it — only the fact that
|
|
11
|
+
* one exists does.
|
|
12
|
+
*/
|
|
13
|
+
export declare const SCHEMA_DOCUMENT_CONTRACT = "schema@1.0";
|
|
14
|
+
export interface SchemaDocumentField {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly kind: FieldKind;
|
|
17
|
+
readonly required: boolean;
|
|
18
|
+
readonly localized: boolean;
|
|
19
|
+
readonly unique: boolean;
|
|
20
|
+
/** The function itself cannot be serialised; the admin still needs to know. */
|
|
21
|
+
readonly hasCustomValidation: boolean;
|
|
22
|
+
readonly default?: JsonValue;
|
|
23
|
+
readonly admin?: SchemaDocumentAdmin;
|
|
24
|
+
readonly options: Record<string, JsonValue>;
|
|
25
|
+
}
|
|
26
|
+
export interface SchemaDocumentAdmin {
|
|
27
|
+
readonly label?: string;
|
|
28
|
+
readonly help?: string;
|
|
29
|
+
readonly group?: string;
|
|
30
|
+
readonly showWhen?: {
|
|
31
|
+
readonly field: string;
|
|
32
|
+
readonly equals: JsonValue;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export interface SchemaDocumentCollection {
|
|
36
|
+
readonly name: string;
|
|
37
|
+
readonly labels: {
|
|
38
|
+
readonly singular: string;
|
|
39
|
+
readonly plural: string;
|
|
40
|
+
};
|
|
41
|
+
readonly routing?: CollectionRouting;
|
|
42
|
+
readonly versioning?: CollectionVersioning;
|
|
43
|
+
readonly indexes: readonly (readonly string[])[];
|
|
44
|
+
readonly permissions: CollectionPermissions;
|
|
45
|
+
readonly fields: readonly SchemaDocumentField[];
|
|
46
|
+
}
|
|
47
|
+
export interface SchemaDocumentSite {
|
|
48
|
+
readonly locales: readonly string[];
|
|
49
|
+
readonly defaultLocale: string;
|
|
50
|
+
}
|
|
51
|
+
export interface SchemaDocument {
|
|
52
|
+
readonly contract: typeof SCHEMA_DOCUMENT_CONTRACT;
|
|
53
|
+
readonly systemFields: readonly SystemFieldDescriptor[];
|
|
54
|
+
readonly collections: readonly SchemaDocumentCollection[];
|
|
55
|
+
/** Absent for the build-time `.cogenta/schema.json` (no config in scope there) — present when a live server serves `/api/schema`. */
|
|
56
|
+
readonly site?: SchemaDocumentSite;
|
|
57
|
+
}
|
|
58
|
+
export declare function buildSchemaDocument(collections: readonly CollectionDefinition[], site?: SchemaDocumentSite): SchemaDocument;
|
|
59
|
+
/** Trailing newline: the file is written to disk and read by humans in diffs. */
|
|
60
|
+
export declare function renderSchemaJson(collections: readonly CollectionDefinition[]): string;
|
|
61
|
+
//# sourceMappingURL=generate-schema-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-schema-json.d.ts","sourceRoot":"","sources":["../src/generate-schema-json.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AACzF,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EAEpB,SAAS,EACV,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD;;;;;;;;GAQG;AAEH,eAAO,MAAM,wBAAwB,eAAe,CAAA;AAEpD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAC5C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;KAAE,CAAA;CAC3E;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAA;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAA;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAA;IAChD,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAA;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAChD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,wBAAwB,CAAA;IAClD,QAAQ,CAAC,YAAY,EAAE,SAAS,qBAAqB,EAAE,CAAA;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,wBAAwB,EAAE,CAAA;IACzD,qIAAqI;IACrI,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAA;CACnC;AAID,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,SAAS,oBAAoB,EAAE,EAC5C,IAAI,CAAC,EAAE,kBAAkB,GACxB,cAAc,CAWhB;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAAG,MAAM,CAErF"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { validateCollectionSet } from './define-collection.js';
|
|
2
|
+
import { SYSTEM_FIELD_DESCRIPTORS } from './system-fields.js';
|
|
3
|
+
/**
|
|
4
|
+
* Renders `.cogenta/schema.json`, the description the admin reads to build its
|
|
5
|
+
* interface (L1 § "Génération").
|
|
6
|
+
*
|
|
7
|
+
* The admin never imports the schema modules: it is a browser application, and
|
|
8
|
+
* a collection file is Node code that may import anything. JSON is the seam.
|
|
9
|
+
* Which is also why a `validate` function cannot cross it — only the fact that
|
|
10
|
+
* one exists does.
|
|
11
|
+
*/
|
|
12
|
+
export const SCHEMA_DOCUMENT_CONTRACT = 'schema@1.0';
|
|
13
|
+
export function buildSchemaDocument(collections, site) {
|
|
14
|
+
validateCollectionSet(collections);
|
|
15
|
+
const sorted = [...collections].sort((left, right) => (left.name < right.name ? -1 : 1));
|
|
16
|
+
return {
|
|
17
|
+
contract: SCHEMA_DOCUMENT_CONTRACT,
|
|
18
|
+
systemFields: SYSTEM_FIELD_DESCRIPTORS,
|
|
19
|
+
collections: sorted.map(describeCollection),
|
|
20
|
+
...(site === undefined ? {} : { site }),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Trailing newline: the file is written to disk and read by humans in diffs. */
|
|
24
|
+
export function renderSchemaJson(collections) {
|
|
25
|
+
return `${JSON.stringify(buildSchemaDocument(collections), null, 2)}\n`;
|
|
26
|
+
}
|
|
27
|
+
function describeCollection(collection) {
|
|
28
|
+
const described = {
|
|
29
|
+
name: collection.name,
|
|
30
|
+
labels: collection.labels,
|
|
31
|
+
indexes: collection.indexes ?? [],
|
|
32
|
+
permissions: collection.permissions,
|
|
33
|
+
fields: Object.entries(collection.fields).map(([name, field]) => describeField(name, field)),
|
|
34
|
+
};
|
|
35
|
+
if (collection.routing !== undefined)
|
|
36
|
+
described.routing = collection.routing;
|
|
37
|
+
if (collection.versioning !== undefined)
|
|
38
|
+
described.versioning = collection.versioning;
|
|
39
|
+
return described;
|
|
40
|
+
}
|
|
41
|
+
function describeField(name, field) {
|
|
42
|
+
const described = {
|
|
43
|
+
name,
|
|
44
|
+
kind: field.kind,
|
|
45
|
+
// Spelled out rather than left absent: the admin renders every flag, and a
|
|
46
|
+
// missing key would force it to re-derive the defaults of the contract.
|
|
47
|
+
required: field.required === true,
|
|
48
|
+
localized: field.localized === true,
|
|
49
|
+
unique: field.unique === true,
|
|
50
|
+
hasCustomValidation: field.validate !== undefined,
|
|
51
|
+
options: describeOptions(field.options),
|
|
52
|
+
};
|
|
53
|
+
const defaultValue = toJsonValue(field.default);
|
|
54
|
+
if (defaultValue !== undefined)
|
|
55
|
+
described.default = defaultValue;
|
|
56
|
+
const admin = describeAdmin(field);
|
|
57
|
+
if (admin !== undefined)
|
|
58
|
+
described.admin = admin;
|
|
59
|
+
return described;
|
|
60
|
+
}
|
|
61
|
+
function describeAdmin(field) {
|
|
62
|
+
const admin = field.admin;
|
|
63
|
+
if (admin === undefined)
|
|
64
|
+
return undefined;
|
|
65
|
+
const described = {};
|
|
66
|
+
if (admin.label !== undefined)
|
|
67
|
+
described.label = admin.label;
|
|
68
|
+
if (admin.help !== undefined)
|
|
69
|
+
described.help = admin.help;
|
|
70
|
+
if (admin.group !== undefined)
|
|
71
|
+
described.group = admin.group;
|
|
72
|
+
if (admin.showWhen !== undefined) {
|
|
73
|
+
described.showWhen = {
|
|
74
|
+
field: admin.showWhen.field,
|
|
75
|
+
equals: toJsonValue(admin.showWhen.equals) ?? null,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return described;
|
|
79
|
+
}
|
|
80
|
+
function describeOptions(options) {
|
|
81
|
+
const described = {};
|
|
82
|
+
for (const [key, value] of Object.entries(options)) {
|
|
83
|
+
const json = toJsonValue(value);
|
|
84
|
+
if (json !== undefined)
|
|
85
|
+
described[key] = json;
|
|
86
|
+
}
|
|
87
|
+
return described;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Keeps what survives a JSON round-trip and drops the rest.
|
|
91
|
+
*
|
|
92
|
+
* A schema may legitimately hold a `validate` function or a `Date` default;
|
|
93
|
+
* neither can reach the admin. Dropping them here is honest — writing
|
|
94
|
+
* `"default": {}` for a `Date` would not be.
|
|
95
|
+
*/
|
|
96
|
+
function toJsonValue(value, seen = new Set()) {
|
|
97
|
+
if (value === null)
|
|
98
|
+
return null;
|
|
99
|
+
switch (typeof value) {
|
|
100
|
+
case 'string':
|
|
101
|
+
return value;
|
|
102
|
+
case 'number':
|
|
103
|
+
return Number.isFinite(value) ? value : undefined;
|
|
104
|
+
case 'boolean':
|
|
105
|
+
return value;
|
|
106
|
+
case 'object':
|
|
107
|
+
break;
|
|
108
|
+
default:
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
const object = value;
|
|
112
|
+
// A schema file is authored by hand, but nothing stops a default from holding
|
|
113
|
+
// a cycle, and JSON.stringify would throw at write time instead of here.
|
|
114
|
+
if (seen.has(object))
|
|
115
|
+
return undefined;
|
|
116
|
+
const nested = new Set(seen).add(object);
|
|
117
|
+
if (Array.isArray(object)) {
|
|
118
|
+
return object.map((entry) => toJsonValue(entry, nested) ?? null);
|
|
119
|
+
}
|
|
120
|
+
const plain = {};
|
|
121
|
+
for (const [key, entry] of Object.entries(object)) {
|
|
122
|
+
const json = toJsonValue(entry, nested);
|
|
123
|
+
if (json !== undefined)
|
|
124
|
+
plain[key] = json;
|
|
125
|
+
}
|
|
126
|
+
return plain;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=generate-schema-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-schema-json.js","sourceRoot":"","sources":["../src/generate-schema-json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CollectionDefinition } from './types.js';
|
|
2
|
+
export declare function renderTypeDeclarations(collections: readonly CollectionDefinition[]): string;
|
|
3
|
+
/** `blog_post` becomes `BlogPost`; the name is already validated as an identifier. */
|
|
4
|
+
export declare function interfaceName(collectionName: string): string;
|
|
5
|
+
//# sourceMappingURL=generate-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-types.d.ts","sourceRoot":"","sources":["../src/generate-types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAmB,MAAM,YAAY,CAAA;AA+GvE,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAAG,MAAM,CAgB3F;AA8BD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAM5D"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { validateCollectionSet } from './define-collection.js';
|
|
2
|
+
import { isCollectionValued } from './validation.js';
|
|
3
|
+
/**
|
|
4
|
+
* Renders `.cogenta/types.d.ts`.
|
|
5
|
+
*
|
|
6
|
+
* This function only builds the string; writing it is the CLI's job. That split
|
|
7
|
+
* keeps the generator pure, therefore comparable character by character in a
|
|
8
|
+
* test, and usable from a watch loop without touching the disk.
|
|
9
|
+
*
|
|
10
|
+
* The generated file is **self-contained on purpose**. A theme compiles against
|
|
11
|
+
* it without depending on `@cogenta/schema`, which rule R5 wants kept out of
|
|
12
|
+
* theme code anyway. That is what makes a theme referencing a field that no
|
|
13
|
+
* longer exists fail to compile — the acceptance criterion of L1.
|
|
14
|
+
*/
|
|
15
|
+
const HEADER = `// Generated by Cogenta. Do not edit.
|
|
16
|
+
//
|
|
17
|
+
// Run \`cogenta generate\` after changing a collection: this file is derived from
|
|
18
|
+
// your schema, and editing it by hand only delays the next overwrite.
|
|
19
|
+
|
|
20
|
+
`;
|
|
21
|
+
/** Shared shapes, emitted whether or not every collection uses them. */
|
|
22
|
+
const PRELUDE = `/** Application-minted UUIDv7 (ADR-0015). */
|
|
23
|
+
export type CogentaId = string
|
|
24
|
+
|
|
25
|
+
export type JsonValue =
|
|
26
|
+
| string
|
|
27
|
+
| number
|
|
28
|
+
| boolean
|
|
29
|
+
| null
|
|
30
|
+
| JsonValue[]
|
|
31
|
+
| { [key: string]: JsonValue }
|
|
32
|
+
|
|
33
|
+
export interface GeoPoint {
|
|
34
|
+
readonly lat: number
|
|
35
|
+
readonly lng: number
|
|
36
|
+
readonly label?: string
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type ContentStatus = 'draft' | 'scheduled' | 'published' | 'archived'
|
|
40
|
+
|
|
41
|
+
export type Provenance = 'human' | 'assisted' | 'generated'
|
|
42
|
+
|
|
43
|
+
export interface ProvenanceDetail {
|
|
44
|
+
readonly agent?: string
|
|
45
|
+
readonly model?: string
|
|
46
|
+
readonly at?: string
|
|
47
|
+
readonly prompt?: string
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface RichTextSpan {
|
|
51
|
+
readonly _key: string
|
|
52
|
+
readonly _type: 'span'
|
|
53
|
+
readonly text: string
|
|
54
|
+
readonly marks: readonly string[]
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type RichTextMarkDefinition =
|
|
58
|
+
| { readonly _key: string; readonly _type: 'link'; readonly href: string; readonly rel?: string }
|
|
59
|
+
| {
|
|
60
|
+
readonly _key: string
|
|
61
|
+
readonly _type: 'internalLink'
|
|
62
|
+
readonly collection: string
|
|
63
|
+
readonly id: CogentaId
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface RichTextBlock {
|
|
67
|
+
readonly _key: string
|
|
68
|
+
readonly _type: 'block'
|
|
69
|
+
readonly style: 'normal' | 'h2' | 'h3' | 'h4' | 'blockquote'
|
|
70
|
+
readonly listItem?: 'bullet' | 'number'
|
|
71
|
+
readonly level?: number
|
|
72
|
+
readonly children: readonly RichTextSpan[]
|
|
73
|
+
readonly markDefs: readonly RichTextMarkDefinition[]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface RichTextMedia {
|
|
77
|
+
readonly _key: string
|
|
78
|
+
readonly _type: 'media'
|
|
79
|
+
readonly id: CogentaId
|
|
80
|
+
readonly caption?: string
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export type RichTextNode = RichTextBlock | RichTextMedia
|
|
84
|
+
|
|
85
|
+
export type RichTextDocument = readonly RichTextNode[]
|
|
86
|
+
|
|
87
|
+
export interface ContentBlock {
|
|
88
|
+
readonly _key: string
|
|
89
|
+
readonly _type: string
|
|
90
|
+
readonly [field: string]: unknown
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Present on every entry, never declared by a collection. */
|
|
94
|
+
export interface SystemFields {
|
|
95
|
+
readonly id: CogentaId
|
|
96
|
+
readonly createdAt: string
|
|
97
|
+
readonly updatedAt: string
|
|
98
|
+
readonly createdBy: CogentaId | null
|
|
99
|
+
readonly updatedBy: CogentaId | null
|
|
100
|
+
readonly status: ContentStatus
|
|
101
|
+
readonly locale: string
|
|
102
|
+
readonly translationOf: CogentaId | null
|
|
103
|
+
readonly version: number
|
|
104
|
+
readonly provenance: Provenance
|
|
105
|
+
readonly provenanceDetail: ProvenanceDetail | null
|
|
106
|
+
}
|
|
107
|
+
`;
|
|
108
|
+
export function renderTypeDeclarations(collections) {
|
|
109
|
+
validateCollectionSet(collections);
|
|
110
|
+
// Sorted by name so that reordering the imports in a schema file does not
|
|
111
|
+
// produce a diff in the generated output.
|
|
112
|
+
const sorted = [...collections].sort((left, right) => (left.name < right.name ? -1 : 1));
|
|
113
|
+
const parts = [HEADER, PRELUDE];
|
|
114
|
+
for (const collection of sorted) {
|
|
115
|
+
parts.push('\n', renderCollection(collection));
|
|
116
|
+
}
|
|
117
|
+
parts.push('\n', renderRegistry(sorted));
|
|
118
|
+
return parts.join('');
|
|
119
|
+
}
|
|
120
|
+
function renderCollection(collection) {
|
|
121
|
+
const lines = [];
|
|
122
|
+
lines.push(`/** ${collection.labels.plural} */`);
|
|
123
|
+
lines.push(`export interface ${interfaceName(collection.name)} extends SystemFields {`);
|
|
124
|
+
for (const [name, field] of Object.entries(collection.fields)) {
|
|
125
|
+
const doc = documentationFor(field);
|
|
126
|
+
if (doc !== undefined)
|
|
127
|
+
lines.push(` /** ${doc} */`);
|
|
128
|
+
lines.push(` readonly ${propertyName(name)}: ${typeOf(field)}`);
|
|
129
|
+
}
|
|
130
|
+
lines.push('}', '');
|
|
131
|
+
return lines.join('\n');
|
|
132
|
+
}
|
|
133
|
+
function renderRegistry(collections) {
|
|
134
|
+
const lines = [];
|
|
135
|
+
lines.push('/** Every collection of this site, by name. */');
|
|
136
|
+
lines.push('export interface CollectionTypes {');
|
|
137
|
+
for (const collection of collections) {
|
|
138
|
+
lines.push(` readonly ${propertyName(collection.name)}: ${interfaceName(collection.name)}`);
|
|
139
|
+
}
|
|
140
|
+
lines.push('}', '');
|
|
141
|
+
lines.push('export type CollectionName = keyof CollectionTypes');
|
|
142
|
+
lines.push('');
|
|
143
|
+
return lines.join('\n');
|
|
144
|
+
}
|
|
145
|
+
/** `blog_post` becomes `BlogPost`; the name is already validated as an identifier. */
|
|
146
|
+
export function interfaceName(collectionName) {
|
|
147
|
+
return collectionName
|
|
148
|
+
.split(/[-_]/)
|
|
149
|
+
.filter((part) => part !== '')
|
|
150
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
151
|
+
.join('');
|
|
152
|
+
}
|
|
153
|
+
const PLAIN_PROPERTY = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
154
|
+
function propertyName(name) {
|
|
155
|
+
return PLAIN_PROPERTY.test(name) ? name : quote(name);
|
|
156
|
+
}
|
|
157
|
+
function documentationFor(field) {
|
|
158
|
+
const parts = [field.admin?.label, field.admin?.help].filter((part) => part !== undefined && part !== '');
|
|
159
|
+
if (field.localized === true)
|
|
160
|
+
parts.push('Translated field.');
|
|
161
|
+
return parts.length === 0 ? undefined : parts.join(' — ').replaceAll('*/', '*\\/');
|
|
162
|
+
}
|
|
163
|
+
function typeOf(field) {
|
|
164
|
+
const base = baseTypeOf(field);
|
|
165
|
+
// A field holding several values is never null: its empty case is `[]`, since
|
|
166
|
+
// a join table with no rows says exactly that.
|
|
167
|
+
if (field.required === true || isCollectionValued(field))
|
|
168
|
+
return base;
|
|
169
|
+
// Otherwise `| null` rather than `?`: the key always exists once the row is
|
|
170
|
+
// read, and a theme that forgets the empty case should hear about it at
|
|
171
|
+
// compile time rather than render "undefined".
|
|
172
|
+
return `${base} | null`;
|
|
173
|
+
}
|
|
174
|
+
function baseTypeOf(field) {
|
|
175
|
+
switch (field.kind) {
|
|
176
|
+
case 'text':
|
|
177
|
+
case 'slug':
|
|
178
|
+
case 'color':
|
|
179
|
+
case 'date':
|
|
180
|
+
case 'datetime':
|
|
181
|
+
return 'string';
|
|
182
|
+
case 'richText':
|
|
183
|
+
return 'RichTextDocument';
|
|
184
|
+
case 'number':
|
|
185
|
+
return 'number';
|
|
186
|
+
case 'boolean':
|
|
187
|
+
return 'boolean';
|
|
188
|
+
case 'media':
|
|
189
|
+
case 'relation':
|
|
190
|
+
return field.options.many === true ? 'readonly CogentaId[]' : 'CogentaId';
|
|
191
|
+
case 'select': {
|
|
192
|
+
const union = selectUnion(field);
|
|
193
|
+
return field.options.many === true ? `readonly (${union})[]` : union;
|
|
194
|
+
}
|
|
195
|
+
case 'json':
|
|
196
|
+
return 'JsonValue';
|
|
197
|
+
case 'geo':
|
|
198
|
+
return 'GeoPoint';
|
|
199
|
+
case 'blocks':
|
|
200
|
+
return 'readonly ContentBlock[]';
|
|
201
|
+
default:
|
|
202
|
+
// Unreachable: `defineCollection` rejects an unknown kind before this.
|
|
203
|
+
return 'unknown';
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function selectUnion(field) {
|
|
207
|
+
const options = field.options.options;
|
|
208
|
+
if (!Array.isArray(options) || options.length === 0)
|
|
209
|
+
return 'string';
|
|
210
|
+
return options
|
|
211
|
+
.map((choice) => typeof choice === 'object' && choice !== null && 'value' in choice
|
|
212
|
+
? String(choice.value)
|
|
213
|
+
: String(choice))
|
|
214
|
+
.map(quote)
|
|
215
|
+
.join(' | ');
|
|
216
|
+
}
|
|
217
|
+
function quote(value) {
|
|
218
|
+
return `'${value.replaceAll('\\', '\\\\').replaceAll("'", "\\'")}'`;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=generate-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-types.js","sourceRoot":"","sources":["../src/generate-types.ts"],"names":[],"mappings":"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"}
|
package/dist/id.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moved to `@cogenta/core`: id generation is infrastructure every package
|
|
3
|
+
* needs (auth's sessions and users, the audit log, agent identifiers still to
|
|
4
|
+
* come in L4), not content-schema logic. Re-exported here so nothing that
|
|
5
|
+
* already imports from `@cogenta/schema` breaks.
|
|
6
|
+
*/
|
|
7
|
+
export { isUuidV7, newId, timestampOf } from '@cogenta/core';
|
|
8
|
+
//# sourceMappingURL=id.d.ts.map
|
package/dist/id.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/id.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moved to `@cogenta/core`: id generation is infrastructure every package
|
|
3
|
+
* needs (auth's sessions and users, the audit log, agent identifiers still to
|
|
4
|
+
* come in L4), not content-schema logic. Re-exported here so nothing that
|
|
5
|
+
* already imports from `@cogenta/schema` breaks.
|
|
6
|
+
*/
|
|
7
|
+
export { isUuidV7, newId, timestampOf } from '@cogenta/core';
|
|
8
|
+
//# sourceMappingURL=id.js.map
|
package/dist/id.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@cogenta/schema` — the content model, in code.
|
|
3
|
+
*
|
|
4
|
+
* Implements contract A, frozen at `schema@1.0`. The schema is the single
|
|
5
|
+
* source of truth: types, migrations, the admin interface and the API are all
|
|
6
|
+
* derived from what is declared here, and nothing is written twice.
|
|
7
|
+
*/
|
|
8
|
+
export { defineCollection, validateCollectionSet } from './define-collection.js';
|
|
9
|
+
export type { SchemaIssue } from './errors.js';
|
|
10
|
+
export { schemaError } from './errors.js';
|
|
11
|
+
export type { BlocksFieldOptions, MediaAcceptKind, MediaFieldOptions, NumberFieldOptions, RelationFieldOptions, SelectChoice, SelectFieldOptions, SlugFieldOptions, TextFieldOptions, } from './fields.js';
|
|
12
|
+
export { f, MEDIA_ACCEPT_KINDS } from './fields.js';
|
|
13
|
+
export type { SchemaDocument, SchemaDocumentAdmin, SchemaDocumentCollection, SchemaDocumentField, } from './generate-schema-json.js';
|
|
14
|
+
export { buildSchemaDocument, renderSchemaJson, SCHEMA_DOCUMENT_CONTRACT, } from './generate-schema-json.js';
|
|
15
|
+
export { interfaceName, renderTypeDeclarations } from './generate-types.js';
|
|
16
|
+
export { isUuidV7, newId, timestampOf } from './id.js';
|
|
17
|
+
export type { RichTextBlock, RichTextDecorator, RichTextDocument, RichTextListItem, RichTextMarkDefinition, RichTextMediaNode, RichTextNode, RichTextSpan, RichTextStyle, } from './rich-text.js';
|
|
18
|
+
export { RICH_TEXT_DECORATORS, RICH_TEXT_LIST_ITEMS, RICH_TEXT_STYLES, richTextDocumentSchema, richTextNodeSchema, } from './rich-text.js';
|
|
19
|
+
export * from './routing/index.js';
|
|
20
|
+
export * from './scheduling/index.js';
|
|
21
|
+
export * from './search/index.js';
|
|
22
|
+
export * from './store/index.js';
|
|
23
|
+
export type { SystemFieldDescriptor, SystemFieldName } from './system-fields.js';
|
|
24
|
+
export { isSystemFieldName, provenanceDetailSchema, SYSTEM_FIELD_DESCRIPTORS, SYSTEM_FIELD_NAMES, systemFieldsSchema, } from './system-fields.js';
|
|
25
|
+
export * from './types.js';
|
|
26
|
+
export type { GeoPoint, JsonValue, RawBlockInput } from './validation.js';
|
|
27
|
+
export { COLOR_PATTERN, collectionEntrySchema, collectionInputSchema, contentBlockSchema, fieldSchema, geoPointSchema, jsonValueSchema, SLUG_PATTERN, } from './validation.js';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAChF,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,CAAC,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACnD,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACtD,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAChF,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@cogenta/schema` — the content model, in code.
|
|
3
|
+
*
|
|
4
|
+
* Implements contract A, frozen at `schema@1.0`. The schema is the single
|
|
5
|
+
* source of truth: types, migrations, the admin interface and the API are all
|
|
6
|
+
* derived from what is declared here, and nothing is written twice.
|
|
7
|
+
*/
|
|
8
|
+
export { defineCollection, validateCollectionSet } from './define-collection.js';
|
|
9
|
+
export { schemaError } from './errors.js';
|
|
10
|
+
export { f, MEDIA_ACCEPT_KINDS } from './fields.js';
|
|
11
|
+
export { buildSchemaDocument, renderSchemaJson, SCHEMA_DOCUMENT_CONTRACT, } from './generate-schema-json.js';
|
|
12
|
+
export { interfaceName, renderTypeDeclarations } from './generate-types.js';
|
|
13
|
+
export { isUuidV7, newId, timestampOf } from './id.js';
|
|
14
|
+
export { RICH_TEXT_DECORATORS, RICH_TEXT_LIST_ITEMS, RICH_TEXT_STYLES, richTextDocumentSchema, richTextNodeSchema, } from './rich-text.js';
|
|
15
|
+
export * from './routing/index.js';
|
|
16
|
+
export * from './scheduling/index.js';
|
|
17
|
+
export * from './search/index.js';
|
|
18
|
+
export * from './store/index.js';
|
|
19
|
+
export { isSystemFieldName, provenanceDetailSchema, SYSTEM_FIELD_DESCRIPTORS, SYSTEM_FIELD_NAMES, systemFieldsSchema, } from './system-fields.js';
|
|
20
|
+
export * from './types.js';
|
|
21
|
+
export { COLOR_PATTERN, collectionEntrySchema, collectionInputSchema, contentBlockSchema, fieldSchema, geoPointSchema, jsonValueSchema, SLUG_PATTERN, } from './validation.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAEhF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAYzC,OAAO,EAAE,CAAC,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAOnD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAYtD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAEhC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAC3B,cAAc,YAAY,CAAA;AAE1B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,eAAe,EACf,YAAY,GACb,MAAM,iBAAiB,CAAA"}
|