@metaobjectsdev/metadata 0.24.0-rc.1 → 0.24.1

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 (144) hide show
  1. package/dist/attr-schema-validate.d.ts.map +1 -1
  2. package/dist/attr-schema-validate.js +17 -2
  3. package/dist/attr-schema-validate.js.map +1 -1
  4. package/dist/core/field/field-constants.d.ts +18 -5
  5. package/dist/core/field/field-constants.d.ts.map +1 -1
  6. package/dist/core/field/field-constants.js +21 -5
  7. package/dist/core/field/field-constants.js.map +1 -1
  8. package/dist/core/field/field-definition.embedded.d.ts.map +1 -1
  9. package/dist/core/field/field-definition.embedded.js +8 -3
  10. package/dist/core/field/field-definition.embedded.js.map +1 -1
  11. package/dist/core/field/validate-field-mutability.d.ts +22 -0
  12. package/dist/core/field/validate-field-mutability.d.ts.map +1 -0
  13. package/dist/core/field/validate-field-mutability.js +208 -0
  14. package/dist/core/field/validate-field-mutability.js.map +1 -0
  15. package/dist/core/identity/identity-constants.d.ts +12 -0
  16. package/dist/core/identity/identity-constants.d.ts.map +1 -1
  17. package/dist/core/identity/identity-constants.js +15 -0
  18. package/dist/core/identity/identity-constants.js.map +1 -1
  19. package/dist/core/identity/identity-definition.embedded.js +2 -2
  20. package/dist/core/identity/identity-definition.embedded.js.map +1 -1
  21. package/dist/core/index/index-definition.embedded.js +2 -2
  22. package/dist/core/index/index-definition.embedded.js.map +1 -1
  23. package/dist/core/object/object-definition.embedded.js +2 -2
  24. package/dist/core/object/object-definition.embedded.js.map +1 -1
  25. package/dist/core/requirement/meta-requirement.d.ts +1 -2
  26. package/dist/core/requirement/meta-requirement.d.ts.map +1 -1
  27. package/dist/core/requirement/meta-requirement.js +2 -6
  28. package/dist/core/requirement/meta-requirement.js.map +1 -1
  29. package/dist/core/requirement/requirement-constants.d.ts +3 -8
  30. package/dist/core/requirement/requirement-constants.d.ts.map +1 -1
  31. package/dist/core/requirement/requirement-constants.js +2 -9
  32. package/dist/core/requirement/requirement-constants.js.map +1 -1
  33. package/dist/core/requirement/requirement-definition.embedded.d.ts.map +1 -1
  34. package/dist/core/requirement/requirement-definition.embedded.js +8 -46
  35. package/dist/core/requirement/requirement-definition.embedded.js.map +1 -1
  36. package/dist/core/requirement/resolve-claim.d.ts +37 -0
  37. package/dist/core/requirement/resolve-claim.d.ts.map +1 -0
  38. package/dist/core/requirement/resolve-claim.js +83 -0
  39. package/dist/core/requirement/resolve-claim.js.map +1 -0
  40. package/dist/core/vocabulary-rewrite-yaml.d.ts +21 -0
  41. package/dist/core/vocabulary-rewrite-yaml.d.ts.map +1 -0
  42. package/dist/core/vocabulary-rewrite-yaml.js +245 -0
  43. package/dist/core/vocabulary-rewrite-yaml.js.map +1 -0
  44. package/dist/core-types.d.ts.map +1 -1
  45. package/dist/core-types.js +10 -10
  46. package/dist/core-types.js.map +1 -1
  47. package/dist/errors.d.ts +2 -2
  48. package/dist/errors.d.ts.map +1 -1
  49. package/dist/errors.js +37 -4
  50. package/dist/errors.js.map +1 -1
  51. package/dist/index.d.ts +7 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +13 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/library/library-sources.d.ts +11 -0
  56. package/dist/library/library-sources.d.ts.map +1 -1
  57. package/dist/library/library-sources.js +13 -0
  58. package/dist/library/library-sources.js.map +1 -1
  59. package/dist/loader/meta-data-loader.d.ts.map +1 -1
  60. package/dist/loader/meta-data-loader.js +14 -10
  61. package/dist/loader/meta-data-loader.js.map +1 -1
  62. package/dist/loader/validation-passes.d.ts +1 -0
  63. package/dist/loader/validation-passes.d.ts.map +1 -1
  64. package/dist/loader/validation-passes.js +263 -45
  65. package/dist/loader/validation-passes.js.map +1 -1
  66. package/dist/naming-refs.d.ts.map +1 -1
  67. package/dist/naming-refs.js +2 -3
  68. package/dist/naming-refs.js.map +1 -1
  69. package/dist/parser-core.d.ts.map +1 -1
  70. package/dist/parser-core.js +22 -5
  71. package/dist/parser-core.js.map +1 -1
  72. package/dist/persistence/origin/meta-origin.d.ts +0 -10
  73. package/dist/persistence/origin/meta-origin.d.ts.map +1 -1
  74. package/dist/persistence/origin/meta-origin.js +1 -15
  75. package/dist/persistence/origin/meta-origin.js.map +1 -1
  76. package/dist/persistence/origin/origin-constants.d.ts +2 -4
  77. package/dist/persistence/origin/origin-constants.d.ts.map +1 -1
  78. package/dist/persistence/origin/origin-constants.js +9 -7
  79. package/dist/persistence/origin/origin-constants.js.map +1 -1
  80. package/dist/persistence/origin/origin-definition.embedded.d.ts.map +1 -1
  81. package/dist/persistence/origin/origin-definition.embedded.js +5 -21
  82. package/dist/persistence/origin/origin-definition.embedded.js.map +1 -1
  83. package/dist/registry-manifest.d.ts +9 -4
  84. package/dist/registry-manifest.d.ts.map +1 -1
  85. package/dist/registry-manifest.js +9 -4
  86. package/dist/registry-manifest.js.map +1 -1
  87. package/dist/retired-vocabulary.d.ts +92 -0
  88. package/dist/retired-vocabulary.d.ts.map +1 -0
  89. package/dist/retired-vocabulary.js +204 -0
  90. package/dist/retired-vocabulary.js.map +1 -0
  91. package/dist/super-resolve.d.ts +33 -0
  92. package/dist/super-resolve.d.ts.map +1 -1
  93. package/dist/super-resolve.js +56 -1
  94. package/dist/super-resolve.js.map +1 -1
  95. package/dist/template/prompt-definition.embedded.js +1 -1
  96. package/dist/template/prompt-definition.embedded.js.map +1 -1
  97. package/dist/template/template-constants.d.ts +6 -0
  98. package/dist/template/template-constants.d.ts.map +1 -1
  99. package/dist/template/template-constants.js +24 -1
  100. package/dist/template/template-constants.js.map +1 -1
  101. package/dist/template/template-definition.embedded.d.ts.map +1 -1
  102. package/dist/template/template-definition.embedded.js +34 -21
  103. package/dist/template/template-definition.embedded.js.map +1 -1
  104. package/dist/vocabulary-rewrite.d.ts +33 -0
  105. package/dist/vocabulary-rewrite.d.ts.map +1 -0
  106. package/dist/vocabulary-rewrite.js +314 -0
  107. package/dist/vocabulary-rewrite.js.map +1 -0
  108. package/package.json +11 -1
  109. package/src/attr-schema-validate.ts +17 -2
  110. package/src/core/field/field-constants.ts +24 -5
  111. package/src/core/field/field-definition.embedded.ts +8 -3
  112. package/src/core/field/validate-field-mutability.ts +259 -0
  113. package/src/core/identity/identity-constants.ts +16 -0
  114. package/src/core/identity/identity-definition.embedded.ts +2 -2
  115. package/src/core/index/index-definition.embedded.ts +2 -2
  116. package/src/core/object/object-definition.embedded.ts +2 -2
  117. package/src/core/requirement/meta-requirement.ts +1 -7
  118. package/src/core/requirement/requirement-constants.ts +2 -9
  119. package/src/core/requirement/requirement-definition.embedded.ts +8 -46
  120. package/src/core/requirement/resolve-claim.ts +98 -0
  121. package/src/core/vocabulary-rewrite-yaml.ts +267 -0
  122. package/src/core-types.ts +9 -10
  123. package/src/errors.ts +37 -4
  124. package/src/index.ts +29 -1
  125. package/src/library/library-sources.ts +14 -0
  126. package/src/loader/meta-data-loader.ts +15 -10
  127. package/src/loader/validation-passes.ts +323 -50
  128. package/src/naming-refs.ts +1 -3
  129. package/src/parser-core.ts +27 -5
  130. package/src/persistence/origin/meta-origin.ts +0 -16
  131. package/src/persistence/origin/origin-constants.ts +9 -8
  132. package/src/persistence/origin/origin-definition.embedded.ts +5 -21
  133. package/src/registry-manifest.ts +9 -4
  134. package/src/retired-vocabulary.ts +280 -0
  135. package/src/super-resolve.ts +59 -1
  136. package/src/template/prompt-definition.embedded.ts +1 -1
  137. package/src/template/template-constants.ts +27 -1
  138. package/src/template/template-definition.embedded.ts +34 -21
  139. package/src/vocabulary-rewrite.ts +350 -0
  140. package/dist/core/field/validate-field-readonly.d.ts +0 -9
  141. package/dist/core/field/validate-field-readonly.d.ts.map +0 -1
  142. package/dist/core/field/validate-field-readonly.js +0 -128
  143. package/dist/core/field/validate-field-readonly.js.map +0 -1
  144. package/src/core/field/validate-field-readonly.ts +0 -154
