@metaobjectsdev/metadata 1.0.12 → 1.1.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.
Files changed (233) hide show
  1. package/README.md +2 -0
  2. package/dist/attr-schema-validate.d.ts.map +1 -1
  3. package/dist/attr-schema-validate.js +9 -12
  4. package/dist/attr-schema-validate.js.map +1 -1
  5. package/dist/constants.d.ts +1 -0
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +1 -0
  8. package/dist/constants.js.map +1 -1
  9. package/dist/core/attr/meta-attr-filter.d.ts.map +1 -1
  10. package/dist/core/attr/meta-attr-filter.js +8 -2
  11. package/dist/core/attr/meta-attr-filter.js.map +1 -1
  12. package/dist/core/attr/meta-attr.d.ts +14 -0
  13. package/dist/core/attr/meta-attr.d.ts.map +1 -1
  14. package/dist/core/attr/meta-attr.js +23 -1
  15. package/dist/core/attr/meta-attr.js.map +1 -1
  16. package/dist/core/field/shared-enum.d.ts +21 -0
  17. package/dist/core/field/shared-enum.d.ts.map +1 -0
  18. package/dist/core/field/shared-enum.js +49 -0
  19. package/dist/core/field/shared-enum.js.map +1 -0
  20. package/dist/core/identity/meta-identity.d.ts +1 -1
  21. package/dist/core/identity/meta-identity.d.ts.map +1 -1
  22. package/dist/core/identity/meta-identity.js +8 -13
  23. package/dist/core/identity/meta-identity.js.map +1 -1
  24. package/dist/core/index.d.ts +2 -0
  25. package/dist/core/index.d.ts.map +1 -1
  26. package/dist/core/index.js +3 -0
  27. package/dist/core/index.js.map +1 -1
  28. package/dist/core/object/object-constants.d.ts +14 -1
  29. package/dist/core/object/object-constants.d.ts.map +1 -1
  30. package/dist/core/object/object-constants.js +18 -0
  31. package/dist/core/object/object-constants.js.map +1 -1
  32. package/dist/core/object/object-definition.embedded.d.ts.map +1 -1
  33. package/dist/core/object/object-definition.embedded.js +80 -0
  34. package/dist/core/object/object-definition.embedded.js.map +1 -1
  35. package/dist/core/relationship/derive-m2m-fields.d.ts +1 -1
  36. package/dist/core/relationship/derive-m2m-fields.d.ts.map +1 -1
  37. package/dist/core/relationship/derive-m2m-fields.js +15 -44
  38. package/dist/core/relationship/derive-m2m-fields.js.map +1 -1
  39. package/dist/core/relationship/find-reference.d.ts.map +1 -1
  40. package/dist/core/relationship/find-reference.js +4 -2
  41. package/dist/core/relationship/find-reference.js.map +1 -1
  42. package/dist/core/relationship/resolve-relationship-reference.d.ts +6 -5
  43. package/dist/core/relationship/resolve-relationship-reference.d.ts.map +1 -1
  44. package/dist/core/relationship/resolve-relationship-reference.js +9 -7
  45. package/dist/core/relationship/resolve-relationship-reference.js.map +1 -1
  46. package/dist/core/reporting/meta-dimension.d.ts +13 -0
  47. package/dist/core/reporting/meta-dimension.d.ts.map +1 -0
  48. package/dist/core/reporting/meta-dimension.js +30 -0
  49. package/dist/core/reporting/meta-dimension.js.map +1 -0
  50. package/dist/core/reporting/meta-measure.d.ts +24 -0
  51. package/dist/core/reporting/meta-measure.d.ts.map +1 -0
  52. package/dist/core/reporting/meta-measure.js +54 -0
  53. package/dist/core/reporting/meta-measure.js.map +1 -0
  54. package/dist/core/reporting/meta-segment.d.ts +6 -0
  55. package/dist/core/reporting/meta-segment.d.ts.map +1 -0
  56. package/dist/core/reporting/meta-segment.js +13 -0
  57. package/dist/core/reporting/meta-segment.js.map +1 -0
  58. package/dist/core/reporting/report-accessors.d.ts +27 -0
  59. package/dist/core/reporting/report-accessors.d.ts.map +1 -0
  60. package/dist/core/reporting/report-accessors.js +56 -0
  61. package/dist/core/reporting/report-accessors.js.map +1 -0
  62. package/dist/core/reporting/report-describe.d.ts +59 -0
  63. package/dist/core/reporting/report-describe.d.ts.map +1 -0
  64. package/dist/core/reporting/report-describe.js +182 -0
  65. package/dist/core/reporting/report-describe.js.map +1 -0
  66. package/dist/core/reporting/report-read-model.d.ts +34 -0
  67. package/dist/core/reporting/report-read-model.d.ts.map +1 -0
  68. package/dist/core/reporting/report-read-model.js +165 -0
  69. package/dist/core/reporting/report-read-model.js.map +1 -0
  70. package/dist/core/reporting/report-shape.d.ts +103 -0
  71. package/dist/core/reporting/report-shape.d.ts.map +1 -0
  72. package/dist/core/reporting/report-shape.js +398 -0
  73. package/dist/core/reporting/report-shape.js.map +1 -0
  74. package/dist/core/reporting/reporting-constants.d.ts +65 -0
  75. package/dist/core/reporting/reporting-constants.d.ts.map +1 -0
  76. package/dist/core/reporting/reporting-constants.js +84 -0
  77. package/dist/core/reporting/reporting-constants.js.map +1 -0
  78. package/dist/core/reporting/reporting-definition.embedded.d.ts +3 -0
  79. package/dist/core/reporting/reporting-definition.embedded.d.ts.map +1 -0
  80. package/dist/core/reporting/reporting-definition.embedded.js +185 -0
  81. package/dist/core/reporting/reporting-definition.embedded.js.map +1 -0
  82. package/dist/core/requirement/resolve-claim.d.ts +8 -0
  83. package/dist/core/requirement/resolve-claim.d.ts.map +1 -1
  84. package/dist/core/requirement/resolve-claim.js +21 -0
  85. package/dist/core/requirement/resolve-claim.js.map +1 -1
  86. package/dist/core/yaml-desugar.d.ts.map +1 -1
  87. package/dist/core/yaml-desugar.js +12 -82
  88. package/dist/core/yaml-desugar.js.map +1 -1
  89. package/dist/core-types.d.ts.map +1 -1
  90. package/dist/core-types.js +28 -1
  91. package/dist/core-types.js.map +1 -1
  92. package/dist/docs-ref.d.ts +19 -0
  93. package/dist/docs-ref.d.ts.map +1 -0
  94. package/dist/docs-ref.js +37 -0
  95. package/dist/docs-ref.js.map +1 -0
  96. package/dist/errors.d.ts +1 -1
  97. package/dist/errors.d.ts.map +1 -1
  98. package/dist/errors.js +24 -6
  99. package/dist/errors.js.map +1 -1
  100. package/dist/fmt.d.ts.map +1 -1
  101. package/dist/fmt.js +3 -1
  102. package/dist/fmt.js.map +1 -1
  103. package/dist/index.d.ts +15 -4
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +18 -4
  106. package/dist/index.js.map +1 -1
  107. package/dist/loader/declared-duplicate-fields.d.ts +19 -0
  108. package/dist/loader/declared-duplicate-fields.d.ts.map +1 -0
  109. package/dist/loader/declared-duplicate-fields.js +97 -0
  110. package/dist/loader/declared-duplicate-fields.js.map +1 -0
  111. package/dist/loader/meta-data-loader.d.ts.map +1 -1
  112. package/dist/loader/meta-data-loader.js +18 -1
  113. package/dist/loader/meta-data-loader.js.map +1 -1
  114. package/dist/loader/reporting-validation.d.ts +11 -0
  115. package/dist/loader/reporting-validation.d.ts.map +1 -0
  116. package/dist/loader/reporting-validation.js +883 -0
  117. package/dist/loader/reporting-validation.js.map +1 -0
  118. package/dist/loader/resolve-references.d.ts +8 -0
  119. package/dist/loader/resolve-references.d.ts.map +1 -0
  120. package/dist/loader/resolve-references.js +132 -0
  121. package/dist/loader/resolve-references.js.map +1 -0
  122. package/dist/loader/validation-passes.d.ts.map +1 -1
  123. package/dist/loader/validation-passes.js +14 -9
  124. package/dist/loader/validation-passes.js.map +1 -1
  125. package/dist/loader/validation-registry.d.ts.map +1 -1
  126. package/dist/loader/validation-registry.js +33 -10
  127. package/dist/loader/validation-registry.js.map +1 -1
  128. package/dist/metamodel-docs/index.js +3 -3
  129. package/dist/metamodel-docs/index.js.map +1 -1
  130. package/dist/metamodel-docs/render.js +4 -4
  131. package/dist/metamodel-docs/render.js.map +1 -1
  132. package/dist/naming-refs.d.ts +102 -50
  133. package/dist/naming-refs.d.ts.map +1 -1
  134. package/dist/naming-refs.js +223 -97
  135. package/dist/naming-refs.js.map +1 -1
  136. package/dist/naming.d.ts +65 -7
  137. package/dist/naming.d.ts.map +1 -1
  138. package/dist/naming.js +98 -5
  139. package/dist/naming.js.map +1 -1
  140. package/dist/object-serializer.d.ts.map +1 -1
  141. package/dist/object-serializer.js +6 -9
  142. package/dist/object-serializer.js.map +1 -1
  143. package/dist/parser-core.d.ts.map +1 -1
  144. package/dist/parser-core.js +18 -48
  145. package/dist/parser-core.js.map +1 -1
  146. package/dist/persistence/db/db-definition.embedded.js +2 -2
  147. package/dist/persistence/db/db-definition.embedded.js.map +1 -1
  148. package/dist/persistence/source/meta-source.d.ts +5 -2
  149. package/dist/persistence/source/meta-source.d.ts.map +1 -1
  150. package/dist/persistence/source/meta-source.js +10 -6
  151. package/dist/persistence/source/meta-source.js.map +1 -1
  152. package/dist/registry-manifest-exclusions.js +2 -2
  153. package/dist/registry-manifest-exclusions.js.map +1 -1
  154. package/dist/registry-manifest.d.ts +1 -1
  155. package/dist/registry-manifest.js +1 -1
  156. package/dist/release-docs.d.ts +11 -0
  157. package/dist/release-docs.d.ts.map +1 -0
  158. package/dist/release-docs.js +48 -0
  159. package/dist/release-docs.js.map +1 -0
  160. package/dist/serializer-json.d.ts +15 -1
  161. package/dist/serializer-json.d.ts.map +1 -1
  162. package/dist/serializer-json.js +55 -17
  163. package/dist/serializer-json.js.map +1 -1
  164. package/dist/shared/base-types.d.ts +7 -1
  165. package/dist/shared/base-types.d.ts.map +1 -1
  166. package/dist/shared/base-types.js +9 -0
  167. package/dist/shared/base-types.js.map +1 -1
  168. package/dist/shared/meta-data.d.ts +10 -0
  169. package/dist/shared/meta-data.d.ts.map +1 -1
  170. package/dist/shared/meta-data.js +22 -1
  171. package/dist/shared/meta-data.js.map +1 -1
  172. package/dist/shared/meta-root.d.ts +13 -1
  173. package/dist/shared/meta-root.d.ts.map +1 -1
  174. package/dist/shared/meta-root.js +19 -1
  175. package/dist/shared/meta-root.js.map +1 -1
  176. package/dist/super-resolve.d.ts +4 -1
  177. package/dist/super-resolve.d.ts.map +1 -1
  178. package/dist/super-resolve.js +44 -65
  179. package/dist/super-resolve.js.map +1 -1
  180. package/dist/vocabulary-catalog.js +2 -2
  181. package/dist/vocabulary-catalog.js.map +1 -1
  182. package/package.json +6 -1
  183. package/src/attr-schema-validate.ts +9 -13
  184. package/src/constants.ts +1 -0
  185. package/src/core/attr/meta-attr-filter.ts +8 -1
  186. package/src/core/attr/meta-attr.ts +24 -1
  187. package/src/core/field/shared-enum.ts +53 -0
  188. package/src/core/identity/meta-identity.ts +9 -12
  189. package/src/core/index.ts +5 -0
  190. package/src/core/object/object-constants.ts +19 -0
  191. package/src/core/object/object-definition.embedded.ts +80 -0
  192. package/src/core/relationship/derive-m2m-fields.ts +15 -48
  193. package/src/core/relationship/find-reference.ts +4 -2
  194. package/src/core/relationship/resolve-relationship-reference.ts +11 -9
  195. package/src/core/reporting/meta-dimension.ts +41 -0
  196. package/src/core/reporting/meta-measure.ts +75 -0
  197. package/src/core/reporting/meta-segment.ts +14 -0
  198. package/src/core/reporting/report-accessors.ts +73 -0
  199. package/src/core/reporting/report-describe.ts +206 -0
  200. package/src/core/reporting/report-read-model.ts +177 -0
  201. package/src/core/reporting/report-shape.ts +493 -0
  202. package/src/core/reporting/reporting-constants.ts +104 -0
  203. package/src/core/reporting/reporting-definition.embedded.ts +192 -0
  204. package/src/core/requirement/resolve-claim.ts +20 -0
  205. package/src/core/yaml-desugar.ts +9 -89
  206. package/src/core-types.ts +41 -0
  207. package/src/docs-ref.ts +41 -0
  208. package/src/errors.ts +24 -6
  209. package/src/fmt.ts +3 -1
  210. package/src/index.ts +73 -5
  211. package/src/loader/declared-duplicate-fields.ts +114 -0
  212. package/src/loader/meta-data-loader.ts +25 -1
  213. package/src/loader/reporting-validation.ts +1137 -0
  214. package/src/loader/resolve-references.ts +144 -0
  215. package/src/loader/validation-passes.ts +13 -9
  216. package/src/loader/validation-registry.ts +37 -9
  217. package/src/metamodel-docs/index.ts +3 -3
  218. package/src/metamodel-docs/render.ts +4 -4
  219. package/src/naming-refs.ts +237 -94
  220. package/src/naming.ts +131 -11
  221. package/src/object-serializer.ts +7 -9
  222. package/src/parser-core.ts +19 -56
  223. package/src/persistence/db/db-definition.embedded.ts +2 -2
  224. package/src/persistence/source/meta-source.ts +10 -6
  225. package/src/registry-manifest-exclusions.ts +2 -2
  226. package/src/registry-manifest.ts +1 -1
  227. package/src/release-docs.ts +48 -0
  228. package/src/serializer-json.ts +79 -12
  229. package/src/shared/base-types.ts +9 -0
  230. package/src/shared/meta-data.ts +22 -1
  231. package/src/shared/meta-root.ts +20 -1
  232. package/src/super-resolve.ts +49 -63
  233. package/src/vocabulary-catalog.ts +2 -2
