@refrakt-md/runes 0.38.0 → 0.39.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 (79) hide show
  1. package/dist/collection-helpers.d.ts +21 -2
  2. package/dist/collection-helpers.d.ts.map +1 -1
  3. package/dist/collection-helpers.js +72 -15
  4. package/dist/collection-helpers.js.map +1 -1
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +73 -40
  7. package/dist/config.js.map +1 -1
  8. package/dist/data-pipeline.d.ts +24 -10
  9. package/dist/data-pipeline.d.ts.map +1 -1
  10. package/dist/data-pipeline.js +34 -56
  11. package/dist/data-pipeline.js.map +1 -1
  12. package/dist/file-ref-resolve.js +9 -13
  13. package/dist/file-ref-resolve.js.map +1 -1
  14. package/dist/index.d.ts +8 -3
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +7 -4
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/index.d.ts +47 -1
  19. package/dist/lib/index.d.ts.map +1 -1
  20. package/dist/lib/index.js +112 -5
  21. package/dist/lib/index.js.map +1 -1
  22. package/dist/lib/preprocess.d.ts +63 -0
  23. package/dist/lib/preprocess.d.ts.map +1 -0
  24. package/dist/lib/preprocess.js +71 -0
  25. package/dist/lib/preprocess.js.map +1 -0
  26. package/dist/lib/registers.d.ts +132 -0
  27. package/dist/lib/registers.d.ts.map +1 -0
  28. package/dist/lib/registers.js +328 -0
  29. package/dist/lib/registers.js.map +1 -0
  30. package/dist/lib/resolver.d.ts +9 -1
  31. package/dist/lib/resolver.d.ts.map +1 -1
  32. package/dist/lib/resolver.js +16 -0
  33. package/dist/lib/resolver.js.map +1 -1
  34. package/dist/lib/schema-table.d.ts +46 -9
  35. package/dist/lib/schema-table.d.ts.map +1 -1
  36. package/dist/lib/schema-table.js +111 -22
  37. package/dist/lib/schema-table.js.map +1 -1
  38. package/dist/lib/slots.d.ts +99 -0
  39. package/dist/lib/slots.d.ts.map +1 -0
  40. package/dist/lib/slots.js +448 -0
  41. package/dist/lib/slots.js.map +1 -0
  42. package/dist/reference.d.ts +18 -0
  43. package/dist/reference.d.ts.map +1 -1
  44. package/dist/reference.js +34 -1
  45. package/dist/reference.js.map +1 -1
  46. package/dist/registers-pipeline.d.ts +50 -0
  47. package/dist/registers-pipeline.d.ts.map +1 -0
  48. package/dist/registers-pipeline.js +218 -0
  49. package/dist/registers-pipeline.js.map +1 -0
  50. package/dist/schema-row.d.ts +5 -0
  51. package/dist/schema-row.d.ts.map +1 -1
  52. package/dist/schema-row.js +1 -0
  53. package/dist/schema-row.js.map +1 -1
  54. package/dist/tags/data.d.ts +2 -2
  55. package/dist/tags/data.d.ts.map +1 -1
  56. package/dist/tags/data.js +6 -4
  57. package/dist/tags/data.js.map +1 -1
  58. package/dist/tags/figure.d.ts +10 -4
  59. package/dist/tags/figure.d.ts.map +1 -1
  60. package/dist/tags/figure.js +65 -20
  61. package/dist/tags/figure.js.map +1 -1
  62. package/dist/tags/include.d.ts +51 -7
  63. package/dist/tags/include.d.ts.map +1 -1
  64. package/dist/tags/include.js +216 -7
  65. package/dist/tags/include.js.map +1 -1
  66. package/dist/tags/snippet.d.ts +9 -10
  67. package/dist/tags/snippet.d.ts.map +1 -1
  68. package/dist/tags/snippet.js +213 -10
  69. package/dist/tags/snippet.js.map +1 -1
  70. package/dist/universal-attributes.d.ts +1 -1
  71. package/package.json +3 -3
  72. package/dist/include-pipeline.d.ts +0 -52
  73. package/dist/include-pipeline.d.ts.map +0 -1
  74. package/dist/include-pipeline.js +0 -206
  75. package/dist/include-pipeline.js.map +0 -1
  76. package/dist/snippet-pipeline.d.ts +0 -44
  77. package/dist/snippet-pipeline.d.ts.map +0 -1
  78. package/dist/snippet-pipeline.js +0 -307
  79. package/dist/snippet-pipeline.js.map +0 -1
