@metaobjectsdev/runtime-ts 0.20.9-rc.1 → 0.20.10-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.
- package/dist/extract-object.d.ts.map +1 -1
- package/dist/extract-object.js +24 -16
- package/dist/extract-object.js.map +1 -1
- package/package.json +3 -3
- package/src/extract-object.ts +25 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-object.d.ts","sourceRoot":"","sources":["../src/extract-object.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,UAAU,
|
|
1
|
+
{"version":3,"file":"extract-object.d.ts","sourceRoot":"","sources":["../src/extract-object.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,UAAU,EA+BX,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,MAAM,EAWN,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC;;;;GAIG;AACH,eAAO,MAAM,cAAc,IAAI,CAAC;AAMhC;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,MAAM,GAAE,MAAoB,EAC5B,IAAI,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,GACpC,gBAAgB,CAAC,MAAM,CAAC,CAK1B;AAMD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,GAAE,MAAoB,GAAG,aAAa,CAE5F;AA0ED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEjG"}
|
package/dist/extract-object.js
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
// Never throws. Lost/malformed fields are classified in the report, never raised. Opt into
|
|
24
24
|
// strictness with orThrow() (re-exported from @metaobjectsdev/render), which throws a ExtractError
|
|
25
25
|
// iff a required field was lost.
|
|
26
|
-
import { MetaObject, MetaField, MetaRoot,
|
|
26
|
+
import { MetaObject, MetaField, MetaRoot, TYPE_OBJECT, resolveObjectRef, FIELD_SUBTYPE_ENUM, FIELD_SUBTYPE_OBJECT, FIELD_SUBTYPE_STRING, FIELD_SUBTYPE_UUID, FIELD_SUBTYPE_DATE, FIELD_SUBTYPE_TIME, FIELD_SUBTYPE_TIMESTAMP, FIELD_SUBTYPE_INT, FIELD_SUBTYPE_LONG, FIELD_SUBTYPE_CURRENCY, FIELD_SUBTYPE_DOUBLE, FIELD_SUBTYPE_FLOAT, FIELD_SUBTYPE_DECIMAL, FIELD_SUBTYPE_BOOLEAN, FIELD_ATTR_REQUIRED, FIELD_ATTR_VALUES, FIELD_ATTR_ENUM_ALIAS, FIELD_ATTR_COERCE_DEFAULT, FIELD_ATTR_DEFAULT, FIELD_ATTR_NORMALIZE, FIELD_ATTR_OBJECT_REF, FIELD_ATTR_XML_TEXT, VALIDATOR_SUBTYPE_NUMERIC, NORMALIZE_DEFAULT, } from "@metaobjectsdev/metadata";
|
|
27
27
|
import { Format, FieldKind, scalar, range, textContentField, enumField, enumArray, object, extractSchema, extract, } from "@metaobjectsdev/render";
|
|
28
28
|
/**
|
|
29
29
|
* Maximum nested-object recursion depth. Mirrors the render OutputFormatRenderer.MAX_NEST_DEPTH
|
|
@@ -86,7 +86,7 @@ function fieldSpecFor(field, owner, format, visited, depth) {
|
|
|
86
86
|
}
|
|
87
87
|
// --- Nested object (single or array) --------------------------------------
|
|
88
88
|
if (field.subType === FIELD_SUBTYPE_OBJECT || field.objectRef !== undefined) {
|
|
89
|
-
const ref =
|
|
89
|
+
const ref = resolveFieldObjectRef(field);
|
|
90
90
|
const cyclicOrDeep = ref === undefined || visited.has(ref) || depth + 1 >= MAX_NEST_DEPTH;
|
|
91
91
|
if (cyclicOrDeep) {
|
|
92
92
|
// Opaque leaf — never recurse into a cycle / past the depth bound.
|
|
@@ -155,7 +155,7 @@ function assembleInner(mo, data, visited, depth) {
|
|
|
155
155
|
continue;
|
|
156
156
|
}
|
|
157
157
|
// Nested object — guard cycles/depth (mirror the schema guard).
|
|
158
|
-
const ref =
|
|
158
|
+
const ref = resolveFieldObjectRef(field);
|
|
159
159
|
const cyclicOrDeep = ref === undefined || visited.has(ref) || depth + 1 >= MAX_NEST_DEPTH;
|
|
160
160
|
if (field.resolvedIsArray()) {
|
|
161
161
|
// Array-of-objects: map each element record -> assembled child.
|
|
@@ -272,26 +272,34 @@ function attrString(node, attr) {
|
|
|
272
272
|
return v == null ? null : String(v);
|
|
273
273
|
}
|
|
274
274
|
/**
|
|
275
|
-
* Resolve a field's `@objectRef`
|
|
276
|
-
*
|
|
277
|
-
*
|
|
275
|
+
* Resolve a field's `@objectRef` to its MetaObject via the canonical ADR-0042 package-local
|
|
276
|
+
* resolver (`resolveObjectRef` from `@metaobjectsdev/metadata`): an FQN ref (contains `::`)
|
|
277
|
+
* matches EXACTLY on `resolutionKey()`; a bare ref resolves in the field's OWN declaring
|
|
278
|
+
* package (`field.parent?.package ?? field.parent?.fileDefaultPackage`), else root-level.
|
|
279
|
+
*
|
|
280
|
+
* #228: this previously called `MetaRoot.findObject(name)` directly — a bare-`name`-only
|
|
281
|
+
* lookup — and, for an FQN ref (which never matches any object's bare `.name`), fell back to
|
|
282
|
+
* `MetaRoot.findObject(<bare tail>)`. That bare-tail fallback is the exact cross-package
|
|
283
|
+
* short-name collision hazard ADR-0042 closed everywhere else: TWO value-objects sharing a
|
|
284
|
+
* short name in different packages (e.g. `acme::alpha::Note` / `acme::beta::Note`) made this
|
|
285
|
+
* resolve to WHICHEVER one happened to load first, silently assembling the WRONG shape's data
|
|
286
|
+
* into the runtime-delegating JSON/XML extract path (`extractObject`) — reachable end-to-end
|
|
287
|
+
* through a generated `extractLenient<Template>WithLoader`. Fixed to the shared FQN-exact/
|
|
288
|
+
* package-local resolver so it can never mis-bind (proven against
|
|
289
|
+
* fixtures/template-output-render-conformance/xpkg-collision-json/).
|
|
290
|
+
*
|
|
291
|
+
* Returns undefined when unresolvable (→ opaque-leaf guard).
|
|
278
292
|
*/
|
|
279
|
-
function
|
|
293
|
+
function resolveFieldObjectRef(field) {
|
|
280
294
|
const ref = attrString(field, FIELD_ATTR_OBJECT_REF) ?? field.objectRef;
|
|
281
295
|
if (ref === undefined || ref === null)
|
|
282
296
|
return undefined;
|
|
283
297
|
const root = field.root();
|
|
284
298
|
if (!(root instanceof MetaRoot))
|
|
285
299
|
return undefined;
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
const sep = ref.lastIndexOf(PACKAGE_SEPARATOR);
|
|
290
|
-
if (sep >= 0) {
|
|
291
|
-
const short = ref.slice(sep + PACKAGE_SEPARATOR.length);
|
|
292
|
-
return root.findObject(short);
|
|
293
|
-
}
|
|
294
|
-
return undefined;
|
|
300
|
+
const referrerPkg = field.parent?.package ?? field.parent?.fileDefaultPackage ?? "";
|
|
301
|
+
const { node } = resolveObjectRef(root, ref, referrerPkg);
|
|
302
|
+
return node !== undefined && node.type === TYPE_OBJECT ? node : undefined;
|
|
295
303
|
}
|
|
296
304
|
function isPlainObject(o) {
|
|
297
305
|
return typeof o === "object" && o !== null && !Array.isArray(o);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-object.js","sourceRoot":"","sources":["../src/extract-object.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,iDAAiD;AACjD,EAAE;AACF,qEAAqE;AACrE,2FAA2F;AAC3F,iGAAiG;AACjG,4FAA4F;AAC5F,6FAA6F;AAC7F,oFAAoF;AACpF,iFAAiF;AACjF,EAAE;AACF,2FAA2F;AAC3F,kGAAkG;AAClG,gGAAgG;AAChG,8FAA8F;AAC9F,mGAAmG;AACnG,8FAA8F;AAC9F,kGAAkG;AAClG,EAAE;AACF,gGAAgG;AAChG,6FAA6F;AAC7F,EAAE;AACF,2FAA2F;AAC3F,mGAAmG;AACnG,iCAAiC;AAEjC,OAAO,EACL,UAAU,EACV,SAAS,EACT,QAAQ,EAER,
|
|
1
|
+
{"version":3,"file":"extract-object.js","sourceRoot":"","sources":["../src/extract-object.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.20.
|
|
3
|
+
"version": "0.20.10-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.20.
|
|
68
|
-
"@metaobjectsdev/render": "0.20.
|
|
67
|
+
"@metaobjectsdev/metadata": "0.20.10-rc.1",
|
|
68
|
+
"@metaobjectsdev/render": "0.20.10-rc.1",
|
|
69
69
|
"qs": "^6.13.0"
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
package/src/extract-object.ts
CHANGED
|
@@ -29,7 +29,8 @@ import {
|
|
|
29
29
|
MetaField,
|
|
30
30
|
MetaRoot,
|
|
31
31
|
type MetaData,
|
|
32
|
-
|
|
32
|
+
TYPE_OBJECT,
|
|
33
|
+
resolveObjectRef,
|
|
33
34
|
FIELD_SUBTYPE_ENUM,
|
|
34
35
|
FIELD_SUBTYPE_OBJECT,
|
|
35
36
|
FIELD_SUBTYPE_STRING,
|
|
@@ -159,7 +160,7 @@ function fieldSpecFor(
|
|
|
159
160
|
|
|
160
161
|
// --- Nested object (single or array) --------------------------------------
|
|
161
162
|
if (field.subType === FIELD_SUBTYPE_OBJECT || field.objectRef !== undefined) {
|
|
162
|
-
const ref =
|
|
163
|
+
const ref = resolveFieldObjectRef(field);
|
|
163
164
|
const cyclicOrDeep = ref === undefined || visited.has(ref) || depth + 1 >= MAX_NEST_DEPTH;
|
|
164
165
|
if (cyclicOrDeep) {
|
|
165
166
|
// Opaque leaf — never recurse into a cycle / past the depth bound.
|
|
@@ -239,7 +240,7 @@ function assembleInner(
|
|
|
239
240
|
}
|
|
240
241
|
|
|
241
242
|
// Nested object — guard cycles/depth (mirror the schema guard).
|
|
242
|
-
const ref =
|
|
243
|
+
const ref = resolveFieldObjectRef(field);
|
|
243
244
|
const cyclicOrDeep = ref === undefined || visited.has(ref) || depth + 1 >= MAX_NEST_DEPTH;
|
|
244
245
|
|
|
245
246
|
if (field.resolvedIsArray()) {
|
|
@@ -359,23 +360,32 @@ function attrString(node: MetaData, attr: string): string | null {
|
|
|
359
360
|
}
|
|
360
361
|
|
|
361
362
|
/**
|
|
362
|
-
* Resolve a field's `@objectRef`
|
|
363
|
-
*
|
|
364
|
-
*
|
|
363
|
+
* Resolve a field's `@objectRef` to its MetaObject via the canonical ADR-0042 package-local
|
|
364
|
+
* resolver (`resolveObjectRef` from `@metaobjectsdev/metadata`): an FQN ref (contains `::`)
|
|
365
|
+
* matches EXACTLY on `resolutionKey()`; a bare ref resolves in the field's OWN declaring
|
|
366
|
+
* package (`field.parent?.package ?? field.parent?.fileDefaultPackage`), else root-level.
|
|
367
|
+
*
|
|
368
|
+
* #228: this previously called `MetaRoot.findObject(name)` directly — a bare-`name`-only
|
|
369
|
+
* lookup — and, for an FQN ref (which never matches any object's bare `.name`), fell back to
|
|
370
|
+
* `MetaRoot.findObject(<bare tail>)`. That bare-tail fallback is the exact cross-package
|
|
371
|
+
* short-name collision hazard ADR-0042 closed everywhere else: TWO value-objects sharing a
|
|
372
|
+
* short name in different packages (e.g. `acme::alpha::Note` / `acme::beta::Note`) made this
|
|
373
|
+
* resolve to WHICHEVER one happened to load first, silently assembling the WRONG shape's data
|
|
374
|
+
* into the runtime-delegating JSON/XML extract path (`extractObject`) — reachable end-to-end
|
|
375
|
+
* through a generated `extractLenient<Template>WithLoader`. Fixed to the shared FQN-exact/
|
|
376
|
+
* package-local resolver so it can never mis-bind (proven against
|
|
377
|
+
* fixtures/template-output-render-conformance/xpkg-collision-json/).
|
|
378
|
+
*
|
|
379
|
+
* Returns undefined when unresolvable (→ opaque-leaf guard).
|
|
365
380
|
*/
|
|
366
|
-
function
|
|
381
|
+
function resolveFieldObjectRef(field: MetaField): MetaObject | undefined {
|
|
367
382
|
const ref = attrString(field, FIELD_ATTR_OBJECT_REF) ?? field.objectRef;
|
|
368
383
|
if (ref === undefined || ref === null) return undefined;
|
|
369
384
|
const root = field.root();
|
|
370
385
|
if (!(root instanceof MetaRoot)) return undefined;
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
if (sep >= 0) {
|
|
375
|
-
const short = ref.slice(sep + PACKAGE_SEPARATOR.length);
|
|
376
|
-
return root.findObject(short);
|
|
377
|
-
}
|
|
378
|
-
return undefined;
|
|
386
|
+
const referrerPkg = field.parent?.package ?? field.parent?.fileDefaultPackage ?? "";
|
|
387
|
+
const { node } = resolveObjectRef(root, ref, referrerPkg);
|
|
388
|
+
return node !== undefined && node.type === TYPE_OBJECT ? (node as MetaObject) : undefined;
|
|
379
389
|
}
|
|
380
390
|
|
|
381
391
|
function isPlainObject(o: unknown): boolean {
|