@askrjs/askr 0.0.50 → 0.0.51

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 (227) hide show
  1. package/dist/bench/components/benchmark-table.js.map +1 -1
  2. package/dist/benchmark.js +5 -4
  3. package/dist/benchmark.js.map +1 -1
  4. package/dist/bin/askr-ssg.d.ts.map +1 -1
  5. package/dist/bin/askr-ssg.js.map +1 -1
  6. package/dist/boot/hydration.js.map +1 -1
  7. package/dist/boot/index.js +2 -1
  8. package/dist/boot/index.js.map +1 -1
  9. package/dist/boot/root-lifecycle.d.ts.map +1 -1
  10. package/dist/boot/root-lifecycle.js +4 -4
  11. package/dist/boot/root-lifecycle.js.map +1 -1
  12. package/dist/boot/route-startup.js.map +1 -1
  13. package/dist/common/error-boundary.d.ts +16 -0
  14. package/dist/common/error-boundary.d.ts.map +1 -0
  15. package/dist/common/invariant.js +17 -0
  16. package/dist/common/invariant.js.map +1 -0
  17. package/dist/{dev → common}/logger.js +5 -6
  18. package/dist/common/logger.js.map +1 -0
  19. package/dist/common/vnode.js.map +1 -1
  20. package/dist/components/error-boundary.d.ts +2 -15
  21. package/dist/components/error-boundary.d.ts.map +1 -1
  22. package/dist/components/error-boundary.js +2 -74
  23. package/dist/components/error-boundary.js.map +1 -1
  24. package/dist/components/index.d.ts +2 -1
  25. package/dist/components/link.js +2 -0
  26. package/dist/components/link.js.map +1 -1
  27. package/dist/control/case.d.ts.map +1 -1
  28. package/dist/control/case.js +1 -0
  29. package/dist/control/case.js.map +1 -1
  30. package/dist/control/for.d.ts +3 -3
  31. package/dist/control/for.d.ts.map +1 -1
  32. package/dist/control/for.js +2 -2
  33. package/dist/control/for.js.map +1 -1
  34. package/dist/control/show.js +1 -0
  35. package/dist/control/show.js.map +1 -1
  36. package/dist/data/data-runtime.js.map +1 -1
  37. package/dist/data/invalidation.js +2 -2
  38. package/dist/data/invalidation.js.map +1 -1
  39. package/dist/data/mutation-cell.d.ts.map +1 -1
  40. package/dist/data/mutation-cell.js +1 -1
  41. package/dist/data/mutation-cell.js.map +1 -1
  42. package/dist/data/query-cell.js +2 -2
  43. package/dist/data/query-cell.js.map +1 -1
  44. package/dist/data/shared.js +1 -0
  45. package/dist/data/shared.js.map +1 -1
  46. package/dist/data/testing.js +2 -0
  47. package/dist/foundations/index.d.ts +1 -1
  48. package/dist/foundations/index.js +1 -1
  49. package/dist/foundations/state/controllable.d.ts +0 -1
  50. package/dist/foundations/state/controllable.d.ts.map +1 -1
  51. package/dist/foundations/state/controllable.js +1 -0
  52. package/dist/foundations/state/controllable.js.map +1 -1
  53. package/dist/foundations/structures/index.d.ts +1 -1
  54. package/dist/foundations/structures/index.js +2 -1
  55. package/dist/foundations/structures/portal.d.ts +2 -24
  56. package/dist/foundations/structures/portal.js +3 -187
  57. package/dist/fx/fx.js +2 -2
  58. package/dist/fx/fx.js.map +1 -1
  59. package/dist/fx/index.js +1 -0
  60. package/dist/index.d.ts +3 -3
  61. package/dist/index.js +4 -4
  62. package/dist/index.js.map +1 -1
  63. package/dist/jsx/types.d.ts.map +1 -1
  64. package/dist/jsx-dev-runtime.js +1 -0
  65. package/dist/jsx-dev-runtime.js.map +1 -1
  66. package/dist/jsx-runtime.js +1 -0
  67. package/dist/jsx-runtime.js.map +1 -1
  68. package/dist/renderer/attributes.js +1 -0
  69. package/dist/renderer/attributes.js.map +1 -1
  70. package/dist/renderer/boundaries.js +5 -5
  71. package/dist/renderer/boundaries.js.map +1 -1
  72. package/dist/renderer/child-shape.js +2 -2
  73. package/dist/renderer/child-shape.js.map +1 -1
  74. package/dist/renderer/children-fastpath.js +149 -0
  75. package/dist/renderer/children-fastpath.js.map +1 -0
  76. package/dist/renderer/children.js +3 -138
  77. package/dist/renderer/children.js.map +1 -1
  78. package/dist/renderer/cleanup.js +2 -2
  79. package/dist/renderer/cleanup.js.map +1 -1
  80. package/dist/renderer/component-host-cleanup.js +1 -1
  81. package/dist/renderer/component-host-cleanup.js.map +1 -1
  82. package/dist/renderer/component-host-instances.js +1 -1
  83. package/dist/renderer/component-host-instances.js.map +1 -1
  84. package/dist/renderer/component-host.js +1 -1
  85. package/dist/renderer/component-host.js.map +1 -1
  86. package/dist/renderer/dom-host.js.map +1 -1
  87. package/dist/renderer/dom-internal.js +5 -4
  88. package/dist/renderer/dom-internal.js.map +1 -1
  89. package/dist/renderer/dom.js +2 -1
  90. package/dist/renderer/element-children.js.map +1 -1
  91. package/dist/renderer/error-boundary-dom.js +51 -2
  92. package/dist/renderer/error-boundary-dom.js.map +1 -1
  93. package/dist/renderer/evaluate-reconcile.js +6 -5
  94. package/dist/renderer/evaluate-reconcile.js.map +1 -1
  95. package/dist/renderer/evaluate.js.map +1 -1
  96. package/dist/renderer/fastpath.js +3 -2
  97. package/dist/renderer/fastpath.js.map +1 -1
  98. package/dist/renderer/for-commit-dom-map.js.map +1 -1
  99. package/dist/renderer/for-commit-removal.js +2 -2
  100. package/dist/renderer/for-commit-removal.js.map +1 -1
  101. package/dist/renderer/for-commit-reorder.js +2 -2
  102. package/dist/renderer/for-commit-reorder.js.map +1 -1
  103. package/dist/renderer/for-commit.js +3 -3
  104. package/dist/renderer/for-commit.js.map +1 -1
  105. package/dist/renderer/index.js +3 -1
  106. package/dist/renderer/index.js.map +1 -1
  107. package/dist/renderer/prop-bindings.js +4 -4
  108. package/dist/renderer/prop-bindings.js.map +1 -1
  109. package/dist/renderer/reactive-child-dom.js.map +1 -1
  110. package/dist/renderer/reactive-children.js +4 -4
  111. package/dist/renderer/reactive-children.js.map +1 -1
  112. package/dist/renderer/reconcile-fastpaths.js +2 -1
  113. package/dist/renderer/reconcile-fastpaths.js.map +1 -1
  114. package/dist/renderer/reconcile-resolution.js +3 -3
  115. package/dist/renderer/reconcile-resolution.js.map +1 -1
  116. package/dist/renderer/retained-element-rollback.js +2 -1
  117. package/dist/renderer/retained-element-rollback.js.map +1 -1
  118. package/dist/renderer/stable-patch.js +2 -3
  119. package/dist/renderer/stable-patch.js.map +1 -1
  120. package/dist/renderer/utils.js +2 -1
  121. package/dist/renderer/utils.js.map +1 -1
  122. package/dist/resources/index.js +1 -2
  123. package/dist/router/activity.d.ts.map +1 -1
  124. package/dist/router/activity.js +20 -22
  125. package/dist/router/activity.js.map +1 -1
  126. package/dist/router/authoring.js +1 -1
  127. package/dist/router/authoring.js.map +1 -1
  128. package/dist/router/index.d.ts +1 -1
  129. package/dist/router/navigate.js +1 -1
  130. package/dist/router/navigate.js.map +1 -1
  131. package/dist/router/navigation-registry.js +1 -1
  132. package/dist/router/navigation-registry.js.map +1 -1
  133. package/dist/router/navigation-targets.d.ts.map +1 -1
  134. package/dist/router/navigation-targets.js +7 -5
  135. package/dist/router/navigation-targets.js.map +1 -1
  136. package/dist/router/rendering.js +1 -0
  137. package/dist/router/rendering.js.map +1 -1
  138. package/dist/router/resolution.d.ts +1 -14
  139. package/dist/router/resolution.d.ts.map +1 -1
  140. package/dist/router/resolution.js +6 -173
  141. package/dist/router/resolution.js.map +1 -1
  142. package/dist/router/route-matching.d.ts +20 -0
  143. package/dist/router/route-matching.d.ts.map +1 -0
  144. package/dist/router/route-matching.js +175 -0
  145. package/dist/router/route-matching.js.map +1 -0
  146. package/dist/router/route.js +4 -2
  147. package/dist/router/testing.js +4 -0
  148. package/dist/runtime/access.d.ts +20 -0
  149. package/dist/runtime/access.d.ts.map +1 -0
  150. package/dist/runtime/component-cleanup.js +1 -1
  151. package/dist/runtime/component-cleanup.js.map +1 -1
  152. package/dist/runtime/component-commit.js +1 -1
  153. package/dist/runtime/component-commit.js.map +1 -1
  154. package/dist/runtime/component-internal.d.ts +1 -1
  155. package/dist/runtime/component-internal.js +1 -1
  156. package/dist/runtime/component-internal.js.map +1 -1
  157. package/dist/runtime/component-lifecycle.d.ts +1 -1
  158. package/dist/runtime/component-lifecycle.js +1 -1
  159. package/dist/runtime/component-lifecycle.js.map +1 -1
  160. package/dist/runtime/component-scope.d.ts +1 -1
  161. package/dist/runtime/dev-namespace.d.ts +31 -0
  162. package/dist/runtime/dev-namespace.d.ts.map +1 -0
  163. package/dist/runtime/error-boundary.d.ts +5 -0
  164. package/dist/runtime/error-boundary.d.ts.map +1 -0
  165. package/dist/runtime/error-boundary.js +31 -0
  166. package/dist/runtime/error-boundary.js.map +1 -0
  167. package/dist/runtime/events.d.ts +58 -0
  168. package/dist/runtime/events.d.ts.map +1 -0
  169. package/dist/runtime/events.js +1 -1
  170. package/dist/runtime/events.js.map +1 -1
  171. package/dist/runtime/execution-model.d.ts +7 -0
  172. package/dist/runtime/execution-model.d.ts.map +1 -0
  173. package/dist/runtime/fastlane.d.ts +34 -0
  174. package/dist/runtime/fastlane.d.ts.map +1 -0
  175. package/dist/runtime/for-internal.d.ts +5 -5
  176. package/dist/runtime/for-internal.d.ts.map +1 -1
  177. package/dist/runtime/for-internal.js.map +1 -1
  178. package/dist/runtime/for-signals.d.ts +1 -1
  179. package/dist/runtime/for-signals.d.ts.map +1 -1
  180. package/dist/runtime/for-signals.js +1 -1
  181. package/dist/runtime/for-signals.js.map +1 -1
  182. package/dist/runtime/for-types.d.ts +9 -0
  183. package/dist/runtime/for-types.d.ts.map +1 -0
  184. package/dist/runtime/index.d.ts +24 -0
  185. package/dist/runtime/index.js +31 -0
  186. package/dist/runtime/perf-metrics.d.ts +26 -0
  187. package/dist/runtime/perf-metrics.d.ts.map +1 -0
  188. package/dist/runtime/portal.d.ts +22 -0
  189. package/dist/runtime/portal.d.ts.map +1 -0
  190. package/dist/runtime/portal.js +213 -0
  191. package/dist/runtime/portal.js.map +1 -0
  192. package/dist/runtime/resource-cell.js +1 -1
  193. package/dist/runtime/resource-cell.js.map +1 -1
  194. package/dist/runtime/resource-operation.js +1 -1
  195. package/dist/runtime/runtime.d.ts +1 -1
  196. package/dist/runtime/scheduler.js +2 -2
  197. package/dist/runtime/scheduler.js.map +1 -1
  198. package/dist/runtime/selector-store.js +24 -0
  199. package/dist/runtime/selector-store.js.map +1 -0
  200. package/dist/runtime/selector.d.ts.map +1 -1
  201. package/dist/runtime/selector.js +3 -18
  202. package/dist/runtime/selector.js.map +1 -1
  203. package/dist/ssg/create-static-gen.js +1 -0
  204. package/dist/ssg/create-static-gen.js.map +1 -1
  205. package/dist/ssg/static-routes.js +1 -0
  206. package/dist/ssg/static-routes.js.map +1 -1
  207. package/dist/ssr/boundaries.js +2 -2
  208. package/dist/ssr/boundaries.js.map +1 -1
  209. package/dist/ssr/component-runtime.js +3 -3
  210. package/dist/ssr/component-runtime.js.map +1 -1
  211. package/dist/ssr/render-resolved.js +1 -1
  212. package/dist/ssr/render-sync.js +1 -1
  213. package/dist/ssr/render-sync.js.map +1 -1
  214. package/dist/ssr/route-policy-resolution.js +2 -1
  215. package/dist/ssr/route-policy-resolution.js.map +1 -1
  216. package/dist/ssr/route-render.js +2 -1
  217. package/dist/ssr/route-render.js.map +1 -1
  218. package/dist/testing/index.d.ts.map +1 -1
  219. package/dist/testing/index.js +3 -2
  220. package/dist/testing/index.js.map +1 -1
  221. package/package.json +4 -4
  222. package/dist/dev/invariant.js +0 -29
  223. package/dist/dev/invariant.js.map +0 -1
  224. package/dist/dev/logger.js.map +0 -1
  225. package/dist/foundations/structures/portal.d.ts.map +0 -1
  226. package/dist/foundations/structures/portal.js.map +0 -1
  227. package/dist/runtime/component-contracts.js +0 -5
