@askrjs/askr 0.0.48 → 0.0.50

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 (401) hide show
  1. package/dist/benchmark.js +6 -6
  2. package/dist/benchmark.js.map +1 -1
  3. package/dist/boot/hydration.js +140 -0
  4. package/dist/boot/hydration.js.map +1 -0
  5. package/dist/boot/index.d.ts +3 -56
  6. package/dist/boot/index.d.ts.map +1 -1
  7. package/dist/boot/index.js +62 -410
  8. package/dist/boot/index.js.map +1 -1
  9. package/dist/boot/root-lifecycle.d.ts +15 -0
  10. package/dist/boot/root-lifecycle.d.ts.map +1 -0
  11. package/dist/boot/root-lifecycle.js +205 -0
  12. package/dist/boot/root-lifecycle.js.map +1 -0
  13. package/dist/boot/route-startup.js +45 -0
  14. package/dist/boot/route-startup.js.map +1 -0
  15. package/dist/boot/types.d.ts +62 -0
  16. package/dist/boot/types.d.ts.map +1 -0
  17. package/dist/common/component.d.ts +3 -1
  18. package/dist/common/component.d.ts.map +1 -1
  19. package/dist/common/jsx.d.ts +6 -2
  20. package/dist/common/jsx.d.ts.map +1 -1
  21. package/dist/common/jsx.js.map +1 -1
  22. package/dist/common/props.d.ts +1 -1
  23. package/dist/common/render-context.js +55 -0
  24. package/dist/common/render-context.js.map +1 -0
  25. package/dist/common/router.d.ts +5 -1
  26. package/dist/common/router.d.ts.map +1 -1
  27. package/dist/common/ssr.d.ts +1 -1
  28. package/dist/common/ssr.js.map +1 -1
  29. package/dist/common/vnode.d.ts +5 -4
  30. package/dist/common/vnode.d.ts.map +1 -1
  31. package/dist/common/vnode.js.map +1 -1
  32. package/dist/components/error-boundary.d.ts +1 -1
  33. package/dist/components/error-boundary.js +2 -1
  34. package/dist/components/error-boundary.js.map +1 -1
  35. package/dist/components/link.js.map +1 -1
  36. package/dist/control/for.js +2 -1
  37. package/dist/control/for.js.map +1 -1
  38. package/dist/data/data-runtime.d.ts +28 -0
  39. package/dist/data/data-runtime.d.ts.map +1 -0
  40. package/dist/data/data-runtime.js +114 -0
  41. package/dist/data/data-runtime.js.map +1 -0
  42. package/dist/data/index.d.ts +6 -142
  43. package/dist/data/index.js +5 -539
  44. package/dist/data/invalidation.d.ts +9 -0
  45. package/dist/data/invalidation.d.ts.map +1 -0
  46. package/dist/data/invalidation.js +27 -0
  47. package/dist/data/invalidation.js.map +1 -0
  48. package/dist/data/mutation-cell.d.ts +28 -0
  49. package/dist/data/mutation-cell.d.ts.map +1 -0
  50. package/dist/data/mutation-cell.js +132 -0
  51. package/dist/data/mutation-cell.js.map +1 -0
  52. package/dist/data/query-cell.d.ts +46 -0
  53. package/dist/data/query-cell.d.ts.map +1 -0
  54. package/dist/data/query-cell.js +290 -0
  55. package/dist/data/query-cell.js.map +1 -0
  56. package/dist/data/query-key.js +42 -0
  57. package/dist/data/query-key.js.map +1 -0
  58. package/dist/data/shared.js +20 -0
  59. package/dist/data/shared.js.map +1 -0
  60. package/dist/data/types.d.ts +161 -0
  61. package/dist/data/types.d.ts.map +1 -0
  62. package/dist/foundations/icon/icon.d.ts.map +1 -1
  63. package/dist/foundations/icon/icon.js.map +1 -1
  64. package/dist/foundations/structures/portal.d.ts +1 -1
  65. package/dist/foundations/structures/portal.d.ts.map +1 -1
  66. package/dist/foundations/structures/portal.js +2 -1
  67. package/dist/foundations/structures/portal.js.map +1 -1
  68. package/dist/fx/fx.d.ts +1 -1
  69. package/dist/fx/fx.js +5 -4
  70. package/dist/fx/fx.js.map +1 -1
  71. package/dist/fx/timing.d.ts.map +1 -1
  72. package/dist/fx/timing.js +10 -6
  73. package/dist/fx/timing.js.map +1 -1
  74. package/dist/index.d.ts +3 -2
  75. package/dist/index.js +4 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/jsx/index.d.ts +2 -1
  78. package/dist/jsx/index.js +3 -2
  79. package/dist/jsx/types.d.ts +3 -1
  80. package/dist/jsx/types.d.ts.map +1 -1
  81. package/dist/jsx/types.js +2 -1
  82. package/dist/jsx-dev-runtime.d.ts +2 -2
  83. package/dist/jsx-dev-runtime.d.ts.map +1 -1
  84. package/dist/jsx-dev-runtime.js.map +1 -1
  85. package/dist/jsx-runtime.d.ts +2 -2
  86. package/dist/jsx-runtime.d.ts.map +1 -1
  87. package/dist/jsx-runtime.js.map +1 -1
  88. package/dist/jsx-runtime2.d.ts +3 -2
  89. package/dist/jsx-runtime2.js +3 -2
  90. package/dist/renderer/attributes.js +231 -0
  91. package/dist/renderer/attributes.js.map +1 -0
  92. package/dist/renderer/boundaries.js +266 -0
  93. package/dist/renderer/boundaries.js.map +1 -0
  94. package/dist/renderer/child-shape.js +85 -0
  95. package/dist/renderer/child-shape.js.map +1 -0
  96. package/dist/renderer/children.js +3 -2
  97. package/dist/renderer/children.js.map +1 -1
  98. package/dist/renderer/cleanup.js +2 -1
  99. package/dist/renderer/cleanup.js.map +1 -1
  100. package/dist/renderer/component-host-cleanup.js +68 -0
  101. package/dist/renderer/component-host-cleanup.js.map +1 -0
  102. package/dist/renderer/component-host-instances.js +65 -0
  103. package/dist/renderer/component-host-instances.js.map +1 -0
  104. package/dist/renderer/component-host.js +247 -0
  105. package/dist/renderer/component-host.js.map +1 -0
  106. package/dist/renderer/dom-host.js +13 -0
  107. package/dist/renderer/dom-host.js.map +1 -0
  108. package/dist/renderer/dom-internal.js +185 -0
  109. package/dist/renderer/dom-internal.js.map +1 -0
  110. package/dist/renderer/dom.js +9 -2356
  111. package/dist/renderer/element-children.js +279 -0
  112. package/dist/renderer/element-children.js.map +1 -0
  113. package/dist/renderer/env.js +2 -1
  114. package/dist/renderer/error-boundary-dom.js +29 -0
  115. package/dist/renderer/error-boundary-dom.js.map +1 -0
  116. package/dist/renderer/evaluate-dom-range.js +85 -0
  117. package/dist/renderer/evaluate-dom-range.js.map +1 -0
  118. package/dist/renderer/evaluate-reconcile.js +281 -0
  119. package/dist/renderer/evaluate-reconcile.js.map +1 -0
  120. package/dist/renderer/evaluate.js +13 -399
  121. package/dist/renderer/evaluate.js.map +1 -1
  122. package/dist/renderer/fastpath.js +6 -5
  123. package/dist/renderer/fastpath.js.map +1 -1
  124. package/dist/renderer/for-commit-dom-map.js +83 -0
  125. package/dist/renderer/for-commit-dom-map.js.map +1 -0
  126. package/dist/renderer/for-commit-removal.js +36 -0
  127. package/dist/renderer/for-commit-removal.js.map +1 -0
  128. package/dist/renderer/for-commit-reorder.js +89 -0
  129. package/dist/renderer/for-commit-reorder.js.map +1 -0
  130. package/dist/renderer/for-commit.js +6 -188
  131. package/dist/renderer/for-commit.js.map +1 -1
  132. package/dist/renderer/index.js +28 -16
  133. package/dist/renderer/index.js.map +1 -1
  134. package/dist/renderer/keyed-children.js +32 -0
  135. package/dist/renderer/keyed-children.js.map +1 -0
  136. package/dist/renderer/keyed.js +2 -15
  137. package/dist/renderer/keyed.js.map +1 -1
  138. package/dist/renderer/namespaces.js +23 -0
  139. package/dist/renderer/namespaces.js.map +1 -0
  140. package/dist/renderer/prop-bindings.js +280 -0
  141. package/dist/renderer/prop-bindings.js.map +1 -0
  142. package/dist/renderer/reactive-child-dom.js +133 -0
  143. package/dist/renderer/reactive-child-dom.js.map +1 -0
  144. package/dist/renderer/reactive-child-sources.js +184 -0
  145. package/dist/renderer/reactive-child-sources.js.map +1 -0
  146. package/dist/renderer/reactive-children.js +294 -0
  147. package/dist/renderer/reactive-children.js.map +1 -0
  148. package/dist/renderer/reconcile-commit.js +38 -0
  149. package/dist/renderer/reconcile-commit.js.map +1 -0
  150. package/dist/renderer/reconcile-fastpaths.js +106 -0
  151. package/dist/renderer/reconcile-fastpaths.js.map +1 -0
  152. package/dist/renderer/reconcile-resolution.js +187 -0
  153. package/dist/renderer/reconcile-resolution.js.map +1 -0
  154. package/dist/renderer/reconcile.js +9 -371
  155. package/dist/renderer/reconcile.js.map +1 -1
  156. package/dist/renderer/retained-element-rollback.js +276 -0
  157. package/dist/renderer/retained-element-rollback.js.map +1 -0
  158. package/dist/renderer/stable-patch.js +82 -0
  159. package/dist/renderer/stable-patch.js.map +1 -0
  160. package/dist/renderer/static-reuse.js +96 -0
  161. package/dist/renderer/static-reuse.js.map +1 -0
  162. package/dist/renderer/types.js +2 -1
  163. package/dist/renderer/utils.js +4 -4
  164. package/dist/renderer/utils.js.map +1 -1
  165. package/dist/resources/index.d.ts +3 -2
  166. package/dist/resources/index.js +5 -2
  167. package/dist/router/access.js +36 -0
  168. package/dist/router/access.js.map +1 -0
  169. package/dist/router/activity.d.ts +10 -0
  170. package/dist/router/activity.d.ts.map +1 -0
  171. package/dist/router/activity.js +89 -0
  172. package/dist/router/activity.js.map +1 -0
  173. package/dist/router/authoring.d.ts +22 -0
  174. package/dist/router/authoring.d.ts.map +1 -0
  175. package/dist/router/authoring.js +198 -0
  176. package/dist/router/authoring.js.map +1 -0
  177. package/dist/router/index.d.ts +12 -4
  178. package/dist/router/index.js +10 -3
  179. package/dist/router/internal-types.d.ts +31 -0
  180. package/dist/router/internal-types.d.ts.map +1 -0
  181. package/dist/router/lazy.d.ts +19 -0
  182. package/dist/router/lazy.d.ts.map +1 -0
  183. package/dist/router/lazy.js +52 -0
  184. package/dist/router/lazy.js.map +1 -0
  185. package/dist/router/manifest.d.ts +10 -0
  186. package/dist/router/manifest.d.ts.map +1 -0
  187. package/dist/router/manifest.js +49 -0
  188. package/dist/router/manifest.js.map +1 -0
  189. package/dist/router/navigate.d.ts +4 -51
  190. package/dist/router/navigate.d.ts.map +1 -1
  191. package/dist/router/navigate.js +16 -459
  192. package/dist/router/navigate.js.map +1 -1
  193. package/dist/router/navigation-registry.d.ts +32 -0
  194. package/dist/router/navigation-registry.d.ts.map +1 -0
  195. package/dist/router/navigation-registry.js +105 -0
  196. package/dist/router/navigation-registry.js.map +1 -0
  197. package/dist/router/navigation-scroll.d.ts +14 -0
  198. package/dist/router/navigation-scroll.d.ts.map +1 -0
  199. package/dist/router/navigation-scroll.js +93 -0
  200. package/dist/router/navigation-scroll.js.map +1 -0
  201. package/dist/router/navigation-targets.d.ts +31 -0
  202. package/dist/router/navigation-targets.d.ts.map +1 -0
  203. package/dist/router/navigation-targets.js +253 -0
  204. package/dist/router/navigation-targets.js.map +1 -0
  205. package/dist/router/policy.d.ts +7 -1
  206. package/dist/router/policy.d.ts.map +1 -1
  207. package/dist/router/policy.js +27 -9
  208. package/dist/router/policy.js.map +1 -1
  209. package/dist/router/rendering.d.ts +10 -0
  210. package/dist/router/rendering.d.ts.map +1 -0
  211. package/dist/router/rendering.js +45 -0
  212. package/dist/router/rendering.js.map +1 -0
  213. package/dist/router/resolution.d.ts +17 -0
  214. package/dist/router/resolution.d.ts.map +1 -0
  215. package/dist/router/resolution.js +253 -0
  216. package/dist/router/resolution.js.map +1 -0
  217. package/dist/router/route-query.d.ts +17 -0
  218. package/dist/router/route-query.d.ts.map +1 -0
  219. package/dist/router/route-query.js +47 -0
  220. package/dist/router/route-query.js.map +1 -0
  221. package/dist/router/route.d.ts +8 -149
  222. package/dist/router/route.js +8 -854
  223. package/dist/router/store.d.ts +50 -0
  224. package/dist/router/store.d.ts.map +1 -0
  225. package/dist/router/store.js +171 -0
  226. package/dist/router/store.js.map +1 -0
  227. package/dist/runtime/access.js +45 -0
  228. package/dist/runtime/access.js.map +1 -0
  229. package/dist/runtime/child-scope.d.ts +1 -1
  230. package/dist/runtime/child-scope.js +4 -1
  231. package/dist/runtime/child-scope.js.map +1 -1
  232. package/dist/runtime/component-cleanup.d.ts +16 -0
  233. package/dist/runtime/component-cleanup.d.ts.map +1 -0
  234. package/dist/runtime/component-cleanup.js +70 -0
  235. package/dist/runtime/component-cleanup.js.map +1 -0
  236. package/dist/runtime/component-commit.js +165 -0
  237. package/dist/runtime/component-commit.js.map +1 -0
  238. package/dist/runtime/component-contracts.js +5 -0
  239. package/dist/runtime/component-facade.d.ts +5 -0
  240. package/dist/runtime/component-facade.js +4 -0
  241. package/dist/runtime/component-internal.d.ts +100 -0
  242. package/dist/runtime/component-internal.d.ts.map +1 -0
  243. package/dist/runtime/component-internal.js +219 -0
  244. package/dist/runtime/component-internal.js.map +1 -0
  245. package/dist/runtime/component-lifecycle.d.ts +49 -0
  246. package/dist/runtime/component-lifecycle.d.ts.map +1 -0
  247. package/dist/runtime/component-lifecycle.js +176 -0
  248. package/dist/runtime/component-lifecycle.js.map +1 -0
  249. package/dist/runtime/component-scope.d.ts +55 -0
  250. package/dist/runtime/component-scope.d.ts.map +1 -0
  251. package/dist/runtime/component-scope.js +154 -0
  252. package/dist/runtime/component-scope.js.map +1 -0
  253. package/dist/runtime/component.d.ts +4 -152
  254. package/dist/runtime/component.js +4 -692
  255. package/dist/runtime/context.d.ts +1 -1
  256. package/dist/runtime/context.js +6 -4
  257. package/dist/runtime/context.js.map +1 -1
  258. package/dist/runtime/control.d.ts +3 -3
  259. package/dist/runtime/control.js +2 -1
  260. package/dist/runtime/control.js.map +1 -1
  261. package/dist/runtime/derive.d.ts.map +1 -1
  262. package/dist/runtime/derive.js +6 -5
  263. package/dist/runtime/derive.js.map +1 -1
  264. package/dist/runtime/effect.d.ts +1 -1
  265. package/dist/runtime/effect.d.ts.map +1 -1
  266. package/dist/runtime/effect.js +2 -2
  267. package/dist/runtime/effect.js.map +1 -1
  268. package/dist/runtime/events.js +3 -3
  269. package/dist/runtime/events.js.map +1 -1
  270. package/dist/runtime/fastlane.js +13 -27
  271. package/dist/runtime/fastlane.js.map +1 -1
  272. package/dist/runtime/for-bench.d.ts +1 -1
  273. package/dist/runtime/for-bench.js +1 -4
  274. package/dist/runtime/for-bench.js.map +1 -1
  275. package/dist/runtime/for-internal.d.ts +43 -0
  276. package/dist/runtime/for-internal.d.ts.map +1 -0
  277. package/dist/runtime/for-internal.js +98 -0
  278. package/dist/runtime/for-internal.js.map +1 -0
  279. package/dist/runtime/for-reconcile.d.ts +8 -0
  280. package/dist/runtime/for-reconcile.d.ts.map +1 -0
  281. package/dist/runtime/for-reconcile.js +389 -0
  282. package/dist/runtime/for-reconcile.js.map +1 -0
  283. package/dist/runtime/for-scopes.d.ts +26 -0
  284. package/dist/runtime/for-scopes.d.ts.map +1 -0
  285. package/dist/runtime/for-scopes.js +160 -0
  286. package/dist/runtime/for-scopes.js.map +1 -0
  287. package/dist/runtime/for-signals.d.ts +30 -0
  288. package/dist/runtime/for-signals.d.ts.map +1 -0
  289. package/dist/runtime/for-signals.js +139 -0
  290. package/dist/runtime/for-signals.js.map +1 -0
  291. package/dist/runtime/for.d.ts +4 -66
  292. package/dist/runtime/for.js +5 -773
  293. package/dist/runtime/lifecycle-operations.d.ts +31 -0
  294. package/dist/runtime/lifecycle-operations.d.ts.map +1 -0
  295. package/dist/runtime/lifecycle-operations.js +195 -0
  296. package/dist/runtime/lifecycle-operations.js.map +1 -0
  297. package/dist/runtime/operations.d.ts +3 -40
  298. package/dist/runtime/operations.js +2 -357
  299. package/dist/runtime/readable.d.ts +2 -3
  300. package/dist/runtime/readable.d.ts.map +1 -1
  301. package/dist/runtime/readable.js +6 -5
  302. package/dist/runtime/readable.js.map +1 -1
  303. package/dist/runtime/resource-cell.js +2 -2
  304. package/dist/runtime/resource-cell.js.map +1 -1
  305. package/dist/runtime/resource-operation.d.ts +13 -0
  306. package/dist/runtime/resource-operation.d.ts.map +1 -0
  307. package/dist/runtime/resource-operation.js +170 -0
  308. package/dist/runtime/resource-operation.js.map +1 -0
  309. package/dist/runtime/runtime.d.ts +42 -0
  310. package/dist/runtime/runtime.d.ts.map +1 -0
  311. package/dist/runtime/runtime.js +59 -0
  312. package/dist/runtime/runtime.js.map +1 -0
  313. package/dist/runtime/scheduler.d.ts +5 -1
  314. package/dist/runtime/scheduler.d.ts.map +1 -1
  315. package/dist/runtime/scheduler.js +17 -17
  316. package/dist/runtime/scheduler.js.map +1 -1
  317. package/dist/runtime/selector.js +4 -3
  318. package/dist/runtime/selector.js.map +1 -1
  319. package/dist/runtime/snapshot-source.d.ts +1 -1
  320. package/dist/runtime/snapshot-source.js +1 -1
  321. package/dist/runtime/state.js +2 -1
  322. package/dist/runtime/state.js.map +1 -1
  323. package/dist/ssg/batch-render.js +2 -1
  324. package/dist/ssg/batch-render.js.map +1 -1
  325. package/dist/ssg/create-static-gen.d.ts +9 -3
  326. package/dist/ssg/create-static-gen.d.ts.map +1 -1
  327. package/dist/ssg/create-static-gen.js +12 -99
  328. package/dist/ssg/create-static-gen.js.map +1 -1
  329. package/dist/ssg/generation-plan.js +70 -0
  330. package/dist/ssg/generation-plan.js.map +1 -0
  331. package/dist/ssg/incremental-manifest.js +1 -1
  332. package/dist/ssg/static-routes.js +101 -0
  333. package/dist/ssg/static-routes.js.map +1 -0
  334. package/dist/ssg/types.d.ts +15 -7
  335. package/dist/ssg/types.d.ts.map +1 -1
  336. package/dist/ssr/boundaries.js +113 -0
  337. package/dist/ssr/boundaries.js.map +1 -0
  338. package/dist/ssr/component-runtime.js +111 -0
  339. package/dist/ssr/component-runtime.js.map +1 -0
  340. package/dist/ssr/context.d.ts +3 -1
  341. package/dist/ssr/context.d.ts.map +1 -1
  342. package/dist/ssr/context.js +9 -2
  343. package/dist/ssr/context.js.map +1 -1
  344. package/dist/ssr/errors.d.ts +2 -0
  345. package/dist/ssr/errors.js +11 -1
  346. package/dist/ssr/errors.js.map +1 -1
  347. package/dist/ssr/escape.js +3 -3
  348. package/dist/ssr/escape.js.map +1 -1
  349. package/dist/ssr/hydration-data.js +10 -0
  350. package/dist/ssr/hydration-data.js.map +1 -0
  351. package/dist/ssr/hydration-verify.d.ts +12 -0
  352. package/dist/ssr/hydration-verify.d.ts.map +1 -0
  353. package/dist/ssr/hydration-verify.js +144 -0
  354. package/dist/ssr/hydration-verify.js.map +1 -0
  355. package/dist/ssr/index-internal.d.ts +15 -0
  356. package/dist/ssr/index-internal.d.ts.map +1 -0
  357. package/dist/ssr/index-internal.js +19 -0
  358. package/dist/ssr/index-internal.js.map +1 -0
  359. package/dist/ssr/index.d.ts +5 -57
  360. package/dist/ssr/index.js +3 -738
  361. package/dist/ssr/render-keys.js +9 -32
  362. package/dist/ssr/render-keys.js.map +1 -1
  363. package/dist/ssr/render-resolved.d.ts +1 -1
  364. package/dist/ssr/render-resolved.d.ts.map +1 -1
  365. package/dist/ssr/render-resolved.js +4 -2
  366. package/dist/ssr/render-resolved.js.map +1 -1
  367. package/dist/ssr/render-sync.d.ts +21 -0
  368. package/dist/ssr/render-sync.d.ts.map +1 -0
  369. package/dist/ssr/render-sync.js +275 -0
  370. package/dist/ssr/render-sync.js.map +1 -0
  371. package/dist/ssr/route-policy-resolution.js +77 -0
  372. package/dist/ssr/route-policy-resolution.js.map +1 -0
  373. package/dist/ssr/route-render.d.ts +77 -0
  374. package/dist/ssr/route-render.d.ts.map +1 -0
  375. package/dist/ssr/route-render.js +119 -0
  376. package/dist/ssr/route-render.js.map +1 -0
  377. package/dist/ssr/sink.d.ts +26 -0
  378. package/dist/ssr/sink.d.ts.map +1 -0
  379. package/dist/ssr/types.d.ts +1 -0
  380. package/dist/ssr/types.d.ts.map +1 -1
  381. package/dist/ssr/verify-hydration.js.map +1 -1
  382. package/dist/testing/index.d.ts +1 -2
  383. package/dist/testing/index.d.ts.map +1 -1
  384. package/dist/testing/index.js +2 -1
  385. package/dist/testing/index.js.map +1 -1
  386. package/package.json +4 -3
  387. package/dist/data/index.d.ts.map +0 -1
  388. package/dist/data/index.js.map +0 -1
  389. package/dist/renderer/dom.js.map +0 -1
  390. package/dist/router/route.d.ts.map +0 -1
  391. package/dist/router/route.js.map +0 -1
  392. package/dist/runtime/component.d.ts.map +0 -1
  393. package/dist/runtime/component.js.map +0 -1
  394. package/dist/runtime/for.d.ts.map +0 -1
  395. package/dist/runtime/for.js.map +0 -1
  396. package/dist/runtime/operations.d.ts.map +0 -1
  397. package/dist/runtime/operations.js.map +0 -1
  398. package/dist/runtime/ssr-bridge.js +0 -24
  399. package/dist/runtime/ssr-bridge.js.map +0 -1
  400. package/dist/ssr/index.d.ts.map +0 -1
  401. package/dist/ssr/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fastlane.js","names":[],"sources":["../../src/runtime/fastlane.ts"],"sourcesContent":["import { isDevelopmentEnvironment } from '../common/env';\nimport { globalScheduler } from './scheduler';\nimport { logger } from '../dev/logger';\nimport type { ComponentInstance } from './component';\nimport { finalizeReadableSubscriptions } from './readable';\nimport {\n getKeyMapForElement,\n isKeyedReorderFastPathEligible,\n populateKeyMapForElement,\n} from '../renderer/keyed';\nimport { Fragment } from '../common/jsx';\nimport { setDevValue, getDevValue, getDevNamespace } from './dev-namespace';\n\nlet _bulkCommitActive = false;\nlet _appliedParents: WeakSet<Element> | null = null;\n\nexport function enterBulkCommit(): void {\n _bulkCommitActive = true;\n // Initialize registry of parents that had fast-path applied during this bulk commit\n _appliedParents = new WeakSet<Element>();\n setDevValue('__ASKR_FASTLANE_CLEARED_TASKS', 0);\n}\n\nexport function exitBulkCommit(): void {\n _bulkCommitActive = false;\n // Clear registry to avoid leaking across commits\n _appliedParents = null;\n}\n\nexport function isBulkCommitActive(): boolean {\n return _bulkCommitActive;\n}\n\n// Mark that a fast-path was applied on a parent element during the active\n// bulk commit. No-op if there is no active bulk commit.\nexport function markFastPathApplied(parent: Element): void {\n if (!_appliedParents) return;\n try {\n _appliedParents.add(parent);\n } catch (e) {\n void e;\n }\n}\n\nexport function isFastPathApplied(parent: Element): boolean {\n return !!(_appliedParents && _appliedParents.has(parent));\n}\n\nfunction finalizeReadSubscriptions(instance: ComponentInstance): void {\n finalizeReadableSubscriptions(instance);\n}\n\n/**\n * Attempt to execute a runtime fast-lane for a single component's synchronous\n * render result. Returns true if the fast-lane was used and commit was done.\n *\n * Preconditions (checked conservatively):\n * - The render result is an intrinsic element root with keyed children\n * - The renderer's fast-path heuristics indicate to use the fast-path\n * - No mount operations are pending on the component instance\n * - No child vnodes are component functions (avoid async/component mounts)\n */\n\n// Helper to unwrap Fragment vnodes to get the first intrinsic element child\nfunction unwrapFragmentForFastPath(vnode: unknown): unknown {\n if (!vnode || typeof vnode !== 'object' || !('type' in vnode)) return vnode;\n const v = vnode as {\n type: unknown;\n children?: unknown;\n props?: { children?: unknown };\n };\n // Check if it's a Fragment\n if (\n typeof v.type === 'symbol' &&\n (v.type === Fragment || String(v.type) === 'Symbol(askr.fragment)')\n ) {\n const children = v.props?.children ?? v.children;\n if (Array.isArray(children) && children.length > 0) {\n // Return the first child that's an intrinsic element\n for (const child of children) {\n if (child && typeof child === 'object' && 'type' in child) {\n const c = child as { type: unknown };\n if (typeof c.type === 'string') {\n return child;\n }\n }\n }\n }\n }\n return vnode;\n}\n\nexport function classifyUpdate(instance: ComponentInstance, result: unknown) {\n // Returns a classification describing whether this update is eligible for\n // the reorder-only fast-lane. The classifier mirrors renderer-level\n // heuristics and performs runtime-level checks (mounts, effects, component\n // children) that the renderer cannot reason about.\n\n // Unwrap Fragment to get the actual element vnode for classification\n const unwrappedResult = unwrapFragmentForFastPath(result);\n\n if (\n !unwrappedResult ||\n typeof unwrappedResult !== 'object' ||\n !('type' in unwrappedResult)\n )\n return { useFastPath: false, reason: 'not-vnode' };\n\n const vnode = unwrappedResult as {\n type: unknown;\n children?: unknown;\n props?: { children?: unknown };\n };\n if (vnode == null || typeof vnode.type !== 'string')\n return { useFastPath: false, reason: 'not-intrinsic' };\n\n const parent = instance.target;\n if (!parent) return { useFastPath: false, reason: 'no-root' };\n\n const firstChild = parent.children[0] as Element | undefined;\n if (!firstChild) return { useFastPath: false, reason: 'no-first-child' };\n if (firstChild.tagName.toLowerCase() !== String(vnode.type).toLowerCase())\n return { useFastPath: false, reason: 'root-tag-mismatch' };\n\n const children = vnode.props?.children ?? vnode.children;\n if (!Array.isArray(children))\n return { useFastPath: false, reason: 'no-children-array' };\n\n // Avoid component child vnodes (they may mount/unmount or trigger async)\n for (const c of children) {\n if (\n typeof c === 'object' &&\n c !== null &&\n 'type' in c &&\n typeof (c as { type?: unknown }).type === 'function'\n ) {\n return { useFastPath: false, reason: 'component-child-present' };\n }\n }\n\n if ((instance.mountOperations?.length ?? 0) > 0)\n return { useFastPath: false, reason: 'pending-mounts' };\n if ((instance.commitOperations?.length ?? 0) > 0)\n return { useFastPath: false, reason: 'pending-lifecycle-commits' };\n\n // Ask renderer for keyed reorder eligibility (prop differences & heuristics)\n // Ensure a keyed map is available for the first child by populating it proactively.\n try {\n populateKeyMapForElement(firstChild);\n } catch {\n // ignore\n }\n\n const oldKeyMap = getKeyMapForElement(firstChild);\n const decision = isKeyedReorderFastPathEligible(\n firstChild,\n children,\n oldKeyMap\n );\n\n if (!decision.useFastPath || decision.totalKeyed < 128)\n return { ...decision, useFastPath: false, reason: 'renderer-declined' };\n\n return { ...decision, useFastPath: true } as const;\n}\n\nexport function commitReorderOnly(\n instance: ComponentInstance,\n result: unknown\n): boolean {\n // Performs the minimal, synchronous reorder-only commit.\n const evaluate = (\n globalThis as {\n __ASKR_RENDERER?: {\n evaluate?: (node: unknown, target: Element | null) => void;\n };\n }\n ).__ASKR_RENDERER?.evaluate;\n\n if (typeof evaluate !== 'function') {\n logger.warn(\n '[Tempo][FASTPATH][DEV] renderer.evaluate not available; declining fast-lane'\n );\n return false;\n }\n\n const schedBefore = isDevelopmentEnvironment()\n ? globalScheduler.getState()\n : null;\n\n enterBulkCommit();\n\n try {\n globalScheduler.runWithSyncProgress(() => {\n evaluate(result, instance.target);\n\n // Finalize runtime bookkeeping (read subscriptions / tokens)\n try {\n finalizeReadSubscriptions(instance);\n } catch (e) {\n if (isDevelopmentEnvironment()) throw e;\n }\n });\n\n setDevValue('__FASTLANE_CLEARED_AFTER', 0);\n\n // Dev-only invariant checks\n if (isDevelopmentEnvironment()) {\n validateFastLaneInvariants(instance, schedBefore);\n }\n\n return true;\n } finally {\n // Clear bulk commit flag first\n exitBulkCommit();\n }\n // Note: The original code had a check here that was dead code because\n // exitBulkCommit() already ran in the finally block. This comment serves\n // as documentation that we've intentionally removed that unreachable code.\n}\n\n/**\n * Validates fast-lane invariants in dev mode.\n * Extracted to reduce complexity in commitReorderOnly.\n */\nfunction validateFastLaneInvariants(\n instance: ComponentInstance,\n schedBefore: ReturnType<typeof globalScheduler.getState> | null\n): void {\n const commitCount = getDevValue<number>('__LAST_FASTPATH_COMMIT_COUNT') ?? 0;\n const invariants = {\n commitCount,\n mountOps: instance.mountOperations?.length ?? 0,\n commitOps: instance.commitOperations?.length ?? 0,\n cleanupFns: instance.cleanupFns?.length ?? 0,\n };\n setDevValue('__LAST_FASTLANE_INVARIANTS', invariants);\n\n if (commitCount !== 1) {\n console.error(\n '[FASTLANE][INV] commitCount',\n commitCount,\n 'diag',\n getDevNamespace()\n );\n throw new Error(\n 'Fast-lane invariant violated: expected exactly one DOM commit during reorder-only commit'\n );\n }\n\n if (invariants.mountOps > 0) {\n throw new Error(\n 'Fast-lane invariant violated: mount operations were registered during bulk commit'\n );\n }\n\n if (invariants.commitOps > 0) {\n throw new Error(\n 'Fast-lane invariant violated: lifecycle commit operations were registered during bulk commit'\n );\n }\n\n if (invariants.cleanupFns > 0) {\n throw new Error(\n 'Fast-lane invariant violated: cleanup functions were added during bulk commit'\n );\n }\n\n const schedAfter = globalScheduler.getState();\n if (\n schedBefore &&\n schedAfter &&\n schedAfter.taskCount > schedBefore.taskCount\n ) {\n console.error(\n '[FASTLANE] schedBefore, schedAfter',\n schedBefore,\n schedAfter\n );\n console.error('[FASTLANE] enqueue logs', getDevValue('__ENQUEUE_LOGS'));\n throw new Error(\n 'Fast-lane invariant violated: scheduler enqueued leftover work during bulk commit'\n );\n }\n}\n\nexport function tryRuntimeFastLaneSync(\n instance: ComponentInstance,\n result: unknown\n): boolean {\n const cls = classifyUpdate(instance, result);\n if (!cls.useFastPath) {\n // Clear stale fast-path diagnostics\n setDevValue('__LAST_FASTPATH_STATS', undefined);\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 0);\n return false;\n }\n\n try {\n return commitReorderOnly(instance, result);\n } catch (err) {\n // Surface dev-only invariant failures, otherwise decline silently\n if (isDevelopmentEnvironment()) throw err;\n return false;\n }\n}\n\n// Expose fastlane bridge on globalThis for environments/tests\nif (typeof globalThis !== 'undefined') {\n (globalThis as Record<string, unknown>).__ASKR_FASTLANE = {\n isBulkCommitActive,\n enterBulkCommit,\n exitBulkCommit,\n tryRuntimeFastLaneSync,\n markFastPathApplied,\n isFastPathApplied,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fastlane.js","names":[],"sources":["../../src/runtime/fastlane.ts"],"sourcesContent":["import { isDevelopmentEnvironment } from '../common/env';\nimport {\n getRuntimeRenderer,\n getRuntimeSchedulerState,\n runRuntimeWithSyncProgress,\n setRuntimeBulkCommitProbe,\n} from './access';\nimport type { ComponentInstance } from './component';\nimport { finalizeReadableSubscriptions } from './readable';\nimport { Fragment } from '../common/jsx';\nimport { setDevValue, getDevValue, getDevNamespace } from './dev-namespace';\n\nlet _bulkCommitActive = false;\nlet _appliedParents: WeakSet<Element> | null = null;\n\nexport function enterBulkCommit(): void {\n _bulkCommitActive = true;\n // Initialize registry of parents that had fast-path applied during this bulk commit\n _appliedParents = new WeakSet<Element>();\n setDevValue('__FASTLANE_CLEARED_TASKS', 0);\n}\n\nexport function exitBulkCommit(): void {\n _bulkCommitActive = false;\n // Clear registry to avoid leaking across commits\n _appliedParents = null;\n}\n\nexport function isBulkCommitActive(): boolean {\n return _bulkCommitActive;\n}\n\n// Mark that a fast-path was applied on a parent element during the active\n// bulk commit. No-op if there is no active bulk commit.\nexport function markFastPathApplied(parent: Element): void {\n if (!_appliedParents) return;\n try {\n _appliedParents.add(parent);\n } catch (e) {\n void e;\n }\n}\n\nexport function isFastPathApplied(parent: Element): boolean {\n return !!(_appliedParents && _appliedParents.has(parent));\n}\n\nfunction finalizeReadSubscriptions(instance: ComponentInstance): void {\n finalizeReadableSubscriptions(instance);\n}\n\n/**\n * Attempt to execute a runtime fast-lane for a single component's synchronous\n * render result. Returns true if the fast-lane was used and commit was done.\n *\n * Preconditions (checked conservatively):\n * - The render result is an intrinsic element root with keyed children\n * - The renderer's fast-path heuristics indicate to use the fast-path\n * - No mount operations are pending on the component instance\n * - No child vnodes are component functions (avoid async/component mounts)\n */\n\n// Helper to unwrap Fragment vnodes to get the first intrinsic element child\nfunction unwrapFragmentForFastPath(vnode: unknown): unknown {\n if (!vnode || typeof vnode !== 'object' || !('type' in vnode)) return vnode;\n const v = vnode as {\n type: unknown;\n children?: unknown;\n props?: { children?: unknown };\n };\n // Check if it's a Fragment\n if (\n typeof v.type === 'symbol' &&\n (v.type === Fragment || String(v.type) === 'Symbol(askr.fragment)')\n ) {\n const children = v.props?.children ?? v.children;\n if (Array.isArray(children) && children.length > 0) {\n // Return the first child that's an intrinsic element\n for (const child of children) {\n if (child && typeof child === 'object' && 'type' in child) {\n const c = child as { type: unknown };\n if (typeof c.type === 'string') {\n return child;\n }\n }\n }\n }\n }\n return vnode;\n}\n\nexport function classifyUpdate(instance: ComponentInstance, result: unknown) {\n // Returns a classification describing whether this update is eligible for\n // the reorder-only fast-lane. The classifier mirrors renderer-level\n // heuristics and performs runtime-level checks (mounts, effects, component\n // children) that the renderer cannot reason about.\n\n // Unwrap Fragment to get the actual element vnode for classification\n const unwrappedResult = unwrapFragmentForFastPath(result);\n\n if (\n !unwrappedResult ||\n typeof unwrappedResult !== 'object' ||\n !('type' in unwrappedResult)\n )\n return { useFastPath: false, reason: 'not-vnode' };\n\n const vnode = unwrappedResult as {\n type: unknown;\n children?: unknown;\n props?: { children?: unknown };\n };\n if (vnode == null || typeof vnode.type !== 'string')\n return { useFastPath: false, reason: 'not-intrinsic' };\n\n const parent = instance.target;\n if (!parent) return { useFastPath: false, reason: 'no-root' };\n\n const firstChild = parent.children[0] as Element | undefined;\n if (!firstChild) return { useFastPath: false, reason: 'no-first-child' };\n if (firstChild.tagName.toLowerCase() !== String(vnode.type).toLowerCase())\n return { useFastPath: false, reason: 'root-tag-mismatch' };\n\n const children = vnode.props?.children ?? vnode.children;\n if (!Array.isArray(children))\n return { useFastPath: false, reason: 'no-children-array' };\n\n // Avoid component child vnodes (they may mount/unmount or trigger async)\n for (const c of children) {\n if (\n typeof c === 'object' &&\n c !== null &&\n 'type' in c &&\n typeof (c as { type?: unknown }).type === 'function'\n ) {\n return { useFastPath: false, reason: 'component-child-present' };\n }\n }\n\n if ((instance.mountOperations?.length ?? 0) > 0)\n return { useFastPath: false, reason: 'pending-mounts' };\n if ((instance.commitOperations?.length ?? 0) > 0)\n return { useFastPath: false, reason: 'pending-lifecycle-commits' };\n\n // Ask renderer for keyed reorder eligibility (prop differences & heuristics)\n // Ensure a keyed map is available for the first child by populating it proactively.\n const renderer = getRuntimeRenderer();\n try {\n renderer.populateKeyMapForElement(firstChild);\n } catch {\n // ignore\n }\n\n const oldKeyMap = renderer.getKeyMapForElement(firstChild);\n const decision = renderer.isKeyedReorderFastPathEligible(\n firstChild,\n children,\n oldKeyMap\n );\n\n if (!decision.useFastPath || decision.totalKeyed < 128)\n return { ...decision, useFastPath: false, reason: 'renderer-declined' };\n\n return { ...decision, useFastPath: true } as const;\n}\n\nexport function commitReorderOnly(\n instance: ComponentInstance,\n result: unknown\n): boolean {\n // Performs the minimal, synchronous reorder-only commit.\n const renderer = getRuntimeRenderer();\n\n const schedBefore = isDevelopmentEnvironment()\n ? getRuntimeSchedulerState()\n : null;\n\n enterBulkCommit();\n\n try {\n runRuntimeWithSyncProgress(() => {\n renderer.evaluate(result, instance.target);\n\n // Finalize runtime bookkeeping (read subscriptions / tokens)\n try {\n finalizeReadSubscriptions(instance);\n } catch (e) {\n if (isDevelopmentEnvironment()) throw e;\n }\n });\n\n setDevValue('__FASTLANE_CLEARED_AFTER', 0);\n\n // Dev-only invariant checks\n if (isDevelopmentEnvironment()) {\n validateFastLaneInvariants(instance, schedBefore);\n }\n\n return true;\n } finally {\n // Clear bulk commit flag first\n exitBulkCommit();\n }\n // Note: The original code had a check here that was dead code because\n // exitBulkCommit() already ran in the finally block. This comment serves\n // as documentation that we've intentionally removed that unreachable code.\n}\n\n/**\n * Validates fast-lane invariants in dev mode.\n * Extracted to reduce complexity in commitReorderOnly.\n */\nfunction validateFastLaneInvariants(\n instance: ComponentInstance,\n schedBefore: ReturnType<typeof getRuntimeSchedulerState> | null\n): void {\n const commitCount = getDevValue<number>('__LAST_FASTPATH_COMMIT_COUNT') ?? 0;\n const invariants = {\n commitCount,\n mountOps: instance.mountOperations?.length ?? 0,\n commitOps: instance.commitOperations?.length ?? 0,\n cleanupFns: instance.cleanupFns?.length ?? 0,\n };\n setDevValue('__LAST_FASTLANE_INVARIANTS', invariants);\n\n if (commitCount !== 1) {\n console.error(\n '[FASTLANE][INV] commitCount',\n commitCount,\n 'diag',\n getDevNamespace()\n );\n throw new Error(\n 'Fast-lane invariant violated: expected exactly one DOM commit during reorder-only commit'\n );\n }\n\n if (invariants.mountOps > 0) {\n throw new Error(\n 'Fast-lane invariant violated: mount operations were registered during bulk commit'\n );\n }\n\n if (invariants.commitOps > 0) {\n throw new Error(\n 'Fast-lane invariant violated: lifecycle commit operations were registered during bulk commit'\n );\n }\n\n if (invariants.cleanupFns > 0) {\n throw new Error(\n 'Fast-lane invariant violated: cleanup functions were added during bulk commit'\n );\n }\n\n const schedAfter = getRuntimeSchedulerState();\n if (\n schedBefore &&\n schedAfter &&\n schedAfter.taskCount > schedBefore.taskCount\n ) {\n console.error(\n '[FASTLANE] schedBefore, schedAfter',\n schedBefore,\n schedAfter\n );\n console.error('[FASTLANE] enqueue logs', getDevValue('__ENQUEUE_LOGS'));\n throw new Error(\n 'Fast-lane invariant violated: scheduler enqueued leftover work during bulk commit'\n );\n }\n}\n\nexport function tryRuntimeFastLaneSync(\n instance: ComponentInstance,\n result: unknown\n): boolean {\n const cls = classifyUpdate(instance, result);\n if (!cls.useFastPath) {\n // Clear stale fast-path diagnostics\n setDevValue('__LAST_FASTPATH_STATS', undefined);\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 0);\n return false;\n }\n\n try {\n return commitReorderOnly(instance, result);\n } catch (err) {\n // Surface dev-only invariant failures, otherwise decline silently\n if (isDevelopmentEnvironment()) throw err;\n return false;\n }\n}\n\nsetRuntimeBulkCommitProbe(isBulkCommitActive);\n"],"mappings":"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"}
@@ -37,5 +37,5 @@ declare const getBenchMetrics: () => BenchMetrics;
37
37
  declare const flushBenchMetrics: () => void;
38
38
  declare const isBenchBuildEnabled: () => boolean;
39
39
  //#endregion
40
- export { getBenchMetrics, isBenchMetricScopeActive, recordBenchCounter, recordBenchEvent, recordBenchTiming, resetBenchMetrics, withBenchMetricScope };
40
+ export { BenchEvent, BenchMetrics };
41
41
  //# sourceMappingURL=for-bench.d.ts.map
@@ -26,7 +26,6 @@ function createInitialBenchMetrics() {
26
26
  fastLaneName: null
27
27
  };
28
28
  }
