@askrjs/askr 0.0.48 → 0.0.49

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 (394) 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 +1 -1
  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 +2 -0
  80. package/dist/jsx/types.js +2 -1
  81. package/dist/jsx-runtime2.d.ts +2 -1
  82. package/dist/jsx-runtime2.js +3 -2
  83. package/dist/renderer/attributes.js +231 -0
  84. package/dist/renderer/attributes.js.map +1 -0
  85. package/dist/renderer/boundaries.js +266 -0
  86. package/dist/renderer/boundaries.js.map +1 -0
  87. package/dist/renderer/child-shape.js +85 -0
  88. package/dist/renderer/child-shape.js.map +1 -0
  89. package/dist/renderer/children.js +3 -2
  90. package/dist/renderer/children.js.map +1 -1
  91. package/dist/renderer/cleanup.js +2 -1
  92. package/dist/renderer/cleanup.js.map +1 -1
  93. package/dist/renderer/component-host-cleanup.js +68 -0
  94. package/dist/renderer/component-host-cleanup.js.map +1 -0
  95. package/dist/renderer/component-host-instances.js +65 -0
  96. package/dist/renderer/component-host-instances.js.map +1 -0
  97. package/dist/renderer/component-host.js +247 -0
  98. package/dist/renderer/component-host.js.map +1 -0
  99. package/dist/renderer/dom-host.js +13 -0
  100. package/dist/renderer/dom-host.js.map +1 -0
  101. package/dist/renderer/dom-internal.js +185 -0
  102. package/dist/renderer/dom-internal.js.map +1 -0
  103. package/dist/renderer/dom.js +9 -2356
  104. package/dist/renderer/element-children.js +279 -0
  105. package/dist/renderer/element-children.js.map +1 -0
  106. package/dist/renderer/env.js +2 -1
  107. package/dist/renderer/error-boundary-dom.js +29 -0
  108. package/dist/renderer/error-boundary-dom.js.map +1 -0
  109. package/dist/renderer/evaluate-dom-range.js +85 -0
  110. package/dist/renderer/evaluate-dom-range.js.map +1 -0
  111. package/dist/renderer/evaluate-reconcile.js +281 -0
  112. package/dist/renderer/evaluate-reconcile.js.map +1 -0
  113. package/dist/renderer/evaluate.js +13 -399
  114. package/dist/renderer/evaluate.js.map +1 -1
  115. package/dist/renderer/fastpath.js +6 -5
  116. package/dist/renderer/fastpath.js.map +1 -1
  117. package/dist/renderer/for-commit-dom-map.js +83 -0
  118. package/dist/renderer/for-commit-dom-map.js.map +1 -0
  119. package/dist/renderer/for-commit-removal.js +36 -0
  120. package/dist/renderer/for-commit-removal.js.map +1 -0
  121. package/dist/renderer/for-commit-reorder.js +89 -0
  122. package/dist/renderer/for-commit-reorder.js.map +1 -0
  123. package/dist/renderer/for-commit.js +6 -188
  124. package/dist/renderer/for-commit.js.map +1 -1
  125. package/dist/renderer/index.js +28 -16
  126. package/dist/renderer/index.js.map +1 -1
  127. package/dist/renderer/keyed-children.js +32 -0
  128. package/dist/renderer/keyed-children.js.map +1 -0
  129. package/dist/renderer/keyed.js +2 -15
  130. package/dist/renderer/keyed.js.map +1 -1
  131. package/dist/renderer/namespaces.js +23 -0
  132. package/dist/renderer/namespaces.js.map +1 -0
  133. package/dist/renderer/prop-bindings.js +280 -0
  134. package/dist/renderer/prop-bindings.js.map +1 -0
  135. package/dist/renderer/reactive-child-dom.js +133 -0
  136. package/dist/renderer/reactive-child-dom.js.map +1 -0
  137. package/dist/renderer/reactive-child-sources.js +184 -0
  138. package/dist/renderer/reactive-child-sources.js.map +1 -0
  139. package/dist/renderer/reactive-children.js +294 -0
  140. package/dist/renderer/reactive-children.js.map +1 -0
  141. package/dist/renderer/reconcile-commit.js +38 -0
  142. package/dist/renderer/reconcile-commit.js.map +1 -0
  143. package/dist/renderer/reconcile-fastpaths.js +106 -0
  144. package/dist/renderer/reconcile-fastpaths.js.map +1 -0
  145. package/dist/renderer/reconcile-resolution.js +187 -0
  146. package/dist/renderer/reconcile-resolution.js.map +1 -0
  147. package/dist/renderer/reconcile.js +9 -371
  148. package/dist/renderer/reconcile.js.map +1 -1
  149. package/dist/renderer/retained-element-rollback.js +276 -0
  150. package/dist/renderer/retained-element-rollback.js.map +1 -0
  151. package/dist/renderer/stable-patch.js +82 -0
  152. package/dist/renderer/stable-patch.js.map +1 -0
  153. package/dist/renderer/static-reuse.js +96 -0
  154. package/dist/renderer/static-reuse.js.map +1 -0
  155. package/dist/renderer/types.js +2 -1
  156. package/dist/renderer/utils.js +4 -4
  157. package/dist/renderer/utils.js.map +1 -1
  158. package/dist/resources/index.d.ts +3 -2
  159. package/dist/resources/index.js +5 -2
  160. package/dist/router/access.js +36 -0
  161. package/dist/router/access.js.map +1 -0
  162. package/dist/router/activity.d.ts +10 -0
  163. package/dist/router/activity.d.ts.map +1 -0
  164. package/dist/router/activity.js +89 -0
  165. package/dist/router/activity.js.map +1 -0
  166. package/dist/router/authoring.d.ts +22 -0
  167. package/dist/router/authoring.d.ts.map +1 -0
  168. package/dist/router/authoring.js +198 -0
  169. package/dist/router/authoring.js.map +1 -0
  170. package/dist/router/index.d.ts +12 -4
  171. package/dist/router/index.js +10 -3
  172. package/dist/router/internal-types.d.ts +31 -0
  173. package/dist/router/internal-types.d.ts.map +1 -0
  174. package/dist/router/lazy.d.ts +19 -0
  175. package/dist/router/lazy.d.ts.map +1 -0
  176. package/dist/router/lazy.js +52 -0
  177. package/dist/router/lazy.js.map +1 -0
  178. package/dist/router/manifest.d.ts +10 -0
  179. package/dist/router/manifest.d.ts.map +1 -0
  180. package/dist/router/manifest.js +49 -0
  181. package/dist/router/manifest.js.map +1 -0
  182. package/dist/router/navigate.d.ts +4 -51
  183. package/dist/router/navigate.d.ts.map +1 -1
  184. package/dist/router/navigate.js +16 -459
  185. package/dist/router/navigate.js.map +1 -1
  186. package/dist/router/navigation-registry.d.ts +32 -0
  187. package/dist/router/navigation-registry.d.ts.map +1 -0
  188. package/dist/router/navigation-registry.js +105 -0
  189. package/dist/router/navigation-registry.js.map +1 -0
  190. package/dist/router/navigation-scroll.d.ts +14 -0
  191. package/dist/router/navigation-scroll.d.ts.map +1 -0
  192. package/dist/router/navigation-scroll.js +93 -0
  193. package/dist/router/navigation-scroll.js.map +1 -0
  194. package/dist/router/navigation-targets.d.ts +31 -0
  195. package/dist/router/navigation-targets.d.ts.map +1 -0
  196. package/dist/router/navigation-targets.js +253 -0
  197. package/dist/router/navigation-targets.js.map +1 -0
  198. package/dist/router/policy.d.ts +7 -1
  199. package/dist/router/policy.d.ts.map +1 -1
  200. package/dist/router/policy.js +27 -9
  201. package/dist/router/policy.js.map +1 -1
  202. package/dist/router/rendering.d.ts +10 -0
  203. package/dist/router/rendering.d.ts.map +1 -0
  204. package/dist/router/rendering.js +45 -0
  205. package/dist/router/rendering.js.map +1 -0
  206. package/dist/router/resolution.d.ts +17 -0
  207. package/dist/router/resolution.d.ts.map +1 -0
  208. package/dist/router/resolution.js +253 -0
  209. package/dist/router/resolution.js.map +1 -0
  210. package/dist/router/route-query.d.ts +17 -0
  211. package/dist/router/route-query.d.ts.map +1 -0
  212. package/dist/router/route-query.js +47 -0
  213. package/dist/router/route-query.js.map +1 -0
  214. package/dist/router/route.d.ts +8 -149
  215. package/dist/router/route.js +8 -854
  216. package/dist/router/store.d.ts +50 -0
  217. package/dist/router/store.d.ts.map +1 -0
  218. package/dist/router/store.js +171 -0
  219. package/dist/router/store.js.map +1 -0
  220. package/dist/runtime/access.js +45 -0
  221. package/dist/runtime/access.js.map +1 -0
  222. package/dist/runtime/child-scope.d.ts +1 -1
  223. package/dist/runtime/child-scope.js +4 -1
  224. package/dist/runtime/child-scope.js.map +1 -1
  225. package/dist/runtime/component-cleanup.d.ts +16 -0
  226. package/dist/runtime/component-cleanup.d.ts.map +1 -0
  227. package/dist/runtime/component-cleanup.js +70 -0
  228. package/dist/runtime/component-cleanup.js.map +1 -0
  229. package/dist/runtime/component-commit.js +165 -0
  230. package/dist/runtime/component-commit.js.map +1 -0
  231. package/dist/runtime/component-contracts.js +5 -0
  232. package/dist/runtime/component-facade.d.ts +5 -0
  233. package/dist/runtime/component-facade.js +4 -0
  234. package/dist/runtime/component-internal.d.ts +100 -0
  235. package/dist/runtime/component-internal.d.ts.map +1 -0
  236. package/dist/runtime/component-internal.js +219 -0
  237. package/dist/runtime/component-internal.js.map +1 -0
  238. package/dist/runtime/component-lifecycle.d.ts +49 -0
  239. package/dist/runtime/component-lifecycle.d.ts.map +1 -0
  240. package/dist/runtime/component-lifecycle.js +176 -0
  241. package/dist/runtime/component-lifecycle.js.map +1 -0
  242. package/dist/runtime/component-scope.d.ts +55 -0
  243. package/dist/runtime/component-scope.d.ts.map +1 -0
  244. package/dist/runtime/component-scope.js +154 -0
  245. package/dist/runtime/component-scope.js.map +1 -0
  246. package/dist/runtime/component.d.ts +4 -152
  247. package/dist/runtime/component.js +4 -692
  248. package/dist/runtime/context.d.ts +1 -1
  249. package/dist/runtime/context.js +6 -4
  250. package/dist/runtime/context.js.map +1 -1
  251. package/dist/runtime/control.d.ts +3 -3
  252. package/dist/runtime/control.js +2 -1
  253. package/dist/runtime/control.js.map +1 -1
  254. package/dist/runtime/derive.d.ts.map +1 -1
  255. package/dist/runtime/derive.js +6 -5
  256. package/dist/runtime/derive.js.map +1 -1
  257. package/dist/runtime/effect.d.ts +1 -1
  258. package/dist/runtime/effect.d.ts.map +1 -1
  259. package/dist/runtime/effect.js +2 -2
  260. package/dist/runtime/effect.js.map +1 -1
  261. package/dist/runtime/events.js +3 -3
  262. package/dist/runtime/events.js.map +1 -1
  263. package/dist/runtime/fastlane.js +13 -27
  264. package/dist/runtime/fastlane.js.map +1 -1
  265. package/dist/runtime/for-bench.d.ts +1 -1
  266. package/dist/runtime/for-bench.js +1 -4
  267. package/dist/runtime/for-bench.js.map +1 -1
  268. package/dist/runtime/for-internal.d.ts +43 -0
  269. package/dist/runtime/for-internal.d.ts.map +1 -0
  270. package/dist/runtime/for-internal.js +98 -0
  271. package/dist/runtime/for-internal.js.map +1 -0
  272. package/dist/runtime/for-reconcile.d.ts +8 -0
  273. package/dist/runtime/for-reconcile.d.ts.map +1 -0
  274. package/dist/runtime/for-reconcile.js +389 -0
  275. package/dist/runtime/for-reconcile.js.map +1 -0
  276. package/dist/runtime/for-scopes.d.ts +26 -0
  277. package/dist/runtime/for-scopes.d.ts.map +1 -0
  278. package/dist/runtime/for-scopes.js +160 -0
  279. package/dist/runtime/for-scopes.js.map +1 -0
  280. package/dist/runtime/for-signals.d.ts +30 -0
  281. package/dist/runtime/for-signals.d.ts.map +1 -0
  282. package/dist/runtime/for-signals.js +139 -0
  283. package/dist/runtime/for-signals.js.map +1 -0
  284. package/dist/runtime/for.d.ts +4 -66
  285. package/dist/runtime/for.js +5 -773
  286. package/dist/runtime/lifecycle-operations.d.ts +31 -0
  287. package/dist/runtime/lifecycle-operations.d.ts.map +1 -0
  288. package/dist/runtime/lifecycle-operations.js +195 -0
  289. package/dist/runtime/lifecycle-operations.js.map +1 -0
  290. package/dist/runtime/operations.d.ts +3 -40
  291. package/dist/runtime/operations.js +2 -357
  292. package/dist/runtime/readable.d.ts +2 -3
  293. package/dist/runtime/readable.d.ts.map +1 -1
  294. package/dist/runtime/readable.js +6 -5
  295. package/dist/runtime/readable.js.map +1 -1
  296. package/dist/runtime/resource-cell.js +2 -2
  297. package/dist/runtime/resource-cell.js.map +1 -1
  298. package/dist/runtime/resource-operation.d.ts +13 -0
  299. package/dist/runtime/resource-operation.d.ts.map +1 -0
  300. package/dist/runtime/resource-operation.js +170 -0
  301. package/dist/runtime/resource-operation.js.map +1 -0
  302. package/dist/runtime/runtime.d.ts +42 -0
  303. package/dist/runtime/runtime.d.ts.map +1 -0
  304. package/dist/runtime/runtime.js +59 -0
  305. package/dist/runtime/runtime.js.map +1 -0
  306. package/dist/runtime/scheduler.d.ts +5 -1
  307. package/dist/runtime/scheduler.d.ts.map +1 -1
  308. package/dist/runtime/scheduler.js +17 -17
  309. package/dist/runtime/scheduler.js.map +1 -1
  310. package/dist/runtime/selector.js +4 -3
  311. package/dist/runtime/selector.js.map +1 -1
  312. package/dist/runtime/snapshot-source.d.ts +1 -1
  313. package/dist/runtime/snapshot-source.js +1 -1
  314. package/dist/runtime/state.js +2 -1
  315. package/dist/runtime/state.js.map +1 -1
  316. package/dist/ssg/batch-render.js +2 -1
  317. package/dist/ssg/batch-render.js.map +1 -1
  318. package/dist/ssg/create-static-gen.d.ts +9 -3
  319. package/dist/ssg/create-static-gen.d.ts.map +1 -1
  320. package/dist/ssg/create-static-gen.js +12 -99
  321. package/dist/ssg/create-static-gen.js.map +1 -1
  322. package/dist/ssg/generation-plan.js +70 -0
  323. package/dist/ssg/generation-plan.js.map +1 -0
  324. package/dist/ssg/incremental-manifest.js +1 -1
  325. package/dist/ssg/static-routes.js +101 -0
  326. package/dist/ssg/static-routes.js.map +1 -0
  327. package/dist/ssg/types.d.ts +15 -7
  328. package/dist/ssg/types.d.ts.map +1 -1
  329. package/dist/ssr/boundaries.js +113 -0
  330. package/dist/ssr/boundaries.js.map +1 -0
  331. package/dist/ssr/component-runtime.js +111 -0
  332. package/dist/ssr/component-runtime.js.map +1 -0
  333. package/dist/ssr/context.d.ts +3 -1
  334. package/dist/ssr/context.d.ts.map +1 -1
  335. package/dist/ssr/context.js +9 -2
  336. package/dist/ssr/context.js.map +1 -1
  337. package/dist/ssr/errors.d.ts +2 -0
  338. package/dist/ssr/errors.js +11 -1
  339. package/dist/ssr/errors.js.map +1 -1
  340. package/dist/ssr/escape.js +3 -3
  341. package/dist/ssr/escape.js.map +1 -1
  342. package/dist/ssr/hydration-data.js +10 -0
  343. package/dist/ssr/hydration-data.js.map +1 -0
  344. package/dist/ssr/hydration-verify.d.ts +12 -0
  345. package/dist/ssr/hydration-verify.d.ts.map +1 -0
  346. package/dist/ssr/hydration-verify.js +144 -0
  347. package/dist/ssr/hydration-verify.js.map +1 -0
  348. package/dist/ssr/index-internal.d.ts +15 -0
  349. package/dist/ssr/index-internal.d.ts.map +1 -0
  350. package/dist/ssr/index-internal.js +19 -0
  351. package/dist/ssr/index-internal.js.map +1 -0
  352. package/dist/ssr/index.d.ts +5 -57
  353. package/dist/ssr/index.js +3 -738
  354. package/dist/ssr/render-keys.js +9 -32
  355. package/dist/ssr/render-keys.js.map +1 -1
  356. package/dist/ssr/render-resolved.d.ts +1 -1
  357. package/dist/ssr/render-resolved.d.ts.map +1 -1
  358. package/dist/ssr/render-resolved.js +4 -2
  359. package/dist/ssr/render-resolved.js.map +1 -1
  360. package/dist/ssr/render-sync.d.ts +21 -0
  361. package/dist/ssr/render-sync.d.ts.map +1 -0
  362. package/dist/ssr/render-sync.js +275 -0
  363. package/dist/ssr/render-sync.js.map +1 -0
  364. package/dist/ssr/route-policy-resolution.js +77 -0
  365. package/dist/ssr/route-policy-resolution.js.map +1 -0
  366. package/dist/ssr/route-render.d.ts +77 -0
  367. package/dist/ssr/route-render.d.ts.map +1 -0
  368. package/dist/ssr/route-render.js +119 -0
  369. package/dist/ssr/route-render.js.map +1 -0
  370. package/dist/ssr/sink.d.ts +26 -0
  371. package/dist/ssr/sink.d.ts.map +1 -0
  372. package/dist/ssr/types.d.ts +1 -0
  373. package/dist/ssr/types.d.ts.map +1 -1
  374. package/dist/ssr/verify-hydration.js.map +1 -1
  375. package/dist/testing/index.d.ts +1 -2
  376. package/dist/testing/index.d.ts.map +1 -1
  377. package/dist/testing/index.js +2 -1
  378. package/dist/testing/index.js.map +1 -1
  379. package/package.json +4 -3
  380. package/dist/data/index.d.ts.map +0 -1
  381. package/dist/data/index.js.map +0 -1
  382. package/dist/renderer/dom.js.map +0 -1
  383. package/dist/router/route.d.ts.map +0 -1
  384. package/dist/router/route.js.map +0 -1
  385. package/dist/runtime/component.d.ts.map +0 -1
  386. package/dist/runtime/component.js.map +0 -1
  387. package/dist/runtime/for.d.ts.map +0 -1
  388. package/dist/runtime/for.js.map +0 -1
  389. package/dist/runtime/operations.d.ts.map +0 -1
  390. package/dist/runtime/operations.js.map +0 -1
  391. package/dist/runtime/ssr-bridge.js +0 -24
  392. package/dist/runtime/ssr-bridge.js.map +0 -1
  393. package/dist/ssr/index.d.ts.map +0 -1
  394. package/dist/ssr/index.js.map +0 -1
