@askrjs/askr 0.0.50 → 0.0.52

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 (594) hide show
  1. package/dist/bench/components/benchmark-row.d.ts +2 -2
  2. package/dist/bench/components/benchmark-row.js +0 -2
  3. package/dist/bench/components/benchmark-table.js +0 -2
  4. package/dist/benchmark.d.ts +1 -2
  5. package/dist/benchmark.js +5 -6
  6. package/dist/bin/askr-ssg.d.ts +1 -2
  7. package/dist/bin/askr-ssg.js +21 -6
  8. package/dist/boot/hydration.js +10 -11
  9. package/dist/boot/index.d.ts +1 -2
  10. package/dist/boot/index.js +21 -11
  11. package/dist/boot/root-lifecycle.d.ts +6 -3
  12. package/dist/boot/root-lifecycle.js +18 -14
  13. package/dist/boot/route-startup.js +13 -4
  14. package/dist/boot/types.d.ts +1 -2
  15. package/dist/common/attr-names.js +0 -2
  16. package/dist/common/component.d.ts +1 -2
  17. package/dist/common/control.d.ts +1 -2
  18. package/dist/common/control.js +0 -2
  19. package/dist/common/dom-range.d.ts +13 -0
  20. package/dist/common/env.js +1 -7
  21. package/dist/common/error-boundary.d.ts +15 -0
  22. package/dist/common/invariant.js +15 -0
  23. package/dist/common/jsx.d.ts +1 -2
  24. package/dist/common/jsx.js +0 -2
  25. package/dist/{dev → common}/logger.js +5 -8
  26. package/dist/common/promise.js +0 -2
  27. package/dist/common/props.d.ts +1 -2
  28. package/dist/common/render-context.js +0 -2
  29. package/dist/common/route-activity.js +0 -2
  30. package/dist/common/router-internal.js +0 -2
  31. package/dist/common/router.d.ts +1 -2
  32. package/dist/common/ssr-errors.d.ts +1 -2
  33. package/dist/common/ssr-errors.js +0 -2
  34. package/dist/common/ssr.d.ts +1 -2
  35. package/dist/common/ssr.js +0 -2
  36. package/dist/common/vnode.d.ts +1 -2
  37. package/dist/common/vnode.js +0 -2
  38. package/dist/components/error-boundary.d.ts +2 -16
  39. package/dist/components/error-boundary.js +2 -76
  40. package/dist/components/index.d.ts +2 -1
  41. package/dist/components/link.d.ts +2 -2
  42. package/dist/components/link.js +2 -2
  43. package/dist/control/case.d.ts +1 -2
  44. package/dist/control/case.js +1 -2
  45. package/dist/control/for.d.ts +3 -4
  46. package/dist/control/for.js +2 -4
  47. package/dist/control/shared.d.ts +1 -2
  48. package/dist/control/shared.js +0 -2
  49. package/dist/control/show.d.ts +1 -2
  50. package/dist/control/show.js +1 -2
  51. package/dist/data/data-runtime.d.ts +1 -2
  52. package/dist/data/data-runtime.js +3 -5
  53. package/dist/data/invalidation-listeners.js +0 -2
  54. package/dist/data/invalidation.d.ts +1 -2
  55. package/dist/data/invalidation.js +2 -4
  56. package/dist/data/mutation-cell.d.ts +1 -2
  57. package/dist/data/mutation-cell.js +7 -6
  58. package/dist/data/query-cell.d.ts +3 -2
  59. package/dist/data/query-cell.js +45 -11
  60. package/dist/data/query-key.js +0 -2
  61. package/dist/data/shared.js +3 -3
  62. package/dist/data/testing.js +2 -0
  63. package/dist/data/types.d.ts +1 -2
  64. package/dist/foundations/icon/icon.d.ts +1 -2
  65. package/dist/foundations/icon/icon.js +0 -2
  66. package/dist/foundations/icon/icon.types.d.ts +1 -2
  67. package/dist/foundations/index.d.ts +1 -1
  68. package/dist/foundations/index.js +1 -1
  69. package/dist/foundations/interactions/dismissable.d.ts +1 -2
  70. package/dist/foundations/interactions/dismissable.js +0 -2
  71. package/dist/foundations/interactions/focusable.d.ts +1 -2
  72. package/dist/foundations/interactions/focusable.js +0 -2
  73. package/dist/foundations/interactions/hoverable.d.ts +1 -2
  74. package/dist/foundations/interactions/hoverable.js +0 -2
  75. package/dist/foundations/interactions/interaction-policy.d.ts +1 -2
  76. package/dist/foundations/interactions/interaction-policy.js +0 -2
  77. package/dist/foundations/interactions/pressable.d.ts +1 -2
  78. package/dist/foundations/interactions/pressable.js +0 -2
  79. package/dist/foundations/interactions/roving-focus.d.ts +1 -2
  80. package/dist/foundations/interactions/roving-focus.js +0 -2
  81. package/dist/foundations/state/controllable.d.ts +1 -3
  82. package/dist/foundations/state/controllable.js +1 -2
  83. package/dist/foundations/structures/collection.d.ts +1 -2
  84. package/dist/foundations/structures/collection.js +0 -2
  85. package/dist/foundations/structures/index.d.ts +1 -1
  86. package/dist/foundations/structures/index.js +2 -1
  87. package/dist/foundations/structures/layer.d.ts +1 -2
  88. package/dist/foundations/structures/layer.js +0 -2
  89. package/dist/foundations/structures/layout.d.ts +1 -2
  90. package/dist/foundations/structures/layout.js +0 -2
  91. package/dist/foundations/structures/portal.d.ts +2 -24
  92. package/dist/foundations/structures/portal.js +3 -187
  93. package/dist/foundations/structures/presence.d.ts +1 -2
  94. package/dist/foundations/structures/presence.js +0 -2
  95. package/dist/foundations/structures/slot.d.ts +1 -2
  96. package/dist/foundations/structures/slot.js +0 -2
  97. package/dist/foundations/utilities/aria.d.ts +1 -2
  98. package/dist/foundations/utilities/aria.js +0 -2
  99. package/dist/foundations/utilities/compose-handlers.d.ts +1 -2
  100. package/dist/foundations/utilities/compose-handlers.js +0 -2
  101. package/dist/foundations/utilities/compose-ref.d.ts +1 -2
  102. package/dist/foundations/utilities/compose-ref.js +0 -2
  103. package/dist/foundations/utilities/event-types.d.ts +1 -2
  104. package/dist/foundations/utilities/merge-props.d.ts +1 -2
  105. package/dist/foundations/utilities/merge-props.js +0 -2
  106. package/dist/foundations/utilities/use-id.d.ts +1 -2
  107. package/dist/foundations/utilities/use-id.js +0 -2
  108. package/dist/fx/fx.d.ts +1 -2
  109. package/dist/fx/fx.js +2 -4
  110. package/dist/fx/index.js +1 -0
  111. package/dist/fx/noop.js +0 -2
  112. package/dist/fx/timing.d.ts +1 -2
  113. package/dist/fx/timing.js +0 -2
  114. package/dist/index.d.ts +4 -4
  115. package/dist/index.js +4 -6
  116. package/dist/jsx/types.d.ts +1 -2
  117. package/dist/jsx/utils.d.ts +1 -2
  118. package/dist/jsx/utils.js +0 -2
  119. package/dist/jsx-dev-runtime.d.ts +16 -2
  120. package/dist/jsx-dev-runtime.js +4 -12
  121. package/dist/jsx-runtime.d.ts +16 -2
  122. package/dist/jsx-runtime.js +16 -24
  123. package/dist/jsx-runtime2.d.ts +1 -1
  124. package/dist/renderer/attributes.js +29 -6
  125. package/dist/renderer/boundaries.js +50 -174
  126. package/dist/renderer/boundary-materialization.js +72 -0
  127. package/dist/renderer/boundary-range-adoption.js +76 -0
  128. package/dist/renderer/boundary-range-sync.js +101 -0
  129. package/dist/renderer/boundary-state.js +50 -0
  130. package/dist/renderer/child-shape.js +2 -4
  131. package/dist/renderer/children-fastpath.js +149 -0
  132. package/dist/renderer/children.js +3 -140
  133. package/dist/renderer/cleanup.js +72 -15
  134. package/dist/renderer/component-host-cleanup.js +124 -49
  135. package/dist/renderer/component-host-instances.js +60 -9
  136. package/dist/renderer/component-host-replacement.js +105 -0
  137. package/dist/renderer/component-host-results.js +138 -0
  138. package/dist/renderer/component-host.js +95 -170
  139. package/dist/renderer/dom-host.js +0 -2
  140. package/dist/renderer/dom-internal.js +115 -57
  141. package/dist/renderer/dom-range.js +161 -0
  142. package/dist/renderer/dom.js +7 -5
  143. package/dist/renderer/element-children.js +112 -32
  144. package/dist/renderer/error-boundary-dom.js +70 -13
  145. package/dist/renderer/evaluate-dom-range.js +3 -4
  146. package/dist/renderer/evaluate-reconcile.js +18 -42
  147. package/dist/renderer/evaluate.js +14 -3
  148. package/dist/renderer/fastpath.js +7 -14
  149. package/dist/renderer/for-commit-dom-map.js +6 -18
  150. package/dist/renderer/for-commit-removal.js +8 -17
  151. package/dist/renderer/for-commit-reorder.js +2 -4
  152. package/dist/renderer/for-commit.js +173 -45
  153. package/dist/renderer/hydration-boundaries.js +60 -0
  154. package/dist/renderer/hydration-listener-transaction.js +49 -0
  155. package/dist/renderer/index.js +11 -8
  156. package/dist/renderer/intrinsic-blueprint-analysis.js +202 -0
  157. package/dist/renderer/intrinsic-blueprint-bindings.js +152 -0
  158. package/dist/renderer/intrinsic-blueprint-materialization.js +100 -0
  159. package/dist/renderer/intrinsic-blueprint.js +30 -0
  160. package/dist/renderer/intrinsic-hydration-adoption.js +66 -0
  161. package/dist/renderer/keyed-children.js +3 -9
  162. package/dist/renderer/keyed.js +10 -10
  163. package/dist/renderer/namespaces.js +0 -2
  164. package/dist/renderer/prop-bindings.js +59 -24
  165. package/dist/renderer/reactive-child-dom.js +10 -4
  166. package/dist/renderer/reactive-child-sources.js +0 -2
  167. package/dist/renderer/reactive-children.js +33 -24
  168. package/dist/renderer/reconcile-commit.js +0 -2
  169. package/dist/renderer/reconcile-fastpaths.js +6 -12
  170. package/dist/renderer/reconcile-resolution.js +32 -56
  171. package/dist/renderer/reconcile.js +0 -2
  172. package/dist/renderer/retained-element-rollback.js +161 -149
  173. package/dist/renderer/stable-patch.js +5 -7
  174. package/dist/renderer/static-reuse.js +0 -2
  175. package/dist/renderer/utils.js +20 -10
  176. package/dist/resources/index.js +1 -2
  177. package/dist/router/access.js +0 -2
  178. package/dist/router/activity.d.ts +1 -2
  179. package/dist/router/activity.js +20 -24
  180. package/dist/router/authoring.d.ts +1 -2
  181. package/dist/router/authoring.js +1 -3
  182. package/dist/router/index.d.ts +1 -1
  183. package/dist/router/internal-types.d.ts +1 -2
  184. package/dist/router/lazy.d.ts +1 -2
  185. package/dist/router/lazy.js +0 -2
  186. package/dist/router/manifest.d.ts +1 -2
  187. package/dist/router/manifest.js +0 -2
  188. package/dist/router/match.js +0 -2
  189. package/dist/router/navigate.d.ts +1 -2
  190. package/dist/router/navigate.js +5 -8
  191. package/dist/router/navigation-registry.d.ts +1 -2
  192. package/dist/router/navigation-registry.js +1 -3
  193. package/dist/router/navigation-scroll.d.ts +1 -2
  194. package/dist/router/navigation-scroll.js +0 -2
  195. package/dist/router/navigation-targets.d.ts +3 -4
  196. package/dist/router/navigation-targets.js +425 -44
  197. package/dist/router/policy.d.ts +1 -2
  198. package/dist/router/policy.js +0 -2
  199. package/dist/router/rendering.d.ts +1 -2
  200. package/dist/router/rendering.js +5 -3
  201. package/dist/router/resolution.d.ts +2 -16
  202. package/dist/router/resolution.js +6 -175
  203. package/dist/router/route-context.js +0 -2
  204. package/dist/router/route-matching.d.ts +19 -0
  205. package/dist/router/route-matching.js +173 -0
  206. package/dist/router/route-query.d.ts +1 -2
  207. package/dist/router/route-query.js +1 -3
  208. package/dist/router/route.js +4 -2
  209. package/dist/router/store.d.ts +1 -2
  210. package/dist/router/store.js +0 -2
  211. package/dist/router/testing.js +4 -0
  212. package/dist/runtime/access.d.ts +19 -0
  213. package/dist/runtime/access.js +0 -2
  214. package/dist/runtime/child-scope.d.ts +21 -2
  215. package/dist/runtime/child-scope.js +101 -54
  216. package/dist/runtime/component-cleanup.d.ts +1 -2
  217. package/dist/runtime/component-cleanup.js +3 -5
  218. package/dist/runtime/component-commit.js +26 -24
  219. package/dist/runtime/component-facade.js +5 -3
  220. package/dist/runtime/component-internal.d.ts +12 -7
  221. package/dist/runtime/component-internal.js +64 -46
  222. package/dist/runtime/component-lifecycle.d.ts +2 -41
  223. package/dist/runtime/component-lifecycle.js +6 -149
  224. package/dist/runtime/component-scope.d.ts +4 -5
  225. package/dist/runtime/component-scope.js +27 -8
  226. package/dist/runtime/component.js +4 -3
  227. package/dist/runtime/context.d.ts +5 -2
  228. package/dist/runtime/context.js +29 -3
  229. package/dist/runtime/control.d.ts +22 -3
  230. package/dist/runtime/control.js +168 -55
  231. package/dist/runtime/derive.d.ts +1 -2
  232. package/dist/runtime/derive.js +0 -2
  233. package/dist/runtime/dev-namespace.d.ts +30 -0
  234. package/dist/runtime/dev-namespace.js +32 -25
  235. package/dist/runtime/effect.d.ts +8 -5
  236. package/dist/runtime/effect.js +158 -75
  237. package/dist/runtime/error-boundary.d.ts +4 -0
  238. package/dist/runtime/error-boundary.js +29 -0
  239. package/dist/runtime/events.d.ts +58 -0
  240. package/dist/runtime/events.js +67 -70
  241. package/dist/runtime/execution-model.d.ts +6 -0
  242. package/dist/runtime/execution-model.js +0 -2
  243. package/dist/runtime/fastlane.d.ts +33 -0
  244. package/dist/runtime/fastlane.js +0 -2
  245. package/dist/runtime/for-bench.d.ts +1 -2
  246. package/dist/runtime/for-bench.js +9 -167
  247. package/dist/runtime/for-internal.d.ts +73 -10
  248. package/dist/runtime/for-internal.js +201 -14
  249. package/dist/runtime/for-reconcile.d.ts +1 -2
  250. package/dist/runtime/for-reconcile.js +76 -23
  251. package/dist/runtime/for-scopes.d.ts +5 -5
  252. package/dist/runtime/for-scopes.js +168 -48
  253. package/dist/runtime/for-signals.d.ts +14 -5
  254. package/dist/runtime/for-signals.js +157 -83
  255. package/dist/runtime/for-types.d.ts +8 -0
  256. package/dist/runtime/for.d.ts +2 -2
  257. package/dist/runtime/for.js +3 -3
  258. package/dist/runtime/index.d.ts +24 -0
  259. package/dist/runtime/index.js +33 -0
  260. package/dist/runtime/lifecycle-batch.d.ts +59 -0
  261. package/dist/runtime/lifecycle-batch.js +178 -0
  262. package/dist/runtime/lifecycle-operation-settlement.d.ts +5 -0
  263. package/dist/runtime/lifecycle-operation-settlement.js +51 -0
  264. package/dist/runtime/lifecycle-operations.d.ts +1 -2
  265. package/dist/runtime/lifecycle-operations.js +5 -6
  266. package/dist/runtime/perf-metrics.d.ts +27 -0
  267. package/dist/runtime/perf-metrics.js +4 -68
  268. package/dist/runtime/portal.d.ts +21 -0
  269. package/dist/runtime/portal.js +305 -0
  270. package/dist/runtime/readable.d.ts +9 -4
  271. package/dist/runtime/readable.js +41 -17
  272. package/dist/runtime/resource-cell.js +3 -5
  273. package/dist/runtime/resource-operation.d.ts +1 -2
  274. package/dist/runtime/resource-operation.js +38 -35
  275. package/dist/runtime/runtime.d.ts +2 -3
  276. package/dist/runtime/runtime.js +0 -2
  277. package/dist/runtime/scheduler.d.ts +1 -2
  278. package/dist/runtime/scheduler.js +10 -13
  279. package/dist/runtime/selector-store.js +22 -0
  280. package/dist/runtime/selector.d.ts +1 -2
  281. package/dist/runtime/selector.js +6 -29
  282. package/dist/runtime/snapshot-source.d.ts +1 -2
  283. package/dist/runtime/snapshot-source.js +0 -2
  284. package/dist/runtime/state.d.ts +1 -2
  285. package/dist/runtime/state.js +1 -3
  286. package/dist/ssg/batch-render.js +0 -2
  287. package/dist/ssg/create-static-gen.d.ts +4 -2
  288. package/dist/ssg/create-static-gen.js +66 -14
  289. package/dist/ssg/generate-metadata.js +0 -2
  290. package/dist/ssg/generation-plan.js +0 -2
  291. package/dist/ssg/incremental-manifest.js +1 -3
  292. package/dist/ssg/resolve-ssg-data.js +0 -2
  293. package/dist/ssg/route-utils.js +0 -2
  294. package/dist/ssg/static-routes.js +1 -2
  295. package/dist/ssg/types.d.ts +2 -3
  296. package/dist/ssg/write-static-files.js +16 -12
  297. package/dist/ssr/attrs.js +0 -2
  298. package/dist/ssr/boundaries.js +17 -6
  299. package/dist/ssr/component-runtime.js +4 -30
  300. package/dist/ssr/context.d.ts +1 -2
  301. package/dist/ssr/context.js +0 -2
  302. package/dist/ssr/errors.d.ts +1 -2
  303. package/dist/ssr/errors.js +0 -2
  304. package/dist/ssr/escape.js +0 -2
  305. package/dist/ssr/hydration-data.js +0 -2
  306. package/dist/ssr/hydration-verify.d.ts +1 -2
  307. package/dist/ssr/hydration-verify.js +34 -7
  308. package/dist/ssr/index-internal.d.ts +1 -2
  309. package/dist/ssr/index-internal.js +0 -2
  310. package/dist/ssr/render-keys.js +0 -2
  311. package/dist/ssr/render-resolved.d.ts +1 -2
  312. package/dist/ssr/render-resolved.js +1 -3
  313. package/dist/ssr/render-sync.d.ts +1 -2
  314. package/dist/ssr/render-sync.js +28 -20
  315. package/dist/ssr/route-policy-resolution.js +2 -3
  316. package/dist/ssr/route-render.d.ts +1 -2
  317. package/dist/ssr/route-render.js +2 -3
  318. package/dist/ssr/sink.d.ts +1 -2
  319. package/dist/ssr/sink.js +0 -2
  320. package/dist/ssr/types.d.ts +1 -2
  321. package/dist/ssr/verify-hydration.js +0 -2
  322. package/dist/testing/index.d.ts +1 -2
  323. package/dist/testing/index.js +3 -4
  324. package/package.json +60 -47
  325. package/dist/bench/components/benchmark-row.d.ts.map +0 -1
  326. package/dist/bench/components/benchmark-row.js.map +0 -1
  327. package/dist/bench/components/benchmark-table.js.map +0 -1
  328. package/dist/benchmark.d.ts.map +0 -1
  329. package/dist/benchmark.js.map +0 -1
  330. package/dist/bin/askr-ssg.d.ts.map +0 -1
  331. package/dist/bin/askr-ssg.js.map +0 -1
  332. package/dist/boot/hydration.js.map +0 -1
  333. package/dist/boot/index.d.ts.map +0 -1
  334. package/dist/boot/index.js.map +0 -1
  335. package/dist/boot/root-lifecycle.d.ts.map +0 -1
  336. package/dist/boot/root-lifecycle.js.map +0 -1
  337. package/dist/boot/route-startup.js.map +0 -1
  338. package/dist/boot/types.d.ts.map +0 -1
  339. package/dist/common/attr-names.js.map +0 -1
  340. package/dist/common/component.d.ts.map +0 -1
  341. package/dist/common/control.d.ts.map +0 -1
  342. package/dist/common/control.js.map +0 -1
  343. package/dist/common/env.js.map +0 -1
  344. package/dist/common/jsx.d.ts.map +0 -1
  345. package/dist/common/jsx.js.map +0 -1
  346. package/dist/common/promise.js.map +0 -1
  347. package/dist/common/props.d.ts.map +0 -1
  348. package/dist/common/render-context.js.map +0 -1
  349. package/dist/common/route-activity.js.map +0 -1
  350. package/dist/common/router-internal.js.map +0 -1
  351. package/dist/common/router.d.ts.map +0 -1
  352. package/dist/common/ssr-errors.d.ts.map +0 -1
  353. package/dist/common/ssr-errors.js.map +0 -1
  354. package/dist/common/ssr.d.ts.map +0 -1
  355. package/dist/common/ssr.js.map +0 -1
  356. package/dist/common/vnode.d.ts.map +0 -1
  357. package/dist/common/vnode.js.map +0 -1
  358. package/dist/components/error-boundary.d.ts.map +0 -1
  359. package/dist/components/error-boundary.js.map +0 -1
  360. package/dist/components/link.d.ts.map +0 -1
  361. package/dist/components/link.js.map +0 -1
  362. package/dist/control/case.d.ts.map +0 -1
  363. package/dist/control/case.js.map +0 -1
  364. package/dist/control/for.d.ts.map +0 -1
  365. package/dist/control/for.js.map +0 -1
  366. package/dist/control/shared.d.ts.map +0 -1
  367. package/dist/control/shared.js.map +0 -1
  368. package/dist/control/show.d.ts.map +0 -1
  369. package/dist/control/show.js.map +0 -1
  370. package/dist/data/data-runtime.d.ts.map +0 -1
  371. package/dist/data/data-runtime.js.map +0 -1
  372. package/dist/data/invalidation-listeners.js.map +0 -1
  373. package/dist/data/invalidation.d.ts.map +0 -1
  374. package/dist/data/invalidation.js.map +0 -1
  375. package/dist/data/mutation-cell.d.ts.map +0 -1
  376. package/dist/data/mutation-cell.js.map +0 -1
  377. package/dist/data/query-cell.d.ts.map +0 -1
  378. package/dist/data/query-cell.js.map +0 -1
  379. package/dist/data/query-key.js.map +0 -1
  380. package/dist/data/shared.js.map +0 -1
  381. package/dist/data/types.d.ts.map +0 -1
  382. package/dist/dev/invariant.js +0 -29
  383. package/dist/dev/invariant.js.map +0 -1
  384. package/dist/dev/logger.js.map +0 -1
  385. package/dist/foundations/icon/icon.d.ts.map +0 -1
  386. package/dist/foundations/icon/icon.js.map +0 -1
  387. package/dist/foundations/icon/icon.types.d.ts.map +0 -1
  388. package/dist/foundations/interactions/dismissable.d.ts.map +0 -1
  389. package/dist/foundations/interactions/dismissable.js.map +0 -1
  390. package/dist/foundations/interactions/focusable.d.ts.map +0 -1
  391. package/dist/foundations/interactions/focusable.js.map +0 -1
  392. package/dist/foundations/interactions/hoverable.d.ts.map +0 -1
  393. package/dist/foundations/interactions/hoverable.js.map +0 -1
  394. package/dist/foundations/interactions/interaction-policy.d.ts.map +0 -1
  395. package/dist/foundations/interactions/interaction-policy.js.map +0 -1
  396. package/dist/foundations/interactions/pressable.d.ts.map +0 -1
  397. package/dist/foundations/interactions/pressable.js.map +0 -1
  398. package/dist/foundations/interactions/roving-focus.d.ts.map +0 -1
  399. package/dist/foundations/interactions/roving-focus.js.map +0 -1
  400. package/dist/foundations/state/controllable.d.ts.map +0 -1
  401. package/dist/foundations/state/controllable.js.map +0 -1
  402. package/dist/foundations/structures/collection.d.ts.map +0 -1
  403. package/dist/foundations/structures/collection.js.map +0 -1
  404. package/dist/foundations/structures/layer.d.ts.map +0 -1
  405. package/dist/foundations/structures/layer.js.map +0 -1
  406. package/dist/foundations/structures/layout.d.ts.map +0 -1
  407. package/dist/foundations/structures/layout.js.map +0 -1
  408. package/dist/foundations/structures/portal.d.ts.map +0 -1
  409. package/dist/foundations/structures/portal.js.map +0 -1
  410. package/dist/foundations/structures/presence.d.ts.map +0 -1
  411. package/dist/foundations/structures/presence.js.map +0 -1
  412. package/dist/foundations/structures/slot.d.ts.map +0 -1
  413. package/dist/foundations/structures/slot.js.map +0 -1
  414. package/dist/foundations/utilities/aria.d.ts.map +0 -1
  415. package/dist/foundations/utilities/aria.js.map +0 -1
  416. package/dist/foundations/utilities/compose-handlers.d.ts.map +0 -1
  417. package/dist/foundations/utilities/compose-handlers.js.map +0 -1
  418. package/dist/foundations/utilities/compose-ref.d.ts.map +0 -1
  419. package/dist/foundations/utilities/compose-ref.js.map +0 -1
  420. package/dist/foundations/utilities/event-types.d.ts.map +0 -1
  421. package/dist/foundations/utilities/merge-props.d.ts.map +0 -1
  422. package/dist/foundations/utilities/merge-props.js.map +0 -1
  423. package/dist/foundations/utilities/use-id.d.ts.map +0 -1
  424. package/dist/foundations/utilities/use-id.js.map +0 -1
  425. package/dist/fx/fx.d.ts.map +0 -1
  426. package/dist/fx/fx.js.map +0 -1
  427. package/dist/fx/noop.js.map +0 -1
  428. package/dist/fx/timing.d.ts.map +0 -1
  429. package/dist/fx/timing.js.map +0 -1
  430. package/dist/index.js.map +0 -1
  431. package/dist/jsx/types.d.ts.map +0 -1
  432. package/dist/jsx/utils.d.ts.map +0 -1
  433. package/dist/jsx/utils.js.map +0 -1
  434. package/dist/jsx-dev-runtime.d.ts.map +0 -1
  435. package/dist/jsx-dev-runtime.js.map +0 -1
  436. package/dist/jsx-runtime.d.ts.map +0 -1
  437. package/dist/jsx-runtime.js.map +0 -1
  438. package/dist/renderer/attributes.js.map +0 -1
  439. package/dist/renderer/boundaries.js.map +0 -1
  440. package/dist/renderer/child-shape.js.map +0 -1
  441. package/dist/renderer/children.js.map +0 -1
  442. package/dist/renderer/cleanup.js.map +0 -1
  443. package/dist/renderer/component-host-cleanup.js.map +0 -1
  444. package/dist/renderer/component-host-instances.js.map +0 -1
  445. package/dist/renderer/component-host.js.map +0 -1
  446. package/dist/renderer/dom-host.js.map +0 -1
  447. package/dist/renderer/dom-internal.js.map +0 -1
  448. package/dist/renderer/element-children.js.map +0 -1
  449. package/dist/renderer/error-boundary-dom.js.map +0 -1
  450. package/dist/renderer/evaluate-dom-range.js.map +0 -1
  451. package/dist/renderer/evaluate-reconcile.js.map +0 -1
  452. package/dist/renderer/evaluate.js.map +0 -1
  453. package/dist/renderer/fastpath.js.map +0 -1
  454. package/dist/renderer/for-commit-dom-map.js.map +0 -1
  455. package/dist/renderer/for-commit-removal.js.map +0 -1
  456. package/dist/renderer/for-commit-reorder.js.map +0 -1
  457. package/dist/renderer/for-commit.js.map +0 -1
  458. package/dist/renderer/index.js.map +0 -1
  459. package/dist/renderer/keyed-children.js.map +0 -1
  460. package/dist/renderer/keyed.js.map +0 -1
  461. package/dist/renderer/namespaces.js.map +0 -1
  462. package/dist/renderer/prop-bindings.js.map +0 -1
  463. package/dist/renderer/reactive-child-dom.js.map +0 -1
  464. package/dist/renderer/reactive-child-sources.js.map +0 -1
  465. package/dist/renderer/reactive-children.js.map +0 -1
  466. package/dist/renderer/reconcile-commit.js.map +0 -1
  467. package/dist/renderer/reconcile-fastpaths.js.map +0 -1
  468. package/dist/renderer/reconcile-resolution.js.map +0 -1
  469. package/dist/renderer/reconcile.js.map +0 -1
  470. package/dist/renderer/retained-element-rollback.js.map +0 -1
  471. package/dist/renderer/stable-patch.js.map +0 -1
  472. package/dist/renderer/static-reuse.js.map +0 -1
  473. package/dist/renderer/utils.js.map +0 -1
  474. package/dist/router/access.js.map +0 -1
  475. package/dist/router/activity.d.ts.map +0 -1
  476. package/dist/router/activity.js.map +0 -1
  477. package/dist/router/authoring.d.ts.map +0 -1
  478. package/dist/router/authoring.js.map +0 -1
  479. package/dist/router/internal-types.d.ts.map +0 -1
  480. package/dist/router/lazy.d.ts.map +0 -1
  481. package/dist/router/lazy.js.map +0 -1
  482. package/dist/router/manifest.d.ts.map +0 -1
  483. package/dist/router/manifest.js.map +0 -1
  484. package/dist/router/match.js.map +0 -1
  485. package/dist/router/navigate.d.ts.map +0 -1
  486. package/dist/router/navigate.js.map +0 -1
  487. package/dist/router/navigation-registry.d.ts.map +0 -1
  488. package/dist/router/navigation-registry.js.map +0 -1
  489. package/dist/router/navigation-scroll.d.ts.map +0 -1
  490. package/dist/router/navigation-scroll.js.map +0 -1
  491. package/dist/router/navigation-targets.d.ts.map +0 -1
  492. package/dist/router/navigation-targets.js.map +0 -1
  493. package/dist/router/policy.d.ts.map +0 -1
  494. package/dist/router/policy.js.map +0 -1
  495. package/dist/router/rendering.d.ts.map +0 -1
  496. package/dist/router/rendering.js.map +0 -1
  497. package/dist/router/resolution.d.ts.map +0 -1
  498. package/dist/router/resolution.js.map +0 -1
  499. package/dist/router/route-context.js.map +0 -1
  500. package/dist/router/route-query.d.ts.map +0 -1
  501. package/dist/router/route-query.js.map +0 -1
  502. package/dist/router/store.d.ts.map +0 -1
  503. package/dist/router/store.js.map +0 -1
  504. package/dist/runtime/access.js.map +0 -1
  505. package/dist/runtime/child-scope.d.ts.map +0 -1
  506. package/dist/runtime/child-scope.js.map +0 -1
  507. package/dist/runtime/component-cleanup.d.ts.map +0 -1
  508. package/dist/runtime/component-cleanup.js.map +0 -1
  509. package/dist/runtime/component-commit.js.map +0 -1
  510. package/dist/runtime/component-contracts.js +0 -5
  511. package/dist/runtime/component-internal.d.ts.map +0 -1
  512. package/dist/runtime/component-internal.js.map +0 -1
  513. package/dist/runtime/component-lifecycle.d.ts.map +0 -1
  514. package/dist/runtime/component-lifecycle.js.map +0 -1
  515. package/dist/runtime/component-scope.d.ts.map +0 -1
  516. package/dist/runtime/component-scope.js.map +0 -1
  517. package/dist/runtime/context.d.ts.map +0 -1
  518. package/dist/runtime/context.js.map +0 -1
  519. package/dist/runtime/control.d.ts.map +0 -1
  520. package/dist/runtime/control.js.map +0 -1
  521. package/dist/runtime/derive.d.ts.map +0 -1
  522. package/dist/runtime/derive.js.map +0 -1
  523. package/dist/runtime/dev-namespace.js.map +0 -1
  524. package/dist/runtime/effect.d.ts.map +0 -1
  525. package/dist/runtime/effect.js.map +0 -1
  526. package/dist/runtime/events.js.map +0 -1
  527. package/dist/runtime/execution-model.js.map +0 -1
  528. package/dist/runtime/fastlane.js.map +0 -1
  529. package/dist/runtime/for-bench.d.ts.map +0 -1
  530. package/dist/runtime/for-bench.js.map +0 -1
  531. package/dist/runtime/for-internal.d.ts.map +0 -1
  532. package/dist/runtime/for-internal.js.map +0 -1
  533. package/dist/runtime/for-reconcile.d.ts.map +0 -1
  534. package/dist/runtime/for-reconcile.js.map +0 -1
  535. package/dist/runtime/for-scopes.d.ts.map +0 -1
  536. package/dist/runtime/for-scopes.js.map +0 -1
  537. package/dist/runtime/for-signals.d.ts.map +0 -1
  538. package/dist/runtime/for-signals.js.map +0 -1
  539. package/dist/runtime/lifecycle-operations.d.ts.map +0 -1
  540. package/dist/runtime/lifecycle-operations.js.map +0 -1
  541. package/dist/runtime/perf-metrics.js.map +0 -1
  542. package/dist/runtime/readable.d.ts.map +0 -1
  543. package/dist/runtime/readable.js.map +0 -1
  544. package/dist/runtime/resource-cell.js.map +0 -1
  545. package/dist/runtime/resource-operation.d.ts.map +0 -1
  546. package/dist/runtime/resource-operation.js.map +0 -1
  547. package/dist/runtime/runtime.d.ts.map +0 -1
  548. package/dist/runtime/runtime.js.map +0 -1
  549. package/dist/runtime/scheduler.d.ts.map +0 -1
  550. package/dist/runtime/scheduler.js.map +0 -1
  551. package/dist/runtime/selector.d.ts.map +0 -1
  552. package/dist/runtime/selector.js.map +0 -1
  553. package/dist/runtime/snapshot-source.d.ts.map +0 -1
  554. package/dist/runtime/snapshot-source.js.map +0 -1
  555. package/dist/runtime/state.d.ts.map +0 -1
  556. package/dist/runtime/state.js.map +0 -1
  557. package/dist/ssg/batch-render.js.map +0 -1
  558. package/dist/ssg/create-static-gen.d.ts.map +0 -1
  559. package/dist/ssg/create-static-gen.js.map +0 -1
  560. package/dist/ssg/generate-metadata.js.map +0 -1
  561. package/dist/ssg/generation-plan.js.map +0 -1
  562. package/dist/ssg/incremental-manifest.js.map +0 -1
  563. package/dist/ssg/resolve-ssg-data.js.map +0 -1
  564. package/dist/ssg/route-utils.js.map +0 -1
  565. package/dist/ssg/static-routes.js.map +0 -1
  566. package/dist/ssg/types.d.ts.map +0 -1
  567. package/dist/ssg/write-static-files.js.map +0 -1
  568. package/dist/ssr/attrs.js.map +0 -1
  569. package/dist/ssr/boundaries.js.map +0 -1
  570. package/dist/ssr/component-runtime.js.map +0 -1
  571. package/dist/ssr/context.d.ts.map +0 -1
  572. package/dist/ssr/context.js.map +0 -1
  573. package/dist/ssr/errors.d.ts.map +0 -1
  574. package/dist/ssr/errors.js.map +0 -1
  575. package/dist/ssr/escape.js.map +0 -1
  576. package/dist/ssr/hydration-data.js.map +0 -1
  577. package/dist/ssr/hydration-verify.d.ts.map +0 -1
  578. package/dist/ssr/hydration-verify.js.map +0 -1
  579. package/dist/ssr/index-internal.d.ts.map +0 -1
  580. package/dist/ssr/index-internal.js.map +0 -1
  581. package/dist/ssr/render-keys.js.map +0 -1
  582. package/dist/ssr/render-resolved.d.ts.map +0 -1
  583. package/dist/ssr/render-resolved.js.map +0 -1
  584. package/dist/ssr/render-sync.d.ts.map +0 -1
  585. package/dist/ssr/render-sync.js.map +0 -1
  586. package/dist/ssr/route-policy-resolution.js.map +0 -1
  587. package/dist/ssr/route-render.d.ts.map +0 -1
  588. package/dist/ssr/route-render.js.map +0 -1
  589. package/dist/ssr/sink.d.ts.map +0 -1
  590. package/dist/ssr/sink.js.map +0 -1
  591. package/dist/ssr/types.d.ts.map +0 -1
  592. package/dist/ssr/verify-hydration.js.map +0 -1
  593. package/dist/testing/index.d.ts.map +0 -1
  594. package/dist/testing/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"evaluate-reconcile.js","names":["sharedTagNamesEqualIgnoreCase"],"sources":["../../src/renderer/evaluate-reconcile.ts"],"sourcesContent":["import { logger } from '../dev/logger';\nimport { getRuntimeEnv } from './env';\nimport type { Props } from '../common/props';\nimport type { ComponentInstance } from '../runtime/component-contracts';\nimport { elementListeners } from './cleanup';\nimport { keyedElements } from './keyed';\nimport { createElementForNamespace, getParentNamespace } from './namespaces';\nimport { reconcileKeyedChildren } from './reconcile';\nimport { _isDOMElement, type DOMElement, type VNode } from './types';\nimport { __FOR_BOUNDARY__ } from '../common/vnode';\nimport { evaluateForState } from '../runtime/for';\nimport {\n evaluateCaseState,\n evaluateShowState,\n type ControlBoundaryState,\n} from '../runtime/control';\nimport { commitForBoundaryChildren } from './boundaries';\nimport {\n isBulkTextFastPathEligible,\n performBulkPositionalKeyedTextUpdate,\n performBulkTextReplace,\n} from './children';\nimport { getRendererDOMHost } from './dom-host';\nimport { updateUnkeyedChildren } from './element-children';\nimport { setDevValue, incDevCounter } from '../runtime/dev-namespace';\nimport { Fragment } from '../common/jsx';\nimport {\n createWrappedHandler,\n extractKey,\n getEventListenerKey,\n getEventListenerOptions,\n parseEventProp,\n setRenderedAttribute,\n tagNamesEqualIgnoreCase as sharedTagNamesEqualIgnoreCase,\n writeElementClassName,\n} from './utils';\nimport { runRetainedElementUpdate } from './retained-element-rollback';\n\ntype ComponentHostElement = Element & {\n __ASKR_INSTANCE?: ComponentInstance;\n __ASKR_INSTANCES?: ComponentInstance[];\n};\n\nexport function getRetainedHostOwnerChain(\n host: ComponentHostElement,\n owner: ComponentInstance\n): ComponentInstance[] {\n const instances = host.__ASKR_INSTANCES ?? [];\n const ownerIndex = instances.indexOf(owner);\n\n return ownerIndex >= 0 ? instances.slice(ownerIndex) : [owner];\n}\n\nexport function retainHostOwnerChain(\n host: Element,\n owner: ComponentInstance,\n retainedInstances: ComponentInstance[]\n): void {\n const componentHost = host as ComponentHostElement;\n const existing = componentHost.__ASKR_INSTANCES ?? [];\n const nextInstances = [...existing];\n\n for (const instance of retainedInstances) {\n if (!nextInstances.includes(instance)) {\n nextInstances.push(instance);\n }\n }\n\n componentHost.__ASKR_INSTANCES = nextInstances;\n componentHost.__ASKR_INSTANCE = owner;\n}\n\ninterface SimpleTextResult {\n isSimple: true;\n text: string;\n}\n\ninterface NotSimpleTextResult {\n isSimple: false;\n text?: undefined;\n}\n\ntype TextCheckResult = SimpleTextResult | NotSimpleTextResult;\n\nexport function tagNamesEqualIgnoreCase(a: string, b: string): boolean {\n return sharedTagNamesEqualIgnoreCase(a, b);\n}\n\nfunction checkSimpleText(vnodeChildren: unknown): TextCheckResult {\n if (!Array.isArray(vnodeChildren)) {\n if (\n typeof vnodeChildren === 'string' ||\n typeof vnodeChildren === 'number'\n ) {\n return { isSimple: true, text: String(vnodeChildren) };\n }\n } else if (vnodeChildren.length === 1) {\n const child = vnodeChildren[0];\n if (typeof child === 'string' || typeof child === 'number') {\n return { isSimple: true, text: String(child) };\n }\n }\n return { isSimple: false };\n}\n\nfunction tryUpdateTextInPlace(element: Element, text: string): boolean {\n if (element.childNodes.length === 1 && element.firstChild?.nodeType === 3) {\n (element.firstChild as Text).data = text;\n return true;\n }\n return false;\n}\n\nfunction buildKeyMapFromDOM(parent: Element): Map<string | number, Element> {\n const keyMap = new Map<string | number, Element>();\n for (\n let child = parent.firstElementChild;\n child;\n child = child.nextElementSibling\n ) {\n const k = child.getAttribute('data-key');\n if (k !== null) {\n keyMap.set(k, child);\n const n = Number(k);\n if (!Number.isNaN(n)) keyMap.set(n, child);\n }\n }\n return keyMap;\n}\n\nfunction getOrBuildKeyMap(\n parent: Element\n): Map<string | number, Element> | undefined {\n let keyMap = keyedElements.get(parent);\n if (!keyMap) {\n keyMap = buildKeyMapFromDOM(parent);\n if (keyMap.size > 0) {\n keyedElements.set(parent, keyMap);\n }\n }\n return keyMap.size > 0 ? keyMap : undefined;\n}\n\nfunction hasKeyedChildren(children: unknown[]): boolean {\n for (let i = 0; i < children.length; i++) {\n if (extractKey(children[i]) !== undefined) return true;\n }\n return false;\n}\n\nfunction trackBulkTextStats(\n stats: ReturnType<typeof performBulkTextReplace>\n): void {\n if (getRuntimeEnv().NODE_ENV !== 'production') {\n try {\n setDevValue('__LAST_BULK_TEXT_FASTPATH_STATS', stats);\n incDevCounter('bulkTextHits');\n } catch {\n // ignore\n }\n }\n}\n\nfunction trackBulkTextMiss(): void {\n if (getRuntimeEnv().NODE_ENV !== 'production') {\n try {\n incDevCounter('bulkTextMisses');\n } catch {\n // ignore\n }\n }\n}\n\nfunction reconcileKeyed(\n parent: Element,\n children: VNode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): void {\n if (getRuntimeEnv().ASKR_FORCE_BULK_POSREUSE === '1') {\n const result = tryForcedBulkKeyedPath(parent, children);\n if (result) return;\n }\n\n const newKeyMap = reconcileKeyedChildren(parent, children, oldKeyMap);\n keyedElements.set(parent, newKeyMap);\n}\n\nfunction tryForcedBulkKeyedPath(parent: Element, children: VNode[]): boolean {\n try {\n const keyedVnodes: Array<{ key: string | number; vnode: VNode }> = [];\n for (const child of children) {\n const key = extractKey(child);\n if (_isDOMElement(child) && key !== undefined) {\n keyedVnodes.push({\n key,\n vnode: child,\n });\n }\n }\n\n if (keyedVnodes.length === 0 || keyedVnodes.length !== children.length) {\n return false;\n }\n\n const fastPathEnv = getRuntimeEnv();\n if (\n fastPathEnv.ASKR_FASTPATH_DEBUG === '1' ||\n fastPathEnv.ASKR_FASTPATH_DEBUG === 'true'\n ) {\n logger.warn(\n '[Askr][FASTPATH] forced positional bulk keyed reuse (evaluate-level)'\n );\n }\n\n const stats = performBulkPositionalKeyedTextUpdate(parent, keyedVnodes);\n\n const statsEnv = getRuntimeEnv();\n if (\n statsEnv.NODE_ENV !== 'production' ||\n statsEnv.ASKR_FASTPATH_DEBUG === '1'\n ) {\n try {\n setDevValue('__LAST_FASTPATH_STATS', stats);\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 1);\n incDevCounter('bulkKeyedPositionalForced');\n } catch {\n // ignore\n }\n }\n\n const newMap = buildKeyMapFromDOM(parent);\n keyedElements.set(parent, newMap);\n return true;\n } catch (err) {\n const fallbackEnv = getRuntimeEnv();\n if (\n fallbackEnv.ASKR_FASTPATH_DEBUG === '1' ||\n fallbackEnv.ASKR_FASTPATH_DEBUG === 'true'\n ) {\n logger.warn(\n '[Askr][FASTPATH] forced bulk path failed, falling back',\n err\n );\n }\n return false;\n }\n}\n\nfunction reconcileUnkeyed(parent: Element, children: VNode[]): void {\n if (isBulkTextFastPathEligible(parent, children)) {\n const stats = performBulkTextReplace(parent, children);\n trackBulkTextStats(stats);\n } else {\n trackBulkTextMiss();\n updateUnkeyedChildren(parent, children);\n }\n keyedElements.delete(parent);\n}\n\nexport function updateForBoundaryChildren(\n element: Element,\n forVnode: DOMElement\n): void {\n const controlState =\n forVnode._controlState ??\n (forVnode._forState as ControlBoundaryState | undefined);\n if (!controlState) return;\n\n const childrenVNodes =\n controlState.kind === 'for'\n ? evaluateForState(controlState)\n : controlState.kind === 'show'\n ? evaluateShowState(controlState)\n : evaluateCaseState(controlState);\n commitForBoundaryChildren(element, controlState, childrenVNodes);\n}\n\nexport function updateElementChildren(\n element: Element,\n vnodeChildren: unknown,\n cleanupRangeNode: (node: Node) => void\n): void {\n const domHost = getRendererDOMHost();\n\n if (vnodeChildren === null || vnodeChildren === undefined) {\n for (let n = element.firstChild; n; ) {\n const next = n.nextSibling;\n cleanupRangeNode(n);\n n = next;\n }\n element.textContent = '';\n keyedElements.delete(element);\n return;\n }\n\n if (\n !Array.isArray(vnodeChildren) &&\n _isDOMElement(vnodeChildren) &&\n (vnodeChildren as DOMElement).type === __FOR_BOUNDARY__\n ) {\n updateForBoundaryChildren(element, vnodeChildren as DOMElement);\n return;\n }\n\n if (!Array.isArray(vnodeChildren) && isFragment(vnodeChildren)) {\n updateElementChildren(\n element,\n getFragmentChildren(vnodeChildren),\n cleanupRangeNode\n );\n return;\n }\n\n if (!Array.isArray(vnodeChildren)) {\n for (let n = element.firstChild; n; ) {\n const next = n.nextSibling;\n cleanupRangeNode(n);\n n = next;\n }\n element.textContent = '';\n const dom = domHost.createDOMNode(vnodeChildren);\n if (dom) element.appendChild(dom);\n keyedElements.delete(element);\n return;\n }\n\n if (\n vnodeChildren.length === 1 &&\n _isDOMElement(vnodeChildren[0]) &&\n (vnodeChildren[0] as DOMElement).type === __FOR_BOUNDARY__\n ) {\n updateForBoundaryChildren(element, vnodeChildren[0] as DOMElement);\n return;\n }\n\n if (hasKeyedChildren(vnodeChildren)) {\n const oldKeyMap = getOrBuildKeyMap(element);\n try {\n reconcileKeyed(element, vnodeChildren, oldKeyMap);\n } catch {\n const newKeyMap = reconcileKeyedChildren(\n element,\n vnodeChildren,\n oldKeyMap\n );\n keyedElements.set(element, newKeyMap);\n }\n } else {\n reconcileUnkeyed(element, vnodeChildren);\n }\n}\n\nexport function smartUpdateElement(\n element: Element,\n vnode: DOMElement,\n cleanupRangeNode: (node: Node) => void\n): void {\n const hadVNodeKey = Object.prototype.hasOwnProperty.call(vnode, 'key');\n const previousVNodeKey = vnode.key;\n\n runRetainedElementUpdate(\n element,\n cleanupRangeNode,\n () => applySmartUpdateElement(element, vnode, cleanupRangeNode),\n () => {\n if (hadVNodeKey) vnode.key = previousVNodeKey;\n else delete vnode.key;\n }\n );\n}\n\nfunction applySmartUpdateElement(\n element: Element,\n vnode: DOMElement,\n cleanupRangeNode: (node: Node) => void\n): void {\n const domHost = getRendererDOMHost();\n\n if (vnode.key == null && element.hasAttribute('data-key')) {\n const existingKey = element.getAttribute('data-key');\n if (existingKey !== null) {\n const numericKey = Number(existingKey);\n vnode.key = Number.isNaN(numericKey) ? existingKey : numericKey;\n }\n }\n\n let vnodeChildren = vnode.props?.children ?? vnode.children;\n\n if (\n vnodeChildren &&\n _isDOMElement(vnodeChildren) &&\n (vnodeChildren as DOMElement).type === __FOR_BOUNDARY__\n ) {\n updateElementChildren(element, vnodeChildren, cleanupRangeNode);\n domHost.updateElementFromVnode(element, vnode, false);\n return;\n }\n\n if (vnodeChildren && !Array.isArray(vnodeChildren)) {\n vnodeChildren = [vnodeChildren];\n }\n\n const textCheck = checkSimpleText(vnodeChildren);\n\n if (textCheck.isSimple && tryUpdateTextInPlace(element, textCheck.text)) {\n // Text updated in place.\n } else {\n updateElementChildren(element, vnodeChildren, cleanupRangeNode);\n }\n\n domHost.updateElementFromVnode(element, vnode, false);\n}\n\nexport function processFragmentChildren(\n target: Element,\n childArray: unknown[],\n cleanupRangeNode: (node: Node) => void\n): void {\n updateElementChildren(target, childArray, cleanupRangeNode);\n}\n\nfunction applyPropsToElement(el: Element, props: Props): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'children' || key === 'key') continue;\n if (value === undefined || value === null || value === false) continue;\n\n if (key === 'ref') {\n applyRef(el, value);\n continue;\n }\n\n const eventProp = parseEventProp(key);\n if (eventProp) {\n const { eventName, capture } = eventProp;\n const wrappedHandler = createWrappedHandler(value as EventListener, true);\n const options = getEventListenerOptions(eventName, capture);\n const listenerKey = getEventListenerKey(eventName, capture);\n\n if (options !== undefined)\n el.addEventListener(eventName, wrappedHandler, options);\n else el.addEventListener(eventName, wrappedHandler);\n\n if (!elementListeners.has(el)) elementListeners.set(el, new Map());\n elementListeners.get(el)!.set(listenerKey, {\n handler: wrappedHandler,\n original: value as EventListener,\n eventName,\n options,\n });\n continue;\n }\n\n if (key === 'class' || key === 'className') {\n writeElementClassName(el, String(value));\n } else if (key === 'value' || key === 'checked') {\n (el as HTMLElement & Props)[key] = value;\n } else {\n setRenderedAttribute(el, key, String(value));\n }\n }\n}\n\ntype Ref<T> =\n | ((value: T | null) => void)\n | { current: T | null }\n | null\n | undefined;\n\nfunction applyRef<T>(el: T, ref: unknown): void {\n const r = ref as Ref<T>;\n if (!r) return;\n if (typeof r === 'function') {\n r(el);\n return;\n }\n try {\n (r as { current: T | null }).current = el;\n } catch {\n // Ignore write failures.\n }\n}\n\nexport function tryFirstRenderKeyedChildren(\n target: Element,\n vnode: DOMElement\n): boolean {\n const children = vnode.children;\n if (!Array.isArray(children) || !hasKeyedChildren(children)) {\n return false;\n }\n\n const el = createElementForNamespace(\n vnode.type as string,\n getParentNamespace(target)\n );\n target.appendChild(el);\n\n applyPropsToElement(el, vnode.props || {});\n\n const newKeyMap = reconcileKeyedChildren(el, children, undefined);\n keyedElements.set(el, newKeyMap);\n return true;\n}\n\nexport function isFragment(vnode: unknown): vnode is DOMElement {\n return (\n _isDOMElement(vnode) &&\n typeof (vnode as DOMElement).type === 'symbol' &&\n ((vnode as DOMElement).type === Fragment ||\n String((vnode as DOMElement).type) === 'Symbol(askr.fragment)')\n );\n}\n\nexport function getFragmentChildren(vnode: DOMElement): unknown[] {\n const fragmentChildren = vnode.props?.children ?? vnode.children ?? [];\n return Array.isArray(fragmentChildren)\n ? fragmentChildren\n : [fragmentChildren];\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"evaluate.js","names":[],"sources":["../../src/renderer/evaluate.ts"],"sourcesContent":["import { getRuntimeEnv } from './env';\nimport type {\n ComponentFunction,\n ComponentInstance,\n} from '../runtime/component-contracts';\nimport { removeAllListeners } from './cleanup';\nimport { createDOMNode, syncComponentElement } from './dom';\nimport type { ElementWithContext } from './dom-host';\nimport {\n cleanupRangeNode,\n createDOMRange,\n hasDOMRange,\n updateDOMRangeForContext,\n} from './evaluate-dom-range';\nimport {\n getFragmentChildren,\n getRetainedHostOwnerChain,\n isFragment,\n processFragmentChildren,\n retainHostOwnerChain,\n smartUpdateElement,\n tagNamesEqualIgnoreCase,\n tryFirstRenderKeyedChildren,\n updateElementChildren,\n updateForBoundaryChildren,\n} from './evaluate-reconcile';\nimport { _isDOMElement, type DOMElement } from './types';\nimport { __FOR_BOUNDARY__ } from '../common/vnode';\n\nexport { clearDOMRange } from './evaluate-dom-range';\n\nexport const IS_DOM_AVAILABLE = typeof document !== 'undefined';\n\nexport function evaluate(\n node: unknown,\n target: Element | null,\n context?: object,\n retainedOwner?: ComponentInstance\n): void {\n if (!target) return;\n if (typeof document === 'undefined') {\n if (getRuntimeEnv().NODE_ENV !== 'production') {\n try {\n console.warn('[Askr] evaluate() called in non-DOM environment; no-op.');\n } catch (e) {\n void e;\n }\n }\n return;\n }\n\n if (context && hasDOMRange(context)) {\n const normalizedChildren =\n node === null || node === undefined || node === false\n ? []\n : isFragment(node)\n ? getFragmentChildren(node as DOMElement)\n : Array.isArray(node)\n ? node\n : [node];\n\n updateDOMRangeForContext(target, context, normalizedChildren);\n } else if (context) {\n createDOMRange(target, context, node);\n } else {\n let vnode = node;\n\n if (isFragment(vnode)) {\n const childArray = getFragmentChildren(vnode as DOMElement);\n if (\n childArray.length === 1 &&\n _isDOMElement(childArray[0]) &&\n typeof (childArray[0] as DOMElement).type === 'string'\n ) {\n vnode = childArray[0];\n } else {\n processFragmentChildren(target, childArray, cleanupRangeNode);\n return;\n }\n }\n\n if (\n _isDOMElement(vnode) &&\n (vnode as DOMElement).type === __FOR_BOUNDARY__\n ) {\n updateForBoundaryChildren(target, vnode as DOMElement);\n return;\n }\n\n if (Array.isArray(vnode)) {\n updateElementChildren(target, vnode, cleanupRangeNode);\n return;\n }\n\n const targetWithInstance = target as Element & {\n __ASKR_INSTANCE?: ComponentInstance;\n };\n const targetInstance =\n retainedOwner?.target === target\n ? retainedOwner\n : targetWithInstance.__ASKR_INSTANCE;\n if (targetInstance && targetInstance.target === target) {\n const retainedHostInstances = getRetainedHostOwnerChain(\n targetWithInstance,\n targetInstance\n );\n\n if (_isDOMElement(vnode) && typeof vnode.type === 'function') {\n const syncedDom = syncComponentElement(\n target,\n vnode as unknown as ElementWithContext,\n vnode.type as ComponentFunction,\n (((vnode as DOMElement).props ?? {}) as Record<string, unknown>) ||\n {},\n undefined,\n false,\n retainedHostInstances\n );\n\n if (syncedDom instanceof Element) {\n retainHostOwnerChain(\n syncedDom,\n targetInstance,\n retainedHostInstances\n );\n targetInstance.target = syncedDom;\n return;\n }\n }\n\n if (\n _isDOMElement(vnode) &&\n typeof vnode.type === 'string' &&\n tagNamesEqualIgnoreCase(target.tagName, vnode.type)\n ) {\n smartUpdateElement(target, vnode as DOMElement, cleanupRangeNode);\n return;\n }\n\n const newDom = createDOMNode(vnode);\n if (newDom && target.parentNode) {\n if (newDom instanceof Element) {\n (\n newDom as Element & { __ASKR_INSTANCE?: ComponentInstance }\n ).__ASKR_INSTANCE = targetInstance;\n targetInstance.target = newDom as Element;\n }\n removeAllListeners(target);\n target.parentNode.replaceChild(newDom, target);\n return;\n }\n }\n\n const firstChild = target.children[0] as Element | undefined;\n\n if (\n firstChild &&\n _isDOMElement(vnode) &&\n typeof vnode.type === 'string' &&\n tagNamesEqualIgnoreCase(firstChild.tagName, vnode.type)\n ) {\n smartUpdateElement(firstChild, vnode as DOMElement, cleanupRangeNode);\n } else {\n for (let node = target.firstChild; node; ) {\n const next = node.nextSibling;\n cleanupRangeNode(node);\n node = next;\n }\n target.textContent = '';\n\n if (\n _isDOMElement(vnode) &&\n typeof vnode.type === 'string' &&\n tryFirstRenderKeyedChildren(target, vnode as DOMElement)\n ) {\n return;\n }\n\n const dom = createDOMNode(vnode);\n if (dom) {\n target.appendChild(dom);\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;AAiCA,SAAgB,SACd,MACA,QACA,SACA,eACM;CACN,IAAI,CAAC,QAAQ;CACb,IAAI,OAAO,aAAa,aAAa;EACnC,IAAI,cAAc,CAAC,CAAC,aAAa,cAC/B,IAAI;GACF,QAAQ,KAAK,yDAAyD;EACxE,SAAS,GAAG,CAEZ;EAEF;CACF;CAEA,IAAI,WAAW,YAAY,OAAO,GAUhC,yBAAyB,QAAQ,SAR/B,SAAS,QAAQ,SAAS,UAAa,SAAS,QAC5C,CAAC,IACD,WAAW,IAAI,IACb,oBAAoB,IAAkB,IACtC,MAAM,QAAQ,IAAI,IAChB,OACA,CAAC,IAAI,CAE6C;MACvD,IAAI,SACT,eAAe,QAAQ,SAAS,IAAI;MAC/B;EACL,IAAI,QAAQ;EAEZ,IAAI,WAAW,KAAK,GAAG;GACrB,MAAM,aAAa,oBAAoB,KAAmB;GAC1D,IACE,WAAW,WAAW,KACtB,cAAc,WAAW,EAAE,KAC3B,OAAQ,WAAW,EAAE,CAAgB,SAAS,UAE9C,QAAQ,WAAW;QACd;IACL,wBAAwB,QAAQ,YAAY,gBAAgB;IAC5D;GACF;EACF;EAEA,IACE,cAAc,KAAK,KAClB,MAAqB,SAAS,kBAC/B;GACA,0BAA0B,QAAQ,KAAmB;GACrD;EACF;EAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;GACxB,sBAAsB,QAAQ,OAAO,gBAAgB;GACrD;EACF;EAEA,MAAM,qBAAqB;EAG3B,MAAM,iBACJ,eAAe,WAAW,SACtB,gBACA,mBAAmB;EACzB,IAAI,kBAAkB,eAAe,WAAW,QAAQ;GACtD,MAAM,wBAAwB,0BAC5B,oBACA,cACF;GAEA,IAAI,cAAc,KAAK,KAAK,OAAO,MAAM,SAAS,YAAY;IAC5D,MAAM,YAAY,qBAChB,QACA,OACA,MAAM,OACH,MAAqB,SAAS,CAAC,MAChC,CAAC,GACH,QACA,OACA,qBACF;IAEA,IAAI,qBAAqB,SAAS;KAChC,qBACE,WACA,gBACA,qBACF;KACA,eAAe,SAAS;KACxB;IACF;GACF;GAEA,IACE,cAAc,KAAK,KACnB,OAAO,MAAM,SAAS,YACtB,wBAAwB,OAAO,SAAS,MAAM,IAAI,GAClD;IACA,mBAAmB,QAAQ,OAAqB,gBAAgB;IAChE;GACF;GAEA,MAAM,SAAS,cAAc,KAAK;GAClC,IAAI,UAAU,OAAO,YAAY;IAC/B,IAAI,kBAAkB,SAAS;KAC7B,OAEE,kBAAkB;KACpB,eAAe,SAAS;IAC1B;IACA,mBAAmB,MAAM;IACzB,OAAO,WAAW,aAAa,QAAQ,MAAM;IAC7C;GACF;EACF;EAEA,MAAM,aAAa,OAAO,SAAS;EAEnC,IACE,cACA,cAAc,KAAK,KACnB,OAAO,MAAM,SAAS,YACtB,wBAAwB,WAAW,SAAS,MAAM,IAAI,GAEtD,mBAAmB,YAAY,OAAqB,gBAAgB;OAC/D;GACL,KAAK,IAAI,OAAO,OAAO,YAAY,OAAQ;IACzC,MAAM,OAAO,KAAK;IAClB,iBAAiB,IAAI;IACrB,OAAO;GACT;GACA,OAAO,cAAc;GAErB,IACE,cAAc,KAAK,KACnB,OAAO,MAAM,SAAS,YACtB,4BAA4B,QAAQ,KAAmB,GAEvD;GAGF,MAAM,MAAM,cAAc,KAAK;GAC/B,IAAI,KACF,OAAO,YAAY,GAAG;EAE1B;CACF;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fastpath.js","names":[],"sources":["../../src/renderer/fastpath.ts"],"sourcesContent":["import { createDOMNode, updateElementFromVnode } from './dom';\nimport { _reconcilerRecordedParents } from './keyed';\nimport { logger } from '../dev/logger';\nimport { getRuntimeEnv } from './env';\nimport { cleanupInstanceIfPresent, removeAllListeners } from './cleanup';\nimport { recordBenchCounter, recordBenchEvent } from '../runtime/for-bench';\nimport { setDevValue, incDevCounter } from '../runtime/dev-namespace';\nimport { isRuntimeSchedulerExecuting } from '../runtime/access';\nimport { isBulkCommitActive, markFastPathApplied } from '../runtime/fastlane';\nimport { canUseDirectReplaceChildrenSpread } from './utils';\nimport type { KeyedVnode } from './keyed-children';\n\nexport const IS_DOM_AVAILABLE = typeof document !== 'undefined';\n\n// Apply the \"renderer\" fast-path: build final node list reusing existing\n// elements by key when possible, then perform a single atomic replaceChildren\n// commit. Returns a new key map when the fast-path is applied, otherwise\n// returns null to indicate the caller should continue with fallback paths.\nexport function applyRendererFastPath(\n parent: Element,\n keyedVnodes: KeyedVnode[],\n oldKeyMap?: Map<string | number, Element>\n): Map<string | number, Element> | null {\n // SSR guard: fast-path is DOM-specific\n if (typeof document === 'undefined') return null;\n\n const totalKeyed = keyedVnodes.length;\n if (totalKeyed === 0) return null;\n\n // Dev invariant: ensure we are executing inside the scheduler/commit flush\n if (!isRuntimeSchedulerExecuting()) {\n logger.warn(\n '[Askr][FASTPATH][DEV] Fast-path reconciliation invoked outside scheduler execution'\n );\n }\n\n // Choose lookup strategy depending on size (linear scan for small lists)\n let parentChildrenArr: Element[] | undefined;\n let localOldKeyMap: Map<string | number, Element> | undefined;\n\n if (totalKeyed <= 20) {\n // Small lists: use array scan (faster than Map overhead for ≤20 items)\n try {\n parentChildrenArr = Array.from(\n parent.children,\n (child) => child as Element\n );\n } catch (e) {\n parentChildrenArr = undefined;\n void e;\n }\n } else if (!oldKeyMap || oldKeyMap.size === 0) {\n // Medium/large lists without existing key map: build from DOM\n localOldKeyMap = new Map<string | number, Element>();\n try {\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n const k = ch.getAttribute('data-key');\n if (k !== null) {\n localOldKeyMap.set(k, ch);\n const n = Number(k);\n if (!Number.isNaN(n)) localOldKeyMap.set(n, ch);\n }\n }\n } catch (e) {\n localOldKeyMap = undefined;\n void e;\n }\n }\n // else: reuse oldKeyMap directly (most common case for repeat renders)\n\n const finalNodes: Node[] = [];\n let mapLookups = 0;\n let createdNodes = 0;\n let reusedCount = 0;\n\n for (let i = 0; i < keyedVnodes.length; i++) {\n const { key, vnode } = keyedVnodes[i];\n mapLookups++;\n\n let el: Element | undefined;\n if (totalKeyed <= 20 && parentChildrenArr) {\n const ks = String(key);\n for (let j = 0; j < parentChildrenArr.length; j++) {\n const ch = parentChildrenArr[j];\n const k = ch.getAttribute('data-key');\n if (k !== null && (k === ks || Number(k) === (key as number))) {\n el = ch;\n break;\n }\n }\n if (!el) el = oldKeyMap?.get(key);\n } else {\n el = localOldKeyMap?.get(key as string | number) ?? oldKeyMap?.get(key);\n }\n\n if (el) {\n updateElementFromVnode(el, vnode);\n finalNodes.push(el);\n reusedCount++;\n } else {\n const newEl = createDOMNode(vnode);\n if (newEl) {\n finalNodes.push(newEl);\n createdNodes++;\n }\n }\n }\n\n // Atomic commit\n try {\n const tCommitStart = Date.now();\n const fragmentAppendCount = finalNodes.length;\n const useDirectReplace = canUseDirectReplaceChildrenSpread(\n finalNodes.length\n );\n const finalNodeSet = useDirectReplace ? new Set<Node>(finalNodes) : null;\n const fragment = useDirectReplace\n ? null\n : parent.ownerDocument.createDocumentFragment();\n\n if (fragment) {\n for (let i = 0; i < finalNodes.length; i++) {\n fragment.appendChild(finalNodes[i]);\n }\n }\n\n // Pre-cleanup: remove component instances that will be removed by replaceChildren\n try {\n // Keep reused nodes alive, but clean up anything still attached to the\n // parent that will be removed by replaceChildren.\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n if (finalNodeSet?.has(n)) {\n n = next;\n continue;\n }\n if (n instanceof Element) removeAllListeners(n);\n cleanupInstanceIfPresent(n);\n n = next;\n }\n } catch (e) {\n void e;\n }\n\n try {\n incDevCounter('__DOM_REPLACE_COUNT');\n setDevValue('__LAST_DOM_REPLACE_STACK_FASTPATH', new Error().stack);\n } catch (e) {\n void e;\n }\n\n if (useDirectReplace) {\n // Move-only reorder commits already have the final node set, so small\n // lists can write it directly without a fragment round-trip.\n parent.replaceChildren(...finalNodes);\n } else {\n parent.replaceChildren(fragment!);\n }\n recordBenchEvent('domMove', reusedCount);\n recordBenchEvent('domInsert', createdNodes);\n recordBenchCounter('replaceChildrenCommits');\n\n // Record that we performed exactly one DOM commit.\n try {\n setDevValue('__LAST_FASTPATH_COMMIT_COUNT', 1);\n } catch (e) {\n void e;\n }\n\n // If a runtime bulk commit is active, mark this parent as fast-path applied.\n try {\n if (isBulkCommitActive()) markFastPathApplied(parent);\n } catch (e) {\n void e;\n }\n\n // Phase: bookkeeping - populate newKeyMap\n const newKeyMap = new Map<string | number, Element>();\n for (let i = 0; i < keyedVnodes.length; i++) {\n const key = keyedVnodes[i].key;\n const node = finalNodes[i];\n if (node instanceof Element) newKeyMap.set(key, node as Element);\n }\n\n // Dev tracing\n try {\n const stats = {\n n: totalKeyed,\n moves: 0,\n lisLen: 0,\n t_lookup: 0,\n t_fragment: Date.now() - tCommitStart,\n t_commit: 0,\n t_bookkeeping: 0,\n fragmentAppendCount,\n mapLookups,\n createdNodes,\n reusedCount,\n } as const;\n if (typeof globalThis !== 'undefined') {\n setDevValue('__LAST_FASTPATH_STATS', stats);\n setDevValue('__LAST_FASTPATH_REUSED', reusedCount > 0);\n incDevCounter('fastpathHistoryPush');\n }\n const env = getRuntimeEnv();\n if (\n env.ASKR_FASTPATH_DEBUG === '1' ||\n env.ASKR_FASTPATH_DEBUG === 'true'\n ) {\n logger.warn(\n '[Askr][FASTPATH]',\n JSON.stringify({ n: totalKeyed, createdNodes, reusedCount })\n );\n }\n } catch (e) {\n void e;\n }\n\n // Record that reconciler recorded stats for this parent in this pass\n try {\n _reconcilerRecordedParents.add(parent);\n } catch (e) {\n void e;\n }\n\n return newKeyMap;\n } catch (e) {\n void e;\n return null;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"for-commit-dom-map.js","names":[],"sources":["../../src/renderer/for-commit-dom-map.ts"],"sourcesContent":["import type { ForCommitStrategy, ForState } from '../runtime/for';\nimport { keyedElements } from './keyed';\n\nexport function getOrBuildDomKeyMap(\n parent: Element\n): Map<string | number, Element> | undefined {\n let keyMap = keyedElements.get(parent);\n if (!keyMap) {\n keyMap = new Map<string | number, Element>();\n for (\n let child = parent.firstElementChild;\n child;\n child = child.nextElementSibling\n ) {\n const key = child.getAttribute('data-key');\n if (key !== null) {\n keyMap.set(key, child);\n const numericKey = Number(key);\n if (!Number.isNaN(numericKey)) {\n keyMap.set(numericKey, child);\n }\n }\n }\n if (keyMap.size > 0) {\n keyedElements.set(parent, keyMap);\n }\n }\n return keyMap.size > 0 ? keyMap : undefined;\n}\n\nexport function hydrateExistingForDomInOrder(\n parent: Element,\n forState: ForState<unknown>\n): boolean {\n if (parent.children.length !== forState.orderedKeys.length) {\n return false;\n }\n\n for (let i = 0; i < forState.orderedKeys.length; i += 1) {\n const itemKey = forState.orderedKeys[i];\n const itemInstance = forState.items.get(itemKey);\n const currentDom = parent.children[i];\n\n if (\n !itemInstance ||\n currentDom.getAttribute('data-key') !== String(itemKey)\n ) {\n return false;\n }\n\n itemInstance.scope.dom = currentDom;\n itemInstance.scope.needsDomUpdate = true;\n }\n\n return true;\n}\n\nexport function syncKeyedMapFromForState(\n parent: Element,\n forState: ForState<unknown>,\n strategy: ForCommitStrategy,\n removedNodes: Node[]\n): void {\n const existing = keyedElements.get(parent);\n const ensureMapEntry = (\n map: Map<string | number, Element>,\n key: string | number,\n element: Element\n ): void => {\n map.set(key, element);\n const keyString = String(key);\n map.set(keyString, element);\n const keyNumber = Number(keyString);\n if (!Number.isNaN(keyNumber)) {\n map.set(keyNumber, element);\n }\n };\n\n if (strategy === 'SWAP') {\n if (existing) {\n return;\n }\n }\n\n if (strategy === 'FULL_KEYED' && existing && removedNodes.length === 0) {\n return;\n }\n\n if (strategy === 'NO_REORDER') {\n if (existing && removedNodes.length === 0) {\n return;\n }\n\n if (existing) {\n for (const [mapKey, element] of existing) {\n if (element.parentNode !== parent) {\n existing.delete(mapKey);\n }\n }\n\n if (existing.size > 0) {\n keyedElements.set(parent, existing);\n } else {\n keyedElements.delete(parent);\n }\n return;\n }\n }\n\n if (strategy === 'TRUNCATE' && forState.orderedKeys.length === 0) {\n if (existing) {\n existing.clear();\n }\n keyedElements.delete(parent);\n return;\n }\n\n if (strategy === 'APPEND' && existing) {\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const key = forState.orderedKeys[i];\n if (key === null || existing.has(key)) continue;\n const itemInstance = forState.items.get(key);\n if (itemInstance?.scope.dom instanceof Element) {\n ensureMapEntry(existing, key, itemInstance.scope.dom);\n }\n }\n\n if (existing.size > 0) {\n keyedElements.set(parent, existing);\n } else {\n keyedElements.delete(parent);\n }\n return;\n }\n\n const nextMap = existing ?? new Map<string | number, Element>();\n nextMap.clear();\n\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const key = forState.orderedKeys[i];\n if (key === null) continue;\n const itemInstance = forState.items.get(key);\n if (itemInstance?.scope.dom instanceof Element) {\n ensureMapEntry(nextMap, key, itemInstance.scope.dom);\n }\n }\n\n if (nextMap.size > 0) {\n keyedElements.set(parent, nextMap);\n } else {\n keyedElements.delete(parent);\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"for-commit-removal.js","names":[],"sources":["../../src/renderer/for-commit-removal.ts"],"sourcesContent":["import {\n recordBenchCounter,\n recordBenchEvent,\n withBenchMetricScope,\n} from '../runtime/for';\nimport { teardownNodeSubtree } from './cleanup';\n\nexport function removeForBoundaryNodes(\n parent: Element,\n removedNodes: Node[]\n): void {\n if (\n removedNodes.length > 0 &&\n removedNodes.length === parent.childNodes.length\n ) {\n let canBulkClear = true;\n for (let i = 0; i < removedNodes.length; i++) {\n if (removedNodes[i].parentNode !== parent) {\n canBulkClear = false;\n break;\n }\n }\n\n if (canBulkClear) {\n for (let i = 0; i < removedNodes.length; i++) {\n recordBenchEvent('domRemove');\n teardownNodeSubtree(removedNodes[i]);\n }\n withBenchMetricScope('fullClear', () => {\n recordBenchCounter('bulkClearCommits');\n parent.textContent = '';\n });\n return;\n }\n }\n\n for (let i = 0; i < removedNodes.length; i++) {\n const node = removedNodes[i];\n if (node.parentNode === parent) {\n recordBenchEvent('domRemove');\n teardownNodeSubtree(node);\n parent.removeChild(node);\n }\n }\n}\n"],"mappings":";;;;AAOA,SAAgB,uBACd,QACA,cACM;CACN,IACE,aAAa,SAAS,KACtB,aAAa,WAAW,OAAO,WAAW,QAC1C;EACA,IAAI,eAAe;EACnB,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KACvC,IAAI,aAAa,EAAE,CAAC,eAAe,QAAQ;GACzC,eAAe;GACf;EACF;EAGF,IAAI,cAAc;GAChB,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;IAC5C,iBAAiB,WAAW;IAC5B,oBAAoB,aAAa,EAAE;GACrC;GACA,qBAAqB,mBAAmB;IACtC,mBAAmB,kBAAkB;IACrC,OAAO,cAAc;GACvB,CAAC;GACD;EACF;CACF;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;EAC5C,MAAM,OAAO,aAAa;EAC1B,IAAI,KAAK,eAAe,QAAQ;GAC9B,iBAAiB,WAAW;GAC5B,oBAAoB,IAAI;GACxB,OAAO,YAAY,IAAI;EACzB;CACF;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"for-commit-reorder.js","names":[],"sources":["../../src/renderer/for-commit-reorder.ts"],"sourcesContent":["import { recordBenchCounter, recordBenchEvent } from '../runtime/for';\nimport { canUseDirectReplaceChildrenSpread } from './utils';\n\nconst DENSE_MOVE_MINIMUM = 64;\nconst DENSE_MOVE_RATIO = 0.75;\n\nexport function replaceChildrenInOrder(\n parent: Element,\n nodes: Node[],\n allowDirectSpread: boolean\n): void {\n if (allowDirectSpread && canUseDirectReplaceChildrenSpread(nodes.length)) {\n parent.replaceChildren(...nodes);\n return;\n }\n\n const fragment = parent.ownerDocument.createDocumentFragment();\n for (let i = 0; i < nodes.length; i++) {\n fragment.appendChild(nodes[i]);\n }\n parent.replaceChildren(fragment);\n}\n\nfunction getLISIndices(sequence: number[]): number[] {\n if (sequence.length === 0) {\n return [];\n }\n\n const predecessors = sequence.slice();\n const lisIndices: number[] = [0];\n\n for (let i = 1; i < sequence.length; i += 1) {\n const current = sequence[i];\n const lastLisIndex = lisIndices[lisIndices.length - 1];\n\n if (sequence[lastLisIndex] < current) {\n predecessors[i] = lastLisIndex;\n lisIndices.push(i);\n continue;\n }\n\n let lo = 0;\n let hi = lisIndices.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (sequence[lisIndices[mid]] < current) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n if (current < sequence[lisIndices[lo]]) {\n if (lo > 0) {\n predecessors[i] = lisIndices[lo - 1];\n }\n lisIndices[lo] = i;\n }\n }\n\n let cursor = lisIndices.length - 1;\n let index = lisIndices[cursor];\n while (cursor >= 0) {\n lisIndices[cursor] = index;\n index = predecessors[index];\n cursor -= 1;\n }\n\n return lisIndices;\n}\n\nexport function commitMoveOnlyReorder(parent: Element, nodes: Node[]): boolean {\n const currentNodes = Array.from(parent.childNodes);\n if (currentNodes.length !== nodes.length) {\n return false;\n }\n\n const currentIndexByNode = new Map<Node, number>();\n for (let i = 0; i < currentNodes.length; i += 1) {\n currentIndexByNode.set(currentNodes[i], i);\n }\n\n const positions = Array.from({ length: nodes.length }, () => 0);\n for (let i = 0; i < nodes.length; i += 1) {\n const position = currentIndexByNode.get(nodes[i]);\n if (position === undefined) {\n return false;\n }\n positions[i] = position;\n }\n\n const lisIndices = getLISIndices(positions);\n if (lisIndices.length === nodes.length) {\n return true;\n }\n\n const moveCount = nodes.length - lisIndices.length;\n const denseMoveThreshold = Math.max(\n DENSE_MOVE_MINIMUM,\n Math.floor(nodes.length * DENSE_MOVE_RATIO)\n );\n\n if (moveCount >= denseMoveThreshold) {\n recordBenchEvent('domMove', moveCount);\n recordBenchCounter('replaceChildrenCommits');\n replaceChildrenInOrder(parent, nodes, false);\n return true;\n }\n\n let lisCursor = lisIndices.length - 1;\n let anchor: Node | null = null;\n\n for (let i = nodes.length - 1; i >= 0; i -= 1) {\n const node = nodes[i];\n if (lisCursor >= 0 && i === lisIndices[lisCursor]) {\n anchor = node;\n lisCursor -= 1;\n continue;\n }\n\n if (node.nextSibling !== anchor) {\n recordBenchEvent('domMove');\n parent.insertBefore(node, anchor);\n }\n\n anchor = node;\n }\n\n return true;\n}\n"],"mappings":";;;;AAGA,MAAM,qBAAqB;AAC3B,MAAM,mBAAmB;AAEzB,SAAgB,uBACd,QACA,OACA,mBACM;CACN,IAAI,qBAAqB,kCAAkC,MAAM,MAAM,GAAG;EACxE,OAAO,gBAAgB,GAAG,KAAK;EAC/B;CACF;CAEA,MAAM,WAAW,OAAO,cAAc,uBAAuB;CAC7D,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAChC,SAAS,YAAY,MAAM,EAAE;CAE/B,OAAO,gBAAgB,QAAQ;AACjC;AAEA,SAAS,cAAc,UAA8B;CACnD,IAAI,SAAS,WAAW,GACtB,OAAO,CAAC;CAGV,MAAM,eAAe,SAAS,MAAM;CACpC,MAAM,aAAuB,CAAC,CAAC;CAE/B,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;EAC3C,MAAM,UAAU,SAAS;EACzB,MAAM,eAAe,WAAW,WAAW,SAAS;EAEpD,IAAI,SAAS,gBAAgB,SAAS;GACpC,aAAa,KAAK;GAClB,WAAW,KAAK,CAAC;GACjB;EACF;EAEA,IAAI,KAAK;EACT,IAAI,KAAK,WAAW,SAAS;EAC7B,OAAO,KAAK,IAAI;GACd,MAAM,MAAO,KAAK,MAAO;GACzB,IAAI,SAAS,WAAW,QAAQ,SAC9B,KAAK,MAAM;QAEX,KAAK;EAET;EAEA,IAAI,UAAU,SAAS,WAAW,MAAM;GACtC,IAAI,KAAK,GACP,aAAa,KAAK,WAAW,KAAK;GAEpC,WAAW,MAAM;EACnB;CACF;CAEA,IAAI,SAAS,WAAW,SAAS;CACjC,IAAI,QAAQ,WAAW;CACvB,OAAO,UAAU,GAAG;EAClB,WAAW,UAAU;EACrB,QAAQ,aAAa;EACrB,UAAU;CACZ;CAEA,OAAO;AACT;AAEA,SAAgB,sBAAsB,QAAiB,OAAwB;CAC7E,MAAM,eAAe,MAAM,KAAK,OAAO,UAAU;CACjD,IAAI,aAAa,WAAW,MAAM,QAChC,OAAO;CAGT,MAAM,qCAAqB,IAAI,IAAkB;CACjD,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAC5C,mBAAmB,IAAI,aAAa,IAAI,CAAC;CAG3C,MAAM,YAAY,MAAM,KAAK,EAAE,QAAQ,MAAM,OAAO,SAAS,CAAC;CAC9D,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,MAAM,WAAW,mBAAmB,IAAI,MAAM,EAAE;EAChD,IAAI,aAAa,QACf,OAAO;EAET,UAAU,KAAK;CACjB;CAEA,MAAM,aAAa,cAAc,SAAS;CAC1C,IAAI,WAAW,WAAW,MAAM,QAC9B,OAAO;CAGT,MAAM,YAAY,MAAM,SAAS,WAAW;CAM5C,IAAI,aALuB,KAAK,IAC9B,oBACA,KAAK,MAAM,MAAM,SAAS,gBAAgB,CAG3B,GAAoB;EACnC,iBAAiB,WAAW,SAAS;EACrC,mBAAmB,wBAAwB;EAC3C,uBAAuB,QAAQ,OAAO,KAAK;EAC3C,OAAO;CACT;CAEA,IAAI,YAAY,WAAW,SAAS;CACpC,IAAI,SAAsB;CAE1B,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;EAC7C,MAAM,OAAO,MAAM;EACnB,IAAI,aAAa,KAAK,MAAM,WAAW,YAAY;GACjD,SAAS;GACT,aAAa;GACb;EACF;EAEA,IAAI,KAAK,gBAAgB,QAAQ;GAC/B,iBAAiB,SAAS;GAC1B,OAAO,aAAa,MAAM,MAAM;EAClC;EAEA,SAAS;CACX;CAEA,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"for-commit.js","names":[],"sources":["../../src/renderer/for-commit.ts"],"sourcesContent":["import type { ChildScope } from '../runtime/child-scope';\nimport {\n clearForDomUpdateState,\n recordBenchCounter,\n recordBenchEvent,\n recordBenchTiming,\n type ForState,\n withBenchMetricScope,\n} from '../runtime/for';\nimport { teardownNodeSubtree } from './cleanup';\nimport { keyedElements } from './keyed';\nimport type { VNode } from './types';\nimport { canUseDirectReplaceChildrenSpread } from './utils';\nimport {\n getOrBuildDomKeyMap,\n hydrateExistingForDomInOrder,\n syncKeyedMapFromForState,\n} from './for-commit-dom-map';\nimport {\n commitMoveOnlyReorder,\n replaceChildrenInOrder,\n} from './for-commit-reorder';\nimport { removeForBoundaryNodes } from './for-commit-removal';\n\nexport interface ForCommitRuntime {\n isProduction(): boolean;\n syncForItemDom(parent: Element, scope: ChildScope, vnode: VNode): Node | null;\n tryPatchStableForDirtyItem(scope: ChildScope): boolean;\n}\n\nexport function commitForStateBoundaryChildren(\n parent: Element,\n forState: ForState<unknown>,\n childrenVNodes: VNode[],\n runtime: ForCommitRuntime\n): void {\n const domCommitStart = performance.now();\n\n const hydrateExistingForDom = (): void => {\n if (hydrateExistingForDomInOrder(parent, forState)) {\n return;\n }\n\n const domKeyMap = getOrBuildDomKeyMap(parent);\n if (!domKeyMap) {\n return;\n }\n\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const itemKey = forState.orderedKeys[i];\n const itemInstance = forState.items.get(itemKey);\n if (!itemInstance || itemInstance.scope.dom) {\n continue;\n }\n\n const existingDom = domKeyMap.get(itemKey);\n if (!existingDom) {\n continue;\n }\n\n itemInstance.scope.dom = existingDom;\n itemInstance.scope.needsDomUpdate = true;\n }\n };\n\n if (forState.orderedKeys.length === 0) {\n removeForBoundaryNodes(parent, forState.lastRemovedNodes);\n\n const fallbackScope = forState.fallbackScope;\n const fallbackVNode = childrenVNodes[0];\n const nextDom =\n fallbackScope && fallbackVNode !== undefined\n ? runtime.syncForItemDom(parent, fallbackScope, fallbackVNode)\n : null;\n\n if (nextDom) {\n if (\n parent.childNodes.length !== 1 ||\n parent.firstChild !== nextDom ||\n forState.lastRemovedNodes.length > 0\n ) {\n parent.replaceChildren(nextDom);\n }\n } else if (parent.firstChild) {\n parent.textContent = '';\n }\n\n keyedElements.delete(parent);\n forState._hasResolvedItemDom = false;\n recordBenchTiming('domCommit', performance.now() - domCommitStart);\n clearForDomUpdateState(forState);\n return;\n }\n\n if (!forState._hasResolvedItemDom && parent.childNodes.length > 0) {\n hydrateExistingForDom();\n }\n\n const getDirtyForIndices = (): number[] => {\n const pendingDirtyIndices = forState.pendingDirtyIndices;\n if (pendingDirtyIndices && pendingDirtyIndices.length > 0) {\n return pendingDirtyIndices;\n }\n\n const dirtyIndices: number[] = [];\n for (let index = 0; index < forState.orderedKeys.length; index += 1) {\n const itemInstance = forState.orderedItems[index];\n if (itemInstance?.scope.needsDomUpdate) {\n dirtyIndices.push(index);\n }\n }\n\n return dirtyIndices;\n };\n\n let dirtyIndicesCache: number[] | null = null;\n const ensureDirtyIndices = (): number[] => {\n if (dirtyIndicesCache) {\n return dirtyIndicesCache;\n }\n\n dirtyIndicesCache = getDirtyForIndices();\n return dirtyIndicesCache;\n };\n\n const dirtyIndices =\n forState.lastCommitStrategy === 'NO_REORDER' ? ensureDirtyIndices() : [];\n let boundaryChildrenExact = false;\n\n const commitDirtyNoReorder = (dirtyIndices: number[]): void => {\n if (dirtyIndices.length === 0) {\n boundaryChildrenExact = true;\n return;\n }\n\n const orderedItems = forState.orderedItems;\n const childNodes = parent.childNodes;\n\n for (let dirtyIndex = 0; dirtyIndex < dirtyIndices.length; dirtyIndex++) {\n const i = dirtyIndices[dirtyIndex];\n const itemInstance = orderedItems[i];\n if (!itemInstance) {\n continue;\n }\n\n if (runtime.tryPatchStableForDirtyItem(itemInstance.scope)) {\n continue;\n }\n\n const dom = runtime.syncForItemDom(\n parent,\n itemInstance.scope,\n childrenVNodes[i]\n );\n if (!dom) {\n continue;\n }\n\n const anchor = childNodes[i] ?? null;\n if (dom.parentNode !== parent || dom !== anchor) {\n recordBenchEvent('domInsert');\n parent.insertBefore(dom, anchor);\n }\n }\n\n boundaryChildrenExact = true;\n };\n\n const commitPositional = (): void => {\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const itemInstance = forState.orderedItems[i];\n if (!itemInstance) {\n continue;\n }\n\n const dom = runtime.syncForItemDom(\n parent,\n itemInstance.scope,\n childrenVNodes[i]\n );\n if (!dom) {\n continue;\n }\n\n if (dom.parentNode !== parent) {\n const anchor = parent.childNodes[i] ?? null;\n recordBenchEvent('domInsert');\n parent.insertBefore(dom, anchor);\n }\n }\n\n boundaryChildrenExact = true;\n };\n\n const commitAppend = (): void => {\n const canHydrateInPlace =\n !forState._hasResolvedItemDom &&\n forState.lastRemovedNodes.length === 0 &&\n parent.childNodes.length === forState.orderedKeys.length;\n if (canHydrateInPlace) {\n let exactOrder = true;\n let currentNode = parent.firstChild;\n\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const itemInstance = forState.orderedItems[i];\n if (!itemInstance) {\n exactOrder = false;\n currentNode = currentNode?.nextSibling ?? null;\n continue;\n }\n\n const dom = runtime.syncForItemDom(\n parent,\n itemInstance.scope,\n childrenVNodes[i]\n );\n if (!dom || dom.parentNode !== parent || dom !== currentNode) {\n exactOrder = false;\n }\n\n currentNode = currentNode?.nextSibling ?? null;\n }\n\n if (exactOrder) {\n boundaryChildrenExact = true;\n return;\n }\n }\n\n withBenchMetricScope('coldCreate', () => {\n const fragment = parent.ownerDocument.createDocumentFragment();\n let hasPendingAppend = false;\n\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const itemInstance = forState.orderedItems[i];\n if (!itemInstance) {\n continue;\n }\n\n if (\n itemInstance.scope.dom?.parentNode === parent &&\n !itemInstance.scope.needsDomUpdate\n ) {\n continue;\n }\n\n const dom = runtime.syncForItemDom(\n parent,\n itemInstance.scope,\n childrenVNodes[i]\n );\n if (!dom) {\n continue;\n }\n\n if (dom.parentNode !== parent) {\n recordBenchEvent('domInsert');\n fragment.appendChild(dom);\n hasPendingAppend = true;\n }\n }\n\n if (hasPendingAppend) {\n parent.appendChild(fragment);\n }\n });\n\n boundaryChildrenExact = true;\n };\n\n const commitSwap = (): void => {\n const swapIndices = forState.pendingSwapIndices;\n if (!swapIndices) {\n return;\n }\n\n let [firstIndex, secondIndex] = swapIndices;\n if (firstIndex === secondIndex) {\n return;\n }\n\n if (firstIndex > secondIndex) {\n [firstIndex, secondIndex] = [secondIndex, firstIndex];\n }\n\n const firstKey = forState.orderedKeys[firstIndex];\n const secondKey = forState.orderedKeys[secondIndex];\n const firstItem = forState.items.get(firstKey);\n const secondItem = forState.items.get(secondKey);\n\n if (!firstItem || !secondItem) {\n commitReorder();\n return;\n }\n\n const firstDom = runtime.syncForItemDom(\n parent,\n firstItem.scope,\n childrenVNodes[firstIndex]\n );\n const secondDom = runtime.syncForItemDom(\n parent,\n secondItem.scope,\n childrenVNodes[secondIndex]\n );\n\n if (!firstDom || !secondDom) {\n commitReorder();\n return;\n }\n\n if (firstDom.parentNode !== parent || secondDom.parentNode !== parent) {\n commitReorder();\n return;\n }\n\n const firstBeforeSecond =\n (firstDom.compareDocumentPosition(secondDom) &\n Node.DOCUMENT_POSITION_FOLLOWING) !==\n 0;\n if (firstBeforeSecond) {\n boundaryChildrenExact = true;\n return;\n }\n\n const firstNextSibling = firstDom.nextSibling;\n recordBenchEvent('domMove');\n parent.insertBefore(firstDom, secondDom);\n recordBenchEvent('domMove');\n parent.insertBefore(secondDom, firstNextSibling);\n\n boundaryChildrenExact = true;\n };\n\n const commitReorder = (): void => {\n const items = forState.orderedItems;\n const count = items.length;\n\n if (forState.pendingMoveOnly && forState.lastRemovedNodes.length === 0) {\n const nodes = Array<Node>(count);\n let movedCount = 0;\n let insertedCount = 0;\n\n for (let i = 0; i < count; i++) {\n const itemInstance = items[i];\n if (!itemInstance) {\n return;\n }\n\n const scope = itemInstance.scope;\n const dom =\n scope.dom && !scope.needsDomUpdate\n ? scope.dom\n : runtime.syncForItemDom(parent, scope, childrenVNodes[i]);\n\n if (!dom) {\n return;\n }\n\n if (dom.parentNode === parent) {\n movedCount++;\n } else {\n insertedCount++;\n }\n nodes[i] = dom;\n }\n\n if (!canUseDirectReplaceChildrenSpread(count)) {\n if (movedCount > 0) {\n recordBenchEvent('domMove', movedCount);\n }\n if (insertedCount > 0) {\n recordBenchEvent('domInsert', insertedCount);\n }\n replaceChildrenInOrder(parent, nodes, false);\n boundaryChildrenExact = true;\n return;\n }\n\n if (insertedCount > 0) {\n if (movedCount > 0) {\n recordBenchEvent('domMove', movedCount);\n }\n recordBenchEvent('domInsert', insertedCount);\n replaceChildrenInOrder(parent, nodes, true);\n boundaryChildrenExact = true;\n return;\n }\n\n if (count > 1 && commitMoveOnlyReorder(parent, nodes)) {\n boundaryChildrenExact = true;\n return;\n }\n\n if (movedCount > 0) {\n recordBenchEvent('domMove', movedCount);\n }\n if (insertedCount > 0) {\n recordBenchEvent('domInsert', insertedCount);\n }\n\n replaceChildrenInOrder(parent, nodes, true);\n boundaryChildrenExact = true;\n return;\n }\n\n let hasExistingChild = false;\n for (let i = 0; i < count; i++) {\n const itemInstance = items[i];\n if (itemInstance?.scope.dom?.parentNode === parent) {\n hasExistingChild = true;\n break;\n }\n }\n\n if (!hasExistingChild) {\n withBenchMetricScope('coldCreate', () => {\n const nodes: Node[] = [];\n for (let i = 0; i < count; i++) {\n const itemInstance = items[i];\n if (!itemInstance) continue;\n const dom = runtime.syncForItemDom(\n parent,\n itemInstance.scope,\n childrenVNodes[i]\n );\n if (dom) {\n recordBenchEvent('domInsert');\n nodes.push(dom);\n }\n }\n recordBenchCounter('replaceChildrenCommits');\n replaceChildrenInOrder(parent, nodes, false);\n });\n\n boundaryChildrenExact = true;\n return;\n }\n\n if (forState.lastRemovedNodes.length === 0) {\n const nodes: Node[] = [];\n\n for (let i = 0; i < count; i++) {\n const itemInstance = items[i];\n if (!itemInstance) {\n continue;\n }\n\n const dom = runtime.syncForItemDom(\n parent,\n itemInstance.scope,\n childrenVNodes[i]\n );\n if (!dom) {\n continue;\n }\n\n recordBenchEvent(dom.parentNode === parent ? 'domMove' : 'domInsert');\n nodes.push(dom);\n }\n\n replaceChildrenInOrder(parent, nodes, false);\n boundaryChildrenExact = true;\n return;\n }\n\n for (let i = 0; i < count; i++) {\n const itemInstance = items[i];\n if (!itemInstance) {\n continue;\n }\n\n const dom = runtime.syncForItemDom(\n parent,\n itemInstance.scope,\n childrenVNodes[i]\n );\n if (!dom) {\n continue;\n }\n\n const anchor = parent.childNodes[i] ?? null;\n if (dom !== anchor) {\n recordBenchEvent('domMove');\n parent.insertBefore(dom, anchor);\n }\n }\n\n boundaryChildrenExact = true;\n };\n\n const isLocalOnlyDirtyCommit =\n forState.lastCommitStrategy === 'NO_REORDER' &&\n dirtyIndices.length > 0 &&\n forState.pendingDirtyIndices === null &&\n forState.pendingSwapIndices === null &&\n !forState.pendingMoveOnly &&\n forState.lastRemovedNodes.length === 0 &&\n parent.childNodes.length === forState.orderedKeys.length;\n\n if (isLocalOnlyDirtyCommit) {\n commitDirtyNoReorder(dirtyIndices);\n syncKeyedMapFromForState(parent, forState, 'NO_REORDER', []);\n\n recordBenchTiming('domCommit', performance.now() - domCommitStart);\n clearForDomUpdateState(forState);\n return;\n }\n\n switch (forState.lastCommitStrategy) {\n case 'NO_REORDER':\n commitDirtyNoReorder(dirtyIndices);\n break;\n case 'TRUNCATE':\n commitPositional();\n break;\n case 'APPEND':\n commitAppend();\n break;\n case 'SWAP':\n commitSwap();\n break;\n case 'FULL_KEYED':\n default:\n commitReorder();\n break;\n }\n\n removeForBoundaryNodes(parent, forState.lastRemovedNodes);\n if (forState.lastRemovedNodes.length > 0) {\n boundaryChildrenExact = false;\n }\n syncKeyedMapFromForState(\n parent,\n forState,\n forState.lastCommitStrategy,\n forState.lastRemovedNodes\n );\n\n const syncExactForBoundaryChildren = (): void => {\n const expectedNodes: Node[] = [];\n\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const itemInstance = forState.orderedItems[i];\n if (!itemInstance) {\n continue;\n }\n\n const dom =\n itemInstance.scope.dom && !itemInstance.scope.needsDomUpdate\n ? itemInstance.scope.dom\n : runtime.syncForItemDom(\n parent,\n itemInstance.scope,\n childrenVNodes[i]\n );\n if (dom) {\n expectedNodes.push(dom);\n }\n }\n\n const currentNodes = Array.from(parent.childNodes);\n if (\n currentNodes.length === expectedNodes.length &&\n currentNodes.every((node, index) => node === expectedNodes[index])\n ) {\n return;\n }\n\n const expectedNodeSet = new Set(expectedNodes);\n for (const currentNode of currentNodes) {\n if (expectedNodeSet.has(currentNode)) {\n continue;\n }\n\n teardownNodeSubtree(currentNode);\n\n if (currentNode.parentNode === parent) {\n recordBenchEvent('domRemove');\n currentNode.remove();\n }\n }\n\n replaceChildrenInOrder(parent, expectedNodes, true);\n };\n\n if (!boundaryChildrenExact) {\n syncExactForBoundaryChildren();\n }\n forState._hasResolvedItemDom = true;\n recordBenchTiming('domCommit', performance.now() - domCommitStart);\n clearForDomUpdateState(forState);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["_evaluate","_markReactivePropsDirtySource"],"sources":["../../src/renderer/index.ts"],"sourcesContent":["// Renderer barrel entrypoint.\n// Keep this file small: re-export the public surface and provide the runtime\n// renderer host used by browser composition.\n\nexport * from './types';\nexport * from './cleanup';\nexport {\n keyedElements,\n getKeyMapForElement,\n populateKeyMapForElement,\n _reconcilerRecordedParents,\n isKeyedReorderFastPathEligible,\n} from './keyed';\nexport * from './dom';\nexport { evaluate, clearDOMRange } from './evaluate';\n\nimport { evaluate as _evaluate } from './evaluate';\nimport { cleanupInstancesUnder, teardownNodeSubtree } from './cleanup';\nimport { isKeyedReorderFastPathEligible, getKeyMapForElement } from './keyed';\nimport { populateKeyMapForElement } from './keyed';\nimport { markReactivePropsDirtySource as _markReactivePropsDirtySource } from './dom';\nimport { getDefaultRuntimeInstance } from '../runtime/access';\nimport {\n configureRuntimeRenderer,\n type AskrRuntime,\n type RuntimeRendererHost,\n} from '../runtime/runtime';\n\nexport function createRendererHost(): RuntimeRendererHost {\n return {\n evaluate: _evaluate,\n cleanupInstancesUnder,\n teardownNodeSubtree,\n populateKeyMapForElement,\n getKeyMapForElement,\n isKeyedReorderFastPathEligible,\n markReactivePropsDirtySource: _markReactivePropsDirtySource,\n };\n}\n\nexport function installRendererBridge(\n runtime: AskrRuntime = getDefaultRuntimeInstance()\n): true {\n configureRuntimeRenderer(createRendererHost(), runtime);\n return true;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA4BA,SAAgB,qBAA0C;CACxD,OAAO;EACKA;EACV;EACA;EACA;EACA;EACA;EAC8BC;CAChC;AACF;AAEA,SAAgB,sBACd,UAAuB,0BAA0B,GAC3C;CACN,yBAAyB,mBAAmB,GAAG,OAAO;CACtD,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"keyed-children.js","names":[],"sources":["../../src/renderer/keyed-children.ts"],"sourcesContent":["import type { VNode } from './types';\nimport { extractKey } from './utils';\n\nexport interface KeyedVnode {\n key: string | number;\n vnode: VNode;\n}\n\nexport function extractKeyedVnodes(newChildren: VNode[]): KeyedVnode[] {\n const keyedVnodes: KeyedVnode[] = [];\n\n for (let i = 0; i < newChildren.length; i++) {\n const child = newChildren[i];\n const key = extractKey(child);\n if (key !== undefined) {\n keyedVnodes.push({ key, vnode: child });\n }\n }\n\n return keyedVnodes;\n}\n\nexport function buildDOMKeyMap(parent: Element): Map<string | number, Element> {\n const keyMap = new Map<string | number, Element>();\n try {\n for (let el = parent.firstElementChild; el; el = el.nextElementSibling) {\n const k = el.getAttribute('data-key');\n if (k !== null) {\n keyMap.set(k, el);\n const n = Number(k);\n if (!Number.isNaN(n)) keyMap.set(n, el);\n }\n }\n } catch {\n // Ignore DOM access failures; callers can fall back to reconciliation.\n }\n return keyMap;\n}\n"],"mappings":";;AAQA,SAAgB,mBAAmB,aAAoC;CACrE,MAAM,cAA4B,CAAC;CAEnC,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,QAAQ,YAAY;EAC1B,MAAM,MAAM,WAAW,KAAK;EAC5B,IAAI,QAAQ,QACV,YAAY,KAAK;GAAE;GAAK,OAAO;EAAM,CAAC;CAE1C;CAEA,OAAO;AACT;AAEA,SAAgB,eAAe,QAAgD;CAC7E,MAAM,yBAAS,IAAI,IAA8B;CACjD,IAAI;EACF,KAAK,IAAI,KAAK,OAAO,mBAAmB,IAAI,KAAK,GAAG,oBAAoB;GACtE,MAAM,IAAI,GAAG,aAAa,UAAU;GACpC,IAAI,MAAM,MAAM;IACd,OAAO,IAAI,GAAG,EAAE;IAChB,MAAM,IAAI,OAAO,CAAC;IAClB,IAAI,CAAC,OAAO,MAAM,CAAC,GAAG,OAAO,IAAI,GAAG,EAAE;GACxC;EACF;CACF,QAAQ,CAER;CACA,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"keyed.js","names":[],"sources":["../../src/renderer/keyed.ts"],"sourcesContent":["import type { VNode } from './types';\nimport { extractKeyedVnodes, type KeyedVnode } from './keyed-children';\nimport {\n isIgnoredForPropChanges,\n hasPropChanged,\n buildKeyMapFromChildren,\n} from './utils';\n\nexport type { KeyedVnode } from './keyed-children';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Key Map Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const keyedElements = new WeakMap<\n Element,\n Map<string | number, Element>\n>();\n\n/**\n * Retrieve existing keyed map for a parent element (runtime use)\n */\nexport function getKeyMapForElement(el: Element) {\n return keyedElements.get(el);\n}\n\n/**\n * Populate a keyed map for an element by scanning its immediate children\n * for `data-key` attributes. Proactive initialization for runtime layers.\n */\nexport function populateKeyMapForElement(parent: Element): void {\n try {\n if (keyedElements.has(parent)) return;\n\n let domMap = buildKeyMapFromChildren(parent);\n\n // Fallback: map by textContent when keys are not materialized as attrs\n if (domMap.size === 0) {\n domMap = new Map();\n const children = Array.from(parent.children);\n for (const ch of children) {\n const text = (ch.textContent || '').trim();\n if (text) {\n domMap.set(text, ch);\n const n = Number(text);\n if (!Number.isNaN(n)) domMap.set(n, ch);\n }\n }\n }\n\n if (domMap.size > 0) keyedElements.set(parent, domMap);\n } catch {\n // ignore\n }\n}\n\n// Track which parents had the reconciler record fast-path stats during the\n// current evaluation, so we can preserve diagnostics across additional\n// reconciliations within the same render pass without leaking between runs.\nexport const _reconcilerRecordedParents = new WeakSet<Element>();\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Fast-Path Eligibility\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Configuration: LIS fast-path thresholds\nconst LIS_THRESHOLD_MIN = 64; // Minimum list size for LIS optimization\n\n/**\n * Compute LIS (Longest Increasing Subsequence) length for positions\n */\nfunction computeLISLength(positions: number[]): number {\n const tails: number[] = [];\n for (const pos of positions) {\n if (pos === -1) continue;\n let lo = 0;\n let hi = tails.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid] < pos) lo = mid + 1;\n else hi = mid;\n }\n if (lo === tails.length) tails.push(pos);\n else tails[lo] = pos;\n }\n return tails.length;\n}\n\ninterface CurrentKeyOrderSnapshot {\n keyCount: number;\n currentKeys: string[];\n}\n\nfunction collectCurrentKeyOrder(\n parent: Element,\n oldKeyMap: Map<string | number, Element> | undefined\n): CurrentKeyOrderSnapshot {\n const currentKeys: string[] = [];\n\n if (oldKeyMap && oldKeyMap.size > 0) {\n let lastElement: Element | null = null;\n let keyCount = 0;\n\n for (const [key, el] of oldKeyMap) {\n if (el === lastElement) {\n continue;\n }\n\n lastElement = el;\n const normalizedKey = String(key);\n currentKeys.push(normalizedKey);\n\n keyCount++;\n }\n\n if (keyCount > 0) {\n return { keyCount, currentKeys };\n }\n }\n\n let keyCount = 0;\n\n try {\n for (let el = parent.firstElementChild; el; el = el.nextElementSibling) {\n const keyAttr = el.getAttribute('data-key');\n if (keyAttr === null) {\n continue;\n }\n\n currentKeys.push(keyAttr);\n keyCount++;\n }\n } catch {\n // ignore\n }\n\n return { keyCount, currentKeys };\n}\n\n/**\n * Check for prop changes between vnodes and existing elements\n */\nexport interface KeyedReorderDecision {\n useFastPath: boolean;\n totalKeyed: number;\n totalChildren: number;\n currentKeyCount: number;\n moveCount: number;\n lisLen: number;\n hasPropChanges: boolean;\n isWholeKeyedList: boolean;\n}\n\nfunction checkVnodePropChanges(\n keyedVnodes: KeyedVnode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): boolean {\n for (const { key, vnode } of keyedVnodes) {\n const el = oldKeyMap?.get(key);\n if (!el || typeof vnode !== 'object' || vnode === null) continue;\n const vnodeObj = vnode as unknown as { props?: Record<string, unknown> };\n const props = vnodeObj.props || {};\n for (const k of Object.keys(props)) {\n if (isIgnoredForPropChanges(k)) continue;\n if (hasPropChanged(el, k, props[k])) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Plan keyed reorder eligibility from one snapshot of keyed order and props.\n */\nexport function planKeyedReorderFastPath(\n parent: Element,\n keyedVnodes: KeyedVnode[],\n totalChildren: number,\n oldKeyMap: Map<string | number, Element> | undefined\n): KeyedReorderDecision {\n const totalKeyed = keyedVnodes.length;\n const isWholeKeyedList = totalKeyed === totalChildren;\n const shouldEvaluateShape =\n isWholeKeyedList && totalKeyed >= LIS_THRESHOLD_MIN;\n\n if (!shouldEvaluateShape) {\n return {\n useFastPath: false,\n totalKeyed,\n totalChildren,\n currentKeyCount: 0,\n moveCount: 0,\n lisLen: 0,\n hasPropChanges: false,\n isWholeKeyedList,\n };\n }\n\n const hasPropChanges = checkVnodePropChanges(keyedVnodes, oldKeyMap);\n if (hasPropChanges) {\n return {\n useFastPath: false,\n totalKeyed,\n totalChildren,\n currentKeyCount: 0,\n moveCount: 0,\n lisLen: 0,\n hasPropChanges,\n isWholeKeyedList,\n };\n }\n\n const { keyCount: currentKeyCount, currentKeys } = collectCurrentKeyOrder(\n parent,\n oldKeyMap\n );\n\n let moveCount = 0;\n for (let i = 0; i < totalKeyed; i++) {\n if (currentKeys[i] !== String(keyedVnodes[i].key)) {\n moveCount++;\n }\n }\n\n const FAST_MOVE_THRESHOLD_ABS = 64;\n const FAST_MOVE_THRESHOLD_REL = 0.1;\n const cheapMoveTrigger =\n shouldEvaluateShape &&\n currentKeyCount > 0 &&\n moveCount >\n Math.max(\n FAST_MOVE_THRESHOLD_ABS,\n Math.floor(totalKeyed * FAST_MOVE_THRESHOLD_REL)\n );\n\n let lisTrigger = false;\n let lisLen = 0;\n if (shouldEvaluateShape && !cheapMoveTrigger) {\n const indexByKey = new Map<string, number>();\n for (let i = 0; i < currentKeys.length; i++) {\n indexByKey.set(currentKeys[i], i);\n }\n\n const positions: number[] = Array(totalKeyed).fill(-1);\n for (let i = 0; i < totalKeyed; i++) {\n positions[i] = indexByKey.get(String(keyedVnodes[i].key)) ?? -1;\n }\n lisLen = computeLISLength(positions);\n lisTrigger = lisLen < Math.floor(totalKeyed * 0.5);\n }\n\n if (!shouldEvaluateShape || !(cheapMoveTrigger || lisTrigger)) {\n return {\n useFastPath: false,\n totalKeyed,\n totalChildren,\n currentKeyCount,\n moveCount,\n lisLen,\n hasPropChanges: false,\n isWholeKeyedList,\n };\n }\n\n return {\n useFastPath: true,\n totalKeyed,\n totalChildren,\n currentKeyCount,\n moveCount,\n lisLen,\n hasPropChanges: false,\n isWholeKeyedList,\n } as const;\n}\n\nexport function isKeyedReorderFastPathEligible(\n parent: Element,\n newChildren: VNode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): KeyedReorderDecision {\n return planKeyedReorderFastPath(\n parent,\n extractKeyedVnodes(newChildren),\n newChildren.length,\n oldKeyMap\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"namespaces.js","names":[],"sources":["../../src/renderer/namespaces.ts"],"sourcesContent":["import { tagNamesEqualIgnoreCase } from './utils';\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\nexport function getParentNamespace(parent: Element): string | undefined {\n return parent.namespaceURI === SVG_NAMESPACE ? SVG_NAMESPACE : undefined;\n}\n\nexport function resolveChildNamespace(\n type: string,\n parentNamespace?: string\n): string | undefined {\n if (type === 'svg') return SVG_NAMESPACE;\n if (parentNamespace === SVG_NAMESPACE && type !== 'foreignObject') {\n return SVG_NAMESPACE;\n }\n return undefined;\n}\n\nexport function createElementForNamespace(\n type: string,\n parentNamespace?: string,\n ownerDocument: Document = document\n): Element {\n const namespace = resolveChildNamespace(type, parentNamespace);\n return namespace\n ? ownerDocument.createElementNS(namespace, type)\n : ownerDocument.createElement(type);\n}\n\nexport function canReuseIntrinsicElementInNamespace(\n existing: Element,\n type: string,\n parentNamespace: string | undefined\n): boolean {\n if (!tagNamesEqualIgnoreCase(existing.tagName, type)) {\n return false;\n }\n\n const expectedNamespace = resolveChildNamespace(type, parentNamespace);\n return expectedNamespace === undefined\n ? true\n : existing.namespaceURI === expectedNamespace;\n}\n"],"mappings":";;AAEA,MAAa,gBAAgB;AAE7B,SAAgB,mBAAmB,QAAqC;CACtE,OAAO,OAAO,iBAAA,+BAAiC,gBAAgB;AACjE;AAEA,SAAgB,sBACd,MACA,iBACoB;CACpB,IAAI,SAAS,OAAO,OAAO;CAC3B,IAAI,oBAAA,gCAAqC,SAAS,iBAChD,OAAO;AAGX;AAEA,SAAgB,0BACd,MACA,iBACA,gBAA0B,UACjB;CACT,MAAM,YAAY,sBAAsB,MAAM,eAAe;CAC7D,OAAO,YACH,cAAc,gBAAgB,WAAW,IAAI,IAC7C,cAAc,cAAc,IAAI;AACtC;AAEA,SAAgB,oCACd,UACA,MACA,iBACS;CACT,IAAI,CAAC,wBAAwB,SAAS,SAAS,IAAI,GACjD,OAAO;CAGT,MAAM,oBAAoB,sBAAsB,MAAM,eAAe;CACrE,OAAO,sBAAsB,SACzB,OACA,SAAS,iBAAiB;AAChC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prop-bindings.js","names":[],"sources":["../../src/renderer/prop-bindings.ts"],"sourcesContent":["import { logger } from '../dev/logger';\nimport { incDevCounter } from '../runtime/dev-namespace';\nimport {\n createFineGrainedEffect,\n markFineGrainedEffectsDirtySource,\n type FineGrainedEffectHandle,\n} from '../runtime/effect';\nimport { isBenchMetricScopeActive, recordBenchCounter } from '../runtime/for';\nimport { incrementPerfMetric } from '../runtime/perf-metrics';\nimport type { ReadableSource } from '../runtime/readable';\nimport {\n isEventDelegationEnabled,\n addDelegatedListener,\n getDelegatedHandlerForElement,\n getDelegatedHandlersForElement,\n updateDelegatedListener,\n removeDelegatedListener,\n isDelegatedEvent,\n} from '../runtime/events';\nimport { applyScalarPropValue, removeStaleAttributes } from './attributes';\nimport {\n elementListeners,\n elementReactivePropsCleanup,\n REACTIVE_CHILDREN_KEY,\n type ReactivePropCleanupEntry,\n updateElementRef,\n} from './cleanup';\nimport { getRuntimeEnv } from './env';\nimport type { DOMElement } from './types';\nimport {\n createMutableWrappedHandler,\n getEventListenerKey,\n getEventListenerOptions,\n isSkippedProp,\n parseEventProp,\n} from './utils';\n\ninterface ReactivePropDescriptor {\n el: Element;\n propName: string;\n propFn: () => unknown;\n tagName: string;\n lastClassTokens: string[] | null;\n}\n\nconst reactivePropRegistry = new Set<ReactivePropDescriptor>();\n\nfunction addTrackedListener(\n el: Element,\n eventName: string,\n handler: EventListener,\n capture = false\n): void {\n const useDelegation =\n !capture && isEventDelegationEnabled() && isDelegatedEvent(eventName);\n const listenerKey = getEventListenerKey(eventName, capture);\n\n if (useDelegation) {\n addDelegatedListener(el, eventName, handler, handler, undefined);\n if (isBenchMetricScopeActive('coldCreate')) {\n recordBenchCounter('listenerBindings');\n }\n return;\n }\n\n const options = getEventListenerOptions(eventName, capture);\n const mutableHandler = createMutableWrappedHandler(handler, true);\n const trackedHandler = mutableHandler.handler;\n\n if (options !== undefined) {\n el.addEventListener(eventName, trackedHandler, options);\n } else {\n el.addEventListener(eventName, trackedHandler);\n }\n incDevCounter('listenerAdds');\n\n if (!elementListeners.has(el)) {\n elementListeners.set(el, new Map());\n }\n elementListeners.get(el)!.set(listenerKey, {\n handler: trackedHandler,\n original: handler,\n eventName,\n options,\n isDelegated: false,\n updateHandler: mutableHandler?.updateHandler,\n });\n\n if (isBenchMetricScopeActive('coldCreate')) {\n recordBenchCounter('listenerBindings');\n }\n}\n\nexport function markReactivePropsDirtySource(\n source: ReadableSource<unknown>\n): void {\n markFineGrainedEffectsDirtySource(source);\n}\n\nfunction setupReactiveProp(\n el: Element,\n propName: string,\n propFn: () => unknown,\n tagName: string\n): { cleanup: () => void; updateFn: (nextFn: () => unknown) => void } {\n const descriptor: ReactivePropDescriptor = {\n el,\n propName,\n propFn,\n tagName,\n lastClassTokens: null,\n };\n\n let effectHandle: FineGrainedEffectHandle<unknown> | null = null;\n\n reactivePropRegistry.add(descriptor);\n effectHandle = createFineGrainedEffect({\n lane: 'reactive',\n compute: () => descriptor.propFn(),\n commit: (value, previousValue) => {\n incrementPerfMetric('reactivePropReevaluations');\n applyScalarPropValue(\n el,\n propName,\n value,\n tagName,\n previousValue,\n descriptor\n );\n },\n equals: (previousValue, nextValue) => {\n if (Object.is(previousValue, nextValue)) {\n incrementPerfMetric('skippedDomPropWrites');\n return true;\n }\n return false;\n },\n onError: (err) => {\n if (getRuntimeEnv().NODE_ENV !== 'production') {\n logger.warn('[Askr] Reactive prop update failed:', err);\n }\n },\n });\n\n if (isBenchMetricScopeActive('coldCreate')) {\n recordBenchCounter('reactivePropsMounted');\n }\n\n const cleanup = () => {\n reactivePropRegistry.delete(descriptor);\n effectHandle?.cleanup();\n effectHandle = null;\n };\n\n const updateFn = (nextFn: () => unknown): void => {\n if (!effectHandle) {\n return;\n }\n\n descriptor.propFn = nextFn;\n\n try {\n effectHandle.updateCompute(nextFn);\n } catch (err) {\n if (getRuntimeEnv().NODE_ENV !== 'production') {\n logger.warn('[Askr] Reactive prop update failed:', err);\n }\n }\n };\n\n return {\n cleanup,\n updateFn,\n };\n}\n\nfunction getOrCreateReactivePropsCleanupMap(\n el: Element\n): Map<string, ReactivePropCleanupEntry> {\n let cleanupMap = elementReactivePropsCleanup.get(el);\n if (!cleanupMap) {\n cleanupMap = new Map();\n elementReactivePropsCleanup.set(el, cleanupMap);\n }\n return cleanupMap;\n}\n\nfunction createReactivePropCleanupEntry(\n el: Element,\n propName: string,\n propFn: () => unknown,\n tagName: string\n): ReactivePropCleanupEntry {\n const reactive = setupReactiveProp(el, propName, propFn, tagName);\n\n return {\n cleanup: reactive.cleanup,\n updateFn: (nextValue) => {\n reactive.updateFn(nextValue as () => unknown);\n },\n restoreFn: (nextValue) =>\n createReactivePropCleanupEntry(\n el,\n propName,\n nextValue as () => unknown,\n tagName\n ),\n fnRef: propFn,\n };\n}\n\nexport function hasTrackedElementPropBindings(el: Element): boolean {\n const existingListeners = elementListeners.get(el);\n const existingReactiveProps = elementReactivePropsCleanup.get(el);\n return (\n (existingListeners !== undefined && existingListeners.size > 0) ||\n (existingReactiveProps !== undefined && existingReactiveProps.size > 0)\n );\n}\n\nexport function applyPropsToElement(\n el: Element,\n props: Record<string, unknown>,\n tagName: string,\n isHydrationSkipped: (el: Element) => boolean\n): void {\n if (isHydrationSkipped(el)) {\n return;\n }\n\n for (const key in props) {\n const value = props[key];\n if (key === 'ref') {\n updateElementRef(el, value);\n continue;\n }\n if (isSkippedProp(key)) continue;\n if (value === undefined || value === null || value === false) continue;\n\n const eventProp = parseEventProp(key);\n if (eventProp) {\n addTrackedListener(\n el,\n eventProp.eventName,\n value as EventListener,\n eventProp.capture\n );\n continue;\n }\n\n if (typeof value === 'function' && key !== 'ref') {\n getOrCreateReactivePropsCleanupMap(el).set(\n key,\n createReactivePropCleanupEntry(el, key, value as () => unknown, tagName)\n );\n continue;\n }\n\n applyScalarPropValue(el, key, value, tagName);\n }\n}\n\nexport function syncElementPropBindings(\n el: Element,\n domVNode: DOMElement,\n props: Record<string, unknown>,\n usesReactiveChildren: boolean\n): void {\n const existingListeners = elementListeners.get(el);\n const existingReactiveProps = elementReactivePropsCleanup.get(el);\n\n let desiredListenerKeys: Set<string> | null = null;\n let desiredDelegatedEventNames: Set<string> | null = null;\n let desiredReactivePropNames: Set<string> | null = null;\n\n if (usesReactiveChildren) {\n (desiredReactivePropNames ??= new Set()).add(REACTIVE_CHILDREN_KEY);\n }\n\n for (const key in props) {\n const value = props[key];\n if (key === 'ref') continue;\n if (isSkippedProp(key)) continue;\n\n const eventProp = parseEventProp(key);\n const eventName = eventProp?.eventName;\n const eventCapture = eventProp?.capture ?? false;\n const listenerKey =\n eventName === undefined\n ? null\n : getEventListenerKey(eventName, eventCapture);\n\n if (value === undefined || value === null || value === false) {\n if (listenerKey && existingListeners?.has(listenerKey)) {\n const entry = existingListeners.get(listenerKey)!;\n incDevCounter('listenerRemoves');\n if (entry.isDelegated) {\n removeDelegatedListener(el, entry.eventName);\n } else {\n if (entry.options !== undefined) {\n el.removeEventListener(\n entry.eventName,\n entry.handler,\n entry.options\n );\n } else {\n el.removeEventListener(entry.eventName, entry.handler);\n }\n }\n existingListeners.delete(listenerKey);\n } else {\n const entry = existingReactiveProps?.get(key);\n if (entry) {\n entry.cleanup();\n existingReactiveProps?.delete(key);\n } else {\n applyScalarPropValue(el, key, value, domVNode.type as string);\n }\n }\n continue;\n }\n\n if (typeof value === 'function' && !eventProp && key !== 'ref') {\n const existingEntry = existingReactiveProps?.get(key);\n if (existingReactiveProps && existingReactiveProps.size > 0) {\n (desiredReactivePropNames ??= new Set()).add(key);\n }\n\n if (existingEntry && existingEntry.fnRef === value) {\n continue;\n }\n\n if (existingEntry?.updateFn) {\n existingEntry.updateFn(value as () => unknown);\n existingEntry.fnRef = value as () => unknown;\n continue;\n }\n\n if (existingEntry) {\n existingEntry.cleanup();\n }\n\n getOrCreateReactivePropsCleanupMap(el).set(\n key,\n createReactivePropCleanupEntry(\n el,\n key,\n value as () => unknown,\n domVNode.type as string\n )\n );\n continue;\n }\n\n const existingReactiveEntry = existingReactiveProps?.get(key);\n if (existingReactiveEntry) {\n existingReactiveEntry.cleanup();\n existingReactiveProps?.delete(key);\n }\n\n if (eventProp && listenerKey) {\n const eventName = eventProp.eventName;\n const eventCapture = eventProp.capture;\n const useDelegation =\n !eventCapture &&\n isEventDelegationEnabled() &&\n isDelegatedEvent(eventName);\n if (useDelegation) {\n (desiredDelegatedEventNames ??= new Set()).add(eventName);\n }\n\n if (useDelegation) {\n const existingDelegated = getDelegatedHandlerForElement(el, eventName);\n if (existingDelegated?.original === value) {\n continue;\n }\n\n if (\n existingDelegated &&\n updateDelegatedListener(\n el,\n eventName,\n value as EventListener,\n value as EventListener,\n undefined\n )\n ) {\n continue;\n }\n\n addDelegatedListener(\n el,\n eventName,\n value as EventListener,\n value as EventListener,\n undefined\n );\n continue;\n }\n\n (desiredListenerKeys ??= new Set()).add(listenerKey);\n\n const existing = existingListeners?.get(listenerKey);\n\n if (existing && existing.original === value) {\n continue;\n }\n\n if (existing) {\n if (\n useDelegation &&\n existing.isDelegated &&\n updateDelegatedListener(\n el,\n eventName,\n value as EventListener,\n value as EventListener,\n undefined\n )\n ) {\n existing.handler = value as EventListener;\n existing.original = value as EventListener;\n existing.options = undefined;\n continue;\n }\n\n if (!useDelegation && !existing.isDelegated && existing.updateHandler) {\n existing.updateHandler(value as EventListener);\n existing.original = value as EventListener;\n continue;\n }\n\n if (existing.isDelegated) {\n removeDelegatedListener(el, existing.eventName);\n } else {\n if (existing.options !== undefined) {\n el.removeEventListener(\n existing.eventName,\n existing.handler,\n existing.options\n );\n } else {\n el.removeEventListener(existing.eventName, existing.handler);\n }\n }\n }\n\n const options = getEventListenerOptions(eventName, eventCapture);\n const mutableHandler = createMutableWrappedHandler(\n value as EventListener,\n true\n );\n const trackedHandler = mutableHandler.handler;\n\n if (options !== undefined) {\n el.addEventListener(eventName, trackedHandler, options);\n } else {\n el.addEventListener(eventName, trackedHandler);\n }\n incDevCounter('listenerAdds');\n\n const listenerEntry = {\n handler: trackedHandler,\n original: value as EventListener,\n eventName,\n options,\n isDelegated: false,\n updateHandler: mutableHandler?.updateHandler,\n };\n if (!elementListeners.has(el)) {\n elementListeners.set(el, new Map());\n }\n elementListeners.get(el)!.set(listenerKey, listenerEntry);\n } else {\n applyScalarPropValue(el, key, value, domVNode.type as string);\n }\n }\n\n removeStaleAttributes(el, domVNode, props);\n\n if (existingListeners && existingListeners.size > 0) {\n if (desiredListenerKeys === null) {\n existingListeners.forEach((entry) => {\n incDevCounter('listenerRemoves');\n if (entry.isDelegated) {\n removeDelegatedListener(el, entry.eventName);\n } else {\n if (entry.options !== undefined) {\n el.removeEventListener(\n entry.eventName,\n entry.handler,\n entry.options\n );\n } else {\n el.removeEventListener(entry.eventName, entry.handler);\n }\n }\n });\n elementListeners.delete(el);\n } else {\n existingListeners.forEach((entry, listenerKey) => {\n if (!desiredListenerKeys.has(listenerKey)) {\n incDevCounter('listenerRemoves');\n if (entry.isDelegated) {\n removeDelegatedListener(el, entry.eventName);\n } else {\n if (entry.options !== undefined) {\n el.removeEventListener(\n entry.eventName,\n entry.handler,\n entry.options\n );\n } else {\n el.removeEventListener(entry.eventName, entry.handler);\n }\n }\n existingListeners.delete(listenerKey);\n }\n });\n if (existingListeners.size === 0) elementListeners.delete(el);\n }\n }\n\n const delegatedHandlers = getDelegatedHandlersForElement(el);\n if (delegatedHandlers && delegatedHandlers.size > 0) {\n if (desiredDelegatedEventNames === null) {\n for (const eventName of delegatedHandlers.keys()) {\n removeDelegatedListener(el, eventName);\n }\n } else {\n for (const eventName of delegatedHandlers.keys()) {\n if (!desiredDelegatedEventNames.has(eventName)) {\n removeDelegatedListener(el, eventName);\n }\n }\n }\n }\n\n if (existingReactiveProps && existingReactiveProps.size > 0) {\n if (desiredReactivePropNames === null) {\n existingReactiveProps.forEach((entry) => {\n entry.cleanup();\n });\n elementReactivePropsCleanup.delete(el);\n } else {\n existingReactiveProps.forEach((entry, key) => {\n if (!desiredReactivePropNames.has(key)) {\n entry.cleanup();\n existingReactiveProps.delete(key);\n }\n });\n if (existingReactiveProps.size === 0) {\n elementReactivePropsCleanup.delete(el);\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA6CA,MAAM,uCAAuB,IAAI,IAA4B;AAE7D,SAAS,mBACP,IACA,WACA,SACA,UAAU,OACJ;CACN,MAAM,gBACJ,CAAC,WAAW,yBAAyB,KAAK,iBAAiB,SAAS;CACtE,MAAM,cAAc,oBAAoB,WAAW,OAAO;CAE1D,IAAI,eAAe;EACjB,qBAAqB,IAAI,WAAW,SAAS,SAAS,MAAS;EAC/D,IAAI,yBAAyB,YAAY,GACvC,mBAAmB,kBAAkB;EAEvC;CACF;CAEA,MAAM,UAAU,wBAAwB,WAAW,OAAO;CAC1D,MAAM,iBAAiB,4BAA4B,SAAS,IAAI;CAChE,MAAM,iBAAiB,eAAe;CAEtC,IAAI,YAAY,QACd,GAAG,iBAAiB,WAAW,gBAAgB,OAAO;MAEtD,GAAG,iBAAiB,WAAW,cAAc;CAE/C,cAAc,cAAc;CAE5B,IAAI,CAAC,iBAAiB,IAAI,EAAE,GAC1B,iBAAiB,IAAI,oBAAI,IAAI,IAAI,CAAC;CAEpC,iBAAiB,IAAI,EAAE,CAAC,CAAE,IAAI,aAAa;EACzC,SAAS;EACT,UAAU;EACV;EACA;EACA,aAAa;EACb,eAAe,gBAAgB;CACjC,CAAC;CAED,IAAI,yBAAyB,YAAY,GACvC,mBAAmB,kBAAkB;AAEzC;AAEA,SAAgB,6BACd,QACM;CACN,kCAAkC,MAAM;AAC1C;AAEA,SAAS,kBACP,IACA,UACA,QACA,SACoE;CACpE,MAAM,aAAqC;EACzC;EACA;EACA;EACA;EACA,iBAAiB;CACnB;CAEA,IAAI,eAAwD;CAE5D,qBAAqB,IAAI,UAAU;CACnC,eAAe,wBAAwB;EACrC,MAAM;EACN,eAAe,WAAW,OAAO;EACjC,SAAS,OAAO,kBAAkB;GAChC,oBAAoB,2BAA2B;GAC/C,qBACE,IACA,UACA,OACA,SACA,eACA,UACF;EACF;EACA,SAAS,eAAe,cAAc;GACpC,IAAI,OAAO,GAAG,eAAe,SAAS,GAAG;IACvC,oBAAoB,sBAAsB;IAC1C,OAAO;GACT;GACA,OAAO;EACT;EACA,UAAU,QAAQ;GAChB,IAAI,cAAc,CAAC,CAAC,aAAa,cAC/B,OAAO,KAAK,uCAAuC,GAAG;EAE1D;CACF,CAAC;CAED,IAAI,yBAAyB,YAAY,GACvC,mBAAmB,sBAAsB;CAG3C,MAAM,gBAAgB;EACpB,qBAAqB,OAAO,UAAU;EACtC,cAAc,QAAQ;EACtB,eAAe;CACjB;CAEA,MAAM,YAAY,WAAgC;EAChD,IAAI,CAAC,cACH;EAGF,WAAW,SAAS;EAEpB,IAAI;GACF,aAAa,cAAc,MAAM;EACnC,SAAS,KAAK;GACZ,IAAI,cAAc,CAAC,CAAC,aAAa,cAC/B,OAAO,KAAK,uCAAuC,GAAG;EAE1D;CACF;CAEA,OAAO;EACL;EACA;CACF;AACF;AAEA,SAAS,mCACP,IACuC;CACvC,IAAI,aAAa,4BAA4B,IAAI,EAAE;CACnD,IAAI,CAAC,YAAY;EACf,6BAAa,IAAI,IAAI;EACrB,4BAA4B,IAAI,IAAI,UAAU;CAChD;CACA,OAAO;AACT;AAEA,SAAS,+BACP,IACA,UACA,QACA,SAC0B;CAC1B,MAAM,WAAW,kBAAkB,IAAI,UAAU,QAAQ,OAAO;CAEhE,OAAO;EACL,SAAS,SAAS;EAClB,WAAW,cAAc;GACvB,SAAS,SAAS,SAA0B;EAC9C;EACA,YAAY,cACV,+BACE,IACA,UACA,WACA,OACF;EACF,OAAO;CACT;AACF;AAEA,SAAgB,8BAA8B,IAAsB;CAClE,MAAM,oBAAoB,iBAAiB,IAAI,EAAE;CACjD,MAAM,wBAAwB,4BAA4B,IAAI,EAAE;CAChE,OACG,sBAAsB,UAAa,kBAAkB,OAAO,KAC5D,0BAA0B,UAAa,sBAAsB,OAAO;AAEzE;AAEA,SAAgB,oBACd,IACA,OACA,SACA,oBACM;CACN,IAAI,mBAAmB,EAAE,GACvB;CAGF,KAAK,MAAM,OAAO,OAAO;EACvB,MAAM,QAAQ,MAAM;EACpB,IAAI,QAAQ,OAAO;GACjB,iBAAiB,IAAI,KAAK;GAC1B;EACF;EACA,IAAI,cAAc,GAAG,GAAG;EACxB,IAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,OAAO;EAE9D,MAAM,YAAY,eAAe,GAAG;EACpC,IAAI,WAAW;GACb,mBACE,IACA,UAAU,WACV,OACA,UAAU,OACZ;GACA;EACF;EAEA,IAAI,OAAO,UAAU,cAAc,QAAQ,OAAO;GAChD,mCAAmC,EAAE,CAAC,CAAC,IACrC,KACA,+BAA+B,IAAI,KAAK,OAAwB,OAAO,CACzE;GACA;EACF;EAEA,qBAAqB,IAAI,KAAK,OAAO,OAAO;CAC9C;AACF;AAEA,SAAgB,wBACd,IACA,UACA,OACA,sBACM;CACN,MAAM,oBAAoB,iBAAiB,IAAI,EAAE;CACjD,MAAM,wBAAwB,4BAA4B,IAAI,EAAE;CAEhE,IAAI,sBAA0C;CAC9C,IAAI,6BAAiD;CACrD,IAAI,2BAA+C;CAEnD,IAAI,sBACF,CAAC,6CAA6B,IAAI,IAAI,EAAA,CAAG,IAAI,qBAAqB;CAGpE,KAAK,MAAM,OAAO,OAAO;EACvB,MAAM,QAAQ,MAAM;EACpB,IAAI,QAAQ,OAAO;EACnB,IAAI,cAAc,GAAG,GAAG;EAExB,MAAM,YAAY,eAAe,GAAG;EACpC,MAAM,YAAY,WAAW;EAC7B,MAAM,eAAe,WAAW,WAAW;EAC3C,MAAM,cACJ,cAAc,SACV,OACA,oBAAoB,WAAW,YAAY;EAEjD,IAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,OAAO;GAC5D,IAAI,eAAe,mBAAmB,IAAI,WAAW,GAAG;IACtD,MAAM,QAAQ,kBAAkB,IAAI,WAAW;IAC/C,cAAc,iBAAiB;IAC/B,IAAI,MAAM,aACR,wBAAwB,IAAI,MAAM,SAAS;SAE3C,IAAI,MAAM,YAAY,QACpB,GAAG,oBACD,MAAM,WACN,MAAM,SACN,MAAM,OACR;SAEA,GAAG,oBAAoB,MAAM,WAAW,MAAM,OAAO;IAGzD,kBAAkB,OAAO,WAAW;GACtC,OAAO;IACL,MAAM,QAAQ,uBAAuB,IAAI,GAAG;IAC5C,IAAI,OAAO;KACT,MAAM,QAAQ;KACd,uBAAuB,OAAO,GAAG;IACnC,OACE,qBAAqB,IAAI,KAAK,OAAO,SAAS,IAAc;GAEhE;GACA;EACF;EAEA,IAAI,OAAO,UAAU,cAAc,CAAC,aAAa,QAAQ,OAAO;GAC9D,MAAM,gBAAgB,uBAAuB,IAAI,GAAG;GACpD,IAAI,yBAAyB,sBAAsB,OAAO,GACxD,CAAC,6CAA6B,IAAI,IAAI,EAAA,CAAG,IAAI,GAAG;GAGlD,IAAI,iBAAiB,cAAc,UAAU,OAC3C;GAGF,IAAI,eAAe,UAAU;IAC3B,cAAc,SAAS,KAAsB;IAC7C,cAAc,QAAQ;IACtB;GACF;GAEA,IAAI,eACF,cAAc,QAAQ;GAGxB,mCAAmC,EAAE,CAAC,CAAC,IACrC,KACA,+BACE,IACA,KACA,OACA,SAAS,IACX,CACF;GACA;EACF;EAEA,MAAM,wBAAwB,uBAAuB,IAAI,GAAG;EAC5D,IAAI,uBAAuB;GACzB,sBAAsB,QAAQ;GAC9B,uBAAuB,OAAO,GAAG;EACnC;EAEA,IAAI,aAAa,aAAa;GAC5B,MAAM,YAAY,UAAU;GAC5B,MAAM,eAAe,UAAU;GAC/B,MAAM,gBACJ,CAAC,gBACD,yBAAyB,KACzB,iBAAiB,SAAS;GAC5B,IAAI,eACF,CAAC,+CAA+B,IAAI,IAAI,EAAA,CAAG,IAAI,SAAS;GAG1D,IAAI,eAAe;IACjB,MAAM,oBAAoB,8BAA8B,IAAI,SAAS;IACrE,IAAI,mBAAmB,aAAa,OAClC;IAGF,IACE,qBACA,wBACE,IACA,WACA,OACA,OACA,MACF,GAEA;IAGF,qBACE,IACA,WACA,OACA,OACA,MACF;IACA;GACF;GAEA,CAAC,wCAAwB,IAAI,IAAI,EAAA,CAAG,IAAI,WAAW;GAEnD,MAAM,WAAW,mBAAmB,IAAI,WAAW;GAEnD,IAAI,YAAY,SAAS,aAAa,OACpC;GAGF,IAAI,UAAU;IACZ,IACE,iBACA,SAAS,eACT,wBACE,IACA,WACA,OACA,OACA,MACF,GACA;KACA,SAAS,UAAU;KACnB,SAAS,WAAW;KACpB,SAAS,UAAU;KACnB;IACF;IAEA,IAAI,CAAC,iBAAiB,CAAC,SAAS,eAAe,SAAS,eAAe;KACrE,SAAS,cAAc,KAAsB;KAC7C,SAAS,WAAW;KACpB;IACF;IAEA,IAAI,SAAS,aACX,wBAAwB,IAAI,SAAS,SAAS;SAE9C,IAAI,SAAS,YAAY,QACvB,GAAG,oBACD,SAAS,WACT,SAAS,SACT,SAAS,OACX;SAEA,GAAG,oBAAoB,SAAS,WAAW,SAAS,OAAO;GAGjE;GAEA,MAAM,UAAU,wBAAwB,WAAW,YAAY;GAC/D,MAAM,iBAAiB,4BACrB,OACA,IACF;GACA,MAAM,iBAAiB,eAAe;GAEtC,IAAI,YAAY,QACd,GAAG,iBAAiB,WAAW,gBAAgB,OAAO;QAEtD,GAAG,iBAAiB,WAAW,cAAc;GAE/C,cAAc,cAAc;GAE5B,MAAM,gBAAgB;IACpB,SAAS;IACT,UAAU;IACV;IACA;IACA,aAAa;IACb,eAAe,gBAAgB;GACjC;GACA,IAAI,CAAC,iBAAiB,IAAI,EAAE,GAC1B,iBAAiB,IAAI,oBAAI,IAAI,IAAI,CAAC;GAEpC,iBAAiB,IAAI,EAAE,CAAC,CAAE,IAAI,aAAa,aAAa;EAC1D,OACE,qBAAqB,IAAI,KAAK,OAAO,SAAS,IAAc;CAEhE;CAEA,sBAAsB,IAAI,UAAU,KAAK;CAEzC,IAAI,qBAAqB,kBAAkB,OAAO,GAChD,IAAI,wBAAwB,MAAM;EAChC,kBAAkB,SAAS,UAAU;GACnC,cAAc,iBAAiB;GAC/B,IAAI,MAAM,aACR,wBAAwB,IAAI,MAAM,SAAS;QAE3C,IAAI,MAAM,YAAY,QACpB,GAAG,oBACD,MAAM,WACN,MAAM,SACN,MAAM,OACR;QAEA,GAAG,oBAAoB,MAAM,WAAW,MAAM,OAAO;EAG3D,CAAC;EACD,iBAAiB,OAAO,EAAE;CAC5B,OAAO;EACL,kBAAkB,SAAS,OAAO,gBAAgB;GAChD,IAAI,CAAC,oBAAoB,IAAI,WAAW,GAAG;IACzC,cAAc,iBAAiB;IAC/B,IAAI,MAAM,aACR,wBAAwB,IAAI,MAAM,SAAS;SAE3C,IAAI,MAAM,YAAY,QACpB,GAAG,oBACD,MAAM,WACN,MAAM,SACN,MAAM,OACR;SAEA,GAAG,oBAAoB,MAAM,WAAW,MAAM,OAAO;IAGzD,kBAAkB,OAAO,WAAW;GACtC;EACF,CAAC;EACD,IAAI,kBAAkB,SAAS,GAAG,iBAAiB,OAAO,EAAE;CAC9D;CAGF,MAAM,oBAAoB,+BAA+B,EAAE;CAC3D,IAAI,qBAAqB,kBAAkB,OAAO,GAChD;MAAI,+BAA+B,MACjC,KAAK,MAAM,aAAa,kBAAkB,KAAK,GAC7C,wBAAwB,IAAI,SAAS;OAGvC,KAAK,MAAM,aAAa,kBAAkB,KAAK,GAC7C,IAAI,CAAC,2BAA2B,IAAI,SAAS,GAC3C,wBAAwB,IAAI,SAAS;CAG3C;CAGF,IAAI,yBAAyB,sBAAsB,OAAO,GACxD,IAAI,6BAA6B,MAAM;EACrC,sBAAsB,SAAS,UAAU;GACvC,MAAM,QAAQ;EAChB,CAAC;EACD,4BAA4B,OAAO,EAAE;CACvC,OAAO;EACL,sBAAsB,SAAS,OAAO,QAAQ;GAC5C,IAAI,CAAC,yBAAyB,IAAI,GAAG,GAAG;IACtC,MAAM,QAAQ;IACd,sBAAsB,OAAO,GAAG;GAClC;EACF,CAAC;EACD,IAAI,sBAAsB,SAAS,GACjC,4BAA4B,OAAO,EAAE;CAEzC;AAEJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reactive-child-dom.js","names":[],"sources":["../../src/renderer/reactive-child-dom.ts"],"sourcesContent":["import type { ChildScope } from '../runtime/child-scope';\nimport { syncControlBoundaryScopeDom } from './boundaries';\nimport { teardownNodeSubtree } from './cleanup';\nimport {\n createElementForNamespace,\n getParentNamespace,\n SVG_NAMESPACE,\n} from './namespaces';\nimport {\n collectReactiveChildBoundaryVNodes,\n isSingleRootReactiveChildBoundaryValue,\n} from './reactive-child-sources';\nimport type { VNode } from './types';\n\nexport interface ReactiveChildDOMHost {\n createDOMNode(node: unknown, parentNamespace?: string): Node | null;\n updateElementChildren(\n el: Element,\n children: VNode | VNode[] | undefined,\n forceUpdate?: boolean\n ): void;\n}\n\nexport type ReactiveChildBoundarySequenceEntry =\n | { kind: 'static'; nodes: Node[] }\n | { kind: 'dynamic'; scope: ChildScope; nodes: Node[] };\n\nexport function materializeReactiveChildBoundaryNodes(\n value: unknown,\n parentNamespace: string | undefined,\n host: ReactiveChildDOMHost\n): Node[] {\n const nodes: Node[] = [];\n const dom = host.createDOMNode(value, parentNamespace);\n if (!dom) {\n return nodes;\n }\n\n if (dom instanceof DocumentFragment) {\n for (let child = dom.firstChild; child; child = dom.firstChild) {\n nodes.push(child);\n dom.removeChild(child);\n }\n return nodes;\n }\n\n nodes.push(dom);\n return nodes;\n}\n\nexport function createReactiveChildBoundaryHost(el: Element): Element {\n const ownerDocument = el.ownerDocument;\n const parentNamespace = getParentNamespace(el);\n return parentNamespace === SVG_NAMESPACE\n ? createElementForNamespace('g', parentNamespace, ownerDocument)\n : createElementForNamespace('div', parentNamespace, ownerDocument);\n}\n\nexport function disposeReactiveChildBoundaryNodes(nodes: Node[]): void {\n for (const node of nodes) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n\n teardownNodeSubtree(node);\n }\n}\n\nexport function syncReactiveChildExpectedNodes(\n el: Element,\n expectedNodes: Node[]\n): void {\n const expectedNodeSet = new Set(expectedNodes);\n\n for (let node = el.firstChild; node; ) {\n const next = node.nextSibling;\n if (!expectedNodeSet.has(node)) {\n teardownNodeSubtree(node);\n el.removeChild(node);\n }\n node = next;\n }\n\n let anchor = el.firstChild;\n for (const node of expectedNodes) {\n if (node === anchor) {\n anchor = anchor.nextSibling;\n continue;\n }\n\n el.insertBefore(node, anchor);\n anchor = node.nextSibling;\n }\n}\n\nexport function commitReactiveChildBoundaryEntryNodes(\n el: Element,\n entry: { scope: ChildScope; nodes: Node[] },\n host: ReactiveChildDOMHost\n): Node[] {\n if (!entry.scope.needsDomUpdate) {\n return entry.nodes;\n }\n\n if (\n entry.scope.vnode === null ||\n entry.scope.vnode === undefined ||\n entry.scope.vnode === false\n ) {\n if (entry.nodes.length > 0) {\n disposeReactiveChildBoundaryNodes(entry.nodes);\n entry.nodes = [];\n }\n\n const dom = entry.scope.dom;\n if (dom?.parentNode === el) {\n teardownNodeSubtree(dom);\n el.removeChild(dom);\n }\n\n entry.scope.dom = undefined;\n entry.scope.needsDomUpdate = false;\n return entry.nodes;\n }\n\n if (!isSingleRootReactiveChildBoundaryValue(entry.scope.vnode)) {\n const nextChildren: VNode[] = [];\n collectReactiveChildBoundaryVNodes(entry.scope.vnode, nextChildren);\n\n const boundaryHost = createReactiveChildBoundaryHost(el);\n for (const node of entry.nodes) {\n boundaryHost.appendChild(node);\n }\n\n host.updateElementChildren(boundaryHost, nextChildren);\n\n const nextNodes = Array.from(boundaryHost.childNodes);\n\n entry.scope.dom = undefined;\n entry.scope.needsDomUpdate = false;\n entry.nodes = nextNodes;\n return nextNodes;\n }\n\n if (entry.nodes.length > 1) {\n disposeReactiveChildBoundaryNodes(entry.nodes);\n entry.nodes = [];\n entry.scope.dom = undefined;\n }\n\n const nextDom = syncControlBoundaryScopeDom(\n el,\n entry.scope,\n entry.scope.vnode ?? null\n );\n if (!nextDom) {\n entry.nodes = [];\n entry.scope.needsDomUpdate = false;\n return entry.nodes;\n }\n\n entry.nodes = [nextDom];\n entry.scope.needsDomUpdate = false;\n return entry.nodes;\n}\n\nexport function syncReactiveChildSequenceNodes(\n el: Element,\n entries: ReactiveChildBoundarySequenceEntry[],\n host: ReactiveChildDOMHost\n): void {\n const expectedNodes: Node[] = [];\n\n for (const entry of entries) {\n if (entry.kind === 'static') {\n expectedNodes.push(...entry.nodes);\n continue;\n }\n\n expectedNodes.push(\n ...commitReactiveChildBoundaryEntryNodes(el, entry, host)\n );\n }\n\n syncReactiveChildExpectedNodes(el, expectedNodes);\n}\n\nexport function syncReactiveScalarTextNodes(\n el: Element,\n slotValues: unknown[],\n values: string[],\n host: ReactiveChildDOMHost\n): void {\n const childNodes = el.childNodes;\n const canPatchInPlace = childNodes.length === values.length;\n\n if (canPatchInPlace) {\n let allText = true;\n for (let index = 0; index < childNodes.length; index += 1) {\n if (childNodes[index]?.nodeType !== Node.TEXT_NODE) {\n allText = false;\n break;\n }\n }\n\n if (allText) {\n for (let index = 0; index < values.length; index += 1) {\n const textNode = childNodes[index] as Text;\n if (textNode.data !== values[index]) {\n textNode.data = values[index];\n }\n }\n return;\n }\n }\n\n const boundaryHost = createReactiveChildBoundaryHost(el);\n for (let node = el.firstChild; node; ) {\n const next = node.nextSibling;\n boundaryHost.appendChild(node);\n node = next;\n }\n\n host.updateElementChildren(boundaryHost, slotValues as VNode[]);\n syncReactiveChildExpectedNodes(el, Array.from(boundaryHost.childNodes));\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reactive-child-sources.js","names":[],"sources":["../../src/renderer/reactive-child-sources.ts"],"sourcesContent":["import { _isDOMElement, type VNode } from './types';\nimport { isFragmentVNode, normalizeComponentChildren } from './child-shape';\n\nexport type ReactiveScalarChildSourceSlot =\n | { kind: 'static'; value: string }\n | { kind: 'dynamic'; compute: () => unknown };\n\nexport type ReactiveScalarChildSource = ReactiveScalarChildSourceSlot[];\n\nexport type ReactiveChildBoundarySequenceSource = Array<\n | { kind: 'static-text'; value: string }\n | { kind: 'static-node'; value: VNode }\n | { kind: 'dynamic'; compute: () => VNode }\n>;\n\nfunction collectReactiveScalarSequenceValue(\n value: unknown,\n normalized: string[]\n): boolean {\n if (isFragmentVNode(value)) {\n const fragmentChildren = value.props?.children ?? value.children;\n return collectReactiveScalarSequenceValue(fragmentChildren, normalized);\n }\n\n if (Array.isArray(value)) {\n for (const child of value) {\n if (!collectReactiveScalarSequenceValue(child, normalized)) {\n return false;\n }\n }\n return true;\n }\n\n if (value === null || value === undefined || value === false) {\n return true;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n normalized.push(String(value));\n return true;\n }\n\n return false;\n}\n\nfunction collectReactiveScalarChildSource(\n children: unknown,\n slots: ReactiveScalarChildSource,\n state: { hasDynamic: boolean }\n): boolean {\n if (isFragmentVNode(children)) {\n const fragmentChildren = children.props?.children ?? children.children;\n return collectReactiveScalarChildSource(fragmentChildren, slots, state);\n }\n\n if (Array.isArray(children)) {\n for (const child of children) {\n if (!collectReactiveScalarChildSource(child, slots, state)) {\n return false;\n }\n }\n return true;\n }\n\n if (children === null || children === undefined || children === false) {\n return true;\n }\n\n if (typeof children === 'function') {\n slots.push({ kind: 'dynamic', compute: children as () => unknown });\n state.hasDynamic = true;\n return true;\n }\n\n if (typeof children === 'string' || typeof children === 'number') {\n slots.push({ kind: 'static', value: String(children) });\n return true;\n }\n\n return false;\n}\n\nexport function getReactiveScalarChildSource(\n children: unknown\n): ReactiveScalarChildSource | null {\n const slots: ReactiveScalarChildSource = [];\n const state = { hasDynamic: false };\n\n if (!collectReactiveScalarChildSource(children, slots, state)) {\n return null;\n }\n\n return state.hasDynamic ? slots : null;\n}\n\nexport function getSingleReactiveChildBoundarySource(\n children: unknown\n): (() => VNode) | null {\n if (isFragmentVNode(children)) {\n const fragmentChildren = children.props?.children ?? children.children;\n return getSingleReactiveChildBoundarySource(fragmentChildren);\n }\n\n if (Array.isArray(children)) {\n if (children.length !== 1) {\n return null;\n }\n return getSingleReactiveChildBoundarySource(children[0]);\n }\n\n if (typeof children === 'function') {\n return children as () => VNode;\n }\n\n return null;\n}\n\nfunction collectReactiveChildBoundarySequenceSource(\n children: unknown,\n slots: ReactiveChildBoundarySequenceSource,\n state: { dynamicCount: number }\n): boolean {\n if (isFragmentVNode(children)) {\n const fragmentChildren = children.props?.children ?? children.children;\n return collectReactiveChildBoundarySequenceSource(\n fragmentChildren,\n slots,\n state\n );\n }\n\n if (Array.isArray(children)) {\n for (const child of children) {\n if (!collectReactiveChildBoundarySequenceSource(child, slots, state)) {\n return false;\n }\n }\n return true;\n }\n\n if (children === null || children === undefined || children === false) {\n return true;\n }\n\n if (typeof children === 'function') {\n slots.push({ kind: 'dynamic', compute: children as () => VNode });\n state.dynamicCount += 1;\n return true;\n }\n\n if (typeof children === 'string' || typeof children === 'number') {\n slots.push({ kind: 'static-text', value: String(children) });\n return true;\n }\n\n if (_isDOMElement(children)) {\n slots.push({ kind: 'static-node', value: children as VNode });\n return true;\n }\n\n return false;\n}\n\nexport function getReactiveChildBoundarySequenceSource(\n children: unknown\n): ReactiveChildBoundarySequenceSource | null {\n const slots: ReactiveChildBoundarySequenceSource = [];\n const state = { dynamicCount: 0 };\n\n if (!collectReactiveChildBoundarySequenceSource(children, slots, state)) {\n return null;\n }\n\n return state.dynamicCount >= 1 && slots.length > 1 ? slots : null;\n}\n\nexport function areReactiveChildBoundarySequenceSourcesEqual(\n previousSource: unknown,\n nextSource: ReactiveChildBoundarySequenceSource\n): boolean {\n if (\n !Array.isArray(previousSource) ||\n previousSource.length !== nextSource.length\n ) {\n return false;\n }\n\n for (let index = 0; index < nextSource.length; index += 1) {\n const previousSlot = previousSource[index] as\n | ReactiveChildBoundarySequenceSource[number]\n | undefined;\n const nextSlot = nextSource[index];\n\n if (!previousSlot || previousSlot.kind !== nextSlot.kind) {\n return false;\n }\n\n if (nextSlot.kind === 'static-text') {\n if (\n previousSlot.kind !== 'static-text' ||\n previousSlot.value !== nextSlot.value\n ) {\n return false;\n }\n continue;\n }\n\n if (nextSlot.kind === 'static-node') {\n if (\n previousSlot.kind !== 'static-node' ||\n previousSlot.value !== nextSlot.value\n ) {\n return false;\n }\n continue;\n }\n\n if (\n previousSlot.kind !== 'dynamic' ||\n previousSlot.compute !== nextSlot.compute\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function canUpdateReactiveChildBoundarySequenceSource(\n previousSource: unknown,\n nextSource: ReactiveChildBoundarySequenceSource\n): boolean {\n if (\n !Array.isArray(previousSource) ||\n previousSource.length !== nextSource.length\n ) {\n return false;\n }\n\n for (let index = 0; index < nextSource.length; index += 1) {\n const previousSlot = previousSource[index] as\n | ReactiveChildBoundarySequenceSource[number]\n | undefined;\n const nextSlot = nextSource[index];\n\n if (!previousSlot || previousSlot.kind !== nextSlot.kind) {\n return false;\n }\n\n if (nextSlot.kind === 'static-text') {\n if (\n previousSlot.kind !== 'static-text' ||\n previousSlot.value !== nextSlot.value\n ) {\n return false;\n }\n continue;\n }\n\n if (nextSlot.kind === 'static-node') {\n if (\n previousSlot.kind !== 'static-node' ||\n previousSlot.value !== nextSlot.value\n ) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nexport function areReactiveScalarChildSourcesEqual(\n previousSource: unknown,\n nextSource: ReactiveScalarChildSource\n): boolean {\n if (\n !Array.isArray(previousSource) ||\n previousSource.length !== nextSource.length\n ) {\n return false;\n }\n\n for (let index = 0; index < nextSource.length; index += 1) {\n const previousSlot = previousSource[index] as\n | ReactiveScalarChildSourceSlot\n | undefined;\n const nextSlot = nextSource[index];\n\n if (!previousSlot || previousSlot.kind !== nextSlot.kind) {\n return false;\n }\n\n if (nextSlot.kind === 'static') {\n if (\n previousSlot.kind !== 'static' ||\n previousSlot.value !== nextSlot.value\n ) {\n return false;\n }\n continue;\n }\n\n if (\n previousSlot.kind !== 'dynamic' ||\n previousSlot.compute !== nextSlot.compute\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function normalizeReactiveScalarSequenceValues(\n values: unknown[]\n): string[] | null {\n const normalized: string[] = [];\n\n for (const value of values) {\n if (!collectReactiveScalarSequenceValue(value, normalized)) {\n return null;\n }\n }\n\n return normalized;\n}\n\nexport function normalizeOwnedReactiveTextValue(value: unknown): string | null {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n\n return null;\n}\n\nexport function collectReactiveChildValuesAsVNodes(\n values: unknown[],\n children: VNode[]\n): void {\n for (const value of values) {\n collectReactiveChildBoundaryVNodes(value, children);\n }\n}\n\nexport function normalizeReactiveChildBoundaryVNode(value: VNode): VNode {\n if (!isFragmentVNode(value)) {\n return value;\n }\n\n const children = normalizeComponentChildren(value);\n if (children.length !== 1) {\n return value;\n }\n\n return normalizeReactiveChildBoundaryVNode(children[0] as VNode);\n}\n\nexport function isSingleRootReactiveChildBoundaryValue(\n value: unknown\n): boolean {\n if (value === null || value === undefined || value === false) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return (\n value.length === 1 && isSingleRootReactiveChildBoundaryValue(value[0])\n );\n }\n\n if (isFragmentVNode(value)) {\n const children = normalizeComponentChildren(value);\n return (\n children.length === 1 &&\n isSingleRootReactiveChildBoundaryValue(children[0])\n );\n }\n\n return true;\n}\n\nexport function collectReactiveChildBoundaryVNodes(\n value: unknown,\n children: VNode[]\n): void {\n if (value === null || value === undefined || value === false) {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const child of value) {\n collectReactiveChildBoundaryVNodes(child, children);\n }\n return;\n }\n\n if (isFragmentVNode(value)) {\n const fragmentChildren = value.props?.children ?? value.children;\n collectReactiveChildBoundaryVNodes(fragmentChildren, children);\n return;\n }\n\n children.push(value as VNode);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reactive-children.js","names":[],"sources":["../../src/renderer/reactive-children.ts"],"sourcesContent":["import { logger } from '../dev/logger';\nimport {\n createChildScope,\n disposeChildScope,\n rerenderChildScope,\n type ChildScope,\n} from '../runtime/child-scope';\nimport { getCurrentInstance } from '../runtime/component-contracts';\nimport { incDevCounter } from '../runtime/dev-namespace';\nimport {\n createFineGrainedEffect,\n type FineGrainedEffectHandle,\n} from '../runtime/effect';\nimport {\n elementReactivePropsCleanup,\n REACTIVE_CHILDREN_KEY,\n teardownNodeSubtree,\n type ReactivePropCleanupEntry,\n} from './cleanup';\nimport { getRuntimeEnv } from './env';\nimport { getParentNamespace } from './namespaces';\nimport type { VNode } from './types';\nimport {\n commitReactiveChildBoundaryEntryNodes,\n createReactiveChildBoundaryHost,\n disposeReactiveChildBoundaryNodes,\n materializeReactiveChildBoundaryNodes,\n syncReactiveChildExpectedNodes,\n syncReactiveChildSequenceNodes,\n syncReactiveScalarTextNodes,\n type ReactiveChildBoundarySequenceEntry,\n type ReactiveChildDOMHost,\n} from './reactive-child-dom';\nimport {\n areReactiveChildBoundarySequenceSourcesEqual,\n areReactiveScalarChildSourcesEqual,\n canUpdateReactiveChildBoundarySequenceSource,\n collectReactiveChildValuesAsVNodes,\n getReactiveChildBoundarySequenceSource,\n getReactiveScalarChildSource,\n getSingleReactiveChildBoundarySource,\n normalizeOwnedReactiveTextValue,\n normalizeReactiveChildBoundaryVNode,\n normalizeReactiveScalarSequenceValues,\n type ReactiveChildBoundarySequenceSource,\n type ReactiveScalarChildSource,\n} from './reactive-child-sources';\n\nexport type { ReactiveChildDOMHost } from './reactive-child-dom';\n\nlet reactiveChildScopeId = 0;\n\nfunction getOrCreateElementReactiveCleanupMap(\n el: Element\n): Map<string, ReactivePropCleanupEntry> {\n let cleanupMap = elementReactivePropsCleanup.get(el);\n if (!cleanupMap) {\n cleanupMap = new Map();\n elementReactivePropsCleanup.set(el, cleanupMap);\n }\n\n return cleanupMap;\n}\n\nexport function trySyncScalarChildSequenceInPlace(\n el: Element,\n children: unknown[],\n host: ReactiveChildDOMHost\n): boolean {\n const normalized = normalizeReactiveScalarSequenceValues(children);\n if (!normalized) {\n return false;\n }\n\n if (el.childNodes.length !== normalized.length) {\n return false;\n }\n\n for (let index = 0; index < el.childNodes.length; index += 1) {\n if (el.childNodes[index]?.nodeType !== Node.TEXT_NODE) {\n return false;\n }\n }\n\n syncReactiveScalarTextNodes(el, children, normalized, host);\n return true;\n}\n\nfunction setupReactiveScalarChild(\n el: Element,\n source: ReactiveScalarChildSource,\n host: ReactiveChildDOMHost\n): {\n cleanup: () => void;\n updateFn: (nextSource: ReactiveScalarChildSource) => void;\n} {\n let currentSource = source;\n\n if (source.length === 1 && source[0]?.kind === 'dynamic') {\n let ownedTextNode =\n el.childNodes.length === 1 && el.firstChild?.nodeType === Node.TEXT_NODE\n ? (el.firstChild as Text)\n : null;\n\n let effectHandle: FineGrainedEffectHandle<string> | null =\n createFineGrainedEffect({\n lane: 'reactive',\n compute: () => {\n const currentSlot = currentSource[0];\n if (!currentSlot || currentSlot.kind !== 'dynamic') {\n throw new Error(\n '[Askr] Direct reactive text bindings require a single dynamic slot.'\n );\n }\n\n const rawValue = currentSlot.compute();\n const normalized = normalizeOwnedReactiveTextValue(rawValue);\n return normalized ?? (rawValue as string);\n },\n commit: (value) => {\n const normalized = normalizeOwnedReactiveTextValue(value);\n\n if (normalized === null) {\n ownedTextNode = null;\n host.updateElementChildren(\n el,\n value as unknown as VNode | VNode[] | undefined\n );\n return;\n }\n\n if (\n !ownedTextNode ||\n el.childNodes.length !== 1 ||\n el.firstChild !== ownedTextNode\n ) {\n host.updateElementChildren(el, normalized);\n ownedTextNode =\n el.childNodes.length === 1 &&\n el.firstChild?.nodeType === Node.TEXT_NODE\n ? (el.firstChild as Text)\n : null;\n }\n\n if (!ownedTextNode) {\n return;\n }\n\n if (ownedTextNode.data !== normalized) {\n ownedTextNode.data = normalized;\n incDevCounter('textNodeWrites');\n }\n },\n onError: (err) => {\n if (getRuntimeEnv().NODE_ENV !== 'production') {\n logger.warn('[Askr] Reactive child update failed:', err);\n }\n },\n });\n\n return {\n cleanup: () => {\n effectHandle?.cleanup();\n effectHandle = null;\n },\n updateFn: (nextSource: ReactiveScalarChildSource) => {\n if (!effectHandle) {\n return;\n }\n\n currentSource = nextSource;\n effectHandle.updateCompute(() => {\n const currentSlot = currentSource[0];\n if (!currentSlot || currentSlot.kind !== 'dynamic') {\n throw new Error(\n '[Askr] Direct reactive text bindings require a single dynamic slot.'\n );\n }\n\n const rawValue = currentSlot.compute();\n const normalized = normalizeOwnedReactiveTextValue(rawValue);\n return normalized ?? (rawValue as string);\n });\n },\n };\n }\n\n let effectHandle: FineGrainedEffectHandle<unknown> | null =\n createFineGrainedEffect({\n lane: 'reactive',\n compute: () =>\n currentSource.map((slot) =>\n slot.kind === 'static' ? slot.value : slot.compute()\n ),\n commit: (values) => {\n if (!Array.isArray(values)) {\n throw new Error(\n '[Askr] Reactive scalar children must evaluate to a slot array.'\n );\n }\n\n const normalized = normalizeReactiveScalarSequenceValues(values);\n if (normalized) {\n syncReactiveScalarTextNodes(el, values, normalized, host);\n return;\n }\n\n const nextChildren: VNode[] = [];\n collectReactiveChildValuesAsVNodes(values, nextChildren);\n\n const boundaryHost = createReactiveChildBoundaryHost(el);\n for (let node = el.firstChild; node; ) {\n const next = node.nextSibling;\n boundaryHost.appendChild(node);\n node = next;\n }\n\n host.updateElementChildren(boundaryHost, nextChildren);\n syncReactiveChildExpectedNodes(el, Array.from(boundaryHost.childNodes));\n },\n equals: (previousValue, nextValue) => {\n if (!Array.isArray(previousValue) || !Array.isArray(nextValue)) {\n return false;\n }\n\n const previousNormalized =\n normalizeReactiveScalarSequenceValues(previousValue);\n const nextNormalized = normalizeReactiveScalarSequenceValues(nextValue);\n\n if (!previousNormalized || !nextNormalized) {\n return false;\n }\n\n if (previousNormalized.length !== nextNormalized.length) {\n return false;\n }\n\n for (let index = 0; index < previousNormalized.length; index += 1) {\n if (previousNormalized[index] !== nextNormalized[index]) {\n return false;\n }\n }\n\n return true;\n },\n onError: (err) => {\n if (getRuntimeEnv().NODE_ENV !== 'production') {\n logger.warn('[Askr] Reactive child update failed:', err);\n }\n },\n });\n\n return {\n cleanup: () => {\n effectHandle?.cleanup();\n effectHandle = null;\n },\n updateFn: (nextSource: ReactiveScalarChildSource) => {\n if (!effectHandle) {\n return;\n }\n\n currentSource = nextSource;\n effectHandle.updateCompute(() =>\n currentSource.map((slot) =>\n slot.kind === 'static' ? slot.value : slot.compute()\n )\n );\n },\n };\n}\n\nfunction setupReactiveChildBoundary(\n el: Element,\n childFn: () => VNode,\n host: ReactiveChildDOMHost\n): { cleanup: () => void; updateFn: (nextValue: unknown) => void } {\n let currentChildFn = childFn;\n const parentInstance = getCurrentInstance();\n const entry: { scope: ChildScope; nodes: Node[] } = {\n scope: createChildScope(\n parentInstance,\n `__reactive-child__:${(reactiveChildScopeId += 1)}`,\n () => {\n const expectedNodes = commitReactiveChildBoundaryEntryNodes(\n el,\n entry,\n host\n );\n syncReactiveChildExpectedNodes(el, expectedNodes);\n }\n ),\n nodes: [],\n };\n\n entry.scope.render(() =>\n normalizeReactiveChildBoundaryVNode(currentChildFn())\n );\n syncReactiveChildExpectedNodes(\n el,\n commitReactiveChildBoundaryEntryNodes(el, entry, host)\n );\n\n return {\n cleanup: () => {\n const dom = entry.scope.dom;\n const nodes = entry.nodes;\n disposeChildScope(entry.scope);\n entry.nodes = [];\n\n if (nodes.length > 0) {\n disposeReactiveChildBoundaryNodes(nodes);\n return;\n }\n\n if (dom?.parentNode === el) {\n teardownNodeSubtree(dom);\n el.removeChild(dom);\n }\n },\n updateFn: (nextValue: unknown) => {\n currentChildFn = nextValue as () => VNode;\n rerenderChildScope(entry.scope);\n const expectedNodes = commitReactiveChildBoundaryEntryNodes(\n el,\n entry,\n host\n );\n syncReactiveChildExpectedNodes(el, expectedNodes);\n },\n };\n}\n\nfunction setupReactiveChildBoundarySequence(\n el: Element,\n source: ReactiveChildBoundarySequenceSource,\n host: ReactiveChildDOMHost\n): { cleanup: () => void; updateFn: (nextValue: unknown) => void } {\n let currentSource = source;\n const parentInstance = getCurrentInstance();\n const entries: ReactiveChildBoundarySequenceEntry[] = [];\n const dynamicEntries: Array<{\n index: number;\n entry: Extract<ReactiveChildBoundarySequenceEntry, { kind: 'dynamic' }>;\n }> = [];\n\n if (!currentSource.some((slot) => slot.kind === 'dynamic')) {\n throw new Error(\n '[Askr] Reactive child boundary sequence requires at least one dynamic slot.'\n );\n }\n\n const syncSequence = () => {\n syncReactiveChildSequenceNodes(el, entries, host);\n };\n\n const parentNamespace = getParentNamespace(el);\n\n for (let index = 0; index < currentSource.length; index += 1) {\n const slot = currentSource[index];\n if (!slot) {\n continue;\n }\n\n if (slot.kind === 'static-text') {\n entries.push({\n kind: 'static',\n nodes: [document.createTextNode(slot.value)],\n });\n continue;\n }\n\n if (slot.kind === 'static-node') {\n entries.push({\n kind: 'static',\n nodes: materializeReactiveChildBoundaryNodes(\n slot.value,\n parentNamespace,\n host\n ),\n });\n continue;\n }\n\n const scope = createChildScope(\n parentInstance,\n `__reactive-child-seq__:${(reactiveChildScopeId += 1)}`,\n syncSequence\n );\n\n const dynamicEntry: Extract<\n ReactiveChildBoundarySequenceEntry,\n { kind: 'dynamic' }\n > = {\n kind: 'dynamic',\n scope,\n nodes: [],\n };\n entries.push(dynamicEntry);\n dynamicEntries.push({ index, entry: dynamicEntry });\n }\n\n for (const dynamicEntry of dynamicEntries) {\n dynamicEntry.entry.scope.render(() =>\n normalizeReactiveChildBoundaryVNode(\n (\n currentSource[dynamicEntry.index] as {\n kind: 'dynamic';\n compute: () => VNode;\n }\n ).compute()\n )\n );\n }\n\n syncSequence();\n\n return {\n cleanup: () => {\n for (const dynamicEntry of dynamicEntries) {\n const dom = dynamicEntry.entry.scope.dom;\n const nodes = dynamicEntry.entry.nodes;\n disposeChildScope(dynamicEntry.entry.scope);\n\n if (nodes.length > 0) {\n disposeReactiveChildBoundaryNodes(nodes);\n continue;\n }\n\n if (dom?.parentNode === el) {\n teardownNodeSubtree(dom);\n el.removeChild(dom);\n }\n }\n\n for (const entry of entries) {\n if (entry.kind === 'static') {\n disposeReactiveChildBoundaryNodes(entry.nodes);\n }\n }\n },\n updateFn: (nextValue: unknown) => {\n currentSource = nextValue as ReactiveChildBoundarySequenceSource;\n for (const dynamicEntry of dynamicEntries) {\n rerenderChildScope(dynamicEntry.entry.scope);\n }\n syncSequence();\n },\n };\n}\n\nexport function syncReactiveScalarChild(\n el: Element,\n children: unknown,\n host: ReactiveChildDOMHost\n): boolean {\n const reactiveChildSource = getReactiveScalarChildSource(children);\n const reactiveChildBoundary = getSingleReactiveChildBoundarySource(children);\n const reactiveChildBoundarySequence =\n getReactiveChildBoundarySequenceSource(children);\n const existingReactiveEntry = elementReactivePropsCleanup\n .get(el)\n ?.get(REACTIVE_CHILDREN_KEY);\n\n if (\n !reactiveChildSource &&\n !reactiveChildBoundary &&\n !reactiveChildBoundarySequence\n ) {\n if (existingReactiveEntry) {\n existingReactiveEntry.cleanup();\n const cleanupMap = elementReactivePropsCleanup.get(el);\n cleanupMap?.delete(REACTIVE_CHILDREN_KEY);\n if (cleanupMap && cleanupMap.size === 0) {\n elementReactivePropsCleanup.delete(el);\n }\n }\n\n return false;\n }\n\n if (reactiveChildSource && !reactiveChildBoundarySequence) {\n if (\n existingReactiveEntry &&\n Array.isArray(existingReactiveEntry.fnRef) &&\n areReactiveScalarChildSourcesEqual(\n existingReactiveEntry.fnRef,\n reactiveChildSource\n )\n ) {\n return true;\n }\n\n if (\n existingReactiveEntry?.updateFn &&\n Array.isArray(existingReactiveEntry.fnRef)\n ) {\n existingReactiveEntry.updateFn(reactiveChildSource);\n existingReactiveEntry.fnRef = reactiveChildSource;\n return true;\n }\n\n existingReactiveEntry?.cleanup();\n\n try {\n const reactive = setupReactiveScalarChild(el, reactiveChildSource, host);\n getOrCreateElementReactiveCleanupMap(el).set(REACTIVE_CHILDREN_KEY, {\n cleanup: reactive.cleanup,\n updateFn: (nextValue) => {\n reactive.updateFn(nextValue as ReactiveScalarChildSource);\n },\n fnRef: reactiveChildSource,\n });\n return true;\n } catch (error) {\n if (!reactiveChildBoundary && !reactiveChildBoundarySequence) {\n throw error;\n }\n }\n }\n\n if (reactiveChildBoundarySequence) {\n if (\n existingReactiveEntry &&\n Array.isArray(existingReactiveEntry.fnRef) &&\n areReactiveChildBoundarySequenceSourcesEqual(\n existingReactiveEntry.fnRef,\n reactiveChildBoundarySequence\n )\n ) {\n return true;\n }\n\n if (\n existingReactiveEntry?.updateFn &&\n Array.isArray(existingReactiveEntry.fnRef) &&\n canUpdateReactiveChildBoundarySequenceSource(\n existingReactiveEntry.fnRef,\n reactiveChildBoundarySequence\n )\n ) {\n existingReactiveEntry.updateFn(reactiveChildBoundarySequence);\n existingReactiveEntry.fnRef = reactiveChildBoundarySequence;\n return true;\n }\n\n existingReactiveEntry?.cleanup();\n\n const reactive = setupReactiveChildBoundarySequence(\n el,\n reactiveChildBoundarySequence,\n host\n );\n getOrCreateElementReactiveCleanupMap(el).set(REACTIVE_CHILDREN_KEY, {\n cleanup: reactive.cleanup,\n updateFn: reactive.updateFn,\n fnRef: reactiveChildBoundarySequence,\n });\n return true;\n }\n\n if (existingReactiveEntry?.fnRef === reactiveChildBoundary) {\n return true;\n }\n\n if (\n existingReactiveEntry?.updateFn &&\n !Array.isArray(existingReactiveEntry.fnRef)\n ) {\n existingReactiveEntry.updateFn(reactiveChildBoundary);\n existingReactiveEntry.fnRef = reactiveChildBoundary;\n return true;\n }\n\n existingReactiveEntry?.cleanup();\n\n if (!reactiveChildBoundary) {\n return false;\n }\n\n const reactive = setupReactiveChildBoundary(el, reactiveChildBoundary, host);\n getOrCreateElementReactiveCleanupMap(el).set(REACTIVE_CHILDREN_KEY, {\n cleanup: reactive.cleanup,\n updateFn: reactive.updateFn,\n fnRef: reactiveChildBoundary,\n });\n return true;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile-commit.js","names":[],"sources":["../../src/renderer/reconcile-commit.ts"],"sourcesContent":["import { teardownNodeSubtree } from './cleanup';\nimport { recordDOMReplace } from './utils';\n\nexport function commitReconciliation(\n parent: Element,\n finalNodes: Node[]\n): void {\n try {\n const finalSet = new Set<Node>(finalNodes);\n\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n if (!finalSet.has(n)) {\n teardownNodeSubtree(n);\n parent.removeChild(n);\n }\n n = next;\n }\n\n for (let i = 0; i < finalNodes.length; i++) {\n const desiredNode = finalNodes[i];\n const anchor = parent.childNodes[i] ?? null;\n if (desiredNode !== anchor) {\n parent.insertBefore(desiredNode, anchor);\n }\n }\n } catch {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < finalNodes.length; i++) {\n fragment.appendChild(finalNodes[i]);\n }\n\n try {\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n } catch {\n // Ignore fallback cleanup failures.\n }\n\n recordDOMReplace('reconcile');\n parent.replaceChildren(fragment);\n return;\n }\n}\n"],"mappings":";;;AAGA,SAAgB,qBACd,QACA,YACM;CACN,IAAI;EACF,MAAM,WAAW,IAAI,IAAU,UAAU;EAEzC,KAAK,IAAI,IAAI,OAAO,YAAY,IAAK;GACnC,MAAM,OAAO,EAAE;GACf,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG;IACpB,oBAAoB,CAAC;IACrB,OAAO,YAAY,CAAC;GACtB;GACA,IAAI;EACN;EAEA,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;GAC1C,MAAM,cAAc,WAAW;GAC/B,MAAM,SAAS,OAAO,WAAW,MAAM;GACvC,IAAI,gBAAgB,QAClB,OAAO,aAAa,aAAa,MAAM;EAE3C;CACF,QAAQ;EACN,MAAM,WAAW,SAAS,uBAAuB;EACjD,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KACrC,SAAS,YAAY,WAAW,EAAE;EAGpC,IAAI;GACF,KAAK,IAAI,IAAI,OAAO,YAAY,IAAK;IACnC,MAAM,OAAO,EAAE;IACf,oBAAoB,CAAC;IACrB,IAAI;GACN;EACF,QAAQ,CAER;EAEA,iBAAiB,WAAW;EAC5B,OAAO,gBAAgB,QAAQ;EAC/B;CACF;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile-fastpaths.js","names":[],"sources":["../../src/renderer/reconcile-fastpaths.ts"],"sourcesContent":["import type { VNode } from './types';\nimport { performBulkPositionalKeyedTextUpdate } from './children';\nimport { getRuntimeEnv } from './env';\nimport { applyRendererFastPath } from './fastpath';\nimport { keyedElements, planKeyedReorderFastPath } from './keyed';\nimport type { KeyedVnode } from './keyed-children';\nimport {\n canReuseIntrinsicElementInNamespace,\n getParentNamespace,\n} from './namespaces';\nimport { checkPropChanges, recordFastPathStats } from './utils';\n\ntype VnodeObj = VNode & { type?: unknown; props?: Record<string, unknown> };\n\nexport function tryFastPaths(\n parent: Element,\n newChildren: VNode[],\n keyedVnodes: KeyedVnode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): Map<string | number, Element> | null {\n try {\n const forcedResult = tryForcedPositionalBulkUpdate(\n parent,\n newChildren,\n keyedVnodes\n );\n if (forcedResult) {\n return forcedResult;\n }\n\n const rendererResult = tryRendererFastPath(\n parent,\n keyedVnodes,\n newChildren.length,\n oldKeyMap\n );\n if (rendererResult) {\n return rendererResult;\n }\n\n const positionalResult = tryPositionalBulkUpdate(parent, keyedVnodes);\n if (positionalResult) {\n return positionalResult;\n }\n } catch {\n // Fall through to full reconciliation.\n }\n\n return null;\n}\n\nfunction tryRendererFastPath(\n parent: Element,\n keyedVnodes: KeyedVnode[],\n totalChildren: number,\n oldKeyMap: Map<string | number, Element> | undefined\n): Map<string | number, Element> | null {\n const decision = planKeyedReorderFastPath(\n parent,\n keyedVnodes,\n totalChildren,\n oldKeyMap\n );\n\n if (decision.useFastPath) {\n try {\n const map = applyRendererFastPath(parent, keyedVnodes, oldKeyMap);\n if (map) {\n keyedElements.set(parent, map);\n return map;\n }\n } catch {\n // Fall through.\n }\n }\n\n return null;\n}\n\nfunction tryForcedPositionalBulkUpdate(\n parent: Element,\n newChildren: VNode[],\n keyedVnodes: KeyedVnode[]\n): Map<string | number, Element> | null {\n if (getRuntimeEnv().ASKR_FORCE_BULK_POSREUSE !== '1') return null;\n if (keyedVnodes.length === 0 || keyedVnodes.length !== newChildren.length) {\n return null;\n }\n\n try {\n const stats = performBulkPositionalKeyedTextUpdate(parent, keyedVnodes);\n recordFastPathStats(stats, 'bulkKeyedPositionalForced');\n\n rebuildKeyedMap(parent);\n return keyedElements.get(parent) as Map<string | number, Element>;\n } catch {\n return null;\n }\n}\n\nfunction tryPositionalBulkUpdate(\n parent: Element,\n keyedVnodes: KeyedVnode[]\n): Map<string | number, Element> | null {\n const total = keyedVnodes.length;\n if (total < 10) return null;\n\n if (parent.children.length !== total) {\n return null;\n }\n\n const parentNamespace = getParentNamespace(parent);\n const matchCount = countPositionalMatches(\n parent,\n keyedVnodes,\n parentNamespace\n );\n const matchFraction = matchCount / total;\n\n if (keyedVnodes.length > 0) {\n if (matchCount !== total && matchFraction >= 0.1) {\n return null;\n }\n } else if (matchFraction < 0.9) {\n return null;\n }\n\n if (hasPositionalPropChanges(parent, keyedVnodes)) {\n return null;\n }\n\n try {\n const stats = performBulkPositionalKeyedTextUpdate(parent, keyedVnodes);\n recordFastPathStats(stats, 'bulkKeyedPositionalHits');\n\n rebuildKeyedMap(parent);\n return keyedElements.get(parent) as Map<string | number, Element>;\n } catch {\n return null;\n }\n}\n\nfunction countPositionalMatches(\n parent: Element,\n keyedVnodes: KeyedVnode[],\n parentNamespace: string | undefined\n): number {\n let matchCount = 0;\n\n try {\n for (let i = 0; i < keyedVnodes.length; i++) {\n const vnode = keyedVnodes[i].vnode as VnodeObj;\n const expectedKey = keyedVnodes[i].key;\n\n if (!vnode || typeof vnode !== 'object' || typeof vnode.type !== 'string')\n continue;\n\n const el = parent.children[i] as Element | undefined;\n if (!el) continue;\n\n if (\n canReuseIntrinsicElementInNamespace(el, vnode.type, parentNamespace)\n ) {\n const actualKey = el.getAttribute('data-key');\n const keyMatches =\n actualKey === String(expectedKey) ||\n (actualKey !== null &&\n !Number.isNaN(Number(actualKey)) &&\n Number(actualKey) === expectedKey);\n\n if (keyMatches) {\n matchCount++;\n }\n }\n }\n } catch {\n // Ignore.\n }\n\n return matchCount;\n}\n\nfunction hasPositionalPropChanges(\n parent: Element,\n keyedVnodes: KeyedVnode[]\n): boolean {\n try {\n for (let i = 0; i < keyedVnodes.length; i++) {\n const vnode = keyedVnodes[i].vnode as VnodeObj;\n const el = parent.children[i] as Element | undefined;\n if (!el || !vnode || typeof vnode !== 'object') continue;\n\n if (checkPropChanges(el, vnode.props || {})) {\n return true;\n }\n }\n } catch {\n return true;\n }\n\n return false;\n}\n\nfunction rebuildKeyedMap(parent: Element): void {\n try {\n const map = new Map<string | number, Element>();\n for (let el = parent.firstElementChild; el; el = el.nextElementSibling) {\n const k = el.getAttribute('data-key');\n if (k !== null) {\n map.set(k, el);\n const n = Number(k);\n if (!Number.isNaN(n)) map.set(n, el);\n }\n }\n keyedElements.set(parent, map);\n } catch {\n // Ignore.\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile-resolution.js","names":[],"sources":["../../src/renderer/reconcile-resolution.ts"],"sourcesContent":["import { __FOR_BOUNDARY__ } from '../common/vnode';\nimport type { Props } from '../common/props';\nimport type { ComponentFunction } from '../runtime/component-contracts';\nimport {\n evaluateCaseState,\n evaluateShowState,\n type ControlBoundaryState,\n} from '../runtime/control';\nimport { evaluateForState } from '../runtime/for';\nimport { getRendererDOMHost, type ElementWithContext } from './dom-host';\nimport {\n canReuseIntrinsicElementInNamespace,\n getParentNamespace,\n} from './namespaces';\nimport type { DOMElement, VNode } from './types';\nimport { extractKey } from './utils';\n\ntype VnodeObj = VNode & { type?: unknown; props?: Record<string, unknown> };\ntype ComponentVNode = DOMElement & { type: ComponentFunction };\n\nexport function createOldElResolver(\n parent: Element,\n oldKeyMap: Map<string | number, Element> | undefined,\n usedOldEls: WeakSet<Node>\n): (k: string | number) => Element | undefined {\n return (k: string | number) => {\n if (!oldKeyMap) return undefined;\n\n const direct = oldKeyMap.get(k);\n if (direct && !usedOldEls.has(direct)) {\n usedOldEls.add(direct);\n return direct;\n }\n\n const s = String(k);\n const byString = oldKeyMap.get(s);\n if (byString && !usedOldEls.has(byString)) {\n usedOldEls.add(byString);\n return byString;\n }\n\n const n = Number(s);\n if (!Number.isNaN(n)) {\n const byNum = oldKeyMap.get(n);\n if (byNum && !usedOldEls.has(byNum)) {\n usedOldEls.add(byNum);\n return byNum;\n }\n }\n\n return scanForElementByKey(parent, k, s, usedOldEls);\n };\n}\n\nfunction scanForElementByKey(\n parent: Element,\n k: string | number,\n keyStr: string,\n usedOldEls: WeakSet<Node>\n): Element | undefined {\n try {\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n if (usedOldEls.has(ch)) continue;\n const attr = ch.getAttribute('data-key');\n if (attr === keyStr) {\n usedOldEls.add(ch);\n return ch;\n }\n if (attr !== null) {\n const numAttr = Number(attr);\n if (!Number.isNaN(numAttr) && numAttr === (k as number)) {\n usedOldEls.add(ch);\n return ch;\n }\n }\n }\n } catch {\n // Ignore.\n }\n return undefined;\n}\n\nexport function reconcileSingleChild(\n child: VNode,\n index: number,\n parent: Element,\n resolveOldElOnce: (k: string | number) => Element | undefined,\n resolveUnkeyedOnce: () => Element | undefined,\n usedOldEls: WeakSet<Node>,\n newKeyMap: Map<string | number, Element>\n): Node | null {\n const resolvedControlBoundary = prepareControlBoundaryResolution(child);\n if (resolvedControlBoundary !== null) {\n if (resolvedControlBoundary.remount) {\n return getRendererDOMHost().createDOMNode(\n resolvedControlBoundary.vnode,\n getParentNamespace(parent)\n );\n }\n\n return reconcileSingleChild(\n resolvedControlBoundary.vnode,\n index,\n parent,\n resolveOldElOnce,\n resolveUnkeyedOnce,\n usedOldEls,\n newKeyMap\n );\n }\n\n const key = extractKey(child);\n\n if (key !== undefined) {\n return reconcileKeyedChild(child, key, parent, resolveOldElOnce, newKeyMap);\n }\n\n return reconcileUnkeyedChild(\n child,\n index,\n parent,\n resolveUnkeyedOnce,\n usedOldEls\n );\n}\n\nfunction reconcileKeyedChild(\n child: VNode,\n key: string | number,\n parent: Element,\n resolveOldElOnce: (k: string | number) => Element | undefined,\n newKeyMap: Map<string | number, Element>\n): Node | null {\n const el = resolveOldElOnce(key);\n const parentNamespace = getParentNamespace(parent);\n const domHost = getRendererDOMHost();\n\n if (el && el.parentElement === parent) {\n try {\n const childObj = child as VnodeObj;\n if (\n childObj &&\n typeof childObj === 'object' &&\n typeof childObj.type === 'string'\n ) {\n if (\n canReuseIntrinsicElementInNamespace(\n el,\n childObj.type,\n parentNamespace\n )\n ) {\n domHost.updateElementFromVnode(el, child);\n newKeyMap.set(key, el);\n return el;\n }\n }\n if (isComponentVNode(child)) {\n const synced = domHost.syncComponentElement(\n el,\n child as unknown as ElementWithContext,\n child.type,\n ((child.props ?? {}) as Props) || {},\n parentNamespace\n );\n if (synced) {\n if (synced instanceof Element) newKeyMap.set(key, synced);\n return synced;\n }\n }\n } catch {\n // Fall through to replacement.\n }\n }\n\n const dom = domHost.createDOMNode(child, parentNamespace);\n if (dom) {\n if (dom instanceof Element) newKeyMap.set(key, dom);\n return dom;\n }\n\n return null;\n}\n\nfunction reconcileUnkeyedChild(\n child: VNode,\n index: number,\n parent: Element,\n resolveUnkeyedOnce: () => Element | undefined,\n usedOldEls: WeakSet<Node>\n): Node | null {\n const parentNamespace = getParentNamespace(parent);\n const domHost = getRendererDOMHost();\n\n try {\n const existing = parent.childNodes[index] as Node | undefined;\n\n if (typeof child === 'string' || typeof child === 'number') {\n if (existing && existing.nodeType === 3) {\n (existing as Text).data = String(child);\n usedOldEls.add(existing);\n return existing;\n }\n return domHost.createDOMNode(child, parentNamespace);\n }\n\n if (existing instanceof Element) {\n const synced = trySyncComponentChild(\n existing,\n child,\n usedOldEls,\n parentNamespace\n );\n if (synced) return synced;\n }\n\n if (\n existing instanceof Element &&\n canReuseElement(existing, child, parentNamespace)\n ) {\n domHost.updateElementFromVnode(existing, child);\n usedOldEls.add(existing);\n return existing;\n }\n\n const avail = resolveUnkeyedOnce();\n if (avail) {\n const reuseResult = tryReuseElement(\n avail,\n child,\n usedOldEls,\n parentNamespace\n );\n if (reuseResult) return reuseResult;\n }\n } catch {\n // Fall through to create new.\n }\n\n return domHost.createDOMNode(child, parentNamespace);\n}\n\nfunction isComponentVNode(child: VNode): child is ComponentVNode {\n return (\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as VnodeObj).type === 'function'\n );\n}\n\nfunction isControlBoundaryVNode(child: VNode): child is DOMElement {\n return (\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n (child as VnodeObj).type === __FOR_BOUNDARY__\n );\n}\n\nfunction prepareControlBoundaryResolution(child: VNode): {\n remount: boolean;\n vnode: VNode | null;\n} | null {\n if (!isControlBoundaryVNode(child)) {\n return null;\n }\n\n const controlState = child._controlState ?? child._forState;\n if (!controlState) {\n return null;\n }\n if (controlState.kind === 'for') {\n const childrenVNodes = evaluateControlBoundaryChildren(controlState);\n return childrenVNodes.length === 1\n ? { remount: false, vnode: childrenVNodes[0] ?? null }\n : null;\n }\n\n const previousActiveKey = controlState.activeKey;\n const childrenVNodes = evaluateControlBoundaryChildren(controlState);\n\n return {\n remount:\n previousActiveKey !== null &&\n controlState.activeKey !== previousActiveKey,\n vnode: childrenVNodes[0] ?? null,\n };\n}\n\nfunction evaluateControlBoundaryChildren(\n controlState: ControlBoundaryState\n): VNode[] {\n if (controlState.kind === 'for') {\n return evaluateForState(controlState);\n }\n\n if (controlState.kind === 'show') {\n return evaluateShowState(controlState);\n }\n\n return evaluateCaseState(controlState);\n}\n\nfunction trySyncComponentChild(\n existing: Element,\n child: VNode,\n usedOldEls: WeakSet<Node>,\n parentNamespace: string | undefined\n): Node | null {\n if (!isComponentVNode(child)) return null;\n\n const synced = getRendererDOMHost().syncComponentElement(\n existing,\n child as unknown as ElementWithContext,\n child.type,\n ((child.props ?? {}) as Props) || {},\n parentNamespace\n );\n if (!synced) return null;\n\n usedOldEls.add(existing);\n usedOldEls.add(synced);\n return synced;\n}\n\nfunction canReuseElement(\n existing: Element | undefined,\n child: VNode,\n parentNamespace: string | undefined\n): boolean {\n if (!existing) return false;\n if (typeof child !== 'object' || child === null || !('type' in child))\n return false;\n\n const childObj = child as VnodeObj;\n const existingKey = existing.getAttribute('data-key');\n const hasNoKey = existingKey === null || existingKey === undefined;\n\n return (\n hasNoKey &&\n typeof childObj.type === 'string' &&\n canReuseIntrinsicElementInNamespace(\n existing,\n childObj.type,\n parentNamespace\n )\n );\n}\n\nexport function collectUnkeyedElements(parent: Element): Element[] {\n const elements: Element[] = [];\n for (let ch = parent.firstElementChild; ch; ch = ch.nextElementSibling) {\n if (ch.getAttribute('data-key') === null) elements.push(ch);\n }\n return elements;\n}\n\nfunction tryReuseElement(\n avail: Element,\n child: VNode,\n usedOldEls: WeakSet<Node>,\n parentNamespace: string | undefined\n): Node | null {\n if (typeof child === 'string' || typeof child === 'number') {\n return null;\n }\n\n const synced = trySyncComponentChild(\n avail,\n child,\n usedOldEls,\n parentNamespace\n );\n if (synced) {\n return synced;\n }\n\n if (typeof child === 'object' && child !== null && 'type' in child) {\n const childObj = child as VnodeObj;\n if (\n typeof childObj.type === 'string' &&\n canReuseIntrinsicElementInNamespace(avail, childObj.type, parentNamespace)\n ) {\n getRendererDOMHost().updateElementFromVnode(avail, child);\n usedOldEls.add(avail);\n return avail;\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.js","names":[],"sources":["../../src/renderer/reconcile.ts"],"sourcesContent":["/**\n * RENDERER & RECONCILIATION INVARIANTS (LOCKED)\n *\n * 1. DOM order derives only from current vnode order.\n * 2. VNode identity is not vnode stability.\n * 3. Keyed reconciliation is element-only.\n * 4. Primitive children map to text nodes.\n * 5. Fast paths must prove eligibility and fall back cleanly.\n * 6. Cleanup is position-independent.\n * 7. For-boundaries and keyed lists obey the same ordering rules.\n */\n\nimport type { VNode } from './types';\nimport { keyedElements } from './keyed';\nimport { buildDOMKeyMap, extractKeyedVnodes } from './keyed-children';\nimport { commitReconciliation } from './reconcile-commit';\nimport { tryFastPaths } from './reconcile-fastpaths';\nimport {\n collectUnkeyedElements,\n createOldElResolver,\n reconcileSingleChild,\n} from './reconcile-resolution';\n\nexport const IS_DOM_AVAILABLE = typeof document !== 'undefined';\n\nexport function reconcileKeyedChildren(\n parent: Element,\n newChildren: VNode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): Map<string | number, Element> {\n const keyedVnodes = extractKeyedVnodes(newChildren);\n const ensuredOldKeyMap = oldKeyMap || buildDOMKeyMap(parent);\n\n const fastPathResult = tryFastPaths(\n parent,\n newChildren,\n keyedVnodes,\n ensuredOldKeyMap\n );\n if (fastPathResult) {\n return fastPathResult;\n }\n\n return performFullReconciliation(parent, newChildren, ensuredOldKeyMap);\n}\n\nfunction performFullReconciliation(\n parent: Element,\n newChildren: VNode[],\n oldKeyMap: Map<string | number, Element> | undefined\n): Map<string | number, Element> {\n const newKeyMap = new Map<string | number, Element>();\n const finalNodes: Node[] = [];\n const usedOldEls = new WeakSet<Node>();\n\n const resolveOldElOnce = createOldElResolver(parent, oldKeyMap, usedOldEls);\n const unkeyedEls = collectUnkeyedElements(parent);\n let unkeyedIndex = 0;\n const resolveUnkeyedOnce = (): Element | undefined => {\n while (unkeyedIndex < unkeyedEls.length) {\n const candidate = unkeyedEls[unkeyedIndex++];\n if (!usedOldEls.has(candidate)) return candidate;\n }\n return undefined;\n };\n\n for (let i = 0; i < newChildren.length; i++) {\n const child = newChildren[i];\n const node = reconcileSingleChild(\n child,\n i,\n parent,\n resolveOldElOnce,\n resolveUnkeyedOnce,\n usedOldEls,\n newKeyMap\n );\n if (node) finalNodes.push(node);\n }\n\n if (typeof document === 'undefined') return newKeyMap;\n\n commitReconciliation(parent, finalNodes);\n keyedElements.delete(parent);\n\n return newKeyMap;\n}\n"],"mappings":";;;;;AAyBA,SAAgB,uBACd,QACA,aACA,WAC+B;CAC/B,MAAM,cAAc,mBAAmB,WAAW;CAClD,MAAM,mBAAmB,aAAa,eAAe,MAAM;CAE3D,MAAM,iBAAiB,aACrB,QACA,aACA,aACA,gBACF;CACA,IAAI,gBACF,OAAO;CAGT,OAAO,0BAA0B,QAAQ,aAAa,gBAAgB;AACxE;AAEA,SAAS,0BACP,QACA,aACA,WAC+B;CAC/B,MAAM,4BAAY,IAAI,IAA8B;CACpD,MAAM,aAAqB,CAAC;CAC5B,MAAM,6BAAa,IAAI,QAAc;CAErC,MAAM,mBAAmB,oBAAoB,QAAQ,WAAW,UAAU;CAC1E,MAAM,aAAa,uBAAuB,MAAM;CAChD,IAAI,eAAe;CACnB,MAAM,2BAAgD;EACpD,OAAO,eAAe,WAAW,QAAQ;GACvC,MAAM,YAAY,WAAW;GAC7B,IAAI,CAAC,WAAW,IAAI,SAAS,GAAG,OAAO;EACzC;CAEF;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,QAAQ,YAAY;EAC1B,MAAM,OAAO,qBACX,OACA,GACA,QACA,kBACA,oBACA,YACA,SACF;EACA,IAAI,MAAM,WAAW,KAAK,IAAI;CAChC;CAEA,IAAI,OAAO,aAAa,aAAa,OAAO;CAE5C,qBAAqB,QAAQ,UAAU;CACvC,cAAc,OAAO,MAAM;CAE3B,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"retained-element-rollback.js","names":[],"sources":["../../src/renderer/retained-element-rollback.ts"],"sourcesContent":["import { logger } from '../dev/logger';\nimport {\n addDelegatedListener,\n getDelegatedHandlersForElement,\n removeDelegatedListener,\n updateDelegatedListener,\n} from '../runtime/events';\nimport {\n elementListeners,\n elementReactivePropsCleanup,\n elementRefs,\n type ListenerMapEntry,\n type ReactivePropCleanupEntry,\n} from './cleanup';\nimport { keyedElements } from './keyed';\n\ninterface AttributeSnapshot {\n element: Element;\n attributes: Array<[string, string]>;\n}\n\ninterface ChildNodesSnapshot {\n element: Element;\n childNodes: Node[];\n}\n\ninterface FormControlSnapshot {\n element: Element;\n value?: string;\n checked?: boolean;\n}\n\ninterface DelegatedListenerEntrySnapshot {\n eventName: string;\n handler: EventListener;\n original: EventListener;\n options?: AddEventListenerOptions;\n}\n\ninterface DelegatedListenerSnapshot {\n element: Element;\n entries: DelegatedListenerEntrySnapshot[];\n}\n\ninterface ListenerEntrySnapshot {\n listenerKey: string;\n entry: ListenerMapEntry;\n}\n\ninterface ListenerSnapshot {\n element: Element;\n entries: ListenerEntrySnapshot[];\n}\n\ninterface RefSnapshot {\n element: Element;\n ref: unknown;\n}\n\ninterface ReactivePropEntrySnapshot {\n propName: string;\n entry: ReactivePropCleanupEntry;\n}\n\ninterface ReactivePropsSnapshot {\n element: Element;\n entries: ReactivePropEntrySnapshot[];\n}\n\ninterface TextSnapshot {\n node: Text;\n data: string;\n}\n\nexport interface RetainedElementSnapshot {\n attributes: AttributeSnapshot[];\n childNodes: ChildNodesSnapshot[];\n delegatedListeners: DelegatedListenerSnapshot[];\n formControls: FormControlSnapshot[];\n keyedMap: Map<string | number, Element> | undefined;\n listeners: ListenerSnapshot[];\n reactiveProps: ReactivePropsSnapshot[];\n refs: RefSnapshot[];\n textNodes: TextSnapshot[];\n}\n\nfunction collectElementSubtree(root: Element): Element[] {\n const elements = [root];\n const descendants = root.querySelectorAll('*');\n for (let index = 0; index < descendants.length; index += 1) {\n elements.push(descendants[index]);\n }\n return elements;\n}\n\nfunction collectTextSnapshots(root: Element): TextSnapshot[] {\n const snapshots: TextSnapshot[] = [];\n const stack = Array.from(root.childNodes).reverse();\n\n while (stack.length > 0) {\n const node = stack.pop()!;\n if (node.nodeType === 3) {\n snapshots.push({ node: node as Text, data: (node as Text).data });\n continue;\n }\n\n for (let child = node.lastChild; child; child = child.previousSibling) {\n stack.push(child);\n }\n }\n\n return snapshots;\n}\n\nfunction getFormControlSnapshot(element: Element): FormControlSnapshot | null {\n const control = element as Element & {\n value?: unknown;\n checked?: unknown;\n };\n const snapshot: FormControlSnapshot = { element };\n\n if ('value' in control) {\n snapshot.value = String(control.value ?? '');\n }\n\n if ('checked' in control) {\n snapshot.checked = Boolean(control.checked);\n }\n\n return snapshot.value !== undefined || snapshot.checked !== undefined\n ? snapshot\n : null;\n}\n\nfunction cloneListenerEntry(entry: ListenerMapEntry): ListenerMapEntry {\n return {\n handler: entry.handler,\n original: entry.original,\n eventName: entry.eventName,\n options: entry.options,\n isDelegated: entry.isDelegated,\n updateHandler: entry.updateHandler,\n };\n}\n\nfunction cloneReactivePropEntry(\n entry: ReactivePropCleanupEntry\n): ReactivePropCleanupEntry {\n return {\n cleanup: entry.cleanup,\n fnRef: entry.fnRef,\n restoreFn: entry.restoreFn,\n updateFn: entry.updateFn,\n };\n}\n\nexport function snapshotRetainedElement(\n element: Element\n): RetainedElementSnapshot {\n const elements = collectElementSubtree(element);\n const attributes: AttributeSnapshot[] = [];\n const childNodes: ChildNodesSnapshot[] = [];\n const delegatedListeners: DelegatedListenerSnapshot[] = [];\n const formControls: FormControlSnapshot[] = [];\n const listeners: ListenerSnapshot[] = [];\n const reactiveProps: ReactivePropsSnapshot[] = [];\n const refs: RefSnapshot[] = [];\n\n for (const currentElement of elements) {\n attributes.push({\n element: currentElement,\n attributes: Array.from(currentElement.attributes, (attribute) => [\n attribute.name,\n attribute.value,\n ]),\n });\n childNodes.push({\n element: currentElement,\n childNodes: Array.from(currentElement.childNodes),\n });\n\n const formControl = getFormControlSnapshot(currentElement);\n if (formControl) {\n formControls.push(formControl);\n }\n\n const listenerMap = elementListeners.get(currentElement);\n listeners.push({\n element: currentElement,\n entries: listenerMap\n ? Array.from(listenerMap, ([listenerKey, entry]) => ({\n listenerKey,\n entry: cloneListenerEntry(entry),\n }))\n : [],\n });\n\n const delegatedHandlerMap = getDelegatedHandlersForElement(currentElement);\n delegatedListeners.push({\n element: currentElement,\n entries: delegatedHandlerMap\n ? Array.from(delegatedHandlerMap, ([eventName, entry]) => ({\n eventName,\n handler: entry.handler,\n original: entry.original,\n options: entry.options,\n }))\n : [],\n });\n\n const reactivePropMap = elementReactivePropsCleanup.get(currentElement);\n reactiveProps.push({\n element: currentElement,\n entries: reactivePropMap\n ? Array.from(reactivePropMap, ([propName, entry]) => ({\n propName,\n entry: cloneReactivePropEntry(entry),\n }))\n : [],\n });\n\n refs.push({\n element: currentElement,\n ref: elementRefs.get(currentElement),\n });\n }\n\n const keyedMap = keyedElements.get(element);\n\n return {\n attributes,\n childNodes,\n delegatedListeners,\n formControls,\n keyedMap: keyedMap ? new Map(keyedMap) : undefined,\n listeners,\n reactiveProps,\n refs,\n textNodes: collectTextSnapshots(element),\n };\n}\n\nfunction sameChildOrder(element: Element, childNodes: Node[]): boolean {\n if (element.childNodes.length !== childNodes.length) {\n return false;\n }\n\n for (let index = 0; index < childNodes.length; index += 1) {\n if (element.childNodes[index] !== childNodes[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction restoreAttributes(snapshot: RetainedElementSnapshot): void {\n for (const { element, attributes } of snapshot.attributes) {\n const expectedNames = new Set(attributes.map(([name]) => name));\n\n for (const attribute of Array.from(element.attributes)) {\n if (!expectedNames.has(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n }\n\n for (const [name, value] of attributes) {\n if (element.getAttribute(name) !== value) {\n element.setAttribute(name, value);\n }\n }\n }\n}\n\nfunction restoreFormControls(snapshot: RetainedElementSnapshot): void {\n for (const { element, value, checked } of snapshot.formControls) {\n const control = element as Element & {\n value?: string;\n checked?: boolean;\n };\n\n if (value !== undefined && 'value' in control) {\n control.value = value;\n }\n\n if (checked !== undefined && 'checked' in control) {\n control.checked = checked;\n }\n }\n}\n\nfunction applyRefValue<T>(ref: unknown, value: T | null): void {\n if (!ref) {\n return;\n }\n\n try {\n if (typeof ref === 'function') {\n (ref as (value: T | null) => void)(value);\n return;\n }\n\n if (Object.isExtensible(ref)) {\n (ref as { current: T | null }).current = value;\n }\n } catch {\n // Rollback must preserve the original render error.\n }\n}\n\nfunction restoreRefs(snapshot: RetainedElementSnapshot): void {\n for (const { element, ref } of snapshot.refs) {\n const currentRef = elementRefs.get(element);\n\n if (currentRef !== ref) {\n applyRefValue(currentRef, null);\n }\n\n if (ref) {\n applyRefValue(ref, element);\n elementRefs.set(element, ref);\n } else {\n elementRefs.delete(element);\n }\n }\n}\n\nfunction removeDirectListener(element: Element, entry: ListenerMapEntry): void {\n if (entry.isDelegated) {\n return;\n }\n\n if (entry.options !== undefined) {\n element.removeEventListener(entry.eventName, entry.handler, entry.options);\n } else {\n element.removeEventListener(entry.eventName, entry.handler);\n }\n}\n\nfunction addDirectListener(element: Element, entry: ListenerMapEntry): void {\n if (entry.isDelegated) {\n return;\n }\n\n if (entry.options !== undefined) {\n element.addEventListener(entry.eventName, entry.handler, entry.options);\n } else {\n element.addEventListener(entry.eventName, entry.handler);\n }\n}\n\nfunction restoreListeners(snapshot: RetainedElementSnapshot): void {\n for (const { element, entries } of snapshot.listeners) {\n const expectedKeys = new Set(entries.map(({ listenerKey }) => listenerKey));\n let currentMap = elementListeners.get(element);\n\n if (currentMap) {\n for (const [listenerKey, entry] of Array.from(currentMap)) {\n if (!expectedKeys.has(listenerKey)) {\n removeDirectListener(element, entry);\n currentMap.delete(listenerKey);\n }\n }\n }\n\n if (entries.length === 0) {\n if (currentMap?.size === 0) {\n elementListeners.delete(element);\n }\n continue;\n }\n\n if (!currentMap) {\n currentMap = new Map();\n elementListeners.set(element, currentMap);\n }\n\n for (const { listenerKey, entry } of entries) {\n const currentEntry = currentMap.get(listenerKey);\n\n entry.updateHandler?.(entry.original);\n\n if (currentEntry && currentEntry.handler !== entry.handler) {\n removeDirectListener(element, currentEntry);\n }\n\n if (!currentEntry || currentEntry.handler !== entry.handler) {\n addDirectListener(element, entry);\n } else {\n currentEntry.updateHandler?.(entry.original);\n }\n\n currentMap.set(listenerKey, cloneListenerEntry(entry));\n }\n }\n}\n\nfunction restoreDelegatedListeners(snapshot: RetainedElementSnapshot): void {\n for (const { element, entries } of snapshot.delegatedListeners) {\n const expectedEventNames = new Set(\n entries.map(({ eventName }) => eventName)\n );\n const currentMap = getDelegatedHandlersForElement(element);\n\n if (currentMap) {\n for (const eventName of currentMap.keys()) {\n if (!expectedEventNames.has(eventName)) {\n removeDelegatedListener(element, eventName);\n }\n }\n }\n\n for (const { eventName, handler, original, options } of entries) {\n if (\n !updateDelegatedListener(element, eventName, handler, original, options)\n ) {\n addDelegatedListener(element, eventName, handler, original, options);\n }\n }\n }\n}\n\nfunction restoreReactiveProps(snapshot: RetainedElementSnapshot): void {\n for (const { element, entries } of snapshot.reactiveProps) {\n const expectedPropNames = new Set(entries.map(({ propName }) => propName));\n let currentMap = elementReactivePropsCleanup.get(element);\n\n if (currentMap) {\n for (const [propName, entry] of Array.from(currentMap)) {\n if (!expectedPropNames.has(propName)) {\n entry.cleanup();\n currentMap.delete(propName);\n }\n }\n }\n\n if (entries.length === 0) {\n if (currentMap?.size === 0) {\n elementReactivePropsCleanup.delete(element);\n }\n continue;\n }\n\n if (!currentMap) {\n currentMap = new Map();\n elementReactivePropsCleanup.set(element, currentMap);\n }\n\n for (const { propName, entry } of entries) {\n const currentEntry = currentMap.get(propName);\n\n if (currentEntry) {\n currentEntry.updateFn?.(entry.fnRef);\n currentEntry.fnRef = entry.fnRef;\n currentMap.set(propName, currentEntry);\n continue;\n }\n\n currentMap.set(\n propName,\n entry.restoreFn?.(entry.fnRef) ?? cloneReactivePropEntry(entry)\n );\n }\n }\n}\n\nfunction restoreChildNodes(\n snapshot: RetainedElementSnapshot,\n cleanupRangeNode: (node: Node) => void\n): void {\n for (const { element, childNodes } of snapshot.childNodes) {\n const expectedChildren = new Set(childNodes);\n\n for (const child of Array.from(element.childNodes)) {\n if (!expectedChildren.has(child)) {\n cleanupRangeNode(child);\n }\n }\n }\n\n for (const { element, childNodes } of snapshot.childNodes) {\n if (!sameChildOrder(element, childNodes)) {\n element.replaceChildren(...childNodes);\n }\n }\n}\n\nfunction restoreTextNodes(snapshot: RetainedElementSnapshot): void {\n for (const { node, data } of snapshot.textNodes) {\n if (node.data !== data) {\n node.data = data;\n }\n }\n}\n\nfunction restoreKeyedMap(\n element: Element,\n snapshot: RetainedElementSnapshot\n): void {\n if (snapshot.keyedMap) {\n keyedElements.set(element, new Map(snapshot.keyedMap));\n } else {\n keyedElements.delete(element);\n }\n}\n\nexport function restoreRetainedElement(\n element: Element,\n snapshot: RetainedElementSnapshot,\n cleanupRangeNode: (node: Node) => void\n): void {\n restoreChildNodes(snapshot, cleanupRangeNode);\n restoreReactiveProps(snapshot);\n restoreAttributes(snapshot);\n restoreTextNodes(snapshot);\n restoreFormControls(snapshot);\n restoreRefs(snapshot);\n restoreListeners(snapshot);\n restoreDelegatedListeners(snapshot);\n restoreKeyedMap(element, snapshot);\n}\n\nexport function runRetainedElementUpdate(\n element: Element,\n cleanupRangeNode: (node: Node) => void,\n update: () => void,\n onError?: () => void\n): void {\n const snapshot = snapshotRetainedElement(element);\n\n try {\n update();\n } catch (err) {\n onError?.();\n\n try {\n restoreRetainedElement(element, snapshot, cleanupRangeNode);\n } catch (rollbackError) {\n logger.warn('[Askr] retained element rollback failed:', rollbackError);\n }\n\n throw err;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stable-patch.js","names":[],"sources":["../../src/renderer/stable-patch.ts"],"sourcesContent":["import { isPromiseLike } from '../common/promise';\nimport {\n captureInlineRenderSnapshot,\n getCurrentInstance,\n renderComponentInline,\n warnUnusedStateReads,\n type ComponentFunction,\n} from '../runtime/component-contracts';\nimport {\n getCurrentContextFrame,\n getVNodeContextFrame,\n withContext,\n} from '../runtime/context';\nimport { incDevCounter } from '../runtime/dev-namespace';\nimport { recordBenchEvent } from '../runtime/for';\nimport {\n findHostInstanceByType,\n inheritComponentCleanupStrict,\n inheritComponentKey,\n isRouteRootComponentVNode,\n resolveNestedComponentResult,\n} from './component-host';\nimport { getRendererDOMHost, type InstanceHostElement } from './dom-host';\nimport { _isDOMElement, type DOMElement, type VNode } from './types';\nimport { tagNamesEqualIgnoreCase } from './utils';\n\nfunction normalizeStableIntrinsicChildren(\n children: VNode | VNode[] | undefined\n): VNode[] {\n if (children === null || children === undefined || children === false) {\n return [];\n }\n\n return Array.isArray(children) ? children : [children];\n}\n\nfunction getStableIntrinsicChildren(vnode: DOMElement): VNode[] {\n return normalizeStableIntrinsicChildren(\n (vnode.props?.children as VNode | VNode[] | undefined) ?? vnode.children\n );\n}\n\nfunction patchStableIntrinsicText(domNode: Node, nextVNode: VNode): boolean {\n if (\n domNode.nodeType !== 3 ||\n (typeof nextVNode !== 'string' && typeof nextVNode !== 'number')\n ) {\n return false;\n }\n\n const nextText = String(nextVNode);\n const textNode = domNode as Text;\n if (textNode.data !== nextText) {\n recordBenchEvent('domTextSet');\n textNode.data = nextText;\n }\n\n return true;\n}\n\nfunction patchStableIntrinsicElement(\n dom: Element,\n nextVNode: DOMElement\n): boolean {\n if (\n typeof nextVNode.type !== 'string' ||\n !tagNamesEqualIgnoreCase(dom.tagName, nextVNode.type)\n ) {\n return false;\n }\n\n getRendererDOMHost().updateElementFromVnode(dom, nextVNode, false);\n\n const nextChildren = getStableIntrinsicChildren(nextVNode);\n if (dom.childNodes.length !== nextChildren.length) {\n return false;\n }\n\n for (let index = 0; index < nextChildren.length; index += 1) {\n const nextChild = nextChildren[index];\n\n const currentChildNode = dom.childNodes[index];\n if (!currentChildNode) {\n return false;\n }\n\n if (patchStableIntrinsicText(currentChildNode, nextChild)) {\n continue;\n }\n\n if (\n currentChildNode instanceof Element &&\n _isDOMElement(nextChild) &&\n typeof nextChild.type === 'string' &&\n patchStableIntrinsicElement(currentChildNode, nextChild)\n ) {\n continue;\n }\n\n return false;\n }\n\n return true;\n}\n\nfunction resolveStableIntrinsicPatchVNode(\n dom: Element,\n vnode: VNode\n): DOMElement | null {\n if (!_isDOMElement(vnode)) {\n return null;\n }\n\n if (typeof vnode.type === 'string') {\n return tagNamesEqualIgnoreCase(dom.tagName, vnode.type) ? vnode : null;\n }\n\n if (typeof vnode.type !== 'function') {\n return null;\n }\n\n const host = dom as InstanceHostElement;\n const existingInstance = findHostInstanceByType(\n host,\n vnode.type as ComponentFunction\n );\n if (\n !existingInstance ||\n existingInstance.fn !== vnode.type ||\n host.__ASKR_WRAPPER_HOST\n ) {\n return null;\n }\n\n const snapshot =\n getVNodeContextFrame(vnode) ||\n getCurrentContextFrame() ||\n existingInstance.ownerFrame ||\n null;\n\n captureInlineRenderSnapshot(existingInstance);\n\n existingInstance.props =\n (((vnode as DOMElement).props ?? {}) as Record<string, unknown>) || {};\n existingInstance.isRoot = isRouteRootComponentVNode(vnode);\n existingInstance.portalScope =\n getCurrentInstance()?.portalScope ?? existingInstance.portalScope;\n inheritComponentCleanupStrict(existingInstance);\n\n if (snapshot) {\n existingInstance.ownerFrame = snapshot;\n }\n\n const result = withContext(snapshot, () =>\n renderComponentInline(existingInstance)\n );\n if (isPromiseLike(result)) {\n throw new Error(\n 'Async components are not supported. Components must return synchronously.'\n );\n }\n\n const resolvedResult = resolveNestedComponentResult(\n result,\n snapshot ?? null,\n existingInstance\n );\n if (\n _isDOMElement(resolvedResult) &&\n typeof resolvedResult.type === 'string' &&\n tagNamesEqualIgnoreCase(dom.tagName, resolvedResult.type)\n ) {\n return inheritComponentKey(resolvedResult, vnode as DOMElement);\n }\n\n return null;\n}\n\nexport function tryPatchStableForDirtyItem(scope: {\n dom?: Node;\n vnode?: VNode;\n}): boolean {\n incDevCounter('stableForPatchAttempt');\n if (!(scope.dom instanceof Element) || scope.vnode === undefined) {\n return false;\n }\n\n const nextIntrinsic = resolveStableIntrinsicPatchVNode(\n scope.dom,\n scope.vnode\n );\n if (!nextIntrinsic) {\n return false;\n }\n\n const didPatch = patchStableIntrinsicElement(scope.dom, nextIntrinsic);\n\n const existingInstance = (scope.dom as InstanceHostElement).__ASKR_INSTANCE;\n if (didPatch && existingInstance) {\n warnUnusedStateReads(existingInstance);\n }\n\n if (didPatch) {\n incDevCounter('stableForPatchHit');\n }\n\n return didPatch;\n}\n"],"mappings":"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"}