@metaobjectsdev/codegen-ts 0.23.1 → 0.24.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 (179) hide show
  1. package/dist/column-mapper.d.ts +32 -0
  2. package/dist/column-mapper.d.ts.map +1 -1
  3. package/dist/column-mapper.js +91 -8
  4. package/dist/column-mapper.js.map +1 -1
  5. package/dist/enum-meta.d.ts +20 -0
  6. package/dist/enum-meta.d.ts.map +1 -1
  7. package/dist/enum-meta.js +32 -1
  8. package/dist/enum-meta.js.map +1 -1
  9. package/dist/generator.d.ts +9 -0
  10. package/dist/generator.d.ts.map +1 -1
  11. package/dist/generator.js.map +1 -1
  12. package/dist/generators/api-field-shape.js +1 -1
  13. package/dist/generators/api-field-shape.js.map +1 -1
  14. package/dist/generators/api-model.d.ts.map +1 -1
  15. package/dist/generators/api-model.js +71 -42
  16. package/dist/generators/api-model.js.map +1 -1
  17. package/dist/generators/docs-data-builder.d.ts.map +1 -1
  18. package/dist/generators/docs-data-builder.js +36 -1
  19. package/dist/generators/docs-data-builder.js.map +1 -1
  20. package/dist/generators/docs-data.d.ts +14 -0
  21. package/dist/generators/docs-data.d.ts.map +1 -1
  22. package/dist/generators/docs-file.d.ts.map +1 -1
  23. package/dist/generators/docs-file.js +13 -4
  24. package/dist/generators/docs-file.js.map +1 -1
  25. package/dist/generators/extractor-file.d.ts.map +1 -1
  26. package/dist/generators/extractor-file.js +7 -11
  27. package/dist/generators/extractor-file.js.map +1 -1
  28. package/dist/generators/index.d.ts +4 -0
  29. package/dist/generators/index.d.ts.map +1 -1
  30. package/dist/generators/index.js +5 -0
  31. package/dist/generators/index.js.map +1 -1
  32. package/dist/generators/output-parser-file.d.ts.map +1 -1
  33. package/dist/generators/output-parser-file.js +12 -7
  34. package/dist/generators/output-parser-file.js.map +1 -1
  35. package/dist/generators/output-prompt-file.d.ts.map +1 -1
  36. package/dist/generators/output-prompt-file.js +14 -24
  37. package/dist/generators/output-prompt-file.js.map +1 -1
  38. package/dist/generators/requirement-tests.d.ts +44 -0
  39. package/dist/generators/requirement-tests.d.ts.map +1 -0
  40. package/dist/generators/requirement-tests.js +127 -0
  41. package/dist/generators/requirement-tests.js.map +1 -0
  42. package/dist/generators/requirements-file.d.ts +9 -0
  43. package/dist/generators/requirements-file.d.ts.map +1 -0
  44. package/dist/generators/requirements-file.js +53 -0
  45. package/dist/generators/requirements-file.js.map +1 -0
  46. package/dist/generators/requirements-markdown.d.ts +10 -0
  47. package/dist/generators/requirements-markdown.d.ts.map +1 -0
  48. package/dist/generators/requirements-markdown.js +71 -0
  49. package/dist/generators/requirements-markdown.js.map +1 -0
  50. package/dist/generators/requirements-toon.d.ts +3 -0
  51. package/dist/generators/requirements-toon.d.ts.map +1 -0
  52. package/dist/generators/requirements-toon.js +47 -0
  53. package/dist/generators/requirements-toon.js.map +1 -0
  54. package/dist/generators/requirements-view.d.ts +32 -0
  55. package/dist/generators/requirements-view.d.ts.map +1 -0
  56. package/dist/generators/requirements-view.js +64 -0
  57. package/dist/generators/requirements-view.js.map +1 -0
  58. package/dist/generators/trace-helper-file.d.ts.map +1 -1
  59. package/dist/generators/trace-helper-file.js +19 -11
  60. package/dist/generators/trace-helper-file.js.map +1 -1
  61. package/dist/index.d.ts +13 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +18 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/metaobjects-config.d.ts +12 -20
  66. package/dist/metaobjects-config.d.ts.map +1 -1
  67. package/dist/metaobjects-config.js +5 -1
  68. package/dist/metaobjects-config.js.map +1 -1
  69. package/dist/orphan-sweep.d.ts +38 -0
  70. package/dist/orphan-sweep.d.ts.map +1 -0
  71. package/dist/orphan-sweep.js +129 -0
  72. package/dist/orphan-sweep.js.map +1 -0
  73. package/dist/overwrite-policy.d.ts +97 -3
  74. package/dist/overwrite-policy.d.ts.map +1 -1
  75. package/dist/overwrite-policy.js +293 -81
  76. package/dist/overwrite-policy.js.map +1 -1
  77. package/dist/projection/build-projection-views.d.ts +8 -0
  78. package/dist/projection/build-projection-views.d.ts.map +1 -1
  79. package/dist/projection/build-projection-views.js +2 -0
  80. package/dist/projection/build-projection-views.js.map +1 -1
  81. package/dist/projection/extract-view-spec.d.ts.map +1 -1
  82. package/dist/projection/extract-view-spec.js +70 -6
  83. package/dist/projection/extract-view-spec.js.map +1 -1
  84. package/dist/reconcile-orphans.d.ts +80 -0
  85. package/dist/reconcile-orphans.d.ts.map +1 -0
  86. package/dist/reconcile-orphans.js +61 -0
  87. package/dist/reconcile-orphans.js.map +1 -0
  88. package/dist/render-engine/embedded-templates.generated.js +1 -1
  89. package/dist/render-engine/embedded-templates.generated.js.map +1 -1
  90. package/dist/requirement-walk.d.ts +57 -0
  91. package/dist/requirement-walk.d.ts.map +1 -0
  92. package/dist/requirement-walk.js +94 -0
  93. package/dist/requirement-walk.js.map +1 -0
  94. package/dist/runner.d.ts +35 -0
  95. package/dist/runner.d.ts.map +1 -1
  96. package/dist/runner.js +217 -21
  97. package/dist/runner.js.map +1 -1
  98. package/dist/templates/drizzle-schema.d.ts.map +1 -1
  99. package/dist/templates/drizzle-schema.js +67 -4
  100. package/dist/templates/drizzle-schema.js.map +1 -1
  101. package/dist/templates/extractor.d.ts +4 -4
  102. package/dist/templates/extractor.d.ts.map +1 -1
  103. package/dist/templates/extractor.js +18 -22
  104. package/dist/templates/extractor.js.map +1 -1
  105. package/dist/templates/filter-allowlist.d.ts.map +1 -1
  106. package/dist/templates/filter-allowlist.js +4 -2
  107. package/dist/templates/filter-allowlist.js.map +1 -1
  108. package/dist/templates/filter-type.d.ts.map +1 -1
  109. package/dist/templates/filter-type.js +6 -2
  110. package/dist/templates/filter-type.js.map +1 -1
  111. package/dist/templates/find-inbound.d.ts +44 -0
  112. package/dist/templates/find-inbound.d.ts.map +1 -0
  113. package/dist/templates/find-inbound.js +69 -0
  114. package/dist/templates/find-inbound.js.map +1 -0
  115. package/dist/templates/output-format-spec-emitter.d.ts.map +1 -1
  116. package/dist/templates/output-format-spec-emitter.js +7 -4
  117. package/dist/templates/output-format-spec-emitter.js.map +1 -1
  118. package/dist/templates/output-parser.d.ts +8 -3
  119. package/dist/templates/output-parser.d.ts.map +1 -1
  120. package/dist/templates/output-parser.js +71 -31
  121. package/dist/templates/output-parser.js.map +1 -1
  122. package/dist/templates/output-prompt.d.ts +6 -5
  123. package/dist/templates/output-prompt.d.ts.map +1 -1
  124. package/dist/templates/output-prompt.js +26 -37
  125. package/dist/templates/output-prompt.js.map +1 -1
  126. package/dist/templates/queries.js +1 -1
  127. package/dist/templates/queries.js.map +1 -1
  128. package/dist/templates/requirement-test.d.ts +12 -0
  129. package/dist/templates/requirement-test.d.ts.map +1 -0
  130. package/dist/templates/requirement-test.js +120 -0
  131. package/dist/templates/requirement-test.js.map +1 -0
  132. package/dist/templates/zod-validators.d.ts.map +1 -1
  133. package/dist/templates/zod-validators.js +32 -15
  134. package/dist/templates/zod-validators.js.map +1 -1
  135. package/package.json +7 -6
  136. package/src/column-mapper.ts +124 -8
  137. package/src/enum-meta.ts +37 -1
  138. package/src/generator.ts +9 -0
  139. package/src/generators/api-field-shape.ts +1 -1
  140. package/src/generators/api-model.ts +69 -44
  141. package/src/generators/docs-data-builder.ts +37 -0
  142. package/src/generators/docs-data.ts +15 -0
  143. package/src/generators/docs-file.ts +13 -4
  144. package/src/generators/extractor-file.ts +7 -11
  145. package/src/generators/index.ts +11 -0
  146. package/src/generators/output-parser-file.ts +12 -7
  147. package/src/generators/output-prompt-file.ts +14 -27
  148. package/src/generators/requirement-tests.ts +203 -0
  149. package/src/generators/requirements-file.ts +71 -0
  150. package/src/generators/requirements-markdown.ts +72 -0
  151. package/src/generators/requirements-toon.ts +64 -0
  152. package/src/generators/requirements-view.ts +93 -0
  153. package/src/generators/trace-helper-file.ts +20 -10
  154. package/src/index.ts +47 -1
  155. package/src/metaobjects-config.ts +17 -22
  156. package/src/orphan-sweep.ts +178 -0
  157. package/src/overwrite-policy.ts +362 -89
  158. package/src/projection/build-projection-views.ts +10 -0
  159. package/src/projection/extract-view-spec.ts +88 -4
  160. package/src/reconcile-orphans.ts +136 -0
  161. package/src/reference/barrel.ts +4 -0
  162. package/src/reference/entity.ts +4 -0
  163. package/src/reference/queries.ts +4 -0
  164. package/src/reference/routes.ts +4 -0
  165. package/src/render-engine/embedded-templates.generated.ts +1 -1
  166. package/src/requirement-walk.ts +124 -0
  167. package/src/runner.ts +266 -27
  168. package/src/templates/drizzle-schema.ts +70 -6
  169. package/src/templates/extractor.ts +19 -24
  170. package/src/templates/filter-allowlist.ts +4 -2
  171. package/src/templates/filter-type.ts +6 -2
  172. package/src/templates/find-inbound.ts +96 -0
  173. package/src/templates/output-format-spec-emitter.ts +7 -4
  174. package/src/templates/output-parser.ts +76 -34
  175. package/src/templates/output-prompt.ts +29 -42
  176. package/src/templates/queries.ts +1 -1
  177. package/src/templates/requirement-test.ts +140 -0
  178. package/src/templates/zod-validators.ts +32 -15
  179. package/templates/docs/entity-page.md.mustache +8 -0
