@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.
- package/dist/attr-schema-validate.d.ts.map +1 -1
- package/dist/attr-schema-validate.js +17 -2
- package/dist/attr-schema-validate.js.map +1 -1
- package/dist/core/field/field-constants.d.ts +18 -5
- package/dist/core/field/field-constants.d.ts.map +1 -1
- package/dist/core/field/field-constants.js +21 -5
- package/dist/core/field/field-constants.js.map +1 -1
- package/dist/core/field/field-definition.embedded.d.ts.map +1 -1
- package/dist/core/field/field-definition.embedded.js +8 -3
- package/dist/core/field/field-definition.embedded.js.map +1 -1
- package/dist/core/field/validate-field-mutability.d.ts +22 -0
- package/dist/core/field/validate-field-mutability.d.ts.map +1 -0
- package/dist/core/field/validate-field-mutability.js +208 -0
- package/dist/core/field/validate-field-mutability.js.map +1 -0
- package/dist/core/identity/identity-constants.d.ts +12 -0
- package/dist/core/identity/identity-constants.d.ts.map +1 -1
- package/dist/core/identity/identity-constants.js +15 -0
- package/dist/core/identity/identity-constants.js.map +1 -1
- package/dist/core/identity/identity-definition.embedded.js +2 -2
- package/dist/core/identity/identity-definition.embedded.js.map +1 -1
- package/dist/core/index/index-definition.embedded.js +2 -2
- package/dist/core/index/index-definition.embedded.js.map +1 -1
- package/dist/core/object/object-definition.embedded.js +2 -2
- package/dist/core/object/object-definition.embedded.js.map +1 -1
- package/dist/core/requirement/meta-requirement.d.ts +1 -2
- package/dist/core/requirement/meta-requirement.d.ts.map +1 -1
- package/dist/core/requirement/meta-requirement.js +2 -6
- package/dist/core/requirement/meta-requirement.js.map +1 -1
- package/dist/core/requirement/requirement-constants.d.ts +3 -8
- package/dist/core/requirement/requirement-constants.d.ts.map +1 -1
- package/dist/core/requirement/requirement-constants.js +2 -9
- package/dist/core/requirement/requirement-constants.js.map +1 -1
- package/dist/core/requirement/requirement-definition.embedded.d.ts.map +1 -1
- package/dist/core/requirement/requirement-definition.embedded.js +8 -46
- package/dist/core/requirement/requirement-definition.embedded.js.map +1 -1
- package/dist/core/requirement/resolve-claim.d.ts +37 -0
- package/dist/core/requirement/resolve-claim.d.ts.map +1 -0
- package/dist/core/requirement/resolve-claim.js +83 -0
- package/dist/core/requirement/resolve-claim.js.map +1 -0
- package/dist/core/vocabulary-rewrite-yaml.d.ts +21 -0
- package/dist/core/vocabulary-rewrite-yaml.d.ts.map +1 -0
- package/dist/core/vocabulary-rewrite-yaml.js +245 -0
- package/dist/core/vocabulary-rewrite-yaml.js.map +1 -0
- package/dist/core-types.d.ts.map +1 -1
- package/dist/core-types.js +10 -10
- package/dist/core-types.js.map +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +37 -4
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/library/library-sources.d.ts +11 -0
- package/dist/library/library-sources.d.ts.map +1 -1
- package/dist/library/library-sources.js +13 -0
- package/dist/library/library-sources.js.map +1 -1
- package/dist/loader/meta-data-loader.d.ts.map +1 -1
- package/dist/loader/meta-data-loader.js +14 -10
- package/dist/loader/meta-data-loader.js.map +1 -1
- package/dist/loader/validation-passes.d.ts +1 -0
- package/dist/loader/validation-passes.d.ts.map +1 -1
- package/dist/loader/validation-passes.js +263 -45
- package/dist/loader/validation-passes.js.map +1 -1
- package/dist/naming-refs.d.ts.map +1 -1
- package/dist/naming-refs.js +2 -3
- package/dist/naming-refs.js.map +1 -1
- package/dist/parser-core.d.ts.map +1 -1
- package/dist/parser-core.js +22 -5
- package/dist/parser-core.js.map +1 -1
- package/dist/persistence/origin/meta-origin.d.ts +0 -10
- package/dist/persistence/origin/meta-origin.d.ts.map +1 -1
- package/dist/persistence/origin/meta-origin.js +1 -15
- package/dist/persistence/origin/meta-origin.js.map +1 -1
- package/dist/persistence/origin/origin-constants.d.ts +2 -4
- package/dist/persistence/origin/origin-constants.d.ts.map +1 -1
- package/dist/persistence/origin/origin-constants.js +9 -7
- package/dist/persistence/origin/origin-constants.js.map +1 -1
- package/dist/persistence/origin/origin-definition.embedded.d.ts.map +1 -1
- package/dist/persistence/origin/origin-definition.embedded.js +5 -21
- package/dist/persistence/origin/origin-definition.embedded.js.map +1 -1
- package/dist/registry-manifest.d.ts +9 -4
- package/dist/registry-manifest.d.ts.map +1 -1
- package/dist/registry-manifest.js +9 -4
- package/dist/registry-manifest.js.map +1 -1
- package/dist/retired-vocabulary.d.ts +92 -0
- package/dist/retired-vocabulary.d.ts.map +1 -0
- package/dist/retired-vocabulary.js +204 -0
- package/dist/retired-vocabulary.js.map +1 -0
- package/dist/super-resolve.d.ts +33 -0
- package/dist/super-resolve.d.ts.map +1 -1
- package/dist/super-resolve.js +56 -1
- package/dist/super-resolve.js.map +1 -1
- package/dist/template/prompt-definition.embedded.js +1 -1
- package/dist/template/prompt-definition.embedded.js.map +1 -1
- package/dist/template/template-constants.d.ts +6 -0
- package/dist/template/template-constants.d.ts.map +1 -1
- package/dist/template/template-constants.js +24 -1
- package/dist/template/template-constants.js.map +1 -1
- package/dist/template/template-definition.embedded.d.ts.map +1 -1
- package/dist/template/template-definition.embedded.js +34 -21
- package/dist/template/template-definition.embedded.js.map +1 -1
- package/dist/vocabulary-rewrite.d.ts +33 -0
- package/dist/vocabulary-rewrite.d.ts.map +1 -0
- package/dist/vocabulary-rewrite.js +314 -0
- package/dist/vocabulary-rewrite.js.map +1 -0
- package/package.json +11 -1
- package/src/attr-schema-validate.ts +17 -2
- package/src/core/field/field-constants.ts +24 -5
- package/src/core/field/field-definition.embedded.ts +8 -3
- package/src/core/field/validate-field-mutability.ts +259 -0
- package/src/core/identity/identity-constants.ts +16 -0
- package/src/core/identity/identity-definition.embedded.ts +2 -2
- package/src/core/index/index-definition.embedded.ts +2 -2
- package/src/core/object/object-definition.embedded.ts +2 -2
- package/src/core/requirement/meta-requirement.ts +1 -7
- package/src/core/requirement/requirement-constants.ts +2 -9
- package/src/core/requirement/requirement-definition.embedded.ts +8 -46
- package/src/core/requirement/resolve-claim.ts +98 -0
- package/src/core/vocabulary-rewrite-yaml.ts +267 -0
- package/src/core-types.ts +9 -10
- package/src/errors.ts +37 -4
- package/src/index.ts +29 -1
- package/src/library/library-sources.ts +14 -0
- package/src/loader/meta-data-loader.ts +15 -10
- package/src/loader/validation-passes.ts +323 -50
- package/src/naming-refs.ts +1 -3
- package/src/parser-core.ts +27 -5
- package/src/persistence/origin/meta-origin.ts +0 -16
- package/src/persistence/origin/origin-constants.ts +9 -8
- package/src/persistence/origin/origin-definition.embedded.ts +5 -21
- package/src/registry-manifest.ts +9 -4
- package/src/retired-vocabulary.ts +280 -0
- package/src/super-resolve.ts +59 -1
- package/src/template/prompt-definition.embedded.ts +1 -1
- package/src/template/template-constants.ts +27 -1
- package/src/template/template-definition.embedded.ts +34 -21
- package/src/vocabulary-rewrite.ts +350 -0
- package/dist/core/field/validate-field-readonly.d.ts +0 -9
- package/dist/core/field/validate-field-readonly.d.ts.map +0 -1
- package/dist/core/field/validate-field-readonly.js +0 -128
- package/dist/core/field/validate-field-readonly.js.map +0 -1
- 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
|
-
}
|