@vesk/runtime 0.2.22 → 0.2.23

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,3 +1,22 @@
1
1
  import type { Block } from '@vesk/runtime/src/ripple-runtime';
2
- export declare function reconcile<T>(anchor: Node, endAnchor: Node, items: T[], keyFn: (item: T) => string, createItem: (item: T, index: number, effs: Block[]) => void): (newItems: T[]) => void;
2
+ export type KeyedClaimFn = (key: string) => {
3
+ el: Element;
4
+ } | null;
5
+ export type KeyedPeekFn = (key: string) => Element | null;
6
+ export interface KeyedHydrateWalker {
7
+ peekKey?: KeyedPeekFn;
8
+ claimByKey?: KeyedClaimFn;
9
+ }
10
+ export declare function reconcile<T>(anchor: Node, endAnchor: Node, items: T[], keyFn: (item: T) => string, createItem: (item: T, index: number, effs: Block[], root: Element | null) => void, claim?: KeyedClaimFn): (newItems: T[]) => void;
11
+ /**
12
+ * Keyed-list hydration (claim-by-key). Positions the map's `anchor`/`endAnchor`
13
+ * around the SSR-claimed item elements so the map region stays inside the
14
+ * containing element, then hands off to `reconcile` with the walker's
15
+ * `claimByKey` as the claim function. Items that never had SSR markers (the
16
+ * list was empty or the client data grew) anchor at the end of the region and
17
+ * render fresh. Ordering is exact when SSR data matches the client data;
18
+ * divergence degrades to appending fresh items at the region tail instead of
19
+ * duplicating already-claimed SSR content.
20
+ */
21
+ export declare function reconcileHydrated<T>(anchor: Node, endAnchor: Node, items: T[], keyFn: (item: T) => string, createItem: (item: T, index: number, effs: Block[], root: Element | null) => void, walker: KeyedHydrateWalker, parent: Node): (newItems: T[]) => void;
3
22
  //# sourceMappingURL=reconcile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAO9D,wBAAgB,SAAS,CAAC,CAAC,EAC1B,MAAM,EAAE,IAAI,EACZ,SAAS,EAAE,IAAI,EACf,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,GACzD,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CA8CzB"}
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAO9D,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC;AACnE,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IAClC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,YAAY,CAAC;CAC1B;AAED,wBAAgB,SAAS,CAAC,CAAC,EAC1B,MAAM,EAAE,IAAI,EACZ,SAAS,EAAE,IAAI,EACf,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,EACjF,KAAK,CAAC,EAAE,YAAY,GAClB,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CAkDzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAClC,MAAM,EAAE,IAAI,EACZ,SAAS,EAAE,IAAI,EACf,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC1B,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,EACjF,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,IAAI,GACV,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CA0BzB"}
package/dist/reconcile.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { destroy_block } from '@vesk/runtime/src/ripple-blocks';
2
- export function reconcile(anchor, endAnchor, items, keyFn, createItem) {
2
+ export function reconcile(anchor, endAnchor, items, keyFn, createItem, claim) {
3
3
  const parent = anchor.parentNode;
4
4
  const map = new Map();
5
5
  for (let i = 0; i < items.length; i++) {
@@ -7,8 +7,12 @@ export function reconcile(anchor, endAnchor, items, keyFn, createItem) {
7
7
  const key = keyFn(item);
8
8
  const marker = document.createComment('k:' + key);
9
9
  const effs = [];
10
- parent.insertBefore(marker, endAnchor);
11
- createItem(item, i, effs);
10
+ // When hydrated, the item's SSR root element (if any) is claimed here;
11
+ // the marker is anchored to it so `removeRange`/`moveBefore` operate on
12
+ // the claimed content instead of duplicating it.
13
+ const c = claim ? claim(key) : null;
14
+ parent.insertBefore(marker, c ? c.el : endAnchor);
15
+ createItem(item, i, effs, c ? c.el : null);
12
16
  map.set(key, { marker, effs });
13
17
  }
14
18
  return (newItems) => {
@@ -37,13 +41,53 @@ export function reconcile(anchor, endAnchor, items, keyFn, createItem) {
37
41
  const marker = document.createComment('k:' + key);
38
42
  const effs = [];
39
43
  parent.insertBefore(marker, ref);
40
- createItem(newItems[i], i, effs);
44
+ createItem(newItems[i], i, effs, null);
41
45
  map.set(key, { marker, effs });
42
46
  ref = marker;
43
47
  }
44
48
  }
45
49
  };
46
50
  }
51
+ /**
52
+ * Keyed-list hydration (claim-by-key). Positions the map's `anchor`/`endAnchor`
53
+ * around the SSR-claimed item elements so the map region stays inside the
54
+ * containing element, then hands off to `reconcile` with the walker's
55
+ * `claimByKey` as the claim function. Items that never had SSR markers (the
56
+ * list was empty or the client data grew) anchor at the end of the region and
57
+ * render fresh. Ordering is exact when SSR data matches the client data;
58
+ * divergence degrades to appending fresh items at the region tail instead of
59
+ * duplicating already-claimed SSR content.
60
+ */
61
+ export function reconcileHydrated(anchor, endAnchor, items, keyFn, createItem, walker, parent) {
62
+ // Discover the region's SSR bounds without consuming any markers.
63
+ const claimedEls = [];
64
+ for (let i = 0; i < items.length; i++) {
65
+ const el = walker.peekKey ? walker.peekKey(keyFn(items[i])) : null;
66
+ if (el)
67
+ claimedEls.push(el);
68
+ }
69
+ if (claimedEls.length > 0) {
70
+ const order = new Map();
71
+ const kids = parent.childNodes;
72
+ for (let i = 0; i < kids.length; i++)
73
+ order.set(kids[i], i);
74
+ let first = claimedEls[0];
75
+ let last = claimedEls[0];
76
+ for (const el of claimedEls) {
77
+ if ((order.get(el) ?? -1) < (order.get(first) ?? -1))
78
+ first = el;
79
+ if ((order.get(el) ?? -1) > (order.get(last) ?? -1))
80
+ last = el;
81
+ }
82
+ parent.insertBefore(anchor, first);
83
+ parent.insertBefore(endAnchor, last.nextSibling);
84
+ }
85
+ else {
86
+ parent.appendChild(anchor);
87
+ parent.appendChild(endAnchor);
88
+ }
89
+ return reconcile(anchor, endAnchor, items, keyFn, createItem, (key) => walker.claimByKey(key));
90
+ }
47
91
  function removeRange(start, end) {
48
92
  let n = start.nextSibling;
49
93
  while (n && n !== end && !(n.nodeType === 8 && n.nodeValue && n.nodeValue.startsWith('k:'))) {
@@ -36,7 +36,7 @@ export interface SsrDataSink {
36
36
  }
37
37
  export declare function setSsrSink(sink: SsrDataSink | null): void;
38
38
  export declare function getSsrData(key: string): unknown;
39
- export declare function setSsrData(key: string, value: unknown): void;
39
+ export declare function setSsrData(key: string, value: unknown, ownerToken?: string): void;
40
40
  export declare function clearSsrData(): void;
41
41
  export declare function mutate(key: string, data?: unknown): void;
42
42
  export declare function createResource<T>(fn: () => Promise<T>, key?: string, into?: Tracked, options?: UseFetchOptions<T>): Resource<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
package/dist/resource.js CHANGED
@@ -46,10 +46,34 @@ function getRegistry() {
46
46
  g().__vsk_fetch_registry = map;
47
47
  return map;
48
48
  }
49
+ // Per-render data attributed to a specific render token. The resource promise
50
+ // callbacks that call setSsrData run outside AsyncLocalStorage scope (native
51
+ // fetch async contexts) so they cannot be attributed via the sink/store; a
52
+ // token captured synchronously at fetch start (startRequest) or read from the
53
+ // live global token for synchronous writes (md hook) gives renderFullPage /
54
+ // renderPageStream an isolated, deterministic channel that still never mixes
55
+ // concurrent requests.
56
+ function ssrSlotFor(token) {
57
+ if (!token)
58
+ return undefined;
59
+ return g()[`__vsk_ssr_data_${token}`] || undefined;
60
+ }
61
+ function writeSsrSlot(token, key, value) {
62
+ if (!token)
63
+ return;
64
+ const slot = g()[`__vsk_ssr_data_${token}`] || (g()[`__vsk_ssr_data_${token}`] = {});
65
+ slot[key] = value;
66
+ }
49
67
  export function getSsrData(key) {
50
68
  const sink = ssrSink;
51
- if (sink)
52
- return sink.get(key);
69
+ if (sink) {
70
+ const value = sink.get(key);
71
+ if (value !== undefined)
72
+ return value;
73
+ }
74
+ const slot = ssrSlotFor(g().__vsk_ssr_token || undefined);
75
+ if (slot && slot[key] !== undefined)
76
+ return slot[key];
53
77
  const store = g().__vsk_ssr_data;
54
78
  if (!store)
55
79
  return undefined;
@@ -75,23 +99,34 @@ function getSsrFailures() {
75
99
  }
76
100
  return store;
77
101
  }
78
- export function setSsrData(key, value) {
102
+ export function setSsrData(key, value, ownerToken) {
79
103
  const sink = ssrSink;
80
- if (sink) {
104
+ if (sink)
81
105
  sink.set(key, value);
82
- return;
83
- }
106
+ // Also mirror into globalThis: the sink is AsyncLocalStorage-scoped and in
107
+ // some server bundles the write lands in a different store than the one
108
+ // renderFullPage/renderPageStream snapshots (duplicated ssr-store copies /
109
+ // native fetch async contexts). globalThis is the deterministic channel.
84
110
  if (!g().__vsk_ssr_data)
85
111
  g().__vsk_ssr_data = {};
86
112
  g().__vsk_ssr_data[key] = value;
113
+ // Per-render slot (see ssrSlotFor): resolved resource callbacks and the md
114
+ // hook must be attributed to the render that started them. A stale token can
115
+ // not leak into later requests — renderFullPage/renderPageStream delete the
116
+ // slot after merging and start fresh alongside the flat store.
117
+ if (ownerToken)
118
+ writeSsrSlot(ownerToken, key, value);
119
+ else
120
+ writeSsrSlot(g().__vsk_ssr_token || undefined, key, value);
87
121
  }
88
122
  export function clearSsrData() {
89
123
  const sink = ssrSink;
90
- if (sink) {
124
+ if (sink)
91
125
  sink.clear();
92
- return;
93
- }
94
126
  delete g().__vsk_ssr_data;
127
+ const tk = g().__vsk_ssr_token;
128
+ if (tk)
129
+ delete g()[`__vsk_ssr_data_${tk}`];
95
130
  }
96
131
  function setInto(into, data) {
97
132
  if (into && typeof into === 'object' && typeof into.f === 'number') {
@@ -360,11 +395,17 @@ function startRequest(handle, skipCache) {
360
395
  return settled;
361
396
  }
362
397
  const existing = getInflight().get(key);
398
+ // Capture the render token at fetch start: the resolution callback below
399
+ // runs outside AsyncLocalStorage scope, so setSsrData cannot read the
400
+ // token from the live render context anymore. An explicit owner token
401
+ // keeps the data attributed to this request's render slot even when the
402
+ // token has been torn down by the time the fetch resolves.
403
+ const startToken = g().__vsk_ssr_token || undefined;
363
404
  const prom = existing ?? runFetcher(handle, options.timeout || 0);
364
405
  if (!existing) {
365
406
  getInflight().set(key, prom);
366
407
  prom.then(data => {
367
- setSsrData(key, data);
408
+ setSsrData(key, data, startToken);
368
409
  settle(handle, data);
369
410
  }, error => {
370
411
  getSsrFailures()?.set(key, error);
@@ -1 +1 @@
1
- {"version":3,"file":"router-components.d.ts","sourceRoot":"","sources":["../src/router-components.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router-components.d.ts","sourceRoot":"","sources":["../src/router-components.ts"],"names":[],"mappings":"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"}
@@ -263,7 +263,11 @@ export function Link(props, registry, hydrate) {
263
263
  : '';
264
264
  }
265
265
  if (typeof document === 'undefined') {
266
- return `<a ${attrs}>${childStr}</a>`;
266
+ // The marker makes the anchor claimable: hydrated call sites run
267
+ // `nextElement('a')` inside the component's boundary walker, and
268
+ // without a marker the claim lands on the next sibling's marker,
269
+ // eats it, and cascades into fresh-node fallback.
270
+ return `<!--vsk--><a ${attrs}>${childStr}</a>`;
267
271
  }
268
272
  const a = document.createElement('a');
269
273
  applyLinkDom(a, props, href);
@@ -303,20 +307,67 @@ export function NavLink(props, registry, hydrate) {
303
307
  if (typeof document === 'undefined') {
304
308
  return Link(props, registry, hydrate);
305
309
  }
310
+ // Always prefer the walker when it is available, regardless of the global
311
+ // __isHydrating flag. The flag is only a hint for the querySelector
312
+ // fallback; relying on it to gate walker claims leaves SSR markers
313
+ // unconsumed when the flag is stale (layout-chain hydration) and
314
+ // produces duplicate anchor text.
315
+ if (hydrate && hydrate.nextElement) {
316
+ let a = hydrate.nextElement('a');
317
+ if (a && !a.parentNode && hydrate.root) {
318
+ const existing = hydrate.root.querySelector('a');
319
+ if (existing)
320
+ a = existing;
321
+ }
322
+ const claimed = a ? a.parentNode !== null : false;
323
+ if (!a)
324
+ a = document.createElement('a');
325
+ applyLinkDom(a, props, props.href);
326
+ if (props.children != null) {
327
+ if (typeof props.children === 'string' || typeof props.children === 'number') {
328
+ a.textContent = String(props.children);
329
+ }
330
+ else {
331
+ a.replaceChildren();
332
+ mountLinkChildren(a, props.children);
333
+ }
334
+ }
335
+ a.addEventListener('click', (e) => {
336
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button !== 0)
337
+ return;
338
+ if (props.target === '_blank')
339
+ return;
340
+ if (!isRouteHref(props.href))
341
+ return;
342
+ e.preventDefault();
343
+ e.stopPropagation();
344
+ const nav = useNavigate();
345
+ nav(props.href);
346
+ });
347
+ const path = usePathname();
348
+ const routeHref = routeHrefOf(props.href);
349
+ const isActive = routeHref === path || (routeHref !== '/' && path.startsWith(routeHref) && (path.length === routeHref.length || path[routeHref.length] === '/' || path[routeHref.length] === '?'));
350
+ if (isActive) {
351
+ a.classList.add(props.activeClass || 'active');
352
+ if (props.ariaCurrent !== false)
353
+ a.setAttribute('aria-current', 'page');
354
+ }
355
+ return claimed ? document.createDocumentFragment() : a;
356
+ }
306
357
  if (__isHydrating) {
307
- const a = document.querySelector(`a[href="${props.href}"]`);
308
- if (a) {
309
- applyLinkDom(a, props, props.href);
358
+ const q = document.querySelector(`a[href="${props.href}"]`);
359
+ if (q) {
360
+ applyLinkDom(q, props, props.href);
310
361
  if (props.children != null) {
311
362
  if (typeof props.children === 'string' || typeof props.children === 'number') {
312
- a.textContent = String(props.children);
363
+ q.textContent = String(props.children);
313
364
  }
314
365
  else {
315
- a.replaceChildren();
316
- mountLinkChildren(a, props.children);
366
+ q.replaceChildren();
367
+ mountLinkChildren(q, props.children);
317
368
  }
318
369
  }
319
- a.addEventListener('click', (e) => {
370
+ q.addEventListener('click', (e) => {
320
371
  if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button !== 0)
321
372
  return;
322
373
  if (props.target === '_blank')
@@ -332,11 +383,12 @@ export function NavLink(props, registry, hydrate) {
332
383
  const routeHref = routeHrefOf(props.href);
333
384
  const isActive = routeHref === path || (routeHref !== '/' && path.startsWith(routeHref) && (path.length === routeHref.length || path[routeHref.length] === '/' || path[routeHref.length] === '?'));
334
385
  if (isActive) {
335
- a.classList.add(props.activeClass || 'active');
386
+ q.classList.add(props.activeClass || 'active');
336
387
  if (props.ariaCurrent !== false)
337
- a.setAttribute('aria-current', 'page');
388
+ q.setAttribute('aria-current', 'page');
338
389
  }
339
- return document.createDocumentFragment();
390
+ const claimed = q.parentNode !== null;
391
+ return claimed ? document.createDocumentFragment() : q;
340
392
  }
341
393
  }
342
394
  const a = Link(props, registry, hydrate);
@@ -13,6 +13,7 @@ export interface RouteNode {
13
13
  network?: Function | string | null;
14
14
  children?: RouteNode[];
15
15
  segmentCount?: number;
16
+ standalone?: boolean;
16
17
  _matchChain?: RouteNode[];
17
18
  loader?: Function;
18
19
  props?: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"router-match.d.ts","sourceRoot":"","sources":["../src/router-match.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IAC1B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,aAAa;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAiBnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,EAAE,CAsB/G;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAO5E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc1F;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,SAAS,EAAO,GAAG,SAAS,EAAE,CAoChH;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAwBjF;AAED,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,SAAS,EAAE,CA0Bb"}
1
+ {"version":3,"file":"router-match.d.ts","sourceRoot":"","sources":["../src/router-match.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IAC1B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,aAAa;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAiBnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,EAAE,CA6B/G;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAO5E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc1F;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,SAAS,EAAO,GAAG,SAAS,EAAE,CAqChH;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAwBjF;AAED,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,SAAS,EAAE,CA0Bb"}
@@ -26,18 +26,26 @@ export function collectLayouts(nodes, pathParts) {
26
26
  layouts.push(...childLayouts);
27
27
  continue;
28
28
  }
29
+ // Root node (fullPath '/') always matches as a container; recurse into children.
30
+ const isRoot = node.fullPath === '/';
31
+ const matched = isRoot ? true : matchRouteNode(node, pathParts);
32
+ if (node.standalone && matched && !isRoot) {
33
+ layouts.length = 0;
34
+ }
29
35
  if (node.layout) {
30
36
  layouts.push({ layout: node.layout, node });
31
37
  }
32
- const len = pathParts.length;
33
- const matched = matchRouteNode(node, pathParts);
34
- if (matched) {
38
+ if (matched && !isRoot) {
35
39
  const remaining = pathParts.slice(node.segmentCount != null ? node.segmentCount : 1);
36
40
  if (remaining.length > 0 && (node.children || []).length > 0) {
37
41
  const childLayouts = collectLayouts(node.children || [], remaining);
38
42
  layouts.push(...childLayouts);
39
43
  }
40
44
  }
45
+ else if (isRoot && (node.children || []).length > 0) {
46
+ const childLayouts = collectLayouts(node.children || [], pathParts);
47
+ layouts.push(...childLayouts);
48
+ }
41
49
  }
42
50
  return layouts;
43
51
  }
@@ -96,6 +104,8 @@ export function flattenLayoutChain(tree, pathParts, result = []) {
96
104
  const consumeCount = node.isCatchAll ? pathParts.length : segCount;
97
105
  const remaining = pathParts.slice(consumeCount);
98
106
  const isLeaf = remaining.length === 0 || remaining.every(p => p === '');
107
+ if (node.standalone)
108
+ result.length = 0;
99
109
  result.push(node);
100
110
  if (isLeaf) {
101
111
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}