@askrjs/askr 0.0.27 → 0.0.29

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 (442) hide show
  1. package/README.md +55 -147
  2. package/dist/_virtual/_rolldown/runtime.js +7 -0
  3. package/dist/bench/components/benchmark-row.d.ts +20 -0
  4. package/dist/bench/components/benchmark-row.d.ts.map +1 -0
  5. package/dist/bench/components/benchmark-row.js +42 -0
  6. package/dist/bench/components/benchmark-row.js.map +1 -0
  7. package/dist/bench/components/benchmark-table.js +25 -0
  8. package/dist/bench/components/benchmark-table.js.map +1 -0
  9. package/dist/benchmark.d.ts +22 -0
  10. package/dist/benchmark.d.ts.map +1 -0
  11. package/dist/benchmark.js +64 -1
  12. package/dist/benchmark.js.map +1 -0
  13. package/dist/bin/askr-ssg.d.ts +28 -0
  14. package/dist/bin/askr-ssg.d.ts.map +1 -0
  15. package/dist/bin/askr-ssg.js +171 -0
  16. package/dist/bin/askr-ssg.js.map +1 -0
  17. package/dist/boot/index.d.ts +64 -42
  18. package/dist/boot/index.d.ts.map +1 -1
  19. package/dist/boot/index.js +416 -2
  20. package/dist/boot/index.js.map +1 -0
  21. package/dist/common/component.d.ts +14 -13
  22. package/dist/common/component.d.ts.map +1 -1
  23. package/dist/common/control.d.ts +13 -0
  24. package/dist/common/control.d.ts.map +1 -0
  25. package/dist/common/control.js +14 -0
  26. package/dist/common/control.js.map +1 -0
  27. package/dist/common/env.js +47 -0
  28. package/dist/common/env.js.map +1 -0
  29. package/dist/common/jsx.d.ts +17 -15
  30. package/dist/common/jsx.d.ts.map +1 -1
  31. package/dist/common/jsx.js +8 -1
  32. package/dist/common/jsx.js.map +1 -0
  33. package/dist/common/props.d.ts +14 -11
  34. package/dist/common/props.d.ts.map +1 -1
  35. package/dist/common/router.d.ts +190 -32
  36. package/dist/common/router.d.ts.map +1 -1
  37. package/dist/common/ssr-errors.d.ts +6 -3
  38. package/dist/common/ssr-errors.d.ts.map +1 -1
  39. package/dist/common/ssr-errors.js +16 -1
  40. package/dist/common/ssr-errors.js.map +1 -0
  41. package/dist/common/ssr.d.ts +12 -9
  42. package/dist/common/ssr.d.ts.map +1 -1
  43. package/dist/common/vnode.d.ts +17 -15
  44. package/dist/common/vnode.d.ts.map +1 -1
  45. package/dist/common/vnode.js +10 -1
  46. package/dist/common/vnode.js.map +1 -0
  47. package/dist/components/link.d.ts +37 -25
  48. package/dist/components/link.d.ts.map +1 -1
  49. package/dist/components/link.js +64 -1
  50. package/dist/components/link.js.map +1 -0
  51. package/dist/control/case.d.ts +17 -0
  52. package/dist/control/case.d.ts.map +1 -0
  53. package/dist/control/case.js +69 -0
  54. package/dist/control/case.js.map +1 -0
  55. package/dist/control/for.d.ts +23 -0
  56. package/dist/control/for.d.ts.map +1 -0
  57. package/dist/control/for.js +62 -0
  58. package/dist/control/for.js.map +1 -0
  59. package/dist/control/index.d.ts +4 -0
  60. package/dist/control/index.js +4 -0
  61. package/dist/control/shared.js +20 -0
  62. package/dist/control/shared.js.map +1 -0
  63. package/dist/control/show.d.ts +14 -0
  64. package/dist/control/show.d.ts.map +1 -0
  65. package/dist/control/show.js +33 -0
  66. package/dist/control/show.js.map +1 -0
  67. package/dist/dev/invariant.js +29 -2
  68. package/dist/dev/invariant.js.map +1 -0
  69. package/dist/dev/logger.js +37 -1
  70. package/dist/dev/logger.js.map +1 -0
  71. package/dist/foundations/icon/icon.d.ts +53 -0
  72. package/dist/foundations/icon/icon.d.ts.map +1 -0
  73. package/dist/foundations/icon/icon.js +88 -0
  74. package/dist/foundations/icon/icon.js.map +1 -0
  75. package/dist/foundations/icon/icon.types.d.ts +21 -0
  76. package/dist/foundations/icon/icon.types.d.ts.map +1 -0
  77. package/dist/foundations/index.d.ts +10 -3
  78. package/dist/foundations/index.js +9 -1
  79. package/dist/foundations/interactions/interaction-policy.js +93 -1
  80. package/dist/foundations/interactions/interaction-policy.js.map +1 -0
  81. package/dist/foundations/interactions/pressable.js +51 -1
  82. package/dist/foundations/interactions/pressable.js.map +1 -0
  83. package/dist/foundations/structures/collection.d.ts +25 -40
  84. package/dist/foundations/structures/collection.d.ts.map +1 -1
  85. package/dist/foundations/structures/collection.js +51 -1
  86. package/dist/foundations/structures/collection.js.map +1 -0
  87. package/dist/foundations/structures/layer.d.ts +47 -68
  88. package/dist/foundations/structures/layer.d.ts.map +1 -1
  89. package/dist/foundations/structures/layer.js +81 -1
  90. package/dist/foundations/structures/layer.js.map +1 -0
  91. package/dist/foundations/structures/layout.d.ts +6 -3
  92. package/dist/foundations/structures/layout.d.ts.map +1 -1
  93. package/dist/foundations/structures/layout.js +13 -1
  94. package/dist/foundations/structures/layout.js.map +1 -0
  95. package/dist/foundations/structures/portal.d.ts +17 -10
  96. package/dist/foundations/structures/portal.d.ts.map +1 -1
  97. package/dist/foundations/structures/portal.js +105 -1
  98. package/dist/foundations/structures/portal.js.map +1 -0
  99. package/dist/foundations/structures/presence.d.ts +11 -5
  100. package/dist/foundations/structures/presence.d.ts.map +1 -1
  101. package/dist/foundations/structures/presence.js +39 -1
  102. package/dist/foundations/structures/presence.js.map +1 -0
  103. package/dist/foundations/structures/slot.d.ts +11 -8
  104. package/dist/foundations/structures/slot.d.ts.map +1 -1
  105. package/dist/foundations/structures/slot.js +41 -1
  106. package/dist/foundations/structures/slot.js.map +1 -0
  107. package/dist/foundations/structures.d.ts +7 -14
  108. package/dist/foundations/structures.js +6 -1
  109. package/dist/foundations/utilities/aria.js +11 -1
  110. package/dist/foundations/utilities/aria.js.map +1 -0
  111. package/dist/foundations/utilities/compose-handlers.js +20 -1
  112. package/dist/foundations/utilities/compose-handlers.js.map +1 -0
  113. package/dist/foundations/utilities/compose-ref.d.ts +7 -4
  114. package/dist/foundations/utilities/compose-ref.d.ts.map +1 -1
  115. package/dist/foundations/utilities/compose-ref.js +18 -1
  116. package/dist/foundations/utilities/compose-ref.js.map +1 -0
  117. package/dist/foundations/utilities/merge-props.js +49 -1
  118. package/dist/foundations/utilities/merge-props.js.map +1 -0
  119. package/dist/fx/fx.d.ts +24 -21
  120. package/dist/fx/fx.d.ts.map +1 -1
  121. package/dist/fx/fx.js +212 -1
  122. package/dist/fx/fx.js.map +1 -0
  123. package/dist/fx/index.d.ts +4 -7
  124. package/dist/fx/index.js +4 -1
  125. package/dist/fx/noop.js +9 -1
  126. package/dist/fx/noop.js.map +1 -0
  127. package/dist/fx/timing.d.ts +24 -21
  128. package/dist/fx/timing.d.ts.map +1 -1
  129. package/dist/fx/timing.js +236 -1
  130. package/dist/fx/timing.js.map +1 -0
  131. package/dist/index.d.ts +21 -20
  132. package/dist/index.js +34 -1
  133. package/dist/index.js.map +1 -0
  134. package/dist/jsx/index.d.ts +1 -4
  135. package/dist/jsx/index.js +3 -1
  136. package/dist/jsx/types.d.ts +18 -25
  137. package/dist/jsx/types.d.ts.map +1 -1
  138. package/dist/jsx/types.js +1 -1
  139. package/dist/jsx/utils.d.ts +4 -3
  140. package/dist/jsx/utils.d.ts.map +1 -1
  141. package/dist/jsx/utils.js +19 -1
  142. package/dist/jsx/utils.js.map +1 -0
  143. package/dist/jsx-dev-runtime.d.ts +8 -0
  144. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  145. package/dist/jsx-dev-runtime.js +32 -1
  146. package/dist/jsx-dev-runtime.js.map +1 -0
  147. package/dist/jsx-runtime.d.ts +12 -0
  148. package/dist/jsx-runtime.d.ts.map +1 -0
  149. package/dist/jsx-runtime.js +45 -1
  150. package/dist/jsx-runtime.js.map +1 -0
  151. package/dist/jsx-runtime2.d.ts +2 -0
  152. package/dist/jsx-runtime2.js +3 -0
  153. package/dist/renderer/children.js +293 -0
  154. package/dist/renderer/children.js.map +1 -0
  155. package/dist/renderer/cleanup.js +150 -1
  156. package/dist/renderer/cleanup.js.map +1 -0
  157. package/dist/renderer/dom.js +2439 -1
  158. package/dist/renderer/dom.js.map +1 -0
  159. package/dist/renderer/env.js +1 -0
  160. package/dist/renderer/evaluate.js +450 -1
  161. package/dist/renderer/evaluate.js.map +1 -0
  162. package/dist/renderer/fastpath.js +145 -1
  163. package/dist/renderer/fastpath.js.map +1 -0
  164. package/dist/renderer/index.js +24 -1
  165. package/dist/renderer/index.js.map +1 -0
  166. package/dist/renderer/keyed.js +119 -1
  167. package/dist/renderer/keyed.js.map +1 -0
  168. package/dist/renderer/reconcile.js +359 -1
  169. package/dist/renderer/reconcile.js.map +1 -0
  170. package/dist/renderer/types.js +1 -1
  171. package/dist/renderer/utils.js +220 -1
  172. package/dist/renderer/utils.js.map +1 -0
  173. package/dist/resources/index.d.ts +3 -9
  174. package/dist/resources/index.js +3 -1
  175. package/dist/router/index.d.ts +6 -10
  176. package/dist/router/index.js +5 -1
  177. package/dist/router/match.js +83 -1
  178. package/dist/router/match.js.map +1 -0
  179. package/dist/router/navigate.d.ts +20 -8
  180. package/dist/router/navigate.d.ts.map +1 -1
  181. package/dist/router/navigate.js +288 -1
  182. package/dist/router/navigate.js.map +1 -0
  183. package/dist/router/policy.d.ts +22 -0
  184. package/dist/router/policy.d.ts.map +1 -0
  185. package/dist/router/policy.js +116 -0
  186. package/dist/router/policy.js.map +1 -0
  187. package/dist/router/route-context.js +79 -0
  188. package/dist/router/route-context.js.map +1 -0
  189. package/dist/router/route.d.ts +101 -33
  190. package/dist/router/route.d.ts.map +1 -1
  191. package/dist/router/route.js +599 -1
  192. package/dist/router/route.js.map +1 -0
  193. package/dist/runtime/child-scope.d.ts +21 -0
  194. package/dist/runtime/child-scope.d.ts.map +1 -0
  195. package/dist/runtime/child-scope.js +77 -0
  196. package/dist/runtime/child-scope.js.map +1 -0
  197. package/dist/runtime/component.d.ts +67 -53
  198. package/dist/runtime/component.d.ts.map +1 -1
  199. package/dist/runtime/component.js +462 -1
  200. package/dist/runtime/component.js.map +1 -0
  201. package/dist/runtime/context.d.ts +28 -42
  202. package/dist/runtime/context.d.ts.map +1 -1
  203. package/dist/runtime/context.js +205 -1
  204. package/dist/runtime/context.js.map +1 -0
  205. package/dist/runtime/control.d.ts +43 -0
  206. package/dist/runtime/control.d.ts.map +1 -0
  207. package/dist/runtime/control.js +125 -0
  208. package/dist/runtime/control.js.map +1 -0
  209. package/dist/runtime/derive.d.ts +15 -6
  210. package/dist/runtime/derive.d.ts.map +1 -1
  211. package/dist/runtime/derive.js +134 -1
  212. package/dist/runtime/derive.js.map +1 -0
  213. package/dist/runtime/dev-namespace.js +57 -1
  214. package/dist/runtime/dev-namespace.js.map +1 -0
  215. package/dist/runtime/effect.d.ts +32 -0
  216. package/dist/runtime/effect.d.ts.map +1 -0
  217. package/dist/runtime/effect.js +146 -0
  218. package/dist/runtime/effect.js.map +1 -0
  219. package/dist/runtime/events.js +162 -1
  220. package/dist/runtime/events.js.map +1 -0
  221. package/dist/runtime/execution-model.js +15 -1
  222. package/dist/runtime/execution-model.js.map +1 -0
  223. package/dist/runtime/fastlane.js +204 -1
  224. package/dist/runtime/fastlane.js.map +1 -0
  225. package/dist/runtime/for-bench.d.ts +41 -0
  226. package/dist/runtime/for-bench.d.ts.map +1 -0
  227. package/dist/runtime/for-bench.js +173 -0
  228. package/dist/runtime/for-bench.js.map +1 -0
  229. package/dist/runtime/for.d.ts +62 -49
  230. package/dist/runtime/for.d.ts.map +1 -1
  231. package/dist/runtime/for.js +668 -1
  232. package/dist/runtime/for.js.map +1 -0
  233. package/dist/runtime/operations.d.ts +18 -15
  234. package/dist/runtime/operations.d.ts.map +1 -1
  235. package/dist/runtime/operations.js +209 -1
  236. package/dist/runtime/operations.js.map +1 -0
  237. package/dist/runtime/perf-metrics.js +64 -0
  238. package/dist/runtime/perf-metrics.js.map +1 -0
  239. package/dist/runtime/readable.d.ts +27 -0
  240. package/dist/runtime/readable.d.ts.map +1 -0
  241. package/dist/runtime/readable.js +118 -0
  242. package/dist/runtime/readable.js.map +1 -0
  243. package/dist/runtime/resource-cell.js +102 -1
  244. package/dist/runtime/resource-cell.js.map +1 -0
  245. package/dist/runtime/scheduler.d.ts +51 -35
  246. package/dist/runtime/scheduler.d.ts.map +1 -1
  247. package/dist/runtime/scheduler.js +328 -1
  248. package/dist/runtime/scheduler.js.map +1 -0
  249. package/dist/runtime/selector.d.ts +11 -0
  250. package/dist/runtime/selector.d.ts.map +1 -0
  251. package/dist/runtime/selector.js +188 -0
  252. package/dist/runtime/selector.js.map +1 -0
  253. package/dist/runtime/ssr-bridge.js +24 -1
  254. package/dist/runtime/ssr-bridge.js.map +1 -0
  255. package/dist/runtime/state.d.ts +11 -21
  256. package/dist/runtime/state.d.ts.map +1 -1
  257. package/dist/runtime/state.js +99 -1
  258. package/dist/runtime/state.js.map +1 -0
  259. package/dist/ssg/batch-render.d.ts +16 -0
  260. package/dist/ssg/batch-render.d.ts.map +1 -0
  261. package/dist/ssg/batch-render.js +84 -0
  262. package/dist/ssg/batch-render.js.map +1 -0
  263. package/dist/ssg/create-static-gen.d.ts +50 -0
  264. package/dist/ssg/create-static-gen.d.ts.map +1 -0
  265. package/dist/ssg/create-static-gen.js +282 -0
  266. package/dist/ssg/create-static-gen.js.map +1 -0
  267. package/dist/ssg/generate-metadata.d.ts +24 -0
  268. package/dist/ssg/generate-metadata.d.ts.map +1 -0
  269. package/dist/ssg/generate-metadata.js +94 -0
  270. package/dist/ssg/generate-metadata.js.map +1 -0
  271. package/dist/ssg/incremental-manifest.js +56 -0
  272. package/dist/ssg/incremental-manifest.js.map +1 -0
  273. package/dist/ssg/index.d.ts +8 -0
  274. package/dist/ssg/index.js +7 -0
  275. package/dist/ssg/resolve-ssg-data.d.ts +23 -0
  276. package/dist/ssg/resolve-ssg-data.d.ts.map +1 -0
  277. package/dist/ssg/resolve-ssg-data.js +46 -0
  278. package/dist/ssg/resolve-ssg-data.js.map +1 -0
  279. package/dist/ssg/route-utils.d.ts +16 -0
  280. package/dist/ssg/route-utils.d.ts.map +1 -0
  281. package/dist/ssg/route-utils.js +24 -0
  282. package/dist/ssg/route-utils.js.map +1 -0
  283. package/dist/ssg/types.d.ts +177 -0
  284. package/dist/ssg/types.d.ts.map +1 -0
  285. package/dist/ssg/write-static-files.d.ts +15 -0
  286. package/dist/ssg/write-static-files.d.ts.map +1 -0
  287. package/dist/ssg/write-static-files.js +73 -0
  288. package/dist/ssg/write-static-files.js.map +1 -0
  289. package/dist/ssr/attrs.js +93 -1
  290. package/dist/ssr/attrs.js.map +1 -0
  291. package/dist/ssr/context.d.ts +31 -32
  292. package/dist/ssr/context.d.ts.map +1 -1
  293. package/dist/ssr/context.js +63 -1
  294. package/dist/ssr/context.js.map +1 -0
  295. package/dist/ssr/errors.d.ts +6 -4
  296. package/dist/ssr/errors.d.ts.map +1 -1
  297. package/dist/ssr/errors.js +4 -1
  298. package/dist/ssr/errors.js.map +1 -0
  299. package/dist/ssr/escape.js +153 -1
  300. package/dist/ssr/escape.js.map +1 -0
  301. package/dist/ssr/index.d.ts +75 -46
  302. package/dist/ssr/index.d.ts.map +1 -1
  303. package/dist/ssr/index.js +543 -1
  304. package/dist/ssr/index.js.map +1 -0
  305. package/dist/ssr/render-keys.d.ts +27 -29
  306. package/dist/ssr/render-keys.d.ts.map +1 -1
  307. package/dist/ssr/render-keys.js +39 -1
  308. package/dist/ssr/render-keys.js.map +1 -0
  309. package/dist/ssr/sink.js +86 -1
  310. package/dist/ssr/sink.js.map +1 -0
  311. package/dist/ssr/stream-render.js +76 -1
  312. package/dist/ssr/stream-render.js.map +1 -0
  313. package/dist/ssr/types.d.ts +14 -13
  314. package/dist/ssr/types.d.ts.map +1 -1
  315. package/package.json +53 -48
  316. package/dist/_virtual/___vite-browser-external.js +0 -1
  317. package/dist/_virtual/__vite-browser-external.js +0 -1
  318. package/dist/_virtual/_commonjsHelpers.js +0 -1
  319. package/dist/_virtual/main.js +0 -1
  320. package/dist/_virtual/preload-helper.js +0 -1
  321. package/dist/bench/benchmark-entry.d.ts +0 -14
  322. package/dist/bench/benchmark-entry.d.ts.map +0 -1
  323. package/dist/common/errors.d.ts +0 -53
  324. package/dist/common/errors.d.ts.map +0 -1
  325. package/dist/common/index.d.ts +0 -14
  326. package/dist/common/index.d.ts.map +0 -1
  327. package/dist/dev/invariant.d.ts +0 -83
  328. package/dist/dev/invariant.d.ts.map +0 -1
  329. package/dist/dev/logger.d.ts +0 -13
  330. package/dist/dev/logger.d.ts.map +0 -1
  331. package/dist/dev/vite-plugin-askr.d.ts +0 -18
  332. package/dist/dev/vite-plugin-askr.d.ts.map +0 -1
  333. package/dist/dev/warnings.d.ts +0 -5
  334. package/dist/dev/warnings.d.ts.map +0 -1
  335. package/dist/for/for.d.ts +0 -16
  336. package/dist/for/for.d.ts.map +0 -1
  337. package/dist/for/for.js +0 -1
  338. package/dist/for/index.d.ts +0 -2
  339. package/dist/for/index.d.ts.map +0 -1
  340. package/dist/for/index.js +0 -1
  341. package/dist/foundations/core.d.ts +0 -23
  342. package/dist/foundations/core.d.ts.map +0 -1
  343. package/dist/foundations/core.js +0 -1
  344. package/dist/foundations/index.d.ts.map +0 -1
  345. package/dist/foundations/interactions/dismissable.d.ts +0 -58
  346. package/dist/foundations/interactions/dismissable.d.ts.map +0 -1
  347. package/dist/foundations/interactions/dismissable.js +0 -1
  348. package/dist/foundations/interactions/focusable.d.ts +0 -16
  349. package/dist/foundations/interactions/focusable.d.ts.map +0 -1
  350. package/dist/foundations/interactions/focusable.js +0 -1
  351. package/dist/foundations/interactions/hoverable.d.ts +0 -19
  352. package/dist/foundations/interactions/hoverable.d.ts.map +0 -1
  353. package/dist/foundations/interactions/hoverable.js +0 -1
  354. package/dist/foundations/interactions/index.d.ts +0 -5
  355. package/dist/foundations/interactions/index.d.ts.map +0 -1
  356. package/dist/foundations/interactions/interaction-policy.d.ts +0 -96
  357. package/dist/foundations/interactions/interaction-policy.d.ts.map +0 -1
  358. package/dist/foundations/interactions/pressable.d.ts +0 -54
  359. package/dist/foundations/interactions/pressable.d.ts.map +0 -1
  360. package/dist/foundations/interactions/roving-focus.d.ts +0 -117
  361. package/dist/foundations/interactions/roving-focus.d.ts.map +0 -1
  362. package/dist/foundations/interactions/roving-focus.js +0 -1
  363. package/dist/foundations/state/controllable.d.ts +0 -53
  364. package/dist/foundations/state/controllable.d.ts.map +0 -1
  365. package/dist/foundations/state/controllable.js +0 -1
  366. package/dist/foundations/state/index.d.ts +0 -2
  367. package/dist/foundations/state/index.d.ts.map +0 -1
  368. package/dist/foundations/structures/index.d.ts +0 -5
  369. package/dist/foundations/structures/index.d.ts.map +0 -1
  370. package/dist/foundations/structures.d.ts.map +0 -1
  371. package/dist/foundations/utilities/aria.d.ts +0 -13
  372. package/dist/foundations/utilities/aria.d.ts.map +0 -1
  373. package/dist/foundations/utilities/compose-handlers.d.ts +0 -34
  374. package/dist/foundations/utilities/compose-handlers.d.ts.map +0 -1
  375. package/dist/foundations/utilities/event-types.d.ts +0 -17
  376. package/dist/foundations/utilities/event-types.d.ts.map +0 -1
  377. package/dist/foundations/utilities/index.d.ts +0 -7
  378. package/dist/foundations/utilities/index.d.ts.map +0 -1
  379. package/dist/foundations/utilities/merge-props.d.ts +0 -2
  380. package/dist/foundations/utilities/merge-props.d.ts.map +0 -1
  381. package/dist/foundations/utilities/use-id.d.ts +0 -29
  382. package/dist/foundations/utilities/use-id.d.ts.map +0 -1
  383. package/dist/foundations/utilities/use-id.js +0 -1
  384. package/dist/fx/index.d.ts.map +0 -1
  385. package/dist/fx/noop.d.ts +0 -12
  386. package/dist/fx/noop.d.ts.map +0 -1
  387. package/dist/index.d.ts.map +0 -1
  388. package/dist/jsx/index.d.ts.map +0 -1
  389. package/dist/jsx/jsx-dev-runtime.d.ts +0 -4
  390. package/dist/jsx/jsx-dev-runtime.d.ts.map +0 -1
  391. package/dist/jsx/jsx-runtime.d.ts +0 -10
  392. package/dist/jsx/jsx-runtime.d.ts.map +0 -1
  393. package/dist/node_modules/esbuild/lib/main.js +0 -65
  394. package/dist/renderer/cleanup.d.ts +0 -25
  395. package/dist/renderer/cleanup.d.ts.map +0 -1
  396. package/dist/renderer/dom.d.ts +0 -62
  397. package/dist/renderer/dom.d.ts.map +0 -1
  398. package/dist/renderer/evaluate.d.ts +0 -4
  399. package/dist/renderer/evaluate.d.ts.map +0 -1
  400. package/dist/renderer/fastpath.d.ts +0 -7
  401. package/dist/renderer/fastpath.d.ts.map +0 -1
  402. package/dist/renderer/index.d.ts +0 -6
  403. package/dist/renderer/index.d.ts.map +0 -1
  404. package/dist/renderer/keyed.d.ts +0 -23
  405. package/dist/renderer/keyed.d.ts.map +0 -1
  406. package/dist/renderer/reconcile.d.ts +0 -88
  407. package/dist/renderer/reconcile.d.ts.map +0 -1
  408. package/dist/renderer/types.d.ts +0 -3
  409. package/dist/renderer/types.d.ts.map +0 -1
  410. package/dist/renderer/utils.d.ts +0 -63
  411. package/dist/renderer/utils.d.ts.map +0 -1
  412. package/dist/resources/index.d.ts.map +0 -1
  413. package/dist/router/index.d.ts.map +0 -1
  414. package/dist/router/match.d.ts +0 -22
  415. package/dist/router/match.d.ts.map +0 -1
  416. package/dist/runtime/dev-namespace.d.ts +0 -31
  417. package/dist/runtime/dev-namespace.d.ts.map +0 -1
  418. package/dist/runtime/events.d.ts +0 -52
  419. package/dist/runtime/events.d.ts.map +0 -1
  420. package/dist/runtime/execution-model.d.ts +0 -4
  421. package/dist/runtime/execution-model.d.ts.map +0 -1
  422. package/dist/runtime/fastlane.d.ts +0 -27
  423. package/dist/runtime/fastlane.d.ts.map +0 -1
  424. package/dist/runtime/hydration.d.ts +0 -25
  425. package/dist/runtime/hydration.d.ts.map +0 -1
  426. package/dist/runtime/resource-cell.d.ts +0 -35
  427. package/dist/runtime/resource-cell.d.ts.map +0 -1
  428. package/dist/runtime/snapshot.d.ts +0 -25
  429. package/dist/runtime/snapshot.d.ts.map +0 -1
  430. package/dist/runtime/ssr-bridge.d.ts +0 -10
  431. package/dist/runtime/ssr-bridge.d.ts.map +0 -1
  432. package/dist/ssr/attrs.d.ts +0 -26
  433. package/dist/ssr/attrs.d.ts.map +0 -1
  434. package/dist/ssr/create-ssr.d.ts +0 -19
  435. package/dist/ssr/create-ssr.d.ts.map +0 -1
  436. package/dist/ssr/escape.d.ts +0 -38
  437. package/dist/ssr/escape.d.ts.map +0 -1
  438. package/dist/ssr/sink.d.ts +0 -23
  439. package/dist/ssr/sink.d.ts.map +0 -1
  440. package/dist/ssr/stream-render.d.ts +0 -7
  441. package/dist/ssr/stream-render.d.ts.map +0 -1
  442. package/dist/vite/index.js +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"askr-ssg.js","names":[],"sources":["../../src/bin/askr-ssg.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * askr-ssg CLI\n *\n * Usage: askr-ssg --config path/to/config.ts --output dist/static\n */\n\nimport * as pathModule from 'path';\nimport * as fsModule from 'fs';\nimport { createStaticGen } from '../ssg/index';\nimport type { RouteConfig } from '../ssg/types';\nimport type { SSGGenerateOptions, SSGResult } from '../ssg/types';\n\nconst { resolve } = pathModule;\nconst { existsSync } = fsModule;\n\nfunction toFileUrl(filePath: string): string {\n const normalized = resolve(filePath).replace(/\\\\/g, '/');\n const leadingSlash = normalized.startsWith('/') ? '' : '/';\n return `file://${leadingSlash}${encodeURI(normalized)}`;\n}\n\nexport interface ParsedCliArgs {\n configPath: string;\n outputDir: string;\n workers: number | 'auto';\n incremental: boolean;\n changedKeys: string[];\n changedRoutes: string[];\n forceFull: boolean;\n help: boolean;\n}\n\ninterface CliIo {\n log: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\ninterface CliDeps {\n cwd: () => string;\n now: () => number;\n existsSync: (path: string) => boolean;\n importConfig: (path: string) => Promise<Record<string, unknown>>;\n createStaticGen: typeof createStaticGen;\n}\n\ninterface CliConfig {\n routes: RouteConfig[];\n seed?: number;\n dataOverrides?: Record<string, unknown>;\n concurrency?: number;\n}\n\nconst defaultCliDeps: CliDeps = {\n cwd: () => process.cwd(),\n now: () => performance.now(),\n existsSync,\n importConfig: async (path: string) =>\n (await import(toFileUrl(path))) as Record<string, unknown>,\n createStaticGen,\n};\n\nconst helpText = `\naskr-ssg - Static Site Generation for Askr\n\nUsage:\n askr-ssg --config <path> --output <dir> [--incremental]\n\nOptions:\n --config <path> Path to SSG config file (TypeScript module)\n --output <dir> Output directory for generated HTML\n --workers <n|auto> Preferred render worker count for SSG throughput\n --incremental Use incremental generation if a manifest exists\n --changed-key <key> Mark an invalidation key as changed (repeatable)\n --changed-route <path> Mark a concrete route path as changed (repeatable)\n --force-full Force a full rebuild even with incremental flags\n --help Show this help message\n\nExample:\n askr-ssg --config ./ssg.config.ts --output ./dist/static --incremental --changed-key blog/post-123\n\nTypeScript config execution:\n Use tsx to run the CLI with TS config loading:\n tsx node_modules/@askrjs/askr/dist/bin/askr-ssg.js --config ./ssg.config.ts --output ./dist/static\n`;\n\nexport function parseCliArgs(args: string[]): ParsedCliArgs {\n const parsed: ParsedCliArgs = {\n configPath: '',\n outputDir: '',\n workers: 1,\n incremental: false,\n changedKeys: [],\n changedRoutes: [],\n forceFull: false,\n help: false,\n };\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--config' && i + 1 < args.length) {\n parsed.configPath = args[i + 1];\n i++;\n } else if (args[i] === '--output' && i + 1 < args.length) {\n parsed.outputDir = args[i + 1];\n i++;\n } else if (args[i] === '--workers' && i + 1 < args.length) {\n parsed.workers = args[i + 1] === 'auto' ? 'auto' : Number(args[i + 1]);\n i++;\n } else if (args[i] === '--changed-key' && i + 1 < args.length) {\n parsed.changedKeys.push(args[i + 1]);\n i++;\n } else if (args[i] === '--changed-route' && i + 1 < args.length) {\n parsed.changedRoutes.push(args[i + 1]);\n i++;\n } else if (args[i] === '--incremental') {\n parsed.incremental = true;\n } else if (args[i] === '--force-full') {\n parsed.forceFull = true;\n } else if (args[i] === '--help' || args[i] === '-h') {\n parsed.help = true;\n }\n }\n\n return parsed;\n}\n\nfunction toGenerateOptions(args: ParsedCliArgs): SSGGenerateOptions {\n return {\n mode: args.incremental ? 'incremental' : 'full',\n changedKeys: args.changedKeys,\n changedRoutes: args.changedRoutes,\n forceFull: args.forceFull,\n };\n}\n\nfunction printSummary(\n io: CliIo,\n outputDir: string,\n durationSeconds: string,\n result: SSGResult\n) {\n io.log('');\n io.log(`Generation complete in ${durationSeconds}s`);\n io.log(` Mode: ${result.mode}`);\n io.log(` Generated: ${result.successful}/${result.totalRoutes} routes`);\n io.log(` Failed: ${result.failed} routes`);\n io.log(` Rebuilt: ${result.rebuilt} routes`);\n io.log(` Skipped: ${result.skipped} routes`);\n io.log(` Removed: ${result.removed} routes`);\n io.log(` CacheHit: ${result.cacheHits} routes`);\n io.log(` Output: ${outputDir}`);\n io.log(` Metadata: ${outputDir}/metadata.json`);\n io.log('');\n}\n\nexport async function runCli(\n args: string[],\n deps: Partial<CliDeps> = {},\n io: CliIo = console\n): Promise<number> {\n const parsed = parseCliArgs(args);\n if (parsed.help) {\n io.log(helpText);\n return 0;\n }\n\n if (!parsed.configPath) {\n io.error('Error: --config argument is required');\n return 1;\n }\n\n if (!parsed.configPath.endsWith('.ts')) {\n io.error('Error: --config must point to a TypeScript file (.ts)');\n return 1;\n }\n\n if (!parsed.outputDir) {\n io.error('Error: --output argument is required');\n return 1;\n }\n\n const resolvedDeps = { ...defaultCliDeps, ...deps };\n const resolvedConfigPath = resolve(resolvedDeps.cwd(), parsed.configPath);\n const resolvedOutputDir = resolve(resolvedDeps.cwd(), parsed.outputDir);\n\n if (!resolvedDeps.existsSync(resolvedConfigPath)) {\n io.error(`Error: Config file not found: ${resolvedConfigPath}`);\n return 1;\n }\n\n try {\n io.log(`Loading config: ${resolvedConfigPath}`);\n\n const configModule = await resolvedDeps.importConfig(resolvedConfigPath);\n const config = (configModule.default || configModule) as Partial<CliConfig>;\n\n if (!Array.isArray(config.routes)) {\n io.error('Error: Config must export routes array');\n return 1;\n }\n\n io.log(`Generating ${config.routes.length} routes...`);\n\n const ssg = resolvedDeps.createStaticGen({\n routes: config.routes,\n outputDir: resolvedOutputDir,\n seed: config.seed,\n dataOverrides: config.dataOverrides,\n concurrency: config.concurrency,\n parallelism: parsed.workers,\n });\n\n const startTime = resolvedDeps.now();\n const result = await ssg.generate(toGenerateOptions(parsed));\n const duration = ((resolvedDeps.now() - startTime) / 1000).toFixed(2);\n\n printSummary(io, resolvedOutputDir, duration, result);\n\n if (result.failed > 0) {\n io.log('Errors encountered:');\n for (const route of result.routes) {\n if (route.status === 'error') {\n io.log(` ${route.path}: ${route.error}`);\n }\n }\n io.log('');\n return 1;\n }\n\n return 0;\n } catch (error) {\n io.error('Generation failed:');\n io.error(error instanceof Error ? error.message : String(error));\n if (error instanceof Error && error.stack) {\n io.error(error.stack);\n }\n return 1;\n }\n}\n\nasync function main() {\n const exitCode = await runCli(process.argv.slice(2));\n process.exit(exitCode);\n}\n\nif (process.argv[1] && import.meta.url === toFileUrl(process.argv[1])) {\n void main();\n}\n"],"mappings":"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"}