@@ -60,7 +60,18 @@ export declare class Ordering {
60
60
  export declare function buildOrdering(embedConfig: CollectionEmbedConfig | undefined): Ordering;
61
61
  export declare function entityUrl(e: EntityRegistration): string;
62
62
  export declare function entityTitle(e: EntityRegistration): string;
63
+ /** A field rendered for display — an array is joined with `, `. Not a
64
+ * grouping or sorting key: a multi-value field reads as one combined string
65
+ * here (BUG-025); use {@link fieldMembers} / {@link groupKeys} for that. */
63
66
  export declare function fieldValue(e: EntityRegistration, field: string): string;
67
+ /** A field's individual values — the split the filter side applies
68
+ * (`candidates()` in `field-match.ts`): a genuine array fans out by element, a
69
+ * comma-string by member, each trimmed. Empty members are dropped and repeats
70
+ * collapse, so `"a, , a, b"` is `['a', 'b']` and a missing value is `[]`. */
71
+ export declare function fieldMembers(e: EntityRegistration, field: string): string[];
72
+ /** The groups an entity joins under `group="<field>"` — one per member of a
73
+ * multi-value field (BUG-025), or `(none)` when it carries no value. */
74
+ export declare function groupKeys(e: EntityRegistration, field: string): string[];
64
75
  /** A title link to an entity, or a plain span when it has no URL. The BEM
65
76
  * block is the caller's (collection / relationships). */
66
77
  export declare function titleLink(e: EntityRegistration, block: string): TagNode;
@@ -91,11 +102,19 @@ export declare function projectItem(e: EntityRegistration, opts?: {
91
102
  /** Sort entities by a `sort` expression (`field`, `-field`, `field-desc`).
92
103
  * With an {@link Ordering}, enum fields sort by domain rank (each entity ranked
93
104
  * within its *own* `(type, field)` order — so mixed-type sets compose); ranked
94
- * items come before unranked, which then fall back to numeric/lexical. */
105
+ * items come before unranked, which then fall back to numeric/lexical.
106
+ *
107
+ * A multi-value field sorts each entity by one representative member, never by
108
+ * the joined string (BUG-025): its smallest member ascending, its largest
109
+ * descending — MongoDB's rule for sorting on an array. With an ordering, a
110
+ * ranked member is preferred over an unranked one. */
95
111
  export declare function sortEntities(entities: EntityRegistration[], sortExpr: string, ordering?: Ordering): EntityRegistration[];
96
112
  /** Group items into an insertion-ordered map keyed by a derived string. */
97
113
  export declare function groupBy<T>(items: T[], keyOf: (item: T) => string): Map<string, T[]>;
98
- /** Group entities by one of their fields (empty → `(none)`). With an
114
+ /** Group entities by one of their fields (empty → `(none)`). A multi-value
115
+ * field fans out (BUG-025): an entity tagged `runes, data` joins both the
116
+ * `runes` and the `data` group, so group sizes can sum past the entity count —
117
+ * a group's size is the number of entities *carrying* that value. With an
99
118
  * {@link Ordering}, groups are emitted in domain order — each group's
100
119
  * representative (minimum) rank across its members, ranked groups first. */
101
120
  export declare function groupEntities(entities: EntityRegistration[], field: string, ordering?: Ordering): Map<string, EntityRegistration[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"collection-helpers.d.ts","sourceRoot":"","sources":["../src/collection-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collection-helpers.d.ts","sourceRoot":"","sources":["../src/collection-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAQ,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAI5D,QAAA,MAAQ,GAAG,oBAAiB,CAAC;AAC7B,KAAK,OAAO,GAAG,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;AAExC,+EAA+E;AAC/E,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAmB5D;AAED;mDACmD;AACnD,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;+EAE2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACrD;;;gDAG4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACpE;AAED;;+EAE+E;AAC/E,qBAAa,QAAQ;IAEnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EACjD,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;IAG1E,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIxD;gDAC4C;IAC5C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CAKxD;AAED;6EAC6E;AAC7E,wBAAgB,aAAa,CAAC,WAAW,EAAE,qBAAqB,GAAG,SAAS,GAAG,QAAQ,CActF;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAEvD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAGzD;AAED;;6EAE6E;AAC7E,wBAAgB,UAAU,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED;;;8EAG8E;AAC9E,wBAAgB,YAAY,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAI3E;AAED;yEACyE;AACzE,wBAAgB,SAAS,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAGxE;AAED;0DAC0D;AAC1D,wBAAgB,SAAS,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAOvE;AAED;8EAC8E;AAC9E,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAE9D;AAED;;;;kBAIkB;AAClB,wBAAgB,WAAW,CAC1B,CAAC,EAAE,kBAAkB,EACrB,IAAI,CAAC,EAAE;IACN,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;;;;;;;;;;EAeD;AAWD;;;;;;;;uDAQuD;AACvD,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,QAAQ,GACjB,kBAAkB,EAAE,CA4CtB;AAED,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CASnF;AAED;;;;;6EAK6E;AAC7E,wBAAgB,aAAa,CAC5B,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,QAAQ,GACjB,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAoBnC;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC9B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC5B;AAED;;;;yEAIyE;AACzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,kBAAkB,EAAE,CAYnF;AAED;4EAC4E;AAC5E,wBAAgB,kBAAkB,CACjC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,qBAAqB,EAClC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,kBAAkB,EAAE,CAGtB"}
@@ -88,12 +88,30 @@ export function entityTitle(e) {
88
88
  const d = e.data;
89
89
  return String(d.title ?? d.name ?? e.id);
90
90
  }
91
+ /** A field rendered for display — an array is joined with `, `. Not a
92
+ * grouping or sorting key: a multi-value field reads as one combined string
93
+ * here (BUG-025); use {@link fieldMembers} / {@link groupKeys} for that. */
91
94
  export function fieldValue(e, field) {
92
95
  const v = resolveEntityField(e, field);
93
96
  if (Array.isArray(v))
94
97
  return v.join(', ');
95
98
  return String(v ?? '');
96
99
  }
100
+ /** A field's individual values — the split the filter side applies
101
+ * (`candidates()` in `field-match.ts`): a genuine array fans out by element, a
102
+ * comma-string by member, each trimmed. Empty members are dropped and repeats
103
+ * collapse, so `"a, , a, b"` is `['a', 'b']` and a missing value is `[]`. */
104
+ export function fieldMembers(e, field) {
105
+ const v = resolveEntityField(e, field);
106
+ const raw = Array.isArray(v) ? v.map((x) => String(x ?? '')) : String(v ?? '').split(',');
107
+ return [...new Set(raw.map((m) => m.trim()).filter(Boolean))];
108
+ }
109
+ /** The groups an entity joins under `group="<field>"` — one per member of a
110
+ * multi-value field (BUG-025), or `(none)` when it carries no value. */
111
+ export function groupKeys(e, field) {
112
+ const members = fieldMembers(e, field);
113
+ return members.length ? members : ['(none)'];
114
+ }
97
115
  /** A title link to an entity, or a plain span when it has no URL. The BEM
98
116
  * block is the caller's (collection / relationships). */
99
117
  export function titleLink(e, block) {
@@ -129,10 +147,24 @@ export function projectItem(e, opts) {
129
147
  groupCount: opts?.groupCount ?? 0,
130
148
  };
131
149
  }
150
+ /** Order two scalar field values: numeric when both are finite numbers,
151
+ * lexical otherwise. */
152
+ function compareScalar(av, bv) {
153
+ const an = Number(av);
154
+ const bn = Number(bv);
155
+ if (av !== '' && bv !== '' && Number.isFinite(an) && Number.isFinite(bn))
156
+ return an - bn;
157
+ return av.localeCompare(bv);
158
+ }
132
159
  /** Sort entities by a `sort` expression (`field`, `-field`, `field-desc`).
133
160
  * With an {@link Ordering}, enum fields sort by domain rank (each entity ranked
134
161
  * within its *own* `(type, field)` order — so mixed-type sets compose); ranked
135
- * items come before unranked, which then fall back to numeric/lexical. */
162
+ * items come before unranked, which then fall back to numeric/lexical.
163
+ *
164
+ * A multi-value field sorts each entity by one representative member, never by
165
+ * the joined string (BUG-025): its smallest member ascending, its largest
166
+ * descending — MongoDB's rule for sorting on an array. With an ordering, a
167
+ * ranked member is preferred over an unranked one. */
136
168
  export function sortEntities(entities, sortExpr, ordering) {
137
169
  if (!sortExpr)
138
170
  return entities;
@@ -150,10 +182,29 @@ export function sortEntities(entities, sortExpr, ordering) {
150
182
  field = field.slice(0, -4);
151
183
  }
152
184
  const ranked = ordering && entities.some((e) => ordering.order(e.type, field));
185
+ const rankOf = (e, v) => ranked ? ordering.rank(e.type, field, v) : -1;
186
+ // The value each entity sorts by — its own value when single-valued, else
187
+ // the member that sorts first in this direction.
188
+ const keyOf = (e) => {
189
+ const members = fieldMembers(e, field);
190
+ if (members.length < 2)
191
+ return fieldValue(e, field);
192
+ return members.reduce((best, m) => {
193
+ const rm = rankOf(e, m);
194
+ const rb = rankOf(e, best);
195
+ if (rm >= 0 !== rb >= 0)
196
+ return rm >= 0 ? m : best;
197
+ const c = rm >= 0 ? rm - rb : compareScalar(m, best);
198
+ return c * dir < 0 ? m : best;
199
+ });
200
+ };
201
+ const keys = new Map(entities.map((e) => [e, keyOf(e)]));
153
202
  return [...entities].sort((a, b) => {
203
+ const av = keys.get(a);
204
+ const bv = keys.get(b);
154
205
  if (ranked) {
155
- const ra = ordering.rank(a.type, field, fieldValue(a, field));
156
- const rb = ordering.rank(b.type, field, fieldValue(b, field));
206
+ const ra = rankOf(a, av);
207
+ const rb = rankOf(b, bv);
157
208
  const aR = ra >= 0, bR = rb >= 0;
158
209
  if (aR && bR) {
159
210
  if (ra !== rb)
@@ -162,13 +213,7 @@ export function sortEntities(entities, sortExpr, ordering) {
162
213
  else if (aR !== bR)
163
214
  return aR ? -1 : 1; // ranked before unranked, dir-independent
164
215
  }
165
- const av = fieldValue(a, field);
166
- const bv = fieldValue(b, field);
167
- const an = Number(av);
168
- const bn = Number(bv);
169
- if (av !== '' && bv !== '' && Number.isFinite(an) && Number.isFinite(bn))
170
- return (an - bn) * dir;
171
- return av.localeCompare(bv) * dir;
216
+ return compareScalar(av, bv) * dir;
172
217
  });
173
218
  }
174
219
  /** Group items into an insertion-ordered map keyed by a derived string. */
@@ -184,23 +229,35 @@ export function groupBy(items, keyOf) {
184
229
  }
185
230
  return groups;
186
231
  }
187
- /** Group entities by one of their fields (empty → `(none)`). With an
232
+ /** Group entities by one of their fields (empty → `(none)`). A multi-value
233
+ * field fans out (BUG-025): an entity tagged `runes, data` joins both the
234
+ * `runes` and the `data` group, so group sizes can sum past the entity count —
235
+ * a group's size is the number of entities *carrying* that value. With an
188
236
  * {@link Ordering}, groups are emitted in domain order — each group's
189
237
  * representative (minimum) rank across its members, ranked groups first. */
190
238
  export function groupEntities(entities, field, ordering) {
191
- const groups = groupBy(entities, (e) => fieldValue(e, field) || '(none)');
239
+ const groups = new Map();
240
+ for (const e of entities) {
241
+ for (const key of groupKeys(e, field)) {
242
+ const arr = groups.get(key);
243
+ if (arr)
244
+ arr.push(e);
245
+ else
246
+ groups.set(key, [e]);
247
+ }
248
+ }
192
249
  if (!ordering || ![...entities].some((e) => ordering.order(e.type, field)))
193
250
  return groups;
194
- const repRank = (members) => {
251
+ const repRank = (key, members) => {
195
252
  let min = Infinity;
196
253
  for (const m of members) {
197
- const r = ordering.rank(m.type, field, fieldValue(m, field));
254
+ const r = ordering.rank(m.type, field, key);
198
255
  if (r >= 0 && r < min)
199
256
  min = r;
200
257
  }
201
258
  return min;
202
259
  };
203
- const sorted = [...groups.entries()].sort((a, b) => repRank(a[1]) - repRank(b[1]));
260
+ const sorted = [...groups.entries()].sort((a, b) => repRank(...a) - repRank(...b));
204
261
  return new Map(sorted);
205
262
  }
206
263
  /** Render grouped items as an accordion of native `<details>` panels, styled to
@@ -1 +1 @@
1
- {"version":3,"file":"collection-helpers.js","sourceRoot":"","sources":["../src/collection-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collection-helpers.js","sourceRoot":"","sources":["../src/collection-helpers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,uBAAuB,CAAC;AAUtF,OAAO,KAAK,EACX,mBAAmB,EAEnB,cAAc,EAEd,eAAe,EACf,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAS3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAoE9D;gFACgF;AAChF,eAAO,MAAM,UAAU,EAAE,WA6pBxB,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,UAAU,aAAa,CAAC;AAIrC,gEAAgE;AAChE,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,EAAE,CAAC;CACzB;AAs1CD,UAAU,YAAY;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAuKD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IACT,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,EAAE,GAAG,CACd,MAAM,EACN;QACC,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CACD,CAAC;IACF,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACnC;;;uBAGmB;IACnB,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACrC,EACD,GAAG,EAAE,eAAe;AACpB;;yEAEyE;AACzE,cAAc,CAAC,EAAE,OAAO,EAAE,GACxB,OAAO,CA0BT;AAED,2DAA2D;AAC3D,MAAM,WAAW,wBAAwB;IACxC;;8DAE0D;IAC1D,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACrC;;kFAE8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;6CACyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;2EAIuE;IACvE,WAAW,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC;;;yEAGiE;QACjE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;2CACmC;QACnC,YAAY,CAAC,EAAE,YAAY,CAAC;KAC5B,CAAC;CACF;AA6BD,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,wBAA6B,GAAG,mBAAmB,CAkUhG;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,EAAE,mBAA+C,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA+B,MAAM,uBAAuB,CAAC;AAUtF,OAAO,KAAK,EACX,mBAAmB,EAEnB,cAAc,EAEd,eAAe,EACf,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAS3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAqE9D;gFACgF;AAChF,eAAO,MAAM,UAAU,EAAE,WA4pBxB,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,UAAU,aAAa,CAAC;AAIrC,gEAAgE;AAChE,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,EAAE,CAAC;CACzB;AA63CD,UAAU,YAAY;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAuKD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IACT,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,EAAE,GAAG,CACd,MAAM,EACN;QACC,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CACD,CAAC;IACF,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACnC;;;uBAGmB;IACnB,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACrC,EACD,GAAG,EAAE,eAAe;AACpB;;yEAEyE;AACzE,cAAc,CAAC,EAAE,OAAO,EAAE,GACxB,OAAO,CA0BT;AAED,2DAA2D;AAC3D,MAAM,WAAW,wBAAwB;IACxC;;8DAE0D;IAC1D,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACrC;;kFAE8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;6CACyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;2EAIuE;IACvE,WAAW,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC;;;yEAGiE;QACjE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;2CACmC;QACnC,YAAY,CAAC,EAAE,YAAY,CAAC;KAC5B,CAAC;CACF;AA6BD,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,wBAA6B,GAAG,mBAAmB,CA0ThG;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,EAAE,mBAA+C,CAAC"}
package/dist/config.js CHANGED
@@ -6,9 +6,10 @@ import { BREADCRUMB_AUTO_SENTINEL, breadcrumbSchema } from './tags/breadcrumb.js
6
6
  import { NAV_AUTO_SENTINEL, NAV_COLLAPSED_AUTO } from './tags/nav.js';
7
7
  import { PAGINATION_AUTO_SENTINEL } from './tags/pagination.js';
8
8
  import { resolveXrefs } from './xref-resolve.js';
9
- import { preprocessSnippets, wrapStandaloneSnippets } from './snippet-pipeline.js';
10
- import { preprocessData } from './data-pipeline.js';
11
- import { preprocessIncludes } from './include-pipeline.js';
9
+ import { preprocessTree } from './lib/preprocess.js';
10
+ import { snippet } from './tags/snippet.js';
11
+ import { data } from './tags/data.js';
12
+ import { include } from './tags/include.js';
12
13
  import { registerDrawers, resolveAutoDrawerTitleLevels, hoistPreviewDrawers, } from './drawer-pipeline.js';
13
14
  import { resolveFileRefs } from './file-ref-resolve.js';
14
15
  import { resolveXrefPreviews } from './xref-preview-resolve.js';
@@ -156,11 +157,10 @@ export const coreConfig = {
156
157
  PageSection: { block: 'page-section' },
157
158
  TableOfContents: { block: 'toc', defaultElevation: 'flush' },
158
159
  /* Snippet doesn't have a normal schema transform — its preprocess
159
- * hook replaces the tag with a `fence` node, and the standalone
160
- * wrap step adds `<figure class="rf-snippet">` post-transform.
161
- * The engine never sees a `Snippet` tag, but we still need an
162
- * entry in the theme config so `computeUsedCssBlocks` includes
163
- * `snippet.css` in CSS tree-shaking when the figure is rendered. */
160
+ * hook replaces the tag with a `fence` node, which renders as a
161
+ * `<pre data-source>` (SPEC-141 D5: no wrapper, no `snippet` block CSS).
162
+ * The engine never sees a `Snippet` tag; the entry exists so the rune
163
+ * is known to inspect/contracts tooling, like Data and Include below. */
164
164
  Snippet: { block: 'snippet' },
165
165
  /* Data, like Snippet, has no normal schema transform — its preprocess
166
166
  * hook replaces the `{% data %}` tag with a Markdoc `table` node before
@@ -749,8 +749,13 @@ function buildPageTree(pages) {
749
749
  }
750
750
  return root;
751
751
  }
752
- /** Build breadcrumb paths: url → ordered ancestor urls (root first, parent last) */
752
+ /** Build breadcrumb paths: url → ordered ancestor urls (root first, parent last).
753
+ *
754
+ * Only registered pages appear in a path. A directory with no index page is a
755
+ * gap, not a dead end: the walk steps over it by path and carries on, so
756
+ * `/docs/guide` with no `/docs` page still reaches `/`. */
753
757
  function buildBreadcrumbPaths(pages) {
758
+ const registered = new Set(pages.map((p) => p.url));
754
759
  const parentOf = new Map();
755
760
  for (const p of pages) {
756
761
  if (p.url !== '/') {
@@ -760,23 +765,49 @@ function buildBreadcrumbPaths(pages) {
760
765
  const paths = new Map();
761
766
  for (const p of pages) {
762
767
  const ancestors = [];
768
+ const seen = new Set([p.url]);
763
769
  let current = parentOf.get(p.url);
764
- while (current !== undefined) {
765
- ancestors.unshift(current);
766
- current = parentOf.get(current);
770
+ while (current !== undefined && !seen.has(current)) {
771
+ seen.add(current);
772
+ if (registered.has(current)) {
773
+ ancestors.unshift(current);
774
+ current = parentOf.get(current);
775
+ }
776
+ else {
777
+ current = current === '/' ? undefined : resolveParentUrl(current, registered);
778
+ }
767
779
  }
768
780
  paths.set(p.url, ancestors);
769
781
  }
770
782
  return paths;
771
783
  }
772
- /** Derive the parent url by stripping the last path segment */
784
+ /** Derive the parent url by stripping the last path segment, in the router's
785
+ * shape: no trailing slash, except the root `/`.
786
+ *
787
+ * BUG-018 — this used to keep the trailing slash (`/docs/guide` → `/docs/`)
788
+ * while the router registers `/docs`, so every lookup keyed on `parentUrl`
789
+ * missed below depth 1. */
773
790
  function deriveParentUrl(url) {
774
791
  if (url === '/' || !url.includes('/'))
775
792
  return '/';
776
- // '/docs/guide/' → strip trailing slash, then strip last segment
777
793
  const trimmed = url.endsWith('/') ? url.slice(0, -1) : url;
778
794
  const parent = trimmed.lastIndexOf('/');
779
- return parent <= 0 ? '/' : trimmed.slice(0, parent + 1);
795
+ return parent <= 0 ? '/' : trimmed.slice(0, parent);
796
+ }
797
+ /** Resolve a page's `parentUrl` to the key its parent is actually registered
798
+ * under. Every consumer of `parentUrl` — `buildPageTree`, the breadcrumb walk,
799
+ * `nav auto`, auto-pagination — compares it against a page `url`, so it must
800
+ * be spelled exactly as that page's `url` is. The router never emits a
801
+ * trailing slash, but a base path makes its root `/base/`, and a `slug`
802
+ * override can carry one, so both spellings are tried. When no page sits at
803
+ * the parent path, the router's shape is returned. */
804
+ function resolveParentUrl(url, registered) {
805
+ const derived = deriveParentUrl(url);
806
+ if (registered.has(derived))
807
+ return derived;
808
+ if (derived !== '/' && registered.has(`${derived}/`))
809
+ return `${derived}/`;
810
+ return derived;
780
811
  }
781
812
  /** Walk a Markdoc renderable tree, resolving any auto-breadcrumb placeholders */
782
813
  function resolveAutoBreadcrumbs(renderable, pageUrl, breadcrumbPaths, pagesByUrl, ctx) {
@@ -830,8 +861,14 @@ function buildAutoBreadcrumb(originalTag, pageUrl, breadcrumbPaths, pagesByUrl,
830
861
  const listItems = [];
831
862
  for (const ancestorUrl of ancestorUrls) {
832
863
  const ancestorPage = pagesByUrl.get(ancestorUrl);
833
- if (!ancestorPage)
864
+ if (!ancestorPage) {
865
+ // BUG-018 — a short trail used to be the only symptom of this. The
866
+ // breadcrumb paths name only registered pages, so a miss here means the
867
+ // two indexes disagree about a page's key: say so instead of quietly
868
+ // dropping a level.
869
+ ctx.warn(`Breadcrumb auto: ancestor "${ancestorUrl}" of page "${pageUrl}" is on the breadcrumb path but has no page entry; it was left out of the trail`, pageUrl);
834
870
  continue;
871
+ }
835
872
  const nameSpan = new Tag('span', { hidden: true }, [ancestorPage.title]);
836
873
  const urlLink = new Tag('a', { href: ancestorUrl }, [ancestorPage.title]);
837
874
  listItems.push(createComponentRenderable({
@@ -2057,25 +2094,25 @@ export function createCorePipelineHooks(opts = {}) {
2057
2094
  const embedConfig = opts.embedConfig;
2058
2095
  const repoUrl = opts.repoUrl;
2059
2096
  const repoBranch = opts.repoBranch;
2097
+ // The page's merged tag table when the loader passes one (core + plugins),
2098
+ // else core's own preprocessing runes — enough for a caller with no plugins.
2099
+ const preprocessSchemas = opts.embedConfig?.tags ?? {
2100
+ include,
2101
+ snippet,
2102
+ data,
2103
+ };
2060
2104
  return {
2061
- // Compose the core preprocess steps: include (→ pasted AST), then snippet
2062
- // (→ fence), then data (→ table). All three mutate the AST in place, so a
2063
- // single pass over the same tree applies them; any one mutating means the
2064
- // caller takes the returned AST.
2065
- //
2066
- // **Include runs first, and the order is load-bearing** (SPEC-129): the
2067
- // whole point of the rune is that the pasted content is in the tree when the
2068
- // later preprocessors walk it. Anything added to this phase that authors may
2069
- // want inside an included file belongs after include, not before.
2105
+ // SPEC-141 — every rune that declares `preprocess` on its schema resolves
2106
+ // here, in one walk over the page in tree order. Which runes take part is
2107
+ // read off the tag table, so a plugin rune's hook runs exactly as a core
2108
+ // one does; the order between them is where they sit in the tree.
2070
2109
  preprocess(ast, page, ctx) {
2071
- const includeChanged = preprocessIncludes(ast, page, ctx);
2072
- const snippetChanged = preprocessSnippets(ast, page, ctx);
2073
- const dataChanged = preprocessData(ast, page, ctx);
2074
- return includeChanged || snippetChanged || dataChanged ? ast : undefined;
2110
+ return preprocessTree(ast, page, ctx, preprocessSchemas);
2075
2111
  },
2076
2112
  register(pages, registry, ctx) {
2113
+ const registeredUrls = new Set(pages.map((p) => p.url));
2077
2114
  for (const page of pages) {
2078
- const parentUrl = deriveParentUrl(page.url);
2115
+ const parentUrl = resolveParentUrl(page.url, registeredUrls);
2079
2116
  const existingPage = registry.getById('page', page.url);
2080
2117
  if (existingPage && existingPage.sourceUrl !== page.url) {
2081
2118
  ctx.warn(`Page '${page.url}' already registered from '${existingPage.sourceUrl}'`, page.url);
@@ -2219,28 +2256,24 @@ export function createCorePipelineHooks(opts = {}) {
2219
2256
  // registry and inject the JSON for the iframe to expose as window.RF_DATA.
2220
2257
  renderable = resolveDataBindings(renderable, coreData.registry, ctx, page.url);
2221
2258
  renderable = resolveXrefs(renderable, page.url, coreData.registry, coreData.xrefPatterns ?? [], ctx);
2222
- // SPEC-062 standalone snippet wrap: turn `<pre data-snippet-source>`
2223
- // into `<figure class="rf-snippet">` when not inside a fence-consuming
2224
- // container (codegroup, diff). The wrap is a no-op when the page
2225
- // has no snippet-derived fences.
2226
- const wrappedPage = wrapStandaloneSnippets(renderable === page.renderable ? page : { ...page, renderable }, aggregated, ctx);
2259
+ const finalPage = renderable === page.renderable ? page : { ...page, renderable };
2227
2260
  // SPEC-066 outline-scope walkers: prefix heading IDs and drop TOC
2228
2261
  // items inside any `data-outline-scope` subtree. Generic — any rune
2229
2262
  // can set the attribute and get the behaviour. Runs last so it can
2230
2263
  // see the final tree (including expand-substituted content once
2231
2264
  // that lands in v0.15.0).
2232
- applyOutlineScopeWalkers(wrappedPage.renderable);
2265
+ applyOutlineScopeWalkers(finalPage.renderable);
2233
2266
  // Refresh `page.headings` from the final renderable. Parse-time
2234
2267
  // `extractHeadings` only saw the raw AST — anything inlined by
2235
2268
  // postProcess (expand `level=N`, collection bodies) wouldn't make
2236
2269
  // it into the parse-time list, leaving the page TOC blind to those
2237
2270
  // headings. Skips `data-outline-scope` subtrees so peer-document
2238
2271
  // embeds stay isolated, matching the TOC walker.
2239
- const harvested = harvestHeadingsFromRenderable(wrappedPage.renderable);
2240
- if (harvested.length > 0 || wrappedPage.headings.length > 0) {
2241
- return { ...wrappedPage, headings: harvested };
2272
+ const harvested = harvestHeadingsFromRenderable(finalPage.renderable);
2273
+ if (harvested.length > 0 || finalPage.headings.length > 0) {
2274
+ return { ...finalPage, headings: harvested };
2242
2275
  }
2243
- return wrappedPage;
2276
+ return finalPage;
2244
2277
  },
2245
2278
  };
2246
2279
  }