@metaobjectsdev/metadata 0.8.1 → 0.9.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 (220) hide show
  1. package/dist/attr-schema-validate.d.ts.map +1 -1
  2. package/dist/attr-schema-validate.js +49 -1
  3. package/dist/attr-schema-validate.js.map +1 -1
  4. package/dist/core/field/field-constants.d.ts +27 -2
  5. package/dist/core/field/field-constants.d.ts.map +1 -1
  6. package/dist/core/field/field-constants.js +30 -2
  7. package/dist/core/field/field-constants.js.map +1 -1
  8. package/dist/core/field/field-schema.d.ts +9 -1
  9. package/dist/core/field/field-schema.d.ts.map +1 -1
  10. package/dist/core/field/field-schema.js +34 -3
  11. package/dist/core/field/field-schema.js.map +1 -1
  12. package/dist/core/field/meta-field.d.ts +10 -0
  13. package/dist/core/field/meta-field.d.ts.map +1 -1
  14. package/dist/core/field/meta-field.js +36 -1
  15. package/dist/core/field/meta-field.js.map +1 -1
  16. package/dist/core/field/validate-field-readonly.d.ts +9 -0
  17. package/dist/core/field/validate-field-readonly.d.ts.map +1 -0
  18. package/dist/core/field/validate-field-readonly.js +116 -0
  19. package/dist/core/field/validate-field-readonly.js.map +1 -0
  20. package/dist/core/object/meta-object-aware.d.ts +11 -0
  21. package/dist/core/object/meta-object-aware.d.ts.map +1 -0
  22. package/dist/core/object/meta-object-aware.js +15 -0
  23. package/dist/core/object/meta-object-aware.js.map +1 -0
  24. package/dist/core/object/meta-object.d.ts +21 -0
  25. package/dist/core/object/meta-object.d.ts.map +1 -1
  26. package/dist/core/object/meta-object.js +43 -2
  27. package/dist/core/object/meta-object.js.map +1 -1
  28. package/dist/core/object/object-class-registry.d.ts +22 -0
  29. package/dist/core/object/object-class-registry.d.ts.map +1 -0
  30. package/dist/core/object/object-class-registry.js +38 -0
  31. package/dist/core/object/object-class-registry.js.map +1 -0
  32. package/dist/core/object/object-constants.d.ts +7 -0
  33. package/dist/core/object/object-constants.d.ts.map +1 -1
  34. package/dist/core/object/object-constants.js +14 -0
  35. package/dist/core/object/object-constants.js.map +1 -1
  36. package/dist/core/object/object-schema.d.ts.map +1 -1
  37. package/dist/core/object/object-schema.js +24 -1
  38. package/dist/core/object/object-schema.js.map +1 -1
  39. package/dist/core/object/validate-discriminator.d.ts +4 -0
  40. package/dist/core/object/validate-discriminator.d.ts.map +1 -0
  41. package/dist/core/object/validate-discriminator.js +145 -0
  42. package/dist/core/object/validate-discriminator.js.map +1 -0
  43. package/dist/core/object/value-object.d.ts +23 -0
  44. package/dist/core/object/value-object.d.ts.map +1 -0
  45. package/dist/core/object/value-object.js +51 -0
  46. package/dist/core/object/value-object.js.map +1 -0
  47. package/dist/core/query/query-constants.d.ts.map +1 -1
  48. package/dist/core/query/query-constants.js +4 -0
  49. package/dist/core/query/query-constants.js.map +1 -1
  50. package/dist/core-types.d.ts.map +1 -1
  51. package/dist/core-types.js +16 -4
  52. package/dist/core-types.js.map +1 -1
  53. package/dist/errors.d.ts +2 -2
  54. package/dist/errors.d.ts.map +1 -1
  55. package/dist/errors.js +23 -0
  56. package/dist/errors.js.map +1 -1
  57. package/dist/index.d.ts +5 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +4 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/loader/meta-data-loader.d.ts.map +1 -1
  62. package/dist/loader/meta-data-loader.js +26 -1
  63. package/dist/loader/meta-data-loader.js.map +1 -1
  64. package/dist/loader/validation-passes.d.ts +1 -0
  65. package/dist/loader/validation-passes.d.ts.map +1 -1
  66. package/dist/loader/validation-passes.js +122 -2
  67. package/dist/loader/validation-passes.js.map +1 -1
  68. package/dist/naming.d.ts.map +1 -1
  69. package/dist/naming.js +7 -6
  70. package/dist/naming.js.map +1 -1
  71. package/dist/persistence/db/db-constants.d.ts +23 -0
  72. package/dist/persistence/db/db-constants.d.ts.map +1 -1
  73. package/dist/persistence/db/db-constants.js +31 -0
  74. package/dist/persistence/db/db-constants.js.map +1 -1
  75. package/dist/persistence/db/db-provider.js +3 -3
  76. package/dist/persistence/db/db-provider.js.map +1 -1
  77. package/dist/persistence/db/db-schema.d.ts +8 -0
  78. package/dist/persistence/db/db-schema.d.ts.map +1 -1
  79. package/dist/persistence/db/db-schema.js +17 -1
  80. package/dist/persistence/db/db-schema.js.map +1 -1
  81. package/dist/persistence/source/meta-source.d.ts +15 -1
  82. package/dist/persistence/source/meta-source.d.ts.map +1 -1
  83. package/dist/persistence/source/meta-source.js +55 -3
  84. package/dist/persistence/source/meta-source.js.map +1 -1
  85. package/dist/persistence/source/source-constants.d.ts +20 -1
  86. package/dist/persistence/source/source-constants.d.ts.map +1 -1
  87. package/dist/persistence/source/source-constants.js +36 -1
  88. package/dist/persistence/source/source-constants.js.map +1 -1
  89. package/dist/persistence/source/source-schema.d.ts.map +1 -1
  90. package/dist/persistence/source/source-schema.js +65 -4
  91. package/dist/persistence/source/source-schema.js.map +1 -1
  92. package/dist/persistence/source/validate-source-parameter-ref.d.ts +4 -0
  93. package/dist/persistence/source/validate-source-parameter-ref.d.ts.map +1 -0
  94. package/dist/persistence/source/validate-source-parameter-ref.js +96 -0
  95. package/dist/persistence/source/validate-source-parameter-ref.js.map +1 -0
  96. package/dist/persistence/source/validate-source-physical-names.d.ts +9 -0
  97. package/dist/persistence/source/validate-source-physical-names.d.ts.map +1 -0
  98. package/dist/persistence/source/validate-source-physical-names.js +79 -0
  99. package/dist/persistence/source/validate-source-physical-names.js.map +1 -0
  100. package/dist/serializer-json.d.ts.map +1 -1
  101. package/dist/serializer-json.js +43 -0
  102. package/dist/serializer-json.js.map +1 -1
  103. package/dist/template/template-constants.d.ts +9 -0
  104. package/dist/template/template-constants.d.ts.map +1 -1
  105. package/dist/template/template-constants.js +20 -0
  106. package/dist/template/template-constants.js.map +1 -1
  107. package/dist/template/template-schema.d.ts.map +1 -1
  108. package/dist/template/template-schema.js +42 -3
  109. package/dist/template/template-schema.js.map +1 -1
  110. package/package.json +1 -1
  111. package/src/attr-schema-validate.ts +70 -0
  112. package/src/core/field/field-constants.ts +37 -2
  113. package/src/core/field/field-schema.ts +43 -2
  114. package/src/core/field/meta-field.ts +39 -0
  115. package/src/core/field/validate-field-readonly.ts +142 -0
  116. package/src/core/object/meta-object-aware.ts +27 -0
  117. package/src/core/object/meta-object.ts +47 -2
  118. package/src/core/object/object-class-registry.ts +48 -0
  119. package/src/core/object/object-constants.ts +17 -0
  120. package/src/core/object/object-schema.ts +29 -1
  121. package/src/core/object/validate-discriminator.ts +195 -0
  122. package/src/core/object/value-object.ts +65 -0
  123. package/src/core/query/query-constants.ts +5 -0
  124. package/src/core-types.ts +17 -4
  125. package/src/errors.ts +23 -0
  126. package/src/index.ts +10 -0
  127. package/src/loader/meta-data-loader.ts +31 -1
  128. package/src/loader/validation-passes.ts +161 -0
  129. package/src/naming.ts +6 -5
  130. package/src/persistence/db/db-constants.ts +40 -0
  131. package/src/persistence/db/db-provider.ts +3 -3
  132. package/src/persistence/db/db-schema.ts +20 -0
  133. package/src/persistence/source/meta-source.ts +64 -2
  134. package/src/persistence/source/source-constants.ts +40 -1
  135. package/src/persistence/source/source-schema.ts +78 -3
  136. package/src/persistence/source/validate-source-parameter-ref.ts +143 -0
  137. package/src/persistence/source/validate-source-physical-names.ts +123 -0
  138. package/src/serializer-json.ts +50 -0
  139. package/src/template/template-constants.ts +23 -0
  140. package/src/template/template-schema.ts +49 -2
  141. package/dist/constants.d.ts +0 -208
  142. package/dist/constants.d.ts.map +0 -1
  143. package/dist/constants.js +0 -419
  144. package/dist/constants.js.map +0 -1
  145. package/dist/core/file-meta-data-loader.d.ts +0 -18
  146. package/dist/core/file-meta-data-loader.d.ts.map +0 -1
  147. package/dist/core/file-meta-data-loader.js +0 -81
  148. package/dist/core/file-meta-data-loader.js.map +0 -1
  149. package/dist/core/file-source.d.ts +0 -12
  150. package/dist/core/file-source.d.ts.map +0 -1
  151. package/dist/core/file-source.js +0 -46
  152. package/dist/core/file-source.js.map +0 -1
  153. package/dist/core-attr-schemas.d.ts +0 -22
  154. package/dist/core-attr-schemas.d.ts.map +0 -1
  155. package/dist/core-attr-schemas.js +0 -324
  156. package/dist/core-attr-schemas.js.map +0 -1
  157. package/dist/db/db-attr-schemas.d.ts +0 -8
  158. package/dist/db/db-attr-schemas.d.ts.map +0 -1
  159. package/dist/db/db-attr-schemas.js +0 -26
  160. package/dist/db/db-attr-schemas.js.map +0 -1
  161. package/dist/db/db-provider.d.ts +0 -3
  162. package/dist/db/db-provider.d.ts.map +0 -1
  163. package/dist/db/db-provider.js +0 -28
  164. package/dist/db/db-provider.js.map +0 -1
  165. package/dist/meta/find-reference.d.ts +0 -22
  166. package/dist/meta/find-reference.d.ts.map +0 -1
  167. package/dist/meta/find-reference.js +0 -29
  168. package/dist/meta/find-reference.js.map +0 -1
  169. package/dist/meta/meta-attr.d.ts +0 -8
  170. package/dist/meta/meta-attr.d.ts.map +0 -1
  171. package/dist/meta/meta-attr.js +0 -17
  172. package/dist/meta/meta-attr.js.map +0 -1
  173. package/dist/meta/meta-data.d.ts +0 -107
  174. package/dist/meta/meta-data.d.ts.map +0 -1
  175. package/dist/meta/meta-data.js +0 -302
  176. package/dist/meta/meta-data.js.map +0 -1
  177. package/dist/meta/meta-field.d.ts +0 -48
  178. package/dist/meta/meta-field.d.ts.map +0 -1
  179. package/dist/meta/meta-field.js +0 -94
  180. package/dist/meta/meta-field.js.map +0 -1
  181. package/dist/meta/meta-identity.d.ts +0 -71
  182. package/dist/meta/meta-identity.d.ts.map +0 -1
  183. package/dist/meta/meta-identity.js +0 -129
  184. package/dist/meta/meta-identity.js.map +0 -1
  185. package/dist/meta/meta-layout.d.ts +0 -23
  186. package/dist/meta/meta-layout.d.ts.map +0 -1
  187. package/dist/meta/meta-layout.js +0 -45
  188. package/dist/meta/meta-layout.js.map +0 -1
  189. package/dist/meta/meta-object.d.ts +0 -40
  190. package/dist/meta/meta-object.d.ts.map +0 -1
  191. package/dist/meta/meta-object.js +0 -81
  192. package/dist/meta/meta-object.js.map +0 -1
  193. package/dist/meta/meta-origin.d.ts +0 -32
  194. package/dist/meta/meta-origin.d.ts.map +0 -1
  195. package/dist/meta/meta-origin.js +0 -55
  196. package/dist/meta/meta-origin.js.map +0 -1
  197. package/dist/meta/meta-relationship.d.ts +0 -11
  198. package/dist/meta/meta-relationship.d.ts.map +0 -1
  199. package/dist/meta/meta-relationship.js +0 -27
  200. package/dist/meta/meta-relationship.js.map +0 -1
  201. package/dist/meta/meta-root.d.ts +0 -12
  202. package/dist/meta/meta-root.d.ts.map +0 -1
  203. package/dist/meta/meta-root.js +0 -24
  204. package/dist/meta/meta-root.js.map +0 -1
  205. package/dist/meta/meta-source.d.ts +0 -18
  206. package/dist/meta/meta-source.d.ts.map +0 -1
  207. package/dist/meta/meta-source.js +0 -31
  208. package/dist/meta/meta-source.js.map +0 -1
  209. package/dist/meta/meta-validator.d.ts +0 -29
  210. package/dist/meta/meta-validator.d.ts.map +0 -1
  211. package/dist/meta/meta-validator.js +0 -49
  212. package/dist/meta/meta-validator.js.map +0 -1
  213. package/dist/meta/meta-view.d.ts +0 -4
  214. package/dist/meta/meta-view.d.ts.map +0 -1
  215. package/dist/meta/meta-view.js +0 -8
  216. package/dist/meta/meta-view.js.map +0 -1
  217. package/dist/persistence/db/db-attr-schemas.d.ts +0 -8
  218. package/dist/persistence/db/db-attr-schemas.d.ts.map +0 -1
  219. package/dist/persistence/db/db-attr-schemas.js +0 -28
  220. package/dist/persistence/db/db-attr-schemas.js.map +0 -1
