@askrjs/askr 0.0.47 → 0.0.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/dist/benchmark.js +6 -6
  2. package/dist/benchmark.js.map +1 -1
  3. package/dist/boot/hydration.js +140 -0
  4. package/dist/boot/hydration.js.map +1 -0
  5. package/dist/boot/index.d.ts +3 -56
  6. package/dist/boot/index.d.ts.map +1 -1
  7. package/dist/boot/index.js +62 -410
  8. package/dist/boot/index.js.map +1 -1
  9. package/dist/boot/root-lifecycle.d.ts +15 -0
  10. package/dist/boot/root-lifecycle.d.ts.map +1 -0
  11. package/dist/boot/root-lifecycle.js +205 -0
  12. package/dist/boot/root-lifecycle.js.map +1 -0
  13. package/dist/boot/route-startup.js +45 -0
  14. package/dist/boot/route-startup.js.map +1 -0
  15. package/dist/boot/types.d.ts +62 -0
  16. package/dist/boot/types.d.ts.map +1 -0
  17. package/dist/common/component.d.ts +3 -1
  18. package/dist/common/component.d.ts.map +1 -1
  19. package/dist/common/jsx.d.ts +1 -1
  20. package/dist/common/jsx.d.ts.map +1 -1
  21. package/dist/common/jsx.js.map +1 -1
  22. package/dist/common/props.d.ts +1 -1
  23. package/dist/common/render-context.js +55 -0
  24. package/dist/common/render-context.js.map +1 -0
  25. package/dist/common/router.d.ts +5 -1
  26. package/dist/common/router.d.ts.map +1 -1
  27. package/dist/common/ssr.d.ts +1 -1
  28. package/dist/common/ssr.js.map +1 -1
  29. package/dist/common/vnode.d.ts +5 -4
  30. package/dist/common/vnode.d.ts.map +1 -1
  31. package/dist/common/vnode.js.map +1 -1
  32. package/dist/components/error-boundary.d.ts +1 -1
  33. package/dist/components/error-boundary.js +2 -1
  34. package/dist/components/error-boundary.js.map +1 -1
  35. package/dist/components/link.js.map +1 -1
  36. package/dist/control/for.js +2 -1
  37. package/dist/control/for.js.map +1 -1
  38. package/dist/data/data-runtime.d.ts +28 -0
  39. package/dist/data/data-runtime.d.ts.map +1 -0
  40. package/dist/data/data-runtime.js +114 -0
  41. package/dist/data/data-runtime.js.map +1 -0
  42. package/dist/data/index.d.ts +6 -142
  43. package/dist/data/index.js +5 -539
  44. package/dist/data/invalidation.d.ts +9 -0
  45. package/dist/data/invalidation.d.ts.map +1 -0
  46. package/dist/data/invalidation.js +27 -0
  47. package/dist/data/invalidation.js.map +1 -0
  48. package/dist/data/mutation-cell.d.ts +28 -0
  49. package/dist/data/mutation-cell.d.ts.map +1 -0
  50. package/dist/data/mutation-cell.js +132 -0
  51. package/dist/data/mutation-cell.js.map +1 -0
  52. package/dist/data/query-cell.d.ts +46 -0
  53. package/dist/data/query-cell.d.ts.map +1 -0
  54. package/dist/data/query-cell.js +290 -0
  55. package/dist/data/query-cell.js.map +1 -0
  56. package/dist/data/query-key.js +42 -0
  57. package/dist/data/query-key.js.map +1 -0
  58. package/dist/data/shared.js +20 -0
  59. package/dist/data/shared.js.map +1 -0
  60. package/dist/data/types.d.ts +161 -0
  61. package/dist/data/types.d.ts.map +1 -0
  62. package/dist/foundations/icon/icon.d.ts.map +1 -1
  63. package/dist/foundations/icon/icon.js.map +1 -1
  64. package/dist/foundations/structures/portal.d.ts +1 -1
  65. package/dist/foundations/structures/portal.d.ts.map +1 -1
  66. package/dist/foundations/structures/portal.js +2 -1
  67. package/dist/foundations/structures/portal.js.map +1 -1
  68. package/dist/fx/fx.d.ts +1 -1
  69. package/dist/fx/fx.js +5 -4
  70. package/dist/fx/fx.js.map +1 -1
  71. package/dist/fx/timing.d.ts.map +1 -1
  72. package/dist/fx/timing.js +10 -6
  73. package/dist/fx/timing.js.map +1 -1
  74. package/dist/index.d.ts +3 -2
  75. package/dist/index.js +4 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/jsx/index.d.ts +2 -1
  78. package/dist/jsx/index.js +3 -2
  79. package/dist/jsx/types.d.ts +2 -0
  80. package/dist/jsx/types.js +2 -1
  81. package/dist/jsx-runtime2.d.ts +2 -1
  82. package/dist/jsx-runtime2.js +3 -2
  83. package/dist/renderer/attributes.js +231 -0
  84. package/dist/renderer/attributes.js.map +1 -0
  85. package/dist/renderer/boundaries.js +266 -0
  86. package/dist/renderer/boundaries.js.map +1 -0
  87. package/dist/renderer/child-shape.js +85 -0
  88. package/dist/renderer/child-shape.js.map +1 -0
  89. package/dist/renderer/children.js +3 -2
  90. package/dist/renderer/children.js.map +1 -1
  91. package/dist/renderer/cleanup.js +2 -1
  92. package/dist/renderer/cleanup.js.map +1 -1
  93. package/dist/renderer/component-host-cleanup.js +68 -0
  94. package/dist/renderer/component-host-cleanup.js.map +1 -0
  95. package/dist/renderer/component-host-instances.js +65 -0
  96. package/dist/renderer/component-host-instances.js.map +1 -0
  97. package/dist/renderer/component-host.js +247 -0
  98. package/dist/renderer/component-host.js.map +1 -0
  99. package/dist/renderer/dom-host.js +13 -0
  100. package/dist/renderer/dom-host.js.map +1 -0
  101. package/dist/renderer/dom-internal.js +185 -0
  102. package/dist/renderer/dom-internal.js.map +1 -0
  103. package/dist/renderer/dom.js +9 -2356
  104. package/dist/renderer/element-children.js +279 -0
  105. package/dist/renderer/element-children.js.map +1 -0
  106. package/dist/renderer/env.js +2 -1
  107. package/dist/renderer/error-boundary-dom.js +29 -0
  108. package/dist/renderer/error-boundary-dom.js.map +1 -0
  109. package/dist/renderer/evaluate-dom-range.js +85 -0
  110. package/dist/renderer/evaluate-dom-range.js.map +1 -0
  111. package/dist/renderer/evaluate-reconcile.js +281 -0
  112. package/dist/renderer/evaluate-reconcile.js.map +1 -0
  113. package/dist/renderer/evaluate.js +13 -399
  114. package/dist/renderer/evaluate.js.map +1 -1
  115. package/dist/renderer/fastpath.js +6 -5
  116. package/dist/renderer/fastpath.js.map +1 -1
  117. package/dist/renderer/for-commit-dom-map.js +83 -0
  118. package/dist/renderer/for-commit-dom-map.js.map +1 -0
  119. package/dist/renderer/for-commit-removal.js +36 -0
  120. package/dist/renderer/for-commit-removal.js.map +1 -0
  121. package/dist/renderer/for-commit-reorder.js +89 -0
  122. package/dist/renderer/for-commit-reorder.js.map +1 -0
  123. package/dist/renderer/for-commit.js +6 -188
  124. package/dist/renderer/for-commit.js.map +1 -1
  125. package/dist/renderer/index.js +28 -16
  126. package/dist/renderer/index.js.map +1 -1
  127. package/dist/renderer/keyed-children.js +32 -0
  128. package/dist/renderer/keyed-children.js.map +1 -0
  129. package/dist/renderer/keyed.js +2 -15
  130. package/dist/renderer/keyed.js.map +1 -1
  131. package/dist/renderer/namespaces.js +23 -0
  132. package/dist/renderer/namespaces.js.map +1 -0
  133. package/dist/renderer/prop-bindings.js +280 -0
  134. package/dist/renderer/prop-bindings.js.map +1 -0
  135. package/dist/renderer/reactive-child-dom.js +133 -0
  136. package/dist/renderer/reactive-child-dom.js.map +1 -0
  137. package/dist/renderer/reactive-child-sources.js +184 -0
  138. package/dist/renderer/reactive-child-sources.js.map +1 -0
  139. package/dist/renderer/reactive-children.js +294 -0
  140. package/dist/renderer/reactive-children.js.map +1 -0
  141. package/dist/renderer/reconcile-commit.js +38 -0
  142. package/dist/renderer/reconcile-commit.js.map +1 -0
  143. package/dist/renderer/reconcile-fastpaths.js +106 -0
  144. package/dist/renderer/reconcile-fastpaths.js.map +1 -0
  145. package/dist/renderer/reconcile-resolution.js +187 -0
  146. package/dist/renderer/reconcile-resolution.js.map +1 -0
  147. package/dist/renderer/reconcile.js +9 -371
  148. package/dist/renderer/reconcile.js.map +1 -1
  149. package/dist/renderer/retained-element-rollback.js +276 -0
  150. package/dist/renderer/retained-element-rollback.js.map +1 -0
  151. package/dist/renderer/stable-patch.js +82 -0
  152. package/dist/renderer/stable-patch.js.map +1 -0
  153. package/dist/renderer/static-reuse.js +96 -0
  154. package/dist/renderer/static-reuse.js.map +1 -0
  155. package/dist/renderer/types.js +2 -1
  156. package/dist/renderer/utils.js +4 -4
  157. package/dist/renderer/utils.js.map +1 -1
  158. package/dist/resources/index.d.ts +3 -2
  159. package/dist/resources/index.js +5 -2
  160. package/dist/router/access.js +36 -0
  161. package/dist/router/access.js.map +1 -0
  162. package/dist/router/activity.d.ts +10 -0
  163. package/dist/router/activity.d.ts.map +1 -0
  164. package/dist/router/activity.js +89 -0
  165. package/dist/router/activity.js.map +1 -0
  166. package/dist/router/authoring.d.ts +22 -0
  167. package/dist/router/authoring.d.ts.map +1 -0
  168. package/dist/router/authoring.js +198 -0
  169. package/dist/router/authoring.js.map +1 -0
  170. package/dist/router/index.d.ts +12 -4
  171. package/dist/router/index.js +9 -2
  172. package/dist/router/internal-types.d.ts +31 -0
  173. package/dist/router/internal-types.d.ts.map +1 -0
  174. package/dist/router/lazy.d.ts +19 -0
  175. package/dist/router/lazy.d.ts.map +1 -0
  176. package/dist/router/lazy.js +52 -0
  177. package/dist/router/lazy.js.map +1 -0
  178. package/dist/router/manifest.d.ts +10 -0
  179. package/dist/router/manifest.d.ts.map +1 -0
  180. package/dist/router/manifest.js +49 -0
  181. package/dist/router/manifest.js.map +1 -0
  182. package/dist/router/navigate.d.ts +4 -33
  183. package/dist/router/navigate.d.ts.map +1 -1
  184. package/dist/router/navigate.js +17 -414
  185. package/dist/router/navigate.js.map +1 -1
  186. package/dist/router/navigation-registry.d.ts +32 -0
  187. package/dist/router/navigation-registry.d.ts.map +1 -0
  188. package/dist/router/navigation-registry.js +105 -0
  189. package/dist/router/navigation-registry.js.map +1 -0
  190. package/dist/router/navigation-scroll.d.ts +14 -0
  191. package/dist/router/navigation-scroll.d.ts.map +1 -0
  192. package/dist/router/navigation-scroll.js +93 -0
  193. package/dist/router/navigation-scroll.js.map +1 -0
  194. package/dist/router/navigation-targets.d.ts +31 -0
  195. package/dist/router/navigation-targets.d.ts.map +1 -0
  196. package/dist/router/navigation-targets.js +253 -0
  197. package/dist/router/navigation-targets.js.map +1 -0
  198. package/dist/router/policy.d.ts +7 -1
  199. package/dist/router/policy.d.ts.map +1 -1
  200. package/dist/router/policy.js +27 -9
  201. package/dist/router/policy.js.map +1 -1
  202. package/dist/router/rendering.d.ts +10 -0
  203. package/dist/router/rendering.d.ts.map +1 -0
  204. package/dist/router/rendering.js +45 -0
  205. package/dist/router/rendering.js.map +1 -0
  206. package/dist/router/resolution.d.ts +17 -0
  207. package/dist/router/resolution.d.ts.map +1 -0
  208. package/dist/router/resolution.js +253 -0
  209. package/dist/router/resolution.js.map +1 -0
  210. package/dist/router/route-query.d.ts +17 -0
  211. package/dist/router/route-query.d.ts.map +1 -0
  212. package/dist/router/route-query.js +47 -0
  213. package/dist/router/route-query.js.map +1 -0
  214. package/dist/router/route.d.ts +8 -149
  215. package/dist/router/route.js +8 -854
  216. package/dist/router/store.d.ts +50 -0
  217. package/dist/router/store.d.ts.map +1 -0
  218. package/dist/router/store.js +171 -0
  219. package/dist/router/store.js.map +1 -0
  220. package/dist/runtime/access.js +45 -0
  221. package/dist/runtime/access.js.map +1 -0
  222. package/dist/runtime/child-scope.d.ts +1 -1
  223. package/dist/runtime/child-scope.js +4 -1
  224. package/dist/runtime/child-scope.js.map +1 -1
  225. package/dist/runtime/component-cleanup.d.ts +16 -0
  226. package/dist/runtime/component-cleanup.d.ts.map +1 -0
  227. package/dist/runtime/component-cleanup.js +70 -0
  228. package/dist/runtime/component-cleanup.js.map +1 -0
  229. package/dist/runtime/component-commit.js +165 -0
  230. package/dist/runtime/component-commit.js.map +1 -0
  231. package/dist/runtime/component-contracts.js +5 -0
  232. package/dist/runtime/component-facade.d.ts +5 -0
  233. package/dist/runtime/component-facade.js +4 -0
  234. package/dist/runtime/component-internal.d.ts +100 -0
  235. package/dist/runtime/component-internal.d.ts.map +1 -0
  236. package/dist/runtime/component-internal.js +219 -0
  237. package/dist/runtime/component-internal.js.map +1 -0
  238. package/dist/runtime/component-lifecycle.d.ts +49 -0
  239. package/dist/runtime/component-lifecycle.d.ts.map +1 -0
  240. package/dist/runtime/component-lifecycle.js +176 -0
  241. package/dist/runtime/component-lifecycle.js.map +1 -0
  242. package/dist/runtime/component-scope.d.ts +55 -0
  243. package/dist/runtime/component-scope.d.ts.map +1 -0
  244. package/dist/runtime/component-scope.js +154 -0
  245. package/dist/runtime/component-scope.js.map +1 -0
  246. package/dist/runtime/component.d.ts +4 -152
  247. package/dist/runtime/component.js +4 -692
  248. package/dist/runtime/context.d.ts +1 -1
  249. package/dist/runtime/context.js +6 -4
  250. package/dist/runtime/context.js.map +1 -1
  251. package/dist/runtime/control.d.ts +3 -3
  252. package/dist/runtime/control.js +2 -1
  253. package/dist/runtime/control.js.map +1 -1
  254. package/dist/runtime/derive.d.ts.map +1 -1
  255. package/dist/runtime/derive.js +6 -5
  256. package/dist/runtime/derive.js.map +1 -1
  257. package/dist/runtime/effect.d.ts +1 -1
  258. package/dist/runtime/effect.d.ts.map +1 -1
  259. package/dist/runtime/effect.js +2 -2
  260. package/dist/runtime/effect.js.map +1 -1
  261. package/dist/runtime/events.js +3 -3
  262. package/dist/runtime/events.js.map +1 -1
  263. package/dist/runtime/fastlane.js +13 -27
  264. package/dist/runtime/fastlane.js.map +1 -1
  265. package/dist/runtime/for-bench.d.ts +1 -1
  266. package/dist/runtime/for-bench.js +1 -4
  267. package/dist/runtime/for-bench.js.map +1 -1
  268. package/dist/runtime/for-internal.d.ts +43 -0
  269. package/dist/runtime/for-internal.d.ts.map +1 -0
  270. package/dist/runtime/for-internal.js +98 -0
  271. package/dist/runtime/for-internal.js.map +1 -0
  272. package/dist/runtime/for-reconcile.d.ts +8 -0
  273. package/dist/runtime/for-reconcile.d.ts.map +1 -0
  274. package/dist/runtime/for-reconcile.js +389 -0
  275. package/dist/runtime/for-reconcile.js.map +1 -0
  276. package/dist/runtime/for-scopes.d.ts +26 -0
  277. package/dist/runtime/for-scopes.d.ts.map +1 -0
  278. package/dist/runtime/for-scopes.js +160 -0
  279. package/dist/runtime/for-scopes.js.map +1 -0
  280. package/dist/runtime/for-signals.d.ts +30 -0
  281. package/dist/runtime/for-signals.d.ts.map +1 -0
  282. package/dist/runtime/for-signals.js +139 -0
  283. package/dist/runtime/for-signals.js.map +1 -0
  284. package/dist/runtime/for.d.ts +4 -66
  285. package/dist/runtime/for.js +5 -773
  286. package/dist/runtime/lifecycle-operations.d.ts +31 -0
  287. package/dist/runtime/lifecycle-operations.d.ts.map +1 -0
  288. package/dist/runtime/lifecycle-operations.js +195 -0
  289. package/dist/runtime/lifecycle-operations.js.map +1 -0
  290. package/dist/runtime/operations.d.ts +3 -40
  291. package/dist/runtime/operations.js +2 -357
  292. package/dist/runtime/readable.d.ts +2 -3
  293. package/dist/runtime/readable.d.ts.map +1 -1
  294. package/dist/runtime/readable.js +6 -5
  295. package/dist/runtime/readable.js.map +1 -1
  296. package/dist/runtime/resource-cell.js +2 -2
  297. package/dist/runtime/resource-cell.js.map +1 -1
  298. package/dist/runtime/resource-operation.d.ts +13 -0
  299. package/dist/runtime/resource-operation.d.ts.map +1 -0
  300. package/dist/runtime/resource-operation.js +170 -0
  301. package/dist/runtime/resource-operation.js.map +1 -0
  302. package/dist/runtime/runtime.d.ts +42 -0
  303. package/dist/runtime/runtime.d.ts.map +1 -0
  304. package/dist/runtime/runtime.js +59 -0
  305. package/dist/runtime/runtime.js.map +1 -0
  306. package/dist/runtime/scheduler.d.ts +5 -1
  307. package/dist/runtime/scheduler.d.ts.map +1 -1
  308. package/dist/runtime/scheduler.js +17 -17
  309. package/dist/runtime/scheduler.js.map +1 -1
  310. package/dist/runtime/selector.js +4 -3
  311. package/dist/runtime/selector.js.map +1 -1
  312. package/dist/runtime/snapshot-source.d.ts +1 -1
  313. package/dist/runtime/snapshot-source.js +1 -1
  314. package/dist/runtime/state.js +2 -1
  315. package/dist/runtime/state.js.map +1 -1
  316. package/dist/ssg/batch-render.js +2 -1
  317. package/dist/ssg/batch-render.js.map +1 -1
  318. package/dist/ssg/create-static-gen.d.ts +9 -3
  319. package/dist/ssg/create-static-gen.d.ts.map +1 -1
  320. package/dist/ssg/create-static-gen.js +12 -99
  321. package/dist/ssg/create-static-gen.js.map +1 -1
  322. package/dist/ssg/generation-plan.js +70 -0
  323. package/dist/ssg/generation-plan.js.map +1 -0
  324. package/dist/ssg/incremental-manifest.js +1 -1
  325. package/dist/ssg/static-routes.js +101 -0
  326. package/dist/ssg/static-routes.js.map +1 -0
  327. package/dist/ssg/types.d.ts +15 -7
  328. package/dist/ssg/types.d.ts.map +1 -1
  329. package/dist/ssr/boundaries.js +113 -0
  330. package/dist/ssr/boundaries.js.map +1 -0
  331. package/dist/ssr/component-runtime.js +111 -0
  332. package/dist/ssr/component-runtime.js.map +1 -0
  333. package/dist/ssr/context.d.ts +3 -1
  334. package/dist/ssr/context.d.ts.map +1 -1
  335. package/dist/ssr/context.js +9 -2
  336. package/dist/ssr/context.js.map +1 -1
  337. package/dist/ssr/errors.d.ts +2 -0
  338. package/dist/ssr/errors.js +11 -1
  339. package/dist/ssr/errors.js.map +1 -1
  340. package/dist/ssr/escape.js +3 -3
  341. package/dist/ssr/escape.js.map +1 -1
  342. package/dist/ssr/hydration-data.js +10 -0
  343. package/dist/ssr/hydration-data.js.map +1 -0
  344. package/dist/ssr/hydration-verify.d.ts +12 -0
  345. package/dist/ssr/hydration-verify.d.ts.map +1 -0
  346. package/dist/ssr/hydration-verify.js +144 -0
  347. package/dist/ssr/hydration-verify.js.map +1 -0
  348. package/dist/ssr/index-internal.d.ts +15 -0
  349. package/dist/ssr/index-internal.d.ts.map +1 -0
  350. package/dist/ssr/index-internal.js +19 -0
  351. package/dist/ssr/index-internal.js.map +1 -0
  352. package/dist/ssr/index.d.ts +5 -57
  353. package/dist/ssr/index.js +3 -738
  354. package/dist/ssr/render-keys.js +9 -32
  355. package/dist/ssr/render-keys.js.map +1 -1
  356. package/dist/ssr/render-resolved.d.ts +1 -1
  357. package/dist/ssr/render-resolved.d.ts.map +1 -1
  358. package/dist/ssr/render-resolved.js +4 -2
  359. package/dist/ssr/render-resolved.js.map +1 -1
  360. package/dist/ssr/render-sync.d.ts +21 -0
  361. package/dist/ssr/render-sync.d.ts.map +1 -0
  362. package/dist/ssr/render-sync.js +275 -0
  363. package/dist/ssr/render-sync.js.map +1 -0
  364. package/dist/ssr/route-policy-resolution.js +77 -0
  365. package/dist/ssr/route-policy-resolution.js.map +1 -0
  366. package/dist/ssr/route-render.d.ts +77 -0
  367. package/dist/ssr/route-render.d.ts.map +1 -0
  368. package/dist/ssr/route-render.js +119 -0
  369. package/dist/ssr/route-render.js.map +1 -0
  370. package/dist/ssr/sink.d.ts +26 -0
  371. package/dist/ssr/sink.d.ts.map +1 -0
  372. package/dist/ssr/types.d.ts +1 -0
  373. package/dist/ssr/types.d.ts.map +1 -1
  374. package/dist/ssr/verify-hydration.js.map +1 -1
  375. package/dist/testing/index.d.ts +1 -2
  376. package/dist/testing/index.d.ts.map +1 -1
  377. package/dist/testing/index.js +2 -1
  378. package/dist/testing/index.js.map +1 -1
  379. package/package.json +4 -3
  380. package/dist/data/index.d.ts.map +0 -1
  381. package/dist/data/index.js.map +0 -1
  382. package/dist/renderer/dom.js.map +0 -1
  383. package/dist/router/route.d.ts.map +0 -1
  384. package/dist/router/route.js.map +0 -1
  385. package/dist/runtime/component.d.ts.map +0 -1
  386. package/dist/runtime/component.js.map +0 -1
  387. package/dist/runtime/for.d.ts.map +0 -1
  388. package/dist/runtime/for.js.map +0 -1
  389. package/dist/runtime/operations.d.ts.map +0 -1
  390. package/dist/runtime/operations.js.map +0 -1
  391. package/dist/runtime/ssr-bridge.js +0 -24
  392. package/dist/runtime/ssr-bridge.js.map +0 -1
  393. package/dist/ssr/index.d.ts.map +0 -1
  394. package/dist/ssr/index.js.map +0 -1