@@ -1,70 +1,92 @@
1
- /**
2
- * App bootstrap and mount
3
- */
4
- import { type ComponentFunction } from '../runtime/component';
5
- export interface AppConfig {
6
- root: Element | string;
7
- component: ComponentFunction;
8
- cleanupStrict?: boolean;
9
- }
1
+ import { ComponentFunction } from "../common/component.js";
2
+ import { Route, RouteAuthOptions, RouteManifest } from "../common/router.js";
3
+ import { ScrollRestorationOptions } from "../router/navigate.js";
4
+
5
+ //#region src/boot/index.d.ts
10
6
  /**
11
7
  * Explicitly teardown an app mounted on `root` if present. This is the
12
8
  * recommended API for deterministic cleanup rather than relying on overriding
13
9
  * `innerHTML` setter behavior.
14
10
  */
15
- export declare function teardownApp(_root: Element | string): void;
16
- import type { Route } from '../common/router';
17
- export type IslandConfig = {
18
- root: Element | string;
19
- component: ComponentFunction;
20
- cleanupStrict?: boolean;
21
- routes?: never;
11
+ declare function teardownApp(_root: Element | string): void;
12
+ type IslandConfig = {
13
+ root: Element | string;
14
+ component: ComponentFunction;
15
+ cleanupStrict?: boolean;
16
+ routes?: never;
22
17
  };
23
- export type IslandsConfig = {
24
- islands: IslandConfig[];
18
+ type IslandsConfig = {
19
+ islands: IslandConfig[];
25
20
  };
26
- export type SPAConfig = {
27
- root: Element | string;
28
- routes: Route[];
29
- cleanupStrict?: boolean;
30
- component?: never;
21
+ type SPAConfig = {
22
+ root: Element | string;
23
+ /**
24
+ * Preferred: pass the route manifest built via `registerRoutes(() => { ... })`.
25
+ * ```ts
26
+ * import { getManifest } from '@askrjs/askr/router';
27
+ * await createSPA({ root: '#app', manifest: getManifest() });
28
+ * ```
29
+ */
30
+ manifest?: RouteManifest; /** Legacy: flat route array — kept for backward compatibility and test fixtures. */
31
+ routes?: Route[];
32
+ auth?: RouteAuthOptions;
33
+ scrollRestoration?: boolean | ScrollRestorationOptions;
34
+ cleanupStrict?: boolean;
35
+ component?: never;
31
36
  };
32
- export type HydrateSPAConfig = {
33
- root: Element | string;
34
- routes: Route[];
35
- cleanupStrict?: boolean;
36
- hydrate?: {
37
- deferUntilIdle?: boolean;
38
- deferBelowFold?: boolean;
39
- foldThreshold?: number;
40
- skipSelectors?: string[];
41
- };
37
+ type HydrateSPAConfig = {
38
+ root: Element | string; /** Preferred manifest input — see `SPAConfig.manifest`. */
39
+ manifest?: RouteManifest; /** Legacy flat route array. */
40
+ routes?: Route[];
41
+ auth?: RouteAuthOptions;
42
+ scrollRestoration?: boolean | ScrollRestorationOptions;
43
+ cleanupStrict?: boolean;
44
+ hydrate?: {
45
+ verifyMarkup?: boolean;
46
+ deferUntilIdle?: boolean;
47
+ deferBelowFold?: boolean;
48
+ foldThreshold?: number;
49
+ skipSelectors?: string[];
50
+ };
42
51
  };
43
52
  /**
44
53
  * createIsland: Enhances existing DOM (no router, mounts once)
45
54
  */
46
- export declare function createIsland(config: IslandConfig): void;
55
+ declare function createIsland(config: IslandConfig): void;
47
56
  /**
48
57
  * createIslands: Enhances one or more existing DOM roots (no router).
49
58
  * The only public islands constructor.
50
59
  */
51
- export declare function createIslands(config: IslandsConfig): void;
60
+ declare function createIslands(config: IslandsConfig): void;
52
61
  /**
53
- * createSPA: Initializes router and mounts the app with provided route table
62
+ * createSPA: Initializes router and mounts the app with the provided route manifest or route table.
63
+ *
64
+ * Preferred usage with manifest:
65
+ * ```ts
66
+ * import { getManifest } from '@askrjs/askr/router';
67
+ * await createSPA({ root: '#app', manifest: getManifest() });
68
+ * ```
69
+ *
70
+ * Legacy usage with plain routes array (still supported):
71
+ * ```ts
72
+ * await createSPA({ root: '#app', routes: getRoutes() });
73
+ * ```
54
74
  */
55
- export declare function createSPA(config: SPAConfig): Promise<void>;
75
+ declare function createSPA(config: SPAConfig): Promise<void>;
56
76
  /**
57
- * hydrateSPA: Hydrate server-rendered HTML with explicit routes
77
+ * hydrateSPA: Hydrate server-rendered HTML.
78
+ * Accepts either a `manifest` (preferred) or a legacy `routes` array.
58
79
  */
59
- export declare function hydrateSPA(config: HydrateSPAConfig): Promise<void>;
60
- export declare function hydrate(_config: AppConfig): Promise<void>;
80
+ declare function hydrateSPA(config: HydrateSPAConfig): Promise<void>;
61
81
  /**
62
82
  * Cleanup an app mounted on a root element (element or id).
63
83
  * Safe to call multiple times — no-op when nothing is mounted.
64
84
  */
65
- export declare function cleanupApp(root: Element | string): void;
85
+ declare function cleanupApp(root: Element | string): void;
66
86
  /**
67
87
  * Check whether an app is mounted on the given root
68
88
  */
69
- export declare function hasApp(root: Element | string): boolean;
89
+ declare function hasApp(root: Element | string): boolean;
90
+ //#endregion
91
+ export { HydrateSPAConfig, IslandConfig, IslandsConfig, SPAConfig, cleanupApp, createIsland, createIslands, createSPA, hasApp, hydrateSPA, teardownApp };
70
92
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/boot/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAIL,KAAK,iBAAiB,EAEvB,MAAM,sBAAsB,CAAC;AAuB9B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,SAAS,EAAE,iBAAiB,CAAC;IAE7B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAmHD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,QAIlD;AAkFD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,SAAS,EAAE,iBAAiB,CAAC;IAE7B,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,KAAK,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAuCvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAWzD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEhE;AAoED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGxE;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAYvD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAMtD"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/boot/index.ts"],"mappings":";;;;;;AAmKA;;;;iBAAgB,WAAA,CAAY,KAAA,EAAO,OAAA;AAAA,KA4GvB,YAAA;EACV,IAAA,EAAM,OAAA;EACN,SAAA,EAAW,iBAAA;EAEX,aAAA;EAEA,MAAA;AAAA;AAAA,KAGU,aAAA;EACV,OAAA,EAAS,YAAA;AAAA;AAAA,KAGC,SAAA;EACV,IAAA,EAAM,OAAA;EALI;;;;;AAIZ;;EASE,QAAA,GAAW,aAAA,EARL;EAUN,MAAA,GAAS,KAAA;EACT,IAAA,GAAO,gBAAA;EACP,iBAAA,aAA8B,wBAAA;EAC9B,aAAA;EACA,SAAA;AAAA;AAAA,KAGU,gBAAA;EACV,IAAA,EAAM,OAAA,WAVN;EAYA,QAAA,GAAW,aAAA,EAVX;EAYA,MAAA,GAAS,KAAA;EACT,IAAA,GAAO,gBAAA;EACP,iBAAA,aAA8B,wBAAA;EAC9B,aAAA;EACA,OAAA;IACE,YAAA;IACA,cAAA;IACA,cAAA;IACA,aAAA;IACA,aAAA;EAAA;AAAA;;;;iBAOY,YAAA,CAAa,MAAA,EAAQ,YAAA;;;;;iBA6CrB,aAAA,CAAc,MAAA,EAAQ,aAAA;;;;;;;;;;;;;;;iBA2BhB,SAAA,CAAU,MAAA,EAAQ,SAAA,GAAY,OAAA;;;AAxEpD;;iBAiXsB,UAAA,CAAW,MAAA,EAAQ,gBAAA,GAAmB,OAAA;;;AApU5D;;iBAmbgB,UAAA,CAAW,IAAA,EAAM,OAAA;;;AAxZjC;iBAyagB,MAAA,CAAO,IAAA,EAAM,OAAA"}
@@ -1,2 +1,416 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["router/route.js","router/match.js","runtime/component.js","runtime/scheduler.js","dev/invariant.js","dev/logger.js","runtime/context.js","common/jsx.js","runtime/dev-namespace.js","runtime/fastlane.js","renderer/keyed.js","renderer/utils.js","renderer/index.js","renderer/types.js","common/vnode.js","renderer/cleanup.js","runtime/events.js","renderer/dom.js","jsx-runtime.js","jsx/types.js","runtime/for.js","renderer/reconcile.js","renderer/fastpath.js","renderer/evaluate.js","runtime/execution-model.js","router/navigate.js","ssr/index.js","jsx/index.js","jsx/utils.js","foundations/structures/portal.js","ssr/context.js","ssr/errors.js","common/ssr-errors.js","runtime/ssr-bridge.js","ssr/render-keys.js","ssr/escape.js","ssr/attrs.js","ssr/sink.js","ssr/stream-render.js"])))=>i.map(i=>d[i]);
2
- import{__vitePreload as w}from"../_virtual/preload-helper.js";import{cleanupComponent as S,createComponentInstance as k,mountComponent as C}from"../runtime/component.js";import{globalScheduler as H}from"../runtime/scheduler.js";import{assertExecutionModel as _}from"../runtime/execution-model.js";import"../jsx/index.js";import{DefaultPortal as M}from"../foundations/structures/portal.js";import"../renderer/index.js";import{removeAllListeners as v}from"../renderer/cleanup.js";import{ELEMENT_TYPE as T,Fragment as N}from"../common/jsx.js";const j=Symbol.for("__ASKR_HAS_ROUTES__");let q=0;const h=new WeakMap,I=Symbol.for("__tempoCleanup__");function B(e,t){e[I]=()=>{const r=[];try{v(e)}catch(a){r.push(a)}try{const a=e.querySelectorAll("*");for(const o of Array.from(a))try{const n=o.__ASKR_INSTANCE;if(n){try{S(n)}catch(i){r.push(i)}try{delete o.__ASKR_INSTANCE}catch(i){r.push(i)}}}catch(n){r.push(n)}}catch(a){r.push(a)}try{S(t)}catch(a){r.push(a)}if(r.length>0&&t.cleanupStrict)throw new AggregateError(r,"cleanup failed for app root")};try{const r=Object.getOwnPropertyDescriptor(e,"innerHTML")||Object.getOwnPropertyDescriptor(Object.getPrototypeOf(e),"innerHTML")||Object.getOwnPropertyDescriptor(Element.prototype,"innerHTML");r&&(r.get||r.set)&&Object.defineProperty(e,"innerHTML",{get:r.get?function(){return r.get.call(this)}:void 0,set:function(a){if(a===""&&h.get(this)===t){try{v(e)}catch(o){if(t.cleanupStrict)throw o}try{S(t)}catch(o){if(t.cleanupStrict)throw o}}if(r.set)return r.set.call(this,a)},configurable:!0})}catch{}}function Q(e){throw new Error("The `teardownApp` alias has been removed. Use `cleanupApp(root)` instead.")}function y(e,t,r){const a=(i,c)=>{const s=t(i,c),l={$$typeof:T,type:M,props:{},key:"__default_portal"};return{$$typeof:T,type:N,props:{children:s==null?[l]:[s,l]}}};Object.defineProperty(a,"name",{value:t.name||"Component"});const o=e[I];o&&o();let n=h.get(e);if(n){v(e);try{S(n)}catch{}n.fn=a,n.evaluationGeneration++,n.mounted=!1,n.expectedStateIndices=[],n.firstRenderComplete=!1,n.isRoot=!0,r&&typeof r.cleanupStrict=="boolean"&&(n.cleanupStrict=r.cleanupStrict)}else{const i=String(++q);n=k(i,a,{},e),h.set(e,n),n.isRoot=!0,r&&typeof r.cleanupStrict=="boolean"&&(n.cleanupStrict=r.cleanupStrict)}B(e,n),C(n),H.flush()}function D(e){if(_("islands"),!e||typeof e!="object")throw new Error("createIsland requires a config object");if(typeof e.component!="function")throw new Error("createIsland: component must be a function");const t=typeof e.root=="string"?document.getElementById(e.root):e.root;if(!t)throw new Error(`Root element not found: ${e.root}`);if("routes"in e)throw new Error("createIsland does not accept routes; use createSPA for routed apps");try{if(globalThis[j])throw new Error("Routes are not supported with islands. Use createSPA (client) or createSSR (server) instead.")}catch{}y(t,e.component,{cleanupStrict:e.cleanupStrict})}function X(e){if(_("islands"),!e||typeof e!="object")throw new Error("createIslands requires a config object");if(!Array.isArray(e.islands)||e.islands.length===0)throw new Error("createIslands requires a non-empty islands array");for(const t of e.islands)D(t)}async function Z(e){if(_("spa"),!e||typeof e!="object")throw new Error("createSPA requires a config object");if(!Array.isArray(e.routes)||e.routes.length===0)throw new Error("createSPA requires a route table. If you are enhancing existing HTML, use createIsland instead.");const t=typeof e.root=="string"?document.getElementById(e.root):e.root;if(!t)throw new Error(`Root element not found: ${e.root}`);const{clearRoutes:r,route:a,lockRouteRegistration:o,resolveRoute:n}=await w(async()=>{const{clearRoutes:u,route:f,lockRouteRegistration:g,resolveRoute:p}=await import("../router/route.js");return{clearRoutes:u,route:f,lockRouteRegistration:g,resolveRoute:p}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]));r();for(const u of e.routes)a(u.path,u.handler,u.namespace);o();const i=typeof window<"u"?window.location.pathname:"/",c=n(i);if(!c){y(t,()=>({type:"div",children:[]}),{cleanupStrict:!1});const{registerAppInstance:u,initializeNavigation:f}=await w(async()=>{const{registerAppInstance:p,initializeNavigation:A}=await import("../router/navigate.js");return{registerAppInstance:p,initializeNavigation:A}},__vite__mapDeps([25,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24])),g=h.get(t);if(!g)throw new Error("Internal error: app instance missing");u(g,i),f();return}y(t,c.handler,{cleanupStrict:!1});const{registerAppInstance:s,initializeNavigation:l}=await w(async()=>{const{registerAppInstance:u,initializeNavigation:f}=await import("../router/navigate.js");return{registerAppInstance:u,initializeNavigation:f}},__vite__mapDeps([25,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24])),m=h.get(t);if(!m)throw new Error("Internal error: app instance missing");s(m,i),l()}function x(e,t){for(const r of t)e.querySelectorAll(r).forEach(o=>o.setAttribute("data-skip-hydrate","true"))}async function z(e,t,r){const{renderToStringSync:a}=await w(async()=>{const{renderToStringSync:o}=await import("../ssr/index.js");return{renderToStringSync:o}},__vite__mapDeps([26,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,27,28,29,30,31,32,33,34,35,36,37,38]));if(r.deferUntilIdle&&(typeof requestIdleCallback<"u"?await new Promise(o=>{requestIdleCallback(()=>o(void 0),{timeout:2e3})}):await new Promise(o=>setTimeout(o,0))),r.deferBelowFold){const o=r.foldThreshold??window.innerHeight,n=Array.from(e.querySelectorAll("*")).filter(c=>c.getBoundingClientRect().top>=o);for(const c of n)c.setAttribute("data-skip-hydrate","true");const i=()=>{const c=n.filter(s=>s.getBoundingClientRect().top<o);for(const s of c)s.removeAttribute("data-skip-hydrate");c.length===n.length&&window.removeEventListener("scroll",i)};window.addEventListener("scroll",i,{passive:!0})}y(e,t.handler,{cleanupStrict:!1})}async function ee(e){if(_("spa"),!e||typeof e!="object")throw new Error("hydrateSPA requires a config object");if(!Array.isArray(e.routes)||e.routes.length===0)throw new Error("hydrateSPA requires a route table. If you are enhancing existing HTML, use createIsland instead.");const t=typeof e.root=="string"?document.getElementById(e.root):e.root;if(!t)throw new Error(`Root element not found: ${e.root}`);const r=t.innerHTML,{clearRoutes:a,route:o,setServerLocation:n,lockRouteRegistration:i,resolveRoute:c}=await w(async()=>{const{clearRoutes:d,route:E,setServerLocation:b,lockRouteRegistration:P,resolveRoute:O}=await import("../router/route.js");return{clearRoutes:d,route:E,setServerLocation:b,lockRouteRegistration:P,resolveRoute:O}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]));a();for(const d of e.routes)o(d.path,d.handler,d.namespace);const s=typeof window<"u"?window.location.pathname:"/";n(s),i();const l=c(s);if(!l)throw new Error(`hydrateSPA: no route found for current path (${s}).`);const{renderToStringSync:m}=await w(async()=>{const{renderToStringSync:d}=await import("../ssr/index.js");return{renderToStringSync:d}},__vite__mapDeps([26,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,27,28,29,30,31,32,33,34,35,36,37,38])),u=m(()=>l.handler(l.params)??{type:"div",children:[]}),f=document.createElement("div");f.innerHTML=r;const g=document.createElement("div");if(g.innerHTML=u,!f.isEqualNode(g))throw new Error("[Askr] Hydration mismatch detected. Server HTML does not match expected server-render output.");const p=e.hydrate;if(p){if(p.deferUntilIdle||p.deferBelowFold){await z(t,{handler:l.handler,params:l.params},p);return}p.skipSelectors?.length&&x(t,p.skipSelectors)}y(t,l.handler,{cleanupStrict:!1});const{registerAppInstance:A,initializeNavigation:L}=await w(async()=>{const{registerAppInstance:d,initializeNavigation:E}=await import("../router/navigate.js");return{registerAppInstance:d,initializeNavigation:E}},__vite__mapDeps([25,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24])),R=h.get(t);if(!R)throw new Error("Internal error: app instance missing");A(R,s),L()}async function te(e){throw new Error("The legacy `hydrate` API is removed. Use `hydrateSPA({ root, routes })` for SSR hydration with an explicit route table.")}function re(e){const t=typeof e=="string"?document.getElementById(e):e;if(!t)return;const r=t[I];typeof r=="function"&&r(),h.delete(t)}function ne(e){const t=typeof e=="string"?document.getElementById(e):e;return t?h.has(t):!1}export{re as cleanupApp,D as createIsland,X as createIslands,Z as createSPA,ne as hasApp,te as hydrate,ee as hydrateSPA,Q as teardownApp};
1
+ import { isDevelopmentEnvironment, isProductionEnvironment } from "../common/env.js";
2
+ import { logger } from "../dev/logger.js";
3
+ import { globalScheduler } from "../runtime/scheduler.js";
4
+ import { ELEMENT_TYPE, Fragment } from "../common/jsx.js";
5
+ import { cleanupComponent, createComponentInstance, mountComponent } from "../runtime/component.js";
6
+ import { removeAllListeners } from "../renderer/cleanup.js";
7
+ import { installRendererBridge } from "../renderer/index.js";
8
+ import { assertExecutionModel } from "../runtime/execution-model.js";
9
+ import { _applyManifest, _drainLazy, _setActiveRouteAuthOptions, _snapshotLazy, clearRoutes, lockRouteRegistration, resolveRoute, resolveRouteRequest, route, setServerLocation } from "../router/route.js";
10
+ import "../jsx/index.js";
11
+ import { DefaultPortal } from "../foundations/structures/portal.js";
12
+ import { configureScrollRestoration, initializeNavigation, registerAppInstance } from "../router/navigate.js";
13
+ //#region src/boot/index.ts
14
+ /**
15
+ * App bootstrap and mount
16
+ */
17
+ const HAS_ROUTES_KEY = Symbol.for("__ASKR_HAS_ROUTES__");
18
+ let componentIdCounter = 0;
19
+ const instancesByRoot = /* @__PURE__ */ new WeakMap();
20
+ const CLEANUP_SYMBOL = Symbol.for("__tempoCleanup__");
21
+ function attachCleanupForRoot(rootElement, instance) {
22
+ rootElement[CLEANUP_SYMBOL] = () => {
23
+ const errors = [];
24
+ try {
25
+ removeAllListeners(rootElement);
26
+ } catch (e) {
27
+ errors.push(e);
28
+ }
29
+ try {
30
+ const descendants = rootElement.querySelectorAll("*");
31
+ for (const d of Array.from(descendants)) try {
32
+ const inst = d.__ASKR_INSTANCE;
33
+ if (inst) {
34
+ try {
35
+ cleanupComponent(inst);
36
+ } catch (err) {
37
+ errors.push(err);
38
+ }
39
+ try {
40
+ delete d.__ASKR_INSTANCE;
41
+ } catch (err) {
42
+ errors.push(err);
43
+ }
44
+ }
45
+ } catch (err) {
46
+ errors.push(err);
47
+ }
48
+ } catch (e) {
49
+ errors.push(e);
50
+ }
51
+ try {
52
+ cleanupComponent(instance);
53
+ } catch (e) {
54
+ errors.push(e);
55
+ }
56
+ if (errors.length > 0) {
57
+ if (instance.cleanupStrict) throw new AggregateError(errors, `cleanup failed for app root`);
58
+ else if (isDevelopmentEnvironment()) for (const err of errors) logger.warn("[Askr] cleanup error:", err);
59
+ }
60
+ };
61
+ try {
62
+ const descriptor = Object.getOwnPropertyDescriptor(rootElement, "innerHTML") || Object.getOwnPropertyDescriptor(Object.getPrototypeOf(rootElement), "innerHTML") || Object.getOwnPropertyDescriptor(Element.prototype, "innerHTML");
63
+ if (descriptor && (descriptor.get || descriptor.set)) Object.defineProperty(rootElement, "innerHTML", {
64
+ get: descriptor.get ? function() {
65
+ return descriptor.get.call(this);
66
+ } : void 0,
67
+ set: function(value) {
68
+ if (value === "" && instancesByRoot.get(this) === instance) {
69
+ try {
70
+ removeAllListeners(rootElement);
71
+ } catch (e) {
72
+ if (instance.cleanupStrict) throw e;
73
+ if (isDevelopmentEnvironment()) logger.warn("[Askr] cleanup error:", e);
74
+ }
75
+ try {
76
+ cleanupComponent(instance);
77
+ } catch (e) {
78
+ if (instance.cleanupStrict) throw e;
79
+ if (isDevelopmentEnvironment()) logger.warn("[Askr] cleanup error:", e);
80
+ }
81
+ }
82
+ if (descriptor.set) return descriptor.set.call(this, value);
83
+ },
84
+ configurable: true
85
+ });
86
+ } catch {}
87
+ }
88
+ /**
89
+ * Explicitly teardown an app mounted on `root` if present. This is the
90
+ * recommended API for deterministic cleanup rather than relying on overriding
91
+ * `innerHTML` setter behavior.
92
+ */
93
+ function teardownApp(_root) {
94
+ throw new Error("The `teardownApp` alias has been removed. Use `cleanupApp(root)` instead.");
95
+ }
96
+ function mountOrUpdate(rootElement, componentFn, options) {
97
+ const wrappedFn = (props, ctx) => {
98
+ const out = componentFn(props, ctx);
99
+ const portalVNode = {
100
+ $$typeof: ELEMENT_TYPE,
101
+ type: DefaultPortal,
102
+ props: {},
103
+ key: "__default_portal"
104
+ };
105
+ return {
106
+ $$typeof: ELEMENT_TYPE,
107
+ type: Fragment,
108
+ props: { children: out === void 0 || out === null ? [portalVNode] : [out, portalVNode] }
109
+ };
110
+ };
111
+ Object.defineProperty(wrappedFn, "name", { value: componentFn.name || "Component" });
112
+ const existingCleanup = rootElement[CLEANUP_SYMBOL];
113
+ if (existingCleanup) existingCleanup();
114
+ let instance = instancesByRoot.get(rootElement);
115
+ if (instance) {
116
+ removeAllListeners(rootElement);
117
+ try {
118
+ cleanupComponent(instance);
119
+ } catch (e) {
120
+ if (isDevelopmentEnvironment()) logger.warn("[Askr] prior cleanup threw:", e);
121
+ }
122
+ instance.fn = wrappedFn;
123
+ instance.evaluationGeneration++;
124
+ instance.mounted = false;
125
+ instance.expectedStateIndices = [];
126
+ instance.firstRenderComplete = false;
127
+ instance.isRoot = true;
128
+ if (options && typeof options.cleanupStrict === "boolean") instance.cleanupStrict = options.cleanupStrict;
129
+ } else {
130
+ instance = createComponentInstance(String(++componentIdCounter), wrappedFn, {}, rootElement);
131
+ instancesByRoot.set(rootElement, instance);
132
+ instance.isRoot = true;
133
+ if (options && typeof options.cleanupStrict === "boolean") instance.cleanupStrict = options.cleanupStrict;
134
+ }
135
+ attachCleanupForRoot(rootElement, instance);
136
+ mountComponent(instance);
137
+ globalScheduler.flush();
138
+ }
139
+ function bindResolvedRouteHandler(resolved) {
140
+ return () => resolved.handler(resolved.params);
141
+ }
142
+ function bindDeniedStatus(status) {
143
+ return () => ({
144
+ type: "div",
145
+ props: { "data-route-denied": String(status) },
146
+ children: [String(status)]
147
+ });
148
+ }
149
+ installRendererBridge();
150
+ /**
151
+ * createIsland: Enhances existing DOM (no router, mounts once)
152
+ */
153
+ function createIsland(config) {
154
+ assertExecutionModel("islands");
155
+ if (!config || typeof config !== "object") throw new Error("createIsland requires a config object");
156
+ if (typeof config.component !== "function") throw new Error("createIsland: component must be a function");
157
+ const rootElement = typeof config.root === "string" ? document.getElementById(config.root) : config.root;
158
+ if (!rootElement) throw new Error(`Root element not found: ${config.root}`);
159
+ if ("routes" in config) throw new Error("createIsland does not accept routes; use createSPA for routed apps");
160
+ try {
161
+ if (globalThis[HAS_ROUTES_KEY]) throw new Error("Routes are not supported with islands. Use createSPA (client) or createSSR (server) instead.");
162
+ } catch {}
163
+ mountOrUpdate(rootElement, config.component, { cleanupStrict: config.cleanupStrict });
164
+ }
165
+ /**
166
+ * createIslands: Enhances one or more existing DOM roots (no router).
167
+ * The only public islands constructor.
168
+ */
169
+ function createIslands(config) {
170
+ assertExecutionModel("islands");
171
+ if (!config || typeof config !== "object") throw new Error("createIslands requires a config object");
172
+ if (!Array.isArray(config.islands) || config.islands.length === 0) throw new Error("createIslands requires a non-empty islands array");
173
+ for (const island of config.islands) createIsland(island);
174
+ }
175
+ /**
176
+ * createSPA: Initializes router and mounts the app with the provided route manifest or route table.
177
+ *
178
+ * Preferred usage with manifest:
179
+ * ```ts
180
+ * import { getManifest } from '@askrjs/askr/router';
181
+ * await createSPA({ root: '#app', manifest: getManifest() });
182
+ * ```
183
+ *
184
+ * Legacy usage with plain routes array (still supported):
185
+ * ```ts
186
+ * await createSPA({ root: '#app', routes: getRoutes() });
187
+ * ```
188
+ */
189
+ async function createSPA(config) {
190
+ assertExecutionModel("spa");
191
+ if (!config || typeof config !== "object") throw new Error("createSPA requires a config object");
192
+ const hasManifest = config.manifest != null && config.manifest.records.length > 0;
193
+ const hasRoutes = Array.isArray(config.routes) && config.routes.length > 0;
194
+ if (!hasManifest && !hasRoutes) throw new Error("createSPA requires a route manifest or route table. Pass `manifest: getManifest()` or `routes: getRoutes()`. If you are enhancing existing HTML, use createIsland instead.");
195
+ const rootElement = typeof config.root === "string" ? document.getElementById(config.root) : config.root;
196
+ if (!rootElement) throw new Error(`Root element not found: ${config.root}`);
197
+ const pendingLazyAtBoot = _snapshotLazy();
198
+ configureScrollRestoration(config.scrollRestoration);
199
+ clearRoutes();
200
+ if (hasManifest) _applyManifest(config.manifest);
201
+ else for (const r of config.routes) route(r.path, r.handler);
202
+ const routeAuth = config.auth ?? config.manifest?.auth;
203
+ _setActiveRouteAuthOptions(routeAuth);
204
+ await _drainLazy(pendingLazyAtBoot);
205
+ if (isProductionEnvironment()) lockRouteRegistration();
206
+ let path = typeof window !== "undefined" ? window.location.pathname : "/";
207
+ let href = typeof window !== "undefined" ? `${window.location.pathname}${window.location.search}${window.location.hash}` : path;
208
+ let resolved = await resolveRouteRequest(href, { auth: routeAuth });
209
+ while (typeof window !== "undefined" && resolved && resolved.kind === "redirect") {
210
+ const redirectTarget = new URL(resolved.to, window.location.href);
211
+ const redirectHref = `${redirectTarget.pathname}${redirectTarget.search}${redirectTarget.hash}`;
212
+ window.history.replaceState({ path: redirectHref }, "", redirectHref);
213
+ path = redirectTarget.pathname;
214
+ href = redirectHref;
215
+ resolved = await resolveRouteRequest(href, { auth: routeAuth });
216
+ }
217
+ if (!resolved) {
218
+ mountOrUpdate(rootElement, () => ({
219
+ type: "div",
220
+ children: []
221
+ }), { cleanupStrict: config.cleanupStrict });
222
+ await registerAppNavigation(rootElement, path);
223
+ return;
224
+ }
225
+ if (resolved.kind === "redirect") {
226
+ mountOrUpdate(rootElement, () => ({
227
+ type: "div",
228
+ children: []
229
+ }), { cleanupStrict: config.cleanupStrict });
230
+ await registerAppNavigation(rootElement, path);
231
+ return;
232
+ }
233
+ mountOrUpdate(rootElement, resolved.kind === "deny" ? bindDeniedStatus(resolved.status) : bindResolvedRouteHandler({
234
+ handler: resolved.handler,
235
+ params: resolved.params
236
+ }), { cleanupStrict: config.cleanupStrict });
237
+ await registerAppNavigation(rootElement, path);
238
+ }
239
+ /**
240
+ * Mark elements that should be skipped during hydration
241
+ */
242
+ function markSkippedElements(root, skipSelectors) {
243
+ for (const selector of skipSelectors) root.querySelectorAll(selector).forEach((el) => el.setAttribute("data-skip-hydrate", "true"));
244
+ }
245
+ function collectDeferredBelowFoldBoundaries(root, foldY) {
246
+ const boundaries = [];
247
+ const stack = [];
248
+ for (let index = root.children.length - 1; index >= 0; index -= 1) stack.push(root.children[index]);
249
+ while (stack.length > 0) {
250
+ const element = stack.pop();
251
+ if (element.hasAttribute("data-skip-hydrate")) continue;
252
+ if (element.getBoundingClientRect().top >= foldY) {
253
+ element.setAttribute("data-skip-hydrate", "true");
254
+ boundaries.push(element);
255
+ continue;
256
+ }
257
+ for (let index = element.children.length - 1; index >= 0; index -= 1) stack.push(element.children[index]);
258
+ }
259
+ return boundaries;
260
+ }
261
+ function activateVisibleDeferredBoundaries(boundaries, foldY) {
262
+ let activated = false;
263
+ let remaining = 0;
264
+ for (const element of boundaries) {
265
+ if (!element.hasAttribute("data-skip-hydrate")) continue;
266
+ if (element.getBoundingClientRect().top < foldY) {
267
+ element.removeAttribute("data-skip-hydrate");
268
+ activated = true;
269
+ } else remaining += 1;
270
+ }
271
+ return {
272
+ activated,
273
+ remaining
274
+ };
275
+ }
276
+ function queueIdleWork(work) {
277
+ return new Promise((resolve) => {
278
+ if (typeof requestIdleCallback !== "undefined") {
279
+ requestIdleCallback(() => {
280
+ work();
281
+ resolve();
282
+ }, { timeout: 2e3 });
283
+ return;
284
+ }
285
+ setTimeout(() => {
286
+ work();
287
+ resolve();
288
+ }, 0);
289
+ });
290
+ }
291
+ function flushHydrationActivation(rootElement) {
292
+ const instance = instancesByRoot.get(rootElement);
293
+ if (!instance) return;
294
+ instance._enqueueRun?.();
295
+ globalScheduler.flush();
296
+ }
297
+ function shouldVerifyHydrationMarkup(config) {
298
+ const explicit = config.hydrate?.verifyMarkup;
299
+ if (typeof explicit === "boolean") return explicit;
300
+ return !isProductionEnvironment();
301
+ }
302
+ async function registerAppNavigation(rootElement, path) {
303
+ const instance = instancesByRoot.get(rootElement);
304
+ if (!instance) throw new Error("Internal error: app instance missing");
305
+ registerAppInstance(instance, path);
306
+ initializeNavigation();
307
+ }
308
+ /**
309
+ * Apply selective hydration with deferral options
310
+ */
311
+ async function applySelectiveHydration(rootElement, resolved, path, cleanupStrict, hydrateOptions) {
312
+ const hasPermanentSkips = (hydrateOptions.skipSelectors?.length ?? 0) > 0;
313
+ const hasBelowFoldDeferral = !!hydrateOptions.deferBelowFold;
314
+ const hasSelectiveBoundaries = hasPermanentSkips || hasBelowFoldDeferral;
315
+ if (hydrateOptions.skipSelectors?.length) markSkippedElements(rootElement, hydrateOptions.skipSelectors);
316
+ let deferredBoundaries = [];
317
+ if (hydrateOptions.deferBelowFold) {
318
+ const foldY = hydrateOptions.foldThreshold ?? window.innerHeight;
319
+ deferredBoundaries = collectDeferredBelowFoldBoundaries(rootElement, foldY);
320
+ const handleScroll = () => {
321
+ const { activated, remaining } = activateVisibleDeferredBoundaries(deferredBoundaries, foldY);
322
+ if (!activated) return;
323
+ flushHydrationActivation(rootElement);
324
+ if (remaining === 0) window.removeEventListener("scroll", handleScroll);
325
+ };
326
+ window.addEventListener("scroll", handleScroll, { passive: true });
327
+ }
328
+ if (hydrateOptions.deferUntilIdle && !hasSelectiveBoundaries) {
329
+ await queueIdleWork(() => {
330
+ mountOrUpdate(rootElement, (() => resolved.handler(resolved.params)), { cleanupStrict });
331
+ });
332
+ await registerAppNavigation(rootElement, path);
333
+ return;
334
+ }
335
+ mountOrUpdate(rootElement, (() => resolved.handler(resolved.params)), { cleanupStrict });
336
+ await registerAppNavigation(rootElement, path);
337
+ if (hydrateOptions.deferUntilIdle && deferredBoundaries.length > 0) await queueIdleWork(() => {
338
+ const { activated } = activateVisibleDeferredBoundaries(deferredBoundaries, Number.POSITIVE_INFINITY);
339
+ if (activated) flushHydrationActivation(rootElement);
340
+ });
341
+ }
342
+ /**
343
+ * hydrateSPA: Hydrate server-rendered HTML.
344
+ * Accepts either a `manifest` (preferred) or a legacy `routes` array.
345
+ */
346
+ async function hydrateSPA(config) {
347
+ assertExecutionModel("spa");
348
+ if (!config || typeof config !== "object") throw new Error("hydrateSPA requires a config object");
349
+ const hasManifest = config.manifest != null && config.manifest.records.length > 0;
350
+ const hasRoutes = Array.isArray(config.routes) && config.routes.length > 0;
351
+ if (!hasManifest && !hasRoutes) throw new Error("hydrateSPA requires a route manifest or route table. Pass `manifest: getManifest()` or `routes: getRoutes()`. If you are enhancing existing HTML, use createIsland instead.");
352
+ const rootElement = typeof config.root === "string" ? document.getElementById(config.root) : config.root;
353
+ if (!rootElement) throw new Error(`Root element not found: ${config.root}`);
354
+ const pendingLazyAtHydrationBoot = _snapshotLazy();
355
+ configureScrollRestoration(config.scrollRestoration);
356
+ clearRoutes();
357
+ if (hasManifest) _applyManifest(config.manifest);
358
+ else for (const r of config.routes) route(r.path, r.handler);
359
+ _setActiveRouteAuthOptions(config.auth ?? config.manifest?.auth);
360
+ await _drainLazy(pendingLazyAtHydrationBoot);
361
+ const path = typeof window !== "undefined" ? window.location.pathname : "/";
362
+ const currentUrl = typeof window !== "undefined" ? `${window.location.pathname}${window.location.search}${window.location.hash}` : path;
363
+ setServerLocation(currentUrl);
364
+ if (isProductionEnvironment()) lockRouteRegistration();
365
+ const resolved = resolveRoute(path);
366
+ if (!resolved) throw new Error(`hydrateSPA: no route found for current path (${path}).`);
367
+ const legacyRouteTable = hasManifest ? config.manifest.records.map((r) => ({
368
+ path: r.path,
369
+ handler: r.handler,
370
+ namespace: r.options.namespace
371
+ })) : config.routes;
372
+ if (shouldVerifyHydrationMarkup(config)) {
373
+ const { verifyHydrationSyncForUrl } = await import("../ssr/index.js");
374
+ if (!verifyHydrationSyncForUrl({
375
+ root: rootElement,
376
+ url: currentUrl,
377
+ routes: legacyRouteTable
378
+ })) throw new Error("[Askr] Hydration mismatch detected. Server HTML does not match expected server-render output.");
379
+ }
380
+ const hydrateOptions = config.hydrate;
381
+ if (hydrateOptions) {
382
+ if (hydrateOptions.deferUntilIdle || hydrateOptions.deferBelowFold) {
383
+ await applySelectiveHydration(rootElement, {
384
+ handler: resolved.handler,
385
+ params: resolved.params
386
+ }, path, config.cleanupStrict, hydrateOptions);
387
+ return;
388
+ }
389
+ if (hydrateOptions.skipSelectors?.length) markSkippedElements(rootElement, hydrateOptions.skipSelectors);
390
+ }
391
+ mountOrUpdate(rootElement, bindResolvedRouteHandler(resolved), { cleanupStrict: config.cleanupStrict });
392
+ await registerAppNavigation(rootElement, path);
393
+ }
394
+ /**
395
+ * Cleanup an app mounted on a root element (element or id).
396
+ * Safe to call multiple times — no-op when nothing is mounted.
397
+ */
398
+ function cleanupApp(root) {
399
+ const rootElement = typeof root === "string" ? document.getElementById(root) : root;
400
+ if (!rootElement) return;
401
+ const cleanupFn = rootElement[CLEANUP_SYMBOL];
402
+ if (typeof cleanupFn === "function") cleanupFn();
403
+ instancesByRoot.delete(rootElement);
404
+ }
405
+ /**
406
+ * Check whether an app is mounted on the given root
407
+ */
408
+ function hasApp(root) {
409
+ const rootElement = typeof root === "string" ? document.getElementById(root) : root;
410
+ if (!rootElement) return false;
411
+ return instancesByRoot.has(rootElement);
412
+ }
413
+ //#endregion
414
+ export { cleanupApp, createIsland, createIslands, createSPA, hasApp, hydrateSPA, teardownApp };
415
+
416
+ //# sourceMappingURL=index.js.map