@tanstack/router-core 1.168.8 → 1.168.10

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/cjs/hash-scroll.cjs +1 -1
  2. package/dist/cjs/hash-scroll.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +1 -1
  4. package/dist/cjs/load-matches.cjs +4 -4
  5. package/dist/cjs/load-matches.cjs.map +1 -1
  6. package/dist/cjs/router.cjs +44 -45
  7. package/dist/cjs/router.cjs.map +1 -1
  8. package/dist/cjs/router.d.cts +3 -1
  9. package/dist/cjs/scroll-restoration.cjs +1 -1
  10. package/dist/cjs/scroll-restoration.cjs.map +1 -1
  11. package/dist/cjs/ssr/createRequestHandler.cjs +2 -2
  12. package/dist/cjs/ssr/createRequestHandler.cjs.map +1 -1
  13. package/dist/cjs/ssr/serializer/RawStream.cjs +41 -32
  14. package/dist/cjs/ssr/serializer/RawStream.cjs.map +1 -1
  15. package/dist/cjs/ssr/serializer/RawStream.d.cts +12 -4
  16. package/dist/cjs/ssr/serializer/ShallowErrorPlugin.cjs.map +1 -1
  17. package/dist/cjs/ssr/serializer/ShallowErrorPlugin.d.cts +2 -2
  18. package/dist/cjs/ssr/serializer/seroval-plugins.cjs.map +1 -1
  19. package/dist/cjs/ssr/serializer/seroval-plugins.d.cts +2 -1
  20. package/dist/cjs/ssr/serializer/transformer.cjs +16 -14
  21. package/dist/cjs/ssr/serializer/transformer.cjs.map +1 -1
  22. package/dist/cjs/ssr/serializer/transformer.d.cts +24 -23
  23. package/dist/cjs/ssr/ssr-client.cjs +8 -8
  24. package/dist/cjs/ssr/ssr-client.cjs.map +1 -1
  25. package/dist/cjs/ssr/ssr-server.cjs +31 -9
  26. package/dist/cjs/ssr/ssr-server.cjs.map +1 -1
  27. package/dist/cjs/ssr/ssr-server.d.cts +3 -2
  28. package/dist/cjs/ssr/transformStreamWithRouter.cjs +4 -1
  29. package/dist/cjs/ssr/transformStreamWithRouter.cjs.map +1 -1
  30. package/dist/cjs/stores.cjs +27 -27
  31. package/dist/cjs/stores.cjs.map +1 -1
  32. package/dist/cjs/stores.d.cts +2 -2
  33. package/dist/esm/hash-scroll.js +1 -1
  34. package/dist/esm/hash-scroll.js.map +1 -1
  35. package/dist/esm/index.d.ts +1 -1
  36. package/dist/esm/load-matches.js +4 -4
  37. package/dist/esm/load-matches.js.map +1 -1
  38. package/dist/esm/router.d.ts +3 -1
  39. package/dist/esm/router.js +44 -45
  40. package/dist/esm/router.js.map +1 -1
  41. package/dist/esm/scroll-restoration.js +1 -1
  42. package/dist/esm/scroll-restoration.js.map +1 -1
  43. package/dist/esm/ssr/createRequestHandler.js +2 -2
  44. package/dist/esm/ssr/createRequestHandler.js.map +1 -1
  45. package/dist/esm/ssr/serializer/RawStream.d.ts +12 -4
  46. package/dist/esm/ssr/serializer/RawStream.js +41 -32
  47. package/dist/esm/ssr/serializer/RawStream.js.map +1 -1
  48. package/dist/esm/ssr/serializer/ShallowErrorPlugin.d.ts +2 -2
  49. package/dist/esm/ssr/serializer/ShallowErrorPlugin.js.map +1 -1
  50. package/dist/esm/ssr/serializer/seroval-plugins.d.ts +2 -1
  51. package/dist/esm/ssr/serializer/seroval-plugins.js.map +1 -1
  52. package/dist/esm/ssr/serializer/transformer.d.ts +24 -23
  53. package/dist/esm/ssr/serializer/transformer.js +16 -14
  54. package/dist/esm/ssr/serializer/transformer.js.map +1 -1
  55. package/dist/esm/ssr/ssr-client.js +8 -8
  56. package/dist/esm/ssr/ssr-client.js.map +1 -1
  57. package/dist/esm/ssr/ssr-server.d.ts +3 -2
  58. package/dist/esm/ssr/ssr-server.js +31 -9
  59. package/dist/esm/ssr/ssr-server.js.map +1 -1
  60. package/dist/esm/ssr/transformStreamWithRouter.js +4 -1
  61. package/dist/esm/ssr/transformStreamWithRouter.js.map +1 -1
  62. package/dist/esm/stores.d.ts +2 -2
  63. package/dist/esm/stores.js +28 -28
  64. package/dist/esm/stores.js.map +1 -1
  65. package/package.json +3 -3
  66. package/src/hash-scroll.ts +1 -1
  67. package/src/index.ts +1 -1
  68. package/src/load-matches.ts +6 -6
  69. package/src/router.ts +59 -57
  70. package/src/scroll-restoration.ts +1 -1
  71. package/src/ssr/createRequestHandler.ts +4 -5
  72. package/src/ssr/serializer/RawStream.ts +65 -56
  73. package/src/ssr/serializer/ShallowErrorPlugin.ts +2 -2
  74. package/src/ssr/serializer/seroval-plugins.ts +2 -1
  75. package/src/ssr/serializer/transformer.ts +71 -76
  76. package/src/ssr/ssr-client.ts +7 -11
  77. package/src/ssr/ssr-server.ts +39 -7
  78. package/src/ssr/transformStreamWithRouter.ts +3 -0
  79. package/src/stores.ts +34 -34
