@metaobjectsdev/runtime-ts 0.14.2 → 0.15.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/extract-object.js +25 -19
- package/dist/extract-object.js.map +1 -1
- package/dist/identity-strategy.d.ts.map +1 -1
- package/dist/identity-strategy.js +4 -2
- package/dist/identity-strategy.js.map +1 -1
- package/dist/n2m-resolver.d.ts.map +1 -1
- package/dist/n2m-resolver.js +11 -7
- package/dist/n2m-resolver.js.map +1 -1
- package/dist/object-manager.d.ts.map +1 -1
- package/dist/object-manager.js +4 -2
- package/dist/object-manager.js.map +1 -1
- package/dist/relation-resolver.d.ts.map +1 -1
- package/dist/relation-resolver.js +21 -12
- package/dist/relation-resolver.js.map +1 -1
- package/dist/tph.d.ts.map +1 -1
- package/dist/tph.js +4 -1
- package/dist/tph.js.map +1 -1
- package/dist/type-coercer.js +9 -4
- package/dist/type-coercer.js.map +1 -1
- package/dist/validator-runner.d.ts.map +1 -1
- package/dist/validator-runner.js +17 -10
- package/dist/validator-runner.js.map +1 -1
- package/dist/view.d.ts.map +1 -1
- package/dist/view.js +14 -9
- package/dist/view.js.map +1 -1
- package/package.json +3 -3
- package/src/extract-object.ts +25 -19
- package/src/identity-strategy.ts +4 -2
- package/src/n2m-resolver.ts +11 -7
- package/src/object-manager.ts +4 -2
- package/src/relation-resolver.ts +21 -12
- package/src/tph.ts +4 -1
- package/src/type-coercer.ts +9 -4
- package/src/validator-runner.ts +17 -10
- package/src/view.ts +14 -9
package/dist/type-coercer.js
CHANGED
|
@@ -33,15 +33,19 @@ export function coerceRowOnWrite(entity, row, dialect) {
|
|
|
33
33
|
function isJsonbObjectField(child) {
|
|
34
34
|
if (child.subType !== FIELD_SUBTYPE_OBJECT)
|
|
35
35
|
return false;
|
|
36
|
-
|
|
36
|
+
// ADR-0039: resolving — @storage may be inherited via extends.
|
|
37
|
+
return child.attr(FIELD_ATTR_STORAGE) !== STORAGE_FLATTENED;
|
|
37
38
|
}
|
|
38
|
-
/** A field explicitly pinned to a JSONB physical column via `@dbColumnType`.
|
|
39
|
+
/** A field explicitly pinned to a JSONB physical column via `@dbColumnType`.
|
|
40
|
+
* ADR-0039: @dbColumnType is the ONE deliberately own-only attr (physical
|
|
41
|
+
* column-type override is never inherited). Keep ownAttr. */
|
|
39
42
|
function isJsonbColumnTypeField(child) {
|
|
40
43
|
return child.ownAttr(FIELD_ATTR_DB_COLUMN_TYPE) === DB_COLUMN_TYPE_JSONB;
|
|
41
44
|
}
|
|
42
45
|
function serializeJsonbColumns(entity, row) {
|
|
43
46
|
let out = null;
|
|
44
|
-
|
|
47
|
+
// ADR-0039: resolving — a jsonb field may be inherited from a base via extends.
|
|
48
|
+
for (const child of entity.children()) {
|
|
45
49
|
if (child.type !== TYPE_FIELD)
|
|
46
50
|
continue;
|
|
47
51
|
if (!isJsonbObjectField(child) && !isJsonbColumnTypeField(child))
|
|
@@ -70,7 +74,8 @@ function serializeJsonbColumns(entity, row) {
|
|
|
70
74
|
*/
|
|
71
75
|
function deserializeJsonbObjectFields(entity, row) {
|
|
72
76
|
let out = null;
|
|
73
|
-
|
|
77
|
+
// ADR-0039: resolving — a jsonb field may be inherited from a base via extends.
|
|
78
|
+
for (const child of entity.children()) {
|
|
74
79
|
if (child.type !== TYPE_FIELD)
|
|
75
80
|
continue;
|
|
76
81
|
if (!isJsonbObjectField(child))
|
package/dist/type-coercer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-coercer.js","sourceRoot":"","sources":["../src/type-coercer.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,8EAA8E;AAC9E,0DAA0D;AAC1D,yEAAyE;AACzE,8EAA8E;AAC9E,6EAA6E;AAC7E,iFAAiF;AACjF,gFAAgF;AAChF,2EAA2E;AAC3E,EAAE;AACF,0EAA0E;AAC1E,+EAA+E;AAC/E,aAAa;AAGb,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,UAAU,eAAe,CAAC,MAAgB,EAAE,GAAQ,EAAE,OAAgB;IAC1E,MAAM,QAAQ,GAAG,4BAA4B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC1C,OAAO,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAgB,EAAE,GAAQ,EAAE,OAAgB;IAC3E,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzD,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAC/C,OAAO,gBAAgB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,KAAe;IACzC,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAoB;QAAE,OAAO,KAAK,CAAC;IACzD,OAAO,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"type-coercer.js","sourceRoot":"","sources":["../src/type-coercer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator-runner.d.ts","sourceRoot":"","sources":["../src/validator-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAWzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC;AAqB/C,MAAM,WAAW,iBAAiB;IAChC,gGAAgG;IAChG,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,GAAE,iBAAsB,GAC3B,gBAAgB,
|
|
1
|
+
{"version":3,"file":"validator-runner.d.ts","sourceRoot":"","sources":["../src/validator-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAWzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC;AAqB/C,MAAM,WAAW,iBAAiB;IAChC,gGAAgG;IAChG,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,GAAE,iBAAsB,GAC3B,gBAAgB,CA4GlB"}
|
package/dist/validator-runner.js
CHANGED
|
@@ -30,7 +30,8 @@ export function runValidators(entity, data, opts = {}) {
|
|
|
30
30
|
// DB will fill them in (e.g. timestamps with `@default: CURRENT_TIMESTAMP`,
|
|
31
31
|
// booleans with `@default: false`).
|
|
32
32
|
const required = isRequired(field);
|
|
33
|
-
|
|
33
|
+
// ADR-0039: effective attr — @default may be inherited via extends.
|
|
34
|
+
const hasDefault = field.attr(FIELD_ATTR_DEFAULT) !== undefined;
|
|
34
35
|
if (required && (value === undefined || value === null)) {
|
|
35
36
|
if (opts.partial && !present)
|
|
36
37
|
continue;
|
|
@@ -51,6 +52,7 @@ export function runValidators(entity, data, opts = {}) {
|
|
|
51
52
|
// string type-check + length checks must NOT fire — they would reject the
|
|
52
53
|
// very value the column is declared to hold. Required-ness (above) still
|
|
53
54
|
// applies; everything else is unconstrained for the open bag.
|
|
55
|
+
// ADR-0039: @dbColumnType is the ONE deliberately own-only attr (physical, never inherited).
|
|
54
56
|
if (field.subType === FIELD_SUBTYPE_STRING && field.ownAttr(FIELD_ATTR_DB_COLUMN_TYPE) === DB_COLUMN_TYPE_JSONB) {
|
|
55
57
|
continue;
|
|
56
58
|
}
|
|
@@ -87,12 +89,14 @@ export function runValidators(entity, data, opts = {}) {
|
|
|
87
89
|
});
|
|
88
90
|
}
|
|
89
91
|
}
|
|
90
|
-
|
|
92
|
+
// ADR-0039: effective children — a validator may be inherited via extends.
|
|
93
|
+
for (const child of field.children()) {
|
|
91
94
|
if (child.type !== TYPE_VALIDATOR)
|
|
92
95
|
continue;
|
|
93
96
|
if (child.subType !== VALIDATOR_SUBTYPE_REGEX)
|
|
94
97
|
continue;
|
|
95
|
-
|
|
98
|
+
// ADR-0039: effective attr — @pattern may be inherited.
|
|
99
|
+
const pattern = child.attr(VALIDATOR_ATTR_PATTERN);
|
|
96
100
|
if (typeof pattern !== "string")
|
|
97
101
|
continue;
|
|
98
102
|
if (typeof value !== "string")
|
|
@@ -124,36 +128,39 @@ export function runValidators(entity, data, opts = {}) {
|
|
|
124
128
|
return errors.length === 0 ? { ok: true } : { ok: false, errors };
|
|
125
129
|
}
|
|
126
130
|
function isRequired(field) {
|
|
127
|
-
|
|
131
|
+
// ADR-0039: effective — @required and a required-validator may be inherited via extends.
|
|
132
|
+
if (field.attr(FIELD_ATTR_REQUIRED) === true)
|
|
128
133
|
return true;
|
|
129
|
-
for (const child of field.
|
|
134
|
+
for (const child of field.children()) {
|
|
130
135
|
if (child.type === TYPE_VALIDATOR && child.subType === VALIDATOR_SUBTYPE_REQUIRED)
|
|
131
136
|
return true;
|
|
132
137
|
}
|
|
133
138
|
return false;
|
|
134
139
|
}
|
|
135
140
|
function resolveMaxLength(field) {
|
|
136
|
-
|
|
141
|
+
// ADR-0039: effective — @maxLength and a length-validator may be inherited via extends.
|
|
142
|
+
const attr = field.attr(FIELD_ATTR_MAX_LENGTH);
|
|
137
143
|
if (typeof attr === "number")
|
|
138
144
|
return attr;
|
|
139
|
-
for (const child of field.
|
|
145
|
+
for (const child of field.children()) {
|
|
140
146
|
if (child.type !== TYPE_VALIDATOR)
|
|
141
147
|
continue;
|
|
142
148
|
if (child.subType !== VALIDATOR_SUBTYPE_LENGTH)
|
|
143
149
|
continue;
|
|
144
|
-
const max = child.
|
|
150
|
+
const max = child.attr(VALIDATOR_ATTR_MAX);
|
|
145
151
|
if (typeof max === "number")
|
|
146
152
|
return max;
|
|
147
153
|
}
|
|
148
154
|
return undefined;
|
|
149
155
|
}
|
|
150
156
|
function resolveMinLength(field) {
|
|
151
|
-
|
|
157
|
+
// ADR-0039: effective — a length-validator may be inherited via extends.
|
|
158
|
+
for (const child of field.children()) {
|
|
152
159
|
if (child.type !== TYPE_VALIDATOR)
|
|
153
160
|
continue;
|
|
154
161
|
if (child.subType !== VALIDATOR_SUBTYPE_LENGTH)
|
|
155
162
|
continue;
|
|
156
|
-
const min = child.
|
|
163
|
+
const min = child.attr(VALIDATOR_ATTR_MIN);
|
|
157
164
|
if (typeof min === "number")
|
|
158
165
|
return min;
|
|
159
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator-runner.js","sourceRoot":"","sources":["../src/validator-runner.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,6CAA6C;AAG7C,OAAO,EACL,UAAU,EAAE,cAAc,EAC1B,0BAA0B,EAAE,wBAAwB,EAAE,uBAAuB,EAC7E,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAC3D,oBAAoB,EAAE,mBAAmB,EAAE,sBAAsB,EACjE,qBAAqB,EAAE,kBAAkB,EACzC,mBAAmB,EAAE,qBAAqB,EAAE,kBAAkB,EAC9D,yBAAyB,EAAE,oBAAoB,EAC/C,kBAAkB,EAAE,kBAAkB,EAAE,sBAAsB,GAC/D,MAAM,0BAA0B,CAAC;AAOlC,2EAA2E;AAC3E,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAS;IAC7C,iBAAiB;IACjB,oBAAoB,EAAE,mBAAmB;CAC1C,CAAC,CAAC;AAEH,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,oEAAoE;AACpE,kFAAkF;AAClF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS;IAC3C,kBAAkB,EAAE,sBAAsB;CAC3C,CAAC,CAAC;AAEH,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,eAAe,GAAG,SAAS,CAAC;AAOlC,MAAM,UAAU,aAAa,CAC3B,MAAgB,EAChB,IAA6B,EAC7B,OAA0B,EAAE;IAE5B,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,2EAA2E;IAC3E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/B,kGAAkG;QAClG,wEAAwE;QACxE,4EAA4E;QAC5E,oCAAoC;QACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"validator-runner.js","sourceRoot":"","sources":["../src/validator-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAQzD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAQzD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAU3E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAwBzG;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAejF"}
|
package/dist/view.js
CHANGED
|
@@ -2,25 +2,28 @@ import { TYPE_FIELD, TYPE_VIEW, TYPE_VALIDATOR, VALIDATOR_SUBTYPE_REQUIRED, FIEL
|
|
|
2
2
|
import { MetadataError } from "./errors.js";
|
|
3
3
|
export function viewFieldNames(entity, viewName) {
|
|
4
4
|
const names = [];
|
|
5
|
-
|
|
5
|
+
// ADR-0039: effective children — fields and their views may be inherited via extends.
|
|
6
|
+
for (const field of entity.children()) {
|
|
6
7
|
if (field.type !== TYPE_FIELD)
|
|
7
8
|
continue;
|
|
8
|
-
if (field.
|
|
9
|
+
if (field.children().some((c) => c.type === TYPE_VIEW && c.name === viewName)) {
|
|
9
10
|
names.push(field.name);
|
|
10
11
|
}
|
|
11
12
|
}
|
|
12
13
|
return names;
|
|
13
14
|
}
|
|
14
15
|
export function fieldViewSpec(entity, fieldName, viewName) {
|
|
15
|
-
|
|
16
|
+
// ADR-0039: effective children — a field and its view may be inherited via extends.
|
|
17
|
+
const field = entity.children().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
|
|
16
18
|
if (!field)
|
|
17
19
|
return null;
|
|
18
|
-
const view = field.
|
|
20
|
+
const view = field.children().find((c) => c.type === TYPE_VIEW && c.name === viewName);
|
|
19
21
|
if (!view)
|
|
20
22
|
return null;
|
|
21
23
|
const attrs = {};
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
// ADR-0039: effective attrs — a view's attrs may be inherited via its extends.
|
|
25
|
+
for (const key of view.attrs().keys()) {
|
|
26
|
+
attrs[key] = view.attr(key);
|
|
24
27
|
}
|
|
25
28
|
const required = isFieldRequired(field);
|
|
26
29
|
const result = {
|
|
@@ -36,7 +39,8 @@ export function fieldViewSpec(entity, fieldName, viewName) {
|
|
|
36
39
|
}
|
|
37
40
|
export function entityViewSpec(entity, viewName) {
|
|
38
41
|
const fields = [];
|
|
39
|
-
|
|
42
|
+
// ADR-0039: effective children — fields may be inherited via extends.
|
|
43
|
+
for (const field of entity.children()) {
|
|
40
44
|
if (field.type !== TYPE_FIELD)
|
|
41
45
|
continue;
|
|
42
46
|
const spec = fieldViewSpec(entity, field.name, viewName);
|
|
@@ -49,9 +53,10 @@ export function entityViewSpec(entity, viewName) {
|
|
|
49
53
|
return { entityName: entity.name, viewName, fields };
|
|
50
54
|
}
|
|
51
55
|
function isFieldRequired(field) {
|
|
52
|
-
|
|
56
|
+
// ADR-0039: effective — @required and a required-validator may be inherited via extends.
|
|
57
|
+
if (field.attr(FIELD_ATTR_REQUIRED) === true)
|
|
53
58
|
return true;
|
|
54
|
-
for (const child of field.
|
|
59
|
+
for (const child of field.children()) {
|
|
55
60
|
if (child.type === TYPE_VALIDATOR && child.subType === VALIDATOR_SUBTYPE_REQUIRED)
|
|
56
61
|
return true;
|
|
57
62
|
}
|
package/dist/view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EAAE,SAAS,EAAE,cAAc,EACrC,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkB5C,MAAM,UAAU,cAAc,CAAC,MAAgB,EAAE,QAAgB;IAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaobjectsdev/runtime-ts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Node-side runtime helpers for MetaObjects: Fastify route builders, Drizzle filter/sort integration, Kysely drivers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"access": "public"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@metaobjectsdev/metadata": "0.
|
|
68
|
-
"@metaobjectsdev/render": "0.
|
|
67
|
+
"@metaobjectsdev/metadata": "0.15.0",
|
|
68
|
+
"@metaobjectsdev/render": "0.15.0",
|
|
69
69
|
"qs": "^6.13.0"
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
package/src/extract-object.ts
CHANGED
|
@@ -150,10 +150,10 @@ function fieldSpecFor(
|
|
|
150
150
|
if (field.subType === FIELD_SUBTYPE_ENUM) {
|
|
151
151
|
const values = enumValues(field);
|
|
152
152
|
const aliases = enumAliases(field);
|
|
153
|
-
const cd =
|
|
154
|
-
const dv =
|
|
153
|
+
const cd = attrString(field, FIELD_ATTR_COERCE_DEFAULT);
|
|
154
|
+
const dv = attrString(field, FIELD_ATTR_DEFAULT);
|
|
155
155
|
const normalize = resolveNormalize(field, owner);
|
|
156
|
-
const build = field.
|
|
156
|
+
const build = field.resolvedIsArray() ? enumArray : enumField;
|
|
157
157
|
return build(name, required, values, aliases, cd, normalize, dv);
|
|
158
158
|
}
|
|
159
159
|
|
|
@@ -166,18 +166,18 @@ function fieldSpecFor(
|
|
|
166
166
|
return scalar(name, FieldKind.STRING, required);
|
|
167
167
|
}
|
|
168
168
|
const nested = extractSchemaForInner(ref, format, visited, depth + 1);
|
|
169
|
-
return object(name, required, field.
|
|
169
|
+
return object(name, required, field.resolvedIsArray(), nested);
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
// --- Scalar (carry generalized @default) ----------------------------------
|
|
173
173
|
const kind = scalarKind(field.subType);
|
|
174
|
-
const dv =
|
|
175
|
-
if (field.
|
|
174
|
+
const dv = attrString(field, FIELD_ATTR_DEFAULT);
|
|
175
|
+
if (field.resolvedIsArray()) {
|
|
176
176
|
// Scalar array: the engine coerces each element; no per-element default fill.
|
|
177
177
|
return scalarArray(name, kind, required);
|
|
178
178
|
}
|
|
179
179
|
// @xmlText: a (non-array) scalar field marked to receive its element's XML text content.
|
|
180
|
-
if (
|
|
180
|
+
if (attrString(field, FIELD_ATTR_XML_TEXT) === "true") {
|
|
181
181
|
return textContentField(name, kind, required);
|
|
182
182
|
}
|
|
183
183
|
// Numeric range: source the bound from the field's numeric validator (@min/@max) — the single
|
|
@@ -242,7 +242,7 @@ function assembleInner(
|
|
|
242
242
|
const ref = resolveObjectRef(field);
|
|
243
243
|
const cyclicOrDeep = ref === undefined || visited.has(ref) || depth + 1 >= MAX_NEST_DEPTH;
|
|
244
244
|
|
|
245
|
-
if (field.
|
|
245
|
+
if (field.resolvedIsArray()) {
|
|
246
246
|
// Array-of-objects: map each element record -> assembled child.
|
|
247
247
|
if (Array.isArray(value)) {
|
|
248
248
|
const children: object[] = [];
|
|
@@ -303,23 +303,26 @@ function scalarKind(subType: string): FieldKind {
|
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
305
|
|
|
306
|
-
/** True iff `@required` is explicitly true (or the string "true").
|
|
306
|
+
/** True iff `@required` is explicitly true (or the string "true").
|
|
307
|
+
* ADR-0039: resolving — @required may be inherited via extends. */
|
|
307
308
|
function isRequired(field: MetaField): boolean {
|
|
308
|
-
const v = field.
|
|
309
|
+
const v = field.attr(FIELD_ATTR_REQUIRED);
|
|
309
310
|
if (v === true) return true;
|
|
310
311
|
return typeof v === "string" && v.toLowerCase() === "true";
|
|
311
312
|
}
|
|
312
313
|
|
|
313
|
-
/** The string members of an enum field's `@values` attr (empty when absent).
|
|
314
|
+
/** The string members of an enum field's `@values` attr (empty when absent).
|
|
315
|
+
* ADR-0039: resolving — @values may be inherited from an abstract enum base via extends. */
|
|
314
316
|
function enumValues(field: MetaField): string[] {
|
|
315
|
-
const v = field.
|
|
317
|
+
const v = field.attr(FIELD_ATTR_VALUES);
|
|
316
318
|
if (Array.isArray(v)) return v.map((e) => String(e));
|
|
317
319
|
return [];
|
|
318
320
|
}
|
|
319
321
|
|
|
320
|
-
/** The `@enumAlias` map (an object literal) of an enum field, or {} when absent/empty.
|
|
322
|
+
/** The `@enumAlias` map (an object literal) of an enum field, or {} when absent/empty.
|
|
323
|
+
* ADR-0039: resolving — @enumAlias may be inherited via extends. */
|
|
321
324
|
function enumAliases(field: MetaField): Record<string, string> {
|
|
322
|
-
const raw = field.
|
|
325
|
+
const raw = field.attr(FIELD_ATTR_ENUM_ALIAS);
|
|
323
326
|
if (raw == null || typeof raw !== "object" || Array.isArray(raw)) return {};
|
|
324
327
|
const out: Record<string, string> = {};
|
|
325
328
|
for (const [k, val] of Object.entries(raw as Record<string, unknown>)) {
|
|
@@ -341,13 +344,16 @@ function resolveNormalize(field: MetaField, owner: MetaObject | null): Normalize
|
|
|
341
344
|
}
|
|
342
345
|
|
|
343
346
|
function normalizeAttrOf(node: MetaData): NormalizeMode | null {
|
|
344
|
-
|
|
347
|
+
// ADR-0039: resolving — @normalize may be inherited via extends.
|
|
348
|
+
const v = node.attr(FIELD_ATTR_NORMALIZE);
|
|
345
349
|
return typeof v === "string" && v.length > 0 ? (v as NormalizeMode) : null;
|
|
346
350
|
}
|
|
347
351
|
|
|
348
|
-
/** The
|
|
349
|
-
|
|
350
|
-
|
|
352
|
+
/** The effective string value of an attr on a node, or null when absent/empty.
|
|
353
|
+
* ADR-0039: resolving — extract config attrs (@default/@coerceDefault/@xmlText/
|
|
354
|
+
* @objectRef) may be inherited via extends. */
|
|
355
|
+
function attrString(node: MetaData, attr: string): string | null {
|
|
356
|
+
const v = node.attr(attr);
|
|
351
357
|
if (typeof v === "string") return v.length > 0 ? v : null;
|
|
352
358
|
return v == null ? null : String(v);
|
|
353
359
|
}
|
|
@@ -358,7 +364,7 @@ function ownAttrString(node: MetaData, attr: string): string | null {
|
|
|
358
364
|
* name after the last package separator. Returns undefined when unresolvable (→ opaque-leaf guard).
|
|
359
365
|
*/
|
|
360
366
|
function resolveObjectRef(field: MetaField): MetaObject | undefined {
|
|
361
|
-
const ref =
|
|
367
|
+
const ref = attrString(field, FIELD_ATTR_OBJECT_REF) ?? field.objectRef;
|
|
362
368
|
if (ref === undefined || ref === null) return undefined;
|
|
363
369
|
const root = field.root();
|
|
364
370
|
if (!(root instanceof MetaRoot)) return undefined;
|
package/src/identity-strategy.ts
CHANGED
|
@@ -27,7 +27,8 @@ export function resolveIdentity(entity: MetaData, data: Record<string, unknown>)
|
|
|
27
27
|
{ entity: entity.name },
|
|
28
28
|
);
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
// ADR-0039: effective attr — @fields may be inherited via the identity's extends.
|
|
31
|
+
const fieldsAttr = primary.attr(IDENTITY_ATTR_FIELDS);
|
|
31
32
|
if (!Array.isArray(fieldsAttr) || fieldsAttr.length === 0) {
|
|
32
33
|
throw new MetadataError(
|
|
33
34
|
`Entity '${entity.name}' primary identity has no @fields`,
|
|
@@ -36,7 +37,8 @@ export function resolveIdentity(entity: MetaData, data: Record<string, unknown>)
|
|
|
36
37
|
}
|
|
37
38
|
const pkFields = fieldsAttr.map(String);
|
|
38
39
|
const isComposite = pkFields.length > 1;
|
|
39
|
-
|
|
40
|
+
// ADR-0039: effective attr — @generation may be inherited via the identity's extends.
|
|
41
|
+
const generation = primary.attr(IDENTITY_ATTR_GENERATION);
|
|
40
42
|
|
|
41
43
|
if (isComposite || generation === undefined || generation === GENERATION_ASSIGNED) {
|
|
42
44
|
const missing = pkFields.filter((f) => data[f] === undefined || data[f] === null);
|
package/src/n2m-resolver.ts
CHANGED
|
@@ -59,15 +59,17 @@ export function resolveN2mDescriptor(
|
|
|
59
59
|
relationName: string,
|
|
60
60
|
root: MetaData,
|
|
61
61
|
): N2mDescriptor | null {
|
|
62
|
-
|
|
62
|
+
// ADR-0039: effective children — a relationship may be inherited via extends.
|
|
63
|
+
for (const child of sourceEntity.children()) {
|
|
63
64
|
if (child.type !== TYPE_RELATIONSHIP) continue;
|
|
64
65
|
if (child.name !== relationName) continue;
|
|
65
|
-
|
|
66
|
-
if (child.
|
|
66
|
+
// ADR-0039: effective attrs — @cardinality/@through/@objectRef may be inherited.
|
|
67
|
+
if (child.attr(RELATIONSHIP_ATTR_CARDINALITY) !== CARDINALITY_MANY) continue;
|
|
68
|
+
if (child.attr(RELATIONSHIP_ATTR_THROUGH) === undefined) continue; // 1:N many — not M:N.
|
|
67
69
|
|
|
68
70
|
const rel = child as MetaRelationship;
|
|
69
|
-
const targetEntityName = rel.
|
|
70
|
-
const joinEntityName = rel.
|
|
71
|
+
const targetEntityName = rel.attr(RELATIONSHIP_ATTR_OBJECT_REF) as string | undefined;
|
|
72
|
+
const joinEntityName = rel.attr(RELATIONSHIP_ATTR_THROUGH) as string | undefined;
|
|
71
73
|
if (!targetEntityName || !joinEntityName) {
|
|
72
74
|
throw new MetadataError(
|
|
73
75
|
`M:N relationship '${relationName}' on '${sourceEntity.name}' requires @objectRef + @through`,
|
|
@@ -166,7 +168,8 @@ function inOrEq(column: string, ids: PrimitiveValue[]): WhereClause {
|
|
|
166
168
|
}
|
|
167
169
|
|
|
168
170
|
function mustGetEntity(root: MetaData, name: string): MetaData {
|
|
169
|
-
|
|
171
|
+
// ADR-0039: effective children — resolve rather than rely on root being unextended.
|
|
172
|
+
const e = root.children().find((c) => c.type === TYPE_OBJECT && c.name === name);
|
|
170
173
|
if (!e) throw new MetadataError(`Entity '${name}' not found`, { entity: name });
|
|
171
174
|
return e;
|
|
172
175
|
}
|
|
@@ -240,7 +243,8 @@ export function resolveJoinColumnName(
|
|
|
240
243
|
joinEntity: MetaData, fieldName: string,
|
|
241
244
|
strategy: ColumnNamingStrategy = DEFAULT_COLUMN_NAMING_STRATEGY,
|
|
242
245
|
): string {
|
|
243
|
-
|
|
246
|
+
// ADR-0039: effective children — a junction field may be inherited via extends.
|
|
247
|
+
const field = joinEntity.children().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
|
|
244
248
|
if (!field) throw new MetadataError(`Join field '${fieldName}' not on '${joinEntity.name}'`);
|
|
245
249
|
return resolveColumnName(field, strategy);
|
|
246
250
|
}
|
package/src/object-manager.ts
CHANGED
|
@@ -455,7 +455,8 @@ export class ObjectManager {
|
|
|
455
455
|
{ value: entityName },
|
|
456
456
|
);
|
|
457
457
|
}
|
|
458
|
-
|
|
458
|
+
// ADR-0039: effective children — resolve rather than rely on root being unextended.
|
|
459
|
+
const entity = this.metadata.children().find((c) => c.type === TYPE_OBJECT && c.name === entityName);
|
|
459
460
|
if (!entity) {
|
|
460
461
|
throw new MetadataError(`Unknown entity '${entityName}'`, { entity: entityName });
|
|
461
462
|
}
|
|
@@ -499,7 +500,8 @@ const NUMERIC_SUBTYPES = new Set([
|
|
|
499
500
|
|
|
500
501
|
// decodeRef always returns strings; numeric PK fields need coercion back to number.
|
|
501
502
|
function coercePkValue(entity: MetaData, fieldName: string, rawValue: string): string | number {
|
|
502
|
-
|
|
503
|
+
// ADR-0039: resolving — the PK field may be inherited from a BaseEntity via extends.
|
|
504
|
+
const field = entity.children().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
|
|
503
505
|
if (field && NUMERIC_SUBTYPES.has(field.subType)) {
|
|
504
506
|
const n = Number(rawValue);
|
|
505
507
|
if (!Number.isNaN(n)) return n;
|
package/src/relation-resolver.ts
CHANGED
|
@@ -30,15 +30,17 @@ export interface RelationDescriptor {
|
|
|
30
30
|
* Returns the FK field name (first field on the identity) or undefined.
|
|
31
31
|
*/
|
|
32
32
|
function findReferenceFkField(holder: MetaData, targetName: string): string | undefined {
|
|
33
|
-
|
|
33
|
+
// ADR-0039: effective children — an identity.reference may be inherited via extends.
|
|
34
|
+
for (const child of holder.children()) {
|
|
34
35
|
if (child.type !== TYPE_IDENTITY) continue;
|
|
35
36
|
if (child.subType !== IDENTITY_SUBTYPE_REFERENCE) continue;
|
|
36
|
-
|
|
37
|
+
// ADR-0039: effective attrs — @references/@fields may be inherited.
|
|
38
|
+
const ref = child.attr(IDENTITY_REFERENCE_ATTR_REFERENCES);
|
|
37
39
|
if (typeof ref !== "string") continue;
|
|
38
40
|
const dotIdx = ref.indexOf(".");
|
|
39
41
|
const entityName = dotIdx === -1 ? ref : ref.slice(0, dotIdx);
|
|
40
42
|
if (entityName !== targetName) continue;
|
|
41
|
-
const fields = child.
|
|
43
|
+
const fields = child.attr(IDENTITY_ATTR_FIELDS);
|
|
42
44
|
if (Array.isArray(fields) && fields.length > 0) return String(fields[0]);
|
|
43
45
|
if (typeof fields === "string") {
|
|
44
46
|
const first = fields.split(",")[0]?.trim();
|
|
@@ -61,12 +63,14 @@ export function resolveRelationDescriptor(
|
|
|
61
63
|
relationName: string,
|
|
62
64
|
root: MetaData,
|
|
63
65
|
): RelationDescriptor {
|
|
64
|
-
|
|
66
|
+
// ADR-0039: effective children — a relationship may be inherited via extends.
|
|
67
|
+
for (const child of sourceEntity.children()) {
|
|
65
68
|
if (child.type !== TYPE_RELATIONSHIP) continue;
|
|
66
69
|
if (child.name !== relationName) continue;
|
|
67
|
-
|
|
70
|
+
// ADR-0039: effective attrs — @cardinality/@objectRef may be inherited.
|
|
71
|
+
const card = child.attr(RELATIONSHIP_ATTR_CARDINALITY);
|
|
68
72
|
if (card !== CARDINALITY_ONE) continue;
|
|
69
|
-
const targetEntityName = child.
|
|
73
|
+
const targetEntityName = child.attr(RELATIONSHIP_ATTR_OBJECT_REF) as string | undefined;
|
|
70
74
|
if (!targetEntityName) {
|
|
71
75
|
throw new MetadataError(
|
|
72
76
|
`Relationship '${relationName}' on '${sourceEntity.name}' missing @objectRef`,
|
|
@@ -80,7 +84,8 @@ export function resolveRelationDescriptor(
|
|
|
80
84
|
{ entity: sourceEntity.name },
|
|
81
85
|
);
|
|
82
86
|
}
|
|
83
|
-
|
|
87
|
+
// ADR-0039: effective children — resolve rather than rely on root being unextended.
|
|
88
|
+
const target = root.children().find((c) => c.type === TYPE_OBJECT && c.name === targetEntityName);
|
|
84
89
|
if (!target) {
|
|
85
90
|
throw new MetadataError(
|
|
86
91
|
`Target entity '${targetEntityName}' not found for relation '${relationName}' on '${sourceEntity.name}'`,
|
|
@@ -95,14 +100,17 @@ export function resolveRelationDescriptor(
|
|
|
95
100
|
};
|
|
96
101
|
}
|
|
97
102
|
|
|
98
|
-
|
|
103
|
+
// ADR-0039: effective children — resolve rather than rely on root being unextended.
|
|
104
|
+
for (const other of root.children()) {
|
|
99
105
|
if (other.type !== TYPE_OBJECT) continue;
|
|
100
106
|
if (other.name === sourceEntity.name) continue;
|
|
101
|
-
|
|
107
|
+
// ADR-0039: effective children — a relationship may be inherited via extends.
|
|
108
|
+
for (const child of other.children()) {
|
|
102
109
|
if (child.type !== TYPE_RELATIONSHIP) continue;
|
|
103
|
-
|
|
110
|
+
// ADR-0039: effective attrs — @cardinality/@objectRef may be inherited.
|
|
111
|
+
const card = child.attr(RELATIONSHIP_ATTR_CARDINALITY);
|
|
104
112
|
if (card !== CARDINALITY_ONE) continue;
|
|
105
|
-
const targetEntityName = child.
|
|
113
|
+
const targetEntityName = child.attr(RELATIONSHIP_ATTR_OBJECT_REF) as string | undefined;
|
|
106
114
|
if (targetEntityName !== sourceEntity.name) continue;
|
|
107
115
|
const inverseName = inversePluralName(other.name);
|
|
108
116
|
if (inverseName !== relationName) continue;
|
|
@@ -168,7 +176,8 @@ export function buildIncludeBatchSpec(
|
|
|
168
176
|
}
|
|
169
177
|
|
|
170
178
|
function mustGetEntity(root: MetaData, name: string): MetaData {
|
|
171
|
-
|
|
179
|
+
// ADR-0039: effective children — resolve rather than rely on root being unextended.
|
|
180
|
+
const e = root.children().find((c) => c.type === TYPE_OBJECT && c.name === name);
|
|
172
181
|
if (!e) throw new MetadataError(`Entity '${name}' not found`, { entity: name });
|
|
173
182
|
return e;
|
|
174
183
|
}
|
package/src/tph.ts
CHANGED
|
@@ -30,12 +30,15 @@ export interface TphSubtype {
|
|
|
30
30
|
* from an ancestor in its resolved super chain.
|
|
31
31
|
*/
|
|
32
32
|
export function tphSubtypeOf(entity: MetaData): TphSubtype | null {
|
|
33
|
-
|
|
33
|
+
// ADR-0039: effective attr — @discriminatorValue may be inherited (sub-subtype).
|
|
34
|
+
const value = entity.attr(OBJECT_ATTR_DISCRIMINATOR_VALUE);
|
|
34
35
|
if (value === undefined || value === null) return null;
|
|
35
36
|
|
|
36
37
|
// Walk the resolved super chain to find the @discriminator-bearing ancestor.
|
|
37
38
|
let ancestor: MetaData | undefined = entity.superResolved;
|
|
38
39
|
while (ancestor !== undefined) {
|
|
40
|
+
// ADR-0039 category 3: super-resolution walk — read each ancestor's OWN
|
|
41
|
+
// @discriminator as we ascend (this manual walk IS the resolution).
|
|
39
42
|
const field = ancestor.ownAttr(OBJECT_ATTR_DISCRIMINATOR);
|
|
40
43
|
if (field !== undefined && field !== null) {
|
|
41
44
|
return { field: String(field), value: String(value) };
|
package/src/type-coercer.ts
CHANGED
|
@@ -45,17 +45,21 @@ export function coerceRowOnWrite(entity: MetaData, row: Row, dialect: Dialect):
|
|
|
45
45
|
*/
|
|
46
46
|
function isJsonbObjectField(child: MetaData): boolean {
|
|
47
47
|
if (child.subType !== FIELD_SUBTYPE_OBJECT) return false;
|
|
48
|
-
|
|
48
|
+
// ADR-0039: resolving — @storage may be inherited via extends.
|
|
49
|
+
return child.attr(FIELD_ATTR_STORAGE) !== STORAGE_FLATTENED;
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
/** A field explicitly pinned to a JSONB physical column via `@dbColumnType`.
|
|
52
|
+
/** A field explicitly pinned to a JSONB physical column via `@dbColumnType`.
|
|
53
|
+
* ADR-0039: @dbColumnType is the ONE deliberately own-only attr (physical
|
|
54
|
+
* column-type override is never inherited). Keep ownAttr. */
|
|
52
55
|
function isJsonbColumnTypeField(child: MetaData): boolean {
|
|
53
56
|
return child.ownAttr(FIELD_ATTR_DB_COLUMN_TYPE) === DB_COLUMN_TYPE_JSONB;
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
function serializeJsonbColumns(entity: MetaData, row: Row): Row {
|
|
57
60
|
let out: Row | null = null;
|
|
58
|
-
|
|
61
|
+
// ADR-0039: resolving — a jsonb field may be inherited from a base via extends.
|
|
62
|
+
for (const child of entity.children()) {
|
|
59
63
|
if (child.type !== TYPE_FIELD) continue;
|
|
60
64
|
if (!isJsonbObjectField(child) && !isJsonbColumnTypeField(child)) continue;
|
|
61
65
|
if (!(child.name in row)) continue;
|
|
@@ -81,7 +85,8 @@ function serializeJsonbColumns(entity: MetaData, row: Row): Row {
|
|
|
81
85
|
*/
|
|
82
86
|
function deserializeJsonbObjectFields(entity: MetaData, row: Row): Row {
|
|
83
87
|
let out: Row | null = null;
|
|
84
|
-
|
|
88
|
+
// ADR-0039: resolving — a jsonb field may be inherited from a base via extends.
|
|
89
|
+
for (const child of entity.children()) {
|
|
85
90
|
if (child.type !== TYPE_FIELD) continue;
|
|
86
91
|
if (!isJsonbObjectField(child)) continue;
|
|
87
92
|
if (!(child.name in row)) continue;
|