@metaobjectsdev/metadata 0.15.17-rc.1 → 0.15.17-rc.2
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"super-resolve.d.ts","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AA2CtD;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIxD;AAsBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,QAAQ,EACd,aAAa,CAAC,EAAE,aAAa,GAC5B,QAAQ,GAAG,SAAS,CAiDtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,MAAM,EAAE,OAAO,aAAa,EAAE,WAAW,CAAC;IAC1C;;;;;;;OAOG;IACH,IAAI,EAAE,YAAY,GAAG,iBAAiB,CAAC;IACvC,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,gFAAgF;IAChF,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"super-resolve.d.ts","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AA2CtD;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIxD;AAsBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,QAAQ,EACd,aAAa,CAAC,EAAE,aAAa,GAC5B,QAAQ,GAAG,SAAS,CAiDtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,MAAM,EAAE,OAAO,aAAa,EAAE,WAAW,CAAC;IAC1C;;;;;;;OAOG;IACH,IAAI,EAAE,YAAY,GAAG,iBAAiB,CAAC;IACvC,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,gFAAgF;IAChF,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,EAAE,CAwF5E"}
|
package/dist/super-resolve.js
CHANGED
|
@@ -177,12 +177,51 @@ export function resolveSuperRef(ref, contextPackage, root, referrerScope) {
|
|
|
177
177
|
*/
|
|
178
178
|
export function resolveDeferredSupers(root) {
|
|
179
179
|
const failures = [];
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
180
|
+
// #188: super-resolution must be ORDER-INDEPENDENT. A pre-order walk resolved
|
|
181
|
+
// each node's superRef in physical-declaration (= load) order, so a dotted
|
|
182
|
+
// ref to an INHERITED member (`extends: Owner.member` where Owner inherits
|
|
183
|
+
// `member` via its own `extends`) only succeeded when the owner's extends
|
|
184
|
+
// chain happened to be wired first — green under Node's readdir order,
|
|
185
|
+
// ERR_UNRESOLVED_SUPER under Bun's. Instead resolve ON DEMAND with
|
|
186
|
+
// memoization + cycle detection: before a dotted ref reads `owner.children()`
|
|
187
|
+
// (effective children — inherited members appear only once the owner's OWN
|
|
188
|
+
// super is resolved), resolve the owner's whole chain first. The result is a
|
|
189
|
+
// pure function of the source SET, independent of enumeration order.
|
|
190
|
+
// Nodes already attempted this pass. Because resolution is now on-demand, a
|
|
191
|
+
// node can be reached both by the `pending` loop AND by owner/target
|
|
192
|
+
// recursion from another node — `attempted` makes each node resolve (and, on
|
|
193
|
+
// failure, report) EXACTLY ONCE, restoring the old single-visit walk's
|
|
194
|
+
// no-duplicate-failures guarantee (a successful node is already deduped by
|
|
195
|
+
// `superResolved`; this also covers the FAILURE path, which sets no marker).
|
|
196
|
+
// It is also the cycle guard: `attempted` is never removed, so a genuine
|
|
197
|
+
// super cycle (A→B→A) terminates on re-entry to the already-attempted node
|
|
198
|
+
// rather than recursing forever.
|
|
199
|
+
const attempted = new Set();
|
|
200
|
+
// Every node carrying a superRef, over the PHYSICAL declaration tree.
|
|
201
|
+
const pending = [];
|
|
202
|
+
walk(root, (n) => {
|
|
203
|
+
if (n.superRef !== undefined)
|
|
204
|
+
pending.push(n);
|
|
205
|
+
});
|
|
206
|
+
const resolveNode = (node) => {
|
|
207
|
+
if (node.superRef === undefined || node.superResolved !== undefined)
|
|
184
208
|
return;
|
|
209
|
+
if (attempted.has(node))
|
|
210
|
+
return; // already resolved-or-failed this pass — never re-report
|
|
211
|
+
attempted.add(node);
|
|
185
212
|
const effectivePkg = node.package ?? node.fileDefaultPackage ?? "";
|
|
213
|
+
// For a dotted child-targeting ref, `resolveSuperRef` reads the OWNER's
|
|
214
|
+
// effective `children()` — which only includes inherited members once the
|
|
215
|
+
// owner's own extends chain is resolved. So resolve the owner node's chain
|
|
216
|
+
// FIRST (memoized), regardless of load order.
|
|
217
|
+
if (isChildTargetingRef(node.superRef)) {
|
|
218
|
+
const parsed = parseChildTargetingRef(node.superRef);
|
|
219
|
+
if (parsed !== undefined) {
|
|
220
|
+
const ownerNode = resolveSuperRef(parsed.ownerRef, effectivePkg, root);
|
|
221
|
+
if (ownerNode !== undefined)
|
|
222
|
+
resolveNode(ownerNode);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
186
225
|
// FR-024: thread the referrer's type so dotted `Entity.child` refs resolve
|
|
187
226
|
// type-scoped (a field ref selects fields; an identity ref identities).
|
|
188
227
|
const target = resolveSuperRef(node.superRef, effectivePkg, root, { type: node.type });
|
|
@@ -207,6 +246,10 @@ export function resolveDeferredSupers(root) {
|
|
|
207
246
|
catch {
|
|
208
247
|
// Frozen — ignore; the loader should resolve before freeze.
|
|
209
248
|
}
|
|
249
|
+
// Ensure the target's OWN chain is resolved too, so a later `children()`
|
|
250
|
+
// read on `node` (codegen/validation) sees the full multi-level inherited
|
|
251
|
+
// set (e.g. Base extends AbstractRoot). Memoized — no re-work.
|
|
252
|
+
resolveNode(target);
|
|
210
253
|
}
|
|
211
254
|
else {
|
|
212
255
|
failures.push({
|
|
@@ -216,7 +259,9 @@ export function resolveDeferredSupers(root) {
|
|
|
216
259
|
kind: "unresolved",
|
|
217
260
|
});
|
|
218
261
|
}
|
|
219
|
-
}
|
|
262
|
+
};
|
|
263
|
+
for (const node of pending)
|
|
264
|
+
resolveNode(node);
|
|
220
265
|
return failures;
|
|
221
266
|
}
|
|
222
267
|
function walk(node, visit) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"super-resolve.js","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"super-resolve.js","sourceRoot":"","sources":["../src/super-resolve.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/super-resolve.ts
CHANGED
|
@@ -225,13 +225,54 @@ export interface DeferredSuperFailure {
|
|
|
225
225
|
*/
|
|
226
226
|
export function resolveDeferredSupers(root: MetaData): DeferredSuperFailure[] {
|
|
227
227
|
const failures: DeferredSuperFailure[] = [];
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
228
|
+
// #188: super-resolution must be ORDER-INDEPENDENT. A pre-order walk resolved
|
|
229
|
+
// each node's superRef in physical-declaration (= load) order, so a dotted
|
|
230
|
+
// ref to an INHERITED member (`extends: Owner.member` where Owner inherits
|
|
231
|
+
// `member` via its own `extends`) only succeeded when the owner's extends
|
|
232
|
+
// chain happened to be wired first — green under Node's readdir order,
|
|
233
|
+
// ERR_UNRESOLVED_SUPER under Bun's. Instead resolve ON DEMAND with
|
|
234
|
+
// memoization + cycle detection: before a dotted ref reads `owner.children()`
|
|
235
|
+
// (effective children — inherited members appear only once the owner's OWN
|
|
236
|
+
// super is resolved), resolve the owner's whole chain first. The result is a
|
|
237
|
+
// pure function of the source SET, independent of enumeration order.
|
|
238
|
+
// Nodes already attempted this pass. Because resolution is now on-demand, a
|
|
239
|
+
// node can be reached both by the `pending` loop AND by owner/target
|
|
240
|
+
// recursion from another node — `attempted` makes each node resolve (and, on
|
|
241
|
+
// failure, report) EXACTLY ONCE, restoring the old single-visit walk's
|
|
242
|
+
// no-duplicate-failures guarantee (a successful node is already deduped by
|
|
243
|
+
// `superResolved`; this also covers the FAILURE path, which sets no marker).
|
|
244
|
+
// It is also the cycle guard: `attempted` is never removed, so a genuine
|
|
245
|
+
// super cycle (A→B→A) terminates on re-entry to the already-attempted node
|
|
246
|
+
// rather than recursing forever.
|
|
247
|
+
const attempted = new Set<MetaData>();
|
|
248
|
+
// Every node carrying a superRef, over the PHYSICAL declaration tree.
|
|
249
|
+
const pending: MetaData[] = [];
|
|
250
|
+
walk(root, (n) => {
|
|
251
|
+
if (n.superRef !== undefined) pending.push(n);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
const resolveNode = (node: MetaData): void => {
|
|
255
|
+
if (node.superRef === undefined || node.superResolved !== undefined) return;
|
|
256
|
+
if (attempted.has(node)) return; // already resolved-or-failed this pass — never re-report
|
|
257
|
+
attempted.add(node);
|
|
231
258
|
const effectivePkg = node.package ?? node.fileDefaultPackage ?? "";
|
|
259
|
+
|
|
260
|
+
// For a dotted child-targeting ref, `resolveSuperRef` reads the OWNER's
|
|
261
|
+
// effective `children()` — which only includes inherited members once the
|
|
262
|
+
// owner's own extends chain is resolved. So resolve the owner node's chain
|
|
263
|
+
// FIRST (memoized), regardless of load order.
|
|
264
|
+
if (isChildTargetingRef(node.superRef)) {
|
|
265
|
+
const parsed = parseChildTargetingRef(node.superRef);
|
|
266
|
+
if (parsed !== undefined) {
|
|
267
|
+
const ownerNode = resolveSuperRef(parsed.ownerRef, effectivePkg, root);
|
|
268
|
+
if (ownerNode !== undefined) resolveNode(ownerNode);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
232
272
|
// FR-024: thread the referrer's type so dotted `Entity.child` refs resolve
|
|
233
273
|
// type-scoped (a field ref selects fields; an identity ref identities).
|
|
234
274
|
const target = resolveSuperRef(node.superRef, effectivePkg, root, { type: node.type });
|
|
275
|
+
|
|
235
276
|
if (target !== undefined) {
|
|
236
277
|
// FR-024: a dotted ref must target a node of the SAME type and subtype
|
|
237
278
|
// as the extending node. Dotted-only — top-level extends is unchanged.
|
|
@@ -254,6 +295,10 @@ export function resolveDeferredSupers(root: MetaData): DeferredSuperFailure[] {
|
|
|
254
295
|
} catch {
|
|
255
296
|
// Frozen — ignore; the loader should resolve before freeze.
|
|
256
297
|
}
|
|
298
|
+
// Ensure the target's OWN chain is resolved too, so a later `children()`
|
|
299
|
+
// read on `node` (codegen/validation) sees the full multi-level inherited
|
|
300
|
+
// set (e.g. Base extends AbstractRoot). Memoized — no re-work.
|
|
301
|
+
resolveNode(target);
|
|
257
302
|
} else {
|
|
258
303
|
failures.push({
|
|
259
304
|
nodeFqn: node.fqn(),
|
|
@@ -262,7 +307,9 @@ export function resolveDeferredSupers(root: MetaData): DeferredSuperFailure[] {
|
|
|
262
307
|
kind: "unresolved",
|
|
263
308
|
});
|
|
264
309
|
}
|
|
265
|
-
}
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
for (const node of pending) resolveNode(node);
|
|
266
313
|
return failures;
|
|
267
314
|
}
|
|
268
315
|
|