@@ -1,167 +1,11 @@
1
1
  import { isPromiseLike } from "../common/promise.js";
2
- import { computeRank, matchSegments, parseSegments, splitPathSegments } from "./match.js";
2
+ import { getActiveRenderContext } from "../common/render-context.js";
3
3
  import { compileNodePolicies } from "./access.js";
4
4
  import { getRenderHandler } from "./rendering.js";
5
- import { getActiveRenderContext } from "../common/render-context.js";
6
- import { getActiveRouteAuthOptions, getActiveRoutes, getRouteRecords, isRouteStoreRoutes } from "./store.js";
7
- import { buildRouteContext, buildRouteContextBase, deepFreeze, parseLocation } from "./route-context.js";
5
+ import { getActiveRouteAuthOptions, getRouteRecords } from "./store.js";
6
+ import { buildRouteContext, buildRouteContextBase } from "./route-context.js";
7
+ import { computeMatchesFromRoutes, computeRouteActivityMatches, getMatchingRouteRecord, resolveRouteFromRoutes } from "./route-matching.js";
8
8
  //#region src/router/resolution.ts
9
- const routeSegsCache = /* @__PURE__ */ new WeakMap();
10
- const routeRankCache = /* @__PURE__ */ new WeakMap();
11
- const sortedListCache = /* @__PURE__ */ new WeakMap();
12
- function cachedSegs(route) {
13
- let segments = routeSegsCache.get(route);
14
- if (!segments) {
15
- segments = parseSegments(route.path);
16
- routeSegsCache.set(route, segments);
17
- }
18
- return segments;
19
- }
20
- function cachedRank(route) {
21
- let rank = routeRankCache.get(route);
22
- if (rank === void 0) {
23
- rank = computeRank(cachedSegs(route));
24
- routeRankCache.set(route, rank);
25
- }
26
- return rank;
27
- }
28
- function cachedSortedList(routeList) {
29
- let sorted = sortedListCache.get(routeList);
30
- if (!sorted) {
31
- sorted = [...routeList].sort((a, b) => cachedRank(b) - cachedRank(a));
32
- sortedListCache.set(routeList, sorted);
33
- }
34
- return sorted;
35
- }
36
- function matchFallbackPrefix(pathname, fallbackPrefix) {
37
- const normalizedPath = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname;
38
- const normalizedPrefix = fallbackPrefix.endsWith("/") && fallbackPrefix !== "/" ? fallbackPrefix.slice(0, -1) : fallbackPrefix;
39
- if (normalizedPrefix === "/") {
40
- const urlParts = splitPathSegments(normalizedPath);
41
- return { "*": urlParts.length === 0 ? "/" : urlParts.length === 1 ? urlParts[0] : "/" + urlParts.join("/") };
42
- }
43
- if (normalizedPath !== normalizedPrefix && !normalizedPath.startsWith(`${normalizedPrefix}/`)) return null;
44
- const remainderParts = splitPathSegments(normalizedPath === normalizedPrefix ? "/" : normalizedPath.slice(normalizedPrefix.length));
45
- return { "*": remainderParts.length === 0 ? "/" : remainderParts.length === 1 ? remainderParts[0] : "/" + remainderParts.join("/") };
46
- }
47
- function findBestResolvedRouteFromRoutes(pathname, routeList) {
48
- const normalized = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname;
49
- const urlParts = splitPathSegments(normalized);
50
- const sorted = cachedSortedList(routeList);
51
- let bestRoute = null;
52
- let bestParams = {};
53
- let bestRank = -Infinity;
54
- for (const route of sorted) {
55
- if (route.fallbackPrefix) continue;
56
- const rank = cachedRank(route);
57
- if (rank < bestRank) break;
58
- if (bestRoute !== null && rank === bestRank) continue;
59
- const params = matchSegments(urlParts, cachedSegs(route));
60
- if (params !== null) {
61
- bestRoute = route;
62
- bestParams = params;
63
- bestRank = rank;
64
- }
65
- }
66
- if (bestRoute !== null) return {
67
- route: bestRoute,
68
- params: bestParams
69
- };
70
- let bestFallback = null;
71
- let bestFallbackParams = null;
72
- let bestPrefixLength = -1;
73
- for (const route of routeList) {
74
- const internalRoute = route;
75
- if (!internalRoute.fallbackPrefix) continue;
76
- const params = matchFallbackPrefix(normalized, internalRoute.fallbackPrefix);
77
- if (params === null) continue;
78
- if (internalRoute.fallbackPrefix.length > bestPrefixLength) {
79
- bestFallback = internalRoute;
80
- bestFallbackParams = params;
81
- bestPrefixLength = internalRoute.fallbackPrefix.length;
82
- }
83
- }
84
- return bestFallback && bestFallbackParams ? {
85
- route: bestFallback,
86
- params: bestFallbackParams
87
- } : null;
88
- }
89
- function findBestScopedFallbackRecord(pathname, routeRecords) {
90
- let bestRecord = null;
91
- let bestParams = null;
92
- let bestPrefixLength = -1;
93
- for (const routeRecord of routeRecords) {
94
- const record = routeRecord;
95
- if (!record.fallbackPrefix) continue;
96
- const params = matchFallbackPrefix(pathname, record.fallbackPrefix);
97
- if (params === null) continue;
98
- if (record.fallbackPrefix.length > bestPrefixLength) {
99
- bestRecord = record;
100
- bestParams = params;
101
- bestPrefixLength = record.fallbackPrefix.length;
102
- }
103
- }
104
- return bestRecord && bestParams ? {
105
- record: bestRecord,
106
- params: bestParams
107
- } : null;
108
- }
109
- function getMatchingRecord(target, routeRecords) {
110
- const location = parseLocation(target);
111
- const normalized = location.pathname.endsWith("/") && location.pathname !== "/" ? location.pathname.slice(0, -1) : location.pathname;
112
- const urlParts = splitPathSegments(normalized);
113
- for (const record of routeRecords) {
114
- if (record.fallbackPrefix) continue;
115
- const params = matchSegments(urlParts, record.segments);
116
- if (params !== null) return {
117
- record,
118
- params
119
- };
120
- }
121
- return findBestScopedFallbackRecord(normalized, routeRecords);
122
- }
123
- function computeMatchesFromRoutes(pathname, routesList) {
124
- const bestMatch = isRouteStoreRoutes(routesList) ? getMatchingRecord(pathname, getRouteRecords()) : findBestResolvedRouteFromRoutes(pathname, routesList);
125
- if (!bestMatch) return [];
126
- return [{
127
- path: "route" in bestMatch ? bestMatch.route.path : bestMatch.record.path,
128
- params: deepFreeze({ ...bestMatch.params }),
129
- name: "route" in bestMatch ? bestMatch.route.name : void 0,
130
- namespace: "route" in bestMatch ? bestMatch.route.namespace : bestMatch.record.options.namespace
131
- }];
132
- }
133
- function computeMatchesFromRouteRecords(pathname, routeRecords) {
134
- const bestMatch = getMatchingRecord(pathname, routeRecords);
135
- if (!bestMatch) return [];
136
- return [{
137
- path: bestMatch.record.path,
138
- params: deepFreeze({ ...bestMatch.params }),
139
- namespace: bestMatch.record.options.namespace
140
- }];
141
- }
142
- function computeRouteActivityMatches(pathname, options = {}) {
143
- if (options.manifest) return computeMatchesFromRouteRecords(pathname, options.manifest.records);
144
- if (options.routes) return computeMatchesFromRoutes(pathname, options.routes);
145
- return computeMatchesFromRoutes(pathname, getActiveRoutes());
146
- }
147
- function resolveRoute(pathname) {
148
- const normalized = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname;
149
- const urlParts = splitPathSegments(normalized);
150
- const records = getRouteRecords();
151
- for (const record of records) {
152
- if (record.fallbackPrefix) continue;
153
- const params = matchSegments(urlParts, record.segments);
154
- if (params !== null) return {
155
- handler: record.handler,
156
- params
157
- };
158
- }
159
- const fallbackMatch = findBestScopedFallbackRecord(normalized, records);
160
- return fallbackMatch ? {
161
- handler: fallbackMatch.record.handler,
162
- params: fallbackMatch.params
163
- } : null;
164
- }
165
9
  function getRoutePolicies(options) {
166
10
  if (!options) return [];
167
11
  if (options.policies?.length) return options.policies;
@@ -209,7 +53,7 @@ function continueRoutePolicies(policies, context, record, params, startIndex = 0
209
53
  return buildRenderResult(record, params, context.mode);
210
54
  }
211
55
  function resolveRouteRequest(target, options = {}) {
212
- const match = getMatchingRecord(target, options.manifest?.records ?? getRouteRecords());
56
+ const match = getMatchingRouteRecord(target, options.manifest?.records ?? getRouteRecords());
213
57
  if (!match) return null;
214
58
  const { record, params } = match;
215
59
  const policies = getRoutePolicies(record.options);
@@ -236,18 +80,7 @@ function resolveRouteRequest(target, options = {}) {
236
80
  if (isPromiseLike(authState)) return Promise.resolve(authState).then((next) => finalize(next));
237
81
  return finalize(authState);
238
82
  }
239
- function resolveRouteFromRoutes(pathname, routeList) {
240
- if (isRouteStoreRoutes(routeList)) return resolveRoute(pathname);
241
- const match = findBestResolvedRouteFromRoutes(pathname, routeList);
242
- return match ? {
243
- handler: match.route.handler,
244
- params: match.params
245
- } : null;
246
- }
247
- function _resolveRouteMatchFromRoutes(pathname, routeList) {
248
- return findBestResolvedRouteFromRoutes(pathname, routeList);
249
- }
250
83
  //#endregion
251
- export { _resolveRouteMatchFromRoutes, computeMatchesFromRouteRecords, computeMatchesFromRoutes, computeRouteActivityMatches, resolveRoute, resolveRouteFromRoutes, resolveRouteRequest };
84
+ export { computeMatchesFromRoutes, computeRouteActivityMatches, resolveRouteFromRoutes, resolveRouteRequest };
252
85
 
253
86
  //# sourceMappingURL=resolution.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolution.js","names":[],"sources":["../../src/router/resolution.ts"],"sourcesContent":["import type {\n Route,\n RouteContext,\n RouteHandler,\n RouteManifest,\n RouteMatch,\n RouteOptions,\n RoutePolicy,\n RouteRecord,\n RouteRenderResult,\n RouteRequestOptions,\n RouteRequestResult,\n ResolvedRoute,\n} from '../common/router';\nimport { isPromiseLike } from '../common/promise';\nimport { getActiveRenderContext } from '../common/render-context';\nimport {\n buildRouteContext,\n buildRouteContextBase,\n deepFreeze,\n parseLocation,\n} from './route-context';\nimport { compileNodePolicies } from './access';\nimport {\n computeRank,\n matchSegments,\n parseSegments,\n splitPathSegments,\n} from './match';\nimport type { InternalRoute, InternalRouteRecord } from './internal-types';\nimport { getRenderHandler } from './rendering';\nimport {\n getActiveRouteAuthOptions,\n getActiveRoutes,\n getRouteRecords,\n isRouteStoreRoutes,\n} from './store';\n\nconst routeSegsCache = new WeakMap<Route, ReturnType<typeof parseSegments>>();\nconst routeRankCache = new WeakMap<Route, number>();\nconst sortedListCache = new WeakMap<\n ReadonlyArray<Route>,\n ReadonlyArray<Route>\n>();\n\nfunction cachedSegs(route: Route): ReturnType<typeof parseSegments> {\n let segments = routeSegsCache.get(route);\n if (!segments) {\n segments = parseSegments(route.path);\n routeSegsCache.set(route, segments);\n }\n return segments;\n}\n\nfunction cachedRank(route: Route): number {\n let rank = routeRankCache.get(route);\n if (rank === undefined) {\n rank = computeRank(cachedSegs(route));\n routeRankCache.set(route, rank);\n }\n return rank;\n}\n\nfunction cachedSortedList(\n routeList: ReadonlyArray<Route>\n): ReadonlyArray<Route> {\n let sorted = sortedListCache.get(routeList);\n if (!sorted) {\n sorted = [...routeList].sort((a, b) => cachedRank(b) - cachedRank(a));\n sortedListCache.set(routeList, sorted);\n }\n return sorted;\n}\n\nfunction matchFallbackPrefix(\n pathname: string,\n fallbackPrefix: string\n): Record<string, string> | null {\n const normalizedPath =\n pathname.endsWith('/') && pathname !== '/'\n ? pathname.slice(0, -1)\n : pathname;\n const normalizedPrefix =\n fallbackPrefix.endsWith('/') && fallbackPrefix !== '/'\n ? fallbackPrefix.slice(0, -1)\n : fallbackPrefix;\n\n if (normalizedPrefix === '/') {\n const urlParts = splitPathSegments(normalizedPath);\n return {\n '*':\n urlParts.length === 0\n ? '/'\n : urlParts.length === 1\n ? urlParts[0]\n : '/' + urlParts.join('/'),\n };\n }\n\n if (\n normalizedPath !== normalizedPrefix &&\n !normalizedPath.startsWith(`${normalizedPrefix}/`)\n ) {\n return null;\n }\n\n const remainder =\n normalizedPath === normalizedPrefix\n ? '/'\n : normalizedPath.slice(normalizedPrefix.length);\n const remainderParts = splitPathSegments(remainder);\n\n return {\n '*':\n remainderParts.length === 0\n ? '/'\n : remainderParts.length === 1\n ? remainderParts[0]\n : '/' + remainderParts.join('/'),\n };\n}\n\nfunction findBestResolvedRouteFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): { route: Route; params: Record<string, string> } | null {\n const normalized =\n pathname.endsWith('/') && pathname !== '/'\n ? pathname.slice(0, -1)\n : pathname;\n const urlParts = splitPathSegments(normalized);\n\n const sorted = cachedSortedList(routeList);\n let bestRoute: Route | null = null;\n let bestParams: Record<string, string> = {};\n let bestRank = -Infinity;\n\n for (const route of sorted) {\n const internalRoute = route as InternalRoute;\n if (internalRoute.fallbackPrefix) {\n continue;\n }\n\n const rank = cachedRank(route);\n if (rank < bestRank) break;\n if (bestRoute !== null && rank === bestRank) continue;\n\n const params = matchSegments(urlParts, cachedSegs(route));\n if (params !== null) {\n bestRoute = route;\n bestParams = params;\n bestRank = rank;\n }\n }\n\n if (bestRoute !== null) {\n return { route: bestRoute, params: bestParams };\n }\n\n let bestFallback: InternalRoute | null = null;\n let bestFallbackParams: Record<string, string> | null = null;\n let bestPrefixLength = -1;\n\n for (const route of routeList) {\n const internalRoute = route as InternalRoute;\n if (!internalRoute.fallbackPrefix) {\n continue;\n }\n\n const params = matchFallbackPrefix(\n normalized,\n internalRoute.fallbackPrefix\n );\n if (params === null) {\n continue;\n }\n\n if (internalRoute.fallbackPrefix.length > bestPrefixLength) {\n bestFallback = internalRoute;\n bestFallbackParams = params;\n bestPrefixLength = internalRoute.fallbackPrefix.length;\n }\n }\n\n return bestFallback && bestFallbackParams\n ? { route: bestFallback, params: bestFallbackParams }\n : null;\n}\n\nfunction findBestScopedFallbackRecord(\n pathname: string,\n routeRecords: readonly RouteRecord[]\n): { record: InternalRouteRecord; params: Record<string, string> } | null {\n let bestRecord: InternalRouteRecord | null = null;\n let bestParams: Record<string, string> | null = null;\n let bestPrefixLength = -1;\n\n for (const routeRecord of routeRecords) {\n const record = routeRecord as InternalRouteRecord;\n if (!record.fallbackPrefix) {\n continue;\n }\n\n const params = matchFallbackPrefix(pathname, record.fallbackPrefix);\n if (params === null) {\n continue;\n }\n\n if (record.fallbackPrefix.length > bestPrefixLength) {\n bestRecord = record;\n bestParams = params;\n bestPrefixLength = record.fallbackPrefix.length;\n }\n }\n\n return bestRecord && bestParams\n ? { record: bestRecord, params: bestParams }\n : null;\n}\n\nfunction getMatchingRecord(\n target: string,\n routeRecords: readonly RouteRecord[]\n): { record: RouteRecord; params: Record<string, string> } | null {\n const location = parseLocation(target);\n const normalized =\n location.pathname.endsWith('/') && location.pathname !== '/'\n ? location.pathname.slice(0, -1)\n : location.pathname;\n const urlParts = splitPathSegments(normalized);\n\n for (const record of routeRecords) {\n const internalRecord = record as InternalRouteRecord;\n if (internalRecord.fallbackPrefix) {\n continue;\n }\n\n const params = matchSegments(urlParts, record.segments);\n if (params !== null) {\n return { record, params };\n }\n }\n\n return findBestScopedFallbackRecord(normalized, routeRecords);\n}\n\nexport function computeMatchesFromRoutes(\n pathname: string,\n routesList: readonly Route[]\n): RouteMatch[] {\n const bestMatch = isRouteStoreRoutes(routesList)\n ? getMatchingRecord(pathname, getRouteRecords())\n : findBestResolvedRouteFromRoutes(pathname, routesList);\n\n if (!bestMatch) {\n return [];\n }\n\n return [\n {\n path: 'route' in bestMatch ? bestMatch.route.path : bestMatch.record.path,\n params: deepFreeze({ ...bestMatch.params }),\n name:\n 'route' in bestMatch\n ? (bestMatch.route as { name?: string }).name\n : undefined,\n namespace:\n 'route' in bestMatch\n ? bestMatch.route.namespace\n : bestMatch.record.options.namespace,\n },\n ];\n}\n\nexport function computeMatchesFromRouteRecords(\n pathname: string,\n routeRecords: readonly RouteRecord[]\n): RouteMatch[] {\n const bestMatch = getMatchingRecord(pathname, routeRecords);\n\n if (!bestMatch) {\n return [];\n }\n\n return [\n {\n path: bestMatch.record.path,\n params: deepFreeze({ ...bestMatch.params }),\n namespace: bestMatch.record.options.namespace,\n },\n ];\n}\n\nexport function computeRouteActivityMatches(\n pathname: string,\n options: {\n manifest?: RouteManifest;\n routes?: readonly Route[];\n } = {}\n): RouteMatch[] {\n if (options.manifest) {\n return computeMatchesFromRouteRecords(pathname, options.manifest.records);\n }\n\n if (options.routes) {\n return computeMatchesFromRoutes(pathname, options.routes);\n }\n\n return computeMatchesFromRoutes(pathname, getActiveRoutes());\n}\n\nexport function resolveRoute(pathname: string): ResolvedRoute | null {\n const normalized =\n pathname.endsWith('/') && pathname !== '/'\n ? pathname.slice(0, -1)\n : pathname;\n const urlParts = splitPathSegments(normalized);\n const records = getRouteRecords();\n\n for (const record of records) {\n if (record.fallbackPrefix) {\n continue;\n }\n\n const params = matchSegments(urlParts, record.segments);\n if (params !== null) {\n return { handler: record.handler, params };\n }\n }\n\n const fallbackMatch = findBestScopedFallbackRecord(normalized, records);\n return fallbackMatch\n ? { handler: fallbackMatch.record.handler, params: fallbackMatch.params }\n : null;\n}\n\nfunction getRoutePolicies(\n options: RouteOptions | undefined\n): readonly RoutePolicy[] {\n if (!options) {\n return [];\n }\n\n if (options.policies?.length) {\n return options.policies;\n }\n\n return compileNodePolicies(options);\n}\n\nfunction getDefaultRouteMode(): RouteContext['mode'] {\n if (typeof window !== 'undefined') {\n return 'spa';\n }\n\n return 'ssr';\n}\n\nfunction createRenderDataAwareHandler(\n handler: RouteHandler,\n data: unknown\n): RouteHandler {\n return (params, context) => {\n const renderContext = getActiveRenderContext();\n if (renderContext) {\n renderContext.renderData = (data ?? null) as Record<\n string,\n unknown\n > | null;\n }\n\n return handler(params, context);\n };\n}\n\nfunction buildRenderResult(\n record: RouteRecord,\n params: Record<string, string>,\n mode: RouteContext['mode']\n): RouteRequestResult | Promise<RouteRequestResult> {\n const renderHandler = getRenderHandler(record);\n const loader = mode === 'ssr' ? record.options?.loader : undefined;\n if (loader) {\n const loaded = loader({ params });\n const finalize = (data: unknown): RouteRenderResult => ({\n kind: 'render',\n handler: createRenderDataAwareHandler(renderHandler, data),\n params,\n });\n\n if (isPromiseLike(loaded)) {\n return Promise.resolve(loaded).then((data) => finalize(data));\n }\n\n return finalize(loaded);\n }\n\n return {\n kind: 'render',\n handler: renderHandler,\n params,\n };\n}\n\nfunction continueRoutePolicies(\n policies: readonly RoutePolicy[],\n context: RouteContext,\n record: RouteRecord,\n params: Record<string, string>,\n startIndex = 0\n): RouteRequestResult | Promise<RouteRequestResult> {\n for (let index = startIndex; index < policies.length; index += 1) {\n const policyResult = policies[index](context);\n\n if (isPromiseLike(policyResult)) {\n return Promise.resolve(policyResult).then((next) => {\n if (next.kind !== 'allow') {\n return next;\n }\n\n return continueRoutePolicies(\n policies,\n context,\n record,\n params,\n index + 1\n );\n });\n }\n\n if (policyResult.kind !== 'allow') {\n return policyResult;\n }\n }\n\n return buildRenderResult(record, params, context.mode);\n}\n\nexport function resolveRouteRequest(\n target: string,\n options: RouteRequestOptions = {}\n): RouteRequestResult | Promise<RouteRequestResult> {\n const routeRecords = options.manifest?.records ?? getRouteRecords();\n const match = getMatchingRecord(target, routeRecords);\n\n if (!match) {\n return null;\n }\n\n const { record, params } = match;\n const policies = getRoutePolicies(record.options);\n const mode = options.mode ?? getDefaultRouteMode();\n\n if (policies.length === 0) {\n return buildRenderResult(record, params, mode);\n }\n\n const signal =\n options.signal ??\n getActiveRenderContext()?.signal ??\n new AbortController().signal;\n const auth = getActiveRouteAuthOptions(\n options.auth ?? options.manifest?.auth\n );\n const baseContext = buildRouteContextBase(target, params, {\n mode,\n signal,\n });\n\n const finalize = (authState: { session: unknown; user: unknown }) =>\n continueRoutePolicies(\n policies,\n buildRouteContext(target, params, {\n mode,\n signal,\n auth,\n session: authState.session,\n user: authState.user,\n }),\n record,\n params\n );\n\n if (!auth?.resolve) {\n return finalize({ session: null, user: null });\n }\n\n const authState = auth.resolve(baseContext);\n if (isPromiseLike(authState)) {\n return Promise.resolve(authState).then((next) => finalize(next));\n }\n\n return finalize(authState);\n}\n\nexport function resolveRouteFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): ResolvedRoute | null {\n if (isRouteStoreRoutes(routeList)) return resolveRoute(pathname);\n\n const match = findBestResolvedRouteFromRoutes(pathname, routeList);\n return match ? { handler: match.route.handler, params: match.params } : null;\n}\n\nexport function _resolveRouteMatchFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): { route: Route; params: Record<string, string> } | null {\n return findBestResolvedRouteFromRoutes(pathname, routeList);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolution.js","names":[],"sources":["../../src/router/resolution.ts"],"sourcesContent":["import type {\n RouteContext,\n RouteHandler,\n RouteOptions,\n RoutePolicy,\n RouteRecord,\n RouteRenderResult,\n RouteRequestOptions,\n RouteRequestResult,\n} from '../common/router';\nimport { isPromiseLike } from '../common/promise';\nimport { getActiveRenderContext } from '../common/render-context';\nimport { buildRouteContext, buildRouteContextBase } from './route-context';\nimport { compileNodePolicies } from './access';\nimport { getRenderHandler } from './rendering';\nimport { getMatchingRouteRecord } from './route-matching';\nimport { getActiveRouteAuthOptions, getRouteRecords } from './store';\n\nexport {\n _resolveRouteMatchFromRoutes,\n computeMatchesFromRouteRecords,\n computeMatchesFromRoutes,\n computeRouteActivityMatches,\n resolveRoute,\n resolveRouteFromRoutes,\n} from './route-matching';\n\nfunction getRoutePolicies(\n options: RouteOptions | undefined\n): readonly RoutePolicy[] {\n if (!options) {\n return [];\n }\n\n if (options.policies?.length) {\n return options.policies;\n }\n\n return compileNodePolicies(options);\n}\n\nfunction getDefaultRouteMode(): RouteContext['mode'] {\n if (typeof window !== 'undefined') {\n return 'spa';\n }\n\n return 'ssr';\n}\n\nfunction createRenderDataAwareHandler(\n handler: RouteHandler,\n data: unknown\n): RouteHandler {\n return (params, context) => {\n const renderContext = getActiveRenderContext();\n if (renderContext) {\n renderContext.renderData = (data ?? null) as Record<\n string,\n unknown\n > | null;\n }\n\n return handler(params, context);\n };\n}\n\nfunction buildRenderResult(\n record: RouteRecord,\n params: Record<string, string>,\n mode: RouteContext['mode']\n): RouteRequestResult | Promise<RouteRequestResult> {\n const renderHandler = getRenderHandler(record);\n const loader = mode === 'ssr' ? record.options?.loader : undefined;\n if (loader) {\n const loaded = loader({ params });\n const finalize = (data: unknown): RouteRenderResult => ({\n kind: 'render',\n handler: createRenderDataAwareHandler(renderHandler, data),\n params,\n });\n\n if (isPromiseLike(loaded)) {\n return Promise.resolve(loaded).then((data) => finalize(data));\n }\n\n return finalize(loaded);\n }\n\n return {\n kind: 'render',\n handler: renderHandler,\n params,\n };\n}\n\nfunction continueRoutePolicies(\n policies: readonly RoutePolicy[],\n context: RouteContext,\n record: RouteRecord,\n params: Record<string, string>,\n startIndex = 0\n): RouteRequestResult | Promise<RouteRequestResult> {\n for (let index = startIndex; index < policies.length; index += 1) {\n const policyResult = policies[index](context);\n\n if (isPromiseLike(policyResult)) {\n return Promise.resolve(policyResult).then((next) => {\n if (next.kind !== 'allow') {\n return next;\n }\n\n return continueRoutePolicies(\n policies,\n context,\n record,\n params,\n index + 1\n );\n });\n }\n\n if (policyResult.kind !== 'allow') {\n return policyResult;\n }\n }\n\n return buildRenderResult(record, params, context.mode);\n}\n\nexport function resolveRouteRequest(\n target: string,\n options: RouteRequestOptions = {}\n): RouteRequestResult | Promise<RouteRequestResult> {\n const routeRecords = options.manifest?.records ?? getRouteRecords();\n const match = getMatchingRouteRecord(target, routeRecords);\n\n if (!match) {\n return null;\n }\n\n const { record, params } = match;\n const policies = getRoutePolicies(record.options);\n const mode = options.mode ?? getDefaultRouteMode();\n\n if (policies.length === 0) {\n return buildRenderResult(record, params, mode);\n }\n\n const signal =\n options.signal ??\n getActiveRenderContext()?.signal ??\n new AbortController().signal;\n const auth = getActiveRouteAuthOptions(\n options.auth ?? options.manifest?.auth\n );\n const baseContext = buildRouteContextBase(target, params, {\n mode,\n signal,\n });\n\n const finalize = (authState: { session: unknown; user: unknown }) =>\n continueRoutePolicies(\n policies,\n buildRouteContext(target, params, {\n mode,\n signal,\n auth,\n session: authState.session,\n user: authState.user,\n }),\n record,\n params\n );\n\n if (!auth?.resolve) {\n return finalize({ session: null, user: null });\n }\n\n const authState = auth.resolve(baseContext);\n if (isPromiseLike(authState)) {\n return Promise.resolve(authState).then((next) => finalize(next));\n }\n\n return finalize(authState);\n}\n"],"mappings":";;;;;;;;AA2BA,SAAS,iBACP,SACwB;CACxB,IAAI,CAAC,SACH,OAAO,CAAC;CAGV,IAAI,QAAQ,UAAU,QACpB,OAAO,QAAQ;CAGjB,OAAO,oBAAoB,OAAO;AACpC;AAEA,SAAS,sBAA4C;CACnD,IAAI,OAAO,WAAW,aACpB,OAAO;CAGT,OAAO;AACT;AAEA,SAAS,6BACP,SACA,MACc;CACd,QAAQ,QAAQ,YAAY;EAC1B,MAAM,gBAAgB,uBAAuB;EAC7C,IAAI,eACF,cAAc,aAAc,QAAQ;EAMtC,OAAO,QAAQ,QAAQ,OAAO;CAChC;AACF;AAEA,SAAS,kBACP,QACA,QACA,MACkD;CAClD,MAAM,gBAAgB,iBAAiB,MAAM;CAC7C,MAAM,SAAS,SAAS,QAAQ,OAAO,SAAS,SAAS;CACzD,IAAI,QAAQ;EACV,MAAM,SAAS,OAAO,EAAE,OAAO,CAAC;EAChC,MAAM,YAAY,UAAsC;GACtD,MAAM;GACN,SAAS,6BAA6B,eAAe,IAAI;GACzD;EACF;EAEA,IAAI,cAAc,MAAM,GACtB,OAAO,QAAQ,QAAQ,MAAM,CAAC,CAAC,MAAM,SAAS,SAAS,IAAI,CAAC;EAG9D,OAAO,SAAS,MAAM;CACxB;CAEA,OAAO;EACL,MAAM;EACN,SAAS;EACT;CACF;AACF;AAEA,SAAS,sBACP,UACA,SACA,QACA,QACA,aAAa,GACqC;CAClD,KAAK,IAAI,QAAQ,YAAY,QAAQ,SAAS,QAAQ,SAAS,GAAG;EAChE,MAAM,eAAe,SAAS,MAAM,CAAC,OAAO;EAE5C,IAAI,cAAc,YAAY,GAC5B,OAAO,QAAQ,QAAQ,YAAY,CAAC,CAAC,MAAM,SAAS;GAClD,IAAI,KAAK,SAAS,SAChB,OAAO;GAGT,OAAO,sBACL,UACA,SACA,QACA,QACA,QAAQ,CACV;EACF,CAAC;EAGH,IAAI,aAAa,SAAS,SACxB,OAAO;CAEX;CAEA,OAAO,kBAAkB,QAAQ,QAAQ,QAAQ,IAAI;AACvD;AAEA,SAAgB,oBACd,QACA,UAA+B,CAAC,GACkB;CAElD,MAAM,QAAQ,uBAAuB,QADhB,QAAQ,UAAU,WAAW,gBAAgB,CACT;CAEzD,IAAI,CAAC,OACH,OAAO;CAGT,MAAM,EAAE,QAAQ,WAAW;CAC3B,MAAM,WAAW,iBAAiB,OAAO,OAAO;CAChD,MAAM,OAAO,QAAQ,QAAQ,oBAAoB;CAEjD,IAAI,SAAS,WAAW,GACtB,OAAO,kBAAkB,QAAQ,QAAQ,IAAI;CAG/C,MAAM,SACJ,QAAQ,UACR,uBAAuB,CAAC,EAAE,UAC1B,IAAI,gBAAgB,CAAC,CAAC;CACxB,MAAM,OAAO,0BACX,QAAQ,QAAQ,QAAQ,UAAU,IACpC;CACA,MAAM,cAAc,sBAAsB,QAAQ,QAAQ;EACxD;EACA;CACF,CAAC;CAED,MAAM,YAAY,cAChB,sBACE,UACA,kBAAkB,QAAQ,QAAQ;EAChC;EACA;EACA;EACA,SAAS,UAAU;EACnB,MAAM,UAAU;CAClB,CAAC,GACD,QACA,MACF;CAEF,IAAI,CAAC,MAAM,SACT,OAAO,SAAS;EAAE,SAAS;EAAM,MAAM;CAAK,CAAC;CAG/C,MAAM,YAAY,KAAK,QAAQ,WAAW;CAC1C,IAAI,cAAc,SAAS,GACzB,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,MAAM,SAAS,SAAS,IAAI,CAAC;CAGjE,OAAO,SAAS,SAAS;AAC3B"}
@@ -0,0 +1,20 @@
1
+ import { ResolvedRoute, Route, RouteManifest, RouteMatch, RouteRecord } from "../common/router.js";
2
+
3
+ //#region src/router/route-matching.d.ts
4
+ declare function getMatchingRouteRecord(target: string, routeRecords: readonly RouteRecord[]): {
5
+ record: RouteRecord;
6
+ params: Record<string, string>;
7
+ } | null;
8
+ declare function computeMatchesFromRoutes(pathname: string, routesList: readonly Route[]): RouteMatch[];
9
+ declare function computeMatchesFromRouteRecords(pathname: string, routeRecords: readonly RouteRecord[]): RouteMatch[];
10
+ declare function computeRouteActivityMatches(pathname: string, options?: {
11
+ manifest?: RouteManifest;
12
+ routes?: readonly Route[];
13
+ }): RouteMatch[];
14
+ declare function resolveRoute(pathname: string): ResolvedRoute | null;
15
+ declare function resolveRouteFromRoutes(pathname: string, routeList: readonly Route[]): ResolvedRoute | null;
16
+ declare function _resolveRouteMatchFromRoutes(pathname: string, routeList: readonly Route[]): {
17
+ route: Route;
18
+ params: Record<string, string>;
19
+ } | null;
20
+ //# sourceMappingURL=route-matching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-matching.d.ts","names":[],"sources":["../../src/router/route-matching.ts"],"mappings":";;;iBAuMgB,sBAAA,CACd,MAAA,UACA,YAAA,WAAuB,WAAA;EACpB,MAAA,EAAQ,WAAA;EAAa,MAAA,EAAQ,MAAA;AAAA;AAAA,iBAuBlB,wBAAA,CACd,QAAA,UACA,UAAA,WAAqB,KAAA,KACpB,UAAU;AAAA,iBAyBG,8BAAA,CACd,QAAA,UACA,YAAA,WAAuB,WAAA,KACtB,UAAU;AAAA,iBAgBG,2BAAA,CACd,QAAA,UACA,OAAA;EACE,QAAA,GAAW,aAAA;EACX,MAAA,YAAkB,KAAA;AAAA,IAEnB,UAAA;AAAA,iBAYa,YAAA,CAAa,QAAA,WAAmB,aAAa;AAAA,iBAyB7C,sBAAA,CACd,QAAA,UACA,SAAA,WAAoB,KAAA,KACnB,aAAa;AAAA,iBAOA,4BAAA,CACd,QAAA,UACA,SAAA,WAAoB,KAAA;EACjB,KAAA,EAAO,KAAA;EAAO,MAAA,EAAQ,MAAA;AAAA"}
@@ -0,0 +1,175 @@
1
+ import { computeRank, matchSegments, parseSegments, splitPathSegments } from "./match.js";
2
+ import { getActiveRoutes, getRouteRecords, isRouteStoreRoutes } from "./store.js";
3
+ import { deepFreeze, parseLocation } from "./route-context.js";
4
+ //#region src/router/route-matching.ts
5
+ const routeSegsCache = /* @__PURE__ */ new WeakMap();
6
+ const routeRankCache = /* @__PURE__ */ new WeakMap();
7
+ const sortedListCache = /* @__PURE__ */ new WeakMap();
8
+ function cachedSegs(route) {
9
+ let segments = routeSegsCache.get(route);
10
+ if (!segments) {
11
+ segments = parseSegments(route.path);
12
+ routeSegsCache.set(route, segments);
13
+ }
14
+ return segments;
15
+ }
16
+ function cachedRank(route) {
17
+ let rank = routeRankCache.get(route);
18
+ if (rank === void 0) {
19
+ rank = computeRank(cachedSegs(route));
20
+ routeRankCache.set(route, rank);
21
+ }
22
+ return rank;
23
+ }
24
+ function cachedSortedList(routeList) {
25
+ let sorted = sortedListCache.get(routeList);
26
+ if (!sorted) {
27
+ sorted = [...routeList].sort((a, b) => cachedRank(b) - cachedRank(a));
28
+ sortedListCache.set(routeList, sorted);
29
+ }
30
+ return sorted;
31
+ }
32
+ function matchFallbackPrefix(pathname, fallbackPrefix) {
33
+ const normalizedPath = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname;
34
+ const normalizedPrefix = fallbackPrefix.endsWith("/") && fallbackPrefix !== "/" ? fallbackPrefix.slice(0, -1) : fallbackPrefix;
35
+ if (normalizedPrefix === "/") {
36
+ const urlParts = splitPathSegments(normalizedPath);
37
+ return { "*": urlParts.length === 0 ? "/" : urlParts.length === 1 ? urlParts[0] : "/" + urlParts.join("/") };
38
+ }
39
+ if (normalizedPath !== normalizedPrefix && !normalizedPath.startsWith(`${normalizedPrefix}/`)) return null;
40
+ const remainderParts = splitPathSegments(normalizedPath === normalizedPrefix ? "/" : normalizedPath.slice(normalizedPrefix.length));
41
+ return { "*": remainderParts.length === 0 ? "/" : remainderParts.length === 1 ? remainderParts[0] : "/" + remainderParts.join("/") };
42
+ }
43
+ function findBestResolvedRouteFromRoutes(pathname, routeList) {
44
+ const normalized = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname;
45
+ const urlParts = splitPathSegments(normalized);
46
+ const sorted = cachedSortedList(routeList);
47
+ let bestRoute = null;
48
+ let bestParams = {};
49
+ let bestRank = -Infinity;
50
+ for (const route of sorted) {
51
+ if (route.fallbackPrefix) continue;
52
+ const rank = cachedRank(route);
53
+ if (rank < bestRank) break;
54
+ if (bestRoute !== null && rank === bestRank) continue;
55
+ const params = matchSegments(urlParts, cachedSegs(route));
56
+ if (params !== null) {
57
+ bestRoute = route;
58
+ bestParams = params;
59
+ bestRank = rank;
60
+ }
61
+ }
62
+ if (bestRoute !== null) return {
63
+ route: bestRoute,
64
+ params: bestParams
65
+ };
66
+ let bestFallback = null;
67
+ let bestFallbackParams = null;
68
+ let bestPrefixLength = -1;
69
+ for (const route of routeList) {
70
+ const internalRoute = route;
71
+ if (!internalRoute.fallbackPrefix) continue;
72
+ const params = matchFallbackPrefix(normalized, internalRoute.fallbackPrefix);
73
+ if (params === null) continue;
74
+ if (internalRoute.fallbackPrefix.length > bestPrefixLength) {
75
+ bestFallback = internalRoute;
76
+ bestFallbackParams = params;
77
+ bestPrefixLength = internalRoute.fallbackPrefix.length;
78
+ }
79
+ }
80
+ return bestFallback && bestFallbackParams ? {
81
+ route: bestFallback,
82
+ params: bestFallbackParams
83
+ } : null;
84
+ }
85
+ function findBestScopedFallbackRecord(pathname, routeRecords) {
86
+ let bestRecord = null;
87
+ let bestParams = null;
88
+ let bestPrefixLength = -1;
89
+ for (const routeRecord of routeRecords) {
90
+ const record = routeRecord;
91
+ if (!record.fallbackPrefix) continue;
92
+ const params = matchFallbackPrefix(pathname, record.fallbackPrefix);
93
+ if (params === null) continue;
94
+ if (record.fallbackPrefix.length > bestPrefixLength) {
95
+ bestRecord = record;
96
+ bestParams = params;
97
+ bestPrefixLength = record.fallbackPrefix.length;
98
+ }
99
+ }
100
+ return bestRecord && bestParams ? {
101
+ record: bestRecord,
102
+ params: bestParams
103
+ } : null;
104
+ }
105
+ function getMatchingRouteRecord(target, routeRecords) {
106
+ const location = parseLocation(target);
107
+ const normalized = location.pathname.endsWith("/") && location.pathname !== "/" ? location.pathname.slice(0, -1) : location.pathname;
108
+ const urlParts = splitPathSegments(normalized);
109
+ for (const record of routeRecords) {
110
+ if (record.fallbackPrefix) continue;
111
+ const params = matchSegments(urlParts, record.segments);
112
+ if (params !== null) return {
113
+ record,
114
+ params
115
+ };
116
+ }
117
+ return findBestScopedFallbackRecord(normalized, routeRecords);
118
+ }
119
+ function computeMatchesFromRoutes(pathname, routesList) {
120
+ const bestMatch = isRouteStoreRoutes(routesList) ? getMatchingRouteRecord(pathname, getRouteRecords()) : findBestResolvedRouteFromRoutes(pathname, routesList);
121
+ if (!bestMatch) return [];
122
+ return [{
123
+ path: "route" in bestMatch ? bestMatch.route.path : bestMatch.record.path,
124
+ params: deepFreeze({ ...bestMatch.params }),
125
+ name: "route" in bestMatch ? bestMatch.route.name : void 0,
126
+ namespace: "route" in bestMatch ? bestMatch.route.namespace : bestMatch.record.options.namespace
127
+ }];
128
+ }
129
+ function computeMatchesFromRouteRecords(pathname, routeRecords) {
130
+ const bestMatch = getMatchingRouteRecord(pathname, routeRecords);
131
+ if (!bestMatch) return [];
132
+ return [{
133
+ path: bestMatch.record.path,
134
+ params: deepFreeze({ ...bestMatch.params }),
135
+ namespace: bestMatch.record.options.namespace
136
+ }];
137
+ }
138
+ function computeRouteActivityMatches(pathname, options = {}) {
139
+ if (options.manifest) return computeMatchesFromRouteRecords(pathname, options.manifest.records);
140
+ if (options.routes) return computeMatchesFromRoutes(pathname, options.routes);
141
+ return computeMatchesFromRoutes(pathname, getActiveRoutes());
142
+ }
143
+ function resolveRoute(pathname) {
144
+ const normalized = pathname.endsWith("/") && pathname !== "/" ? pathname.slice(0, -1) : pathname;
145
+ const urlParts = splitPathSegments(normalized);
146
+ const records = getRouteRecords();
147
+ for (const record of records) {
148
+ if (record.fallbackPrefix) continue;
149
+ const params = matchSegments(urlParts, record.segments);
150
+ if (params !== null) return {
151
+ handler: record.handler,
152
+ params
153
+ };
154
+ }
155
+ const fallbackMatch = findBestScopedFallbackRecord(normalized, records);
156
+ return fallbackMatch ? {
157
+ handler: fallbackMatch.record.handler,
158
+ params: fallbackMatch.params
159
+ } : null;
160
+ }
161
+ function resolveRouteFromRoutes(pathname, routeList) {
162
+ if (isRouteStoreRoutes(routeList)) return resolveRoute(pathname);
163
+ const match = findBestResolvedRouteFromRoutes(pathname, routeList);
164
+ return match ? {
165
+ handler: match.route.handler,
166
+ params: match.params
167
+ } : null;
168
+ }
169
+ function _resolveRouteMatchFromRoutes(pathname, routeList) {
170
+ return findBestResolvedRouteFromRoutes(pathname, routeList);
171
+ }
172
+ //#endregion
173
+ export { _resolveRouteMatchFromRoutes, computeMatchesFromRouteRecords, computeMatchesFromRoutes, computeRouteActivityMatches, getMatchingRouteRecord, resolveRoute, resolveRouteFromRoutes };
174
+
175
+ //# sourceMappingURL=route-matching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-matching.js","names":[],"sources":["../../src/router/route-matching.ts"],"sourcesContent":["import type {\n Route,\n RouteManifest,\n RouteMatch,\n RouteRecord,\n ResolvedRoute,\n} from '../common/router';\nimport { deepFreeze, parseLocation } from './route-context';\nimport {\n computeRank,\n matchSegments,\n parseSegments,\n splitPathSegments,\n} from './match';\nimport type { InternalRoute, InternalRouteRecord } from './internal-types';\nimport { getActiveRoutes, getRouteRecords, isRouteStoreRoutes } from './store';\n\nconst routeSegsCache = new WeakMap<Route, ReturnType<typeof parseSegments>>();\nconst routeRankCache = new WeakMap<Route, number>();\nconst sortedListCache = new WeakMap<\n ReadonlyArray<Route>,\n ReadonlyArray<Route>\n>();\n\nfunction cachedSegs(route: Route): ReturnType<typeof parseSegments> {\n let segments = routeSegsCache.get(route);\n if (!segments) {\n segments = parseSegments(route.path);\n routeSegsCache.set(route, segments);\n }\n return segments;\n}\n\nfunction cachedRank(route: Route): number {\n let rank = routeRankCache.get(route);\n if (rank === undefined) {\n rank = computeRank(cachedSegs(route));\n routeRankCache.set(route, rank);\n }\n return rank;\n}\n\nfunction cachedSortedList(\n routeList: ReadonlyArray<Route>\n): ReadonlyArray<Route> {\n let sorted = sortedListCache.get(routeList);\n if (!sorted) {\n sorted = [...routeList].sort((a, b) => cachedRank(b) - cachedRank(a));\n sortedListCache.set(routeList, sorted);\n }\n return sorted;\n}\n\nfunction matchFallbackPrefix(\n pathname: string,\n fallbackPrefix: string\n): Record<string, string> | null {\n const normalizedPath =\n pathname.endsWith('/') && pathname !== '/'\n ? pathname.slice(0, -1)\n : pathname;\n const normalizedPrefix =\n fallbackPrefix.endsWith('/') && fallbackPrefix !== '/'\n ? fallbackPrefix.slice(0, -1)\n : fallbackPrefix;\n\n if (normalizedPrefix === '/') {\n const urlParts = splitPathSegments(normalizedPath);\n return {\n '*':\n urlParts.length === 0\n ? '/'\n : urlParts.length === 1\n ? urlParts[0]\n : '/' + urlParts.join('/'),\n };\n }\n\n if (\n normalizedPath !== normalizedPrefix &&\n !normalizedPath.startsWith(`${normalizedPrefix}/`)\n ) {\n return null;\n }\n\n const remainder =\n normalizedPath === normalizedPrefix\n ? '/'\n : normalizedPath.slice(normalizedPrefix.length);\n const remainderParts = splitPathSegments(remainder);\n\n return {\n '*':\n remainderParts.length === 0\n ? '/'\n : remainderParts.length === 1\n ? remainderParts[0]\n : '/' + remainderParts.join('/'),\n };\n}\n\nfunction findBestResolvedRouteFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): { route: Route; params: Record<string, string> } | null {\n const normalized =\n pathname.endsWith('/') && pathname !== '/'\n ? pathname.slice(0, -1)\n : pathname;\n const urlParts = splitPathSegments(normalized);\n\n const sorted = cachedSortedList(routeList);\n let bestRoute: Route | null = null;\n let bestParams: Record<string, string> = {};\n let bestRank = -Infinity;\n\n for (const route of sorted) {\n const internalRoute = route as InternalRoute;\n if (internalRoute.fallbackPrefix) {\n continue;\n }\n\n const rank = cachedRank(route);\n if (rank < bestRank) break;\n if (bestRoute !== null && rank === bestRank) continue;\n\n const params = matchSegments(urlParts, cachedSegs(route));\n if (params !== null) {\n bestRoute = route;\n bestParams = params;\n bestRank = rank;\n }\n }\n\n if (bestRoute !== null) {\n return { route: bestRoute, params: bestParams };\n }\n\n let bestFallback: InternalRoute | null = null;\n let bestFallbackParams: Record<string, string> | null = null;\n let bestPrefixLength = -1;\n\n for (const route of routeList) {\n const internalRoute = route as InternalRoute;\n if (!internalRoute.fallbackPrefix) {\n continue;\n }\n\n const params = matchFallbackPrefix(\n normalized,\n internalRoute.fallbackPrefix\n );\n if (params === null) {\n continue;\n }\n\n if (internalRoute.fallbackPrefix.length > bestPrefixLength) {\n bestFallback = internalRoute;\n bestFallbackParams = params;\n bestPrefixLength = internalRoute.fallbackPrefix.length;\n }\n }\n\n return bestFallback && bestFallbackParams\n ? { route: bestFallback, params: bestFallbackParams }\n : null;\n}\n\nfunction findBestScopedFallbackRecord(\n pathname: string,\n routeRecords: readonly RouteRecord[]\n): { record: InternalRouteRecord; params: Record<string, string> } | null {\n let bestRecord: InternalRouteRecord | null = null;\n let bestParams: Record<string, string> | null = null;\n let bestPrefixLength = -1;\n\n for (const routeRecord of routeRecords) {\n const record = routeRecord as InternalRouteRecord;\n if (!record.fallbackPrefix) {\n continue;\n }\n\n const params = matchFallbackPrefix(pathname, record.fallbackPrefix);\n if (params === null) {\n continue;\n }\n\n if (record.fallbackPrefix.length > bestPrefixLength) {\n bestRecord = record;\n bestParams = params;\n bestPrefixLength = record.fallbackPrefix.length;\n }\n }\n\n return bestRecord && bestParams\n ? { record: bestRecord, params: bestParams }\n : null;\n}\n\nexport function getMatchingRouteRecord(\n target: string,\n routeRecords: readonly RouteRecord[]\n): { record: RouteRecord; params: Record<string, string> } | null {\n const location = parseLocation(target);\n const normalized =\n location.pathname.endsWith('/') && location.pathname !== '/'\n ? location.pathname.slice(0, -1)\n : location.pathname;\n const urlParts = splitPathSegments(normalized);\n\n for (const record of routeRecords) {\n const internalRecord = record as InternalRouteRecord;\n if (internalRecord.fallbackPrefix) {\n continue;\n }\n\n const params = matchSegments(urlParts, record.segments);\n if (params !== null) {\n return { record, params };\n }\n }\n\n return findBestScopedFallbackRecord(normalized, routeRecords);\n}\n\nexport function computeMatchesFromRoutes(\n pathname: string,\n routesList: readonly Route[]\n): RouteMatch[] {\n const bestMatch = isRouteStoreRoutes(routesList)\n ? getMatchingRouteRecord(pathname, getRouteRecords())\n : findBestResolvedRouteFromRoutes(pathname, routesList);\n\n if (!bestMatch) {\n return [];\n }\n\n return [\n {\n path: 'route' in bestMatch ? bestMatch.route.path : bestMatch.record.path,\n params: deepFreeze({ ...bestMatch.params }),\n name:\n 'route' in bestMatch\n ? (bestMatch.route as { name?: string }).name\n : undefined,\n namespace:\n 'route' in bestMatch\n ? bestMatch.route.namespace\n : bestMatch.record.options.namespace,\n },\n ];\n}\n\nexport function computeMatchesFromRouteRecords(\n pathname: string,\n routeRecords: readonly RouteRecord[]\n): RouteMatch[] {\n const bestMatch = getMatchingRouteRecord(pathname, routeRecords);\n\n if (!bestMatch) {\n return [];\n }\n\n return [\n {\n path: bestMatch.record.path,\n params: deepFreeze({ ...bestMatch.params }),\n namespace: bestMatch.record.options.namespace,\n },\n ];\n}\n\nexport function computeRouteActivityMatches(\n pathname: string,\n options: {\n manifest?: RouteManifest;\n routes?: readonly Route[];\n } = {}\n): RouteMatch[] {\n if (options.manifest) {\n return computeMatchesFromRouteRecords(pathname, options.manifest.records);\n }\n\n if (options.routes) {\n return computeMatchesFromRoutes(pathname, options.routes);\n }\n\n return computeMatchesFromRoutes(pathname, getActiveRoutes());\n}\n\nexport function resolveRoute(pathname: string): ResolvedRoute | null {\n const normalized =\n pathname.endsWith('/') && pathname !== '/'\n ? pathname.slice(0, -1)\n : pathname;\n const urlParts = splitPathSegments(normalized);\n const records = getRouteRecords();\n\n for (const record of records) {\n if (record.fallbackPrefix) {\n continue;\n }\n\n const params = matchSegments(urlParts, record.segments);\n if (params !== null) {\n return { handler: record.handler, params };\n }\n }\n\n const fallbackMatch = findBestScopedFallbackRecord(normalized, records);\n return fallbackMatch\n ? { handler: fallbackMatch.record.handler, params: fallbackMatch.params }\n : null;\n}\n\nexport function resolveRouteFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): ResolvedRoute | null {\n if (isRouteStoreRoutes(routeList)) return resolveRoute(pathname);\n\n const match = findBestResolvedRouteFromRoutes(pathname, routeList);\n return match ? { handler: match.route.handler, params: match.params } : null;\n}\n\nexport function _resolveRouteMatchFromRoutes(\n pathname: string,\n routeList: readonly Route[]\n): { route: Route; params: Record<string, string> } | null {\n return findBestResolvedRouteFromRoutes(pathname, routeList);\n}\n"],"mappings":"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"}
@@ -1,8 +1,10 @@
1
+ import { _getBuiltInRoutePolicy } from "./policy.js";
1
2
  import { Outlet } from "./rendering.js";
2
3
  import { _setActiveRouteAuthOptions, getRoutes, hasRegisteredRoutes, lockRouteRegistration } from "./store.js";
3
4
  import { fallback, group, index, page, registerRoutes, route } from "./authoring.js";
4
- import { computeRouteActivityMatches, resolveRouteFromRoutes, resolveRouteRequest } from "./resolution.js";
5
+ import { computeRouteActivityMatches, resolveRouteFromRoutes } from "./route-matching.js";
6
+ import { resolveRouteRequest } from "./resolution.js";
5
7
  import { currentRoute, setServerLocation, syncCurrentRouteSnapshot } from "./activity.js";
6
8
  import { _drainLazy, _snapshotLazy, _snapshotRouteSourceLazy, lazy } from "./lazy.js";
7
9
  import { _applyManifest, clearRoutes, createRouteRegistry, getManifest } from "./manifest.js";
8
- export { Outlet, _applyManifest, _drainLazy, _setActiveRouteAuthOptions, _snapshotLazy, _snapshotRouteSourceLazy, clearRoutes, computeRouteActivityMatches, createRouteRegistry, currentRoute, fallback, getManifest, getRoutes, group, hasRegisteredRoutes, index, lazy, lockRouteRegistration, page, registerRoutes, resolveRouteFromRoutes, resolveRouteRequest, route, setServerLocation, syncCurrentRouteSnapshot };
10
+ export { Outlet, _applyManifest, _drainLazy, _getBuiltInRoutePolicy, _setActiveRouteAuthOptions, _snapshotLazy, _snapshotRouteSourceLazy, clearRoutes, computeRouteActivityMatches, createRouteRegistry, currentRoute, fallback, getManifest, getRoutes, group, hasRegisteredRoutes, index, lazy, lockRouteRegistration, page, registerRoutes, resolveRouteFromRoutes, resolveRouteRequest, route, setServerLocation, syncCurrentRouteSnapshot };
@@ -0,0 +1,4 @@
1
+ import { parseSegments } from "./match.js";
2
+ import { computeRouteActivityMatches } from "./route-matching.js";
3
+ import "./route.js";
4
+ export { computeRouteActivityMatches, parseSegments };
@@ -0,0 +1,20 @@
1
+ import { ReadableSource } from "./readable.js";
2
+ import { Scheduler, SchedulerLane } from "./scheduler.js";
3
+ import { AskrRuntime, RuntimeRendererHost } from "./runtime.js";
4
+
5
+ //#region src/runtime/access.d.ts
6
+ type RuntimeTask = () => void;
7
+ declare function getRuntimeScheduler(): Scheduler;
8
+ declare function getDefaultRuntimeInstance(): AskrRuntime;
9
+ declare function getRuntimeRenderer(): RuntimeRendererHost;
10
+ declare function enqueueRuntimeTask(task: RuntimeTask): void;
11
+ declare function enqueueRuntimeLane(lane: SchedulerLane, task: RuntimeTask): void;
12
+ declare function runRuntimeHandlerScope<T>(fn: () => T, flushMode?: 'defer' | 'sync'): T;
13
+ declare function runRuntimeWithSyncProgress<T>(fn: () => T): T;
14
+ declare function getRuntimeSchedulerState(): ReturnType<Scheduler['getState']>;
15
+ declare function isRuntimeSchedulerExecuting(): boolean;
16
+ declare function getRuntimeFlushVersion(): number;
17
+ declare function flushRuntimeScheduler(): void;
18
+ declare function setRuntimeBulkCommitProbe(probe: () => boolean): void;
19
+ declare function markRuntimeReactivePropsDirtySource(source: ReadableSource<unknown>): void;
20
+ //# sourceMappingURL=access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.d.ts","names":[],"sources":["../../src/runtime/access.ts"],"mappings":";;;;;KAQK,WAAA;AAAA,iBAEW,mBAAA,IAAuB,SAAS;AAAA,iBAIhC,yBAAA,IAA6B,WAAW;AAAA,iBAIxC,kBAAA,IAAsB,mBAAmB;AAAA,iBAIzC,kBAAA,CAAmB,IAAiB,EAAX,WAAW;AAAA,iBAIpC,kBAAA,CACd,IAAA,EAAM,aAAA,EACN,IAAA,EAAM,WAAW;AAAA,iBAKH,sBAAA,IACd,EAAA,QAAU,CAAA,EACV,SAAA,sBACC,CAAC;AAAA,iBAIY,0BAAA,IAA8B,EAAA,QAAU,CAAA,GAAI,CAAC;AAAA,iBAI7C,wBAAA,IAA4B,UAAU,CAAC,SAAA;AAAA,iBAIvC,2BAAA;AAAA,iBAIA,sBAAA;AAAA,iBAIA,qBAAA;AAAA,iBAIA,yBAAA,CAA0B,KAAoB;AAAA,iBAI9C,mCAAA,CACd,MAA+B,EAAvB,cAAc"}
@@ -1,5 +1,5 @@
1
1
  import { isDevelopmentEnvironment } from "../common/env.js";
2
- import { logger } from "../dev/logger.js";
2
+ import { logger } from "../common/logger.js";
3
3
  import { cleanupReadableSubscriptions } from "./readable.js";
4
4
  import { clearCurrentComponentScope, restoreCurrentComponentScope } from "./component-scope.js";
5
5
  //#region src/runtime/component-cleanup.ts
@@ -1 +1 @@
1
- {"version":3,"file":"component-cleanup.js","names":[],"sources":["../../src/runtime/component-cleanup.ts"],"sourcesContent":["/**\n * Component cleanup and owned child-scope bookkeeping.\n */\n\nimport { isDevelopmentEnvironment } from '../common/env';\nimport { logger } from '../dev/logger';\nimport type { ComponentInstance } from './component-internal';\nimport {\n clearCurrentComponentScope,\n restoreCurrentComponentScope,\n} from './component-scope';\nimport { cleanupReadableSubscriptions } from './readable';\n\nexport type OwnedChildScope = {\n key: string | number;\n dispose(): void;\n};\n\n/**\n * Clean up component resources on unmount or route changes.\n */\nexport function cleanupComponent(instance: ComponentInstance): void {\n const savedScope = clearCurrentComponentScope();\n\n try {\n const cleanupErrors: unknown[] = [];\n const recordCleanupError = (message: string, err: unknown): void => {\n if (instance.cleanupStrict) {\n cleanupErrors.push(err);\n } else if (isDevelopmentEnvironment()) {\n logger.warn(message, err);\n }\n };\n\n const ownedChildScopes = instance._ownedChildScopes;\n if (ownedChildScopes && ownedChildScopes.size > 0) {\n instance._ownedChildScopes = new Set();\n for (const scope of ownedChildScopes) {\n try {\n scope.dispose();\n } catch (err) {\n recordCleanupError('[Askr] child scope cleanup threw:', err);\n }\n }\n }\n\n const cleanupFns = instance.cleanupFns;\n instance.cleanupFns = [];\n for (const cleanup of cleanupFns) {\n try {\n cleanup();\n } catch (err) {\n recordCleanupError('[Askr] cleanup function threw:', err);\n }\n }\n\n try {\n cleanupReadableSubscriptions(instance);\n } catch (err) {\n recordCleanupError('[Askr] readable subscription cleanup threw:', err);\n }\n\n try {\n if (\n instance.abortController &&\n !instance.abortController.signal.aborted\n ) {\n instance.abortController.abort();\n }\n } catch (err) {\n recordCleanupError('[Askr] abort controller cleanup threw:', err);\n }\n instance.abortController = null;\n\n instance.lifecycleGeneration++;\n instance.evaluationGeneration++;\n instance.mountOperations = [];\n instance.commitOperations = [];\n instance.lifecycleSlots = [];\n instance.hasPendingUpdate = false;\n instance.notifyUpdate = null;\n instance._placeholder = undefined;\n instance.mounted = false;\n\n if (cleanupErrors.length > 0) {\n throw new AggregateError(\n cleanupErrors,\n `Cleanup failed for component ${instance.id}`\n );\n }\n } finally {\n restoreCurrentComponentScope(savedScope);\n }\n}\n\nexport function registerOwnedChildScope(\n instance: ComponentInstance,\n scope: OwnedChildScope\n): void {\n const scopes = (instance._ownedChildScopes ??= new Set());\n scopes.add(scope);\n}\n\nexport function unregisterOwnedChildScope(\n instance: ComponentInstance,\n scope: OwnedChildScope\n): void {\n instance._ownedChildScopes?.delete(scope);\n}\n"],"mappings":";;;;;;;;;;;AAqBA,SAAgB,iBAAiB,UAAmC;CAClE,MAAM,aAAa,2BAA2B;CAE9C,IAAI;EACF,MAAM,gBAA2B,CAAC;EAClC,MAAM,sBAAsB,SAAiB,QAAuB;GAClE,IAAI,SAAS,eACX,cAAc,KAAK,GAAG;QACjB,IAAI,yBAAyB,GAClC,OAAO,KAAK,SAAS,GAAG;EAE5B;EAEA,MAAM,mBAAmB,SAAS;EAClC,IAAI,oBAAoB,iBAAiB,OAAO,GAAG;GACjD,SAAS,oCAAoB,IAAI,IAAI;GACrC,KAAK,MAAM,SAAS,kBAClB,IAAI;IACF,MAAM,QAAQ;GAChB,SAAS,KAAK;IACZ,mBAAmB,qCAAqC,GAAG;GAC7D;EAEJ;EAEA,MAAM,aAAa,SAAS;EAC5B,SAAS,aAAa,CAAC;EACvB,KAAK,MAAM,WAAW,YACpB,IAAI;GACF,QAAQ;EACV,SAAS,KAAK;GACZ,mBAAmB,kCAAkC,GAAG;EAC1D;EAGF,IAAI;GACF,6BAA6B,QAAQ;EACvC,SAAS,KAAK;GACZ,mBAAmB,+CAA+C,GAAG;EACvE;EAEA,IAAI;GACF,IACE,SAAS,mBACT,CAAC,SAAS,gBAAgB,OAAO,SAEjC,SAAS,gBAAgB,MAAM;EAEnC,SAAS,KAAK;GACZ,mBAAmB,0CAA0C,GAAG;EAClE;EACA,SAAS,kBAAkB;EAE3B,SAAS;EACT,SAAS;EACT,SAAS,kBAAkB,CAAC;EAC5B,SAAS,mBAAmB,CAAC;EAC7B,SAAS,iBAAiB,CAAC;EAC3B,SAAS,mBAAmB;EAC5B,SAAS,eAAe;EACxB,SAAS,eAAe;EACxB,SAAS,UAAU;EAEnB,IAAI,cAAc,SAAS,GACzB,MAAM,IAAI,eACR,eACA,gCAAgC,SAAS,IAC3C;CAEJ,UAAU;EACR,6BAA6B,UAAU;CACzC;AACF;AAEA,SAAgB,wBACd,UACA,OACM;CAEN,CADgB,SAAS,sCAAsB,IAAI,IAAI,EACvD,CAAO,IAAI,KAAK;AAClB;AAEA,SAAgB,0BACd,UACA,OACM;CACN,SAAS,mBAAmB,OAAO,KAAK;AAC1C"}
1
+ {"version":3,"file":"component-cleanup.js","names":[],"sources":["../../src/runtime/component-cleanup.ts"],"sourcesContent":["/**\n * Component cleanup and owned child-scope bookkeeping.\n */\n\nimport { isDevelopmentEnvironment } from '../common/env';\nimport { logger } from '../common/logger';\nimport type { ComponentInstance } from './component-internal';\nimport {\n clearCurrentComponentScope,\n restoreCurrentComponentScope,\n} from './component-scope';\nimport { cleanupReadableSubscriptions } from './readable';\n\nexport type OwnedChildScope = {\n key: string | number;\n dispose(): void;\n};\n\n/**\n * Clean up component resources on unmount or route changes.\n */\nexport function cleanupComponent(instance: ComponentInstance): void {\n const savedScope = clearCurrentComponentScope();\n\n try {\n const cleanupErrors: unknown[] = [];\n const recordCleanupError = (message: string, err: unknown): void => {\n if (instance.cleanupStrict) {\n cleanupErrors.push(err);\n } else if (isDevelopmentEnvironment()) {\n logger.warn(message, err);\n }\n };\n\n const ownedChildScopes = instance._ownedChildScopes;\n if (ownedChildScopes && ownedChildScopes.size > 0) {\n instance._ownedChildScopes = new Set();\n for (const scope of ownedChildScopes) {\n try {\n scope.dispose();\n } catch (err) {\n recordCleanupError('[Askr] child scope cleanup threw:', err);\n }\n }\n }\n\n const cleanupFns = instance.cleanupFns;\n instance.cleanupFns = [];\n for (const cleanup of cleanupFns) {\n try {\n cleanup();\n } catch (err) {\n recordCleanupError('[Askr] cleanup function threw:', err);\n }\n }\n\n try {\n cleanupReadableSubscriptions(instance);\n } catch (err) {\n recordCleanupError('[Askr] readable subscription cleanup threw:', err);\n }\n\n try {\n if (\n instance.abortController &&\n !instance.abortController.signal.aborted\n ) {\n instance.abortController.abort();\n }\n } catch (err) {\n recordCleanupError('[Askr] abort controller cleanup threw:', err);\n }\n instance.abortController = null;\n\n instance.lifecycleGeneration++;\n instance.evaluationGeneration++;\n instance.mountOperations = [];\n instance.commitOperations = [];\n instance.lifecycleSlots = [];\n instance.hasPendingUpdate = false;\n instance.notifyUpdate = null;\n instance._placeholder = undefined;\n instance.mounted = false;\n\n if (cleanupErrors.length > 0) {\n throw new AggregateError(\n cleanupErrors,\n `Cleanup failed for component ${instance.id}`\n );\n }\n } finally {\n restoreCurrentComponentScope(savedScope);\n }\n}\n\nexport function registerOwnedChildScope(\n instance: ComponentInstance,\n scope: OwnedChildScope\n): void {\n const scopes = (instance._ownedChildScopes ??= new Set());\n scopes.add(scope);\n}\n\nexport function unregisterOwnedChildScope(\n instance: ComponentInstance,\n scope: OwnedChildScope\n): void {\n instance._ownedChildScopes?.delete(scope);\n}\n"],"mappings":";;;;;;;;;;;AAqBA,SAAgB,iBAAiB,UAAmC;CAClE,MAAM,aAAa,2BAA2B;CAE9C,IAAI;EACF,MAAM,gBAA2B,CAAC;EAClC,MAAM,sBAAsB,SAAiB,QAAuB;GAClE,IAAI,SAAS,eACX,cAAc,KAAK,GAAG;QACjB,IAAI,yBAAyB,GAClC,OAAO,KAAK,SAAS,GAAG;EAE5B;EAEA,MAAM,mBAAmB,SAAS;EAClC,IAAI,oBAAoB,iBAAiB,OAAO,GAAG;GACjD,SAAS,oCAAoB,IAAI,IAAI;GACrC,KAAK,MAAM,SAAS,kBAClB,IAAI;IACF,MAAM,QAAQ;GAChB,SAAS,KAAK;IACZ,mBAAmB,qCAAqC,GAAG;GAC7D;EAEJ;EAEA,MAAM,aAAa,SAAS;EAC5B,SAAS,aAAa,CAAC;EACvB,KAAK,MAAM,WAAW,YACpB,IAAI;GACF,QAAQ;EACV,SAAS,KAAK;GACZ,mBAAmB,kCAAkC,GAAG;EAC1D;EAGF,IAAI;GACF,6BAA6B,QAAQ;EACvC,SAAS,KAAK;GACZ,mBAAmB,+CAA+C,GAAG;EACvE;EAEA,IAAI;GACF,IACE,SAAS,mBACT,CAAC,SAAS,gBAAgB,OAAO,SAEjC,SAAS,gBAAgB,MAAM;EAEnC,SAAS,KAAK;GACZ,mBAAmB,0CAA0C,GAAG;EAClE;EACA,SAAS,kBAAkB;EAE3B,SAAS;EACT,SAAS;EACT,SAAS,kBAAkB,CAAC;EAC5B,SAAS,mBAAmB,CAAC;EAC7B,SAAS,iBAAiB,CAAC;EAC3B,SAAS,mBAAmB;EAC5B,SAAS,eAAe;EACxB,SAAS,eAAe;EACxB,SAAS,UAAU;EAEnB,IAAI,cAAc,SAAS,GACzB,MAAM,IAAI,eACR,eACA,gCAAgC,SAAS,IAC3C;CAEJ,UAAU;EACR,6BAA6B,UAAU;CACzC;AACF;AAEA,SAAgB,wBACd,UACA,OACM;CAEN,CADgB,SAAS,sCAAsB,IAAI,IAAI,EACvD,CAAO,IAAI,KAAK;AAClB;AAEA,SAAgB,0BACd,UACA,OACM;CACN,SAAS,mBAAmB,OAAO,KAAK;AAC1C"}
@@ -1,5 +1,5 @@
1
1
  import { isDevelopmentEnvironment } from "../common/env.js";
2
- import { logger } from "../dev/logger.js";
2
+ import { logger } from "../common/logger.js";
3
3
  import { enqueueRuntimeTask, getRuntimeRenderer } from "./access.js";
4
4
  import { withContext } from "./context.js";
5
5
  import { incDevCounter, setDevValue } from "./dev-namespace.js";
@@ -1 +1 @@
1
- {"version":3,"file":"component-commit.js","names":[],"sources":["../../src/runtime/component-commit.ts"],"sourcesContent":["import { isDevelopmentEnvironment } from '../common/env';\nimport { isPromiseLike } from '../common/promise';\nimport { logger } from '../dev/logger';\nimport { enqueueRuntimeTask, getRuntimeRenderer } from './access';\nimport {\n beginLifecycleCommitBatch,\n discardCommitOperations,\n discardLifecycleCommitBatch,\n executeCommittedLifecycleOperations,\n flushLifecycleCommitBatch,\n} from './component-lifecycle';\nimport {\n beginRenderTracking,\n enterDomCommitScope,\n restoreDomCommitScope,\n} from './component-scope';\nimport type { ContextFrame } from './context';\nimport { withContext } from './context';\nimport { incDevCounter, setDevValue } from './dev-namespace';\nimport { tryRuntimeFastLaneSync } from './fastlane';\nimport type { ComponentInstance } from './component-internal';\n\nexport interface ScheduledComponentCommitHost {\n execute(instance: ComponentInstance): unknown | Promise<unknown>;\n finalizeReadSubscriptions(instance: ComponentInstance): void;\n warnUnusedStateReads(instance: ComponentInstance): void;\n commitRenderedComponent(instance: ComponentInstance): void;\n}\n\nexport function runScheduledComponent(\n instance: ComponentInstance,\n host: ScheduledComponentCommitHost\n): void {\n instance.notifyUpdate = instance._enqueueRun!;\n beginRenderTracking(instance);\n const domSnapshot = instance.target ? instance.target.innerHTML : '';\n\n let result: unknown | Promise<unknown>;\n try {\n result = host.execute(instance);\n } catch (err) {\n discardCommitOperations(instance);\n throw err;\n }\n\n if (isPromiseLike(result)) {\n throw new Error(\n 'Async components are not supported. Components must be synchronous.'\n );\n }\n\n try {\n const used = tryRuntimeFastLaneSync(instance, result);\n if (used) {\n host.warnUnusedStateReads(instance);\n return;\n }\n } catch (err) {\n if (isDevelopmentEnvironment()) throw err;\n }\n\n enqueueRuntimeTask(() => {\n if (!instance.target && instance._placeholder) {\n commitPlaceholderReplacement(instance, result, host);\n return;\n }\n\n if (instance.target) {\n commitToTarget(instance, result, domSnapshot, host);\n }\n });\n}\n\nfunction commitPlaceholderReplacement(\n instance: ComponentInstance,\n result: unknown,\n host: ScheduledComponentCommitHost\n): void {\n if (result === null || result === undefined) {\n host.finalizeReadSubscriptions(instance);\n host.warnUnusedStateReads(instance);\n host.commitRenderedComponent(instance);\n return;\n }\n\n const placeholder = instance._placeholder!;\n const parent = placeholder.parentNode;\n if (!parent) {\n logger.warn('[Askr] placeholder no longer in DOM, cannot render component');\n return;\n }\n\n const renderer = getRuntimeRenderer();\n const hostElement = document.createElement('div');\n const executionFrame: ContextFrame = {\n parent: instance.ownerFrame,\n values: null,\n };\n\n const oldInstance = enterDomCommitScope(instance);\n const lifecycleBatch = beginLifecycleCommitBatch();\n try {\n try {\n withContext(executionFrame, () => {\n renderer.evaluate(result, hostElement);\n });\n parent.replaceChild(hostElement, placeholder);\n } catch (err) {\n discardLifecycleCommitBatch(lifecycleBatch);\n throw err;\n }\n\n instance.target = hostElement;\n instance._placeholder = undefined;\n (\n hostElement as Element & {\n __ASKR_INSTANCE?: ComponentInstance;\n }\n ).__ASKR_INSTANCE = instance;\n\n flushLifecycleCommitBatch(lifecycleBatch);\n host.finalizeReadSubscriptions(instance);\n host.warnUnusedStateReads(instance);\n host.commitRenderedComponent(instance);\n } finally {\n restoreDomCommitScope(oldInstance);\n }\n}\n\nfunction commitToTarget(\n instance: ComponentInstance,\n result: unknown,\n domSnapshot: string,\n host: ScheduledComponentCommitHost\n): void {\n const renderer = getRuntimeRenderer();\n const target = instance.target!;\n let oldChildren: Node[] = [];\n let restoredOldChildren = false;\n\n try {\n const wasFirstMount = !instance.mounted;\n const oldInstance = enterDomCommitScope(instance);\n const executionFrame: ContextFrame = {\n parent: instance.ownerFrame,\n values: null,\n };\n oldChildren = Array.from(target.childNodes);\n\n const lifecycleBatch = beginLifecycleCommitBatch();\n try {\n try {\n withContext(executionFrame, () => {\n renderer.evaluate(result, target, undefined, instance);\n });\n } catch (err) {\n discardLifecycleCommitBatch(lifecycleBatch);\n throw err;\n }\n } catch (err) {\n cleanupFailedCommitChildren(renderer, target, oldChildren);\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue(\n '__LAST_DOM_REPLACE_STACK_COMPONENT_RESTORE',\n new Error().stack\n );\n } catch (devErr) {\n void devErr;\n }\n target.replaceChildren(...oldChildren);\n restoredOldChildren = true;\n throw err;\n } finally {\n restoreDomCommitScope(oldInstance);\n }\n\n flushLifecycleCommitBatch(lifecycleBatch);\n host.finalizeReadSubscriptions(instance);\n host.warnUnusedStateReads(instance);\n instance.mounted = true;\n executeCommittedLifecycleOperations(instance, wasFirstMount);\n } catch (renderError) {\n discardCommitOperations(instance);\n cleanupRollbackChildren(renderer, target, oldChildren, restoredOldChildren);\n\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue(\n '__LAST_DOM_REPLACE_STACK_COMPONENT_ROLLBACK',\n new Error().stack\n );\n target.replaceChildren(...oldChildren);\n } catch {\n target.innerHTML = domSnapshot;\n }\n\n throw renderError;\n }\n}\n\nfunction cleanupFailedCommitChildren(\n renderer: ReturnType<typeof getRuntimeRenderer>,\n target: Element,\n oldChildren: Node[]\n): void {\n try {\n const newChildren = Array.from(target.childNodes);\n const preservedChildren = new Set(oldChildren);\n for (const node of newChildren) {\n if (preservedChildren.has(node)) {\n continue;\n }\n try {\n renderer.cleanupInstancesUnder(node);\n } catch (err) {\n logger.warn('[Askr] error cleaning up failed commit children:', err);\n }\n }\n } catch (err) {\n void err;\n }\n}\n\nfunction cleanupRollbackChildren(\n renderer: ReturnType<typeof getRuntimeRenderer>,\n target: Element,\n oldChildren: Node[],\n restoredOldChildren: boolean\n): void {\n try {\n const currentChildren = Array.from(target.childNodes);\n const preservedChildren = restoredOldChildren ? new Set(oldChildren) : null;\n for (const node of currentChildren) {\n if (preservedChildren?.has(node)) {\n continue;\n }\n try {\n renderer.cleanupInstancesUnder(node);\n } catch (err) {\n logger.warn(\n '[Askr] error cleaning up partial children during rollback:',\n err\n );\n }\n }\n } catch (err) {\n void err;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"component-commit.js","names":[],"sources":["../../src/runtime/component-commit.ts"],"sourcesContent":["import { isDevelopmentEnvironment } from '../common/env';\nimport { isPromiseLike } from '../common/promise';\nimport { logger } from '../common/logger';\nimport { enqueueRuntimeTask, getRuntimeRenderer } from './access';\nimport {\n beginLifecycleCommitBatch,\n discardCommitOperations,\n discardLifecycleCommitBatch,\n executeCommittedLifecycleOperations,\n flushLifecycleCommitBatch,\n} from './component-lifecycle';\nimport {\n beginRenderTracking,\n enterDomCommitScope,\n restoreDomCommitScope,\n} from './component-scope';\nimport type { ContextFrame } from './context';\nimport { withContext } from './context';\nimport { incDevCounter, setDevValue } from './dev-namespace';\nimport { tryRuntimeFastLaneSync } from './fastlane';\nimport type { ComponentInstance } from './component-internal';\n\nexport interface ScheduledComponentCommitHost {\n execute(instance: ComponentInstance): unknown | Promise<unknown>;\n finalizeReadSubscriptions(instance: ComponentInstance): void;\n warnUnusedStateReads(instance: ComponentInstance): void;\n commitRenderedComponent(instance: ComponentInstance): void;\n}\n\nexport function runScheduledComponent(\n instance: ComponentInstance,\n host: ScheduledComponentCommitHost\n): void {\n instance.notifyUpdate = instance._enqueueRun!;\n beginRenderTracking(instance);\n const domSnapshot = instance.target ? instance.target.innerHTML : '';\n\n let result: unknown | Promise<unknown>;\n try {\n result = host.execute(instance);\n } catch (err) {\n discardCommitOperations(instance);\n throw err;\n }\n\n if (isPromiseLike(result)) {\n throw new Error(\n 'Async components are not supported. Components must be synchronous.'\n );\n }\n\n try {\n const used = tryRuntimeFastLaneSync(instance, result);\n if (used) {\n host.warnUnusedStateReads(instance);\n return;\n }\n } catch (err) {\n if (isDevelopmentEnvironment()) throw err;\n }\n\n enqueueRuntimeTask(() => {\n if (!instance.target && instance._placeholder) {\n commitPlaceholderReplacement(instance, result, host);\n return;\n }\n\n if (instance.target) {\n commitToTarget(instance, result, domSnapshot, host);\n }\n });\n}\n\nfunction commitPlaceholderReplacement(\n instance: ComponentInstance,\n result: unknown,\n host: ScheduledComponentCommitHost\n): void {\n if (result === null || result === undefined) {\n host.finalizeReadSubscriptions(instance);\n host.warnUnusedStateReads(instance);\n host.commitRenderedComponent(instance);\n return;\n }\n\n const placeholder = instance._placeholder!;\n const parent = placeholder.parentNode;\n if (!parent) {\n logger.warn('[Askr] placeholder no longer in DOM, cannot render component');\n return;\n }\n\n const renderer = getRuntimeRenderer();\n const hostElement = document.createElement('div');\n const executionFrame: ContextFrame = {\n parent: instance.ownerFrame,\n values: null,\n };\n\n const oldInstance = enterDomCommitScope(instance);\n const lifecycleBatch = beginLifecycleCommitBatch();\n try {\n try {\n withContext(executionFrame, () => {\n renderer.evaluate(result, hostElement);\n });\n parent.replaceChild(hostElement, placeholder);\n } catch (err) {\n discardLifecycleCommitBatch(lifecycleBatch);\n throw err;\n }\n\n instance.target = hostElement;\n instance._placeholder = undefined;\n (\n hostElement as Element & {\n __ASKR_INSTANCE?: ComponentInstance;\n }\n ).__ASKR_INSTANCE = instance;\n\n flushLifecycleCommitBatch(lifecycleBatch);\n host.finalizeReadSubscriptions(instance);\n host.warnUnusedStateReads(instance);\n host.commitRenderedComponent(instance);\n } finally {\n restoreDomCommitScope(oldInstance);\n }\n}\n\nfunction commitToTarget(\n instance: ComponentInstance,\n result: unknown,\n domSnapshot: string,\n host: ScheduledComponentCommitHost\n): void {\n const renderer = getRuntimeRenderer();\n const target = instance.target!;\n let oldChildren: Node[] = [];\n let restoredOldChildren = false;\n\n try {\n const wasFirstMount = !instance.mounted;\n const oldInstance = enterDomCommitScope(instance);\n const executionFrame: ContextFrame = {\n parent: instance.ownerFrame,\n values: null,\n };\n oldChildren = Array.from(target.childNodes);\n\n const lifecycleBatch = beginLifecycleCommitBatch();\n try {\n try {\n withContext(executionFrame, () => {\n renderer.evaluate(result, target, undefined, instance);\n });\n } catch (err) {\n discardLifecycleCommitBatch(lifecycleBatch);\n throw err;\n }\n } catch (err) {\n cleanupFailedCommitChildren(renderer, target, oldChildren);\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue(\n '__LAST_DOM_REPLACE_STACK_COMPONENT_RESTORE',\n new Error().stack\n );\n } catch (devErr) {\n void devErr;\n }\n target.replaceChildren(...oldChildren);\n restoredOldChildren = true;\n throw err;\n } finally {\n restoreDomCommitScope(oldInstance);\n }\n\n flushLifecycleCommitBatch(lifecycleBatch);\n host.finalizeReadSubscriptions(instance);\n host.warnUnusedStateReads(instance);\n instance.mounted = true;\n executeCommittedLifecycleOperations(instance, wasFirstMount);\n } catch (renderError) {\n discardCommitOperations(instance);\n cleanupRollbackChildren(renderer, target, oldChildren, restoredOldChildren);\n\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue(\n '__LAST_DOM_REPLACE_STACK_COMPONENT_ROLLBACK',\n new Error().stack\n );\n target.replaceChildren(...oldChildren);\n } catch {\n target.innerHTML = domSnapshot;\n }\n\n throw renderError;\n }\n}\n\nfunction cleanupFailedCommitChildren(\n renderer: ReturnType<typeof getRuntimeRenderer>,\n target: Element,\n oldChildren: Node[]\n): void {\n try {\n const newChildren = Array.from(target.childNodes);\n const preservedChildren = new Set(oldChildren);\n for (const node of newChildren) {\n if (preservedChildren.has(node)) {\n continue;\n }\n try {\n renderer.cleanupInstancesUnder(node);\n } catch (err) {\n logger.warn('[Askr] error cleaning up failed commit children:', err);\n }\n }\n } catch (err) {\n void err;\n }\n}\n\nfunction cleanupRollbackChildren(\n renderer: ReturnType<typeof getRuntimeRenderer>,\n target: Element,\n oldChildren: Node[],\n restoredOldChildren: boolean\n): void {\n try {\n const currentChildren = Array.from(target.childNodes);\n const preservedChildren = restoredOldChildren ? new Set(oldChildren) : null;\n for (const node of currentChildren) {\n if (preservedChildren?.has(node)) {\n continue;\n }\n try {\n renderer.cleanupInstancesUnder(node);\n } catch (err) {\n logger.warn(\n '[Askr] error cleaning up partial children during rollback:',\n err\n );\n }\n }\n } catch (err) {\n void err;\n }\n}\n"],"mappings":"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"}