@buzola/router 0.0.12 → 0.0.13

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.
@@ -43,6 +43,8 @@ export declare class PageLoaderState {
43
43
  private activeCacheKey;
44
44
  private activePromise;
45
45
  private activeResolvedData;
46
+ /** URL the currently held data was loaded for — data is cached under this href, not the active one. */
47
+ private resolvedUrlHref;
46
48
  private hasResolved;
47
49
  private pendingBackgroundKey;
48
50
  private readonly id;
@@ -1 +1 @@
1
- {"version":3,"file":"loader-state.d.ts","sourceRoot":"","sources":["../../src/engine/loader-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAIpD,MAAM,MAAM,iBAAiB,GAC1B;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAA;AAEnD,MAAM,WAAW,oBAAoB;IACpC,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAA;IACtB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,0DAA0D;IAC1D,WAAW,EAAE,WAAW,GAAG,SAAS,CAAA;IACpC;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAA;KAAE,KAAK,IAAI,CAAA;CACrF;AAMD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAQ;;IAM3B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,oBAAoB,GAAG,iBAAiB;IA8CrD,sDAAsD;IACtD,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKjC,yEAAyE;IACzE,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAK3C,sFAAsF;IACtF,qBAAqB,IAAI,IAAI;IAK7B,8DAA8D;IAC9D,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;IAcnD,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,gBAAgB;CAGxB"}
1
+ {"version":3,"file":"loader-state.d.ts","sourceRoot":"","sources":["../../src/engine/loader-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAKpD,MAAM,MAAM,iBAAiB,GAC1B;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAA;AAEnD,MAAM,WAAW,oBAAoB;IACpC,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAA;IACtB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,0DAA0D;IAC1D,WAAW,EAAE,WAAW,GAAG,SAAS,CAAA;IACpC;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAA;KAAE,KAAK,IAAI,CAAA;CACrF;AAMD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,kBAAkB,CAAS;IACnC,uGAAuG;IACvG,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAQ;;IAM3B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,oBAAoB,GAAG,iBAAiB;IA8CrD,sDAAsD;IACtD,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAMjC,yEAAyE;IACzE,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAM3C,sFAAsF;IACtF,qBAAqB,IAAI,IAAI;IAK7B,8DAA8D;IAC9D,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;IAenD,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,gBAAgB;CAGxB"}
@@ -1,3 +1,4 @@
1
+ import { isSamePath } from './utils.js';
1
2
  // ─── State machine ──────────────────────────────────────────────────────────
2
3
  let nextId = 0;
3
4
  /**
@@ -15,6 +16,8 @@ export class PageLoaderState {
15
16
  activeCacheKey = null;
16
17
  activePromise = null;
17
18
  activeResolvedData;
19
+ /** URL the currently held data was loaded for — data is cached under this href, not the active one. */
20
+ resolvedUrlHref = null;
18
21
  hasResolved = false;
19
22
  pendingBackgroundKey = null;
20
23
  id;
@@ -64,11 +67,13 @@ export class PageLoaderState {
64
67
  /** Commit data after use() resolves (suspend case) */
65
68
  commitResult(data) {
66
69
  this.activeResolvedData = data;
70
+ this.resolvedUrlHref = this.activeUrlHref;
67
71
  this.hasResolved = true;
68
72
  }
69
73
  /** Commit background SWR success — update data and clear pending flag */
70
74
  commitBackgroundResult(data) {
71
75
  this.activeResolvedData = data;
76
+ this.resolvedUrlHref = this.activeUrlHref;
72
77
  this.pendingBackgroundKey = null;
73
78
  }
74
79
  /** Mark background load as failed — next render will suspend with rejected promise */
@@ -78,33 +83,39 @@ export class PageLoaderState {
78
83
  }
79
84
  /** Save state to stale cache and reset (called on unmount) */
80
85
  dispose(loaderCache) {
81
- if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.activeUrlHref) {
82
- this.saveToStaleCache(loaderCache, this.activeUrlHref, this.activeResolvedData);
86
+ if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.resolvedUrlHref) {
87
+ this.saveToStaleCache(loaderCache, this.resolvedUrlHref, this.activeResolvedData);
83
88
  }
84
89
  this.activeUrlHref = null;
85
90
  this.activeCacheKey = null;
86
91
  this.activePromise = null;
87
92
  this.activeResolvedData = undefined;
93
+ this.resolvedUrlHref = null;
88
94
  this.hasResolved = false;
89
95
  this.pendingBackgroundKey = null;
90
96
  }
91
97
  // ─── Private ────────────────────────────────────────────────────────────
92
98
  handleUrlChange(currentUrlHref, loaderCache) {
93
99
  if (this.activeUrlHref !== null && this.activeUrlHref !== currentUrlHref) {
94
- // URL changed — save old data to stale cache
95
- if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined) {
96
- this.saveToStaleCache(loaderCache, this.activeUrlHref, this.activeResolvedData);
100
+ // URL changed — save the held data to stale cache under the href it was loaded for
101
+ if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.resolvedUrlHref) {
102
+ this.saveToStaleCache(loaderCache, this.resolvedUrlHref, this.activeResolvedData);
97
103
  }
98
104
  // Try to restore from stale cache for new URL
99
105
  const cached = loaderCache && this.restoreFromStaleCache(loaderCache, currentUrlHref);
100
106
  if (cached?.hit) {
101
107
  this.activeResolvedData = cached.value;
108
+ this.resolvedUrlHref = currentUrlHref;
102
109
  this.hasResolved = true;
103
110
  }
104
- else {
111
+ else if (!isSamePath(this.activeUrlHref, currentUrlHref)) {
112
+ // Different path — the held data describes another page, drop it and suspend
105
113
  this.hasResolved = false;
106
114
  this.activeResolvedData = undefined;
115
+ this.resolvedUrlHref = null;
107
116
  }
117
+ // Same path, only search/hash changed (filters, sorting, pagination, search):
118
+ // keep the data as stale so resolve() serves it while the new query loads.
108
119
  this.pendingBackgroundKey = null;
109
120
  }
110
121
  else if (this.activeUrlHref === null && loaderCache) {
@@ -112,6 +123,7 @@ export class PageLoaderState {
112
123
  const cached = this.restoreFromStaleCache(loaderCache, currentUrlHref);
113
124
  if (cached.hit) {
114
125
  this.activeResolvedData = cached.value;
126
+ this.resolvedUrlHref = currentUrlHref;
115
127
  this.hasResolved = true;
116
128
  }
117
129
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loader-state.js","sourceRoot":"","sources":["../../src/engine/loader-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader-state.js","sourceRoot":"","sources":["../../src/engine/loader-state.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-adapter.d.ts","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwC,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAIzF;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,iBAAiB,CAwElE;AAID,MAAM,WAAW,8BAA8B;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD;;GAEG;AACH,wBAAgB,6BAA6B,CAC5C,OAAO,GAAE,8BAAmC,GAC1C,iBAAiB,CA6FnB"}
1
+ {"version":3,"file":"navigation-adapter.d.ts","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwC,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAIzF;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,iBAAiB,CAyElE;AAID,MAAM,WAAW,8BAA8B;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD;;GAEG;AACH,wBAAgB,6BAA6B,CAC5C,OAAO,GAAE,8BAAmC,GAC1C,iBAAiB,CA6FnB"}
@@ -22,6 +22,7 @@ export function createBrowserNavigationAdapter() {
22
22
  event.intercept({
23
23
  handler: options.handler,
24
24
  scroll: options.scroll,
25
+ focusReset: options.focusReset,
25
26
  });
26
27
  },
27
28
  };
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-adapter.js","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,8BAA8B;IAC7C,MAAM,GAAG,GAAI,MAAsC,CAAC,UAAU,CAAA;IAC9D,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAA;IACF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwC,CAAA;IACjE,IAAI,qBAAqB,GAAG,KAAK,CAAA;IAEjC,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,EAAE;QAC9C,MAAM,cAAc,GAAG,qBAAqB,CAAA;QAC5C,qBAAqB,GAAG,KAAK,CAAA;QAE7B,MAAM,WAAW,GAAwB;YACxC,WAAW,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;YAC3C,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,cAAc,EAAE,KAAK,CAAC,cAAuD;YAC7E,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,cAAc;YACd,SAAS,CAAC,OAAO;gBAChB,KAAK,CAAC,SAAS,CAAC;oBACf,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACtB,CAAC,CAAA;YACH,CAAC;SACD,CAAA;QAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACtB,CAAC;IACF,CAAC,CAAA;IAED,OAAO;QACN,aAAa;YACZ,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,YAAa,CAAC,GAAI,CAAC,CAAA;QACvC,CAAC;QACD,QAAQ,CAAC,GAAG,EAAE,OAAO;YACpB,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;gBAC7B,qBAAqB,GAAG,IAAI,CAAA;YAC7B,CAAC;YACD,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACjB,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBAC9C,KAAK,EAAE,OAAO,EAAE,KAAK;aACrB,CAAC,CAAA;QACH,CAAC;QACD,IAAI;YACH,GAAG,CAAC,IAAI,EAAE,CAAA;QACX,CAAC;QACD,OAAO;YACN,GAAG,CAAC,OAAO,EAAE,CAAA;QACd,CAAC;QACD,gBAAgB,CAAC,KAAK,EAAE,OAAO;YAC9B,sEAAsE;YACtE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,KAAK,CAAC,CAAA;YACrC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACtB,IAAI,QAAQ,EAAE,CAAC;gBACd,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;YAChD,CAAC;QACF,CAAC;QACD,mBAAmB,CAAC,KAAK,EAAE,OAAO;YACjC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACzB,6DAA6D;YAC7D,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;YACnD,CAAC;QACF,CAAC;QACD,QAAQ;YACP,OAAO,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,CAAA;QACtC,CAAC;KACD,CAAA;AACF,CAAC;AAaD;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC5C,UAA0C,EAAE;IAE5C,MAAM,EAAE,UAAU,GAAG,mBAAmB,EAAE,GAAG,OAAO,CAAA;IAEpD,MAAM,OAAO,GAAkB,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAA;IACpD,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwC,CAAA;IAEjE,SAAS,iBAAiB,CACzB,GAAW,EACX,cAAqD,EACrD,gBAA4B,EAC5B,cAAwB;QAExB,IAAI,WAAW,GAAG,KAAK,CAAA;QACvB,IAAI,gBAAmD,CAAA;QAEvD,MAAM,KAAK,GAAwB;YAClC,WAAW,EAAE,EAAE,GAAG,EAAE;YACpB,YAAY,EAAE,IAAI;YAClB,cAAc;YACd,aAAa,EAAE,KAAK;YACpB,cAAc;YACd,SAAS,CAAC,OAAO;gBAChB,WAAW,GAAG,IAAI,CAAA;gBAClB,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAA;YACnC,CAAC;SACD,CAAA;QAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;QAED,IAAI,WAAW,IAAI,gBAAgB,EAAE,CAAC;YACrC,+DAA+D;YAC/D,KAAK,gBAAgB,EAAE,CAAC,IAAI,CAC3B,GAAG,EAAE;gBACJ,gBAAgB,EAAE,CAAA;YACnB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;gBACT,wDAAwD;gBACxD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB;oBAAE,OAAM;gBAC7E,MAAM,KAAK,CAAA;YACZ,CAAC,CACD,CAAA;QACF,CAAC;aAAM,CAAC;YACP,uCAAuC;YACvC,gBAAgB,EAAE,CAAA;QACnB,CAAC;IACF,CAAC;IAED,OAAO;QACN,aAAa;YACZ,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAA;QAC1C,CAAC;QACD,QAAQ,CAAC,GAAG,EAAE,OAAO;YACpB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;YAC7D,MAAM,IAAI,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;YAElD,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE;gBACtC,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;oBACtB,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAA;gBAChE,CAAC;qBAAM,CAAC;oBACP,6BAA6B;oBAC7B,OAAO,CAAC,MAAM,GAAG,YAAY,GAAG,CAAC,CAAA;oBACjC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;oBACtD,YAAY,EAAE,CAAA;gBACf,CAAC;YACF,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAA;QAC5B,CAAC;QACD,IAAI;YACH,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACtB,iBAAiB,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;oBACjE,YAAY,EAAE,CAAA;gBACf,CAAC,CAAC,CAAA;YACH,CAAC;QACF,CAAC;QACD,OAAO;YACN,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvC,iBAAiB,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;oBACjE,YAAY,EAAE,CAAA;gBACf,CAAC,CAAC,CAAA;YACH,CAAC;QACF,CAAC;QACD,gBAAgB,CAAC,KAAK,EAAE,OAAO;YAC9B,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC;QACD,mBAAmB,CAAC,KAAK,EAAE,OAAO;YACjC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1B,CAAC;QACD,QAAQ;YACP,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAA;QACnC,CAAC;KACD,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"navigation-adapter.js","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,7 @@ export declare class Router {
56
56
  private stopFn;
57
57
  private blockers;
58
58
  private pendingScrollBehavior;
59
+ private pendingFocusReset;
59
60
  private readonly _loaderCache;
60
61
  constructor(options: RouterOptions);
61
62
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { LoaderCache } from './loader-cache.js';
2
2
  import { matchRoutes } from './matcher.js';
3
- import { extractParamNames, parseParamSegment } from './utils.js';
3
+ import { extractParamNames, isSamePath, parseParamSegment } from './utils.js';
4
4
  /**
5
5
  * Thrown when a route guard prevents navigation.
6
6
  */
@@ -28,6 +28,7 @@ export class Router {
28
28
  stopFn;
29
29
  blockers = new Set();
30
30
  pendingScrollBehavior = 'after-transition';
31
+ pendingFocusReset;
31
32
  _loaderCache;
32
33
  constructor(options) {
33
34
  this.routes = options.routes;
@@ -85,6 +86,12 @@ export class Router {
85
86
  */
86
87
  start() {
87
88
  const handler = (event) => {
89
+ // Consume the pending options before any early return — they belong to the
90
+ // navigation that armed them and must not leak into the next one.
91
+ const scrollBehavior = this.pendingScrollBehavior;
92
+ const explicitFocusReset = this.pendingFocusReset;
93
+ this.pendingScrollBehavior = 'after-transition';
94
+ this.pendingFocusReset = undefined;
88
95
  if (!event.canIntercept)
89
96
  return;
90
97
  const url = new URL(event.destination.url);
@@ -96,10 +103,14 @@ export class Router {
96
103
  }
97
104
  const currentNavId = ++this.navigationId;
98
105
  const useViewTransition = event.viewTransition || this.viewTransitions;
99
- const scrollBehavior = this.pendingScrollBehavior;
100
- this.pendingScrollBehavior = 'after-transition';
106
+ // Query-only navigations stay on the same page — keep focus where the user left it
107
+ // (search boxes, filters, pagination). Path changes keep the browser's focus reset,
108
+ // and so do fragment changes, which must move focus to the targeted section.
109
+ const focusReset = explicitFocusReset
110
+ ?? (isSamePath(this.state.location, url) && this.state.location.hash === url.hash ? 'manual' : 'after-transition');
101
111
  event.intercept({
102
112
  scroll: scrollBehavior,
113
+ focusReset,
103
114
  handler: async () => {
104
115
  // Check blockers before setting pending state
105
116
  for (const blocker of this.blockers) {
@@ -154,6 +165,9 @@ export class Router {
154
165
  if (options?.resetScroll === false) {
155
166
  this.pendingScrollBehavior = 'manual';
156
167
  }
168
+ if (options?.focusReset) {
169
+ this.pendingFocusReset = options.focusReset;
170
+ }
157
171
  this.adapter.navigate(this._basePath + to, options);
158
172
  }
159
173
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"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"}
@@ -148,6 +148,13 @@ export interface NavigateOptions {
148
148
  * Set to `false` to preserve current scroll position.
149
149
  */
150
150
  resetScroll?: boolean;
151
+ /**
152
+ * Whether the browser moves focus after navigation.
153
+ * Defaults to `manual` when only the search string changes — so search boxes, filters and
154
+ * pagination controls keep the caret — and to `after-transition` when the path or the hash
155
+ * changes, so fragment links move focus to the section they target.
156
+ */
157
+ focusReset?: 'after-transition' | 'manual';
151
158
  }
152
159
  /**
153
160
  * Blocker function registered with the router.
@@ -173,6 +180,7 @@ export interface BuzolaNavigateEvent {
173
180
  intercept(options: {
174
181
  handler: () => Promise<void>;
175
182
  scroll?: 'after-transition' | 'manual';
183
+ focusReset?: 'after-transition' | 'manual';
176
184
  }): void;
177
185
  }
178
186
  /** Abstraction over the Navigation API for testability. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAI/D;;;;GAIG;AAEH,MAAM,WAAW,aAAa;CAAG;AAEjC;;;;GAIG;AAEH,MAAM,WAAW,sBAAsB;CAAG;AAE1C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,aAAa,GAAG,MAAM,CAAA;AAEzD;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,CAAA;AAExE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,MAAM,aAAa,IAC1D,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,sBAAsB,GAAG,MAAM,CAAC,GAC7D,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAIlG;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IAC1C,WAAW,EAAE;QACZ,OAAO,EAAE,CAAC,CAAA;QACV,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK;YAAE,KAAK,EAAE,CAAC,CAAA;SAAE,GAAG;YAAE,MAAM,EAAE,SAAS;gBAAE,OAAO,EAAE,MAAM,CAAA;aAAE,EAAE,CAAA;SAAE,CAAA;KACvF,CAAA;CACD;AAED,yEAAyE;AACzE,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,mBAAmB,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;AAE7H,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC3B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B,wEAAwE;IACxE,YAAY,CAAC,EAAE,cAAc,CAAA;IAC7B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAA;CACzB;AAID,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IAC1B,mCAAmC;IACnC,IAAI,EAAE,SAAS,CAAA;IACf,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAA;CAChB;AAID,kGAAkG;AAClG,MAAM,WAAW,SAAS;IACzB,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B,4BAA4B;IAC5B,YAAY,CAAC,EAAE,cAAc,CAAA;IAC7B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAA;IACjB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAA;CAChB;AAID,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACxB,mEAAmE;IACnE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACrC,mEAAmE;IACnE,YAAY,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAA;IACpD,wDAAwD;IACxD,aAAa,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,EAAE,CAAA;KAAE,CAAA;IACzD,0DAA0D;IAC1D,KAAK,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,mFAAmF;AACnF,MAAM,WAAW,SAAS;IACzB,qEAAqE;IACrE,KAAK,EAAE,SAAS,EAAE,CAAA;CAClB;AAED,sFAAsF;AACtF,MAAM,WAAW,SAAS;IACzB,0CAA0C;IAC1C,IAAI,EAAE,QAAQ,CAAA;CACd;AAID,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC3B,4BAA4B;IAC5B,QAAQ,EAAE,GAAG,CAAA;IACb,iDAAiD;IACjD,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAA;IAClB,iFAAiF;IACjF,eAAe,CAAC,EAAE,GAAG,CAAA;IACrB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,OAAO,CAAA;CACzB;AAID,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC/B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,kBAAkB,GAAG,QAAQ,CAAA;CAC1C;AAED;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;AAE9C,2DAA2D;AAC3D,MAAM,WAAW,mBAAmB;IACnC,2BAA2B;IAC3B,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5B,iDAAiD;IACjD,YAAY,EAAE,OAAO,CAAA;IACrB,8BAA8B;IAC9B,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAA;IAC1D,yEAAyE;IACzE,aAAa,EAAE,OAAO,CAAA;IACtB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,0DAA0D;IAC1D,SAAS,CACR,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,QAAQ,CAAC;QAAC,UAAU,CAAC,EAAE,kBAAkB,GAAG,QAAQ,CAAA;KAAE,GAC3H,IAAI,CAAA;CACP;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IACjC,2BAA2B;IAC3B,aAAa,IAAI,GAAG,CAAA;IACpB,yBAAyB;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACtD,eAAe;IACf,IAAI,IAAI,IAAI,CAAA;IACZ,kBAAkB;IAClB,OAAO,IAAI,IAAI,CAAA;IACf,qCAAqC;IACrC,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAA;IACvF,wCAAwC;IACxC,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAA;IAC1F,wCAAwC;IACxC,QAAQ,IAAI,OAAO,CAAA;CACnB"}
@@ -12,4 +12,13 @@ export declare function parseParamSegment(segment: string): {
12
12
  * "/:lang/users/:userId+" → ["lang", "userId"]
13
13
  */
14
14
  export declare function extractParamNames(pattern: string): string[];
15
+ /**
16
+ * Whether two URLs address the same page — i.e. only search/hash differ.
17
+ * Same-path navigations (filters, sorting, pagination, search) keep the page
18
+ * on screen and keep its loader data as stale; path changes do not.
19
+ *
20
+ * Note this ignores the hash. Callers that care about fragment changes — focus
21
+ * handling, for one — have to compare `hash` themselves.
22
+ */
23
+ export declare function isSamePath(a: string | URL, b: string | URL): boolean;
15
24
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAIxF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ3D"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAIxF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ3D;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAIpE"}
@@ -21,4 +21,17 @@ export function extractParamNames(pattern) {
21
21
  }
22
22
  return names;
23
23
  }
24
+ /**
25
+ * Whether two URLs address the same page — i.e. only search/hash differ.
26
+ * Same-path navigations (filters, sorting, pagination, search) keep the page
27
+ * on screen and keep its loader data as stale; path changes do not.
28
+ *
29
+ * Note this ignores the hash. Callers that care about fragment changes — focus
30
+ * handling, for one — have to compare `hash` themselves.
31
+ */
32
+ export function isSamePath(a, b) {
33
+ const urlA = typeof a === 'string' ? new URL(a) : a;
34
+ const urlB = typeof b === 'string' ? new URL(b) : b;
35
+ return urlA.origin === urlB.origin && urlA.pathname === urlB.pathname;
36
+ }
24
37
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA;QAC5C,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA;QAC5C,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,CAAe,EAAE,CAAe;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAA;AACtE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buzola/router",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -233,6 +233,67 @@ describe('PageLoaderState', () => {
233
233
  }
234
234
  })
235
235
 
236
+ it('keeps data as stale when only the query changes — no suspend', () => {
237
+ const cache = new LoaderCache(10)
238
+ const state = createState()
239
+
240
+ resolveCtx(state, { url: 'http://localhost/list', cacheKey: 'list:0', loaderCache: cache })
241
+ state.commitResult('page-1')
242
+
243
+ // Same path, different query (filter/sort/search/pagination)
244
+ const instruction = resolveCtx(state, {
245
+ url: 'http://localhost/list?search=foo',
246
+ cacheKey: 'list?search=foo:0',
247
+ loaderCache: cache,
248
+ })
249
+
250
+ expect(instruction).toEqual({ action: 'render', data: 'page-1', isLoading: true })
251
+ })
252
+
253
+ it('keeps data as stale on query change without a loader cache', () => {
254
+ const state = createState()
255
+
256
+ resolveCtx(state, { url: 'http://localhost/list', cacheKey: 'list:0' })
257
+ state.commitResult('page-1')
258
+
259
+ const instruction = resolveCtx(state, { url: 'http://localhost/list?page=2', cacheKey: 'list?page=2:0' })
260
+
261
+ expect(instruction).toEqual({ action: 'render', data: 'page-1', isLoading: true })
262
+ })
263
+
264
+ it('caches carried-over data under the href it was loaded for', () => {
265
+ const cache = new LoaderCache(10)
266
+ const state = createState()
267
+
268
+ resolveCtx(state, { url: 'http://localhost/list', cacheKey: 'list:0', loaderCache: cache })
269
+ state.commitResult('page-1')
270
+
271
+ // Query change carries 'page-1' over as stale, still belonging to /list
272
+ resolveCtx(state, { url: 'http://localhost/list?page=2', cacheKey: 'list?page=2:0', loaderCache: cache })
273
+ // Leaving before the background load settles must not cache 'page-1' under ?page=2
274
+ state.dispose(cache)
275
+
276
+ const instruction = resolveCtx(state, { url: 'http://localhost/list?page=2', cacheKey: 'list?page=2:0', loaderCache: cache })
277
+ expect(instruction.action).toBe('suspend')
278
+
279
+ state.commitResult('page-2')
280
+ state.dispose(cache)
281
+
282
+ const restored = resolveCtx(state, { url: 'http://localhost/list', cacheKey: 'list:0', loaderCache: cache })
283
+ expect(restored).toEqual({ action: 'render', data: 'page-1', isLoading: true })
284
+ })
285
+
286
+ it('drops data when the path changes', () => {
287
+ const state = createState()
288
+
289
+ resolveCtx(state, { url: 'http://localhost/project/a', cacheKey: 'a:0' })
290
+ state.commitResult('project-a')
291
+
292
+ const instruction = resolveCtx(state, { url: 'http://localhost/project/b', cacheKey: 'b:0' })
293
+
294
+ expect(instruction.action).toBe('suspend')
295
+ })
296
+
236
297
  it('returns suspend when no stale cache available on URL change', () => {
237
298
  const cache = new LoaderCache(10)
238
299
  const state = createState()
@@ -1,9 +1,9 @@
1
- import { describe, expect, it, mock } from 'bun:test'
1
+ import { describe, expect, it, mock, spyOn } from 'bun:test'
2
2
  import { matchRoutes } from '../engine/matcher.js'
3
3
  import { createMemoryNavigationAdapter } from '../engine/navigation-adapter.js'
4
4
  import { buildRouteTree } from '../engine/route-tree.js'
5
5
  import { Router } from '../engine/router.js'
6
- import type { RouteConfig } from '../engine/types.js'
6
+ import type { BuzolaNavigateEvent, NavigationAdapter, RouteConfig } from '../engine/types.js'
7
7
 
8
8
  function dummyComponent() {
9
9
  return null
@@ -276,3 +276,107 @@ describe('Router.preload', () => {
276
276
  router.preload('about')
277
277
  })
278
278
  })
279
+
280
+ describe('Router focus reset', () => {
281
+ function createCapturingRouter(initialURL: string) {
282
+ const routes = buildRouteTree([
283
+ { path: '/list', component: dummyComponent },
284
+ { path: '/about', component: dummyComponent },
285
+ ])
286
+ const adapter = createMemoryNavigationAdapter({ initialURL })
287
+ const captured: ({ scroll?: string; focusReset?: string })[] = []
288
+ const listeners = new Set<(event: BuzolaNavigateEvent) => void>()
289
+ const capturingAdapter: NavigationAdapter = {
290
+ ...adapter,
291
+ addEventListener(type, listener) {
292
+ listeners.add(listener)
293
+ },
294
+ removeEventListener(type, listener) {
295
+ listeners.delete(listener)
296
+ },
297
+ navigate(url) {
298
+ for (const listener of listeners) {
299
+ listener({
300
+ destination: { url: new URL(url, initialURL).href },
301
+ canIntercept: true,
302
+ navigationType: 'push',
303
+ userInitiated: false,
304
+ intercept(options) {
305
+ captured.push({ scroll: options.scroll, focusReset: options.focusReset })
306
+ void options.handler()
307
+ },
308
+ })
309
+ }
310
+ },
311
+ }
312
+ const router = new Router({ routes, adapter: capturingAdapter })
313
+ router.start()
314
+ return { router, captured }
315
+ }
316
+
317
+ it('keeps focus when only the query changes', () => {
318
+ const { router, captured } = createCapturingRouter('http://localhost/list')
319
+
320
+ router.navigate('/list?search=foo')
321
+
322
+ expect(captured.at(-1)?.focusReset).toBe('manual')
323
+ })
324
+
325
+ it('resets focus when the path changes', () => {
326
+ const { router, captured } = createCapturingRouter('http://localhost/list')
327
+
328
+ router.navigate('/about')
329
+
330
+ expect(captured.at(-1)?.focusReset).toBe('after-transition')
331
+ })
332
+
333
+ it('honours an explicit focusReset option', () => {
334
+ const { router, captured } = createCapturingRouter('http://localhost/list')
335
+
336
+ router.navigate('/about', { focusReset: 'manual' })
337
+
338
+ expect(captured.at(-1)?.focusReset).toBe('manual')
339
+ })
340
+
341
+ it('applies the explicit focusReset only to the navigation it was passed with', () => {
342
+ const { router, captured } = createCapturingRouter('http://localhost/list')
343
+
344
+ router.navigate('/about', { focusReset: 'manual' })
345
+ router.navigate('/list')
346
+
347
+ expect(captured.at(-1)?.focusReset).toBe('after-transition')
348
+ })
349
+
350
+ it('resets focus when the hash changes, so fragment links reach their target', () => {
351
+ const { router, captured } = createCapturingRouter('http://localhost/list')
352
+
353
+ router.navigate('/list#details')
354
+
355
+ expect(captured.at(-1)?.focusReset).toBe('after-transition')
356
+ })
357
+
358
+ it('keeps focus when the query changes but the hash stays put', () => {
359
+ const { router, captured } = createCapturingRouter('http://localhost/list#details')
360
+
361
+ router.navigate('/list?search=foo#details')
362
+
363
+ expect(captured.at(-1)?.focusReset).toBe('manual')
364
+ })
365
+
366
+ it('does not leak an explicit focusReset past a navigation that was never intercepted', () => {
367
+ const warn = spyOn(console, 'warn').mockImplementation(() => {})
368
+ try {
369
+ const { router, captured } = createCapturingRouter('http://localhost/list')
370
+
371
+ // No route matches — the router bails out before intercepting
372
+ router.navigate('/unmatched', { focusReset: 'manual' })
373
+ expect(captured).toHaveLength(0)
374
+
375
+ router.navigate('/about')
376
+
377
+ expect(captured.at(-1)?.focusReset).toBe('after-transition')
378
+ } finally {
379
+ warn.mockRestore()
380
+ }
381
+ })
382
+ })
@@ -1,4 +1,5 @@
1
1
  import type { LoaderCache } from './loader-cache.js'
2
+ import { isSamePath } from './utils.js'
2
3
 
3
4
  // ─── Types ──────────────────────────────────────────────────────────────────
4
5
 
@@ -42,6 +43,8 @@ export class PageLoaderState {
42
43
  private activeCacheKey: string | null = null
43
44
  private activePromise: Promise<unknown> | null = null
44
45
  private activeResolvedData: unknown
46
+ /** URL the currently held data was loaded for — data is cached under this href, not the active one. */
47
+ private resolvedUrlHref: string | null = null
45
48
  private hasResolved = false
46
49
  private pendingBackgroundKey: string | null = null
47
50
  private readonly id: number
@@ -103,12 +106,14 @@ export class PageLoaderState {
103
106
  /** Commit data after use() resolves (suspend case) */
104
107
  commitResult(data: unknown): void {
105
108
  this.activeResolvedData = data
109
+ this.resolvedUrlHref = this.activeUrlHref
106
110
  this.hasResolved = true
107
111
  }
108
112
 
109
113
  /** Commit background SWR success — update data and clear pending flag */
110
114
  commitBackgroundResult(data: unknown): void {
111
115
  this.activeResolvedData = data
116
+ this.resolvedUrlHref = this.activeUrlHref
112
117
  this.pendingBackgroundKey = null
113
118
  }
114
119
 
@@ -120,13 +125,14 @@ export class PageLoaderState {
120
125
 
121
126
  /** Save state to stale cache and reset (called on unmount) */
122
127
  dispose(loaderCache: LoaderCache | undefined): void {
123
- if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.activeUrlHref) {
124
- this.saveToStaleCache(loaderCache, this.activeUrlHref, this.activeResolvedData)
128
+ if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.resolvedUrlHref) {
129
+ this.saveToStaleCache(loaderCache, this.resolvedUrlHref, this.activeResolvedData)
125
130
  }
126
131
  this.activeUrlHref = null
127
132
  this.activeCacheKey = null
128
133
  this.activePromise = null
129
134
  this.activeResolvedData = undefined
135
+ this.resolvedUrlHref = null
130
136
  this.hasResolved = false
131
137
  this.pendingBackgroundKey = null
132
138
  }
@@ -135,25 +141,31 @@ export class PageLoaderState {
135
141
 
136
142
  private handleUrlChange(currentUrlHref: string, loaderCache: LoaderCache | undefined): void {
137
143
  if (this.activeUrlHref !== null && this.activeUrlHref !== currentUrlHref) {
138
- // URL changed — save old data to stale cache
139
- if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined) {
140
- this.saveToStaleCache(loaderCache, this.activeUrlHref, this.activeResolvedData)
144
+ // URL changed — save the held data to stale cache under the href it was loaded for
145
+ if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.resolvedUrlHref) {
146
+ this.saveToStaleCache(loaderCache, this.resolvedUrlHref, this.activeResolvedData)
141
147
  }
142
148
  // Try to restore from stale cache for new URL
143
149
  const cached = loaderCache && this.restoreFromStaleCache(loaderCache, currentUrlHref)
144
150
  if (cached?.hit) {
145
151
  this.activeResolvedData = cached.value
152
+ this.resolvedUrlHref = currentUrlHref
146
153
  this.hasResolved = true
147
- } else {
154
+ } else if (!isSamePath(this.activeUrlHref, currentUrlHref)) {
155
+ // Different path — the held data describes another page, drop it and suspend
148
156
  this.hasResolved = false
149
157
  this.activeResolvedData = undefined
158
+ this.resolvedUrlHref = null
150
159
  }
160
+ // Same path, only search/hash changed (filters, sorting, pagination, search):
161
+ // keep the data as stale so resolve() serves it while the new query loads.
151
162
  this.pendingBackgroundKey = null
152
163
  } else if (this.activeUrlHref === null && loaderCache) {
153
164
  // Remount — try to restore from stale cache
154
165
  const cached = this.restoreFromStaleCache(loaderCache, currentUrlHref)
155
166
  if (cached.hit) {
156
167
  this.activeResolvedData = cached.value
168
+ this.resolvedUrlHref = currentUrlHref
157
169
  this.hasResolved = true
158
170
  }
159
171
  }
@@ -30,6 +30,7 @@ export function createBrowserNavigationAdapter(): NavigationAdapter {
30
30
  event.intercept({
31
31
  handler: options.handler,
32
32
  scroll: options.scroll,
33
+ focusReset: options.focusReset,
33
34
  })
34
35
  },
35
36
  }
@@ -1,7 +1,7 @@
1
1
  import { LoaderCache } from './loader-cache.js'
2
2
  import { matchRoutes } from './matcher.js'
3
3
  import type { BlockerFn, NavigateOptions, NavigationAdapter, RouterState, RouteTree } from './types.js'
4
- import { extractParamNames, parseParamSegment } from './utils.js'
4
+ import { extractParamNames, isSamePath, parseParamSegment } from './utils.js'
5
5
 
6
6
  /**
7
7
  * Thrown when a route guard prevents navigation.
@@ -65,6 +65,7 @@ export class Router {
65
65
  private stopFn: (() => void) | undefined
66
66
  private blockers = new Set<BlockerFn>()
67
67
  private pendingScrollBehavior: 'after-transition' | 'manual' = 'after-transition'
68
+ private pendingFocusReset: 'after-transition' | 'manual' | undefined
68
69
  private readonly _loaderCache: LoaderCache | undefined
69
70
 
70
71
  constructor(options: RouterOptions) {
@@ -131,6 +132,13 @@ export class Router {
131
132
  */
132
133
  start(): () => void {
133
134
  const handler = (event: import('./types.js').BuzolaNavigateEvent) => {
135
+ // Consume the pending options before any early return — they belong to the
136
+ // navigation that armed them and must not leak into the next one.
137
+ const scrollBehavior = this.pendingScrollBehavior
138
+ const explicitFocusReset = this.pendingFocusReset
139
+ this.pendingScrollBehavior = 'after-transition'
140
+ this.pendingFocusReset = undefined
141
+
134
142
  if (!event.canIntercept) return
135
143
 
136
144
  const url = new URL(event.destination.url)
@@ -143,11 +151,15 @@ export class Router {
143
151
 
144
152
  const currentNavId = ++this.navigationId
145
153
  const useViewTransition = event.viewTransition || this.viewTransitions
146
- const scrollBehavior = this.pendingScrollBehavior
147
- this.pendingScrollBehavior = 'after-transition'
154
+ // Query-only navigations stay on the same page — keep focus where the user left it
155
+ // (search boxes, filters, pagination). Path changes keep the browser's focus reset,
156
+ // and so do fragment changes, which must move focus to the targeted section.
157
+ const focusReset = explicitFocusReset
158
+ ?? (isSamePath(this.state.location, url) && this.state.location.hash === url.hash ? 'manual' : 'after-transition')
148
159
 
149
160
  event.intercept({
150
161
  scroll: scrollBehavior,
162
+ focusReset,
151
163
  handler: async () => {
152
164
  // Check blockers before setting pending state
153
165
  for (const blocker of this.blockers) {
@@ -206,6 +218,9 @@ export class Router {
206
218
  if (options?.resetScroll === false) {
207
219
  this.pendingScrollBehavior = 'manual'
208
220
  }
221
+ if (options?.focusReset) {
222
+ this.pendingFocusReset = options.focusReset
223
+ }
209
224
  this.adapter.navigate(this._basePath + to, options)
210
225
  }
211
226
 
@@ -167,6 +167,13 @@ export interface NavigateOptions {
167
167
  * Set to `false` to preserve current scroll position.
168
168
  */
169
169
  resetScroll?: boolean
170
+ /**
171
+ * Whether the browser moves focus after navigation.
172
+ * Defaults to `manual` when only the search string changes — so search boxes, filters and
173
+ * pagination controls keep the caret — and to `after-transition` when the path or the hash
174
+ * changes, so fragment links move focus to the section they target.
175
+ */
176
+ focusReset?: 'after-transition' | 'manual'
170
177
  }
171
178
 
172
179
  /**
@@ -189,7 +196,9 @@ export interface BuzolaNavigateEvent {
189
196
  /** Whether this navigation should use View Transitions API. */
190
197
  viewTransition?: boolean
191
198
  /** Intercept the navigation and handle it client-side. */
192
- intercept(options: { handler: () => Promise<void>; scroll?: 'after-transition' | 'manual' }): void
199
+ intercept(
200
+ options: { handler: () => Promise<void>; scroll?: 'after-transition' | 'manual'; focusReset?: 'after-transition' | 'manual' },
201
+ ): void
193
202
  }
194
203
 
195
204
  /** Abstraction over the Navigation API for testability. */
@@ -22,3 +22,17 @@ export function extractParamNames(pattern: string): string[] {
22
22
  }
23
23
  return names
24
24
  }
25
+
26
+ /**
27
+ * Whether two URLs address the same page — i.e. only search/hash differ.
28
+ * Same-path navigations (filters, sorting, pagination, search) keep the page
29
+ * on screen and keep its loader data as stale; path changes do not.
30
+ *
31
+ * Note this ignores the hash. Callers that care about fragment changes — focus
32
+ * handling, for one — have to compare `hash` themselves.
33
+ */
34
+ export function isSamePath(a: string | URL, b: string | URL): boolean {
35
+ const urlA = typeof a === 'string' ? new URL(a) : a
36
+ const urlB = typeof b === 'string' ? new URL(b) : b
37
+ return urlA.origin === urlB.origin && urlA.pathname === urlB.pathname
38
+ }