@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.
- package/dist/attr-schema-validate.d.ts.map +1 -1
- package/dist/attr-schema-validate.js +49 -1
- package/dist/attr-schema-validate.js.map +1 -1
- package/dist/core/field/field-constants.d.ts +27 -2
- package/dist/core/field/field-constants.d.ts.map +1 -1
- package/dist/core/field/field-constants.js +30 -2
- package/dist/core/field/field-constants.js.map +1 -1
- package/dist/core/field/field-schema.d.ts +9 -1
- package/dist/core/field/field-schema.d.ts.map +1 -1
- package/dist/core/field/field-schema.js +34 -3
- package/dist/core/field/field-schema.js.map +1 -1
- package/dist/core/field/meta-field.d.ts +10 -0
- package/dist/core/field/meta-field.d.ts.map +1 -1
- package/dist/core/field/meta-field.js +36 -1
- package/dist/core/field/meta-field.js.map +1 -1
- package/dist/core/field/validate-field-readonly.d.ts +9 -0
- package/dist/core/field/validate-field-readonly.d.ts.map +1 -0
- package/dist/core/field/validate-field-readonly.js +116 -0
- package/dist/core/field/validate-field-readonly.js.map +1 -0
- package/dist/core/object/meta-object-aware.d.ts +11 -0
- package/dist/core/object/meta-object-aware.d.ts.map +1 -0
- package/dist/core/object/meta-object-aware.js +15 -0
- package/dist/core/object/meta-object-aware.js.map +1 -0
- package/dist/core/object/meta-object.d.ts +21 -0
- package/dist/core/object/meta-object.d.ts.map +1 -1
- package/dist/core/object/meta-object.js +43 -2
- package/dist/core/object/meta-object.js.map +1 -1
- package/dist/core/object/object-class-registry.d.ts +22 -0
- package/dist/core/object/object-class-registry.d.ts.map +1 -0
- package/dist/core/object/object-class-registry.js +38 -0
- package/dist/core/object/object-class-registry.js.map +1 -0
- package/dist/core/object/object-constants.d.ts +7 -0
- package/dist/core/object/object-constants.d.ts.map +1 -1
- package/dist/core/object/object-constants.js +14 -0
- package/dist/core/object/object-constants.js.map +1 -1
- package/dist/core/object/object-schema.d.ts.map +1 -1
- package/dist/core/object/object-schema.js +24 -1
- package/dist/core/object/object-schema.js.map +1 -1
- package/dist/core/object/validate-discriminator.d.ts +4 -0
- package/dist/core/object/validate-discriminator.d.ts.map +1 -0
- package/dist/core/object/validate-discriminator.js +145 -0
- package/dist/core/object/validate-discriminator.js.map +1 -0
- package/dist/core/object/value-object.d.ts +23 -0
- package/dist/core/object/value-object.d.ts.map +1 -0
- package/dist/core/object/value-object.js +51 -0
- package/dist/core/object/value-object.js.map +1 -0
- package/dist/core/query/query-constants.d.ts.map +1 -1
- package/dist/core/query/query-constants.js +4 -0
- package/dist/core/query/query-constants.js.map +1 -1
- package/dist/core-types.d.ts.map +1 -1
- package/dist/core-types.js +16 -4
- 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 +23 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/loader/meta-data-loader.d.ts.map +1 -1
- package/dist/loader/meta-data-loader.js +26 -1
- 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 +122 -2
- package/dist/loader/validation-passes.js.map +1 -1
- package/dist/naming.d.ts.map +1 -1
- package/dist/naming.js +7 -6
- package/dist/naming.js.map +1 -1
- package/dist/persistence/db/db-constants.d.ts +23 -0
- package/dist/persistence/db/db-constants.d.ts.map +1 -1
- package/dist/persistence/db/db-constants.js +31 -0
- package/dist/persistence/db/db-constants.js.map +1 -1
- package/dist/persistence/db/db-provider.js +3 -3
- package/dist/persistence/db/db-provider.js.map +1 -1
- package/dist/persistence/db/db-schema.d.ts +8 -0
- package/dist/persistence/db/db-schema.d.ts.map +1 -1
- package/dist/persistence/db/db-schema.js +17 -1
- package/dist/persistence/db/db-schema.js.map +1 -1
- package/dist/persistence/source/meta-source.d.ts +15 -1
- package/dist/persistence/source/meta-source.d.ts.map +1 -1
- package/dist/persistence/source/meta-source.js +55 -3
- package/dist/persistence/source/meta-source.js.map +1 -1
- package/dist/persistence/source/source-constants.d.ts +20 -1
- package/dist/persistence/source/source-constants.d.ts.map +1 -1
- package/dist/persistence/source/source-constants.js +36 -1
- package/dist/persistence/source/source-constants.js.map +1 -1
- package/dist/persistence/source/source-schema.d.ts.map +1 -1
- package/dist/persistence/source/source-schema.js +65 -4
- package/dist/persistence/source/source-schema.js.map +1 -1
- package/dist/persistence/source/validate-source-parameter-ref.d.ts +4 -0
- package/dist/persistence/source/validate-source-parameter-ref.d.ts.map +1 -0
- package/dist/persistence/source/validate-source-parameter-ref.js +96 -0
- package/dist/persistence/source/validate-source-parameter-ref.js.map +1 -0
- package/dist/persistence/source/validate-source-physical-names.d.ts +9 -0
- package/dist/persistence/source/validate-source-physical-names.d.ts.map +1 -0
- package/dist/persistence/source/validate-source-physical-names.js +79 -0
- package/dist/persistence/source/validate-source-physical-names.js.map +1 -0
- package/dist/serializer-json.d.ts.map +1 -1
- package/dist/serializer-json.js +43 -0
- package/dist/serializer-json.js.map +1 -1
- package/dist/template/template-constants.d.ts +9 -0
- package/dist/template/template-constants.d.ts.map +1 -1
- package/dist/template/template-constants.js +20 -0
- package/dist/template/template-constants.js.map +1 -1
- package/dist/template/template-schema.d.ts.map +1 -1
- package/dist/template/template-schema.js +42 -3
- package/dist/template/template-schema.js.map +1 -1
- package/package.json +1 -1
- package/src/attr-schema-validate.ts +70 -0
- package/src/core/field/field-constants.ts +37 -2
- package/src/core/field/field-schema.ts +43 -2
- package/src/core/field/meta-field.ts +39 -0
- package/src/core/field/validate-field-readonly.ts +142 -0
- package/src/core/object/meta-object-aware.ts +27 -0
- package/src/core/object/meta-object.ts +47 -2
- package/src/core/object/object-class-registry.ts +48 -0
- package/src/core/object/object-constants.ts +17 -0
- package/src/core/object/object-schema.ts +29 -1
- package/src/core/object/validate-discriminator.ts +195 -0
- package/src/core/object/value-object.ts +65 -0
- package/src/core/query/query-constants.ts +5 -0
- package/src/core-types.ts +17 -4
- package/src/errors.ts +23 -0
- package/src/index.ts +10 -0
- package/src/loader/meta-data-loader.ts +31 -1
- package/src/loader/validation-passes.ts +161 -0
- package/src/naming.ts +6 -5
- package/src/persistence/db/db-constants.ts +40 -0
- package/src/persistence/db/db-provider.ts +3 -3
- package/src/persistence/db/db-schema.ts +20 -0
- package/src/persistence/source/meta-source.ts +64 -2
- package/src/persistence/source/source-constants.ts +40 -1
- package/src/persistence/source/source-schema.ts +78 -3
- package/src/persistence/source/validate-source-parameter-ref.ts +143 -0
- package/src/persistence/source/validate-source-physical-names.ts +123 -0
- package/src/serializer-json.ts +50 -0
- package/src/template/template-constants.ts +23 -0
- package/src/template/template-schema.ts +49 -2
- package/dist/constants.d.ts +0 -208
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -419
- package/dist/constants.js.map +0 -1
- package/dist/core/file-meta-data-loader.d.ts +0 -18
- package/dist/core/file-meta-data-loader.d.ts.map +0 -1
- package/dist/core/file-meta-data-loader.js +0 -81
- package/dist/core/file-meta-data-loader.js.map +0 -1
- package/dist/core/file-source.d.ts +0 -12
- package/dist/core/file-source.d.ts.map +0 -1
- package/dist/core/file-source.js +0 -46
- package/dist/core/file-source.js.map +0 -1
- package/dist/core-attr-schemas.d.ts +0 -22
- package/dist/core-attr-schemas.d.ts.map +0 -1
- package/dist/core-attr-schemas.js +0 -324
- package/dist/core-attr-schemas.js.map +0 -1
- package/dist/db/db-attr-schemas.d.ts +0 -8
- package/dist/db/db-attr-schemas.d.ts.map +0 -1
- package/dist/db/db-attr-schemas.js +0 -26
- package/dist/db/db-attr-schemas.js.map +0 -1
- package/dist/db/db-provider.d.ts +0 -3
- package/dist/db/db-provider.d.ts.map +0 -1
- package/dist/db/db-provider.js +0 -28
- package/dist/db/db-provider.js.map +0 -1
- package/dist/meta/find-reference.d.ts +0 -22
- package/dist/meta/find-reference.d.ts.map +0 -1
- package/dist/meta/find-reference.js +0 -29
- package/dist/meta/find-reference.js.map +0 -1
- package/dist/meta/meta-attr.d.ts +0 -8
- package/dist/meta/meta-attr.d.ts.map +0 -1
- package/dist/meta/meta-attr.js +0 -17
- package/dist/meta/meta-attr.js.map +0 -1
- package/dist/meta/meta-data.d.ts +0 -107
- package/dist/meta/meta-data.d.ts.map +0 -1
- package/dist/meta/meta-data.js +0 -302
- package/dist/meta/meta-data.js.map +0 -1
- package/dist/meta/meta-field.d.ts +0 -48
- package/dist/meta/meta-field.d.ts.map +0 -1
- package/dist/meta/meta-field.js +0 -94
- package/dist/meta/meta-field.js.map +0 -1
- package/dist/meta/meta-identity.d.ts +0 -71
- package/dist/meta/meta-identity.d.ts.map +0 -1
- package/dist/meta/meta-identity.js +0 -129
- package/dist/meta/meta-identity.js.map +0 -1
- package/dist/meta/meta-layout.d.ts +0 -23
- package/dist/meta/meta-layout.d.ts.map +0 -1
- package/dist/meta/meta-layout.js +0 -45
- package/dist/meta/meta-layout.js.map +0 -1
- package/dist/meta/meta-object.d.ts +0 -40
- package/dist/meta/meta-object.d.ts.map +0 -1
- package/dist/meta/meta-object.js +0 -81
- package/dist/meta/meta-object.js.map +0 -1
- package/dist/meta/meta-origin.d.ts +0 -32
- package/dist/meta/meta-origin.d.ts.map +0 -1
- package/dist/meta/meta-origin.js +0 -55
- package/dist/meta/meta-origin.js.map +0 -1
- package/dist/meta/meta-relationship.d.ts +0 -11
- package/dist/meta/meta-relationship.d.ts.map +0 -1
- package/dist/meta/meta-relationship.js +0 -27
- package/dist/meta/meta-relationship.js.map +0 -1
- package/dist/meta/meta-root.d.ts +0 -12
- package/dist/meta/meta-root.d.ts.map +0 -1
- package/dist/meta/meta-root.js +0 -24
- package/dist/meta/meta-root.js.map +0 -1
- package/dist/meta/meta-source.d.ts +0 -18
- package/dist/meta/meta-source.d.ts.map +0 -1
- package/dist/meta/meta-source.js +0 -31
- package/dist/meta/meta-source.js.map +0 -1
- package/dist/meta/meta-validator.d.ts +0 -29
- package/dist/meta/meta-validator.d.ts.map +0 -1
- package/dist/meta/meta-validator.js +0 -49
- package/dist/meta/meta-validator.js.map +0 -1
- package/dist/meta/meta-view.d.ts +0 -4
- package/dist/meta/meta-view.d.ts.map +0 -1
- package/dist/meta/meta-view.js +0 -8
- package/dist/meta/meta-view.js.map +0 -1
- package/dist/persistence/db/db-attr-schemas.d.ts +0 -8
- package/dist/persistence/db/db-attr-schemas.d.ts.map +0 -1
- package/dist/persistence/db/db-attr-schemas.js +0 -28
- 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":"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"}
|
|
@@ -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;
|
|
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"}
|
package/dist/serializer-json.js
CHANGED
|
@@ -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":"AAAA,6DAA6D;AAC7D,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,8CAA8C;AAC9C,uDAAuD;AACvD,sEAAsE;AAGtE,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;
|
|
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;
|
|
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;
|
|
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
|
-
|
|
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":"AAAA,gEAAgE;AAChE,EAAE;AACF,kFAAkF;AAClF,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,sDAAsD;AAGtD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,0BAA0B,EAC1B,oBAAoB,EACpB,aAAa,
|
|
1
|
+
{"version":3,"file":"template-schema.js","sourceRoot":"","sources":["../../src/template/template-schema.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -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
|
}
|