@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.
Files changed (169) hide show
  1. package/dist/define-collection.d.ts +8 -0
  2. package/dist/define-collection.d.ts.map +1 -0
  3. package/dist/define-collection.js +311 -0
  4. package/dist/define-collection.js.map +1 -0
  5. package/dist/errors.d.ts +16 -0
  6. package/dist/errors.d.ts.map +1 -0
  7. package/dist/errors.js +18 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/fields.d.ts +117 -0
  10. package/dist/fields.d.ts.map +1 -0
  11. package/dist/fields.js +107 -0
  12. package/dist/fields.js.map +1 -0
  13. package/dist/generate-schema-json.d.ts +61 -0
  14. package/dist/generate-schema-json.d.ts.map +1 -0
  15. package/dist/generate-schema-json.js +128 -0
  16. package/dist/generate-schema-json.js.map +1 -0
  17. package/dist/generate-types.d.ts +5 -0
  18. package/dist/generate-types.d.ts.map +1 -0
  19. package/dist/generate-types.js +220 -0
  20. package/dist/generate-types.js.map +1 -0
  21. package/dist/id.d.ts +8 -0
  22. package/dist/id.d.ts.map +1 -0
  23. package/dist/id.js +8 -0
  24. package/dist/id.js.map +1 -0
  25. package/dist/index.d.ts +28 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +22 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/rich-text.d.ts +164 -0
  30. package/dist/rich-text.d.ts.map +1 -0
  31. package/dist/rich-text.js +97 -0
  32. package/dist/rich-text.js.map +1 -0
  33. package/dist/routing/ids.d.ts +18 -0
  34. package/dist/routing/ids.d.ts.map +1 -0
  35. package/dist/routing/ids.js +41 -0
  36. package/dist/routing/ids.js.map +1 -0
  37. package/dist/routing/index.d.ts +13 -0
  38. package/dist/routing/index.d.ts.map +1 -0
  39. package/dist/routing/index.js +7 -0
  40. package/dist/routing/index.js.map +1 -0
  41. package/dist/routing/redirects.d.ts +76 -0
  42. package/dist/routing/redirects.d.ts.map +1 -0
  43. package/dist/routing/redirects.js +237 -0
  44. package/dist/routing/redirects.js.map +1 -0
  45. package/dist/routing/resolve.d.ts +38 -0
  46. package/dist/routing/resolve.d.ts.map +1 -0
  47. package/dist/routing/resolve.js +23 -0
  48. package/dist/routing/resolve.js.map +1 -0
  49. package/dist/routing/router.d.ts +51 -0
  50. package/dist/routing/router.d.ts.map +1 -0
  51. package/dist/routing/router.js +132 -0
  52. package/dist/routing/router.js.map +1 -0
  53. package/dist/routing/slug-change.d.ts +39 -0
  54. package/dist/routing/slug-change.d.ts.map +1 -0
  55. package/dist/routing/slug-change.js +44 -0
  56. package/dist/routing/slug-change.js.map +1 -0
  57. package/dist/routing/slug.d.ts +82 -0
  58. package/dist/routing/slug.d.ts.map +1 -0
  59. package/dist/routing/slug.js +124 -0
  60. package/dist/routing/slug.js.map +1 -0
  61. package/dist/routing/slugify.d.ts +29 -0
  62. package/dist/routing/slugify.d.ts.map +1 -0
  63. package/dist/routing/slugify.js +104 -0
  64. package/dist/routing/slugify.js.map +1 -0
  65. package/dist/scheduling/index.d.ts +3 -0
  66. package/dist/scheduling/index.d.ts.map +1 -0
  67. package/dist/scheduling/index.js +2 -0
  68. package/dist/scheduling/index.js.map +1 -0
  69. package/dist/scheduling/publish.d.ts +71 -0
  70. package/dist/scheduling/publish.d.ts.map +1 -0
  71. package/dist/scheduling/publish.js +122 -0
  72. package/dist/scheduling/publish.js.map +1 -0
  73. package/dist/search/extract.d.ts +25 -0
  74. package/dist/search/extract.d.ts.map +1 -0
  75. package/dist/search/extract.js +188 -0
  76. package/dist/search/extract.js.map +1 -0
  77. package/dist/search/index.d.ts +36 -0
  78. package/dist/search/index.d.ts.map +1 -0
  79. package/dist/search/index.js +44 -0
  80. package/dist/search/index.js.map +1 -0
  81. package/dist/search/mysql.d.ts +7 -0
  82. package/dist/search/mysql.d.ts.map +1 -0
  83. package/dist/search/mysql.js +121 -0
  84. package/dist/search/mysql.js.map +1 -0
  85. package/dist/search/postgres.d.ts +9 -0
  86. package/dist/search/postgres.d.ts.map +1 -0
  87. package/dist/search/postgres.js +167 -0
  88. package/dist/search/postgres.js.map +1 -0
  89. package/dist/search/query.d.ts +35 -0
  90. package/dist/search/query.d.ts.map +1 -0
  91. package/dist/search/query.js +116 -0
  92. package/dist/search/query.js.map +1 -0
  93. package/dist/search/sqlite.d.ts +16 -0
  94. package/dist/search/sqlite.d.ts.map +1 -0
  95. package/dist/search/sqlite.js +166 -0
  96. package/dist/search/sqlite.js.map +1 -0
  97. package/dist/search/table.d.ts +49 -0
  98. package/dist/search/table.d.ts.map +1 -0
  99. package/dist/search/table.js +86 -0
  100. package/dist/search/table.js.map +1 -0
  101. package/dist/search/text.d.ts +42 -0
  102. package/dist/search/text.d.ts.map +1 -0
  103. package/dist/search/text.js +56 -0
  104. package/dist/search/text.js.map +1 -0
  105. package/dist/search/types.d.ts +98 -0
  106. package/dist/search/types.d.ts.map +1 -0
  107. package/dist/search/types.js +2 -0
  108. package/dist/search/types.js.map +1 -0
  109. package/dist/store/columns.d.ts +33 -0
  110. package/dist/store/columns.d.ts.map +1 -0
  111. package/dist/store/columns.js +113 -0
  112. package/dist/store/columns.js.map +1 -0
  113. package/dist/store/cursor.d.ts +23 -0
  114. package/dist/store/cursor.d.ts.map +1 -0
  115. package/dist/store/cursor.js +36 -0
  116. package/dist/store/cursor.js.map +1 -0
  117. package/dist/store/diff.d.ts +59 -0
  118. package/dist/store/diff.d.ts.map +1 -0
  119. package/dist/store/diff.js +124 -0
  120. package/dist/store/diff.js.map +1 -0
  121. package/dist/store/fragments.d.ts +13 -0
  122. package/dist/store/fragments.d.ts.map +1 -0
  123. package/dist/store/fragments.js +25 -0
  124. package/dist/store/fragments.js.map +1 -0
  125. package/dist/store/index.d.ts +22 -0
  126. package/dist/store/index.d.ts.map +1 -0
  127. package/dist/store/index.js +16 -0
  128. package/dist/store/index.js.map +1 -0
  129. package/dist/store/naming.d.ts +25 -0
  130. package/dist/store/naming.d.ts.map +1 -0
  131. package/dist/store/naming.js +80 -0
  132. package/dist/store/naming.js.map +1 -0
  133. package/dist/store/read-only.d.ts +16 -0
  134. package/dist/store/read-only.d.ts.map +1 -0
  135. package/dist/store/read-only.js +36 -0
  136. package/dist/store/read-only.js.map +1 -0
  137. package/dist/store/store.d.ts +52 -0
  138. package/dist/store/store.d.ts.map +1 -0
  139. package/dist/store/store.js +706 -0
  140. package/dist/store/store.js.map +1 -0
  141. package/dist/store/tables.d.ts +40 -0
  142. package/dist/store/tables.d.ts.map +1 -0
  143. package/dist/store/tables.js +267 -0
  144. package/dist/store/tables.js.map +1 -0
  145. package/dist/store/types.d.ts +105 -0
  146. package/dist/store/types.d.ts.map +1 -0
  147. package/dist/store/types.js +2 -0
  148. package/dist/store/types.js.map +1 -0
  149. package/dist/store/uuid.d.ts +6 -0
  150. package/dist/store/uuid.d.ts.map +1 -0
  151. package/dist/store/uuid.js +64 -0
  152. package/dist/store/uuid.js.map +1 -0
  153. package/dist/store/values.d.ts +40 -0
  154. package/dist/store/values.d.ts.map +1 -0
  155. package/dist/store/values.js +160 -0
  156. package/dist/store/values.js.map +1 -0
  157. package/dist/system-fields.d.ts +60 -0
  158. package/dist/system-fields.d.ts.map +1 -0
  159. package/dist/system-fields.js +73 -0
  160. package/dist/system-fields.js.map +1 -0
  161. package/dist/types.d.ts +101 -0
  162. package/dist/types.d.ts.map +1 -0
  163. package/dist/types.js +32 -0
  164. package/dist/types.js.map +1 -0
  165. package/dist/validation.d.ts +54 -0
  166. package/dist/validation.d.ts.map +1 -0
  167. package/dist/validation.js +183 -0
  168. package/dist/validation.js.map +1 -0
  169. 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":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,GAAG;;;;;CAKd,CAAA;AAED,wEAAwE;AACxE,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFf,CAAA;AAED,MAAM,UAAU,sBAAsB,CAAC,WAA4C;IACjF,qBAAqB,CAAC,WAAW,CAAC,CAAA;IAElC,0EAA0E;IAC1E,0CAA0C;IAC1C,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAExF,MAAM,KAAK,GAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEzC,KAAK,MAAM,UAAU,IAAI,MAAM,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;IAExC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACvB,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAgC;IACxD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAA;IAChD,KAAK,CAAC,IAAI,CAAC,oBAAoB,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IAEvF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACnC,IAAI,GAAG,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAA;QACpD,KAAK,CAAC,IAAI,CAAC,cAAc,YAAY,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACnB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,WAA4C;IAClE,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;IAC5D,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;IAChD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,cAAc,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9F,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACnB,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,cAAsB;IAClD,OAAO,cAAc;SAClB,KAAK,CAAC,MAAM,CAAC;SACb,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,MAAM,cAAc,GAAG,4BAA4B,CAAA;AAEnD,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAsB;IAC9C,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,CAC1D,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAC5D,CAAA;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC7D,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACpF,CAAC;AAED,SAAS,MAAM,CAAC,KAAsB;IACpC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC9B,8EAA8E;IAC9E,+CAA+C;IAC/C,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACrE,4EAA4E;IAC5E,wEAAwE;IACxE,+CAA+C;IAC/C,OAAO,GAAG,IAAI,SAAS,CAAA;AACzB,CAAC;AAED,SAAS,UAAU,CAAC,KAAsB;IACxC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,QAAQ,CAAA;QACjB,KAAK,UAAU;YACb,OAAO,kBAAkB,CAAA;QAC3B,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAA;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAA;QAClB,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,WAAW,CAAA;QAC3E,KAAK,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;YAChC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;QACtE,CAAC;QACD,KAAK,MAAM;YACT,OAAO,WAAW,CAAA;QACpB,KAAK,KAAK;YACR,OAAO,UAAU,CAAA;QACnB,KAAK,QAAQ;YACX,OAAO,yBAAyB,CAAA;QAClC;YACE,uEAAuE;YACvE,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAsB;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAA;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAA;IACpE,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACd,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM;QAChE,CAAC,CAAC,MAAM,CAAE,MAA6B,CAAC,KAAK,CAAC;QAC9C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CACnB;SACA,GAAG,CAAC,KAAK,CAAC;SACV,IAAI,CAAC,KAAK,CAAC,CAAA;AAChB,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAA;AACrE,CAAC"}
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
@@ -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"}
@@ -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"}