@@ -1,69 +1,104 @@
1
1
  import type { MetaData } from "./shared/meta-data.js";
2
2
  /**
3
- * The inline (`@`-prefixed) attribute names whose VALUE is a metadata reference
4
- * subject to FR-032 expansion/guarding (ADR-0032 §3). The structural `extends`
5
- * key is handled separately (it is not `@`-prefixed). `@objectRef`/`@references`
6
- * are pure object refs; `@from`/`@of`/`@via` carry an entity HEAD (possibly with
7
- * a dotted relationship/field tail — expandRef preserves the tail);
8
- * `@parameterRef`/`@payloadRef`/`@responseRef` reference value-objects. These are
9
- * expanded by the YAML desugar and rejected (when still relative) by the
10
- * canonical-JSON guard. `@through` (the M:N junction ref) is in the set per
11
- * ADR-0042 §4 — it desugars to FQN and resolves package-local like every other
12
- * object ref. `@sourceRefField` (a FK FIELD name, not an object ref) is NOT in
13
- * the set.
3
+ * The inline (`@`-prefixed) attribute names whose VALUE is a metadata object
4
+ * reference (ADR-0059 R4). The structural `extends` key is handled separately (it is
5
+ * not `@`-prefixed). `@objectRef`/`@references`/`@through` are pure object refs;
6
+ * `@from`/`@of`/`@via`/`@spine` carry an entity HEAD with a dotted
7
+ * relationship/field tail; `@parameterRef`/`@payloadRef`/`@responseRef` name
8
+ * value-objects. The same set is used in every port. `@sourceRefField` (a FK FIELD
9
+ * name) and `@implementedBy` (which may name a template as well as an object) are
10
+ * NOT in the set.
14
11
  */