@@ -0,0 +1,96 @@
1
+ // Validation pass: source.rdb @parameterRef typed-input rules (FR-015).
2
+ //
3
+ // Codes:
4
+ // ERR_PARAMETER_REF_UNRESOLVED — @parameterRef names a non-existent object.
5
+ // ERR_PARAMETER_REF_NOT_VALUE_OBJECT — @parameterRef points at an object.entity
6
+ // instead of object.value.
7
+ // ERR_PARAMETER_REF_ON_NON_CALLABLE_KIND
8
+ // — @parameterRef set with @kind: "table" /
9
+ // "view" / "materializedView". Only the
10
+ // callable kinds (storedProc, tableFunction)
11
+ // accept parameters.
12
+ // ERR_PARAMETER_REF_PASSTHROUGH_TYPE_MISMATCH
13
+ // — a parameter field uses origin.passthrough
14
+ // @from: "Entity.field" but the parameter's
15
+ // subtype does not match the referenced
16
+ // field's subtype.
17
+ import { ParseError } from "../../errors.js";
18
+ import { TYPE_OBJECT, TYPE_SOURCE, TYPE_FIELD, TYPE_ORIGIN, } from "../../shared/base-types.js";
19
+ import { OBJECT_SUBTYPE_VALUE, OBJECT_SUBTYPE_ENTITY, } from "../../core/object/object-constants.js";
20
+ import { PACKAGE_SEPARATOR } from "../../shared/structural.js";
21
+ import { MetaSource } from "./meta-source.js";
22
+ import { SOURCE_ATTR_PARAMETER_REF, SOURCE_SUBTYPE_RDB, SOURCE_KIND_STORED_PROC, SOURCE_KIND_TABLE_FUNCTION, } from "./source-constants.js";
23
+ import { ORIGIN_SUBTYPE_PASSTHROUGH, ORIGIN_PASSTHROUGH_ATTR_FROM, } from "../../persistence/origin/origin-constants.js";
24
+ const CALLABLE_KINDS = new Set([
25
+ SOURCE_KIND_STORED_PROC,
26
+ SOURCE_KIND_TABLE_FUNCTION,
27
+ ]);
28
+ export function validateSourceParameterRef(root) {
29
+ const errors = [];
30
+ // Pre-index every object by name AND fqn so resolution costs O(1) per source.
31
+ const objectIndex = new Map();
32
+ for (const obj of root.ownChildren().filter((c) => c.type === TYPE_OBJECT)) {
33
+ objectIndex.set(obj.name, obj);
34
+ const fqn = obj.package !== undefined && obj.package !== ""
35
+ ? `${obj.package}${PACKAGE_SEPARATOR}${obj.name}`
36
+ : obj.name;
37
+ objectIndex.set(fqn, obj);
38
+ }
39
+ for (const obj of root.ownChildren().filter((c) => c.type === TYPE_OBJECT)) {
40
+ for (const source of obj.ownChildren().filter((c) => c.type === TYPE_SOURCE && c.subType === SOURCE_SUBTYPE_RDB && c instanceof MetaSource)) {
41
+ const ref = source.ownAttr(SOURCE_ATTR_PARAMETER_REF);
42
+ if (typeof ref !== "string" || ref === "")
43
+ continue;
44
+ // ERR_PARAMETER_REF_ON_NON_CALLABLE_KIND — checked even before resolution
45
+ // so authoring mistakes on the wrong kind surface immediately.
46
+ if (!CALLABLE_KINDS.has(source.effectiveKind)) {
47
+ errors.push(new ParseError(`source.rdb on object "${obj.name}" has @parameterRef but @kind is "${source.effectiveKind}"; ` +
48
+ `only "storedProc" or "tableFunction" accept parameters`, { code: "ERR_PARAMETER_REF_ON_NON_CALLABLE_KIND", source: source.source }));
49
+ continue;
50
+ }
51
+ const target = objectIndex.get(ref);
52
+ if (target === undefined) {
53
+ errors.push(new ParseError(`source.rdb on object "${obj.name}" @parameterRef = "${ref}" does not resolve to any known object`, { code: "ERR_PARAMETER_REF_UNRESOLVED", source: source.source }));
54
+ continue;
55
+ }
56
+ if (target.subType !== OBJECT_SUBTYPE_VALUE) {
57
+ const reason = target.subType === OBJECT_SUBTYPE_ENTITY
58
+ ? "an object.entity (entities have identity; parameter shapes are value-objects)"
59
+ : `an object.${target.subType}`;
60
+ errors.push(new ParseError(`source.rdb on object "${obj.name}" @parameterRef = "${ref}" resolves to ${reason}; ` +
61
+ `use an object.value`, { code: "ERR_PARAMETER_REF_NOT_VALUE_OBJECT", source: source.source }));
62
+ continue;
63
+ }
64
+ // ERR_PARAMETER_REF_PASSTHROUGH_TYPE_MISMATCH — every parameter field
65
+ // with origin.passthrough must have a subtype matching the referenced
66
+ // field. The origin path validation pass checks the from-path resolves;
67
+ // here we just check the subtype alignment.
68
+ for (const paramField of target.ownChildren().filter((c) => c.type === TYPE_FIELD)) {
69
+ const passthrough = paramField.ownChildren().find((c) => c.type === TYPE_ORIGIN && c.subType === ORIGIN_SUBTYPE_PASSTHROUGH);
70
+ if (passthrough === undefined)
71
+ continue;
72
+ const from = passthrough.ownAttr(ORIGIN_PASSTHROUGH_ATTR_FROM);
73
+ if (typeof from !== "string" || from === "")
74
+ continue;
75
+ const dot = from.indexOf(".");
76
+ if (dot < 0)
77
+ continue;
78
+ const targetEntityName = from.slice(0, dot);
79
+ const targetFieldName = from.slice(dot + 1);
80
+ const targetEntity = objectIndex.get(targetEntityName);
81
+ if (targetEntity === undefined)
82
+ continue; // origin-paths pass surfaces this
83
+ const targetField = targetEntity.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === targetFieldName);
84
+ if (targetField === undefined)
85
+ continue;
86
+ if (paramField.subType !== targetField.subType) {
87
+ errors.push(new ParseError(`parameter field "${paramField.name}" (field.${paramField.subType}) on @parameterRef ` +
88
+ `"${ref}" uses origin.passthrough @from: "${from}", but ` +
89
+ `${targetEntity.name}.${targetFieldName} is field.${targetField.subType}; types must match`, { code: "ERR_PARAMETER_REF_PASSTHROUGH_TYPE_MISMATCH", source: paramField.source }));
90
+ }
91
+ }
92
+ }
93
+ }
94
+ return errors;
95
+ }
96
+ //# sourceMappingURL=validate-source-parameter-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-source-parameter-ref.js","sourceRoot":"","sources":["../../../src/persistence/source/validate-source-parameter-ref.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { MetaData } from "../../shared/meta-data.js";
2
+ import { ParseError } from "../../errors.js";
3
+ import type { LoaderWarning } from "../../source.js";
4
+ export interface PhysicalNameValidationResult {
5
+ errors: ParseError[];
6
+ warnings: LoaderWarning[];
7
+ }
8
+ export declare function validateSourcePhysicalNames(root: MetaData): PhysicalNameValidationResult;
9
+ //# sourceMappingURL=validate-source-physical-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-source-physical-names.d.ts","sourceRoot":"","sources":["../../../src/persistence/source/validate-source-physical-names.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAqBrD,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,QAAQ,GAAG,4BAA4B,CA2ExF"}
@@ -0,0 +1,79 @@
1
+ // Validation pass: per-kind physical-name aliases on source.rdb (FR-016 / ADR-0018).
2
+ //
3
+ // Each source.rdb may declare at most one of @table / @view / @materializedView /
4
+ // @proc / @function. The chosen alias must match the source's @kind, with one
5
+ // pre-1.0 legacy exception: @table is also accepted for non-table kinds (e.g.
6
+ // @kind: "storedProc" + @table: "fn_x"), which emits a WARN_LEGACY_PHYSICAL_NAME_ALIAS.
7
+ //
8
+ // Codes:
9
+ // ERR_PHYSICAL_NAME_MULTIPLE — two or more kind-aware aliases on one source.
10
+ // ERR_PHYSICAL_NAME_KIND_MISMATCH — alias other than @table set with a non-matching @kind.
11
+ // WARN_LEGACY_PHYSICAL_NAME_ALIAS — @table set with a non-table @kind (legacy spelling).
12
+ import { ParseError } from "../../errors.js";
13
+ import { TYPE_OBJECT, TYPE_SOURCE } from "../../shared/base-types.js";
14
+ import { MetaSource } from "./meta-source.js";
15
+ import { SOURCE_ATTR_TABLE, SOURCE_ATTR_VIEW, SOURCE_ATTR_MATERIALIZED_VIEW, SOURCE_ATTR_PROC, SOURCE_ATTR_FUNCTION, SOURCE_SUBTYPE_RDB, PHYSICAL_NAME_ATTR_BY_KIND, } from "./source-constants.js";
16
+ const ALL_PHYSICAL_NAME_ALIASES = [
17
+ SOURCE_ATTR_TABLE,
18
+ SOURCE_ATTR_VIEW,
19
+ SOURCE_ATTR_MATERIALIZED_VIEW,
20
+ SOURCE_ATTR_PROC,
21
+ SOURCE_ATTR_FUNCTION,
22
+ ];
23
+ export function validateSourcePhysicalNames(root) {
24
+ const errors = [];
25
+ const warnings = [];
26
+ for (const obj of root.ownChildren().filter((c) => c.type === TYPE_OBJECT)) {
27
+ const sources = obj
28
+ .ownChildren()
29
+ .filter((c) => c.type === TYPE_SOURCE && c.subType === SOURCE_SUBTYPE_RDB && c instanceof MetaSource);
30
+ for (const source of sources) {
31
+ // Empty-string check first — explicit "" is meaningless and an
32
+ // authoring error regardless of which alias was used.
33
+ for (const attr of ALL_PHYSICAL_NAME_ALIASES) {
34
+ const v = source.ownAttr(attr);
35
+ if (typeof v === "string" && v === "") {
36
+ errors.push(new ParseError(`source.rdb on object "${obj.name}" sets @${attr} to an empty string; physical name attrs require a non-empty value`, { code: "ERR_BAD_ATTR_VALUE", source: source.source }));
37
+ }
38
+ }
39
+ const setAliases = ALL_PHYSICAL_NAME_ALIASES.filter((attr) => {
40
+ const v = source.ownAttr(attr);
41
+ return typeof v === "string" && v !== "";
42
+ });
43
+ if (setAliases.length > 1) {
44
+ errors.push(new ParseError(`source.rdb on object "${obj.name}" declares multiple physical-name aliases (${setAliases
45
+ .map((a) => `@${a}`)
46
+ .join(", ")}); set exactly one`, { code: "ERR_PHYSICAL_NAME_MULTIPLE", source: source.source }));
47
+ continue;
48
+ }
49
+ if (setAliases.length === 0)
50
+ continue;
51
+ const chosenAlias = setAliases[0];
52
+ const expectedAlias = PHYSICAL_NAME_ATTR_BY_KIND.get(source.effectiveKind);
53
+ if (chosenAlias === expectedAlias)
54
+ continue;
55
+ // Legacy: @table is permitted for non-table kinds with a warning.
56
+ if (chosenAlias === SOURCE_ATTR_TABLE) {
57
+ warnings.push({
58
+ code: "WARN_LEGACY_PHYSICAL_NAME_ALIAS",
59
+ message: `source.rdb on object "${obj.name}" uses @table with @kind: "${source.effectiveKind}"; ` +
60
+ `prefer the kind-matching alias @${expectedAlias} (ADR-0018)`,
61
+ source: source.source,
62
+ });
63
+ continue;
64
+ }
65
+ // Any other mismatch is a hard error.
66
+ errors.push(new ParseError(`source.rdb on object "${obj.name}" uses @${chosenAlias} with @kind: "${source.effectiveKind}"; ` +
67
+ `@${chosenAlias} is only valid for @kind: "${kindForAlias(chosenAlias)}"`, { code: "ERR_PHYSICAL_NAME_KIND_MISMATCH", source: source.source }));
68
+ }
69
+ }
70
+ return { errors, warnings };
71
+ }
72
+ function kindForAlias(alias) {
73
+ for (const [kind, attr] of PHYSICAL_NAME_ATTR_BY_KIND.entries()) {
74
+ if (attr === alias)
75
+ return kind;
76
+ }
77
+ return "(unknown)";
78
+ }
79
+ //# sourceMappingURL=validate-source-physical-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-source-physical-names.js","sourceRoot":"","sources":["../../../src/persistence/source/validate-source-physical-names.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,EAAE;AACF,kFAAkF;AAClF,8EAA8E;AAC9E,8EAA8E;AAC9E,wFAAwF;AACxF,EAAE;AACF,SAAS;AACT,oFAAoF;AACpF,6FAA6F;AAC7F,2FAA2F;AAG3F,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,6BAA6B,EAC7B,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,MAAM,yBAAyB,GAAG;IAChC,iBAAiB;IACjB,gBAAgB;IAChB,6BAA6B;IAC7B,gBAAgB;IAChB,oBAAoB;CACZ,CAAC;AAOX,MAAM,UAAU,2BAA2B,CAAC,IAAc;IACxD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;QAC3E,MAAM,OAAO,GAAG,GAAG;aAChB,WAAW,EAAE;aACb,MAAM,CACL,CAAC,CAAC,EAAmB,EAAE,CACrB,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,KAAK,kBAAkB,IAAI,CAAC,YAAY,UAAU,CACxF,CAAC;QAEJ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,+DAA+D;YAC/D,sDAAsD;YACtD,KAAK,MAAM,IAAI,IAAI,yBAAyB,EAAE,CAAC;gBAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oBACtC,MAAM,CAAC,IAAI,CACT,IAAI,UAAU,CACZ,yBAAyB,GAAG,CAAC,IAAI,WAAW,IAAI,oEAAoE,EACpH,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CACtD,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,UAAU,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC3D,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CACT,IAAI,UAAU,CACZ,yBAAyB,GAAG,CAAC,IAAI,8CAA8C,UAAU;qBACtF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;qBACnB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EACjC,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAC9D,CACF,CAAC;gBACF,SAAS;YACX,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEtC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;YACnC,MAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAE3E,IAAI,WAAW,KAAK,aAAa;gBAAE,SAAS;YAE5C,kEAAkE;YAClE,IAAI,WAAW,KAAK,iBAAiB,EAAE,CAAC;gBACtC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,iCAAiC;oBACvC,OAAO,EACL,yBAAyB,GAAG,CAAC,IAAI,8BAA8B,MAAM,CAAC,aAAa,KAAK;wBACxF,mCAAmC,aAAa,aAAa;oBAC/D,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,sCAAsC;YACtC,MAAM,CAAC,IAAI,CACT,IAAI,UAAU,CACZ,yBAAyB,GAAG,CAAC,IAAI,WAAW,WAAW,iBAAiB,MAAM,CAAC,aAAa,KAAK;gBAC/F,IAAI,WAAW,8BAA8B,YAAY,CAAC,WAAW,CAAC,GAAG,EAC3E,EAAE,IAAI,EAAE,iCAAiC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CACnE,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,0BAA0B,CAAC,OAAO,EAAE,EAAE,CAAC;QAChE,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;IAClC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"serializer-json.d.ts","sourceRoot":"","sources":["../src/serializer-json.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAwBjE,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAK9E;AAUD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAUzD;AAyFD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAQ1D;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CASnE"}
1
+ {"version":3,"file":"serializer-json.d.ts","sourceRoot":"","sources":["../src/serializer-json.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAkCjE,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAK9E;AAUD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAUzD;AAyFD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAY1D;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAUnE"}
@@ -7,6 +7,9 @@
7
7
  // 5. overlay 6. isArray 7. @-attrs (alphabetical) 8. children
8
8
  import { ATTR_PREFIX, TYPE_SUBTYPE_SEPARATOR, RESERVED_KEY_NAME, RESERVED_KEY_PACKAGE, RESERVED_KEY_EXTENDS, RESERVED_KEY_ABSTRACT, RESERVED_KEY_IS_ARRAY, RESERVED_KEY_CHILDREN, } from "./shared/structural.js";
9
9
  import { ATTR_SUBTYPE_STRING, ATTR_SUBTYPE_INT, ATTR_SUBTYPE_LONG, ATTR_SUBTYPE_DOUBLE, ATTR_SUBTYPE_BOOLEAN, ATTR_SUBTYPE_STRINGARRAY, } from "./core/attr/attr-constants.js";
10
+ import { SOURCE_SUBTYPE_RDB, SOURCE_ATTR_KIND, SOURCE_ATTR_TABLE, DEFAULT_SOURCE_KIND, PHYSICAL_NAME_ATTR_BY_KIND, } from "./persistence/source/source-constants.js";
11
+ import { TYPE_SOURCE } from "./shared/base-types.js";
12
+ const SOURCE_RDB_FUSED_KEY = `${TYPE_SOURCE}${TYPE_SUBTYPE_SEPARATOR}${SOURCE_SUBTYPE_RDB}`;
10
13
  export function serializeJson(model, opts) {
11
14
  const indent = opts?.indent ?? 2;
12
15
  const nodeObj = serializeNode(model, false);
@@ -100,6 +103,10 @@ function serializeNodeInner(model, effective) {
100
103
  export function canonicalSerialize(model) {
101
104
  const raw = serializeJson(model, { indent: 2 });
102
105
  const parsed = JSON.parse(raw);
106
+ // FR-016 / ADR-0018: rewrite legacy @table → kind-matching alias on source.rdb
107
+ // wrappers (run before alphabetical sort so the rewritten key sorts in its
108
+ // canonical position).
109
+ rewriteSourceRdbPhysicalNames(parsed);
103
110
  const sorted = sortAttrKeys(parsed);
104
111
  const out = JSON.stringify(sorted, null, 2);
105
112
  return out + "\n";
@@ -114,10 +121,46 @@ export function canonicalSerializeEffective(model) {
114
121
  const nodeObj = serializeNode(model, true);
115
122
  const raw = JSON.stringify(nodeObj, null, 2);
116
123
  const parsed = JSON.parse(raw);
124
+ rewriteSourceRdbPhysicalNames(parsed);
117
125
  const sorted = sortAttrKeys(parsed);
118
126
  const out = JSON.stringify(sorted, null, 2);
119
127
  return out + "\n";
120
128
  }
129
+ /**
130
+ * FR-016 / ADR-0018 — when a source.rdb wrapper carries @table with a non-table
131
+ * @kind (the pre-1.0 legacy spelling), rewrite the attr key in place to the
132
+ * kind-matching alias (@view / @materializedView / @proc / @function). Mutates
133
+ * the parsed JSON in place; idempotent and a no-op for canonical inputs.
134
+ */
135
+ function rewriteSourceRdbPhysicalNames(value) {
136
+ if (Array.isArray(value)) {
137
+ for (const item of value)
138
+ rewriteSourceRdbPhysicalNames(item);
139
+ return;
140
+ }
141
+ if (value === null || typeof value !== "object")
142
+ return;
143
+ const obj = value;
144
+ const rdbBody = obj[SOURCE_RDB_FUSED_KEY];
145
+ if (rdbBody !== undefined && rdbBody !== null && typeof rdbBody === "object" && !Array.isArray(rdbBody)) {
146
+ const body = rdbBody;
147
+ const kindRaw = body[`${ATTR_PREFIX}${SOURCE_ATTR_KIND}`];
148
+ const kind = typeof kindRaw === "string" && kindRaw !== "" ? kindRaw : DEFAULT_SOURCE_KIND;
149
+ const canonical = PHYSICAL_NAME_ATTR_BY_KIND.get(kind);
150
+ if (canonical !== undefined && canonical !== SOURCE_ATTR_TABLE) {
151
+ const legacyKey = `${ATTR_PREFIX}${SOURCE_ATTR_TABLE}`;
152
+ const canonicalKey = `${ATTR_PREFIX}${canonical}`;
153
+ const legacyValue = body[legacyKey];
154
+ if (legacyValue !== undefined && body[canonicalKey] === undefined) {
155
+ body[canonicalKey] = legacyValue;
156
+ delete body[legacyKey];
157
+ }
158
+ }
159
+ }
160
+ // Recurse through every value (in particular `children`).
161
+ for (const v of Object.values(obj))
162
+ rewriteSourceRdbPhysicalNames(v);
163
+ }
121
164
  function sortAttrKeys(value) {
122
165
  if (Array.isArray(value)) {
123
166
  return value.map(sortAttrKeys);
@@ -1 +1 @@
1
- {"version":3,"file":"serializer-json.js","sourceRoot":"","sources":["../src/serializer-json.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serializer-json.js","sourceRoot":"","sources":["../src/serializer-json.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,15 @@ export declare const TEMPLATE_ATTR_MAX_CHARS = "maxChars";
10
10
  export declare const TEMPLATE_ATTR_OWNER = "owner";
11
11
  export declare const TEMPLATE_ATTR_SINCE = "since";
12
12
  export declare const TEMPLATE_ATTR_REQUIRED_TAGS = "requiredTags";
13
+ export declare const TEMPLATE_ATTR_KIND = "kind";
14
+ export declare const TEMPLATE_KIND_DOCUMENT = "document";
15
+ export declare const TEMPLATE_KIND_EMAIL = "email";
16
+ export declare const TEMPLATE_KIND_DEFAULT = "document";
17
+ export declare const TEMPLATE_KINDS: readonly ["document", "email"];
18
+ export type TemplateKind = (typeof TEMPLATE_KINDS)[number];
19
+ export declare const TEMPLATE_ATTR_SUBJECT_REF = "subjectRef";
20
+ export declare const TEMPLATE_ATTR_HTML_BODY_REF = "htmlBodyRef";
21
+ export declare const TEMPLATE_ATTR_TEXT_BODY_REF = "textBodyRef";
13
22
  export declare const TEMPLATE_ATTR_MAX_TOKENS = "maxTokens";
14
23
  export declare const TEMPLATE_ATTR_REQUIRED_SLOTS = "requiredSlots";
15
24
  export declare const TEMPLATE_ATTR_MODEL = "model";
@@ -1 +1 @@
1
- {"version":3,"file":"template-constants.d.ts","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,yBAAyB,aAAa,CAAC;AAEpD,eAAO,MAAM,iBAAiB,mDAKpB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIjE,eAAO,MAAM,yBAAyB,eAAe,CAAC;AACtD,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAChD,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAClD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAI3C,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAG1D,eAAO,MAAM,wBAAwB,cAAc,CAAC;AACpD,eAAO,MAAM,4BAA4B,kBAAkB,CAAC;AAC5D,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAU3C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAIlD,eAAO,MAAM,gBAAgB,4EAQnB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAK/D,eAAO,MAAM,0BAA0B,gBAAgB,CAAC;AACxD,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAC5C,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AACvD,eAAO,MAAM,oBAAoB,UAAqB,CAAC;AAEvD,eAAO,MAAM,aAAa,6CAIhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"template-constants.d.ts","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAChD,eAAO,MAAM,yBAAyB,aAAa,CAAC;AAEpD,eAAO,MAAM,iBAAiB,mDAKpB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIjE,eAAO,MAAM,yBAAyB,eAAe,CAAC;AACtD,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAChD,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAClD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAI3C,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAW1D,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,sBAAsB,aAAa,CAAC;AACjD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,qBAAqB,aAAyB,CAAC;AAC5D,eAAO,MAAM,cAAc,gCAGjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,eAAO,MAAM,yBAAyB,eAAe,CAAC;AACtD,eAAO,MAAM,2BAA2B,gBAAgB,CAAC;AACzD,eAAO,MAAM,2BAA2B,gBAAgB,CAAC;AAGzD,eAAO,MAAM,wBAAwB,cAAc,CAAC;AACpD,eAAO,MAAM,4BAA4B,kBAAkB,CAAC;AAC5D,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAU3C,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAIlD,eAAO,MAAM,gBAAgB,4EAQnB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAK/D,eAAO,MAAM,0BAA0B,gBAAgB,CAAC;AACxD,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAC5C,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AACvD,eAAO,MAAM,oBAAoB,UAAqB,CAAC;AAEvD,eAAO,MAAM,aAAa,6CAIhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -35,6 +35,26 @@ export const TEMPLATE_ATTR_SINCE = "since";
35
35
  // Generic — not prompt-only: any rendered artifact (email, export, prompt) can
36
36
  // carry a tag contract a downstream parser depends on.
37
37
  export const TEMPLATE_ATTR_REQUIRED_TAGS = "requiredTags";
38
+ // --- @kind + email part-refs (template.output only) ---
39
+ //
40
+ // A template.output is either a plain document (renders @textRef in @format → one
41
+ // string) or an email (renders subject + html + optional text → a structured
42
+ // EmailDocument). @kind is a closed enum; the email part-refs are 2-layer logical
43
+ // (group/source) textRefs resolved by a provider at render time, like @textRef.
44
+ // Cross-field rules live in the loader validation pass (validateTemplatePayloadRefs):
45
+ // - @kind="email" → require @subjectRef AND @htmlBodyRef (textRef unused; @textBodyRef optional)
46
+ // - @kind="document" / absent → require @textRef
47
+ export const TEMPLATE_ATTR_KIND = "kind";
48
+ export const TEMPLATE_KIND_DOCUMENT = "document";
49
+ export const TEMPLATE_KIND_EMAIL = "email";
50
+ export const TEMPLATE_KIND_DEFAULT = TEMPLATE_KIND_DOCUMENT;
51
+ export const TEMPLATE_KINDS = [
52
+ TEMPLATE_KIND_DOCUMENT,
53
+ TEMPLATE_KIND_EMAIL,
54
+ ];
55
+ export const TEMPLATE_ATTR_SUBJECT_REF = "subjectRef";
56
+ export const TEMPLATE_ATTR_HTML_BODY_REF = "htmlBodyRef";
57
+ export const TEMPLATE_ATTR_TEXT_BODY_REF = "textBodyRef";
38
58
  // Prompt-overlay attrs (template.prompt only).
39
59
  export const TEMPLATE_ATTR_MAX_TOKENS = "maxTokens";
40
60
  export const TEMPLATE_ATTR_REQUIRED_SLOTS = "requiredSlots";
@@ -1 +1 @@
1
- {"version":3,"file":"template-constants.js","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,EAAE;AACF,8EAA8E;AAC9E,uEAAuE;AACvE,kBAAkB;AAClB,8EAA8E;AAC9E,qDAAqD;AACrD,2EAA2E;AAC3E,qDAAqD;AACrD,6EAA6E;AAC7E,kFAAkF;AAClF,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,6DAA6D;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAChD,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,uBAAuB;IACvB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAGX,6EAA6E;AAC7E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CAAC;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,mFAAmF;AACnF,+EAA+E;AAC/E,uDAAuD;AACvD,MAAM,CAAC,MAAM,2BAA2B,GAAG,cAAc,CAAC;AAE1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC;AACpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,eAAe,CAAC;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAE3C,4EAA4E;AAC5E,8EAA8E;AAC9E,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AACtE,yEAAyE;AACzE,gBAAgB;AAChB,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAElD,4EAA4E;AAC5E,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,UAAU;IACV,aAAa;CACL,CAAC;AAGX,mFAAmF;AACnF,kFAAkF;AAClF,wEAAwE;AACxE,MAAM,CAAC,MAAM,0BAA0B,GAAG,aAAa,CAAC;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,mBAAmB;IACnB,yBAAyB;CACjB,CAAC"}
1
+ {"version":3,"file":"template-constants.js","sourceRoot":"","sources":["../../src/template/template-constants.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"template-schema.d.ts","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAsJjD,eAAO,MAAM,kBAAkB,2BAK7B,CAAC"}
1
+ {"version":3,"file":"template-schema.d.ts","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAqMjD,eAAO,MAAM,kBAAkB,2BAK7B,CAAC"}
@@ -7,7 +7,7 @@
7
7
  // `verify` scope (Plan #3), not load-time validation.
8
8
  import { ATTR_SUBTYPE_STRING, ATTR_SUBTYPE_INT, ATTR_SUBTYPE_STRINGARRAY, } from "../core/attr/attr-constants.js";
9
9
  import { SUBTYPE_BASE } from "../shared/base-types.js";
10
- import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, TEMPLATE_ATTR_PROMPT_STYLE, PROMPT_STYLE_DEFAULT, PROMPT_STYLES, } from "./template-constants.js";
10
+ import { TEMPLATE_SUBTYPE_PROMPT, TEMPLATE_SUBTYPE_OUTPUT, TEMPLATE_SUBTYPE_TOOLCALL, TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_TEXT_REF, TEMPLATE_ATTR_FORMAT, TEMPLATE_ATTR_MAX_CHARS, TEMPLATE_ATTR_OWNER, TEMPLATE_ATTR_SINCE, TEMPLATE_ATTR_REQUIRED_TAGS, TEMPLATE_ATTR_MAX_TOKENS, TEMPLATE_ATTR_REQUIRED_SLOTS, TEMPLATE_ATTR_MODEL, TEMPLATE_ATTR_TOOL_NAME, TEMPLATE_FORMATS, TEMPLATE_ATTR_PROMPT_STYLE, PROMPT_STYLE_DEFAULT, PROMPT_STYLES, TEMPLATE_ATTR_KIND, TEMPLATE_KINDS, TEMPLATE_KIND_DEFAULT, TEMPLATE_ATTR_SUBJECT_REF, TEMPLATE_ATTR_HTML_BODY_REF, TEMPLATE_ATTR_TEXT_BODY_REF, } from "./template-constants.js";
11
11
  // Generic attrs shared by template.prompt and template.output.
12
12
  const genericAttrs = [
13
13
  {
@@ -19,7 +19,12 @@ const genericAttrs = [
19
19
  {
20
20
  name: TEMPLATE_ATTR_TEXT_REF,
21
21
  valueType: ATTR_SUBTYPE_STRING,
22
- required: true,
22
+ // Relaxed to optional at the schema level: a template.output with @kind="email"
23
+ // renders subject/html/text parts and carries NO @textRef. The presence rule is
24
+ // enforced conditionally in the loader (validateTemplatePayloadRefs): document /
25
+ // prompt require @textRef; email does not. template.prompt's @textRef requirement
26
+ // is likewise enforced there.
27
+ required: false,
23
28
  description: "2-layer logical reference (group/source) to the body text, resolved by a provider at render time.",
24
29
  },
25
30
  {
@@ -65,6 +70,40 @@ const promptStyleAttr = {
65
70
  allowedValues: [...PROMPT_STYLES],
66
71
  description: "FR-010 output-format prompt presentation: 'guide' (prose list + example), 'inline' (inline placeholders / enum choices), or 'exampleOnly' (filled skeleton). Guidance is never emitted as comments.",
67
72
  };
73
+ // @kind + email part-refs (template.output only).
74
+ //
75
+ // @kind is a closed enum (document|email), default "document", enforced via
76
+ // allowedValues exactly like @format / @promptStyle. The 3 part-refs are optional
77
+ // 2-layer logical (group/source) textRefs; their conditional presence (email needs
78
+ // @subjectRef + @htmlBodyRef) is enforced in the loader validation pass.
79
+ const outputKindAttrs = [
80
+ {
81
+ name: TEMPLATE_ATTR_KIND,
82
+ valueType: ATTR_SUBTYPE_STRING,
83
+ required: false,
84
+ default: TEMPLATE_KIND_DEFAULT,
85
+ allowedValues: [...TEMPLATE_KINDS],
86
+ description: "Output shape: 'document' (renders @textRef in @format → one string) or 'email' (renders subject + html + optional text → a structured EmailDocument).",
87
+ },
88
+ {
89
+ name: TEMPLATE_ATTR_SUBJECT_REF,
90
+ valueType: ATTR_SUBTYPE_STRING,
91
+ required: false,
92
+ description: "Email only: 2-layer logical reference (group/source) to the subject-line text. Required when @kind=\"email\".",
93
+ },
94
+ {
95
+ name: TEMPLATE_ATTR_HTML_BODY_REF,
96
+ valueType: ATTR_SUBTYPE_STRING,
97
+ required: false,
98
+ description: "Email only: 2-layer logical reference (group/source) to the HTML body text. Required when @kind=\"email\".",
99
+ },
100
+ {
101
+ name: TEMPLATE_ATTR_TEXT_BODY_REF,
102
+ valueType: ATTR_SUBTYPE_STRING,
103
+ required: false,
104
+ description: "Email only: 2-layer logical reference (group/source) to the optional plain-text alternative body.",
105
+ },
106
+ ];
68
107
  // LLM-overlay attrs (template.prompt only).
69
108
  const promptOverlayAttrs = [
70
109
  {
@@ -128,7 +167,7 @@ const toolcallAttrs = [
128
167
  export const TEMPLATE_ATTRS_MAP = new Map([
129
168
  [SUBTYPE_BASE, []],
130
169
  [TEMPLATE_SUBTYPE_PROMPT, [...genericAttrs, ...promptOverlayAttrs]],
131
- [TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs, promptStyleAttr]],
170
+ [TEMPLATE_SUBTYPE_OUTPUT, [...genericAttrs, promptStyleAttr, ...outputKindAttrs]],
132
171
  [TEMPLATE_SUBTYPE_TOOLCALL, [...toolcallAttrs]],
133
172
  ]);
134
173
  //# sourceMappingURL=template-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaobjectsdev/metadata",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "description": "Metamodel loader, types, and constants for the MetaObjects standard.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -34,8 +34,16 @@ import { TYPE_FIELD } from "./shared/base-types.js";
34
34
  import {
35
35
  FIELD_SUBTYPE_ENUM,
36
36
  FIELD_ATTR_VALUES,
37
+ FIELD_ATTR_COERCE_DEFAULT,
38
+ FIELD_ATTR_DEFAULT,
37
39
  ENUM_MEMBER_PATTERN,
38
40
  } from "./core/field/field-constants.js";
41
+ import {
42
+ FIELD_ATTR_DB_COLUMN_TYPE,
43
+ DB_COLUMN_TYPE_VALUES,
44
+ DB_COLUMN_TYPE_LEGAL_SUBTYPES,
45
+ type DbColumnTypeValue,
46
+ } from "./persistence/db/db-constants.js";
39
47
 
40
48
  export interface AttrSchemaValidationResult {
41
49
  errors: ParseError[];
@@ -210,5 +218,67 @@ function validateNode(
210
218
  }
211
219
  }
212
220
  }
221
+
222
+ // --- Check 5 (FR-011): enum fallback attrs must be a member of @values ---
223
+ //
224
+ // Both @coerceDefault (extract-time coercion fallback) and @default (absent-fill
225
+ // member) name an enum member, so each must be one of the field's @values.
226
+ // Only validate when THIS node owns the attr (own-attrs-only policy, matching
227
+ // Checks 2+3). The membership set is the EFFECTIVE @values — own or inherited
228
+ // via extends: — so a concrete enum that owns the fallback attr and inherits
229
+ // @values from an abstract super still validates correctly.
230
+ //
231
+ // @coerceDefault is enum-only by registration, but @default is polymorphic
232
+ // (a column default on string/int/bool/etc. fields), so the @default membership
233
+ // check is gated to field.enum — @default on non-enum fields is NOT touched.
234
+ if (node.type === TYPE_FIELD && node.subType === FIELD_SUBTYPE_ENUM) {
235
+ const effectiveValues = node.attrs().get(FIELD_ATTR_VALUES);
236
+ const members = Array.isArray(effectiveValues) ? effectiveValues : [];
237
+
238
+ for (const attrName of [FIELD_ATTR_COERCE_DEFAULT, FIELD_ATTR_DEFAULT]) {
239
+ const ownValue = node.ownAttrs().get(attrName);
240
+ if (typeof ownValue === "string" && !members.includes(ownValue)) {
241
+ errors.push(
242
+ new ParseError(
243
+ `${nodeLabel(node)} attribute '@${attrName}' value ` +
244
+ `'${ownValue}' is not one of '@${FIELD_ATTR_VALUES}': ` +
245
+ `${members.join(", ")}.`,
246
+ { code: "ERR_BAD_ATTR_VALUE", source: node.source },
247
+ ),
248
+ );
249
+ }
250
+ }
251
+ }
252
+ }
253
+
254
+ // --- Check 6 (R6 Plan 2b): @dbColumnType (logical subtype × value) pairing ---
255
+ //
256
+ // @dbColumnType is a physical column-type override registered on every field
257
+ // subtype by the dbProvider. Its legal value depends on the field's logical
258
+ // subtype (uuid/jsonb on field.string, timestamp_with_tz on field.timestamp),
259
+ // a pairing that a flat allowedValues set cannot express — so validate it here.
260
+ // Own-only (matches Checks 2+3): an inherited @dbColumnType was validated on
261
+ // the declaring node. Both an unrecognized value and an illegal pairing emit
262
+ // ERR_BAD_ATTR_VALUE naming the field, the value, and the legal set.
263
+ if (node.type === TYPE_FIELD) {
264
+ const ownValue = node.ownAttrs().get(FIELD_ATTR_DB_COLUMN_TYPE);
265
+ if (typeof ownValue === "string") {
266
+ const legalSubtypes = (DB_COLUMN_TYPE_VALUES as readonly string[]).includes(ownValue)
267
+ ? DB_COLUMN_TYPE_LEGAL_SUBTYPES[ownValue as DbColumnTypeValue]
268
+ : undefined;
269
+ if (legalSubtypes === undefined || !legalSubtypes.includes(node.subType)) {
270
+ errors.push(
271
+ new ParseError(
272
+ `${nodeLabel(node)} attribute '@${FIELD_ATTR_DB_COLUMN_TYPE}' value ` +
273
+ `'${ownValue}' is not legal on field.${node.subType}. ` +
274
+ `Legal @${FIELD_ATTR_DB_COLUMN_TYPE} pairings: ` +
275
+ `${DB_COLUMN_TYPE_VALUES.map(
276
+ (v) => `${v} (field.${DB_COLUMN_TYPE_LEGAL_SUBTYPES[v].join("/field.")})`,
277
+ ).join(", ")}.`,
278
+ { code: "ERR_BAD_ATTR_VALUE", source: node.source },
279
+ ),
280
+ );
281
+ }
282
+ }
213
283
  }
214
284
  }