@metaobjectsdev/runtime-ts 0.14.2 → 0.15.0-rc.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.
@@ -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
- return child.ownAttr(FIELD_ATTR_STORAGE) !== STORAGE_FLATTENED;
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
- for (const child of entity.ownChildren()) {
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
- for (const child of entity.ownChildren()) {
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))
@@ -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,OAAO,CAAC,kBAAkB,CAAC,KAAK,iBAAiB,CAAC;AACjE,CAAC;AAED,gFAAgF;AAChF,SAAS,sBAAsB,CAAC,KAAe;IAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,oBAAoB,CAAC;AAC3E,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAgB,EAAE,GAAQ;IACvD,IAAI,GAAG,GAAe,IAAI,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACxC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;YAAE,SAAS;QAC3E,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;YAAE,SAAS;QACnC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,6EAA6E;QAC7E,yEAAyE;QACzE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QACrE,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC;QACnB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,CAAC;AACpB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,4BAA4B,CAAC,MAAgB,EAAE,GAAQ;IAC9D,IAAI,GAAG,GAAe,IAAI,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACxC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAAE,SAAS;QACzC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;YAAE,SAAS;QACnC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC;YACnB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAgB,EAAE,GAAQ;IACpD,MAAM,GAAG,GAAQ,EAAE,GAAG,GAAG,EAAE,CAAC;IAC5B,4EAA4E;IAC5E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACxC,IAAI,KAAK,CAAC,OAAO,KAAK,qBAAqB;YAAE,SAAS;QACtD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;aAChC,IAAI,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAgB,EAAE,GAAQ;IAClD,MAAM,GAAG,GAAQ,EAAE,GAAG,GAAG,EAAE,CAAC;IAC5B,4EAA4E;IAC5E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACxC,IAAI,KAAK,CAAC,OAAO,KAAK,qBAAqB;YAAE,SAAS;QACtD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC/B,IAAI,CAAC,KAAK,KAAK;YAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,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,CAwGlB"}
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"}
@@ -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
- const hasDefault = field.ownAttr(FIELD_ATTR_DEFAULT) !== undefined;
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
- for (const child of field.ownChildren()) {
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
- const pattern = child.ownAttr(VALIDATOR_ATTR_PATTERN);
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
- if (field.ownAttr(FIELD_ATTR_REQUIRED) === true)
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.ownChildren()) {
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
- const attr = field.ownAttr(FIELD_ATTR_MAX_LENGTH);
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.ownChildren()) {
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.ownAttr(VALIDATOR_ATTR_MAX);
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
- for (const child of field.ownChildren()) {
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.ownAttr(VALIDATOR_ATTR_MIN);
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,OAAO,CAAC,kBAAkB,CAAC,KAAK,SAAS,CAAC;QACnE,IAAI,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YACxD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvC,IAAI,UAAU;gBAAE,SAAS;YACzB,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,eAAe;aACvC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAEpD,6EAA6E;QAC7E,wEAAwE;QACxE,uEAAuE;QACvE,0EAA0E;QAC1E,yEAAyE;QACzE,8DAA8D;QAC9D,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAoB,IAAI,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,oBAAoB,EAAE,CAAC;YAChH,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,SAAS;gBAClB,QAAQ,EAAE,KAAK,CAAC,OAAO;gBACvB,QAAQ,EAAE,OAAO,KAAK;aACvB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,qBAAqB,MAAM,eAAe,KAAK,CAAC,MAAM,GAAG;oBAChF,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;oBACzB,QAAQ,EAAE,KAAK,CAAC,MAAM;iBACvB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,sBAAsB,MAAM,eAAe,KAAK,CAAC,MAAM,GAAG;oBACjF,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;oBACzB,QAAQ,EAAE,KAAK,CAAC,MAAM;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;gBAAE,SAAS;YAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,uBAAuB;gBAAE,SAAS;YACxD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YACtD,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,SAAS;YAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YACxC,IAAI,KAAa,CAAC;YAClB,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,uCAAuC,OAAO,EAAE;oBACvE,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,mCAAmC;oBAC1D,QAAQ,EAAE,OAAO;oBACjB,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,UAAU,CAAC,KAAe;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,KAAK,0BAA0B;YAAE,OAAO,IAAI,CAAC;IACjG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAe;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,wBAAwB;YAAE,SAAS;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAe;IACvC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,wBAAwB;YAAE,SAAS;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,KAAc;IAChD,IAAI,OAAO,KAAK,oBAAoB,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACvE,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,iBAAiB,CAAC;IAC1D,CAAC;SAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,iBAAiB,CAAC;IAC1D,CAAC;SAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,4EAA4E;QAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1E,OAAO,+DAA+D,CAAC;IACzE,CAAC;SAAM,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;QAC7C,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,kBAAkB,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"validator-runner.js","sourceRoot":"","sources":["../src/validator-runner.ts"],"names":[],"mappings":"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"}
@@ -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,CAS3E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAsBzG;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAcjF"}
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
- for (const field of entity.ownChildren()) {
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.ownChildren().some((c) => c.type === TYPE_VIEW && c.name === viewName)) {
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
- const field = entity.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
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.ownChildren().find((c) => c.type === TYPE_VIEW && c.name === viewName);
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
- for (const key of view.ownAttrs().keys()) {
23
- attrs[key] = view.ownAttr(key);
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
- for (const field of entity.ownChildren()) {
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
- if (field.ownAttr(FIELD_ATTR_REQUIRED) === true)
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.ownChildren()) {
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":"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"}
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.14.2",
3
+ "version": "0.15.0-rc.1",
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.14.2",
68
- "@metaobjectsdev/render": "0.14.2",
67
+ "@metaobjectsdev/metadata": "0.15.0-rc.1",
68
+ "@metaobjectsdev/render": "0.15.0-rc.1",
69
69
  "qs": "^6.13.0"
70
70
  },
71
71
  "peerDependencies": {
@@ -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 = ownAttrString(field, FIELD_ATTR_COERCE_DEFAULT);
154
- const dv = ownAttrString(field, FIELD_ATTR_DEFAULT);
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.isArray === true ? enumArray : enumField;
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.isArray === true, nested);
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 = ownAttrString(field, FIELD_ATTR_DEFAULT);
175
- if (field.isArray === true) {
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 (ownAttrString(field, FIELD_ATTR_XML_TEXT) === "true") {
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.isArray === true) {
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.ownAttr(FIELD_ATTR_REQUIRED);
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.ownAttr(FIELD_ATTR_VALUES);
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.ownAttr(FIELD_ATTR_ENUM_ALIAS);
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
- const v = node.ownAttr(FIELD_ATTR_NORMALIZE);
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 own (non-inherited) string value of an attr on a node, or null when absent/empty. */
349
- function ownAttrString(node: MetaData, attr: string): string | null {
350
- const v = node.ownAttr(attr);
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 = ownAttrString(field, FIELD_ATTR_OBJECT_REF) ?? field.objectRef;
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;
@@ -27,7 +27,8 @@ export function resolveIdentity(entity: MetaData, data: Record<string, unknown>)
27
27
  { entity: entity.name },
28
28
  );
29
29
  }
30
- const fieldsAttr = primary.ownAttr(IDENTITY_ATTR_FIELDS);
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
- const generation = primary.ownAttr(IDENTITY_ATTR_GENERATION);
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);
@@ -59,15 +59,17 @@ export function resolveN2mDescriptor(
59
59
  relationName: string,
60
60
  root: MetaData,
61
61
  ): N2mDescriptor | null {
62
- for (const child of sourceEntity.ownChildren()) {
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
- if (child.ownAttr(RELATIONSHIP_ATTR_CARDINALITY) !== CARDINALITY_MANY) continue;
66
- if (child.ownAttr(RELATIONSHIP_ATTR_THROUGH) === undefined) continue; // 1:N many — not M:N.
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.ownAttr(RELATIONSHIP_ATTR_OBJECT_REF) as string | undefined;
70
- const joinEntityName = rel.ownAttr(RELATIONSHIP_ATTR_THROUGH) as string | undefined;
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
- const e = root.ownChildren().find((c) => c.type === TYPE_OBJECT && c.name === name);
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
- const field = joinEntity.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
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
  }
@@ -455,7 +455,8 @@ export class ObjectManager {
455
455
  { value: entityName },
456
456
  );
457
457
  }
458
- const entity = this.metadata.ownChildren().find((c) => c.type === TYPE_OBJECT && c.name === entityName);
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
- const field = entity.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
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;
@@ -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
- for (const child of holder.ownChildren()) {
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
- const ref = child.ownAttr(IDENTITY_REFERENCE_ATTR_REFERENCES);
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.ownAttr(IDENTITY_ATTR_FIELDS);
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
- for (const child of sourceEntity.ownChildren()) {
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
- const card = child.ownAttr(RELATIONSHIP_ATTR_CARDINALITY);
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.ownAttr(RELATIONSHIP_ATTR_OBJECT_REF) as string | undefined;
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
- const target = root.ownChildren().find((c) => c.type === TYPE_OBJECT && c.name === targetEntityName);
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
- for (const other of root.ownChildren()) {
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
- for (const child of other.ownChildren()) {
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
- const card = child.ownAttr(RELATIONSHIP_ATTR_CARDINALITY);
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.ownAttr(RELATIONSHIP_ATTR_OBJECT_REF) as string | undefined;
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
- const e = root.ownChildren().find((c) => c.type === TYPE_OBJECT && c.name === name);
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
- const value = entity.ownAttr(OBJECT_ATTR_DISCRIMINATOR_VALUE);
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) };
@@ -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
- return child.ownAttr(FIELD_ATTR_STORAGE) !== STORAGE_FLATTENED;
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
- for (const child of entity.ownChildren()) {
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
- for (const child of entity.ownChildren()) {
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;