15
12
  export declare const REF_BEARING_ATTR_NAMES: ReadonlySet<string>;
13
+ /** True when `raw` is a relative reference form (`::Rest` or `..::Rest`). */
14
+ export declare function isRelativeRef(raw: string): boolean;
16
15
  /**
17
- * True when `raw` is a relative reference form (`::Rest` or `..::Rest`) that the
18
- * YAML desugar must expand before canonical JSON. Canonical JSON must be FQN; a
19
- * relative ref surviving into it is `ERR_RELATIVE_REF_IN_CANONICAL`.
16
+ * Split a ref into its owner part (the object reference) and any FR-024 dotted
17
+ * child tail. The `.` that marks a child can only appear in the FINAL
18
+ * `::`-segment (package separators never follow a child dot), so the owner ends
19
+ * at the first `.` AFTER the last `::`. Returns `{ owner, tail }` where `tail`
20
+ * includes the leading `.` (or is "" when there is no child suffix).
20
21
  */
21
- export declare function isRelativeRef(raw: string): boolean;
22
+ export declare function splitChildTail(raw: string): {
23
+ owner: string;
24
+ tail: string;
25
+ };
22
26
  /**
23
- * Expand an authored reference to its fully-qualified canonical form per
24
- * ADR-0032 §2.1, preserving any FR-024 dotted child suffix. The package context
25
- * `P` is the declaring node's effective package (its own `package` or the
26
- * file-default). Throws on parent-relative over-drop — the caller emits an error.
27
+ * Expand an authored reference against a package context, preserving any FR-024
28
+ * dotted child suffix. Throws on parent-relative over-drop — the caller emits an
29
+ * error.
27
30
  */
28
31
  export declare function expandRef(raw: string, packageContext: string): string;
