@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,8 @@
1
+ import { type CollectionDefinition } from './types.js';
2
+ export declare function defineCollection<const TDefinition extends CollectionDefinition>(definition: TDefinition): TDefinition;
3
+ /**
4
+ * Cross-collection checks, which no single `defineCollection` call can make:
5
+ * a relation only knows the *name* of its target.
6
+ */
7
+ export declare function validateCollectionSet(collections: readonly CollectionDefinition[]): void;
8
+ //# sourceMappingURL=define-collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-collection.d.ts","sourceRoot":"","sources":["../src/define-collection.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,oBAAoB,EAG1B,MAAM,YAAY,CAAA;AA4BnB,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,WAAW,SAAS,oBAAoB,EAC7E,UAAU,EAAE,WAAW,GACtB,WAAW,CAMb;AAsSD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAAG,IAAI,CAyBxF"}
@@ -0,0 +1,311 @@
1
+ import { schemaError } from './errors.js';
2
+ import { MEDIA_ACCEPT_KINDS } from './fields.js';
3
+ import { isSystemFieldName } from './system-fields.js';
4
+ import { CONTENT_ACTIONS, FIELD_KINDS, } from './types.js';
5
+ import { fieldSchema } from './validation.js';
6
+ /**
7
+ * `defineCollection` is the only door into the content model.
8
+ *
9
+ * It checks the definition eagerly, at import time, because everything
10
+ * downstream — types, migrations, admin, API — is generated from it. A schema
11
+ * mistake caught here costs a restart; the same mistake caught at migration
12
+ * time costs a database.
13
+ */
14
+ /** Table-safe: the collection name becomes an identifier on three dialects. */
15
+ const COLLECTION_NAME_PATTERN = /^[a-z][a-z0-9_]*$/;
16
+ /** Property-safe: the field name becomes a TypeScript property and a column. */
17
+ const FIELD_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
18
+ const ROUTE_PARAMETER_PATTERN = /:([a-zA-Z_][a-zA-Z0-9_]*)/g;
19
+ const INDEX_DIRECTIONS = new Set(['asc', 'desc']);
20
+ const ACTION_SET = new Set(CONTENT_ACTIONS);
21
+ const KIND_SET = new Set(FIELD_KINDS);
22
+ const ACCEPT_SET = new Set(MEDIA_ACCEPT_KINDS);
23
+ export function defineCollection(definition) {
24
+ const issues = collectIssues(definition);
25
+ if (issues.length > 0) {
26
+ throw schemaError(definition.name ?? '(unnamed)', issues);
27
+ }
28
+ return definition;
29
+ }
30
+ function collectIssues(definition) {
31
+ const issues = [];
32
+ if (typeof definition.name !== 'string' || !COLLECTION_NAME_PATTERN.test(definition.name)) {
33
+ issues.push({
34
+ path: 'name',
35
+ message: 'must be a lowercase identifier such as "article" or "blog_post"',
36
+ });
37
+ }
38
+ if (definition.labels?.singular === undefined || definition.labels.singular === '') {
39
+ issues.push({ path: 'labels.singular', message: 'is required' });
40
+ }
41
+ if (definition.labels?.plural === undefined || definition.labels.plural === '') {
42
+ issues.push({ path: 'labels.plural', message: 'is required' });
43
+ }
44
+ const fields = definition.fields;
45
+ const fieldNames = fields === undefined ? [] : Object.keys(fields);
46
+ if (fieldNames.length === 0) {
47
+ issues.push({ path: 'fields', message: 'a collection needs at least one field' });
48
+ }
49
+ for (const name of fieldNames) {
50
+ checkField(name, fields[name], fieldNames, issues);
51
+ }
52
+ checkRouting(definition, fieldNames, issues);
53
+ checkIndexes(definition, fieldNames, issues);
54
+ checkPermissions(definition, issues);
55
+ checkVersioning(definition, issues);
56
+ return issues;
57
+ }
58
+ function checkField(name, field, fieldNames, issues) {
59
+ const path = `fields.${name}`;
60
+ if (!FIELD_NAME_PATTERN.test(name)) {
61
+ issues.push({ path, message: 'field name must be a valid identifier' });
62
+ }
63
+ // A collection cannot redeclare a system field: the runtime owns `status`,
64
+ // `locale` and `provenance`, and a shadowing column would be written twice
65
+ // with different meanings.
66
+ if (isSystemFieldName(name)) {
67
+ issues.push({ path, message: `"${name}" is a system field and cannot be redeclared` });
68
+ return;
69
+ }
70
+ if (field === undefined || typeof field !== 'object' || !KIND_SET.has(field.kind)) {
71
+ issues.push({ path, message: 'must be built with an `f.*` constructor' });
72
+ return;
73
+ }
74
+ switch (field.kind) {
75
+ case 'relation':
76
+ checkRelation(path, field, issues);
77
+ break;
78
+ case 'select':
79
+ checkSelect(path, field, issues);
80
+ break;
81
+ case 'slug':
82
+ checkSlug(path, field, fieldNames, issues);
83
+ break;
84
+ case 'media':
85
+ checkMedia(path, field, issues);
86
+ break;
87
+ case 'blocks':
88
+ checkBlocks(path, field, issues);
89
+ break;
90
+ default:
91
+ break;
92
+ }
93
+ const showWhen = field.admin?.showWhen;
94
+ if (showWhen !== undefined && !fieldNames.includes(showWhen.field)) {
95
+ issues.push({
96
+ path: `${path}.admin.showWhen.field`,
97
+ message: `refers to "${showWhen.field}", which this collection does not declare`,
98
+ });
99
+ }
100
+ checkDefault(path, field, issues);
101
+ }
102
+ function checkRelation(path, field, issues) {
103
+ const to = field.options.to;
104
+ if (typeof to !== 'string' || to === '') {
105
+ issues.push({ path: `${path}.to`, message: 'a relation must name the collection it points to' });
106
+ }
107
+ // Contract A: `'setNull'` only makes sense on a to-one, non-required
108
+ // relation. Anywhere else it describes an impossible row.
109
+ if (field.options.onDelete === 'setNull') {
110
+ if (field.options.many === true) {
111
+ issues.push({
112
+ path: `${path}.onDelete`,
113
+ message: "'setNull' is meaningless on a to-many relation; use 'cascade' or 'restrict'",
114
+ });
115
+ }
116
+ if (field.required === true) {
117
+ issues.push({
118
+ path: `${path}.onDelete`,
119
+ message: "'setNull' cannot apply to a required field, which may never be null",
120
+ });
121
+ }
122
+ }
123
+ }
124
+ function checkSelect(path, field, issues) {
125
+ const options = field.options.options;
126
+ if (!Array.isArray(options) || options.length === 0) {
127
+ issues.push({ path: `${path}.options`, message: 'a select needs at least one option' });
128
+ return;
129
+ }
130
+ const seen = new Set();
131
+ for (const choice of options) {
132
+ const value = typeof choice === 'object' && choice !== null && 'value' in choice
133
+ ? String(choice.value)
134
+ : String(choice);
135
+ if (value === '') {
136
+ issues.push({ path: `${path}.options`, message: 'an option value cannot be empty' });
137
+ }
138
+ if (seen.has(value)) {
139
+ issues.push({ path: `${path}.options`, message: `duplicate option value "${value}"` });
140
+ }
141
+ seen.add(value);
142
+ }
143
+ }
144
+ function checkSlug(path, field, fieldNames, issues) {
145
+ const from = field.options.from;
146
+ if (from !== undefined && !fieldNames.includes(String(from))) {
147
+ issues.push({
148
+ path: `${path}.from`,
149
+ message: `refers to "${String(from)}", which this collection does not declare`,
150
+ });
151
+ }
152
+ }
153
+ function checkMedia(path, field, issues) {
154
+ const accept = field.options.accept;
155
+ if (!Array.isArray(accept) || accept.length === 0) {
156
+ issues.push({ path: `${path}.accept`, message: 'must accept at least one kind of media' });
157
+ return;
158
+ }
159
+ for (const kind of accept) {
160
+ if (!ACCEPT_SET.has(String(kind))) {
161
+ issues.push({
162
+ path: `${path}.accept`,
163
+ message: `unknown media kind "${String(kind)}"; expected one of ${[...ACCEPT_SET].join(', ')}`,
164
+ });
165
+ }
166
+ }
167
+ }
168
+ function checkBlocks(path, field, issues) {
169
+ const allow = field.options.allow;
170
+ if (allow === '*')
171
+ return;
172
+ if (!Array.isArray(allow) || allow.length === 0) {
173
+ issues.push({
174
+ path: `${path}.allow`,
175
+ message: "must be '*' or a non-empty list of block names",
176
+ });
177
+ return;
178
+ }
179
+ for (const name of allow) {
180
+ if (typeof name !== 'string' || name === '') {
181
+ issues.push({ path: `${path}.allow`, message: 'block names must be non-empty strings' });
182
+ }
183
+ }
184
+ }
185
+ /**
186
+ * A default that the field itself would reject is a bug that only shows up the
187
+ * first time an editor creates an entry — long after the schema was written.
188
+ */
189
+ function checkDefault(path, field, issues) {
190
+ if (field.default === undefined)
191
+ return;
192
+ const result = fieldSchema(field).safeParse(field.default);
193
+ if (!result.success) {
194
+ const reason = result.error.issues[0]?.message ?? 'is not a valid value for this field';
195
+ issues.push({ path: `${path}.default`, message: `${reason} (default value)` });
196
+ }
197
+ }
198
+ function checkRouting(definition, fieldNames, issues) {
199
+ const routing = definition.routing;
200
+ if (routing === undefined)
201
+ return;
202
+ if (typeof routing.pattern !== 'string' || !routing.pattern.startsWith('/')) {
203
+ issues.push({ path: 'routing.pattern', message: 'must start with "/"' });
204
+ return;
205
+ }
206
+ for (const match of routing.pattern.matchAll(ROUTE_PARAMETER_PATTERN)) {
207
+ const parameter = match[1];
208
+ if (parameter === undefined)
209
+ continue;
210
+ // `:locale` is served by the system field of the same name; anything else
211
+ // has to come from a declared field, or the route can never be built.
212
+ if (parameter === 'locale' || fieldNames.includes(parameter))
213
+ continue;
214
+ issues.push({
215
+ path: 'routing.pattern',
216
+ message: `":${parameter}" does not match any field of this collection`,
217
+ });
218
+ }
219
+ }
220
+ function checkIndexes(definition, fieldNames, issues) {
221
+ const indexes = definition.indexes;
222
+ if (indexes === undefined)
223
+ return;
224
+ for (const [position, index] of indexes.entries()) {
225
+ const path = `indexes[${position}]`;
226
+ if (!Array.isArray(index) || index.length === 0) {
227
+ issues.push({ path, message: 'an index needs at least one field' });
228
+ continue;
229
+ }
230
+ for (const [column, entry] of index.entries()) {
231
+ // The contract writes a direction as the last element: ['publishedAt', 'desc'].
232
+ const isTrailingDirection = column === index.length - 1 && INDEX_DIRECTIONS.has(entry);
233
+ if (isTrailingDirection)
234
+ continue;
235
+ if (fieldNames.includes(entry) || isSystemFieldName(entry))
236
+ continue;
237
+ issues.push({
238
+ path,
239
+ message: `"${entry}" is neither a field of this collection nor a system field`,
240
+ });
241
+ }
242
+ }
243
+ }
244
+ function checkPermissions(definition, issues) {
245
+ const permissions = definition.permissions;
246
+ if (permissions === undefined || typeof permissions !== 'object') {
247
+ issues.push({ path: 'permissions', message: 'is required' });
248
+ return;
249
+ }
250
+ for (const [action, roles] of Object.entries(permissions)) {
251
+ if (!ACTION_SET.has(action)) {
252
+ issues.push({
253
+ path: `permissions.${action}`,
254
+ message: `unknown action; the fixed set is ${CONTENT_ACTIONS.join(', ')}`,
255
+ });
256
+ continue;
257
+ }
258
+ if (!Array.isArray(roles)) {
259
+ issues.push({ path: `permissions.${action}`, message: 'must be a list of role names' });
260
+ continue;
261
+ }
262
+ for (const role of roles) {
263
+ if (typeof role !== 'string' || role === '') {
264
+ issues.push({
265
+ path: `permissions.${action}`,
266
+ message: 'role names must be non-empty strings',
267
+ });
268
+ }
269
+ }
270
+ }
271
+ }
272
+ function checkVersioning(definition, issues) {
273
+ const keep = definition.versioning?.keep;
274
+ if (keep === undefined)
275
+ return;
276
+ if (!Number.isInteger(keep) || keep < 1) {
277
+ issues.push({ path: 'versioning.keep', message: 'must be a positive whole number of versions' });
278
+ }
279
+ }
280
+ /**
281
+ * Cross-collection checks, which no single `defineCollection` call can make:
282
+ * a relation only knows the *name* of its target.
283
+ */
284
+ export function validateCollectionSet(collections) {
285
+ const names = new Set();
286
+ for (const collection of collections) {
287
+ if (names.has(collection.name)) {
288
+ throw schemaError(collection.name, [
289
+ { path: 'name', message: 'two collections share this name' },
290
+ ]);
291
+ }
292
+ names.add(collection.name);
293
+ }
294
+ for (const collection of collections) {
295
+ const issues = [];
296
+ for (const [name, field] of Object.entries(collection.fields)) {
297
+ if (field.kind !== 'relation')
298
+ continue;
299
+ const target = String(field.options.to);
300
+ if (!names.has(target)) {
301
+ issues.push({
302
+ path: `fields.${name}.to`,
303
+ message: `points at "${target}", which no collection defines`,
304
+ });
305
+ }
306
+ }
307
+ if (issues.length > 0)
308
+ throw schemaError(collection.name, issues);
309
+ }
310
+ }
311
+ //# sourceMappingURL=define-collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-collection.js","sourceRoot":"","sources":["../src/define-collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { CogentaError } from '@cogenta/core';
2
+ /** One thing wrong with a definition, located by a dotted path. */
3
+ export interface SchemaIssue {
4
+ /** `fields.title.max`, `permissions.read`, `routing.pattern`… */
5
+ readonly path: string;
6
+ readonly message: string;
7
+ }
8
+ /**
9
+ * Every issue found in one definition, reported at once.
10
+ *
11
+ * Reporting the first problem only turns fixing a schema into a game of
12
+ * whack-a-mole: one `cogenta generate` per typo. The path is what names the
13
+ * offending field, which is the whole point of this error.
14
+ */
15
+ export declare function schemaError(collection: string, issues: readonly SchemaIssue[]): CogentaError;
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,YAAY,CAS5F"}
package/dist/errors.js ADDED
@@ -0,0 +1,18 @@
1
+ import { CogentaError } from '@cogenta/core';
2
+ /**
3
+ * Every issue found in one definition, reported at once.
4
+ *
5
+ * Reporting the first problem only turns fixing a schema into a game of
6
+ * whack-a-mole: one `cogenta generate` per typo. The path is what names the
7
+ * offending field, which is the whole point of this error.
8
+ */
9
+ export function schemaError(collection, issues) {
10
+ const lines = issues.map((issue) => ` ${issue.path}: ${issue.message}`).join('\n');
11
+ return new CogentaError({
12
+ code: 'SCHEMA_INVALID',
13
+ message: `Collection "${collection}" is not a valid schema:\n${lines}`,
14
+ hint: 'Fix the fields listed above in the collection file, then run `cogenta generate` again.',
15
+ details: { collection, issues },
16
+ });
17
+ }
18
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAS5C;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,MAA8B;IAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEnF,OAAO,IAAI,YAAY,CAAC;QACtB,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,eAAe,UAAU,6BAA6B,KAAK,EAAE;QACtE,IAAI,EAAE,wFAAwF;QAC9F,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;KAChC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,117 @@
1
+ import type { BaseFieldOptions, FieldDefinition, OnDelete } from './types.js';
2
+ export interface TextFieldOptions extends BaseFieldOptions {
3
+ readonly min?: number;
4
+ readonly max?: number;
5
+ /** Hint for the admin: render a textarea rather than a single-line input. */
6
+ readonly multiline?: boolean;
7
+ }
8
+ export interface SlugFieldOptions extends BaseFieldOptions {
9
+ /** Field the admin derives the slug from when the editor has not typed one. */
10
+ readonly from?: string;
11
+ readonly max?: number;
12
+ }
13
+ export interface NumberFieldOptions extends BaseFieldOptions {
14
+ readonly min?: number;
15
+ readonly max?: number;
16
+ readonly integer?: boolean;
17
+ }
18
+ export declare const MEDIA_ACCEPT_KINDS: readonly ['image', 'video', 'audio', 'file'];
19
+ export type MediaAcceptKind = (typeof MEDIA_ACCEPT_KINDS)[number];
20
+ export interface MediaFieldOptions extends BaseFieldOptions {
21
+ readonly accept?: readonly MediaAcceptKind[];
22
+ readonly many?: boolean;
23
+ }
24
+ export interface RelationFieldOptions extends BaseFieldOptions {
25
+ /** Name of the target collection. */
26
+ readonly to: string;
27
+ readonly many?: boolean;
28
+ readonly onDelete?: OnDelete;
29
+ }
30
+ /** A choice is a value plus what the editor reads. Bare strings are widened. */
31
+ export interface SelectChoice {
32
+ readonly value: string;
33
+ readonly label?: string;
34
+ }
35
+ export interface SelectFieldOptions extends BaseFieldOptions {
36
+ readonly options: readonly (string | SelectChoice)[];
37
+ readonly many?: boolean;
38
+ }
39
+ export interface BlocksFieldOptions extends BaseFieldOptions {
40
+ /** `'*'` allows the whole vocabulary; a list restricts it. */
41
+ readonly allow?: '*' | readonly string[];
42
+ }
43
+ export declare const f: {
44
+ readonly text: (options?: TextFieldOptions) => FieldDefinition & {
45
+ readonly kind: "text";
46
+ readonly options: Readonly<Record<string, unknown>>;
47
+ };
48
+ readonly richText: (options?: BaseFieldOptions) => FieldDefinition & {
49
+ readonly kind: "richText";
50
+ readonly options: {};
51
+ };
52
+ readonly slug: (options?: SlugFieldOptions) => FieldDefinition & {
53
+ readonly kind: "slug";
54
+ readonly options: Readonly<Record<string, unknown>>;
55
+ };
56
+ readonly number: (options?: NumberFieldOptions) => FieldDefinition & {
57
+ readonly kind: "number";
58
+ readonly options: Readonly<Record<string, unknown>>;
59
+ };
60
+ readonly boolean: (options?: BaseFieldOptions) => FieldDefinition & {
61
+ readonly kind: "boolean";
62
+ readonly options: {};
63
+ };
64
+ /** Calendar day, no time zone: `YYYY-MM-DD`. */
65
+ readonly date: (options?: BaseFieldOptions) => FieldDefinition & {
66
+ readonly kind: "date";
67
+ readonly options: {};
68
+ };
69
+ /** Instant, stored as ISO 8601 with an offset. */
70
+ readonly datetime: (options?: BaseFieldOptions) => FieldDefinition & {
71
+ readonly kind: "datetime";
72
+ readonly options: {};
73
+ };
74
+ readonly media: (options?: MediaFieldOptions) => FieldDefinition & {
75
+ readonly kind: "media";
76
+ readonly options: {
77
+ accept: readonly ("audio" | "file" | "image" | "video")[];
78
+ many: boolean;
79
+ };
80
+ };
81
+ readonly relation: (options: RelationFieldOptions) => FieldDefinition & {
82
+ readonly kind: "relation";
83
+ readonly options: {
84
+ to: string;
85
+ many: boolean;
86
+ onDelete: OnDelete;
87
+ };
88
+ };
89
+ readonly select: (options: SelectFieldOptions) => FieldDefinition & {
90
+ readonly kind: "select";
91
+ readonly options: {
92
+ options: readonly SelectChoice[];
93
+ many: boolean;
94
+ };
95
+ };
96
+ readonly json: (options?: BaseFieldOptions) => FieldDefinition & {
97
+ readonly kind: "json";
98
+ readonly options: {};
99
+ };
100
+ /** A point on the globe: `{ lat, lng }`, degrees, WGS 84. */
101
+ readonly geo: (options?: BaseFieldOptions) => FieldDefinition & {
102
+ readonly kind: "geo";
103
+ readonly options: {};
104
+ };
105
+ /** Hex notation, `#rgb`, `#rrggbb` or `#rrggbbaa`. */
106
+ readonly color: (options?: BaseFieldOptions) => FieldDefinition & {
107
+ readonly kind: "color";
108
+ readonly options: {};
109
+ };
110
+ readonly blocks: (options?: BlocksFieldOptions) => FieldDefinition & {
111
+ readonly kind: "blocks";
112
+ readonly options: {
113
+ allow: "*" | readonly string[];
114
+ };
115
+ };
116
+ };
117
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAA;AAyCxF,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,eAAO,MAAM,kBAAkB,YAAI,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAU,CAAA;AAE9E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjE,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,qCAAqC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAC7B;AAED,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,YAAY,CAAC,EAAE,CAAA;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,SAAS,MAAM,EAAE,CAAA;CACzC;AAkBD,eAAO,MAAM,CAAC;aACZ,IAAI,aAAU,gBAAgB;;;;aAI9B,QAAQ,aAAU,gBAAgB;;;;aAIlC,IAAI,aAAU,gBAAgB;;;;aAI9B,MAAM,aAAU,kBAAkB;;;;aAIlC,OAAO,aAAU,gBAAgB;;;;IAIjC,gDAAgD;aAChD,IAAI,aAAU,gBAAgB;;;;IAI9B,kDAAkD;aAClD,QAAQ,aAAU,gBAAgB;;;;aAIlC,KAAK,aAAU,iBAAiB;;;;;;;aAOhC,QAAQ,YAAU,oBAAoB;;;;;;;;aAUtC,MAAM,YAAU,kBAAkB;;;;;;;aAOlC,IAAI,aAAU,gBAAgB;;;;IAI9B,6DAA6D;aAC7D,GAAG,aAAU,gBAAgB;;;;IAI7B,sDAAsD;aACtD,KAAK,aAAU,gBAAgB;;;;aAI/B,MAAM,aAAU,kBAAkB;;;;;;CAG1B,CAAA"}
package/dist/fields.js ADDED
@@ -0,0 +1,107 @@
1
+ /**
2
+ * The field constructors of contract A § "Types de champ (v1)".
3
+ *
4
+ * Every constructor returns a plain, serialisable `FieldDefinition`: the schema
5
+ * is data, not behaviour, because three consumers read it — the validator, the
6
+ * type generator and the admin — and a closure would only be usable by the
7
+ * first one.
8
+ *
9
+ * Kind-specific defaults are materialised here rather than at each call site,
10
+ * so `onDelete` reads `'restrict'` in `.cogenta/schema.json` even when the
11
+ * author never typed it.
12
+ */
13
+ const BASE_KEYS = ['required', 'default', 'localized', 'unique', 'validate', 'admin'];
14
+ /**
15
+ * Copies only the base options that were actually provided.
16
+ *
17
+ * `exactOptionalPropertyTypes` is on: writing `required: input.required` would
18
+ * store an explicit `undefined`, which is not the same as an absent key — and
19
+ * it would show up in the generated JSON.
20
+ */
21
+ function baseOf(input) {
22
+ const base = {};
23
+ for (const key of BASE_KEYS) {
24
+ const value = input[key];
25
+ if (value !== undefined)
26
+ base[key] = value;
27
+ }
28
+ return base;
29
+ }
30
+ function field(kind, input, options) {
31
+ return { kind, ...baseOf(input), options };
32
+ }
33
+ export const MEDIA_ACCEPT_KINDS = ['image', 'video', 'audio', 'file'];
34
+ /** Drops the base keys so they are not duplicated inside `options`. */
35
+ function specificOf(input, keys) {
36
+ const out = {};
37
+ for (const key of keys) {
38
+ const value = input[key];
39
+ if (value !== undefined)
40
+ out[key] = value;
41
+ }
42
+ return out;
43
+ }
44
+ function normaliseChoices(options) {
45
+ return options.map((choice) => (typeof choice === 'string' ? { value: choice } : choice));
46
+ }
47
+ export const f = {
48
+ text(options = {}) {
49
+ return field('text', options, specificOf(options, ['min', 'max', 'multiline']));
50
+ },
51
+ richText(options = {}) {
52
+ return field('richText', options, {});
53
+ },
54
+ slug(options = {}) {
55
+ return field('slug', options, specificOf(options, ['from', 'max']));
56
+ },
57
+ number(options = {}) {
58
+ return field('number', options, specificOf(options, ['min', 'max', 'integer']));
59
+ },
60
+ boolean(options = {}) {
61
+ return field('boolean', options, {});
62
+ },
63
+ /** Calendar day, no time zone: `YYYY-MM-DD`. */
64
+ date(options = {}) {
65
+ return field('date', options, {});
66
+ },
67
+ /** Instant, stored as ISO 8601 with an offset. */
68
+ datetime(options = {}) {
69
+ return field('datetime', options, {});
70
+ },
71
+ media(options = {}) {
72
+ return field('media', options, {
73
+ accept: options.accept ?? MEDIA_ACCEPT_KINDS,
74
+ many: options.many ?? false,
75
+ });
76
+ },
77
+ relation(options) {
78
+ // `'restrict'` by default, deliberately (contract A § "Relations"):
79
+ // deleting an author must not silently erase their articles.
80
+ return field('relation', options, {
81
+ to: options.to,
82
+ many: options.many ?? false,
83
+ onDelete: options.onDelete ?? 'restrict',
84
+ });
85
+ },
86
+ select(options) {
87
+ return field('select', options, {
88
+ options: normaliseChoices(options.options),
89
+ many: options.many ?? false,
90
+ });
91
+ },
92
+ json(options = {}) {
93
+ return field('json', options, {});
94
+ },
95
+ /** A point on the globe: `{ lat, lng }`, degrees, WGS 84. */
96
+ geo(options = {}) {
97
+ return field('geo', options, {});
98
+ },
99
+ /** Hex notation, `#rgb`, `#rrggbb` or `#rrggbbaa`. */
100
+ color(options = {}) {
101
+ return field('color', options, {});
102
+ },
103
+ blocks(options = {}) {
104
+ return field('blocks', options, { allow: options.allow ?? '*' });
105
+ },
106
+ };
107
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"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"}