29
- const emptyBenchMetrics = createInitialBenchMetrics();
30
29
  let activeBenchMetricScope = null;
31
30
  function isBenchRuntimeEnabled() {
32
31
  if (!BENCH_BUILD_ENABLED) return false;
@@ -154,7 +153,6 @@ const recordBenchTimingLive = (phase, ms) => {
154
153
  if (phase === "reconcile") benchMetrics.reconcilePhaseMs = ms;
155
154
  else benchMetrics.domCommitPhaseMs = ms;
156
155
  };
157
- const getBenchMetricsLive = () => benchMetrics ? { ...benchMetrics } : { ...emptyBenchMetrics };
158
156
  const resetBenchMetrics = BENCH_BUILD_ENABLED ? () => {
159
157
  if (!isBenchRuntimeEnabled() || !benchMetrics) return;
160
158
  resetBenchMetricsLive(benchMetrics);
@@ -165,10 +163,9 @@ const recordBenchTiming = BENCH_BUILD_ENABLED ? recordBenchTimingLive : (_phase,
165
163
  const recordBenchCounter = BENCH_BUILD_ENABLED ? recordBenchCounterLive : (_counter, _delta = 1) => {};
166
164
  const withBenchMetricScope = BENCH_BUILD_ENABLED ? withBenchMetricScopeLive : (_scope, run) => run();
167
165
  const isBenchMetricScopeActive = BENCH_BUILD_ENABLED ? isBenchMetricScopeActiveLive : (_scope) => false;
168
- const getBenchMetrics = BENCH_BUILD_ENABLED ? getBenchMetricsLive : () => ({ ...emptyBenchMetrics });
169
166
  const flushBenchMetrics = BENCH_BUILD_ENABLED ? flushBenchMetricsLive : () => {};
170
167
  const isBenchBuildEnabled = () => BENCH_BUILD_ENABLED;
171
168
  //#endregion
172
- export { flushBenchMetrics, getBenchMetrics, isBenchBuildEnabled, isBenchMetricScopeActive, recordBenchCounter, recordBenchEvent, recordBenchFastLane, recordBenchTiming, resetBenchMetrics, withBenchMetricScope };
169
+ export { flushBenchMetrics, isBenchBuildEnabled, isBenchMetricScopeActive, recordBenchCounter, recordBenchEvent, recordBenchFastLane, recordBenchTiming, resetBenchMetrics, withBenchMetricScope };
173
170
 
174
171
  //# sourceMappingURL=for-bench.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"for-bench.js","names":[],"sources":["../../src/runtime/for-bench.ts"],"sourcesContent":["import { isRuntimeEnvFlagEnabled } from '../common/env';\n\nconst BENCH_BUILD_ENABLED = isRuntimeEnvFlagEnabled('ASKR_BENCH');\n\ntype BenchGlobal = typeof globalThis & {\n __ASKR_BENCH__?: boolean;\n __ASKR_FOR_BENCH__?: BenchMetrics;\n};\n\nexport interface BenchMetrics {\n itemsCreated: number;\n itemsReused: number;\n itemsRemoved: number;\n itemsMoved: number;\n rowFactoryInvocations: number;\n keyLookups: number;\n keyHits: number;\n keyMisses: number;\n domInserts: number;\n domRemoves: number;\n domMoves: number;\n domAttrSets: number;\n domTextSets: number;\n domNodesCreated: number;\n listenerBindings: number;\n reactivePropsMounted: number;\n replaceChildrenCommits: number;\n bulkClearCommits: number;\n reconcilePhaseMs: number;\n domCommitPhaseMs: number;\n fastLaneName: string | null;\n}\n\nexport type BenchEvent =\n | 'itemCreated'\n | 'itemReused'\n | 'itemRemoved'\n | 'itemMoved'\n | 'rowFactory'\n | 'keyLookup'\n | 'keyHit'\n | 'keyMiss'\n | 'domInsert'\n | 'domRemove'\n | 'domMove'\n | 'domAttrSet'\n | 'domTextSet';\n\nfunction createInitialBenchMetrics(): BenchMetrics {\n return {\n itemsCreated: 0,\n itemsReused: 0,\n itemsRemoved: 0,\n itemsMoved: 0,\n rowFactoryInvocations: 0,\n keyLookups: 0,\n keyHits: 0,\n keyMisses: 0,\n domInserts: 0,\n domRemoves: 0,\n domMoves: 0,\n domAttrSets: 0,\n domTextSets: 0,\n domNodesCreated: 0,\n listenerBindings: 0,\n reactivePropsMounted: 0,\n replaceChildrenCommits: 0,\n bulkClearCommits: 0,\n reconcilePhaseMs: 0,\n domCommitPhaseMs: 0,\n fastLaneName: null,\n };\n}\n\nconst emptyBenchMetrics = createInitialBenchMetrics();\ntype BenchMetricScope = 'coldCreate' | 'fullClear';\ntype BenchCounter =\n | 'domNodesCreated'\n | 'listenerBindings'\n | 'reactivePropsMounted'\n | 'replaceChildrenCommits'\n | 'bulkClearCommits';\nlet activeBenchMetricScope: BenchMetricScope | null = null;\n\nfunction isBenchRuntimeEnabled(): boolean {\n if (!BENCH_BUILD_ENABLED) {\n return false;\n }\n\n try {\n return !!(globalThis as BenchGlobal).__ASKR_BENCH__;\n } catch {\n return false;\n }\n}\n\nfunction publishBenchMetrics(metrics: BenchMetrics): void {\n if (!isBenchRuntimeEnabled()) {\n return;\n }\n\n (globalThis as BenchGlobal).__ASKR_FOR_BENCH__ = { ...metrics };\n}\n\nconst flushBenchMetricsLive = (): void => {\n if (!benchMetrics) {\n return;\n }\n\n publishBenchMetrics(benchMetrics);\n};\n\nfunction resetBenchMetricsLive(metrics: BenchMetrics): void {\n metrics.itemsCreated = 0;\n metrics.itemsReused = 0;\n metrics.itemsRemoved = 0;\n metrics.itemsMoved = 0;\n metrics.rowFactoryInvocations = 0;\n metrics.keyLookups = 0;\n metrics.keyHits = 0;\n metrics.keyMisses = 0;\n metrics.domInserts = 0;\n metrics.domRemoves = 0;\n metrics.domMoves = 0;\n metrics.domAttrSets = 0;\n metrics.domTextSets = 0;\n metrics.domNodesCreated = 0;\n metrics.listenerBindings = 0;\n metrics.reactivePropsMounted = 0;\n metrics.replaceChildrenCommits = 0;\n metrics.bulkClearCommits = 0;\n metrics.reconcilePhaseMs = 0;\n metrics.domCommitPhaseMs = 0;\n metrics.fastLaneName = null;\n publishBenchMetrics(metrics);\n}\n\nconst benchMetrics = BENCH_BUILD_ENABLED ? createInitialBenchMetrics() : null;\n\nconst recordBenchEventLive = (event: BenchEvent, delta = 1): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n if (delta === 0) {\n return;\n }\n\n switch (event) {\n case 'itemCreated':\n benchMetrics.itemsCreated += delta;\n break;\n case 'itemReused':\n benchMetrics.itemsReused += delta;\n break;\n case 'itemRemoved':\n benchMetrics.itemsRemoved += delta;\n break;\n case 'itemMoved':\n benchMetrics.itemsMoved += delta;\n break;\n case 'rowFactory':\n benchMetrics.rowFactoryInvocations += delta;\n break;\n case 'keyLookup':\n benchMetrics.keyLookups += delta;\n break;\n case 'keyHit':\n benchMetrics.keyHits += delta;\n break;\n case 'keyMiss':\n benchMetrics.keyMisses += delta;\n break;\n case 'domInsert':\n benchMetrics.domInserts += delta;\n break;\n case 'domRemove':\n benchMetrics.domRemoves += delta;\n break;\n case 'domMove':\n benchMetrics.domMoves += delta;\n break;\n case 'domAttrSet':\n benchMetrics.domAttrSets += delta;\n break;\n case 'domTextSet':\n benchMetrics.domTextSets += delta;\n break;\n }\n};\n\nconst recordBenchFastLaneLive = (name: string): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n benchMetrics.fastLaneName = name;\n};\n\nconst recordBenchCounterLive = (counter: BenchCounter, delta = 1): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics || delta === 0) {\n return;\n }\n\n switch (counter) {\n case 'domNodesCreated':\n benchMetrics.domNodesCreated += delta;\n break;\n case 'listenerBindings':\n benchMetrics.listenerBindings += delta;\n break;\n case 'reactivePropsMounted':\n benchMetrics.reactivePropsMounted += delta;\n break;\n case 'replaceChildrenCommits':\n benchMetrics.replaceChildrenCommits += delta;\n break;\n case 'bulkClearCommits':\n benchMetrics.bulkClearCommits += delta;\n break;\n }\n};\n\nfunction withBenchMetricScopeLive<T>(scope: BenchMetricScope, run: () => T): T {\n if (!isBenchRuntimeEnabled()) {\n return run();\n }\n\n const previousScope = activeBenchMetricScope;\n activeBenchMetricScope = scope;\n\n try {\n return run();\n } finally {\n activeBenchMetricScope = previousScope;\n }\n}\n\nconst isBenchMetricScopeActiveLive = (scope: BenchMetricScope): boolean =>\n isBenchRuntimeEnabled() && activeBenchMetricScope === scope;\n\nconst recordBenchTimingLive = (\n phase: 'reconcile' | 'domCommit',\n ms: number\n): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n if (phase === 'reconcile') {\n benchMetrics.reconcilePhaseMs = ms;\n } else {\n benchMetrics.domCommitPhaseMs = ms;\n }\n};\n\nconst getBenchMetricsLive = (): BenchMetrics =>\n benchMetrics ? { ...benchMetrics } : { ...emptyBenchMetrics };\n\nexport const resetBenchMetrics = BENCH_BUILD_ENABLED\n ? (): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n resetBenchMetricsLive(benchMetrics);\n }\n : (): void => {};\n\nexport const recordBenchEvent = BENCH_BUILD_ENABLED\n ? recordBenchEventLive\n : (_event: BenchEvent): void => {};\n\nexport const recordBenchFastLane = BENCH_BUILD_ENABLED\n ? recordBenchFastLaneLive\n : (_name: string): void => {};\n\nexport const recordBenchTiming = BENCH_BUILD_ENABLED\n ? recordBenchTimingLive\n : (_phase: 'reconcile' | 'domCommit', _ms: number): void => {};\n\nexport const recordBenchCounter = BENCH_BUILD_ENABLED\n ? recordBenchCounterLive\n : (_counter: BenchCounter, _delta = 1): void => {};\n\nexport const withBenchMetricScope = BENCH_BUILD_ENABLED\n ? withBenchMetricScopeLive\n : <T>(_scope: BenchMetricScope, run: () => T): T => run();\n\nexport const isBenchMetricScopeActive = BENCH_BUILD_ENABLED\n ? isBenchMetricScopeActiveLive\n : (_scope: BenchMetricScope): boolean => false;\n\nexport const getBenchMetrics = BENCH_BUILD_ENABLED\n ? getBenchMetricsLive\n : (): BenchMetrics => ({ ...emptyBenchMetrics });\n\nexport const flushBenchMetrics = BENCH_BUILD_ENABLED\n ? flushBenchMetricsLive\n : (): void => {};\n\nexport const isBenchBuildEnabled = (): boolean => BENCH_BUILD_ENABLED;\n"],"mappings":"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"}
1
+ {"version":3,"file":"for-bench.js","names":[],"sources":["../../src/runtime/for-bench.ts"],"sourcesContent":["import { isRuntimeEnvFlagEnabled } from '../common/env';\n\nconst BENCH_BUILD_ENABLED = isRuntimeEnvFlagEnabled('ASKR_BENCH');\n\ntype BenchGlobal = typeof globalThis & {\n __ASKR_BENCH__?: boolean;\n __ASKR_FOR_BENCH__?: BenchMetrics;\n};\n\nexport interface BenchMetrics {\n itemsCreated: number;\n itemsReused: number;\n itemsRemoved: number;\n itemsMoved: number;\n rowFactoryInvocations: number;\n keyLookups: number;\n keyHits: number;\n keyMisses: number;\n domInserts: number;\n domRemoves: number;\n domMoves: number;\n domAttrSets: number;\n domTextSets: number;\n domNodesCreated: number;\n listenerBindings: number;\n reactivePropsMounted: number;\n replaceChildrenCommits: number;\n bulkClearCommits: number;\n reconcilePhaseMs: number;\n domCommitPhaseMs: number;\n fastLaneName: string | null;\n}\n\nexport type BenchEvent =\n | 'itemCreated'\n | 'itemReused'\n | 'itemRemoved'\n | 'itemMoved'\n | 'rowFactory'\n | 'keyLookup'\n | 'keyHit'\n | 'keyMiss'\n | 'domInsert'\n | 'domRemove'\n | 'domMove'\n | 'domAttrSet'\n | 'domTextSet';\n\nfunction createInitialBenchMetrics(): BenchMetrics {\n return {\n itemsCreated: 0,\n itemsReused: 0,\n itemsRemoved: 0,\n itemsMoved: 0,\n rowFactoryInvocations: 0,\n keyLookups: 0,\n keyHits: 0,\n keyMisses: 0,\n domInserts: 0,\n domRemoves: 0,\n domMoves: 0,\n domAttrSets: 0,\n domTextSets: 0,\n domNodesCreated: 0,\n listenerBindings: 0,\n reactivePropsMounted: 0,\n replaceChildrenCommits: 0,\n bulkClearCommits: 0,\n reconcilePhaseMs: 0,\n domCommitPhaseMs: 0,\n fastLaneName: null,\n };\n}\n\nconst emptyBenchMetrics = createInitialBenchMetrics();\ntype BenchMetricScope = 'coldCreate' | 'fullClear';\ntype BenchCounter =\n | 'domNodesCreated'\n | 'listenerBindings'\n | 'reactivePropsMounted'\n | 'replaceChildrenCommits'\n | 'bulkClearCommits';\nlet activeBenchMetricScope: BenchMetricScope | null = null;\n\nfunction isBenchRuntimeEnabled(): boolean {\n if (!BENCH_BUILD_ENABLED) {\n return false;\n }\n\n try {\n return !!(globalThis as BenchGlobal).__ASKR_BENCH__;\n } catch {\n return false;\n }\n}\n\nfunction publishBenchMetrics(metrics: BenchMetrics): void {\n if (!isBenchRuntimeEnabled()) {\n return;\n }\n\n (globalThis as BenchGlobal).__ASKR_FOR_BENCH__ = { ...metrics };\n}\n\nconst flushBenchMetricsLive = (): void => {\n if (!benchMetrics) {\n return;\n }\n\n publishBenchMetrics(benchMetrics);\n};\n\nfunction resetBenchMetricsLive(metrics: BenchMetrics): void {\n metrics.itemsCreated = 0;\n metrics.itemsReused = 0;\n metrics.itemsRemoved = 0;\n metrics.itemsMoved = 0;\n metrics.rowFactoryInvocations = 0;\n metrics.keyLookups = 0;\n metrics.keyHits = 0;\n metrics.keyMisses = 0;\n metrics.domInserts = 0;\n metrics.domRemoves = 0;\n metrics.domMoves = 0;\n metrics.domAttrSets = 0;\n metrics.domTextSets = 0;\n metrics.domNodesCreated = 0;\n metrics.listenerBindings = 0;\n metrics.reactivePropsMounted = 0;\n metrics.replaceChildrenCommits = 0;\n metrics.bulkClearCommits = 0;\n metrics.reconcilePhaseMs = 0;\n metrics.domCommitPhaseMs = 0;\n metrics.fastLaneName = null;\n publishBenchMetrics(metrics);\n}\n\nconst benchMetrics = BENCH_BUILD_ENABLED ? createInitialBenchMetrics() : null;\n\nconst recordBenchEventLive = (event: BenchEvent, delta = 1): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n if (delta === 0) {\n return;\n }\n\n switch (event) {\n case 'itemCreated':\n benchMetrics.itemsCreated += delta;\n break;\n case 'itemReused':\n benchMetrics.itemsReused += delta;\n break;\n case 'itemRemoved':\n benchMetrics.itemsRemoved += delta;\n break;\n case 'itemMoved':\n benchMetrics.itemsMoved += delta;\n break;\n case 'rowFactory':\n benchMetrics.rowFactoryInvocations += delta;\n break;\n case 'keyLookup':\n benchMetrics.keyLookups += delta;\n break;\n case 'keyHit':\n benchMetrics.keyHits += delta;\n break;\n case 'keyMiss':\n benchMetrics.keyMisses += delta;\n break;\n case 'domInsert':\n benchMetrics.domInserts += delta;\n break;\n case 'domRemove':\n benchMetrics.domRemoves += delta;\n break;\n case 'domMove':\n benchMetrics.domMoves += delta;\n break;\n case 'domAttrSet':\n benchMetrics.domAttrSets += delta;\n break;\n case 'domTextSet':\n benchMetrics.domTextSets += delta;\n break;\n }\n};\n\nconst recordBenchFastLaneLive = (name: string): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n benchMetrics.fastLaneName = name;\n};\n\nconst recordBenchCounterLive = (counter: BenchCounter, delta = 1): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics || delta === 0) {\n return;\n }\n\n switch (counter) {\n case 'domNodesCreated':\n benchMetrics.domNodesCreated += delta;\n break;\n case 'listenerBindings':\n benchMetrics.listenerBindings += delta;\n break;\n case 'reactivePropsMounted':\n benchMetrics.reactivePropsMounted += delta;\n break;\n case 'replaceChildrenCommits':\n benchMetrics.replaceChildrenCommits += delta;\n break;\n case 'bulkClearCommits':\n benchMetrics.bulkClearCommits += delta;\n break;\n }\n};\n\nfunction withBenchMetricScopeLive<T>(scope: BenchMetricScope, run: () => T): T {\n if (!isBenchRuntimeEnabled()) {\n return run();\n }\n\n const previousScope = activeBenchMetricScope;\n activeBenchMetricScope = scope;\n\n try {\n return run();\n } finally {\n activeBenchMetricScope = previousScope;\n }\n}\n\nconst isBenchMetricScopeActiveLive = (scope: BenchMetricScope): boolean =>\n isBenchRuntimeEnabled() && activeBenchMetricScope === scope;\n\nconst recordBenchTimingLive = (\n phase: 'reconcile' | 'domCommit',\n ms: number\n): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n if (phase === 'reconcile') {\n benchMetrics.reconcilePhaseMs = ms;\n } else {\n benchMetrics.domCommitPhaseMs = ms;\n }\n};\n\nconst getBenchMetricsLive = (): BenchMetrics =>\n benchMetrics ? { ...benchMetrics } : { ...emptyBenchMetrics };\n\nexport const resetBenchMetrics = BENCH_BUILD_ENABLED\n ? (): void => {\n if (!isBenchRuntimeEnabled() || !benchMetrics) {\n return;\n }\n\n resetBenchMetricsLive(benchMetrics);\n }\n : (): void => {};\n\nexport const recordBenchEvent = BENCH_BUILD_ENABLED\n ? recordBenchEventLive\n : (_event: BenchEvent): void => {};\n\nexport const recordBenchFastLane = BENCH_BUILD_ENABLED\n ? recordBenchFastLaneLive\n : (_name: string): void => {};\n\nexport const recordBenchTiming = BENCH_BUILD_ENABLED\n ? recordBenchTimingLive\n : (_phase: 'reconcile' | 'domCommit', _ms: number): void => {};\n\nexport const recordBenchCounter = BENCH_BUILD_ENABLED\n ? recordBenchCounterLive\n : (_counter: BenchCounter, _delta = 1): void => {};\n\nexport const withBenchMetricScope = BENCH_BUILD_ENABLED\n ? withBenchMetricScopeLive\n : <T>(_scope: BenchMetricScope, run: () => T): T => run();\n\nexport const isBenchMetricScopeActive = BENCH_BUILD_ENABLED\n ? isBenchMetricScopeActiveLive\n : (_scope: BenchMetricScope): boolean => false;\n\nexport const getBenchMetrics = BENCH_BUILD_ENABLED\n ? getBenchMetricsLive\n : (): BenchMetrics => ({ ...emptyBenchMetrics });\n\nexport const flushBenchMetrics = BENCH_BUILD_ENABLED\n ? flushBenchMetricsLive\n : (): void => {};\n\nexport const isBenchBuildEnabled = (): boolean => BENCH_BUILD_ENABLED;\n"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { ComponentInstance } from "./component-internal.js";
2
+ import { ChildScope } from "./child-scope.js";
3
+ import { ForItemInstance } from "./for-scopes.js";
4
+ import { ForEachSource, ForProps } from "../control/for.js";
5
+ import { FineGrainedEffectHandle } from "./effect.js";
6
+ import { reconcileForItems } from "./for-reconcile.js";
7
+ import { VNode } from "../common/vnode.js";
8
+
9
+ //#region src/runtime/for-internal.d.ts
10
+ type ForCommitStrategy = 'APPEND' | 'TRUNCATE' | 'NO_REORDER' | 'SWAP' | 'FULL_KEYED';
11
+ interface ForState<T> {
12
+ kind: 'for';
13
+ currentItems: T[];
14
+ eachSource: ForEachSource<T>;
15
+ fallback: VNode | null;
16
+ fallbackScope: ChildScope | null;
17
+ items: Map<string | number, ForItemInstance<T>>;
18
+ orderedKeys: Array<string | number>;
19
+ orderedItems: ForItemInstance<T>[];
20
+ orderedVNodes: VNode[];
21
+ byFn: NonNullable<ForProps<T>['by']> | ((item: T, index: number) => number);
22
+ renderFn: (item: T, index: () => number) => VNode;
23
+ parentInstance: ComponentInstance | null;
24
+ lastCommitStrategy: ForCommitStrategy;
25
+ lastRemovedNodes: Node[];
26
+ pendingDirtyIndices: number[] | null;
27
+ pendingSwapIndices: [number, number] | null;
28
+ pendingMoveOnly: boolean;
29
+ _hasResolvedItemDom: boolean;
30
+ _needsSourceReconcile: boolean;
31
+ _sourceEffect: FineGrainedEffectHandle<T[]> | null;
32
+ _suspendSourceCommit: boolean;
33
+ _enqueueBoundaryCommit?: (() => void) | null;
34
+ _hasPendingBoundaryCommit?: boolean;
35
+ devKeyKinds?: Map<string, 'number' | 'string'>;
36
+ }
37
+ declare function createForState<T>(eachSource: ForEachSource<T>, byFn: ForState<T>['byFn'], renderFn: (item: T, index: () => number) => VNode, fallback: VNode | null): ForState<T>;
38
+ declare function useForState<T>(eachSource: ForEachSource<T>, byFn: ForState<T>['byFn'], renderFn: (item: T, index: () => number) => VNode, fallback: VNode | null): ForState<T>;
39
+ declare function evaluateForState<T>(forState: ForState<T>): VNode[];
40
+ declare function clearForDomUpdateState<T>(forState: ForState<T>): void;
41
+ //#endregion
42
+ export { ForCommitStrategy, ForState, reconcileForItems };
43
+ //# sourceMappingURL=for-internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"for-internal.d.ts","names":[],"sources":["../../src/runtime/for-internal.ts"],"mappings":";;;;;;;;;KA6BY,iBAAA;AAAA,UAOK,QAAA;EACf,IAAA;EACA,YAAA,EAAc,CAAA;EACd,UAAA,EAAY,aAAA,CAAc,CAAA;EAC1B,QAAA,EAAU,KAAA;EACV,aAAA,EAAe,UAAA;EACf,KAAA,EAAO,GAAA,kBAAqB,eAAA,CAAgB,CAAA;EAC5C,WAAA,EAAa,KAAA;EACb,YAAA,EAAc,eAAA,CAAgB,CAAA;EAC9B,aAAA,EAAe,KAAA;EACf,IAAA,EAAM,WAAA,CAAY,QAAA,CAAS,CAAA,aAAc,IAAA,EAAM,CAAA,EAAG,KAAA;EAClD,QAAA,GAAW,IAAA,EAAM,CAAA,EAAG,KAAA,mBAAwB,KAAA;EAC5C,cAAA,EAAgB,iBAAA;EAChB,kBAAA,EAAoB,iBAAA;EACpB,gBAAA,EAAkB,IAAA;EAClB,mBAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,qBAAA;EACA,aAAA,EAAe,uBAAA,CAAwB,CAAA;EACvC,oBAAA;EACA,sBAAA;EACA,yBAAA;EACA,WAAA,GAAc,GAAA;AAAA;AAAA,iBAmBA,cAAA,IACd,UAAA,EAAY,aAAA,CAAc,CAAA,GAC1B,IAAA,EAAM,QAAA,CAAS,CAAA,WACf,QAAA,GAAW,IAAA,EAAM,CAAA,EAAG,KAAA,mBAAwB,KAAA,EAC5C,QAAA,EAAU,KAAA,UACT,QAAA,CAAS,CAAA;AAAA,iBA8BI,WAAA,IACd,UAAA,EAAY,aAAA,CAAc,CAAA,GAC1B,IAAA,EAAM,QAAA,CAAS,CAAA,WACf,QAAA,GAAW,IAAA,EAAM,CAAA,EAAG,KAAA,mBAAwB,KAAA,EAC5C,QAAA,EAAU,KAAA,UACT,QAAA,CAAS,CAAA;AAAA,iBAgCI,gBAAA,IAAoB,QAAA,EAAU,QAAA,CAAS,CAAA,IAAK,KAAA;AAAA,iBAS5C,sBAAA,IAA0B,QAAA,EAAU,QAAQ,CAAC,CAAA"}
@@ -0,0 +1,98 @@
1
+ import { claimHookIndex, getCurrentInstance } from "./component-scope.js";
2
+ import "./component.js";
3
+ import { isBenchMetricScopeActive, recordBenchCounter, recordBenchEvent, recordBenchTiming, withBenchMetricScope } from "./for-bench.js";
4
+ import { reconcileForItems } from "./for-reconcile.js";
5
+ //#region src/runtime/for-internal.ts
6
+ /**
7
+ * For primitive runtime
8
+ *
9
+ * Manages For state storage, hook binding, source evaluation,
10
+ * and DOM update state cleanup.
11
+ */
12
+ const forStates = /* @__PURE__ */ new WeakMap();
13
+ function getForStore(instance) {
14
+ let store = forStates.get(instance);
15
+ if (!store) {
16
+ store = /* @__PURE__ */ new Map();
17
+ forStates.set(instance, store);
18
+ }
19
+ return store;
20
+ }
21
+ function createForState(eachSource, byFn, renderFn, fallback) {
22
+ const parentInstance = getCurrentInstance();
23
+ return {
24
+ kind: "for",
25
+ currentItems: [],
26
+ eachSource,
27
+ fallback,
28
+ fallbackScope: null,
29
+ items: /* @__PURE__ */ new Map(),
30
+ orderedKeys: [],
31
+ orderedItems: [],
32
+ orderedVNodes: [],
33
+ byFn,
34
+ renderFn,
35
+ parentInstance,
36
+ lastCommitStrategy: "NO_REORDER",
37
+ lastRemovedNodes: [],
38
+ pendingDirtyIndices: null,
39
+ pendingSwapIndices: null,
40
+ pendingMoveOnly: false,
41
+ _hasResolvedItemDom: false,
42
+ _needsSourceReconcile: false,
43
+ _sourceEffect: null,
44
+ _suspendSourceCommit: false,
45
+ _enqueueBoundaryCommit: null,
46
+ _hasPendingBoundaryCommit: false
47
+ };
48
+ }
49
+ function useForState(eachSource, byFn, renderFn, fallback) {
50
+ const instance = getCurrentInstance();
51
+ if (!instance) throw new Error("For can only be created during component render execution.");
52
+ const hookIndex = claimHookIndex(instance, "For");
53
+ const store = getForStore(instance);
54
+ const existing = store.get(hookIndex);
55
+ if (existing) {
56
+ existing.eachSource = eachSource;
57
+ existing.byFn = byFn;
58
+ existing.renderFn = renderFn;
59
+ existing.fallback = fallback;
60
+ return existing;
61
+ }
62
+ const created = createForState(eachSource, byFn, renderFn, fallback);
63
+ store.set(hookIndex, created);
64
+ (instance.cleanupFns ??= []).push(() => {
65
+ created._sourceEffect?.cleanup();
66
+ created._sourceEffect = null;
67
+ store.delete(hookIndex);
68
+ });
69
+ return created;
70
+ }
71
+ function evaluateForState(forState) {
72
+ if (!Array.isArray(forState.currentItems)) throw new Error("For source must evaluate to an array");
73
+ forState._needsSourceReconcile = false;
74
+ return reconcileForItems(forState, forState.currentItems);
75
+ }
76
+ function clearForDomUpdateState(forState) {
77
+ const dirtyIndices = forState.pendingDirtyIndices;
78
+ if (dirtyIndices && dirtyIndices.length > 0) for (let i = 0; i < dirtyIndices.length; i++) {
79
+ const itemInstance = forState.orderedItems[dirtyIndices[i]];
80
+ if (itemInstance) itemInstance.scope.needsDomUpdate = false;
81
+ }
82
+ else for (let i = 0; i < forState.orderedKeys.length; i++) {
83
+ const key = forState.orderedKeys[i];
84
+ const itemInstance = forState.items.get(key);
85
+ if (itemInstance) itemInstance.scope.needsDomUpdate = false;
86
+ }
87
+ if (forState.fallbackScope) forState.fallbackScope.needsDomUpdate = false;
88
+ forState.lastRemovedNodes = [];
89
+ forState.pendingDirtyIndices = null;
90
+ forState.pendingSwapIndices = null;
91
+ forState.pendingMoveOnly = false;
92
+ forState._needsSourceReconcile = false;
93
+ forState._hasResolvedItemDom = forState.orderedKeys.length > 0;
94
+ }
95
+ //#endregion
96
+ export { clearForDomUpdateState, createForState, evaluateForState, isBenchMetricScopeActive, reconcileForItems, recordBenchCounter, recordBenchEvent, recordBenchTiming, useForState, withBenchMetricScope };
97
+
98
+ //# sourceMappingURL=for-internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"for-internal.js","names":[],"sources":["../../src/runtime/for-internal.ts"],"sourcesContent":["/**\n * For primitive runtime\n *\n * Manages For state storage, hook binding, source evaluation,\n * and DOM update state cleanup.\n */\n\nimport { type ComponentInstance, getCurrentInstance } from './component';\nimport { claimHookIndex } from './component';\nimport type { VNode } from '../common/vnode';\nimport type { ChildScope } from './child-scope';\nimport type { ForItemInstance } from './for-scopes';\nimport type { ForProps } from '../control/for';\nimport type { ForEachSource } from '../control/for';\nimport type { FineGrainedEffectHandle } from './effect';\nimport { reconcileForItems } from './for-reconcile';\n\nexport {\n getBenchMetrics,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n} from './for-bench';\n\nexport { reconcileForItems };\n\nexport type ForCommitStrategy =\n | 'APPEND'\n | 'TRUNCATE'\n | 'NO_REORDER'\n | 'SWAP'\n | 'FULL_KEYED';\n\nexport interface ForState<T> {\n kind: 'for';\n currentItems: T[];\n eachSource: ForEachSource<T>;\n fallback: VNode | null;\n fallbackScope: ChildScope | null;\n items: Map<string | number, ForItemInstance<T>>;\n orderedKeys: Array<string | number>;\n orderedItems: ForItemInstance<T>[];\n orderedVNodes: VNode[];\n byFn: NonNullable<ForProps<T>['by']> | ((item: T, index: number) => number);\n renderFn: (item: T, index: () => number) => VNode;\n parentInstance: ComponentInstance | null;\n lastCommitStrategy: ForCommitStrategy;\n lastRemovedNodes: Node[];\n pendingDirtyIndices: number[] | null;\n pendingSwapIndices: [number, number] | null;\n pendingMoveOnly: boolean;\n _hasResolvedItemDom: boolean;\n _needsSourceReconcile: boolean;\n _sourceEffect: FineGrainedEffectHandle<T[]> | null;\n _suspendSourceCommit: boolean;\n _enqueueBoundaryCommit?: (() => void) | null;\n _hasPendingBoundaryCommit?: boolean;\n devKeyKinds?: Map<string, 'number' | 'string'>;\n}\n\nconst forStates = new WeakMap<\n ComponentInstance,\n Map<number, ForState<unknown>>\n>();\n\nfunction getForStore(\n instance: ComponentInstance\n): Map<number, ForState<unknown>> {\n let store = forStates.get(instance);\n if (!store) {\n store = new Map();\n forStates.set(instance, store);\n }\n return store;\n}\n\nexport function createForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const parentInstance = getCurrentInstance();\n\n return {\n kind: 'for',\n currentItems: [],\n eachSource,\n fallback,\n fallbackScope: null,\n items: new Map(),\n orderedKeys: [],\n orderedItems: [],\n orderedVNodes: [],\n byFn,\n renderFn,\n parentInstance,\n lastCommitStrategy: 'NO_REORDER',\n lastRemovedNodes: [],\n pendingDirtyIndices: null,\n pendingSwapIndices: null,\n pendingMoveOnly: false,\n _hasResolvedItemDom: false,\n _needsSourceReconcile: false,\n _sourceEffect: null,\n _suspendSourceCommit: false,\n _enqueueBoundaryCommit: null,\n _hasPendingBoundaryCommit: false,\n };\n}\n\nexport function useForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error(\n 'For can only be created during component render execution.'\n );\n }\n\n const hookIndex = claimHookIndex(instance, 'For');\n const store = getForStore(instance);\n const existing = store.get(hookIndex) as ForState<T> | undefined;\n\n if (existing) {\n existing.eachSource = eachSource;\n existing.byFn = byFn;\n existing.renderFn = renderFn;\n existing.fallback = fallback;\n return existing;\n }\n\n const created = createForState(eachSource, byFn, renderFn, fallback);\n store.set(hookIndex, created as ForState<unknown>);\n\n (instance.cleanupFns ??= []).push(() => {\n created._sourceEffect?.cleanup();\n created._sourceEffect = null;\n store.delete(hookIndex);\n });\n\n return created;\n}\n\nexport function evaluateForState<T>(forState: ForState<T>): VNode[] {\n if (!Array.isArray(forState.currentItems)) {\n throw new Error('For source must evaluate to an array');\n }\n\n forState._needsSourceReconcile = false;\n return reconcileForItems(forState, forState.currentItems);\n}\n\nexport function clearForDomUpdateState<T>(forState: ForState<T>): void {\n const dirtyIndices = forState.pendingDirtyIndices;\n if (dirtyIndices && dirtyIndices.length > 0) {\n for (let i = 0; i < dirtyIndices.length; i++) {\n const itemInstance = forState.orderedItems[dirtyIndices[i]];\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n } else {\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const key = forState.orderedKeys[i];\n const itemInstance = forState.items.get(key);\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n }\n\n if (forState.fallbackScope) {\n forState.fallbackScope.needsDomUpdate = false;\n }\n forState.lastRemovedNodes = [];\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n forState._needsSourceReconcile = false;\n forState._hasResolvedItemDom = forState.orderedKeys.length > 0;\n}\n"],"mappings":";;;;;;;;;;;AA+DA,MAAM,4BAAY,IAAI,QAGpB;AAEF,SAAS,YACP,UACgC;CAChC,IAAI,QAAQ,UAAU,IAAI,QAAQ;CAClC,IAAI,CAAC,OAAO;EACV,wBAAQ,IAAI,IAAI;EAChB,UAAU,IAAI,UAAU,KAAK;CAC/B;CACA,OAAO;AACT;AAEA,SAAgB,eACd,YACA,MACA,UACA,UACa;CACb,MAAM,iBAAiB,mBAAmB;CAE1C,OAAO;EACL,MAAM;EACN,cAAc,CAAC;EACf;EACA;EACA,eAAe;EACf,uBAAO,IAAI,IAAI;EACf,aAAa,CAAC;EACd,cAAc,CAAC;EACf,eAAe,CAAC;EAChB;EACA;EACA;EACA,oBAAoB;EACpB,kBAAkB,CAAC;EACnB,qBAAqB;EACrB,oBAAoB;EACpB,iBAAiB;EACjB,qBAAqB;EACrB,uBAAuB;EACvB,eAAe;EACf,sBAAsB;EACtB,wBAAwB;EACxB,2BAA2B;CAC7B;AACF;AAEA,SAAgB,YACd,YACA,MACA,UACA,UACa;CACb,MAAM,WAAW,mBAAmB;CACpC,IAAI,CAAC,UACH,MAAM,IAAI,MACR,4DACF;CAGF,MAAM,YAAY,eAAe,UAAU,KAAK;CAChD,MAAM,QAAQ,YAAY,QAAQ;CAClC,MAAM,WAAW,MAAM,IAAI,SAAS;CAEpC,IAAI,UAAU;EACZ,SAAS,aAAa;EACtB,SAAS,OAAO;EAChB,SAAS,WAAW;EACpB,SAAS,WAAW;EACpB,OAAO;CACT;CAEA,MAAM,UAAU,eAAe,YAAY,MAAM,UAAU,QAAQ;CACnE,MAAM,IAAI,WAAW,OAA4B;CAEjD,CAAC,SAAS,eAAe,CAAC,EAAA,CAAG,WAAW;EACtC,QAAQ,eAAe,QAAQ;EAC/B,QAAQ,gBAAgB;EACxB,MAAM,OAAO,SAAS;CACxB,CAAC;CAED,OAAO;AACT;AAEA,SAAgB,iBAAoB,UAAgC;CAClE,IAAI,CAAC,MAAM,QAAQ,SAAS,YAAY,GACtC,MAAM,IAAI,MAAM,sCAAsC;CAGxD,SAAS,wBAAwB;CACjC,OAAO,kBAAkB,UAAU,SAAS,YAAY;AAC1D;AAEA,SAAgB,uBAA0B,UAA6B;CACrE,MAAM,eAAe,SAAS;CAC9B,IAAI,gBAAgB,aAAa,SAAS,GACxC,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;EAC5C,MAAM,eAAe,SAAS,aAAa,aAAa;EACxD,IAAI,cACF,aAAa,MAAM,iBAAiB;CAExC;MAEA,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,YAAY,QAAQ,KAAK;EACpD,MAAM,MAAM,SAAS,YAAY;EACjC,MAAM,eAAe,SAAS,MAAM,IAAI,GAAG;EAC3C,IAAI,cACF,aAAa,MAAM,iBAAiB;CAExC;CAGF,IAAI,SAAS,eACX,SAAS,cAAc,iBAAiB;CAE1C,SAAS,mBAAmB,CAAC;CAC7B,SAAS,sBAAsB;CAC/B,SAAS,qBAAqB;CAC9B,SAAS,kBAAkB;CAC3B,SAAS,wBAAwB;CACjC,SAAS,sBAAsB,SAAS,YAAY,SAAS;AAC/D"}
@@ -0,0 +1,8 @@
1
+ import { ForState } from "./for-internal.js";
2
+ import { VNode } from "../common/vnode.js";
3
+
4
+ //#region src/runtime/for-reconcile.d.ts
5
+ declare function reconcileForItems<T>(forState: ForState<T>, newArray: T[]): VNode[];
6
+ //#endregion
7
+ export { reconcileForItems };
8
+ //# sourceMappingURL=for-reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"for-reconcile.d.ts","names":[],"sources":["../../src/runtime/for-reconcile.ts"],"mappings":";;;;iBAsEgB,iBAAA,IACd,QAAA,EAAU,QAAA,CAAS,CAAA,GACnB,QAAA,EAAU,CAAA,KACT,KAAA"}