32
+ /** A parent-relative reference with more `..::` than its referrer's package has segments. */
33
+ export declare class RefOverDropError extends Error {
34
+ readonly code: "ERR_BAD_ATTR_VALUE";
35
+ }
36
+ /**
37
+ * The resolution keys an OWNER reference (no child tail) may bind, in the order to
38
+ * try them (ADR-0059 R2). Every form but bare is one exact key; bare is the
39
+ * referrer's own package, then root-level. Throws RefOverDropError on over-drop.
40
+ */
41
+ export declare function ownerCandidateKeys(owner: string, referrerPkg: string): readonly string[];
29
42
  /**
30
- * ADR-0042 — does root-level object `node` satisfy object reference `ref`,
31
- * declared by a node whose effective package is `referrerPkg`? A single
32
- * package-local matcher:
33
- * - **FQN** `ref` (contains `::`) → EXACT match on `resolutionKey()`. No
34
- * bare-tail fallback, so an FQN pointing at one package never binds a
35
- * same-named object in another.
36
- * - **bare** `ref` (no `::`) → the referrer's OWN package
37
- * (`<referrerPkg>::<ref>`), else a **root-level** (empty-package) object
38
- * whose resolution key IS `ref`. No cross-package bare resolution, no
39
- * globally-unique scan.
40
- *
41
- * Objects keep a BARE `fqn()` per the FR5d cross-port contract, so the canonical
42
- * FQN accessor is `resolutionKey()` (`<package | fileDefaultPackage>::<name>`) —
43
- * this mirrors `super-resolve`'s `findInTree`. This is the single matcher the
44
- * non-super resolvers (origin `@from`/`@of`/`@via` heads, template
45
- * `@payloadRef`/`@responseRef`, source `@parameterRef`, relationship `@through`)
46
- * share, so resolution behaves identically everywhere a ref resolves.
47
- *
48
- * `referrerPkg` defaults to `""` — the fail-closed FQN-exact-plus-root-level
49
- * behavior. The LOADER always passes the real referrer package (bare refs there
50
- * must resolve package-locally); downstream CODEGEN resolvers, which run on
51
- * already-validated metadata whose refs are FQN, may omit it. An empty
52
- * `referrerPkg` never binds a bare ref across a package boundary (fail-closed),
53
- * so omission can only fail to resolve — never mis-resolve.
43
+ * Does root-level object `node` satisfy object reference `ref` (no child tail),
44
+ * declared by a node whose effective package is `referrerPkg`? True when the node's
45
+ * resolution key is the FIRST candidate key that any object could bind — so it
46
+ * agrees with `resolveObjectRef`. Never matches on a short name.
54
47
  */
55
- export declare function refMatchesObject(node: MetaData, ref: string, referrerPkg?: string): boolean;
48
+ export declare function refMatchesObject(node: MetaData, ref: string, referrerPkg: string): boolean;
56
49
  /**
57
- * Resolve a metadata OBJECT reference under the ADR-0042 package-local contract
58
- * (see `refMatchesObject` for the matcher). `referrerPkg` is the effective
59
- * package of the node carrying the ref. Returns `{ node }` on resolution, or
60
- * `{}` (node undefined) when nothing matches — there is NO ambiguous outcome
61
- * (bare = package-local, so ambiguity is unreachable). The SINGLE resolver every
62
- * object-ref site shares so the contract is uniform.
50
+ * Resolve a metadata OBJECT reference (no child tail) under ADR-0059 R2.
51
+ * `referrerPkg` is the referrer's package (R3). Returns `{ node }` on resolution,
52
+ * `{ error }` for a parent-relative over-drop, or `{}` when nothing matches. The
53
+ * single object resolver every object-ref site shares.
63
54
  */
64
55
  export declare function resolveObjectRef(root: MetaData, ref: string, referrerPkg: string): {
65
56
  node?: MetaData | undefined;
57
+ error?: string | undefined;
66
58
  };
59
+ /**
60
+ * Resolve a reference that may carry a dotted child tail (ADR-0059 R2): bind the
61
+ * owner among the root's top-level nodes (of `ownerType` when given), then walk the
62
+ * tail by child name. Intermediate segments must be unique among the current node's
63
+ * effective children; the last segment is scoped to `lastType` when given. Returns
64
+ * the owner as well as the target, so a caller can spell the owner and keep the tail.
65
+ */
66
+ export declare function resolveRef(root: MetaData, ref: string, referrerPkg: string, opts?: {
67
+ ownerType?: string;
68
+ lastType?: string;
69
+ }): {
70
+ node?: MetaData | undefined;
71
+ owner?: MetaData | undefined;
72
+ error?: string | undefined;
73
+ };
74
+ /**
75
+ * ADR-0059 R7 — resolve a CANONICAL reference with no referrer: strip one leading
76
+ * `::`, match a top-level node's resolution key exactly, then walk any dotted tail.
77
+ * For consumers that hold a resolved model and no referrer context. Never matches
78
+ * on a short name.
79
+ */
80
+ export declare function lookupCanonical(root: MetaData, value: string, opts?: {
81
+ ownerType?: string;
82
+ lastType?: string;
83
+ }): MetaData | undefined;
84
+ /**
85
+ * ADR-0059 R6 — the canonical spelling of a resolved owner, as written from a
86
+ * referrer in package `referrerPkg`: `pkg::Name` for a packaged target, `::Name` for
87
+ * a root-level target from a packaged referrer, `Name` from a root-level referrer.
88
+ * Every spelling resolves to the same node with or without a referrer.
89
+ */
90
+ export declare function spellRef(target: MetaData, referrerPkg: string, tail?: string): string;
91
+ /** Effective package of a node: its own `package`, else its file's (ADR-0059 R10). */
92
+ export declare function effectivePackageOf(node: MetaData): string;
93
+ /** The top-level node (a direct child of the root) that physically contains `node`. */
94
+ export declare function topLevelNodeOf(node: MetaData): MetaData;
95
+ /**
96
+ * ADR-0059 R3 default — the package a reference attribute resolves in: the effective
97
+ * package of the top-level node that PHYSICALLY declares the attribute. For an
98
+ * attribute `node` inherits through `extends`, that is the ancestor that wrote it,
99
+ * so an inherited reference means what it meant where it was written.
100
+ */
101
+ export declare function referrerPackageFor(node: MetaData, attrName: string): string;
67
102
  /**
68
103
  * ADR-0042 §5 — a did-you-mean suffix for an UNRESOLVED object reference: the
69
104
  * FQNs of same-short-name objects that DO exist (typically in other packages),
@@ -72,4 +107,21 @@ export declare function resolveObjectRef(root: MetaData, ref: string, referrerPk
72
107
  * suggest). Appended to the per-attr unresolved-ref error message.
73
108
  */
74
109
  export declare function didYouMeanHint(root: MetaData, ref: string): string;
110
+ /**
111
+ * The did-you-mean suffix for an UNRESOLVED `extends` ref: the same candidate list
112
+ * as {@link didYouMeanHint}, plus the exact spelling to write. A bare `extends`
113
+ * resolves in the referrer's own package (ADR-0042/0059), so a base declared in
114
+ * another package must be named by its FQN. Returns "" when nothing is named alike.
115
+ */
116
+ export declare function didYouMeanSuperHint(root: MetaData, ref: string): string;
117
+ /**
118
+ * ADR-0059 R7 — the object a reference attribute on `node` names: the owner the loader
119
+ * bound once (`MetaAttr.resolvedTarget`), read RESOLVING so an inherited attribute
120
+ * works (ADR-0039). For a dotted ref (`Week.id`, `Program.weeks`) it is the owner
121
+ * object, not the tail. A tree built without the loader has no recorded target, so the
122
+ * value is resolved here from the package of the node that declared it. Undefined when
123
+ * the attribute is absent, is a list, or names nothing. Consumers use this instead of
124
+ * comparing a reference value to a short name.
125
+ */
126
+ export declare function refTarget(node: MetaData, attrName: string): MetaData | undefined;
75
127
  //# sourceMappingURL=naming-refs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"naming-refs.d.ts","sourceRoot":"","sources":["../src/naming-refs.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAiBtD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAYrD,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AA0DD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,OAAO,CAKvF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAYjC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAUlE"}