@@ -0,0 +1,279 @@
1
+ import { _isDOMElement } from "../common/vnode.js";
2
+ import "./types.js";
3
+ import { teardownNodeSubtree } from "./cleanup.js";
4
+ import { extractKey } from "./utils.js";
5
+ import { keyedElements } from "./keyed.js";
6
+ import { getParentNamespace } from "./namespaces.js";
7
+ import { clearControlBoundaryCommitOwner, commitForBoundaryChildren, evaluateControlBoundaryState, getControlBoundaryState, getDirectControlBoundaryVNode, registerControlBoundaryCommitOwner, trySyncControlBoundaryChild } from "./boundaries.js";
8
+ import { isBulkTextFastPathEligible, performBulkTextReplace } from "./children.js";
9
+ import { isFragmentVNode, normalizeComponentChildren } from "./child-shape.js";
10
+ import { getRendererDOMHost } from "./dom-host.js";
11
+ import { trySyncScalarChildSequenceInPlace } from "./reactive-children.js";
12
+ import { reconcileKeyedChildren } from "./reconcile.js";
13
+ import { tagsEqualIgnoreCase } from "./static-reuse.js";
14
+ //#region src/renderer/element-children.ts
15
+ const rendererReactiveChildDOMHost = {
16
+ createDOMNode: (node, parentNamespace) => getRendererDOMHost().createDOMNode(node, parentNamespace),
17
+ updateElementChildren: (el, children, forceUpdate) => updateElementChildren(el, children, forceUpdate)
18
+ };
19
+ function updateElementChildren(el, children, forceUpdate = false) {
20
+ const directControlBoundary = getDirectControlBoundaryVNode(children);
21
+ if (directControlBoundary) {
22
+ const controlState = getControlBoundaryState(directControlBoundary);
23
+ if (!controlState) throw new Error("[updateElementChildren] Control boundary missing internal state");
24
+ registerControlBoundaryCommitOwner(el, controlState);
25
+ commitForBoundaryChildren(el, controlState, evaluateControlBoundaryState(controlState));
26
+ return;
27
+ }
28
+ clearControlBoundaryCommitOwner(el);
29
+ if (children === null || children === void 0) {
30
+ for (let n = el.firstChild; n;) {
31
+ const next = n.nextSibling;
32
+ teardownNodeSubtree(n);
33
+ n = next;
34
+ }
35
+ el.textContent = "";
36
+ return;
37
+ }
38
+ if (!Array.isArray(children) && isFragmentVNode(children)) {
39
+ updateUnkeyedChildren(el, normalizeComponentChildren(children), forceUpdate);
40
+ return;
41
+ }
42
+ if (!Array.isArray(children) && (typeof children === "string" || typeof children === "number")) {
43
+ if (el.childNodes.length === 1 && el.firstChild?.nodeType === 3) {
44
+ const s = String(children);
45
+ const t = el.firstChild;
46
+ if (t.data !== s) t.data = s;
47
+ } else {
48
+ for (let n = el.firstChild; n;) {
49
+ const next = n.nextSibling;
50
+ teardownNodeSubtree(n);
51
+ n = next;
52
+ }
53
+ el.textContent = String(children);
54
+ }
55
+ return;
56
+ }
57
+ if (Array.isArray(children)) {
58
+ const normalizedChildren = normalizeComponentChildren(children);
59
+ if (trySyncScalarChildSequenceInPlace(el, normalizedChildren, rendererReactiveChildDOMHost)) {
60
+ keyedElements.delete(el);
61
+ return;
62
+ }
63
+ if (hasKeyedVNodeChildren(normalizedChildren)) {
64
+ const newKeyMap = reconcileKeyedChildren(el, normalizedChildren, getOrBuildDomKeyMap(el));
65
+ keyedElements.set(el, newKeyMap);
66
+ return;
67
+ }
68
+ if (isBulkTextFastPathEligible(el, normalizedChildren)) {
69
+ performBulkTextReplace(el, normalizedChildren);
70
+ keyedElements.delete(el);
71
+ return;
72
+ }
73
+ updateUnkeyedChildren(el, normalizedChildren, forceUpdate);
74
+ return;
75
+ }
76
+ if (_isDOMElement(children)) {
77
+ updateUnkeyedChildren(el, [children], forceUpdate);
78
+ return;
79
+ }
80
+ for (let n = el.firstChild; n;) {
81
+ const next = n.nextSibling;
82
+ teardownNodeSubtree(n);
83
+ n = next;
84
+ }
85
+ el.textContent = "";
86
+ const dom = getRendererDOMHost().createDOMNode(children);
87
+ if (dom) el.appendChild(dom);
88
+ }
89
+ function hasKeyedVNodeChildren(children) {
90
+ for (let i = 0; i < children.length; i++) if (extractKey(children[i]) !== void 0) return true;
91
+ return false;
92
+ }
93
+ function isEmptyChild(child) {
94
+ return child === null || child === void 0 || child === false;
95
+ }
96
+ function getOrBuildDomKeyMap(parent) {
97
+ let keyMap = keyedElements.get(parent);
98
+ if (!keyMap) {
99
+ keyMap = /* @__PURE__ */ new Map();
100
+ for (let child = parent.firstElementChild; child; child = child.nextElementSibling) {
101
+ const key = child.getAttribute("data-key");
102
+ if (key !== null) {
103
+ keyMap.set(key, child);
104
+ const numericKey = Number(key);
105
+ if (!Number.isNaN(numericKey)) keyMap.set(numericKey, child);
106
+ }
107
+ }
108
+ if (keyMap.size > 0) keyedElements.set(parent, keyMap);
109
+ }
110
+ return keyMap.size > 0 ? keyMap : void 0;
111
+ }
112
+ function updateUnkeyedChildren(parent, newChildren, forceUpdate = false) {
113
+ const parentNamespace = getParentNamespace(parent);
114
+ const domHost = getRendererDOMHost();
115
+ const trySyncComponentChild = (currentDom, next) => {
116
+ if (typeof next.type !== "function") return null;
117
+ return domHost.syncComponentElement(currentDom, next, next.type, (next.props ?? {}) || {}, parentNamespace, forceUpdate);
118
+ };
119
+ const hasText = newChildren.some((c) => typeof c === "string" || typeof c === "number");
120
+ const hasElements = newChildren.some((c) => _isDOMElement(c));
121
+ const hasEmptyChildren = newChildren.some(isEmptyChild);
122
+ const hasComponentChildren = newChildren.some((c) => _isDOMElement(c) && typeof c.type === "function");
123
+ const hasNonElementDomChildren = parent.childNodes.length !== parent.children.length;
124
+ if (!hasEmptyChildren && !hasText && !hasComponentChildren && !hasNonElementDomChildren && hasElements && parent.children.length === newChildren.length) {
125
+ const c = parent.children;
126
+ for (let i = 0; i < newChildren.length; i++) {
127
+ const next = newChildren[i];
128
+ const current = c[i];
129
+ if (!current || next === void 0) continue;
130
+ if (_isDOMElement(next) && typeof next.type === "string") if (tagsEqualIgnoreCase(current.tagName, next.type)) domHost.updateElementFromVnode(current, next, true, forceUpdate);
131
+ else {
132
+ const dom = domHost.createDOMNode(next, parentNamespace);
133
+ if (dom) {
134
+ teardownNodeSubtree(current);
135
+ parent.replaceChild(dom, current);
136
+ }
137
+ }
138
+ else if (_isDOMElement(next)) {
139
+ if (trySyncControlBoundaryChild(parent, current, next)) continue;
140
+ const synced = trySyncComponentChild(current, next);
141
+ if (synced && synced !== current) teardownNodeSubtree(current);
142
+ else if (!synced) {
143
+ const dom = domHost.createDOMNode(next, parentNamespace);
144
+ if (dom) {
145
+ teardownNodeSubtree(current);
146
+ parent.replaceChild(dom, current);
147
+ }
148
+ }
149
+ } else {
150
+ const dom = domHost.createDOMNode(next, parentNamespace);
151
+ if (dom) {
152
+ teardownNodeSubtree(current);
153
+ parent.replaceChild(dom, current);
154
+ }
155
+ }
156
+ }
157
+ return;
158
+ }
159
+ const existing = Array.from(parent.children);
160
+ if (hasText || hasComponentChildren || hasEmptyChildren || hasNonElementDomChildren) {
161
+ const allNodes = Array.from(parent.childNodes);
162
+ const max = Math.max(allNodes.length, newChildren.length);
163
+ for (let i = 0; i < max; i++) {
164
+ const currentNode = allNodes[i];
165
+ const next = newChildren[i];
166
+ const nextIsEmpty = isEmptyChild(next);
167
+ if (nextIsEmpty && currentNode) {
168
+ teardownNodeSubtree(currentNode);
169
+ currentNode.remove();
170
+ continue;
171
+ }
172
+ if (!currentNode && !nextIsEmpty) {
173
+ const dom = domHost.createDOMNode(next, parentNamespace);
174
+ if (dom) parent.appendChild(dom);
175
+ continue;
176
+ }
177
+ if (!currentNode || nextIsEmpty) continue;
178
+ if (typeof next === "string" || typeof next === "number") if (currentNode.nodeType === 3) currentNode.data = String(next);
179
+ else {
180
+ const textNode = document.createTextNode(String(next));
181
+ parent.replaceChild(textNode, currentNode);
182
+ }
183
+ else if (_isDOMElement(next)) if (currentNode.nodeType === 1) {
184
+ const currentEl = currentNode;
185
+ if (typeof next.type === "string") if (tagsEqualIgnoreCase(currentEl.tagName, next.type)) domHost.updateElementFromVnode(currentEl, next, true, forceUpdate);
186
+ else {
187
+ const dom = domHost.createDOMNode(next, parentNamespace);
188
+ if (dom) {
189
+ teardownNodeSubtree(currentEl);
190
+ parent.replaceChild(dom, currentNode);
191
+ }
192
+ }
193
+ else {
194
+ if (trySyncControlBoundaryChild(parent, currentNode, next)) continue;
195
+ const synced = trySyncComponentChild(currentEl, next);
196
+ if (synced && synced !== currentNode) teardownNodeSubtree(currentEl);
197
+ else if (!synced) {
198
+ const dom = domHost.createDOMNode(next, parentNamespace);
199
+ if (dom) {
200
+ teardownNodeSubtree(currentEl);
201
+ parent.replaceChild(dom, currentNode);
202
+ }
203
+ }
204
+ }
205
+ } else {
206
+ const dom = domHost.createDOMNode(next, parentNamespace);
207
+ if (dom) parent.replaceChild(dom, currentNode);
208
+ }
209
+ }
210
+ return;
211
+ }
212
+ if (newChildren.length === 1 && existing.length === 0 && parent.childNodes.length === 1) {
213
+ const firstNewChild = newChildren[0];
214
+ const firstExisting = parent.firstChild;
215
+ if ((typeof firstNewChild === "string" || typeof firstNewChild === "number") && firstExisting?.nodeType === 3) {
216
+ firstExisting.data = String(firstNewChild);
217
+ return;
218
+ }
219
+ }
220
+ if (existing.length === 0 && parent.childNodes.length > 0) {
221
+ for (let n = parent.firstChild; n;) {
222
+ const next = n.nextSibling;
223
+ teardownNodeSubtree(n);
224
+ n = next;
225
+ }
226
+ parent.textContent = "";
227
+ }
228
+ const max = Math.max(existing.length, newChildren.length);
229
+ for (let i = 0; i < max; i++) {
230
+ const current = existing[i];
231
+ const next = newChildren[i];
232
+ const nextIsEmpty = isEmptyChild(next);
233
+ if (nextIsEmpty && current) {
234
+ teardownNodeSubtree(current);
235
+ current.remove();
236
+ continue;
237
+ }
238
+ if (!current && !nextIsEmpty) {
239
+ const dom = domHost.createDOMNode(next, parentNamespace);
240
+ if (dom) parent.appendChild(dom);
241
+ continue;
242
+ }
243
+ if (!current || nextIsEmpty) continue;
244
+ if (typeof next === "string" || typeof next === "number") {
245
+ const textNode = document.createTextNode(String(next));
246
+ teardownNodeSubtree(current);
247
+ parent.replaceChild(textNode, current);
248
+ } else if (_isDOMElement(next)) if (typeof next.type === "string") if (tagsEqualIgnoreCase(current.tagName, next.type)) domHost.updateElementFromVnode(current, next, true, forceUpdate);
249
+ else {
250
+ const dom = domHost.createDOMNode(next, parentNamespace);
251
+ if (dom) {
252
+ teardownNodeSubtree(current);
253
+ parent.replaceChild(dom, current);
254
+ }
255
+ }
256
+ else {
257
+ const synced = trySyncComponentChild(current, next);
258
+ if (synced && synced !== current) teardownNodeSubtree(current);
259
+ else if (!synced) {
260
+ const dom = domHost.createDOMNode(next, parentNamespace);
261
+ if (dom) {
262
+ teardownNodeSubtree(current);
263
+ parent.replaceChild(dom, current);
264
+ }
265
+ }
266
+ }
267
+ else {
268
+ const dom = domHost.createDOMNode(next);
269
+ if (dom) {
270
+ teardownNodeSubtree(current);
271
+ parent.replaceChild(dom, current);
272
+ }
273
+ }
274
+ }
275
+ }
276
+ //#endregion
277
+ export { rendererReactiveChildDOMHost, updateElementChildren, updateUnkeyedChildren };
278
+
279
+ //# sourceMappingURL=element-children.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-children.js","names":[],"sources":["../../src/renderer/element-children.ts"],"sourcesContent":["import type { ComponentFunction } from '../runtime/component-contracts';\nimport { clearControlBoundaryCommitOwner } from './boundaries';\nimport {\n commitForBoundaryChildren,\n evaluateControlBoundaryState,\n getControlBoundaryState,\n getDirectControlBoundaryVNode,\n registerControlBoundaryCommitOwner,\n trySyncControlBoundaryChild,\n} from './boundaries';\nimport { isBulkTextFastPathEligible, performBulkTextReplace } from './children';\nimport { isFragmentVNode, normalizeComponentChildren } from './child-shape';\nimport { teardownNodeSubtree } from './cleanup';\nimport { getRendererDOMHost, type ElementWithContext } from './dom-host';\nimport { keyedElements } from './keyed';\nimport { getParentNamespace } from './namespaces';\nimport {\n trySyncScalarChildSequenceInPlace,\n type ReactiveChildDOMHost,\n} from './reactive-children';\nimport { reconcileKeyedChildren } from './reconcile';\nimport { tagsEqualIgnoreCase } from './static-reuse';\nimport { _isDOMElement, type DOMElement, type VNode } from './types';\nimport { extractKey } from './utils';\n\nexport const rendererReactiveChildDOMHost: ReactiveChildDOMHost = {\n createDOMNode: (node, parentNamespace) =>\n getRendererDOMHost().createDOMNode(node, parentNamespace),\n updateElementChildren: (el, children, forceUpdate) =>\n updateElementChildren(el, children, forceUpdate),\n};\n\nexport function updateElementChildren(\n el: Element,\n children: VNode | VNode[] | undefined,\n forceUpdate = false\n): void {\n const directControlBoundary = getDirectControlBoundaryVNode(children);\n if (directControlBoundary) {\n const controlState = getControlBoundaryState(directControlBoundary);\n if (!controlState) {\n throw new Error(\n '[updateElementChildren] Control boundary missing internal state'\n );\n }\n\n registerControlBoundaryCommitOwner(el, controlState);\n const childrenVNodes = evaluateControlBoundaryState(controlState);\n commitForBoundaryChildren(el, controlState, childrenVNodes as VNode[]);\n return;\n }\n\n clearControlBoundaryCommitOwner(el);\n\n if (children === null || children === undefined) {\n for (let n = el.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n el.textContent = '';\n return;\n }\n\n if (!Array.isArray(children) && isFragmentVNode(children)) {\n updateUnkeyedChildren(\n el,\n normalizeComponentChildren(children),\n forceUpdate\n );\n return;\n }\n\n if (\n !Array.isArray(children) &&\n (typeof children === 'string' || typeof children === 'number')\n ) {\n if (el.childNodes.length === 1 && el.firstChild?.nodeType === 3) {\n const s = String(children);\n const t = el.firstChild as Text;\n if (t.data !== s) t.data = s;\n } else {\n for (let n = el.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n el.textContent = String(children);\n }\n return;\n }\n\n if (Array.isArray(children)) {\n const normalizedChildren = normalizeComponentChildren(children) as VNode[];\n\n if (\n trySyncScalarChildSequenceInPlace(\n el,\n normalizedChildren,\n rendererReactiveChildDOMHost\n )\n ) {\n keyedElements.delete(el);\n return;\n }\n\n if (hasKeyedVNodeChildren(normalizedChildren)) {\n const oldKeyMap = getOrBuildDomKeyMap(el);\n const newKeyMap = reconcileKeyedChildren(\n el,\n normalizedChildren,\n oldKeyMap\n );\n keyedElements.set(el, newKeyMap);\n return;\n }\n if (isBulkTextFastPathEligible(el, normalizedChildren)) {\n performBulkTextReplace(el, normalizedChildren);\n keyedElements.delete(el);\n return;\n }\n updateUnkeyedChildren(el, normalizedChildren, forceUpdate);\n return;\n }\n\n if (_isDOMElement(children)) {\n updateUnkeyedChildren(el, [children], forceUpdate);\n return;\n }\n\n for (let n = el.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n el.textContent = '';\n const dom = getRendererDOMHost().createDOMNode(children);\n if (dom) el.appendChild(dom);\n}\n\nfunction hasKeyedVNodeChildren(children: VNode[]): 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 isEmptyChild(child: unknown): boolean {\n return child === null || child === undefined || child === false;\n}\n\nfunction 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)) keyMap.set(numericKey, child);\n }\n }\n if (keyMap.size > 0) keyedElements.set(parent, keyMap);\n }\n return keyMap.size > 0 ? keyMap : undefined;\n}\n\nexport function updateUnkeyedChildren(\n parent: Element,\n newChildren: unknown[],\n forceUpdate = false\n): void {\n const parentNamespace = getParentNamespace(parent);\n const domHost = getRendererDOMHost();\n\n const trySyncComponentChild = (\n currentDom: Element,\n next: DOMElement\n ): Node | null => {\n if (typeof next.type !== 'function') {\n return null;\n }\n\n return domHost.syncComponentElement(\n currentDom,\n next as ElementWithContext,\n next.type as ComponentFunction,\n (((next as DOMElement).props ?? {}) as Record<string, unknown>) || {},\n parentNamespace,\n forceUpdate\n );\n };\n\n const hasText = newChildren.some(\n (c) => typeof c === 'string' || typeof c === 'number'\n );\n const hasElements = newChildren.some((c) => _isDOMElement(c));\n const hasEmptyChildren = newChildren.some(isEmptyChild);\n const hasComponentChildren = newChildren.some(\n (c) => _isDOMElement(c) && typeof (c as DOMElement).type === 'function'\n );\n const hasNonElementDomChildren =\n parent.childNodes.length !== parent.children.length;\n\n if (\n !hasEmptyChildren &&\n !hasText &&\n !hasComponentChildren &&\n !hasNonElementDomChildren &&\n hasElements &&\n parent.children.length === newChildren.length\n ) {\n const c = parent.children;\n for (let i = 0; i < newChildren.length; i++) {\n const next = newChildren[i];\n const current = c[i];\n if (!current || next === undefined) continue;\n if (_isDOMElement(next) && typeof next.type === 'string') {\n if (tagsEqualIgnoreCase(current.tagName, next.type)) {\n domHost.updateElementFromVnode(current, next, true, forceUpdate);\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n } else if (_isDOMElement(next)) {\n if (trySyncControlBoundaryChild(parent, current, next)) {\n continue;\n }\n\n const synced = trySyncComponentChild(current, next);\n if (synced && synced !== current) {\n teardownNodeSubtree(current);\n } else if (!synced) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n }\n return;\n }\n\n const existing = Array.from(parent.children);\n\n if (\n hasText ||\n hasComponentChildren ||\n hasEmptyChildren ||\n hasNonElementDomChildren\n ) {\n const allNodes = Array.from(parent.childNodes);\n const max = Math.max(allNodes.length, newChildren.length);\n\n for (let i = 0; i < max; i++) {\n const currentNode = allNodes[i];\n const next = newChildren[i];\n const nextIsEmpty = isEmptyChild(next);\n\n if (nextIsEmpty && currentNode) {\n teardownNodeSubtree(currentNode);\n currentNode.remove();\n continue;\n }\n\n if (!currentNode && !nextIsEmpty) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) parent.appendChild(dom);\n continue;\n }\n\n if (!currentNode || nextIsEmpty) continue;\n\n if (typeof next === 'string' || typeof next === 'number') {\n if (currentNode.nodeType === 3) {\n (currentNode as Text).data = String(next);\n } else {\n const textNode = document.createTextNode(String(next));\n parent.replaceChild(textNode, currentNode);\n }\n } else if (_isDOMElement(next)) {\n if (currentNode.nodeType === 1) {\n const currentEl = currentNode as Element;\n if (typeof next.type === 'string') {\n if (tagsEqualIgnoreCase(currentEl.tagName, next.type)) {\n domHost.updateElementFromVnode(\n currentEl,\n next,\n true,\n forceUpdate\n );\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(currentEl);\n parent.replaceChild(dom, currentNode);\n }\n }\n } else {\n if (trySyncControlBoundaryChild(parent, currentNode, next)) {\n continue;\n }\n\n const synced = trySyncComponentChild(currentEl, next);\n if (synced && synced !== currentNode) {\n teardownNodeSubtree(currentEl);\n } else if (!synced) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(currentEl);\n parent.replaceChild(dom, currentNode);\n }\n }\n }\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) parent.replaceChild(dom, currentNode);\n }\n }\n }\n return;\n }\n\n if (\n newChildren.length === 1 &&\n existing.length === 0 &&\n parent.childNodes.length === 1\n ) {\n const firstNewChild = newChildren[0];\n const firstExisting = parent.firstChild;\n if (\n (typeof firstNewChild === 'string' ||\n typeof firstNewChild === 'number') &&\n firstExisting?.nodeType === 3\n ) {\n (firstExisting as Text).data = String(firstNewChild);\n return;\n }\n }\n\n if (existing.length === 0 && parent.childNodes.length > 0) {\n for (let n = parent.firstChild; n; ) {\n const next = n.nextSibling;\n teardownNodeSubtree(n);\n n = next;\n }\n parent.textContent = '';\n }\n const max = Math.max(existing.length, newChildren.length);\n\n for (let i = 0; i < max; i++) {\n const current = existing[i];\n const next = newChildren[i];\n const nextIsEmpty = isEmptyChild(next);\n\n if (nextIsEmpty && current) {\n teardownNodeSubtree(current);\n current.remove();\n continue;\n }\n\n if (!current && !nextIsEmpty) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) parent.appendChild(dom);\n continue;\n }\n\n if (!current || nextIsEmpty) continue;\n\n if (typeof next === 'string' || typeof next === 'number') {\n const textNode = document.createTextNode(String(next));\n teardownNodeSubtree(current);\n parent.replaceChild(textNode, current);\n } else if (_isDOMElement(next)) {\n if (typeof next.type === 'string') {\n if (tagsEqualIgnoreCase(current.tagName, next.type)) {\n domHost.updateElementFromVnode(current, next, true, forceUpdate);\n } else {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n } else {\n const synced = trySyncComponentChild(current, next);\n if (synced && synced !== current) {\n teardownNodeSubtree(current);\n } else if (!synced) {\n const dom = domHost.createDOMNode(next, parentNamespace);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n }\n } else {\n const dom = domHost.createDOMNode(next);\n if (dom) {\n teardownNodeSubtree(current);\n parent.replaceChild(dom, current);\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAyBA,MAAa,+BAAqD;CAChE,gBAAgB,MAAM,oBACpB,mBAAmB,CAAC,CAAC,cAAc,MAAM,eAAe;CAC1D,wBAAwB,IAAI,UAAU,gBACpC,sBAAsB,IAAI,UAAU,WAAW;AACnD;AAEA,SAAgB,sBACd,IACA,UACA,cAAc,OACR;CACN,MAAM,wBAAwB,8BAA8B,QAAQ;CACpE,IAAI,uBAAuB;EACzB,MAAM,eAAe,wBAAwB,qBAAqB;EAClE,IAAI,CAAC,cACH,MAAM,IAAI,MACR,iEACF;EAGF,mCAAmC,IAAI,YAAY;EAEnD,0BAA0B,IAAI,cADP,6BAA6B,YACR,CAAyB;EACrE;CACF;CAEA,gCAAgC,EAAE;CAElC,IAAI,aAAa,QAAQ,aAAa,QAAW;EAC/C,KAAK,IAAI,IAAI,GAAG,YAAY,IAAK;GAC/B,MAAM,OAAO,EAAE;GACf,oBAAoB,CAAC;GACrB,IAAI;EACN;EACA,GAAG,cAAc;EACjB;CACF;CAEA,IAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,gBAAgB,QAAQ,GAAG;EACzD,sBACE,IACA,2BAA2B,QAAQ,GACnC,WACF;EACA;CACF;CAEA,IACE,CAAC,MAAM,QAAQ,QAAQ,MACtB,OAAO,aAAa,YAAY,OAAO,aAAa,WACrD;EACA,IAAI,GAAG,WAAW,WAAW,KAAK,GAAG,YAAY,aAAa,GAAG;GAC/D,MAAM,IAAI,OAAO,QAAQ;GACzB,MAAM,IAAI,GAAG;GACb,IAAI,EAAE,SAAS,GAAG,EAAE,OAAO;EAC7B,OAAO;GACL,KAAK,IAAI,IAAI,GAAG,YAAY,IAAK;IAC/B,MAAM,OAAO,EAAE;IACf,oBAAoB,CAAC;IACrB,IAAI;GACN;GACA,GAAG,cAAc,OAAO,QAAQ;EAClC;EACA;CACF;CAEA,IAAI,MAAM,QAAQ,QAAQ,GAAG;EAC3B,MAAM,qBAAqB,2BAA2B,QAAQ;EAE9D,IACE,kCACE,IACA,oBACA,4BACF,GACA;GACA,cAAc,OAAO,EAAE;GACvB;EACF;EAEA,IAAI,sBAAsB,kBAAkB,GAAG;GAE7C,MAAM,YAAY,uBAChB,IACA,oBAHgB,oBAAoB,EAIpC,CACF;GACA,cAAc,IAAI,IAAI,SAAS;GAC/B;EACF;EACA,IAAI,2BAA2B,IAAI,kBAAkB,GAAG;GACtD,uBAAuB,IAAI,kBAAkB;GAC7C,cAAc,OAAO,EAAE;GACvB;EACF;EACA,sBAAsB,IAAI,oBAAoB,WAAW;EACzD;CACF;CAEA,IAAI,cAAc,QAAQ,GAAG;EAC3B,sBAAsB,IAAI,CAAC,QAAQ,GAAG,WAAW;EACjD;CACF;CAEA,KAAK,IAAI,IAAI,GAAG,YAAY,IAAK;EAC/B,MAAM,OAAO,EAAE;EACf,oBAAoB,CAAC;EACrB,IAAI;CACN;CACA,GAAG,cAAc;CACjB,MAAM,MAAM,mBAAmB,CAAC,CAAC,cAAc,QAAQ;CACvD,IAAI,KAAK,GAAG,YAAY,GAAG;AAC7B;AAEA,SAAS,sBAAsB,UAA4B;CACzD,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KACnC,IAAI,WAAW,SAAS,EAAE,MAAM,QAAW,OAAO;CAEpD,OAAO;AACT;AAEA,SAAS,aAAa,OAAyB;CAC7C,OAAO,UAAU,QAAQ,UAAU,UAAa,UAAU;AAC5D;AAEA,SAAS,oBACP,QAC2C;CAC3C,IAAI,SAAS,cAAc,IAAI,MAAM;CACrC,IAAI,CAAC,QAAQ;EACX,yBAAS,IAAI,IAA8B;EAC3C,KACE,IAAI,QAAQ,OAAO,mBACnB,OACA,QAAQ,MAAM,oBACd;GACA,MAAM,MAAM,MAAM,aAAa,UAAU;GACzC,IAAI,QAAQ,MAAM;IAChB,OAAO,IAAI,KAAK,KAAK;IACrB,MAAM,aAAa,OAAO,GAAG;IAC7B,IAAI,CAAC,OAAO,MAAM,UAAU,GAAG,OAAO,IAAI,YAAY,KAAK;GAC7D;EACF;EACA,IAAI,OAAO,OAAO,GAAG,cAAc,IAAI,QAAQ,MAAM;CACvD;CACA,OAAO,OAAO,OAAO,IAAI,SAAS;AACpC;AAEA,SAAgB,sBACd,QACA,aACA,cAAc,OACR;CACN,MAAM,kBAAkB,mBAAmB,MAAM;CACjD,MAAM,UAAU,mBAAmB;CAEnC,MAAM,yBACJ,YACA,SACgB;EAChB,IAAI,OAAO,KAAK,SAAS,YACvB,OAAO;EAGT,OAAO,QAAQ,qBACb,YACA,MACA,KAAK,OACF,KAAoB,SAAS,CAAC,MAAkC,CAAC,GACpE,iBACA,WACF;CACF;CAEA,MAAM,UAAU,YAAY,MACzB,MAAM,OAAO,MAAM,YAAY,OAAO,MAAM,QAC/C;CACA,MAAM,cAAc,YAAY,MAAM,MAAM,cAAc,CAAC,CAAC;CAC5D,MAAM,mBAAmB,YAAY,KAAK,YAAY;CACtD,MAAM,uBAAuB,YAAY,MACtC,MAAM,cAAc,CAAC,KAAK,OAAQ,EAAiB,SAAS,UAC/D;CACA,MAAM,2BACJ,OAAO,WAAW,WAAW,OAAO,SAAS;CAE/C,IACE,CAAC,oBACD,CAAC,WACD,CAAC,wBACD,CAAC,4BACD,eACA,OAAO,SAAS,WAAW,YAAY,QACvC;EACA,MAAM,IAAI,OAAO;EACjB,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;GAC3C,MAAM,OAAO,YAAY;GACzB,MAAM,UAAU,EAAE;GAClB,IAAI,CAAC,WAAW,SAAS,QAAW;GACpC,IAAI,cAAc,IAAI,KAAK,OAAO,KAAK,SAAS,UAC9C,IAAI,oBAAoB,QAAQ,SAAS,KAAK,IAAI,GAChD,QAAQ,uBAAuB,SAAS,MAAM,MAAM,WAAW;QAC1D;IACL,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;IACvD,IAAI,KAAK;KACP,oBAAoB,OAAO;KAC3B,OAAO,aAAa,KAAK,OAAO;IAClC;GACF;QACK,IAAI,cAAc,IAAI,GAAG;IAC9B,IAAI,4BAA4B,QAAQ,SAAS,IAAI,GACnD;IAGF,MAAM,SAAS,sBAAsB,SAAS,IAAI;IAClD,IAAI,UAAU,WAAW,SACvB,oBAAoB,OAAO;SACtB,IAAI,CAAC,QAAQ;KAClB,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;KACvD,IAAI,KAAK;MACP,oBAAoB,OAAO;MAC3B,OAAO,aAAa,KAAK,OAAO;KAClC;IACF;GACF,OAAO;IACL,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;IACvD,IAAI,KAAK;KACP,oBAAoB,OAAO;KAC3B,OAAO,aAAa,KAAK,OAAO;IAClC;GACF;EACF;EACA;CACF;CAEA,MAAM,WAAW,MAAM,KAAK,OAAO,QAAQ;CAE3C,IACE,WACA,wBACA,oBACA,0BACA;EACA,MAAM,WAAW,MAAM,KAAK,OAAO,UAAU;EAC7C,MAAM,MAAM,KAAK,IAAI,SAAS,QAAQ,YAAY,MAAM;EAExD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;GAC5B,MAAM,cAAc,SAAS;GAC7B,MAAM,OAAO,YAAY;GACzB,MAAM,cAAc,aAAa,IAAI;GAErC,IAAI,eAAe,aAAa;IAC9B,oBAAoB,WAAW;IAC/B,YAAY,OAAO;IACnB;GACF;GAEA,IAAI,CAAC,eAAe,CAAC,aAAa;IAChC,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;IACvD,IAAI,KAAK,OAAO,YAAY,GAAG;IAC/B;GACF;GAEA,IAAI,CAAC,eAAe,aAAa;GAEjC,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAC9C,IAAI,YAAY,aAAa,GAC3B,YAAsB,OAAO,OAAO,IAAI;QACnC;IACL,MAAM,WAAW,SAAS,eAAe,OAAO,IAAI,CAAC;IACrD,OAAO,aAAa,UAAU,WAAW;GAC3C;QACK,IAAI,cAAc,IAAI,GAC3B,IAAI,YAAY,aAAa,GAAG;IAC9B,MAAM,YAAY;IAClB,IAAI,OAAO,KAAK,SAAS,UACvB,IAAI,oBAAoB,UAAU,SAAS,KAAK,IAAI,GAClD,QAAQ,uBACN,WACA,MACA,MACA,WACF;SACK;KACL,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;KACvD,IAAI,KAAK;MACP,oBAAoB,SAAS;MAC7B,OAAO,aAAa,KAAK,WAAW;KACtC;IACF;SACK;KACL,IAAI,4BAA4B,QAAQ,aAAa,IAAI,GACvD;KAGF,MAAM,SAAS,sBAAsB,WAAW,IAAI;KACpD,IAAI,UAAU,WAAW,aACvB,oBAAoB,SAAS;UACxB,IAAI,CAAC,QAAQ;MAClB,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;MACvD,IAAI,KAAK;OACP,oBAAoB,SAAS;OAC7B,OAAO,aAAa,KAAK,WAAW;MACtC;KACF;IACF;GACF,OAAO;IACL,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;IACvD,IAAI,KAAK,OAAO,aAAa,KAAK,WAAW;GAC/C;EAEJ;EACA;CACF;CAEA,IACE,YAAY,WAAW,KACvB,SAAS,WAAW,KACpB,OAAO,WAAW,WAAW,GAC7B;EACA,MAAM,gBAAgB,YAAY;EAClC,MAAM,gBAAgB,OAAO;EAC7B,KACG,OAAO,kBAAkB,YACxB,OAAO,kBAAkB,aAC3B,eAAe,aAAa,GAC5B;GACA,cAAwB,OAAO,OAAO,aAAa;GACnD;EACF;CACF;CAEA,IAAI,SAAS,WAAW,KAAK,OAAO,WAAW,SAAS,GAAG;EACzD,KAAK,IAAI,IAAI,OAAO,YAAY,IAAK;GACnC,MAAM,OAAO,EAAE;GACf,oBAAoB,CAAC;GACrB,IAAI;EACN;EACA,OAAO,cAAc;CACvB;CACA,MAAM,MAAM,KAAK,IAAI,SAAS,QAAQ,YAAY,MAAM;CAExD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;EAC5B,MAAM,UAAU,SAAS;EACzB,MAAM,OAAO,YAAY;EACzB,MAAM,cAAc,aAAa,IAAI;EAErC,IAAI,eAAe,SAAS;GAC1B,oBAAoB,OAAO;GAC3B,QAAQ,OAAO;GACf;EACF;EAEA,IAAI,CAAC,WAAW,CAAC,aAAa;GAC5B,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;GACvD,IAAI,KAAK,OAAO,YAAY,GAAG;GAC/B;EACF;EAEA,IAAI,CAAC,WAAW,aAAa;EAE7B,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;GACxD,MAAM,WAAW,SAAS,eAAe,OAAO,IAAI,CAAC;GACrD,oBAAoB,OAAO;GAC3B,OAAO,aAAa,UAAU,OAAO;EACvC,OAAO,IAAI,cAAc,IAAI,GAC3B,IAAI,OAAO,KAAK,SAAS,UACvB,IAAI,oBAAoB,QAAQ,SAAS,KAAK,IAAI,GAChD,QAAQ,uBAAuB,SAAS,MAAM,MAAM,WAAW;OAC1D;GACL,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;GACvD,IAAI,KAAK;IACP,oBAAoB,OAAO;IAC3B,OAAO,aAAa,KAAK,OAAO;GAClC;EACF;OACK;GACL,MAAM,SAAS,sBAAsB,SAAS,IAAI;GAClD,IAAI,UAAU,WAAW,SACvB,oBAAoB,OAAO;QACtB,IAAI,CAAC,QAAQ;IAClB,MAAM,MAAM,QAAQ,cAAc,MAAM,eAAe;IACvD,IAAI,KAAK;KACP,oBAAoB,OAAO;KAC3B,OAAO,aAAa,KAAK,OAAO;IAClC;GACF;EACF;OACK;GACL,MAAM,MAAM,QAAQ,cAAc,IAAI;GACtC,IAAI,KAAK;IACP,oBAAoB,OAAO;IAC3B,OAAO,aAAa,KAAK,OAAO;GAClC;EACF;CACF;AACF"}
@@ -1 +1,2 @@
1
- import "../common/env.js";
1
+ import { getRuntimeEnv } from "../common/env.js";
2
+ export { getRuntimeEnv };
@@ -0,0 +1,29 @@
1
+ import { logger } from "../dev/logger.js";
2
+ import { getRendererDOMHost } from "./dom-host.js";
3
+ import { createBoundaryReset, reportBoundaryError, resolveErrorBoundaryFallback } from "../components/error-boundary.js";
4
+ //#region src/renderer/error-boundary-dom.ts
5
+ function createErrorBoundaryElement(node, props, parentNamespace) {
6
+ const boundaryState = node.__instance?.errorBoundaryState ?? null;
7
+ const reset = node.__instance ? createBoundaryReset(node.__instance) : () => {};
8
+ const fallback = props.fallback;
9
+ const children = props.children;
10
+ const domHost = getRendererDOMHost();
11
+ if (boundaryState?.error != null) {
12
+ const fallbackValue = resolveErrorBoundaryFallback(fallback, boundaryState.error, reset);
13
+ if (fallbackValue instanceof Node) return fallbackValue;
14
+ return domHost.createDOMNode(fallbackValue, parentNamespace) ?? document.createComment("");
15
+ }
16
+ try {
17
+ return domHost.createDOMNode(children, parentNamespace) ?? document.createComment("");
18
+ } catch (error) {
19
+ if (node.__instance) reportBoundaryError(node.__instance, error, props.onError);
20
+ else logger.error("[Askr] ErrorBoundary caught render error:", error);
21
+ const fallbackValue = resolveErrorBoundaryFallback(fallback, error, reset);
22
+ if (fallbackValue instanceof Node) return fallbackValue;
23
+ return domHost.createDOMNode(fallbackValue, parentNamespace) ?? document.createComment("");
24
+ }
25
+ }
26
+ //#endregion
27
+ export { createErrorBoundaryElement };
28
+
29
+ //# sourceMappingURL=error-boundary-dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-boundary-dom.js","names":[],"sources":["../../src/renderer/error-boundary-dom.ts"],"sourcesContent":["import { logger } from '../dev/logger';\nimport {\n createBoundaryReset,\n reportBoundaryError,\n resolveErrorBoundaryFallback,\n type ErrorBoundaryProps,\n} from '../components/error-boundary';\nimport type { ComponentInstance } from '../runtime/component-contracts';\nimport { getRendererDOMHost } from './dom-host';\nimport type { DOMElement } from './types';\n\nexport type ErrorBoundaryVNode = DOMElement & {\n __instance?: ComponentInstance;\n};\n\nexport function createErrorBoundaryElement(\n node: ErrorBoundaryVNode,\n props: Record<string, unknown>,\n parentNamespace?: string\n): Node {\n const boundaryState = node.__instance?.errorBoundaryState ?? null;\n const reset = node.__instance\n ? createBoundaryReset(node.__instance)\n : () => {};\n const fallback = props.fallback as ErrorBoundaryProps['fallback'];\n const children = props.children as ErrorBoundaryProps['children'];\n const domHost = getRendererDOMHost();\n\n if (boundaryState?.error != null) {\n const fallbackValue = resolveErrorBoundaryFallback(\n fallback,\n boundaryState.error,\n reset\n );\n if (fallbackValue instanceof Node) {\n return fallbackValue;\n }\n const fallbackDom = domHost.createDOMNode(fallbackValue, parentNamespace);\n return fallbackDom ?? document.createComment('');\n }\n\n try {\n const dom = domHost.createDOMNode(children, parentNamespace);\n return dom ?? document.createComment('');\n } catch (error) {\n if (node.__instance) {\n reportBoundaryError(\n node.__instance,\n error,\n props.onError as ((next: unknown) => void) | undefined\n );\n } else {\n logger.error('[Askr] ErrorBoundary caught render error:', error);\n }\n\n const fallbackValue = resolveErrorBoundaryFallback(fallback, error, reset);\n if (fallbackValue instanceof Node) {\n return fallbackValue;\n }\n const fallbackDom = domHost.createDOMNode(fallbackValue, parentNamespace);\n return fallbackDom ?? document.createComment('');\n }\n}\n"],"mappings":";;;;AAeA,SAAgB,2BACd,MACA,OACA,iBACM;CACN,MAAM,gBAAgB,KAAK,YAAY,sBAAsB;CAC7D,MAAM,QAAQ,KAAK,aACf,oBAAoB,KAAK,UAAU,UAC7B,CAAC;CACX,MAAM,WAAW,MAAM;CACvB,MAAM,WAAW,MAAM;CACvB,MAAM,UAAU,mBAAmB;CAEnC,IAAI,eAAe,SAAS,MAAM;EAChC,MAAM,gBAAgB,6BACpB,UACA,cAAc,OACd,KACF;EACA,IAAI,yBAAyB,MAC3B,OAAO;EAGT,OADoB,QAAQ,cAAc,eAAe,eAClD,KAAe,SAAS,cAAc,EAAE;CACjD;CAEA,IAAI;EAEF,OADY,QAAQ,cAAc,UAAU,eACrC,KAAO,SAAS,cAAc,EAAE;CACzC,SAAS,OAAO;EACd,IAAI,KAAK,YACP,oBACE,KAAK,YACL,OACA,MAAM,OACR;OAEA,OAAO,MAAM,6CAA6C,KAAK;EAGjE,MAAM,gBAAgB,6BAA6B,UAAU,OAAO,KAAK;EACzE,IAAI,yBAAyB,MAC3B,OAAO;EAGT,OADoB,QAAQ,cAAc,eAAe,eAClD,KAAe,SAAS,cAAc,EAAE;CACjD;AACF"}
@@ -0,0 +1,85 @@
1
+ import { _isDOMElement } from "../common/vnode.js";
2
+ import "./types.js";
3
+ import { teardownNodeSubtree } from "./cleanup.js";
4
+ import { getRendererDOMHost } from "./dom-host.js";
5
+ import { smartUpdateElement, tagNamesEqualIgnoreCase } from "./evaluate-reconcile.js";
6
+ //#region src/renderer/evaluate-dom-range.ts
7
+ const domRanges = /* @__PURE__ */ new WeakMap();
8
+ function hasDOMRange(context) {
9
+ return domRanges.has(context);
10
+ }
11
+ function createDOMRange(target, context, node) {
12
+ const start = document.createComment("component-start");
13
+ const end = document.createComment("component-end");
14
+ target.appendChild(start);
15
+ target.appendChild(end);
16
+ domRanges.set(context, {
17
+ start,
18
+ end
19
+ });
20
+ const dom = getRendererDOMHost().createDOMNode(node);
21
+ if (dom) target.insertBefore(dom, end);
22
+ }
23
+ function cleanupRangeNode(node) {
24
+ teardownNodeSubtree(node);
25
+ }
26
+ function updateDOMRangeForContext(target, context, children) {
27
+ const range = domRanges.get(context);
28
+ if (!range) return;
29
+ let current = range.start.nextSibling;
30
+ const domHost = getRendererDOMHost();
31
+ for (let i = 0; i < children.length; i++) {
32
+ const nextChild = children[i];
33
+ const currentNode = current === range.end ? null : current;
34
+ const nextCurrent = currentNode?.nextSibling ?? null;
35
+ if (nextChild === null || nextChild === void 0 || nextChild === false) {
36
+ if (currentNode) {
37
+ cleanupRangeNode(currentNode);
38
+ target.removeChild(currentNode);
39
+ }
40
+ current = nextCurrent;
41
+ continue;
42
+ }
43
+ if (typeof nextChild === "string" || typeof nextChild === "number") {
44
+ if (currentNode?.nodeType === 3) currentNode.data = String(nextChild);
45
+ else {
46
+ const textNode = document.createTextNode(String(nextChild));
47
+ if (currentNode) {
48
+ cleanupRangeNode(currentNode);
49
+ target.replaceChild(textNode, currentNode);
50
+ } else target.insertBefore(textNode, range.end);
51
+ }
52
+ current = nextCurrent;
53
+ continue;
54
+ }
55
+ if (currentNode instanceof Element && _isDOMElement(nextChild) && typeof nextChild.type === "string" && tagNamesEqualIgnoreCase(currentNode.tagName, nextChild.type)) {
56
+ smartUpdateElement(currentNode, nextChild, cleanupRangeNode);
57
+ current = nextCurrent;
58
+ continue;
59
+ }
60
+ const newDom = domHost.createDOMNode(nextChild);
61
+ if (!newDom) {
62
+ if (currentNode) {
63
+ cleanupRangeNode(currentNode);
64
+ target.removeChild(currentNode);
65
+ }
66
+ current = nextCurrent;
67
+ continue;
68
+ }
69
+ if (currentNode) {
70
+ cleanupRangeNode(currentNode);
71
+ target.replaceChild(newDom, currentNode);
72
+ } else target.insertBefore(newDom, range.end);
73
+ current = nextCurrent;
74
+ }
75
+ while (current && current !== range.end) {
76
+ const next = current.nextSibling;
77
+ cleanupRangeNode(current);
78
+ target.removeChild(current);
79
+ current = next;
80
+ }
81
+ }
82
+ //#endregion
83
+ export { cleanupRangeNode, createDOMRange, hasDOMRange, updateDOMRangeForContext };
84
+
85
+ //# sourceMappingURL=evaluate-dom-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate-dom-range.js","names":[],"sources":["../../src/renderer/evaluate-dom-range.ts"],"sourcesContent":["import { teardownNodeSubtree } from './cleanup';\nimport { getRendererDOMHost } from './dom-host';\nimport {\n smartUpdateElement,\n tagNamesEqualIgnoreCase,\n} from './evaluate-reconcile';\nimport { _isDOMElement } from './types';\n\ninterface DOMRange {\n start: Node;\n end: Node;\n}\n\nconst domRanges = new WeakMap<object, DOMRange>();\n\nexport function hasDOMRange(context: object): boolean {\n return domRanges.has(context);\n}\n\nexport function createDOMRange(\n target: Element,\n context: object,\n node: unknown\n): void {\n const start = document.createComment('component-start');\n const end = document.createComment('component-end');\n target.appendChild(start);\n target.appendChild(end);\n domRanges.set(context, { start, end });\n\n const dom = getRendererDOMHost().createDOMNode(node);\n if (dom) {\n target.insertBefore(dom, end);\n }\n}\n\nexport function cleanupRangeNode(node: Node): void {\n teardownNodeSubtree(node);\n}\n\nexport function updateDOMRangeForContext(\n target: Element,\n context: object,\n children: unknown[]\n): void {\n const range = domRanges.get(context);\n if (!range) {\n return;\n }\n\n let current: Node | null = range.start.nextSibling;\n const domHost = getRendererDOMHost();\n\n for (let i = 0; i < children.length; i++) {\n const nextChild = children[i];\n const currentNode = current === range.end ? null : current;\n const nextCurrent = currentNode?.nextSibling ?? null;\n\n if (nextChild === null || nextChild === undefined || nextChild === false) {\n if (currentNode) {\n cleanupRangeNode(currentNode);\n target.removeChild(currentNode);\n }\n current = nextCurrent;\n continue;\n }\n\n if (typeof nextChild === 'string' || typeof nextChild === 'number') {\n if (currentNode?.nodeType === 3) {\n (currentNode as Text).data = String(nextChild);\n } else {\n const textNode = document.createTextNode(String(nextChild));\n if (currentNode) {\n cleanupRangeNode(currentNode);\n target.replaceChild(textNode, currentNode);\n } else {\n target.insertBefore(textNode, range.end);\n }\n }\n current = nextCurrent;\n continue;\n }\n\n if (\n currentNode instanceof Element &&\n _isDOMElement(nextChild) &&\n typeof nextChild.type === 'string' &&\n tagNamesEqualIgnoreCase(currentNode.tagName, nextChild.type)\n ) {\n smartUpdateElement(currentNode, nextChild, cleanupRangeNode);\n current = nextCurrent;\n continue;\n }\n\n const newDom = domHost.createDOMNode(nextChild);\n if (!newDom) {\n if (currentNode) {\n cleanupRangeNode(currentNode);\n target.removeChild(currentNode);\n }\n current = nextCurrent;\n continue;\n }\n\n if (currentNode) {\n cleanupRangeNode(currentNode);\n target.replaceChild(newDom, currentNode);\n } else {\n target.insertBefore(newDom, range.end);\n }\n\n current = nextCurrent;\n }\n\n while (current && current !== range.end) {\n const next = current.nextSibling;\n cleanupRangeNode(current);\n target.removeChild(current);\n current = next;\n }\n}\n\nexport function clearDOMRange(context: object): void {\n domRanges.delete(context);\n}\n"],"mappings":";;;;;;AAaA,MAAM,4BAAY,IAAI,QAA0B;AAEhD,SAAgB,YAAY,SAA0B;CACpD,OAAO,UAAU,IAAI,OAAO;AAC9B;AAEA,SAAgB,eACd,QACA,SACA,MACM;CACN,MAAM,QAAQ,SAAS,cAAc,iBAAiB;CACtD,MAAM,MAAM,SAAS,cAAc,eAAe;CAClD,OAAO,YAAY,KAAK;CACxB,OAAO,YAAY,GAAG;CACtB,UAAU,IAAI,SAAS;EAAE;EAAO;CAAI,CAAC;CAErC,MAAM,MAAM,mBAAmB,CAAC,CAAC,cAAc,IAAI;CACnD,IAAI,KACF,OAAO,aAAa,KAAK,GAAG;AAEhC;AAEA,SAAgB,iBAAiB,MAAkB;CACjD,oBAAoB,IAAI;AAC1B;AAEA,SAAgB,yBACd,QACA,SACA,UACM;CACN,MAAM,QAAQ,UAAU,IAAI,OAAO;CACnC,IAAI,CAAC,OACH;CAGF,IAAI,UAAuB,MAAM,MAAM;CACvC,MAAM,UAAU,mBAAmB;CAEnC,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,YAAY,SAAS;EAC3B,MAAM,cAAc,YAAY,MAAM,MAAM,OAAO;EACnD,MAAM,cAAc,aAAa,eAAe;EAEhD,IAAI,cAAc,QAAQ,cAAc,UAAa,cAAc,OAAO;GACxE,IAAI,aAAa;IACf,iBAAiB,WAAW;IAC5B,OAAO,YAAY,WAAW;GAChC;GACA,UAAU;GACV;EACF;EAEA,IAAI,OAAO,cAAc,YAAY,OAAO,cAAc,UAAU;GAClE,IAAI,aAAa,aAAa,GAC5B,YAAsB,OAAO,OAAO,SAAS;QACxC;IACL,MAAM,WAAW,SAAS,eAAe,OAAO,SAAS,CAAC;IAC1D,IAAI,aAAa;KACf,iBAAiB,WAAW;KAC5B,OAAO,aAAa,UAAU,WAAW;IAC3C,OACE,OAAO,aAAa,UAAU,MAAM,GAAG;GAE3C;GACA,UAAU;GACV;EACF;EAEA,IACE,uBAAuB,WACvB,cAAc,SAAS,KACvB,OAAO,UAAU,SAAS,YAC1B,wBAAwB,YAAY,SAAS,UAAU,IAAI,GAC3D;GACA,mBAAmB,aAAa,WAAW,gBAAgB;GAC3D,UAAU;GACV;EACF;EAEA,MAAM,SAAS,QAAQ,cAAc,SAAS;EAC9C,IAAI,CAAC,QAAQ;GACX,IAAI,aAAa;IACf,iBAAiB,WAAW;IAC5B,OAAO,YAAY,WAAW;GAChC;GACA,UAAU;GACV;EACF;EAEA,IAAI,aAAa;GACf,iBAAiB,WAAW;GAC5B,OAAO,aAAa,QAAQ,WAAW;EACzC,OACE,OAAO,aAAa,QAAQ,MAAM,GAAG;EAGvC,UAAU;CACZ;CAEA,OAAO,WAAW,YAAY,MAAM,KAAK;EACvC,MAAM,OAAO,QAAQ;EACrB,iBAAiB,OAAO;EACxB,OAAO,YAAY,OAAO;EAC1B,UAAU;CACZ;AACF"}