@@ -22,7 +22,8 @@ import {
22
22
  IDENTITY_ATTR_FIELDS, IDENTITY_ATTR_GENERATION,
23
23
  FIELD_ATTR_STRING_FORMAT, FIELD_ATTR_LENIENT, STRING_FORMAT_EMAIL, STRING_FORMAT_HOSTNAME,
24
24
  FIELD_ATTR_REQUIRED, FIELD_ATTR_MAX_LENGTH, FIELD_ATTR_DEFAULT,
25
- FIELD_ATTR_AUTO_SET, FIELD_ATTR_OBJECT_REF, FIELD_ATTR_VALUE_TYPE, FIELD_ATTR_READ_ONLY,
25
+ FIELD_ATTR_AUTO_SET, FIELD_ATTR_OBJECT_REF, FIELD_ATTR_VALUE_TYPE,
26
+ isReadOnlyMutability, isWriteOnceMutability,
26
27
  FIELD_ATTR_DB_COLUMN_TYPE, DB_COLUMN_TYPE_JSONB,
27
28
  AUTO_SET_ON_CREATE, AUTO_SET_ON_UPDATE,
28
29
  VALIDATOR_ATTR_MAX, VALIDATOR_ATTR_MIN, VALIDATOR_ATTR_PATTERN,
@@ -215,12 +216,13 @@ export function renderInsertSchemaOnly(obj: MetaObject, ctx?: RenderContext): Co
215
216
  const insertFieldLines: Code[] = [];
216
217
  for (const child of obj.fields()) {
217
218
  if (autoGenPkFields.has(child.name)) continue;
218
- // FR-013: @readOnly fields are populated by DB / replication / external
219
- // owner; the application has no path to write them. Exclude from the
220
- // create-shape schema entirely.
219
+ // FR-037 R1: an @mutability:"readOnly" field is populated by DB / replication /
220
+ // external owner; the application has no path to write it. Exclude from the
221
+ // create-shape schema entirely. ("writeOnce" is NOT excluded here — that is
222
+ // the whole point of the mode: settable on create, frozen after.)
221
223
  // #213 — a derived (origin-bearing) field is read-only (FR-024 §7 / ADR-0028):
222
- // excluded from the Insert/Update/preserving schemas, exactly like @readOnly.
223
- if (child.attr(FIELD_ATTR_READ_ONLY) === true || child.isDerived()) continue;
224
+ // excluded from the Insert/Update/preserving schemas, exactly like readOnly.
225
+ if (isReadOnlyMutability(child) || child.isDerived()) continue;
224
226
 
225
227
  // FR-017 Tier 1: TPH subtype pins its discriminator field to z.literal(...).
226
228
  if (tphPin !== undefined && child.name === tphPin.fieldName) {
@@ -300,8 +302,9 @@ export function insertSchemaFields(obj: MetaObject): SchemaFieldShape[] {
300
302
  for (const child of obj.fields()) {
301
303
  if (autoGenPkFields.has(child.name)) continue;
302
304
  // #213 — a derived (origin-bearing) field is read-only (FR-024 §7 / ADR-0028):
303
- // excluded from the Insert/Update/preserving schemas, exactly like @readOnly.
304
- if (child.attr(FIELD_ATTR_READ_ONLY) === true || child.isDerived()) continue;
305
+ // excluded from the Insert/Update/preserving schemas, exactly like readOnly.
306
+ // "writeOnce" stays IN the create shape — it is settable exactly once.
307
+ if (isReadOnlyMutability(child) || child.isDerived()) continue;
305
308
  if (tphPin !== undefined && child.name === tphPin.fieldName) {
306
309
  out.push({ name: child.name, optional: false, pinnedLiteral: tphPin.value });
307
310
  continue;
@@ -335,8 +338,16 @@ export function updateSchemaFields(obj: MetaObject): SchemaFieldShape[] {
335
338
  for (const child of obj.fields()) {
336
339
  if (autoGenPkFields.has(child.name)) continue;
337
340
  // #213 — a derived (origin-bearing) field is read-only (FR-024 §7 / ADR-0028):
338
- // excluded from the Insert/Update/preserving schemas, exactly like @readOnly.
339
- if (child.attr(FIELD_ATTR_READ_ONLY) === true || child.isDerived()) continue;
341
+ // excluded from the Insert/Update/preserving schemas, exactly like readOnly.
342
+ if (isReadOnlyMutability(child) || child.isDerived()) continue;
343
+ // FR-037 R1 — "writeOnce" leaves the UPDATE shape, and only the update shape.
344
+ // Omitted, not rejected: a key absent from the settable set is STRIPPED on this
345
+ // path today (D1), and the generated edit form submits EVERY registered field
346
+ // (0.19.2 switched the resolver to UpdateSchema on edit and does not
347
+ // diff-and-omit), so 400-on-present would fail every save on every generated
348
+ // edit form for an entity carrying one. Clearing counts as a write, so the
349
+ // FR-035 present-null arm never reaches it either.
350
+ if (isWriteOnceMutability(child)) continue;
340
351
  // TPH subtype discriminator: omitted from the update schema entirely.
341
352
  if (tphPin !== undefined && child.name === tphPin.fieldName) continue;
342
353
  const autoSet = child.attr(FIELD_ATTR_AUTO_SET);
@@ -370,13 +381,13 @@ export function renderZodValidators(obj: MetaObject, ctx?: RenderContext): Code
370
381
  const emitPreserving = hasAutoSetFields(obj);
371
382
  for (const child of obj.fields()) {
372
383
  if (autoGenPkFields.has(child.name)) continue;
373
- // FR-013: @readOnly fields appear in neither InsertSchema nor UpdateSchema.
374
- // The DB / trigger / replication owns the write path; the app must not
375
- // pass these values in POST/PATCH bodies (routesFile enforces the same
384
+ // FR-037 R1: an @mutability:"readOnly" field appears in neither InsertSchema
385
+ // nor UpdateSchema. The DB / trigger / replication owns the write path; the app
386
+ // must not pass these values in POST/PATCH bodies (routesFile enforces the same
376
387
  // contract at the boundary with a 400 response).
377
388
  // #213 — a derived (origin-bearing) field is read-only (FR-024 §7 / ADR-0028):
378
- // excluded from the Insert/Update/preserving schemas, exactly like @readOnly.
379
- if (child.attr(FIELD_ATTR_READ_ONLY) === true || child.isDerived()) continue;
389
+ // excluded from the Insert/Update/preserving schemas, exactly like readOnly.
390
+ if (isReadOnlyMutability(child) || child.isDerived()) continue;
380
391
 
381
392
  // FR-017 Tier 1: TPH subtype pins its discriminator field to z.literal(...).
382
393
  // The discriminator is implicit on subtype rows (controlled by URL / insert
@@ -413,6 +424,12 @@ export function renderZodValidators(obj: MetaObject, ctx?: RenderContext): Code
413
424
  preservingFieldLines.push(fieldLine);
414
425
  }
415
426
 
427
+ // FR-037 R1 — "writeOnce": present in Insert + preserving (both are CREATE
428
+ // shapes), absent from Update. Same mechanism that drops @autoSet onCreate
429
+ // below; a value presented on PATCH is stripped, not 400'd (see
430
+ // updateSchemaFields for the grounding).
431
+ if (isWriteOnceMutability(child)) continue;
432
+
416
433
  // Update schema: @autoSet onCreate → omit entirely; onUpdate → transform
417
434
  if (autoSet === AUTO_SET_ON_CREATE) {
418
435
  // Omit: creation timestamps cannot be changed after creation
@@ -64,3 +64,11 @@
64
64
  - {{{bullet}}}
65
65
  {{/usedBy}}
66
66
  {{/hasUsedBy}}
67
+ {{#hasClaimedBy}}
68
+
69
+ ## Required by
70
+
71
+ {{#claimedBy}}
72
+ - {{{bullet}}}
73
+ {{/claimedBy}}
74
+ {{/hasClaimedBy}}