@@ -1,773 +1,5 @@
1
- import { isDevelopmentEnvironment } from "../common/env.js";
2
- import { markReactivePropsDirtySource, markReadableDerivedSubscribersDirty, notifyReadableReaders, recordReadableRead } from "./readable.js";
3
- import { claimHookIndex, getCurrentInstance } from "./component.js";
4
- import { teardownNodeSubtree } from "../renderer/cleanup.js";
5
- import { createChildScope, disposeChildScope } from "./child-scope.js";
6
- import { flushBenchMetrics, isBenchBuildEnabled, recordBenchEvent, recordBenchFastLane, recordBenchTiming, resetBenchMetrics } from "./for-bench.js";
7
- //#region src/runtime/for.ts
8
- /**
9
- * For primitive runtime
10
- *
11
- * Manages per-item component instances and array reconciliation
12
- * to eliminate over-invalidation in list rendering.
13
- */
14
- const BENCH_BUILD_ENABLED = isBenchBuildEnabled();
15
- const forStates = /* @__PURE__ */ new WeakMap();
16
- function getForStore(instance) {
17
- let store = forStates.get(instance);
18
- if (!store) {
19
- store = /* @__PURE__ */ new Map();
20
- forStates.set(instance, store);
21
- }
22
- return store;
23
- }
24
- function createForState(eachSource, byFn, renderFn, fallback) {
25
- const parentInstance = getCurrentInstance();
26
- return {
27
- kind: "for",
28
- currentItems: [],
29
- eachSource,
30
- fallback,
31
- fallbackScope: null,
32
- items: /* @__PURE__ */ new Map(),
33
- orderedKeys: [],
34
- orderedItems: [],
35
- orderedVNodes: [],
36
- byFn,
37
- renderFn,
38
- parentInstance,
39
- lastCommitStrategy: "NO_REORDER",
40
- lastRemovedNodes: [],
41
- pendingDirtyIndices: null,
42
- pendingSwapIndices: null,
43
- pendingMoveOnly: false,
44
- _hasResolvedItemDom: false,
45
- _needsSourceReconcile: false,
46
- _sourceEffect: null,
47
- _suspendSourceCommit: false,
48
- _enqueueBoundaryCommit: null,
49
- _hasPendingBoundaryCommit: false
50
- };
51
- }
52
- function useForState(eachSource, byFn, renderFn, fallback) {
53
- const instance = getCurrentInstance();
54
- if (!instance) throw new Error("For can only be created during component render execution.");
55
- const hookIndex = claimHookIndex(instance, "For");
56
- const store = getForStore(instance);
57
- const existing = store.get(hookIndex);
58
- if (existing) {
59
- existing.eachSource = eachSource;
60
- existing.byFn = byFn;
61
- existing.renderFn = renderFn;
62
- existing.fallback = fallback;
63
- return existing;
64
- }
65
- const created = createForState(eachSource, byFn, renderFn, fallback);
66
- store.set(hookIndex, created);
67
- (instance.cleanupFns ??= []).push(() => {
68
- created._sourceEffect?.cleanup();
69
- created._sourceEffect = null;
70
- store.delete(hookIndex);
71
- });
72
- return created;
73
- }
74
- function createForIndexSignal(initialIndex) {
75
- let indexValue = initialIndex;
76
- const readers = /* @__PURE__ */ new Map();
77
- const indexSignal = (() => {
78
- indexSignal._hasBeenRead = true;
79
- recordReadableRead(indexSignal);
80
- return indexValue;
81
- });
82
- indexSignal._readers = readers;
83
- indexSignal.peek = () => indexValue;
84
- indexSignal.set = (newValue, notifyReaders = true) => {
85
- const nextValue = typeof newValue === "function" ? newValue(indexValue) : newValue;
86
- if (nextValue !== indexValue) {
87
- indexValue = nextValue;
88
- if (notifyReaders) {
89
- markReadableDerivedSubscribersDirty(indexSignal);
90
- markReactivePropsDirtySource(indexSignal);
91
- notifyReadableReaders(indexSignal);
92
- }
93
- }
94
- };
95
- indexSignal._hasBeenRead = false;
96
- return indexSignal;
97
- }
98
- function syncForIndexSignal(indexSignal, nextIndex) {
99
- if (indexSignal.peek() === nextIndex) return false;
100
- indexSignal.set(nextIndex, indexSignal._hasBeenRead);
101
- return indexSignal._hasBeenRead === true;
102
- }
103
- function syncForItemIndex(forState, itemInstance, nextIndex) {
104
- const indexSignal = itemInstance.indexSignal;
105
- if (indexSignal.peek() === nextIndex) return false;
106
- if (!scopeReadsSource(itemInstance.scope, indexSignal)) {
107
- syncForIndexSignal(indexSignal, nextIndex);
108
- return false;
109
- }
110
- indexSignal.set(nextIndex, false);
111
- markReadableDerivedSubscribersDirty(indexSignal);
112
- markReactivePropsDirtySource(indexSignal);
113
- notifyReadableReaders(indexSignal, itemInstance.scope.componentInstance);
114
- rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);
115
- return true;
116
- }
117
- function createForItemSignal(initialItem) {
118
- let itemValue = initialItem;
119
- const readers = /* @__PURE__ */ new Map();
120
- const itemSignal = (() => {
121
- itemSignal._hasBeenRead = true;
122
- recordReadableRead(itemSignal);
123
- return itemValue;
124
- });
125
- itemSignal._readers = readers;
126
- itemSignal.peek = () => itemValue;
127
- itemSignal.set = (newValue, notifyReaders = true) => {
128
- if (Object.is(itemValue, newValue)) return;
129
- itemValue = newValue;
130
- if (notifyReaders) {
131
- markReadableDerivedSubscribersDirty(itemSignal);
132
- markReactivePropsDirtySource(itemSignal);
133
- notifyReadableReaders(itemSignal);
134
- }
135
- };
136
- itemSignal._hasBeenRead = false;
137
- return itemSignal;
138
- }
139
- function createForItemPropertySignal(initialValue) {
140
- let propertyValue = initialValue;
141
- const readers = /* @__PURE__ */ new Map();
142
- const propertySignal = (() => {
143
- propertySignal._hasBeenRead = true;
144
- recordReadableRead(propertySignal);
145
- return propertyValue;
146
- });
147
- propertySignal._readers = readers;
148
- propertySignal.peek = () => propertyValue;
149
- propertySignal.set = (newValue, notifyReaders = true) => {
150
- if (Object.is(propertyValue, newValue)) return;
151
- propertyValue = newValue;
152
- if (notifyReaders) {
153
- markReadableDerivedSubscribersDirty(propertySignal);
154
- markReactivePropsDirtySource(propertySignal);
155
- notifyReadableReaders(propertySignal);
156
- }
157
- };
158
- propertySignal._hasBeenRead = false;
159
- return propertySignal;
160
- }
161
- function readForItemProperty(item, prop) {
162
- return Reflect.get(Object(item), prop);
163
- }
164
- function haveSameOwnKeys(previousItem, nextItem) {
165
- const previousKeys = Reflect.ownKeys(Object(previousItem));
166
- const nextKeys = Reflect.ownKeys(Object(nextItem));
167
- if (previousKeys.length !== nextKeys.length) return false;
168
- for (let i = 0; i < previousKeys.length; i += 1) if (previousKeys[i] !== nextKeys[i]) return false;
169
- return true;
170
- }
171
- function scopeReadsSource(scope, source) {
172
- return source._readers?.has(scope.componentInstance) ?? false;
173
- }
174
- function isForParentReader(forState, reader) {
175
- let current = forState.parentInstance;
176
- while (current) {
177
- if (current === reader) return true;
178
- current = current.parentInstance;
179
- }
180
- return false;
181
- }
182
- function removeForParentReaders(forState, source) {
183
- const readers = source._readers;
184
- if (!readers || readers.size === 0) return;
185
- for (const reader of readers.keys()) if (isForParentReader(forState, reader)) readers.delete(reader);
186
- }
187
- function getOrCreateForItemPropertySignal(item, propertySignals, prop) {
188
- const existingSignal = propertySignals.get(prop);
189
- if (existingSignal) return existingSignal;
190
- const propertySignal = createForItemPropertySignal(readForItemProperty(item, prop));
191
- propertySignals.set(prop, propertySignal);
192
- return propertySignal;
193
- }
194
- function canProxyForItem(item) {
195
- return typeof item === "object" && item !== null || typeof item === "function";
196
- }
197
- function createReactiveForItem(itemSignal, propertySignals) {
198
- return new Proxy(Object.create(null), {
199
- get(target, prop, receiver) {
200
- if (Reflect.getOwnPropertyDescriptor(target, prop)) return Reflect.get(target, prop, receiver);
201
- const currentItem = itemSignal.peek();
202
- if (typeof prop !== "symbol") return getOrCreateForItemPropertySignal(currentItem, propertySignals, prop)();
203
- recordReadableRead(itemSignal);
204
- return Reflect.get(Object(currentItem), prop, receiver);
205
- },
206
- has(target, prop) {
207
- recordReadableRead(itemSignal);
208
- return prop in target || prop in Object(itemSignal.peek());
209
- },
210
- ownKeys(target) {
211
- recordReadableRead(itemSignal);
212
- const keys = new Set(Reflect.ownKeys(target));
213
- for (const key of Reflect.ownKeys(Object(itemSignal.peek()))) keys.add(key);
214
- return Array.from(keys);
215
- },
216
- getOwnPropertyDescriptor(target, prop) {
217
- recordReadableRead(itemSignal);
218
- const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);
219
- if (ownDescriptor) return ownDescriptor;
220
- return Object.getOwnPropertyDescriptor(Object(itemSignal.peek()), prop);
221
- },
222
- getPrototypeOf() {
223
- recordReadableRead(itemSignal);
224
- return Object.getPrototypeOf(Object(itemSignal.peek()));
225
- }
226
- });
227
- }
228
- function materializeItemVnode(key, vnode) {
229
- if (vnode && typeof vnode === "object" && "type" in vnode) {
230
- const vn = vnode;
231
- vn.key = key;
232
- if (typeof vn.type === "string") {
233
- if (!vn.props) vn.props = {};
234
- if (vn.props["data-key"] === void 0) vn.props["data-key"] = String(key);
235
- }
236
- }
237
- }
238
- function renderItemScope(forState, scope, item, indexSignal, key) {
239
- recordBenchEvent("rowFactory");
240
- const vnode = scope.render(() => forState.renderFn(item, indexSignal));
241
- materializeItemVnode(key, vnode);
242
- return vnode;
243
- }
244
- function failForValidation(message) {
245
- throw new Error(message);
246
- }
247
- function validateForKeys(forState, newArray) {
248
- if (!isDevelopmentEnvironment()) return;
249
- const seen = /* @__PURE__ */ new Set();
250
- const keyKinds = /* @__PURE__ */ new Map();
251
- for (let i = 0; i < newArray.length; i++) {
252
- const key = forState.byFn(newArray[i], i);
253
- if (key === null || key === void 0) failForValidation("[askr] Invalid For key detected. Keys should be stable, non-null, and unique within a For list.");
254
- if (seen.has(key)) failForValidation(`[askr] Duplicate For key detected: ${String(key)}. Keys should be stable, non-null, and unique within a For list.`);
255
- seen.add(key);
256
- const keyString = String(key);
257
- const keyKind = typeof key;
258
- const previousKeyKind = forState.devKeyKinds?.get(keyString);
259
- if (previousKeyKind && previousKeyKind !== keyKind) failForValidation(`[askr] For key type changed for ${keyString}. Keys must remain consistently typed across renders.`);
260
- keyKinds.set(keyString, keyKind);
261
- }
262
- forState.devKeyKinds = keyKinds;
263
- }
264
- function disposeItemInstance(forState, itemInstance, domCleanup) {
265
- recordBenchEvent("itemRemoved");
266
- const removedDom = itemInstance.scope.dom;
267
- try {
268
- disposeChildScope(itemInstance.scope);
269
- } catch (err) {
270
- if (isDevelopmentEnvironment()) console.error("[For] Cleanup error:", err);
271
- }
272
- if (!removedDom) return;
273
- if (removedDom instanceof Element) {
274
- if (domCleanup === "teardown") teardownNodeSubtree(removedDom);
275
- }
276
- forState.lastRemovedNodes.push(removedDom);
277
- }
278
- function createItemInstance(key, item, index, forState) {
279
- recordBenchEvent("itemCreated");
280
- const indexSignal = createForIndexSignal(index);
281
- const itemSignal = canProxyForItem(item) ? createForItemSignal(item) : null;
282
- const itemPropertySignals = itemSignal ? /* @__PURE__ */ new Map() : null;
283
- const reactiveItem = itemSignal && itemPropertySignals ? createReactiveForItem(itemSignal, itemPropertySignals) : item;
284
- let itemInstance = null;
285
- const scope = createChildScope(forState.parentInstance, key, () => {
286
- if (forState._enqueueBoundaryCommit) {
287
- forState._enqueueBoundaryCommit();
288
- return;
289
- }
290
- const parent = forState.parentInstance;
291
- if (parent) parent._enqueueRun?.();
292
- });
293
- renderItemScope(forState, scope, reactiveItem, indexSignal, key);
294
- itemInstance = {
295
- key,
296
- item,
297
- reactiveItem,
298
- itemSignal,
299
- itemPropertySignals,
300
- indexSignal,
301
- scope
302
- };
303
- return itemInstance;
304
- }
305
- function rerenderItemInstance(forState, itemInstance, item) {
306
- renderItemScope(forState, itemInstance.scope, item, itemInstance.indexSignal, itemInstance.key);
307
- }
308
- function updateItemInstance(forState, itemInstance, item) {
309
- if (itemInstance.item === item) return false;
310
- const previousItem = itemInstance.item;
311
- itemInstance.item = item;
312
- const scope = itemInstance.scope;
313
- let scopeReadsChangedSignal = false;
314
- const itemSignal = itemInstance.itemSignal;
315
- if (!itemSignal) {
316
- rerenderItemInstance(forState, itemInstance, item);
317
- return true;
318
- }
319
- const propertySignals = itemInstance.itemPropertySignals;
320
- const changedPropertySignals = [];
321
- if (propertySignals && propertySignals.size > 0) for (const [prop, propertySignal] of propertySignals) {
322
- const previousValue = readForItemProperty(previousItem, prop);
323
- const nextValue = readForItemProperty(item, prop);
324
- if (Object.is(previousValue, nextValue)) continue;
325
- if (scopeReadsSource(scope, propertySignal)) scopeReadsChangedSignal = true;
326
- changedPropertySignals.push([propertySignal, nextValue]);
327
- }
328
- if (scopeReadsSource(scope, itemSignal)) scopeReadsChangedSignal = true;
329
- const itemShapeChanged = changedPropertySignals.length === 0 && !haveSameOwnKeys(previousItem, item);
330
- const notifyReaders = !scopeReadsChangedSignal && (changedPropertySignals.length > 0 || itemShapeChanged);
331
- const visibleChange = scopeReadsChangedSignal || changedPropertySignals.length > 0 || itemShapeChanged;
332
- for (const [propertySignal, nextValue] of changedPropertySignals) {
333
- removeForParentReaders(forState, propertySignal);
334
- propertySignal.set(nextValue, notifyReaders);
335
- }
336
- removeForParentReaders(forState, itemSignal);
337
- itemSignal.set(item, notifyReaders);
338
- if (scopeReadsChangedSignal) rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);
339
- return visibleChange;
340
- }
341
- const FOR_FALLBACK_SCOPE_KEY = "__for-fallback__";
342
- function disposeFallbackScope(forState, domCleanup) {
343
- const fallbackScope = forState.fallbackScope;
344
- if (!fallbackScope) return;
345
- const removedDom = fallbackScope.dom;
346
- disposeChildScope(fallbackScope);
347
- forState.fallbackScope = null;
348
- if (!removedDom) return;
349
- if (removedDom instanceof Element) {
350
- if (domCleanup === "teardown") teardownNodeSubtree(removedDom);
351
- }
352
- forState.lastRemovedNodes.push(removedDom);
353
- }
354
- function renderFallbackScope(forState) {
355
- if (forState.fallback == null || forState.fallback === false) {
356
- if (forState.fallbackScope) disposeFallbackScope(forState, "none");
357
- forState.orderedVNodes = [];
358
- forState.orderedItems = [];
359
- return [];
360
- }
361
- const fallbackScope = forState.fallbackScope ?? createChildScope(forState.parentInstance, FOR_FALLBACK_SCOPE_KEY, () => {
362
- if (forState._enqueueBoundaryCommit) {
363
- forState._enqueueBoundaryCommit();
364
- return;
365
- }
366
- forState.parentInstance?._enqueueRun?.();
367
- });
368
- forState.fallbackScope = fallbackScope;
369
- const vnode = fallbackScope.render(() => forState.fallback);
370
- forState.orderedVNodes = vnode == null || vnode === false ? [] : [vnode];
371
- forState.orderedItems = [];
372
- return forState.orderedVNodes;
373
- }
374
- function disposeAllItems(forState, domCleanup) {
375
- const { items, orderedKeys } = forState;
376
- for (let index = 0; index < orderedKeys.length; index += 1) {
377
- const key = orderedKeys[index];
378
- const itemInstance = items.get(key);
379
- if (!itemInstance) continue;
380
- disposeItemInstance(forState, itemInstance, domCleanup);
381
- items.delete(key);
382
- }
383
- orderedKeys.length = 0;
384
- forState.orderedKeys = orderedKeys;
385
- }
386
- function reconcileForItems(forState, newArray) {
387
- forState.currentItems = newArray;
388
- validateForKeys(forState, newArray);
389
- if (BENCH_BUILD_ENABLED) resetBenchMetrics();
390
- const reconcileStartMs = BENCH_BUILD_ENABLED ? performance.now() : 0;
391
- const { items, orderedKeys, byFn } = forState;
392
- const oldLen = orderedKeys.length;
393
- const newLen = newArray.length;
394
- forState.lastRemovedNodes = [];
395
- if (newLen === 0) {
396
- if (oldLen > 0) disposeAllItems(forState, forState.fallback ? "teardown" : "none");
397
- recordBenchFastLane("TRUNCATE");
398
- forState.lastCommitStrategy = "TRUNCATE";
399
- forState.pendingDirtyIndices = null;
400
- forState.pendingSwapIndices = null;
401
- forState.pendingMoveOnly = false;
402
- if (BENCH_BUILD_ENABLED) {
403
- recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
404
- flushBenchMetrics();
405
- }
406
- return renderFallbackScope(forState);
407
- }
408
- if (forState.fallbackScope) disposeFallbackScope(forState, "none");
409
- if (oldLen < newLen) {
410
- let canUseAppendPath = true;
411
- for (let i = 0; i < oldLen; i++) if (byFn(newArray[i], i) !== orderedKeys[i]) {
412
- canUseAppendPath = false;
413
- break;
414
- }
415
- if (canUseAppendPath) {
416
- recordBenchFastLane("APPEND");
417
- forState.lastCommitStrategy = "APPEND";
418
- const resultVNodes = forState.orderedVNodes;
419
- const resultItems = forState.orderedItems;
420
- resultVNodes.length = newLen;
421
- resultItems.length = newLen;
422
- for (let i = 0; i < oldLen; i++) {
423
- const item = newArray[i];
424
- const key = orderedKeys[i];
425
- const existing = resultItems[i] ?? items.get(key);
426
- updateItemInstance(forState, existing, item);
427
- resultItems[i] = existing;
428
- resultVNodes[i] = existing.scope.vnode;
429
- }
430
- recordBenchEvent("itemReused", oldLen);
431
- for (let i = oldLen; i < newLen; i++) {
432
- const item = newArray[i];
433
- const key = byFn(item, i);
434
- const itemInstance = createItemInstance(key, item, i, forState);
435
- items.set(key, itemInstance);
436
- resultItems[i] = itemInstance;
437
- resultVNodes[i] = itemInstance.scope.vnode;
438
- orderedKeys[i] = key;
439
- }
440
- if (BENCH_BUILD_ENABLED) {
441
- recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
442
- flushBenchMetrics();
443
- }
444
- forState.orderedVNodes = resultVNodes;
445
- forState.pendingDirtyIndices = null;
446
- forState.pendingSwapIndices = null;
447
- forState.pendingMoveOnly = false;
448
- return resultVNodes;
449
- }
450
- }
451
- if (newLen < oldLen) {
452
- if (oldLen === newLen + 1) {
453
- let removedIndex = -1;
454
- for (let i = 0; i < newLen; i++) if (byFn(newArray[i], i) !== orderedKeys[i]) {
455
- removedIndex = i;
456
- break;
457
- }
458
- if (removedIndex !== -1) {
459
- let canUseRemoveOnePath = true;
460
- for (let i = removedIndex; i < newLen; i++) if (byFn(newArray[i], i) !== orderedKeys[i + 1]) {
461
- canUseRemoveOnePath = false;
462
- break;
463
- }
464
- if (canUseRemoveOnePath) {
465
- recordBenchFastLane("REMOVE_ONE");
466
- forState.lastCommitStrategy = "NO_REORDER";
467
- const previousOrderedItems = forState.orderedItems.slice();
468
- const resultVNodes = forState.orderedVNodes;
469
- const resultItems = forState.orderedItems;
470
- resultVNodes.length = newLen;
471
- resultItems.length = newLen;
472
- const dirtyIndices = [];
473
- for (let i = 0; i < newLen; i++) {
474
- const item = newArray[i];
475
- const key = i < removedIndex ? orderedKeys[i] : orderedKeys[i + 1];
476
- const existing = items.get(key);
477
- const scopeNeedsDomUpdate = existing.scope.needsDomUpdate;
478
- const itemChanged = existing.item !== item;
479
- const indexChanged = existing.indexSignal.peek() !== i;
480
- if (itemChanged) updateItemInstance(forState, existing, item);
481
- const indexVisibleChange = indexChanged ? syncForItemIndex(forState, existing, i) : false;
482
- if (itemChanged || indexVisibleChange || scopeNeedsDomUpdate) dirtyIndices.push(i);
483
- resultItems[i] = existing;
484
- resultVNodes[i] = existing.scope.vnode;
485
- }
486
- recordBenchEvent("itemReused", newLen);
487
- const removedKey = orderedKeys[removedIndex];
488
- const removedItem = items.get(removedKey);
489
- if (removedItem) {
490
- disposeItemInstance(forState, removedItem, "teardown");
491
- items.delete(removedKey);
492
- }
493
- const nextOrderedKeys = orderedKeys.slice(0, newLen);
494
- const nextOrderedItems = previousOrderedItems.slice(0, newLen);
495
- for (let i = removedIndex; i < newLen; i++) {
496
- nextOrderedKeys[i] = orderedKeys[i + 1];
497
- nextOrderedItems[i] = previousOrderedItems[i + 1];
498
- }
499
- forState.orderedKeys = nextOrderedKeys;
500
- forState.orderedItems = nextOrderedItems;
501
- if (BENCH_BUILD_ENABLED) {
502
- recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
503
- flushBenchMetrics();
504
- }
505
- forState.pendingDirtyIndices = dirtyIndices;
506
- forState.pendingSwapIndices = null;
507
- forState.pendingMoveOnly = false;
508
- return resultVNodes;
509
- }
510
- }
511
- }
512
- let canUseTruncatePath = true;
513
- for (let i = 0; i < newLen; i++) if (byFn(newArray[i], i) !== orderedKeys[i]) {
514
- canUseTruncatePath = false;
515
- break;
516
- }
517
- if (canUseTruncatePath) {
518
- recordBenchFastLane("TRUNCATE");
519
- forState.lastCommitStrategy = "TRUNCATE";
520
- const resultVNodes = forState.orderedVNodes;
521
- const resultItems = forState.orderedItems;
522
- resultVNodes.length = newLen;
523
- resultItems.length = newLen;
524
- const isFullClear = newLen === 0;
525
- for (let i = 0; i < newLen; i++) {
526
- const item = newArray[i];
527
- const key = orderedKeys[i];
528
- const existing = items.get(key);
529
- updateItemInstance(forState, existing, item);
530
- resultItems[i] = existing;
531
- resultVNodes[i] = existing.scope.vnode;
532
- }
533
- recordBenchEvent("itemReused", newLen);
534
- for (let i = newLen; i < oldLen; i++) {
535
- const key = orderedKeys[i];
536
- const itemInstance = items.get(key);
537
- if (itemInstance) {
538
- disposeItemInstance(forState, itemInstance, isFullClear ? "full-clear" : "teardown");
539
- items.delete(key);
540
- }
541
- }
542
- orderedKeys.length = newLen;
543
- forState.orderedKeys = orderedKeys;
544
- forState.orderedItems.length = newLen;
545
- if (BENCH_BUILD_ENABLED) {
546
- recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
547
- flushBenchMetrics();
548
- }
549
- forState.orderedVNodes = resultVNodes;
550
- forState.pendingDirtyIndices = null;
551
- forState.pendingSwapIndices = null;
552
- forState.pendingMoveOnly = false;
553
- return resultVNodes;
554
- }
555
- }
556
- if (oldLen === newLen) {
557
- let canUseNoReorderPath = true;
558
- for (let i = 0; i < oldLen; i++) if (byFn(newArray[i], i) !== orderedKeys[i]) {
559
- canUseNoReorderPath = false;
560
- break;
561
- }
562
- if (canUseNoReorderPath) {
563
- recordBenchFastLane("NO_REORDER");
564
- forState.lastCommitStrategy = "NO_REORDER";
565
- const resultVNodes = forState.orderedVNodes;
566
- const resultItems = forState.orderedItems;
567
- resultVNodes.length = oldLen;
568
- resultItems.length = oldLen;
569
- const dirtyIndices = [];
570
- for (let i = 0; i < oldLen; i++) {
571
- const item = newArray[i];
572
- const key = orderedKeys[i];
573
- const existing = items.get(key);
574
- const itemChanged = existing.item !== item;
575
- if (itemChanged) updateItemInstance(forState, existing, item);
576
- if (!itemChanged && existing.scope.needsDomUpdate) dirtyIndices.push(i);
577
- resultItems[i] = existing;
578
- resultVNodes[i] = existing.scope.vnode;
579
- }
580
- recordBenchEvent("itemReused", oldLen);
581
- if (BENCH_BUILD_ENABLED) {
582
- recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
583
- flushBenchMetrics();
584
- }
585
- forState.pendingDirtyIndices = dirtyIndices;
586
- forState.pendingSwapIndices = null;
587
- forState.pendingMoveOnly = false;
588
- return resultVNodes;
589
- }
590
- let firstMismatch = -1;
591
- let secondMismatch = -1;
592
- let firstMismatchKey = null;
593
- let secondMismatchKey = null;
594
- let mismatchCount = 0;
595
- let canUseSwapPath = true;
596
- for (let i = 0; i < oldLen; i++) {
597
- const item = newArray[i];
598
- const key = byFn(newArray[i], i);
599
- if (key === orderedKeys[i]) {
600
- const existing = items.get(key);
601
- if (existing && existing.item !== item) {
602
- canUseSwapPath = false;
603
- break;
604
- }
605
- continue;
606
- }
607
- mismatchCount++;
608
- if (firstMismatch === -1) {
609
- firstMismatch = i;
610
- firstMismatchKey = key;
611
- continue;
612
- }
613
- if (secondMismatch === -1) {
614
- secondMismatch = i;
615
- secondMismatchKey = key;
616
- continue;
617
- }
618
- mismatchCount = 3;
619
- break;
620
- }
621
- if (canUseSwapPath && mismatchCount === 2 && firstMismatch !== -1 && secondMismatch !== -1 && firstMismatchKey === orderedKeys[secondMismatch] && secondMismatchKey === orderedKeys[firstMismatch]) {
622
- recordBenchFastLane("SWAP");
623
- recordBenchEvent("itemMoved");
624
- recordBenchEvent("itemMoved");
625
- forState.lastCommitStrategy = "SWAP";
626
- const nextOrderedKeys = orderedKeys.slice();
627
- nextOrderedKeys[firstMismatch] = firstMismatchKey;
628
- nextOrderedKeys[secondMismatch] = secondMismatchKey;
629
- const resultVNodes = forState.orderedVNodes;
630
- const firstExisting = items.get(firstMismatchKey);
631
- const secondExisting = items.get(secondMismatchKey);
632
- const firstItem = newArray[firstMismatch];
633
- const secondItem = newArray[secondMismatch];
634
- const nextOrderedItems = forState.orderedItems.slice();
635
- nextOrderedItems[firstMismatch] = secondExisting;
636
- nextOrderedItems[secondMismatch] = firstExisting;
637
- recordBenchEvent("itemReused");
638
- recordBenchEvent("itemReused");
639
- if (firstExisting.item !== firstItem) updateItemInstance(forState, firstExisting, firstItem);
640
- if (secondExisting.item !== secondItem) updateItemInstance(forState, secondExisting, secondItem);
641
- syncForItemIndex(forState, firstExisting, firstMismatch);
642
- syncForItemIndex(forState, secondExisting, secondMismatch);
643
- resultVNodes[firstMismatch] = firstExisting.scope.vnode;
644
- resultVNodes[secondMismatch] = secondExisting.scope.vnode;
645
- forState.orderedKeys = nextOrderedKeys;
646
- forState.orderedItems = nextOrderedItems;
647
- if (BENCH_BUILD_ENABLED) {
648
- recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
649
- flushBenchMetrics();
650
- }
651
- forState.pendingDirtyIndices = null;
652
- forState.pendingSwapIndices = [firstMismatch, secondMismatch];
653
- forState.pendingMoveOnly = true;
654
- return resultVNodes;
655
- }
656
- let canUseMoveOnlyPath = true;
657
- const moveOnlyKeys = [];
658
- const moveOnlyItems = [];
659
- const moveOnlyVNodes = [];
660
- for (let i = 0; i < oldLen; i++) {
661
- const item = newArray[i];
662
- const key = byFn(item, i);
663
- const existing = items.get(key);
664
- if (!existing || existing.item !== item || existing.indexSignal._hasBeenRead && existing.indexSignal.peek() !== i) {
665
- canUseMoveOnlyPath = false;
666
- break;
667
- }
668
- moveOnlyKeys[i] = key;
669
- moveOnlyItems[i] = existing;
670
- moveOnlyVNodes[i] = existing.scope.vnode;
671
- recordBenchEvent("itemReused");
672
- }
673
- if (canUseMoveOnlyPath) {
674
- recordBenchFastLane("FULL_KEYED");
675
- forState.lastCommitStrategy = "FULL_KEYED";
676
- for (let i = 0; i < moveOnlyItems.length; i++) {
677
- syncForItemIndex(forState, moveOnlyItems[i], i);
678
- moveOnlyVNodes[i] = moveOnlyItems[i].scope.vnode;
679
- }
680
- forState.orderedKeys = moveOnlyKeys;
681
- forState.orderedItems = moveOnlyItems;
682
- forState.orderedVNodes = moveOnlyVNodes;
683
- if (BENCH_BUILD_ENABLED) {
684
- recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
685
- flushBenchMetrics();
686
- }
687
- forState.pendingDirtyIndices = null;
688
- forState.pendingSwapIndices = null;
689
- forState.pendingMoveOnly = true;
690
- return moveOnlyVNodes;
691
- }
692
- }
693
- recordBenchFastLane("FULL_KEYED");
694
- forState.lastCommitStrategy = "FULL_KEYED";
695
- const toRemove = new Set(orderedKeys);
696
- const newOrderedKeys = [];
697
- const newOrderedItems = [];
698
- const resultVNodes = [];
699
- let moveOnly = toRemove.size === newArray.length;
700
- for (let i = 0; i < newArray.length; i++) {
701
- const item = newArray[i];
702
- const key = byFn(item, i);
703
- recordBenchEvent("keyLookup");
704
- toRemove.delete(key);
705
- newOrderedKeys.push(key);
706
- const existing = items.get(key);
707
- recordBenchEvent(existing ? "keyHit" : "keyMiss");
708
- if (!existing) {
709
- const itemInstance = createItemInstance(key, item, i, forState);
710
- items.set(key, itemInstance);
711
- newOrderedItems.push(itemInstance);
712
- resultVNodes.push(itemInstance.scope.vnode);
713
- } else {
714
- recordBenchEvent("itemReused");
715
- const itemChanged = existing.item !== item;
716
- const indexChanged = existing.indexSignal.peek() !== i;
717
- if (itemChanged) {
718
- moveOnly = false;
719
- updateItemInstance(forState, existing, item);
720
- }
721
- if (indexChanged) syncForItemIndex(forState, existing, i);
722
- newOrderedItems.push(existing);
723
- resultVNodes.push(existing.scope.vnode);
724
- }
725
- }
726
- for (const key of toRemove) {
727
- moveOnly = false;
728
- const itemInstance = items.get(key);
729
- if (itemInstance) {
730
- disposeItemInstance(forState, itemInstance, "none");
731
- items.delete(key);
732
- }
733
- }
734
- forState.orderedKeys = newOrderedKeys;
735
- forState.orderedItems = newOrderedItems;
736
- if (BENCH_BUILD_ENABLED) {
737
- recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
738
- flushBenchMetrics();
739
- }
740
- forState.orderedVNodes = resultVNodes;
741
- forState.pendingDirtyIndices = null;
742
- forState.pendingSwapIndices = null;
743
- forState.pendingMoveOnly = moveOnly;
744
- return resultVNodes;
745
- }
746
- function evaluateForState(forState) {
747
- if (!Array.isArray(forState.currentItems)) throw new Error("For source must evaluate to an array");
748
- forState._needsSourceReconcile = false;
749
- return reconcileForItems(forState, forState.currentItems);
750
- }
751
- function clearForDomUpdateState(forState) {
752
- const dirtyIndices = forState.pendingDirtyIndices;
753
- if (dirtyIndices && dirtyIndices.length > 0) for (let i = 0; i < dirtyIndices.length; i++) {
754
- const itemInstance = forState.orderedItems[dirtyIndices[i]];
755
- if (itemInstance) itemInstance.scope.needsDomUpdate = false;
756
- }
757
- else for (let i = 0; i < forState.orderedKeys.length; i++) {
758
- const key = forState.orderedKeys[i];
759
- const itemInstance = forState.items.get(key);
760
- if (itemInstance) itemInstance.scope.needsDomUpdate = false;
761
- }
762
- if (forState.fallbackScope) forState.fallbackScope.needsDomUpdate = false;
763
- forState.lastRemovedNodes = [];
764
- forState.pendingDirtyIndices = null;
765
- forState.pendingSwapIndices = null;
766
- forState.pendingMoveOnly = false;
767
- forState._needsSourceReconcile = false;
768
- forState._hasResolvedItemDom = forState.orderedKeys.length > 0;
769
- }
770
- //#endregion
771
- export { clearForDomUpdateState, evaluateForState, useForState };
772
-
773
- //# sourceMappingURL=for.js.map
1
+ import { isBenchMetricScopeActive, recordBenchCounter, recordBenchEvent, recordBenchTiming, withBenchMetricScope } from "./for-bench.js";
2
+ import "./for-scopes.js";
3
+ import { reconcileForItems } from "./for-reconcile.js";
4
+ import { clearForDomUpdateState, createForState, evaluateForState, useForState } from "./for-internal.js";
5
+ export { clearForDomUpdateState, createForState, evaluateForState, isBenchMetricScopeActive, reconcileForItems, recordBenchCounter, recordBenchEvent, recordBenchTiming, useForState, withBenchMetricScope };