@@ -366,6 +366,9 @@ export function transformStreamWithRouter(
366
366
  if (isAppRendering || leftover || pendingClosingTags) {
367
367
  appendRouterHtml(html)
368
368
  } else {
369
+ // App is done rendering - flush any pending buffer first to maintain order,
370
+ // then write the new HTML directly
371
+ flushPendingRouterHtml()
369
372
  safeEnqueue(html)
370
373
  }
371
374
  })
package/src/stores.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createLRUCache } from './lru-cache'
2
- import { arraysEqual } from './utils'
2
+ import { arraysEqual, functionalUpdate } from './utils'
3
3
 
4
4
  import type { AnyRoute } from './route'
5
5
  import type { RouterState } from './router'
@@ -9,13 +9,13 @@ import type { AnyRedirect } from './redirect'
9
9
  import type { AnyRouteMatch } from './Matches'
10
10
 
11
11
  export interface RouterReadableStore<TValue> {
12
- readonly state: TValue
12
+ get: () => TValue
13
13
  }
14
14
 
15
15
  export interface RouterWritableStore<
16
16
  TValue,
17
17
  > extends RouterReadableStore<TValue> {
18
- setState: (updater: (prev: TValue) => TValue) => void
18
+ set: ((updater: (prev: TValue) => TValue) => void) & ((value: TValue) => void)
19
19
  }
20
20
 
21
21
  export type RouterBatchFn = (fn: () => void) => void