@@ -1,154 +0,0 @@
1
- // Validation pass: field-level @readOnly cross-attribute rules (FR-013).
2
- //
3
- // Codes:
4
- // ERR_READONLY_ASSIGNED_PRIMARY — @readOnly: true on a field that is the
5
- // target of an identity.primary with @generation: "assigned". The application
6
- // has no path to populate the identity value (no setter; not generated; not
7
- // defaulted).
8
- // ERR_READONLY_DOWNGRADE — a concrete subtype declares @readOnly: false on a
9
- // field whose extends-chain parent declares @readOnly: true. Read-only-ness
10
- // can only be upgraded, never downgraded.
11
- // WARN_READONLY_VALUE_OBJECT — @readOnly: true on a field child of object.value.
12
- // The persistence implication does not apply; the attr is retained for
13
- // language-specific record/struct treatment.
14
-
15
- import type { MetaData } from "../../shared/meta-data.js";
16
- import { ParseError } from "../../errors.js";
17
- import type { LoaderWarning } from "../../source.js";
18
- import {
19
- TYPE_OBJECT,
20
- TYPE_FIELD,
21
- TYPE_IDENTITY,
22
- } from "../../shared/base-types.js";
23
- import { OBJECT_SUBTYPE_VALUE } from "../object/object-constants.js";
24
- import {
25
- IDENTITY_SUBTYPE_PRIMARY,
26
- IDENTITY_ATTR_GENERATION,
27
- IDENTITY_ATTR_FIELDS,
28
- GENERATION_ASSIGNED,
29
- } from "../identity/identity-constants.js";
30
- import { FIELD_ATTR_READ_ONLY } from "./field-constants.js";
31
-
32
- export interface FieldReadOnlyValidationResult {
33
- errors: ParseError[];
34
- warnings: LoaderWarning[];
35
- }
36
-
37
- export function validateFieldReadOnly(root: MetaData): FieldReadOnlyValidationResult {
38
- const errors: ParseError[] = [];
39
- const warnings: LoaderWarning[] = [];
40
-
41
- // ADR-0039: root has no super; children()==ownChildren() but resolving is the default.
42
- for (const obj of root.children().filter((c) => c.type === TYPE_OBJECT)) {
43
- const isValueObject = obj.subType === OBJECT_SUBTYPE_VALUE;
44
-
45
- // 1) WARN_READONLY_VALUE_OBJECT — any @readOnly field child of an object.value.
46
- if (isValueObject) {
47
- // ADR-0039: own — warns on @readOnly DECLARED on this value's own fields
48
- // (readOnlyFlag reads the explicit own flag; the FR-013 read-only checks
49
- // are own-vs-super comparisons by design).
50
- for (const child of obj.ownChildren()) {
51
- if (child.type === TYPE_FIELD && readOnlyFlag(child) === true) {
52
- warnings.push({
53
- code: "WARN_READONLY_VALUE_OBJECT",
54
- message:
55
- `field "${child.name}" on object.value "${obj.name}" declares ` +
56
- `@readOnly: true; value-objects have no persistence semantics so ` +
57
- `the read-only contract is advisory (codegen may use it for record/` +
58
- `struct treatment).`,
59
- source: child.source,
60
- });
61
- }
62
- }
63
- }
64
-
65
- // 2) ERR_READONLY_DOWNGRADE — read-only-ness can only be upgraded across
66
- // extends. Compare own field vs. inherited field's effective @readOnly.
67
- // ADR-0039: own — the downgrade check compares this object's OWN explicit
68
- // @readOnly:false against the inherited effective value (own-vs-super by design).
69
- for (const ownField of obj.ownChildren().filter((c) => c.type === TYPE_FIELD)) {
70
- const ownVal = readOnlyFlag(ownField);
71
- if (ownVal !== false) continue; // only the explicit downgrade case matters
72
- const inherited = inheritedField(obj, ownField.name);
73
- if (inherited !== undefined && readOnlyFlag(inherited) === true) {
74
- errors.push(
75
- new ParseError(
76
- `field "${ownField.name}" on "${obj.name}" sets @readOnly: false, but the ` +
77
- `extends-chain parent declares @readOnly: true. Read-only-ness can only be ` +
78
- `upgraded, not downgraded (FR-013).`,
79
- { code: "ERR_READONLY_DOWNGRADE", source: ownField.source },
80
- ),
81
- );
82
- }
83
- }
84
-
85
- // 3) ERR_READONLY_ASSIGNED_PRIMARY — @readOnly: true on a field used in an
86
- // identity.primary whose @generation is "assigned" (effective tree).
87
- if (!isValueObject) {
88
- const primaryAssignedFields = primaryAssignedFieldNames(obj);
89
- if (primaryAssignedFields.size > 0) {
90
- for (const field of obj.children().filter((c) => c.type === TYPE_FIELD)) {
91
- if (!primaryAssignedFields.has(field.name)) continue;
92
- if (readOnlyFlag(field) !== true) continue;
93
- errors.push(
94
- new ParseError(
95
- `field "${field.name}" on "${obj.name}" is @readOnly: true AND the target ` +
96
- `of identity.primary with @generation: "assigned"; the application has no ` +
97
- `path to populate the identity value (FR-013).`,
98
- { code: "ERR_READONLY_ASSIGNED_PRIMARY", source: field.source },
99
- ),
100
- );
101
- }
102
- }
103
- }
104
- }
105
-
106
- return { errors, warnings };
107
- }
108
-
109
- /** Read the explicit @readOnly value from a field's own attrs. Returns
110
- * true / false when explicitly set, undefined when absent. */
111
- function readOnlyFlag(field: MetaData): boolean | undefined {
112
- // ADR-0039: own — the FR-013 downgrade rule needs the EXPLICIT own @readOnly on
113
- // THIS node (detecting an own :false against an inherited :true); resolving would
114
- // mask the downgrade. Deliberate own-vs-super comparison.
115
- const v = field.ownAttr(FIELD_ATTR_READ_ONLY);
116
- if (typeof v === "boolean") return v;
117
- return undefined;
118
- }
119
-
120
- /** Walk the extends chain looking for a field with the same name; return its
121
- * declaring node (own attrs preserved) if found. */
122
- function inheritedField(obj: MetaData, name: string): MetaData | undefined {
123
- let cursor = obj.superResolved;
124
- while (cursor !== undefined) {
125
- // ADR-0039: own — super-chain walk reading each level's OWN fields to find the
126
- // declaring node (the FR-013 comparison needs the declaring node's own flag).
127
- const f = cursor.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === name);
128
- if (f !== undefined) return f;
129
- cursor = cursor.superResolved;
130
- }
131
- return undefined;
132
- }
133
-
134
- /** Names of fields participating in any identity.primary with @generation:
135
- * "assigned" on `obj` or its extends chain. */
136
- function primaryAssignedFieldNames(obj: MetaData): Set<string> {
137
- const out = new Set<string>();
138
- for (const id of obj.children()) {
139
- if (id.type !== TYPE_IDENTITY) continue;
140
- if (id.subType !== IDENTITY_SUBTYPE_PRIMARY) continue;
141
- // ADR-0039: resolving — an identity may inherit @generation / @fields via extends.
142
- const gen = id.attr(IDENTITY_ATTR_GENERATION);
143
- if (gen !== GENERATION_ASSIGNED) continue;
144
- const fields = id.attr(IDENTITY_ATTR_FIELDS);
145
- if (Array.isArray(fields)) {
146
- for (const fName of fields) {
147
- if (typeof fName === "string") out.add(fName);
148
- }
149
- } else if (typeof fields === "string") {
150
- out.add(fields);
151
- }
152
- }
153
- return out;
154
- }