1
+ {"version":3,"file":"naming-refs.d.ts","sourceRoot":"","sources":["../src/naming-refs.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAkBtD;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAcrD,CAAC;AAEH,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAM3E;AA8CD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,6FAA6F;AAC7F,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;CAC/C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAWxF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAI1F;AA2BD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAE7D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAkB3F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,QAAQ,GAAG,SAAS,CAItB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,MAAM,CAIjF;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEzD;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAIvD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS3E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIlE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvE;AAgBD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAehF"}
@@ -1,30 +1,25 @@
1
- // FR-032 (ADR-0032) — canonical reference expansion.
1
+ // References: the one resolver every reference form goes through (ADR-0059).
2
2
  //
3
- // `expandRef(raw, packageContext)` is the SINGLE ref-expansion primitive. It
4
- // lowers an authored metadata reference to its fully-qualified canonical form
5
- // per ADR-0032 §2.1 — deterministically, with NO root fallback:
3
+ // Sources do not interpret references: YAML, canonical JSON and any future source
4
+ // build the tree with every reference string exactly as authored. This module
5
+ // gives each form its meaning, once, against the built tree:
6
6
  //
7
- // bare `Name` (no `::`, no leading `.`) → `<P>::Name` (current package only;
8
- // stays bare when P is empty/root).
9
- // qualified `pkg::Name` (contains `::`, → unchanged (absolute from root).
10
- // NOT leading `::`)
11
- // `::Rest` (leading `::`) → strip the leading `::`; the
12
- // remainder is absolute from root
13
- // (so `::a::b::C` ≡ `a::b::C`,
14
- // `::Apple` = root-level Apple).
15
- // `..::Rest` (one or more leading `..::`) → drop one package segment from P
16
- // per `..::`, then resolve Rest
17
- // (itself bare/qualified) against the
18
- // reduced package. Over-drop (more
19
- // `..::` than P has segments) throws.
7
+ // `::Rest` root-absolute — the node whose resolution key is exactly `Rest`
8
+ // (`::Apple` is the root-level Apple; `::a::b::C` is `a::b::C`).
9
+ // `..::Rest` parent-relative — drop one segment of the referrer's package per
10
+ // `..::`, then the exact key `<remaining>::Rest`. More `..::` than
11
+ // the package has segments is ERR_BAD_ATTR_VALUE.
12
+ // `pkg::Name` exact.
13
+ // `Name` the referrer's own package (`<referrerPkg>::Name`), else the
14
+ // root-level `Name` (ADR-0042 §2). Never another package.
20
15
  //
21
- // The trailing FR-024 DOTTED CHILD suffix (`.child` / `.child.grandchild`) is
22
- // PRESERVED verbatim: only the OWNER part (everything before the first `.` in
23
- // the final `::`-segment) is expanded; the `.child...` tail is reattached.
16
+ // No form falls back to another: `::Apple` never binds a local `acme::Apple`.
17
+ // A FR-024 dotted child tail (`Owner.child.grand`) starts at the first `.` after the
18
+ // last `::`; only the owner part is resolved by form, and the tail is kept as written.
24
19
  //
25
- // The desugar runs this on every ref-bearing attr so canonical JSON is FQN-only
26
- // (ADR-0032 §2.2/§2.3); the resolution layer then does pure FQN matching. The
27
- // `package` attribute is NEVER expanded — it is the node's identity.
20
+ // `spellRef` is the inverse: the one canonical spelling of a resolved target that
21
+ // resolves to the same node with or without a referrer. The `resolveReferences`
22
+ // loader pass rewrites every reference to it, so consumers read canonical values.
28
23
  import { PACKAGE_SEPARATOR, PACKAGE_PARENT, CHILD_REF_SEPARATOR } from "./shared/structural.js";
29
24
  import { TYPE_OBJECT } from "./shared/base-types.js";
30
25
  import { RELATIONSHIP_ATTR_OBJECT_REF, RELATIONSHIP_ATTR_THROUGH } from "./core/relationship/relationship-constants.js";
@@ -32,20 +27,18 @@ import { FIELD_ATTR_OBJECT_REF } from "./core/field/field-constants.js";
32
27
  import { IDENTITY_REFERENCE_ATTR_REFERENCES } from "./core/identity/identity-constants.js";
33
28
  import { ORIGIN_PASSTHROUGH_ATTR_FROM, ORIGIN_PASSTHROUGH_ATTR_VIA, ORIGIN_AGGREGATE_ATTR_OF, ORIGIN_AGGREGATE_ATTR_VIA, } from "./persistence/origin/origin-constants.js";
34
29
  import { SOURCE_ATTR_PARAMETER_REF } from "./persistence/source/source-constants.js";
30
+ import { OBJECT_REPORT_ATTR_FROM, OBJECT_REPORT_ATTR_SPINE } from "./core/object/object-constants.js";
35
31
  import { TEMPLATE_ATTR_PAYLOAD_REF, TEMPLATE_ATTR_RESPONSE_REF } from "./template/template-constants.js";
36
32
  const PARENT_PREFIX = PACKAGE_PARENT + PACKAGE_SEPARATOR; // "..::"
37
33
  /**
38
- * The inline (`@`-prefixed) attribute names whose VALUE is a metadata reference
39
- * subject to FR-032 expansion/guarding (ADR-0032 §3). The structural `extends`
40
- * key is handled separately (it is not `@`-prefixed). `@objectRef`/`@references`
41
- * are pure object refs; `@from`/`@of`/`@via` carry an entity HEAD (possibly with
42
- * a dotted relationship/field tail — expandRef preserves the tail);
43
- * `@parameterRef`/`@payloadRef`/`@responseRef` reference value-objects. These are
44
- * expanded by the YAML desugar and rejected (when still relative) by the
45
- * canonical-JSON guard. `@through` (the M:N junction ref) is in the set per
46
- * ADR-0042 §4 — it desugars to FQN and resolves package-local like every other
47
- * object ref. `@sourceRefField` (a FK FIELD name, not an object ref) is NOT in
48
- * the set.
34
+ * The inline (`@`-prefixed) attribute names whose VALUE is a metadata object
35
+ * reference (ADR-0059 R4). The structural `extends` key is handled separately (it is
36
+ * not `@`-prefixed). `@objectRef`/`@references`/`@through` are pure object refs;
37
+ * `@from`/`@of`/`@via`/`@spine` carry an entity HEAD with a dotted
38
+ * relationship/field tail; `@parameterRef`/`@payloadRef`/`@responseRef` name
39
+ * value-objects. The same set is used in every port. `@sourceRefField` (a FK FIELD
40
+ * name) and `@implementedBy` (which may name a template as well as an object) are
41
+ * NOT in the set.
49
42
  */
50
43
  export const REF_BEARING_ATTR_NAMES = new Set([
51
44
  RELATIONSHIP_ATTR_OBJECT_REF, // = FIELD_ATTR_OBJECT_REF (same spelling "objectRef")
@@ -59,12 +52,10 @@ export const REF_BEARING_ATTR_NAMES = new Set([
59
52
  SOURCE_ATTR_PARAMETER_REF,
60
53
  TEMPLATE_ATTR_PAYLOAD_REF,
61
54
  TEMPLATE_ATTR_RESPONSE_REF,
55
+ OBJECT_REPORT_ATTR_FROM, // = ORIGIN_PASSTHROUGH_ATTR_FROM ("from")
56
+ OBJECT_REPORT_ATTR_SPINE,
62
57
  ]);
63
- /**
64
- * True when `raw` is a relative reference form (`::Rest` or `..::Rest`) that the
65
- * YAML desugar must expand before canonical JSON. Canonical JSON must be FQN; a
66
- * relative ref surviving into it is `ERR_RELATIVE_REF_IN_CANONICAL`.
67
- */
58
+ /** True when `raw` is a relative reference form (`::Rest` or `..::Rest`). */
68
59
  export function isRelativeRef(raw) {
69
60
  return raw.startsWith(PACKAGE_SEPARATOR) || raw.startsWith(PARENT_PREFIX);
70
61
  }
@@ -75,7 +66,7 @@ export function isRelativeRef(raw) {
75
66
  * at the first `.` AFTER the last `::`. Returns `{ owner, tail }` where `tail`
76
67
  * includes the leading `.` (or is "" when there is no child suffix).
77
68
  */
78
- function splitChildTail(raw) {
69
+ export function splitChildTail(raw) {
79
70
  const lastSep = raw.lastIndexOf(PACKAGE_SEPARATOR);
80
71
  const segStart = lastSep === -1 ? 0 : lastSep + PACKAGE_SEPARATOR.length;
81
72
  const dotInSeg = raw.indexOf(CHILD_REF_SEPARATOR, segStart);
@@ -84,8 +75,11 @@ function splitChildTail(raw) {
84
75
  return { owner: raw.slice(0, dotInSeg), tail: raw.slice(dotInSeg) };
85
76
  }
86
77
  /**
87
- * Expand an authored reference's OWNER part (no child tail) to its FQN per
88
- * ADR-0032 §2.1. Throws on parent-relative over-drop.
78
+ * Expand an authored reference's OWNER part (no child tail) against a package
79
+ * context: `::Rest` → `Rest`, `..::Rest` → the reduced package `::Rest`,
80
+ * `pkg::Name` unchanged, bare `Name` → `<P>::Name`. Throws on parent-relative
81
+ * over-drop. The resolver uses it for the two relative forms only; a bare name is
82
+ * resolved own-package-then-root (see `ownerCandidateKeys`).
89
83
  */
90
84
  function expandOwner(owner, packageContext) {
91
85
  // root-absolute: leading "::" → strip; the remainder is absolute from root.
@@ -119,70 +113,158 @@ function expandOwner(owner, packageContext) {
119
113
  return packageContext !== "" ? `${packageContext}${PACKAGE_SEPARATOR}${owner}` : owner;
120
114
  }
121
115
  /**
122
- * Expand an authored reference to its fully-qualified canonical form per
123
- * ADR-0032 §2.1, preserving any FR-024 dotted child suffix. The package context
124
- * `P` is the declaring node's effective package (its own `package` or the
125
- * file-default). Throws on parent-relative over-drop — the caller emits an error.
116
+ * Expand an authored reference against a package context, preserving any FR-024
117
+ * dotted child suffix. Throws on parent-relative over-drop — the caller emits an
118
+ * error.
126
119
  */
127
120
  export function expandRef(raw, packageContext) {
128
121
  const { owner, tail } = splitChildTail(raw);
129
122
  return expandOwner(owner, packageContext) + tail;
130
123
  }
124
+ /** A parent-relative reference with more `..::` than its referrer's package has segments. */
125
+ export class RefOverDropError extends Error {
126
+ code = "ERR_BAD_ATTR_VALUE";
127
+ }
131
128
  /**
132
- * ADR-0042 — does root-level object `node` satisfy object reference `ref`,
133
- * declared by a node whose effective package is `referrerPkg`? A single
134
- * package-local matcher:
135
- * - **FQN** `ref` (contains `::`) → EXACT match on `resolutionKey()`. No
136
- * bare-tail fallback, so an FQN pointing at one package never binds a
137
- * same-named object in another.
138
- * - **bare** `ref` (no `::`) → the referrer's OWN package
139
- * (`<referrerPkg>::<ref>`), else a **root-level** (empty-package) object
140
- * whose resolution key IS `ref`. No cross-package bare resolution, no
141
- * globally-unique scan.
142
- *
143
- * Objects keep a BARE `fqn()` per the FR5d cross-port contract, so the canonical
144
- * FQN accessor is `resolutionKey()` (`<package | fileDefaultPackage>::<name>`) —
145
- * this mirrors `super-resolve`'s `findInTree`. This is the single matcher the
146
- * non-super resolvers (origin `@from`/`@of`/`@via` heads, template
147
- * `@payloadRef`/`@responseRef`, source `@parameterRef`, relationship `@through`)
148
- * share, so resolution behaves identically everywhere a ref resolves.
149
- *
150
- * `referrerPkg` defaults to `""` — the fail-closed FQN-exact-plus-root-level
151
- * behavior. The LOADER always passes the real referrer package (bare refs there
152
- * must resolve package-locally); downstream CODEGEN resolvers, which run on
153
- * already-validated metadata whose refs are FQN, may omit it. An empty
154
- * `referrerPkg` never binds a bare ref across a package boundary (fail-closed),
155
- * so omission can only fail to resolve — never mis-resolve.
129
+ * The resolution keys an OWNER reference (no child tail) may bind, in the order to
130
+ * try them (ADR-0059 R2). Every form but bare is one exact key; bare is the
131
+ * referrer's own package, then root-level. Throws RefOverDropError on over-drop.
156
132
  */
157
- export function refMatchesObject(node, ref, referrerPkg = "") {
158
- const key = node.resolutionKey();
159
- if (ref.includes(PACKAGE_SEPARATOR))
160
- return key === ref;
161
- if (referrerPkg !== "" && key === `${referrerPkg}${PACKAGE_SEPARATOR}${ref}`)
162
- return true;
163
- return key === ref; // root-level (empty-package) object whose key is the bare name
133
+ export function ownerCandidateKeys(owner, referrerPkg) {
134
+ if (owner.startsWith(PACKAGE_SEPARATOR))
135
+ return [owner.slice(PACKAGE_SEPARATOR.length)];
136
+ if (owner.startsWith(PARENT_PREFIX)) {
137
+ try {
138
+ return [expandOwner(owner, referrerPkg)];
139
+ }
140
+ catch (err) {
141
+ throw new RefOverDropError(err.message);
142
+ }
143
+ }
144
+ if (owner.includes(PACKAGE_SEPARATOR))
145
+ return [owner];
146
+ return referrerPkg !== "" ? [`${referrerPkg}${PACKAGE_SEPARATOR}${owner}`, owner] : [owner];
164
147
  }
165
148
  /**
166
- * Resolve a metadata OBJECT reference under the ADR-0042 package-local contract
167
- * (see `refMatchesObject` for the matcher). `referrerPkg` is the effective
168
- * package of the node carrying the ref. Returns `{ node }` on resolution, or
169
- * `{}` (node undefined) when nothing matches — there is NO ambiguous outcome
170
- * (bare = package-local, so ambiguity is unreachable). The SINGLE resolver every
171
- * object-ref site shares so the contract is uniform.
149
+ * Does root-level object `node` satisfy object reference `ref` (no child tail),
150
+ * declared by a node whose effective package is `referrerPkg`? True when the node's
151
+ * resolution key is the FIRST candidate key that any object could bind — so it
152
+ * agrees with `resolveObjectRef`. Never matches on a short name.
153
+ */
154
+ export function refMatchesObject(node, ref, referrerPkg) {
155
+ const resolved = resolveObjectRef(node.parent ?? node, ref, referrerPkg).node;
156
+ if (resolved !== undefined)
157
+ return resolved === node;
158
+ return false;
159
+ }
160
+ /** The root's direct children of `type` (ADR-0039: root has no super). */
161
+ function topLevelOfType(root, type) {
162
+ const all = root.children();
163
+ return type === undefined ? all : all.filter((c) => c.type === type);
164
+ }
165
+ /** Bind an owner reference among `candidates` by exact resolution key (R2). */
166
+ function bindOwner(candidates, owner, referrerPkg) {
167
+ let keys;
168
+ try {
169
+ keys = ownerCandidateKeys(owner, referrerPkg);
170
+ }
171
+ catch (err) {
172
+ return { error: err.message };
173
+ }
174
+ for (const key of keys) {
175
+ const node = candidates.find((c) => c.resolutionKey() === key);
176
+ if (node !== undefined)
177
+ return { node };
178
+ }
179
+ return {};
180
+ }
181
+ /**
182
+ * Resolve a metadata OBJECT reference (no child tail) under ADR-0059 R2.
183
+ * `referrerPkg` is the referrer's package (R3). Returns `{ node }` on resolution,
184
+ * `{ error }` for a parent-relative over-drop, or `{}` when nothing matches. The
185
+ * single object resolver every object-ref site shares.
172
186
  */
173
187
  export function resolveObjectRef(root, ref, referrerPkg) {
174
- const objects = root.children().filter((c) => c.type === TYPE_OBJECT);
175
- if (ref.includes(PACKAGE_SEPARATOR)) {
176
- return { node: objects.find((c) => c.resolutionKey() === ref) };
188
+ return bindOwner(topLevelOfType(root, TYPE_OBJECT), ref, referrerPkg);
189
+ }
190
+ /**
191
+ * Resolve a reference that may carry a dotted child tail (ADR-0059 R2): bind the
192
+ * owner among the root's top-level nodes (of `ownerType` when given), then walk the
193
+ * tail by child name. Intermediate segments must be unique among the current node's
194
+ * effective children; the last segment is scoped to `lastType` when given. Returns
195
+ * the owner as well as the target, so a caller can spell the owner and keep the tail.
196
+ */
197
+ export function resolveRef(root, ref, referrerPkg, opts) {
198
+ const { owner, tail } = splitChildTail(ref);
199
+ const bound = bindOwner(topLevelOfType(root, opts?.ownerType), owner, referrerPkg);
200
+ if (bound.node === undefined)
201
+ return bound;
202
+ if (tail === "")
203
+ return { node: bound.node, owner: bound.node };
204
+ const path = tail.slice(CHILD_REF_SEPARATOR.length).split(CHILD_REF_SEPARATOR);
205
+ if (path.some((p) => p === ""))
206
+ return {};
207
+ let current = bound.node;
208
+ for (let i = 0; i < path.length - 1; i++) {
209
+ const matches = current.children().filter((c) => c.name === path[i]);
210
+ if (matches.length !== 1)
211
+ return { owner: bound.node };
212
+ current = matches[0];
213
+ }
214
+ const last = path[path.length - 1];
215
+ const target = current
216
+ .children()
217
+ .find((c) => c.name === last && (opts?.lastType === undefined || c.type === opts.lastType));
218
+ return { node: target, owner: bound.node };
219
+ }
220
+ /**
221
+ * ADR-0059 R7 — resolve a CANONICAL reference with no referrer: strip one leading
222
+ * `::`, match a top-level node's resolution key exactly, then walk any dotted tail.
223
+ * For consumers that hold a resolved model and no referrer context. Never matches
224
+ * on a short name.
225
+ */
226
+ export function lookupCanonical(root, value, opts) {
227
+ const { owner, tail } = splitChildTail(value);
228
+ const exact = owner.startsWith(PACKAGE_SEPARATOR) ? owner : `${PACKAGE_SEPARATOR}${owner}`;
229
+ return resolveRef(root, exact + tail, "", opts).node;
230
+ }
231
+ /**
232
+ * ADR-0059 R6 — the canonical spelling of a resolved owner, as written from a
233
+ * referrer in package `referrerPkg`: `pkg::Name` for a packaged target, `::Name` for
234
+ * a root-level target from a packaged referrer, `Name` from a root-level referrer.
235
+ * Every spelling resolves to the same node with or without a referrer.
236
+ */
237
+ export function spellRef(target, referrerPkg, tail = "") {
238
+ const key = target.resolutionKey();
239
+ const rootLevel = !key.includes(PACKAGE_SEPARATOR);
240
+ return (rootLevel && referrerPkg !== "" ? `${PACKAGE_SEPARATOR}${key}` : key) + tail;
241
+ }
242
+ /** Effective package of a node: its own `package`, else its file's (ADR-0059 R10). */
243
+ export function effectivePackageOf(node) {
244
+ return node.package ?? node.fileDefaultPackage ?? "";
245
+ }
246
+ /** The top-level node (a direct child of the root) that physically contains `node`. */
247
+ export function topLevelNodeOf(node) {
248
+ let current = node;
249
+ while (current.parent !== undefined && current.parent.parent !== undefined)
250
+ current = current.parent;
251
+ return current;
252
+ }
253
+ /**
254
+ * ADR-0059 R3 default — the package a reference attribute resolves in: the effective
255
+ * package of the top-level node that PHYSICALLY declares the attribute. For an
256
+ * attribute `node` inherits through `extends`, that is the ancestor that wrote it,
257
+ * so an inherited reference means what it meant where it was written.
258
+ */
259
+ export function referrerPackageFor(node, attrName) {
260
+ let declarer = node;
261
+ const seen = new Set();
262
+ // ADR-0039: own — locating the layer that physically declares the attr.
263
+ while (declarer !== undefined && !declarer.ownHasAttr(attrName) && !seen.has(declarer)) {
264
+ seen.add(declarer);
265
+ declarer = declarer.superResolved;
177
266
  }
178
- // Bare: PREFER the referrer's own package, THEN a root-level (empty-package)
179
- // object — mirroring the loader symbol table's `byKey.get(localKey) ?? get(ref)`
180
- // so both resolvers agree when a root-level object shares the bare name.
181
- const localKey = referrerPkg !== "" ? `${referrerPkg}${PACKAGE_SEPARATOR}${ref}` : ref;
182
- const own = objects.find((c) => c.resolutionKey() === localKey);
183
- if (own !== undefined)
184
- return { node: own };
185
- return { node: localKey !== ref ? objects.find((c) => c.resolutionKey() === ref) : undefined };
267
+ return effectivePackageOf(topLevelNodeOf(declarer ?? node));
186
268
  }
187
269
  /**
188
270
  * ADR-0042 §5 — a did-you-mean suffix for an UNRESOLVED object reference: the
@@ -192,6 +274,24 @@ export function resolveObjectRef(root, ref, referrerPkg) {
192
274
  * suggest). Appended to the per-attr unresolved-ref error message.
193
275
  */
194
276
  export function didYouMeanHint(root, ref) {
277
+ const found = sameNamedObjects(root, ref);
278
+ if (found === undefined)
279
+ return "";
280
+ return ` An object named "${found.shortName}" exists in: ${found.candidates.join(", ")}. Qualify it with its package (FQN).`;
281
+ }
282
+ /**
283
+ * The did-you-mean suffix for an UNRESOLVED `extends` ref: the same candidate list
284
+ * as {@link didYouMeanHint}, plus the exact spelling to write. A bare `extends`
285
+ * resolves in the referrer's own package (ADR-0042/0059), so a base declared in
286
+ * another package must be named by its FQN. Returns "" when nothing is named alike.
287
+ */
288
+ export function didYouMeanSuperHint(root, ref) {
289
+ const found = sameNamedObjects(root, ref);
290
+ if (found === undefined)
291
+ return "";
292
+ return ` An object named "${found.shortName}" exists in: ${found.candidates.join(", ")}. Qualify it with its package (FQN): write extends: "${found.candidates[0]}".`;
293
+ }
294
+ function sameNamedObjects(root, ref) {
195
295
  const { owner } = splitChildTail(ref);
196
296
  const sep = owner.lastIndexOf(PACKAGE_SEPARATOR);
197
297
  const shortName = sep === -1 ? owner : owner.slice(sep + PACKAGE_SEPARATOR.length);
@@ -199,8 +299,34 @@ export function didYouMeanHint(root, ref) {
199
299
  .children()
200
300
  .filter((c) => c.type === TYPE_OBJECT && c.name === shortName)
201
301
  .map((c) => c.resolutionKey());
202
- if (candidates.length === 0)
203
- return "";
204
- return ` An object named "${shortName}" exists in: ${candidates.join(", ")}. Qualify it with its package (FQN).`;
302
+ return candidates.length === 0 ? undefined : { shortName, candidates };
303
+ }
304
+ /**
305
+ * ADR-0059 R7 — the object a reference attribute on `node` names: the owner the loader
306
+ * bound once (`MetaAttr.resolvedTarget`), read RESOLVING so an inherited attribute
307
+ * works (ADR-0039). For a dotted ref (`Week.id`, `Program.weeks`) it is the owner
308
+ * object, not the tail. A tree built without the loader has no recorded target, so the
309
+ * value is resolved here from the package of the node that declared it. Undefined when
310
+ * the attribute is absent, is a list, or names nothing. Consumers use this instead of
311
+ * comparing a reference value to a short name.
312
+ */
313
+ export function refTarget(node, attrName) {
314
+ const seen = new Set();
315
+ for (let n = node; n !== undefined && !seen.has(n); n = n.superResolved) {
316
+ seen.add(n);
317
+ // ADR-0039: own — locating the layer that declares the attr, walking the super chain.
318
+ const attr = n.ownMetaAttr(attrName);
319
+ if (attr === undefined)
320
+ continue;
321
+ const recorded = attr.resolvedTarget;
322
+ if (recorded !== undefined)
323
+ return Array.isArray(recorded) ? undefined : recorded;
324
+ const value = attr.value;
325
+ if (typeof value !== "string" || value === "")
326
+ return undefined;
327
+ const { owner } = splitChildTail(value);
328
+ return resolveObjectRef(node.root(), owner, effectivePackageOf(topLevelNodeOf(n))).node;
329
+ }
330
+ return undefined;
205
331
  }
206
332
  //# sourceMappingURL=naming-refs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"naming-refs.js","sourceRoot":"","sources":["../src/naming-refs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"naming-refs.js","sourceRoot":"","sources":["../src/naming-refs.ts"],"names":[],"mappings":"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"}