@@ -49,11 +49,11 @@ export function createNonReactiveMutableStore<TValue>(
49
49
  let value = initialValue
50
50
 
51
51
  return {
52
- get state() {
52
+ get() {
53
53
  return value
54
54
  },
55
- setState(updater: (prev: TValue) => TValue) {
56
- value = updater(value)
55
+ set(nextOrUpdater: TValue | ((prev: TValue) => TValue)) {
56
+ value = functionalUpdate(nextOrUpdater, value)
57
57
  },
58
58
  }
59
59
  }
@@ -63,7 +63,7 @@ export function createNonReactiveReadonlyStore<TValue>(
63
63
  read: () => TValue,
64
64
  ): RouterReadableStore<TValue> {
65
65
  return {
66
- get state() {
66
+ get() {
67
67
  return read()
68
68
  },
69
69
  }
@@ -141,38 +141,38 @@ export function createRouterStores<TRouteTree extends AnyRoute>(
141
141
 
142
142
  // 1st order derived stores
143
143
  const activeMatchesSnapshot = createReadonlyStore(() =>
144
- readPoolMatches(activeMatchStoresById, matchesId.state),
144
+ readPoolMatches(activeMatchStoresById, matchesId.get()),
145
145
  )
146
146
  const pendingMatchesSnapshot = createReadonlyStore(() =>
147
- readPoolMatches(pendingMatchStoresById, pendingMatchesId.state),
147
+ readPoolMatches(pendingMatchStoresById, pendingMatchesId.get()),
148
148
  )
149
149
  const cachedMatchesSnapshot = createReadonlyStore(() =>
150
- readPoolMatches(cachedMatchStoresById, cachedMatchesId.state),
150
+ readPoolMatches(cachedMatchStoresById, cachedMatchesId.get()),
151
151
  )
152
- const firstMatchId = createReadonlyStore(() => matchesId.state[0])
152
+ const firstMatchId = createReadonlyStore(() => matchesId.get()[0])
153
153
  const hasPendingMatches = createReadonlyStore(() =>
154
- matchesId.state.some((matchId) => {
154
+ matchesId.get().some((matchId) => {
155
155
  const store = activeMatchStoresById.get(matchId)
156
- return store?.state.status === 'pending'
156
+ return store?.get().status === 'pending'
157
157
  }),
158
158
  )
159
159
  const matchRouteReactivity = createReadonlyStore(() => ({
160
- locationHref: location.state.href,
161
- resolvedLocationHref: resolvedLocation.state?.href,
162
- status: status.state,
160
+ locationHref: location.get().href,
161
+ resolvedLocationHref: resolvedLocation.get()?.href,
162
+ status: status.get(),
163
163
  }))
164
164
 
165
165
  // compatibility "big" state store
166
166
  const __store = createReadonlyStore(() => ({
167
- status: status.state,
168
- loadedAt: loadedAt.state,
169
- isLoading: isLoading.state,
170
- isTransitioning: isTransitioning.state,
171
- matches: activeMatchesSnapshot.state,
172
- location: location.state,
173
- resolvedLocation: resolvedLocation.state,
174
- statusCode: statusCode.state,
175
- redirect: redirect.state,
167
+ status: status.get(),
168
+ loadedAt: loadedAt.get(),
169
+ isLoading: isLoading.get(),
170
+ isTransitioning: isTransitioning.get(),
171
+ matches: activeMatchesSnapshot.get(),
172
+ location: location.get(),
173
+ resolvedLocation: resolvedLocation.get(),
174
+ statusCode: statusCode.get(),
175
+ redirect: redirect.get(),
176
176
  }))
177
177
 
178
178
  // Per-routeId computed store cache.
@@ -194,15 +194,15 @@ export function createRouterStores<TRouteTree extends AnyRoute>(
194
194
  let cached = matchStoreByRouteIdCache.get(routeId)
195
195
  if (!cached) {
196
196
  cached = createReadonlyStore(() => {
197
- // Reading matchesId.state tracks it as a dependency.
197
+ // Reading matchesId.get() tracks it as a dependency.
198
198
  // When matchesId changes (navigation), this computed re-evaluates.
199
- const ids = matchesId.state
199
+ const ids = matchesId.get()
200
200
  for (const id of ids) {
201
201
  const matchStore = activeMatchStoresById.get(id)
202
202
  if (matchStore && matchStore.routeId === routeId) {
203
- // Reading matchStore.state tracks it as a dependency.
203
+ // Reading matchStore.get() tracks it as a dependency.
204
204
  // When the match store's state changes, this re-evaluates.
205
- return matchStore.state
205
+ return matchStore.get()
206
206
  }
207
207
  }
208
208
  return undefined
@@ -297,7 +297,7 @@ function readPoolMatches(
297
297
  for (const id of ids) {
298
298
  const matchStore = pool.get(id)
299
299
  if (matchStore) {
300
- matches.push(matchStore.state)
300
+ matches.push(matchStore.get())
301
301
  }
302
302
  }
303
303
  return matches
@@ -330,13 +330,13 @@ function reconcileMatchPool(
330
330
  }
331
331
 
332
332
  existing.routeId = nextMatch.routeId
333
- if (existing.state !== nextMatch) {
334
- existing.setState(() => nextMatch)
333
+ if (existing.get() !== nextMatch) {
334
+ existing.set(nextMatch)
335
335
  }
336
336
  }
337
337
 
338
- if (!arraysEqual(idStore.state, nextIds)) {
339
- idStore.setState(() => nextIds)
338
+ if (!arraysEqual(idStore.get(), nextIds)) {
339
+ idStore.set(nextIds)
340
340
  }
341
341
  })
342
342
  }