@askrjs/askr 0.0.51 → 0.0.53

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 (651) hide show
  1. package/README.md +5 -1
  2. package/dist/{runtime/scheduler.js → access-Bg4RJNC8.js} +190 -20
  3. package/dist/actions/index.d.ts +2 -0
  4. package/dist/actions/index.js +103 -0
  5. package/dist/{common/attr-names.js → attr-names-CjhzmHOn.js} +1 -3
  6. package/dist/benchmark.d.ts +7 -4
  7. package/dist/benchmark.js +63 -13
  8. package/dist/boot/index.d.ts +62 -4
  9. package/dist/boot/index.js +1 -194
  10. package/dist/boot-j2KoN6ss.js +647 -0
  11. package/dist/cleanup-COv77su2.js +487 -0
  12. package/dist/component-internal-B3z7GXlD.js +614 -0
  13. package/dist/component-lifecycle-CO4hXlP4.js +357 -0
  14. package/dist/{runtime/component-scope.js → component-scope-CC3cojX9.js} +35 -9
  15. package/dist/component-scope-CvPba6O6.d.ts +12 -0
  16. package/dist/components/index.d.ts +17 -2
  17. package/dist/components/index.js +39 -1
  18. package/dist/compose-ref-Cc_YkUpM.js +92 -0
  19. package/dist/{foundations/utilities/compose-ref.d.ts → compose-ref-Cizq72-x.d.ts} +1 -2
  20. package/dist/control/index.d.ts +1 -3
  21. package/dist/control/index.js +1 -3
  22. package/dist/control-BQvNVfAd.d.ts +436 -0
  23. package/dist/control-BYyLTFyw.js +165 -0
  24. package/dist/control-Bf4Wkdvv.d.ts +9 -0
  25. package/dist/{common/control.js → control-DhFRTIoE.js} +1 -3
  26. package/dist/data/index.d.ts +2 -6
  27. package/dist/data/index.js +4 -5
  28. package/dist/data-DnxnDxD-.js +559 -0
  29. package/dist/{data/data-runtime.js → data-runtime-SJ1BSUvk.js} +35 -36
  30. package/dist/deferred-lKE8uR0z.js +386 -0
  31. package/dist/effect-BwnIvLah.js +260 -0
  32. package/dist/fastlane-Dw8SOBr9.js +343 -0
  33. package/dist/for-internal-BKf_Tnv1.js +1563 -0
  34. package/dist/foundations/icon/index.d.ts +68 -2
  35. package/dist/foundations/icon/index.js +85 -1
  36. package/dist/foundations/index.d.ts +2 -5
  37. package/dist/foundations/index.js +2 -5
  38. package/dist/foundations/interactions/index.d.ts +264 -6
  39. package/dist/foundations/interactions/index.js +1 -6
  40. package/dist/foundations/state/index.d.ts +32 -1
  41. package/dist/foundations/state/index.js +78 -1
  42. package/dist/foundations/structures/index.d.ts +2 -7
  43. package/dist/foundations/structures/index.js +2 -7
  44. package/dist/foundations/utilities/index.d.ts +2 -6
  45. package/dist/foundations/utilities/index.js +2 -5
  46. package/dist/fx/index.d.ts +190 -3
  47. package/dist/fx/index.js +454 -4
  48. package/dist/index-31Uoz_NS.d.ts +239 -0
  49. package/dist/index-Bki2rqcr.d.ts +233 -0
  50. package/dist/index-BnU0NPwM.d.ts +101 -0
  51. package/dist/index-D73jgYx1.d.ts +48 -0
  52. package/dist/{runtime/runtime.d.ts → index-R2JJIbM-.d.ts} +31 -9
  53. package/dist/index-SJXJkssx.d.ts +44 -0
  54. package/dist/index.d.ts +8 -13
  55. package/dist/index.js +150 -17
  56. package/dist/interactions-w7gQN4ha.js +280 -0
  57. package/dist/{data/invalidation-listeners.js → invalidation-listeners-Des3AHYs.js} +1 -3
  58. package/dist/{common/props.d.ts → jsx-CP0gmYwJ.d.ts} +17 -6
  59. package/dist/{common/jsx.js → jsx-CUpRxrLH.js} +1 -3
  60. package/dist/jsx-dev-runtime.d.ts +17 -5
  61. package/dist/jsx-dev-runtime.js +3 -10
  62. package/dist/jsx-runtime-92bV2hSa.d.ts +34 -0
  63. package/dist/jsx-runtime-BVVgDSdq.d.ts +1 -0
  64. package/dist/jsx-runtime.d.ts +3 -22
  65. package/dist/jsx-runtime.js +17 -20
  66. package/dist/{runtime/lifecycle-operations.js → lifecycle-operations-D9va7GOU.js} +9 -11
  67. package/dist/navigate-BVDCzOuB.d.ts +34 -0
  68. package/dist/navigate-CmPLSXyw.js +1449 -0
  69. package/dist/{runtime/portal.js → portal-CyU3Ucf2.js} +124 -35
  70. package/dist/query-registry-CQIT4mXr.js +73 -0
  71. package/dist/{common/render-context.js → render-context-Clw3rFiO.js} +14 -8
  72. package/dist/renderer-DzPjeLby.js +6197 -0
  73. package/dist/resource-operation-CEzfpnDk.js +276 -0
  74. package/dist/resources/index.d.ts +42 -3
  75. package/dist/resources/index.js +3 -4
  76. package/dist/{common/route-activity.js → route-activity-CNJfpwx-.js} +1 -3
  77. package/dist/route-matching-vJpvLVbX.js +515 -0
  78. package/dist/router/index.d.ts +166 -14
  79. package/dist/router/index.js +150 -12
  80. package/dist/{common/router.d.ts → router-CeYvjj5_.d.ts} +72 -29
  81. package/dist/{common/router-internal.js → router-internal-BC0w1_xk.js} +1 -3
  82. package/dist/{runtime/scheduler.d.ts → scheduler-CmLO4Dfm.d.ts} +1 -4
  83. package/dist/{runtime/selector.js → selector-DafVYzV4.js} +35 -20
  84. package/dist/{runtime/snapshot-source.js → snapshot-source-BB42xgwb.js} +1 -3
  85. package/dist/ssg/index.d.ts +252 -4
  86. package/dist/ssg/index.js +857 -1
  87. package/dist/ssr/index.d.ts +225 -8
  88. package/dist/ssr/index.js +3 -6
  89. package/dist/{common/ssr.js → ssr-CbQO5xd3.js} +1 -3
  90. package/dist/ssr-D3t80Rc0.js +1413 -0
  91. package/dist/{runtime/state.js → state-DPl8lffD.js} +4 -8
  92. package/dist/structures-DUB3HchX.js +221 -0
  93. package/dist/testing/index.d.ts +4 -4
  94. package/dist/testing/index.js +2 -7
  95. package/dist/{jsx/types.d.ts → types-DnQVG4ZY.d.ts} +2 -6
  96. package/dist/{foundations/utilities/use-id.js → utilities-C_CGX4Dz.js} +1 -3
  97. package/dist/{ssr/verify-hydration.js → verify-hydration-io9ahUeq.js} +2 -4
  98. package/dist/{common/vnode.js → vnode-CGMJYPMB.js} +2 -4
  99. package/package.json +63 -45
  100. package/dist/bench/components/benchmark-row.d.ts +0 -20
  101. package/dist/bench/components/benchmark-row.d.ts.map +0 -1
  102. package/dist/bench/components/benchmark-row.js +0 -42
  103. package/dist/bench/components/benchmark-row.js.map +0 -1
  104. package/dist/bench/components/benchmark-table.js +0 -25
  105. package/dist/bench/components/benchmark-table.js.map +0 -1
  106. package/dist/benchmark.d.ts.map +0 -1
  107. package/dist/benchmark.js.map +0 -1
  108. package/dist/bin/askr-ssg.d.ts +0 -28
  109. package/dist/bin/askr-ssg.d.ts.map +0 -1
  110. package/dist/bin/askr-ssg.js +0 -171
  111. package/dist/bin/askr-ssg.js.map +0 -1
  112. package/dist/boot/hydration.js +0 -140
  113. package/dist/boot/hydration.js.map +0 -1
  114. package/dist/boot/index.d.ts.map +0 -1
  115. package/dist/boot/index.js.map +0 -1
  116. package/dist/boot/root-lifecycle.d.ts +0 -15
  117. package/dist/boot/root-lifecycle.d.ts.map +0 -1
  118. package/dist/boot/root-lifecycle.js +0 -205
  119. package/dist/boot/root-lifecycle.js.map +0 -1
  120. package/dist/boot/route-startup.js +0 -45
  121. package/dist/boot/route-startup.js.map +0 -1
  122. package/dist/boot/types.d.ts +0 -62
  123. package/dist/boot/types.d.ts.map +0 -1
  124. package/dist/common/attr-names.js.map +0 -1
  125. package/dist/common/component.d.ts +0 -19
  126. package/dist/common/component.d.ts.map +0 -1
  127. package/dist/common/control.d.ts +0 -13
  128. package/dist/common/control.d.ts.map +0 -1
  129. package/dist/common/control.js.map +0 -1
  130. package/dist/common/env.js +0 -47
  131. package/dist/common/env.js.map +0 -1
  132. package/dist/common/error-boundary.d.ts +0 -16
  133. package/dist/common/error-boundary.d.ts.map +0 -1
  134. package/dist/common/invariant.js +0 -17
  135. package/dist/common/invariant.js.map +0 -1
  136. package/dist/common/jsx.d.ts +0 -23
  137. package/dist/common/jsx.d.ts.map +0 -1
  138. package/dist/common/jsx.js.map +0 -1
  139. package/dist/common/logger.js +0 -36
  140. package/dist/common/logger.js.map +0 -1
  141. package/dist/common/promise.js +0 -8
  142. package/dist/common/promise.js.map +0 -1
  143. package/dist/common/props.d.ts.map +0 -1
  144. package/dist/common/render-context.js.map +0 -1
  145. package/dist/common/route-activity.js.map +0 -1
  146. package/dist/common/router-internal.js.map +0 -1
  147. package/dist/common/router.d.ts.map +0 -1
  148. package/dist/common/ssr-errors.d.ts +0 -11
  149. package/dist/common/ssr-errors.d.ts.map +0 -1
  150. package/dist/common/ssr-errors.js +0 -16
  151. package/dist/common/ssr-errors.js.map +0 -1
  152. package/dist/common/ssr.d.ts +0 -42
  153. package/dist/common/ssr.d.ts.map +0 -1
  154. package/dist/common/ssr.js.map +0 -1
  155. package/dist/common/vnode.d.ts +0 -22
  156. package/dist/common/vnode.d.ts.map +0 -1
  157. package/dist/common/vnode.js.map +0 -1
  158. package/dist/components/error-boundary.d.ts +0 -15
  159. package/dist/components/error-boundary.d.ts.map +0 -1
  160. package/dist/components/error-boundary.js +0 -43
  161. package/dist/components/error-boundary.js.map +0 -1
  162. package/dist/components/link.d.ts +0 -68
  163. package/dist/components/link.d.ts.map +0 -1
  164. package/dist/components/link.js +0 -76
  165. package/dist/components/link.js.map +0 -1
  166. package/dist/control/case.d.ts +0 -19
  167. package/dist/control/case.d.ts.map +0 -1
  168. package/dist/control/case.js +0 -70
  169. package/dist/control/case.js.map +0 -1
  170. package/dist/control/for.d.ts +0 -24
  171. package/dist/control/for.d.ts.map +0 -1
  172. package/dist/control/for.js +0 -63
  173. package/dist/control/for.js.map +0 -1
  174. package/dist/control/shared.d.ts +0 -9
  175. package/dist/control/shared.d.ts.map +0 -1
  176. package/dist/control/shared.js +0 -20
  177. package/dist/control/shared.js.map +0 -1
  178. package/dist/control/show.d.ts +0 -15
  179. package/dist/control/show.d.ts.map +0 -1
  180. package/dist/control/show.js +0 -34
  181. package/dist/control/show.js.map +0 -1
  182. package/dist/data/data-runtime.d.ts +0 -28
  183. package/dist/data/data-runtime.d.ts.map +0 -1
  184. package/dist/data/data-runtime.js.map +0 -1
  185. package/dist/data/invalidation-listeners.js.map +0 -1
  186. package/dist/data/invalidation.d.ts +0 -9
  187. package/dist/data/invalidation.d.ts.map +0 -1
  188. package/dist/data/invalidation.js +0 -27
  189. package/dist/data/invalidation.js.map +0 -1
  190. package/dist/data/mutation-cell.d.ts +0 -28
  191. package/dist/data/mutation-cell.d.ts.map +0 -1
  192. package/dist/data/mutation-cell.js +0 -132
  193. package/dist/data/mutation-cell.js.map +0 -1
  194. package/dist/data/query-cell.d.ts +0 -46
  195. package/dist/data/query-cell.d.ts.map +0 -1
  196. package/dist/data/query-cell.js +0 -290
  197. package/dist/data/query-cell.js.map +0 -1
  198. package/dist/data/query-key.js +0 -42
  199. package/dist/data/query-key.js.map +0 -1
  200. package/dist/data/shared.js +0 -21
  201. package/dist/data/shared.js.map +0 -1
  202. package/dist/data/testing.js +0 -2
  203. package/dist/data/types.d.ts +0 -161
  204. package/dist/data/types.d.ts.map +0 -1
  205. package/dist/foundations/icon/icon.d.ts +0 -53
  206. package/dist/foundations/icon/icon.d.ts.map +0 -1
  207. package/dist/foundations/icon/icon.js +0 -88
  208. package/dist/foundations/icon/icon.js.map +0 -1
  209. package/dist/foundations/icon/icon.types.d.ts +0 -22
  210. package/dist/foundations/icon/icon.types.d.ts.map +0 -1
  211. package/dist/foundations/interactions/dismissable.d.ts +0 -72
  212. package/dist/foundations/interactions/dismissable.d.ts.map +0 -1
  213. package/dist/foundations/interactions/dismissable.js +0 -26
  214. package/dist/foundations/interactions/dismissable.js.map +0 -1
  215. package/dist/foundations/interactions/focusable.d.ts +0 -22
  216. package/dist/foundations/interactions/focusable.d.ts.map +0 -1
  217. package/dist/foundations/interactions/focusable.js +0 -18
  218. package/dist/foundations/interactions/focusable.js.map +0 -1
  219. package/dist/foundations/interactions/hoverable.d.ts +0 -26
  220. package/dist/foundations/interactions/hoverable.d.ts.map +0 -1
  221. package/dist/foundations/interactions/hoverable.js +0 -15
  222. package/dist/foundations/interactions/hoverable.js.map +0 -1
  223. package/dist/foundations/interactions/interaction-policy.d.ts +0 -50
  224. package/dist/foundations/interactions/interaction-policy.d.ts.map +0 -1
  225. package/dist/foundations/interactions/interaction-policy.js +0 -122
  226. package/dist/foundations/interactions/interaction-policy.js.map +0 -1
  227. package/dist/foundations/interactions/pressable.d.ts +0 -61
  228. package/dist/foundations/interactions/pressable.d.ts.map +0 -1
  229. package/dist/foundations/interactions/pressable.js +0 -51
  230. package/dist/foundations/interactions/pressable.js.map +0 -1
  231. package/dist/foundations/interactions/roving-focus.d.ts +0 -52
  232. package/dist/foundations/interactions/roving-focus.d.ts.map +0 -1
  233. package/dist/foundations/interactions/roving-focus.js +0 -71
  234. package/dist/foundations/interactions/roving-focus.js.map +0 -1
  235. package/dist/foundations/state/controllable.d.ts +0 -33
  236. package/dist/foundations/state/controllable.d.ts.map +0 -1
  237. package/dist/foundations/state/controllable.js +0 -82
  238. package/dist/foundations/state/controllable.js.map +0 -1
  239. package/dist/foundations/structures/collection.d.ts +0 -52
  240. package/dist/foundations/structures/collection.d.ts.map +0 -1
  241. package/dist/foundations/structures/collection.js +0 -51
  242. package/dist/foundations/structures/collection.js.map +0 -1
  243. package/dist/foundations/structures/layer.d.ts +0 -81
  244. package/dist/foundations/structures/layer.d.ts.map +0 -1
  245. package/dist/foundations/structures/layer.js +0 -81
  246. package/dist/foundations/structures/layer.js.map +0 -1
  247. package/dist/foundations/structures/layout.d.ts +0 -33
  248. package/dist/foundations/structures/layout.d.ts.map +0 -1
  249. package/dist/foundations/structures/layout.js +0 -13
  250. package/dist/foundations/structures/layout.js.map +0 -1
  251. package/dist/foundations/structures/portal.d.ts +0 -2
  252. package/dist/foundations/structures/portal.js +0 -3
  253. package/dist/foundations/structures/presence.d.ts +0 -37
  254. package/dist/foundations/structures/presence.d.ts.map +0 -1
  255. package/dist/foundations/structures/presence.js +0 -39
  256. package/dist/foundations/structures/presence.js.map +0 -1
  257. package/dist/foundations/structures/slot.d.ts +0 -35
  258. package/dist/foundations/structures/slot.d.ts.map +0 -1
  259. package/dist/foundations/structures/slot.js +0 -41
  260. package/dist/foundations/structures/slot.js.map +0 -1
  261. package/dist/foundations/utilities/aria.d.ts +0 -16
  262. package/dist/foundations/utilities/aria.d.ts.map +0 -1
  263. package/dist/foundations/utilities/aria.js +0 -17
  264. package/dist/foundations/utilities/aria.js.map +0 -1
  265. package/dist/foundations/utilities/compose-handlers.d.ts +0 -37
  266. package/dist/foundations/utilities/compose-handlers.d.ts.map +0 -1
  267. package/dist/foundations/utilities/compose-handlers.js +0 -20
  268. package/dist/foundations/utilities/compose-handlers.js.map +0 -1
  269. package/dist/foundations/utilities/compose-ref.d.ts.map +0 -1
  270. package/dist/foundations/utilities/compose-ref.js +0 -18
  271. package/dist/foundations/utilities/compose-ref.js.map +0 -1
  272. package/dist/foundations/utilities/event-types.d.ts +0 -20
  273. package/dist/foundations/utilities/event-types.d.ts.map +0 -1
  274. package/dist/foundations/utilities/merge-props.d.ts +0 -5
  275. package/dist/foundations/utilities/merge-props.d.ts.map +0 -1
  276. package/dist/foundations/utilities/merge-props.js +0 -49
  277. package/dist/foundations/utilities/merge-props.js.map +0 -1
  278. package/dist/foundations/utilities/use-id.d.ts +0 -32
  279. package/dist/foundations/utilities/use-id.d.ts.map +0 -1
  280. package/dist/foundations/utilities/use-id.js.map +0 -1
  281. package/dist/fx/fx.d.ts +0 -33
  282. package/dist/fx/fx.d.ts.map +0 -1
  283. package/dist/fx/fx.js +0 -213
  284. package/dist/fx/fx.js.map +0 -1
  285. package/dist/fx/noop.js +0 -9
  286. package/dist/fx/noop.js.map +0 -1
  287. package/dist/fx/timing.d.ts +0 -159
  288. package/dist/fx/timing.d.ts.map +0 -1
  289. package/dist/fx/timing.js +0 -243
  290. package/dist/fx/timing.js.map +0 -1
  291. package/dist/index.js.map +0 -1
  292. package/dist/jsx/index.d.ts +0 -2
  293. package/dist/jsx/index.js +0 -4
  294. package/dist/jsx/types.d.ts.map +0 -1
  295. package/dist/jsx/types.js +0 -2
  296. package/dist/jsx/utils.d.ts +0 -5
  297. package/dist/jsx/utils.d.ts.map +0 -1
  298. package/dist/jsx/utils.js +0 -19
  299. package/dist/jsx/utils.js.map +0 -1
  300. package/dist/jsx-dev-runtime.d.ts.map +0 -1
  301. package/dist/jsx-dev-runtime.js.map +0 -1
  302. package/dist/jsx-runtime.d.ts.map +0 -1
  303. package/dist/jsx-runtime.js.map +0 -1
  304. package/dist/jsx-runtime2.d.ts +0 -3
  305. package/dist/jsx-runtime2.js +0 -4
  306. package/dist/renderer/attributes.js +0 -232
  307. package/dist/renderer/attributes.js.map +0 -1
  308. package/dist/renderer/boundaries.js +0 -266
  309. package/dist/renderer/boundaries.js.map +0 -1
  310. package/dist/renderer/child-shape.js +0 -85
  311. package/dist/renderer/child-shape.js.map +0 -1
  312. package/dist/renderer/children-fastpath.js +0 -149
  313. package/dist/renderer/children-fastpath.js.map +0 -1
  314. package/dist/renderer/children.js +0 -160
  315. package/dist/renderer/children.js.map +0 -1
  316. package/dist/renderer/cleanup.js +0 -210
  317. package/dist/renderer/cleanup.js.map +0 -1
  318. package/dist/renderer/component-host-cleanup.js +0 -68
  319. package/dist/renderer/component-host-cleanup.js.map +0 -1
  320. package/dist/renderer/component-host-instances.js +0 -65
  321. package/dist/renderer/component-host-instances.js.map +0 -1
  322. package/dist/renderer/component-host.js +0 -247
  323. package/dist/renderer/component-host.js.map +0 -1
  324. package/dist/renderer/dom-host.js +0 -13
  325. package/dist/renderer/dom-host.js.map +0 -1
  326. package/dist/renderer/dom-internal.js +0 -186
  327. package/dist/renderer/dom-internal.js.map +0 -1
  328. package/dist/renderer/dom.js +0 -10
  329. package/dist/renderer/element-children.js +0 -279
  330. package/dist/renderer/element-children.js.map +0 -1
  331. package/dist/renderer/env.js +0 -2
  332. package/dist/renderer/error-boundary-dom.js +0 -78
  333. package/dist/renderer/error-boundary-dom.js.map +0 -1
  334. package/dist/renderer/evaluate-dom-range.js +0 -85
  335. package/dist/renderer/evaluate-dom-range.js.map +0 -1
  336. package/dist/renderer/evaluate-reconcile.js +0 -282
  337. package/dist/renderer/evaluate-reconcile.js.map +0 -1
  338. package/dist/renderer/evaluate.js +0 -84
  339. package/dist/renderer/evaluate.js.map +0 -1
  340. package/dist/renderer/fastpath.js +0 -150
  341. package/dist/renderer/fastpath.js.map +0 -1
  342. package/dist/renderer/for-commit-dom-map.js +0 -83
  343. package/dist/renderer/for-commit-dom-map.js.map +0 -1
  344. package/dist/renderer/for-commit-removal.js +0 -36
  345. package/dist/renderer/for-commit-removal.js.map +0 -1
  346. package/dist/renderer/for-commit-reorder.js +0 -89
  347. package/dist/renderer/for-commit-reorder.js.map +0 -1
  348. package/dist/renderer/for-commit.js +0 -314
  349. package/dist/renderer/for-commit.js.map +0 -1
  350. package/dist/renderer/index.js +0 -38
  351. package/dist/renderer/index.js.map +0 -1
  352. package/dist/renderer/keyed-children.js +0 -32
  353. package/dist/renderer/keyed-children.js.map +0 -1
  354. package/dist/renderer/keyed.js +0 -167
  355. package/dist/renderer/keyed.js.map +0 -1
  356. package/dist/renderer/namespaces.js +0 -23
  357. package/dist/renderer/namespaces.js.map +0 -1
  358. package/dist/renderer/prop-bindings.js +0 -280
  359. package/dist/renderer/prop-bindings.js.map +0 -1
  360. package/dist/renderer/reactive-child-dom.js +0 -133
  361. package/dist/renderer/reactive-child-dom.js.map +0 -1
  362. package/dist/renderer/reactive-child-sources.js +0 -184
  363. package/dist/renderer/reactive-child-sources.js.map +0 -1
  364. package/dist/renderer/reactive-children.js +0 -294
  365. package/dist/renderer/reactive-children.js.map +0 -1
  366. package/dist/renderer/reconcile-commit.js +0 -38
  367. package/dist/renderer/reconcile-commit.js.map +0 -1
  368. package/dist/renderer/reconcile-fastpaths.js +0 -107
  369. package/dist/renderer/reconcile-fastpaths.js.map +0 -1
  370. package/dist/renderer/reconcile-resolution.js +0 -187
  371. package/dist/renderer/reconcile-resolution.js.map +0 -1
  372. package/dist/renderer/reconcile.js +0 -39
  373. package/dist/renderer/reconcile.js.map +0 -1
  374. package/dist/renderer/retained-element-rollback.js +0 -277
  375. package/dist/renderer/retained-element-rollback.js.map +0 -1
  376. package/dist/renderer/stable-patch.js +0 -81
  377. package/dist/renderer/stable-patch.js.map +0 -1
  378. package/dist/renderer/static-reuse.js +0 -96
  379. package/dist/renderer/static-reuse.js.map +0 -1
  380. package/dist/renderer/types.js +0 -2
  381. package/dist/renderer/utils.js +0 -256
  382. package/dist/renderer/utils.js.map +0 -1
  383. package/dist/router/access.js +0 -36
  384. package/dist/router/access.js.map +0 -1
  385. package/dist/router/activity.d.ts +0 -10
  386. package/dist/router/activity.d.ts.map +0 -1
  387. package/dist/router/activity.js +0 -87
  388. package/dist/router/activity.js.map +0 -1
  389. package/dist/router/authoring.d.ts +0 -22
  390. package/dist/router/authoring.d.ts.map +0 -1
  391. package/dist/router/authoring.js +0 -198
  392. package/dist/router/authoring.js.map +0 -1
  393. package/dist/router/internal-types.d.ts +0 -31
  394. package/dist/router/internal-types.d.ts.map +0 -1
  395. package/dist/router/lazy.d.ts +0 -19
  396. package/dist/router/lazy.d.ts.map +0 -1
  397. package/dist/router/lazy.js +0 -52
  398. package/dist/router/lazy.js.map +0 -1
  399. package/dist/router/manifest.d.ts +0 -10
  400. package/dist/router/manifest.d.ts.map +0 -1
  401. package/dist/router/manifest.js +0 -49
  402. package/dist/router/manifest.js.map +0 -1
  403. package/dist/router/match.js +0 -122
  404. package/dist/router/match.js.map +0 -1
  405. package/dist/router/navigate.d.ts +0 -11
  406. package/dist/router/navigate.d.ts.map +0 -1
  407. package/dist/router/navigate.js +0 -76
  408. package/dist/router/navigate.js.map +0 -1
  409. package/dist/router/navigation-registry.d.ts +0 -32
  410. package/dist/router/navigation-registry.d.ts.map +0 -1
  411. package/dist/router/navigation-registry.js +0 -105
  412. package/dist/router/navigation-registry.js.map +0 -1
  413. package/dist/router/navigation-scroll.d.ts +0 -14
  414. package/dist/router/navigation-scroll.d.ts.map +0 -1
  415. package/dist/router/navigation-scroll.js +0 -93
  416. package/dist/router/navigation-scroll.js.map +0 -1
  417. package/dist/router/navigation-targets.d.ts +0 -31
  418. package/dist/router/navigation-targets.d.ts.map +0 -1
  419. package/dist/router/navigation-targets.js +0 -255
  420. package/dist/router/navigation-targets.js.map +0 -1
  421. package/dist/router/policy.d.ts +0 -28
  422. package/dist/router/policy.d.ts.map +0 -1
  423. package/dist/router/policy.js +0 -132
  424. package/dist/router/policy.js.map +0 -1
  425. package/dist/router/rendering.d.ts +0 -10
  426. package/dist/router/rendering.d.ts.map +0 -1
  427. package/dist/router/rendering.js +0 -46
  428. package/dist/router/rendering.js.map +0 -1
  429. package/dist/router/resolution.d.ts +0 -4
  430. package/dist/router/resolution.d.ts.map +0 -1
  431. package/dist/router/resolution.js +0 -86
  432. package/dist/router/resolution.js.map +0 -1
  433. package/dist/router/route-context.js +0 -79
  434. package/dist/router/route-context.js.map +0 -1
  435. package/dist/router/route-matching.d.ts +0 -20
  436. package/dist/router/route-matching.d.ts.map +0 -1
  437. package/dist/router/route-matching.js +0 -175
  438. package/dist/router/route-matching.js.map +0 -1
  439. package/dist/router/route-query.d.ts +0 -17
  440. package/dist/router/route-query.d.ts.map +0 -1
  441. package/dist/router/route-query.js +0 -47
  442. package/dist/router/route-query.js.map +0 -1
  443. package/dist/router/route.d.ts +0 -8
  444. package/dist/router/route.js +0 -10
  445. package/dist/router/store.d.ts +0 -50
  446. package/dist/router/store.d.ts.map +0 -1
  447. package/dist/router/store.js +0 -171
  448. package/dist/router/store.js.map +0 -1
  449. package/dist/router/testing.js +0 -4
  450. package/dist/runtime/access.d.ts +0 -20
  451. package/dist/runtime/access.d.ts.map +0 -1
  452. package/dist/runtime/access.js +0 -45
  453. package/dist/runtime/access.js.map +0 -1
  454. package/dist/runtime/child-scope.d.ts +0 -22
  455. package/dist/runtime/child-scope.d.ts.map +0 -1
  456. package/dist/runtime/child-scope.js +0 -87
  457. package/dist/runtime/child-scope.js.map +0 -1
  458. package/dist/runtime/component-cleanup.d.ts +0 -16
  459. package/dist/runtime/component-cleanup.d.ts.map +0 -1
  460. package/dist/runtime/component-cleanup.js +0 -70
  461. package/dist/runtime/component-cleanup.js.map +0 -1
  462. package/dist/runtime/component-commit.js +0 -165
  463. package/dist/runtime/component-commit.js.map +0 -1
  464. package/dist/runtime/component-facade.d.ts +0 -5
  465. package/dist/runtime/component-facade.js +0 -4
  466. package/dist/runtime/component-internal.d.ts +0 -100
  467. package/dist/runtime/component-internal.d.ts.map +0 -1
  468. package/dist/runtime/component-internal.js +0 -219
  469. package/dist/runtime/component-internal.js.map +0 -1
  470. package/dist/runtime/component-lifecycle.d.ts +0 -49
  471. package/dist/runtime/component-lifecycle.d.ts.map +0 -1
  472. package/dist/runtime/component-lifecycle.js +0 -176
  473. package/dist/runtime/component-lifecycle.js.map +0 -1
  474. package/dist/runtime/component-scope.d.ts +0 -55
  475. package/dist/runtime/component-scope.d.ts.map +0 -1
  476. package/dist/runtime/component-scope.js.map +0 -1
  477. package/dist/runtime/component.d.ts +0 -5
  478. package/dist/runtime/component.js +0 -5
  479. package/dist/runtime/context.d.ts +0 -69
  480. package/dist/runtime/context.d.ts.map +0 -1
  481. package/dist/runtime/context.js +0 -210
  482. package/dist/runtime/context.js.map +0 -1
  483. package/dist/runtime/control.d.ts +0 -43
  484. package/dist/runtime/control.d.ts.map +0 -1
  485. package/dist/runtime/control.js +0 -126
  486. package/dist/runtime/control.js.map +0 -1
  487. package/dist/runtime/derive.d.ts +0 -17
  488. package/dist/runtime/derive.d.ts.map +0 -1
  489. package/dist/runtime/derive.js +0 -142
  490. package/dist/runtime/derive.js.map +0 -1
  491. package/dist/runtime/dev-namespace.d.ts +0 -31
  492. package/dist/runtime/dev-namespace.d.ts.map +0 -1
  493. package/dist/runtime/dev-namespace.js +0 -57
  494. package/dist/runtime/dev-namespace.js.map +0 -1
  495. package/dist/runtime/effect.d.ts +0 -32
  496. package/dist/runtime/effect.d.ts.map +0 -1
  497. package/dist/runtime/effect.js +0 -177
  498. package/dist/runtime/effect.js.map +0 -1
  499. package/dist/runtime/error-boundary.d.ts +0 -5
  500. package/dist/runtime/error-boundary.d.ts.map +0 -1
  501. package/dist/runtime/error-boundary.js +0 -31
  502. package/dist/runtime/error-boundary.js.map +0 -1
  503. package/dist/runtime/events.d.ts +0 -58
  504. package/dist/runtime/events.d.ts.map +0 -1
  505. package/dist/runtime/events.js +0 -204
  506. package/dist/runtime/events.js.map +0 -1
  507. package/dist/runtime/execution-model.d.ts +0 -7
  508. package/dist/runtime/execution-model.d.ts.map +0 -1
  509. package/dist/runtime/execution-model.js +0 -15
  510. package/dist/runtime/execution-model.js.map +0 -1
  511. package/dist/runtime/fastlane.d.ts +0 -34
  512. package/dist/runtime/fastlane.d.ts.map +0 -1
  513. package/dist/runtime/fastlane.js +0 -175
  514. package/dist/runtime/fastlane.js.map +0 -1
  515. package/dist/runtime/for-bench.d.ts +0 -41
  516. package/dist/runtime/for-bench.d.ts.map +0 -1
  517. package/dist/runtime/for-bench.js +0 -171
  518. package/dist/runtime/for-bench.js.map +0 -1
  519. package/dist/runtime/for-internal.d.ts +0 -43
  520. package/dist/runtime/for-internal.d.ts.map +0 -1
  521. package/dist/runtime/for-internal.js +0 -98
  522. package/dist/runtime/for-internal.js.map +0 -1
  523. package/dist/runtime/for-reconcile.d.ts +0 -8
  524. package/dist/runtime/for-reconcile.d.ts.map +0 -1
  525. package/dist/runtime/for-reconcile.js +0 -389
  526. package/dist/runtime/for-reconcile.js.map +0 -1
  527. package/dist/runtime/for-scopes.d.ts +0 -26
  528. package/dist/runtime/for-scopes.d.ts.map +0 -1
  529. package/dist/runtime/for-scopes.js +0 -160
  530. package/dist/runtime/for-scopes.js.map +0 -1
  531. package/dist/runtime/for-signals.d.ts +0 -30
  532. package/dist/runtime/for-signals.d.ts.map +0 -1
  533. package/dist/runtime/for-signals.js +0 -139
  534. package/dist/runtime/for-signals.js.map +0 -1
  535. package/dist/runtime/for-types.d.ts +0 -9
  536. package/dist/runtime/for-types.d.ts.map +0 -1
  537. package/dist/runtime/for.d.ts +0 -4
  538. package/dist/runtime/for.js +0 -5
  539. package/dist/runtime/index.d.ts +0 -24
  540. package/dist/runtime/index.js +0 -31
  541. package/dist/runtime/lifecycle-operations.d.ts +0 -31
  542. package/dist/runtime/lifecycle-operations.d.ts.map +0 -1
  543. package/dist/runtime/lifecycle-operations.js.map +0 -1
  544. package/dist/runtime/operations.d.ts +0 -3
  545. package/dist/runtime/operations.js +0 -3
  546. package/dist/runtime/perf-metrics.d.ts +0 -26
  547. package/dist/runtime/perf-metrics.d.ts.map +0 -1
  548. package/dist/runtime/perf-metrics.js +0 -70
  549. package/dist/runtime/perf-metrics.js.map +0 -1
  550. package/dist/runtime/portal.d.ts +0 -22
  551. package/dist/runtime/portal.d.ts.map +0 -1
  552. package/dist/runtime/portal.js.map +0 -1
  553. package/dist/runtime/readable.d.ts +0 -29
  554. package/dist/runtime/readable.d.ts.map +0 -1
  555. package/dist/runtime/readable.js +0 -159
  556. package/dist/runtime/readable.js.map +0 -1
  557. package/dist/runtime/resource-cell.js +0 -114
  558. package/dist/runtime/resource-cell.js.map +0 -1
  559. package/dist/runtime/resource-operation.d.ts +0 -13
  560. package/dist/runtime/resource-operation.d.ts.map +0 -1
  561. package/dist/runtime/resource-operation.js +0 -170
  562. package/dist/runtime/resource-operation.js.map +0 -1
  563. package/dist/runtime/runtime.d.ts.map +0 -1
  564. package/dist/runtime/runtime.js +0 -59
  565. package/dist/runtime/runtime.js.map +0 -1
  566. package/dist/runtime/scheduler.d.ts.map +0 -1
  567. package/dist/runtime/scheduler.js.map +0 -1
  568. package/dist/runtime/selector-store.js +0 -24
  569. package/dist/runtime/selector-store.js.map +0 -1
  570. package/dist/runtime/selector.d.ts +0 -11
  571. package/dist/runtime/selector.d.ts.map +0 -1
  572. package/dist/runtime/selector.js.map +0 -1
  573. package/dist/runtime/snapshot-source.d.ts +0 -10
  574. package/dist/runtime/snapshot-source.d.ts.map +0 -1
  575. package/dist/runtime/snapshot-source.js.map +0 -1
  576. package/dist/runtime/state.d.ts +0 -55
  577. package/dist/runtime/state.d.ts.map +0 -1
  578. package/dist/runtime/state.js.map +0 -1
  579. package/dist/ssg/batch-render.js +0 -103
  580. package/dist/ssg/batch-render.js.map +0 -1
  581. package/dist/ssg/create-static-gen.d.ts +0 -64
  582. package/dist/ssg/create-static-gen.d.ts.map +0 -1
  583. package/dist/ssg/create-static-gen.js +0 -199
  584. package/dist/ssg/create-static-gen.js.map +0 -1
  585. package/dist/ssg/generate-metadata.js +0 -94
  586. package/dist/ssg/generate-metadata.js.map +0 -1
  587. package/dist/ssg/generation-plan.js +0 -70
  588. package/dist/ssg/generation-plan.js.map +0 -1
  589. package/dist/ssg/incremental-manifest.js +0 -56
  590. package/dist/ssg/incremental-manifest.js.map +0 -1
  591. package/dist/ssg/resolve-ssg-data.js +0 -105
  592. package/dist/ssg/resolve-ssg-data.js.map +0 -1
  593. package/dist/ssg/route-utils.js +0 -24
  594. package/dist/ssg/route-utils.js.map +0 -1
  595. package/dist/ssg/static-routes.js +0 -102
  596. package/dist/ssg/static-routes.js.map +0 -1
  597. package/dist/ssg/types.d.ts +0 -189
  598. package/dist/ssg/types.d.ts.map +0 -1
  599. package/dist/ssg/write-static-files.js +0 -73
  600. package/dist/ssg/write-static-files.js.map +0 -1
  601. package/dist/ssr/attrs.js +0 -94
  602. package/dist/ssr/attrs.js.map +0 -1
  603. package/dist/ssr/boundaries.js +0 -113
  604. package/dist/ssr/boundaries.js.map +0 -1
  605. package/dist/ssr/component-runtime.js +0 -111
  606. package/dist/ssr/component-runtime.js.map +0 -1
  607. package/dist/ssr/context.d.ts +0 -50
  608. package/dist/ssr/context.d.ts.map +0 -1
  609. package/dist/ssr/context.js +0 -91
  610. package/dist/ssr/context.js.map +0 -1
  611. package/dist/ssr/errors.d.ts +0 -10
  612. package/dist/ssr/errors.d.ts.map +0 -1
  613. package/dist/ssr/errors.js +0 -14
  614. package/dist/ssr/errors.js.map +0 -1
  615. package/dist/ssr/escape.js +0 -193
  616. package/dist/ssr/escape.js.map +0 -1
  617. package/dist/ssr/hydration-data.js +0 -10
  618. package/dist/ssr/hydration-data.js.map +0 -1
  619. package/dist/ssr/hydration-verify.d.ts +0 -12
  620. package/dist/ssr/hydration-verify.d.ts.map +0 -1
  621. package/dist/ssr/hydration-verify.js +0 -144
  622. package/dist/ssr/hydration-verify.js.map +0 -1
  623. package/dist/ssr/index-internal.d.ts +0 -15
  624. package/dist/ssr/index-internal.d.ts.map +0 -1
  625. package/dist/ssr/index-internal.js +0 -19
  626. package/dist/ssr/index-internal.js.map +0 -1
  627. package/dist/ssr/render-keys.js +0 -16
  628. package/dist/ssr/render-keys.js.map +0 -1
  629. package/dist/ssr/render-resolved.d.ts +0 -20
  630. package/dist/ssr/render-resolved.d.ts.map +0 -1
  631. package/dist/ssr/render-resolved.js +0 -35
  632. package/dist/ssr/render-resolved.js.map +0 -1
  633. package/dist/ssr/render-sync.d.ts +0 -21
  634. package/dist/ssr/render-sync.d.ts.map +0 -1
  635. package/dist/ssr/render-sync.js +0 -275
  636. package/dist/ssr/render-sync.js.map +0 -1
  637. package/dist/ssr/route-policy-resolution.js +0 -78
  638. package/dist/ssr/route-policy-resolution.js.map +0 -1
  639. package/dist/ssr/route-render.d.ts +0 -77
  640. package/dist/ssr/route-render.d.ts.map +0 -1
  641. package/dist/ssr/route-render.js +0 -120
  642. package/dist/ssr/route-render.js.map +0 -1
  643. package/dist/ssr/sink.d.ts +0 -26
  644. package/dist/ssr/sink.d.ts.map +0 -1
  645. package/dist/ssr/sink.js +0 -86
  646. package/dist/ssr/sink.js.map +0 -1
  647. package/dist/ssr/types.d.ts +0 -23
  648. package/dist/ssr/types.d.ts.map +0 -1
  649. package/dist/ssr/verify-hydration.js.map +0 -1
  650. package/dist/testing/index.d.ts.map +0 -1
  651. package/dist/testing/index.js.map +0 -1
package/dist/ssg/index.js CHANGED
@@ -1,2 +1,858 @@
1
- import { createStaticGen } from "./create-static-gen.js";
1
+ import "../access-Bg4RJNC8.js";
2
+ import { a as resolveDeferredValues, b as getRenderHandler, c as bindResolvedRouteData } from "../deferred-lKE8uR0z.js";
3
+ import { n as renderDocument } from "../ssr-CbQO5xd3.js";
4
+ import { n as renderToString } from "../ssr-D3t80Rc0.js";
5
+ import * as fs from "node:fs/promises";
6
+ import * as pathModule from "node:path";
7
+ import * as os from "node:os";
8
+ import * as fsSync from "node:fs";
9
+ //#region src/ssg/route-utils.ts
10
+ function getOutputFilePath(pathStr) {
11
+ if (pathStr === "/") return "index.html";
12
+ return `${pathStr.replace(/^\/|\/$/g, "")}/index.html`;
13
+ }
14
+ function interpolateRoutePath(routePath, params) {
15
+ if (!params) return routePath;
16
+ return routePath.replace(/\{([^}]+)\}/g, (_, key) => params[key] ?? "");
17
+ }
18
+ function resolveRouteDescriptor(route) {
19
+ const path = interpolateRoutePath(route.path, route.params);
20
+ const filePath = getOutputFilePath(path);
21
+ return {
22
+ route,
23
+ path,
24
+ filePath,
25
+ routeId: `${path}::${filePath}`,
26
+ invalidationKeys: route.invalidationKeys?.slice() ?? []
27
+ };
28
+ }
29
+ //#endregion
30
+ //#region src/ssg/resolve-ssg-data.ts
31
+ function hasOwnRouteData(dataMap, path) {
32
+ return Object.prototype.hasOwnProperty.call(dataMap, path);
33
+ }
34
+ /**
35
+ * Resolve and validate data for SSG routes
36
+ * Returns a map of route path -> SSRData
37
+ *
38
+ * In phase 1: accepts user-supplied dataOverrides
39
+ * In phase 2: can be extended to auto-discover resources
40
+ */
41
+ function resolveSsgData(routes, options = {}) {
42
+ const { dataOverrides = {} } = options;
43
+ const dataMap = {};
44
+ for (const route of routes) {
45
+ const concretePath = interpolateRoutePath(route.path, route.params);
46
+ const overridePath = concretePath in dataOverrides ? concretePath : route.path in dataOverrides ? route.path : null;
47
+ if (overridePath) {
48
+ const data = dataOverrides[overridePath];
49
+ if (typeof data !== "object" || data === null || Array.isArray(data)) throw new Error(`data for route "${overridePath}" must be an object, got ${typeof data}`);
50
+ dataMap[overridePath] = data;
51
+ }
52
+ }
53
+ return dataMap;
54
+ }
55
+ function resolveSsgRouteData(dataMap, routePath, concretePath) {
56
+ if (hasOwnRouteData(dataMap, concretePath)) return {
57
+ hasData: true,
58
+ data: dataMap[concretePath]
59
+ };
60
+ if (hasOwnRouteData(dataMap, routePath)) return {
61
+ hasData: true,
62
+ data: dataMap[routePath]
63
+ };
64
+ return {
65
+ hasData: false,
66
+ data: void 0
67
+ };
68
+ }
69
+ function isStringRecord(value) {
70
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
71
+ for (const recordValue of Object.values(value)) if (typeof recordValue !== "string") return false;
72
+ return true;
73
+ }
74
+ function validateRouteShape(route) {
75
+ if (typeof route.path !== "string" || !route.path.startsWith("/")) throw new Error(`route path must be a string starting with "/", got "${route.path}"`);
76
+ if (typeof (route.handler ?? route.component) !== "function") throw new Error(`route handler must be a function for path "${route.path}"`);
77
+ if (route.params !== void 0 && !isStringRecord(route.params)) throw new Error(`route "${route.path}" params must be an object containing only string values`);
78
+ if (route.invalidationKeys !== void 0) {
79
+ if (!Array.isArray(route.invalidationKeys)) throw new Error(`route "${route.path}" invalidationKeys must be an array of strings`);
80
+ for (const key of route.invalidationKeys) if (typeof key !== "string" || key.length === 0) throw new Error(`route "${route.path}" invalidationKeys must contain only non-empty strings`);
81
+ }
82
+ }
83
+ function validateEntriesResult(route, entries) {
84
+ if (!Array.isArray(entries)) throw new Error(`route "${route.path}" entries must return an array of param maps`);
85
+ return entries.map((entry, index) => {
86
+ if (!isStringRecord(entry)) throw new Error(`route "${route.path}" entries[${index}] must be an object containing only string values`);
87
+ return entry;
88
+ });
89
+ }
90
+ async function expandRoutes(routes) {
91
+ if (!Array.isArray(routes)) throw new Error("routes must be an array");
92
+ const expanded = [];
93
+ for (const route of routes) {
94
+ validateRouteShape(route);
95
+ if (route.params) expanded.push({
96
+ ...route,
97
+ entries: void 0
98
+ });
99
+ if (!route.entries) {
100
+ if (!route.params) expanded.push(route);
101
+ continue;
102
+ }
103
+ const entries = validateEntriesResult(route, await route.entries());
104
+ for (const params of entries) expanded.push({
105
+ ...route,
106
+ params,
107
+ entries: void 0
108
+ });
109
+ }
110
+ return expanded;
111
+ }
112
+ /**
113
+ * Validate routes are properly configured
114
+ */
115
+ function validateRoutes(routes) {
116
+ if (!Array.isArray(routes)) throw new Error("routes must be an array");
117
+ const seen = /* @__PURE__ */ new Set();
118
+ for (const route of routes) {
119
+ validateRouteShape(route);
120
+ const key = `${route.path}::${JSON.stringify(route.params || {})}`;
121
+ if (seen.has(key)) throw new Error(`duplicate route entry detected for path "${route.path}"`);
122
+ seen.add(key);
123
+ if (route.path.includes("{")) {
124
+ const paramNames = Array.from(route.path.matchAll(/\{([^}]+)\}/g)).map((m) => m[1]);
125
+ if (!route.params) throw new Error(`route "${route.path}" uses path parameters and requires params`);
126
+ for (const name of paramNames) if (!(name in route.params)) throw new Error(`route "${route.path}" missing required param "${name}"`);
127
+ }
128
+ }
129
+ }
130
+ //#endregion
131
+ //#region src/ssg/batch-render.ts
132
+ /**
133
+ * Batch rendering of multiple routes for SSG
134
+ */
135
+ /**
136
+ * Render multiple routes in parallel with error handling
137
+ */
138
+ async function batchRenderRoutes(routes, options = {}) {
139
+ const { seed = 12345, dataMap = {}, concurrency = 1, document } = options;
140
+ const workerCount = Math.max(1, Math.min(concurrency, routes.length || 1));
141
+ const results = [];
142
+ results.length = routes.length;
143
+ let nextIndex = 0;
144
+ const renderOne = async (route) => {
145
+ const startTime = performance.now();
146
+ const url = interpolateRoutePath(route.path, route.params);
147
+ const requestUrl = new URL(url, "http://localhost");
148
+ const resolvedData = resolveSsgRouteData(dataMap, route.path, url);
149
+ const baseData = resolvedData.hasData ? resolvedData.data : void 0;
150
+ const resourceCount = resolvedData.hasData && baseData ? Object.keys(baseData).length : 0;
151
+ const mergedHandler = route.handler ? route.handler : (params, ctx) => {
152
+ const component = route.component;
153
+ return component({
154
+ ...route.props,
155
+ ...params
156
+ }, ctx);
157
+ };
158
+ try {
159
+ let routeData;
160
+ let hasRouteData = false;
161
+ if (route.loader) {
162
+ const controller = new AbortController();
163
+ const loadContext = {
164
+ mode: "ssg",
165
+ params: route.params ?? {},
166
+ pathname: requestUrl.pathname,
167
+ search: requestUrl.search,
168
+ hash: requestUrl.hash,
169
+ href: `${requestUrl.pathname}${requestUrl.search}${requestUrl.hash}`,
170
+ auth: {
171
+ authenticated: false,
172
+ principal: null,
173
+ session: null,
174
+ tenant: null
175
+ },
176
+ signal: controller.signal
177
+ };
178
+ const loaded = await route.loader({
179
+ ...loadContext,
180
+ request: new Request(requestUrl)
181
+ });
182
+ await resolveDeferredValues(loaded, controller.signal);
183
+ routeData = loaded;
184
+ hasRouteData = true;
185
+ }
186
+ const html = renderToString({
187
+ url,
188
+ routes: [{
189
+ path: route.path,
190
+ handler: hasRouteData ? bindResolvedRouteData(mergedHandler, routeData) : mergedHandler,
191
+ namespace: route.namespace
192
+ }],
193
+ seed,
194
+ data: baseData,
195
+ document: document === void 0 ? void 0 : ({ appHtml }) => renderDocument(document, {
196
+ appHtml,
197
+ context: {
198
+ mode: "ssg",
199
+ url,
200
+ pathname: requestUrl.pathname,
201
+ search: requestUrl.search,
202
+ hash: requestUrl.hash,
203
+ params: route.params ?? {},
204
+ data: baseData,
205
+ seed,
206
+ route: {
207
+ path: route.path,
208
+ namespace: route.namespace
209
+ }
210
+ }
211
+ }, "createStaticGen()")
212
+ });
213
+ const duration = performance.now() - startTime;
214
+ return {
215
+ path: url,
216
+ filePath: getOutputFilePath(url),
217
+ html,
218
+ fileSize: Buffer.byteLength(html, "utf8"),
219
+ renderDuration: Math.round(duration),
220
+ resourceCount,
221
+ status: "success",
222
+ reason: "full",
223
+ written: false
224
+ };
225
+ } catch (error) {
226
+ const duration = performance.now() - startTime;
227
+ return {
228
+ path: url,
229
+ filePath: getOutputFilePath(url),
230
+ html: "",
231
+ fileSize: 0,
232
+ renderDuration: Math.round(duration),
233
+ resourceCount,
234
+ status: "error",
235
+ reason: "full",
236
+ written: false,
237
+ error: error instanceof Error ? error.message : String(error)
238
+ };
239
+ }
240
+ };
241
+ const worker = async () => {
242
+ while (true) {
243
+ const current = nextIndex;
244
+ nextIndex += 1;
245
+ if (current >= routes.length) return;
246
+ results[current] = await renderOne(routes[current]);
247
+ }
248
+ };
249
+ await Promise.all(Array.from({ length: workerCount }, () => worker()));
250
+ return results;
251
+ }
252
+ //#endregion
253
+ //#region src/ssg/write-static-files.ts
254
+ /**
255
+ * File I/O for Static Site Generation
256
+ *
257
+ * Uses Node.js fs/path modules to write rendered HTML files to disk.
258
+ * This module is Node-only and not intended for browser builds.
259
+ */
260
+ /**
261
+ * Write rendered routes to disk
262
+ * Creates outputDir/{route-path}/index.html structure
263
+ */
264
+ async function writeStaticFiles(results, outputDir, options = {}, fileOperations = fs) {
265
+ await fileOperations.mkdir(outputDir, { recursive: true });
266
+ for (const result of results) {
267
+ if (result.status !== "removed") continue;
268
+ const fullPath = pathModule.join(outputDir, result.filePath);
269
+ if (fsSync.existsSync(fullPath)) {
270
+ await fileOperations.rm(fullPath, { force: true });
271
+ await pruneEmptyDirs(pathModule.dirname(fullPath), outputDir, fileOperations);
272
+ }
273
+ }
274
+ const pendingWrites = [];
275
+ for (let index = 0; index < results.length; index += 1) {
276
+ const result = results[index];
277
+ if (result.status === "error") {
278
+ console.warn(`Skipping failed route: ${result.path} - ${result.error}`);
279
+ continue;
280
+ }
281
+ if (result.status === "success" && result.written) pendingWrites.push(result);
282
+ }
283
+ const directories = [];
284
+ const seenDirectories = /* @__PURE__ */ new Set();
285
+ for (const result of pendingWrites) {
286
+ const dir = pathModule.dirname(pathModule.join(outputDir, result.filePath));
287
+ if (!seenDirectories.has(dir)) {
288
+ seenDirectories.add(dir);
289
+ directories.push(dir);
290
+ }
291
+ }
292
+ for (const dir of directories) await fileOperations.mkdir(dir, { recursive: true });
293
+ const concurrency = Math.max(1, Math.min(options.concurrency ?? 8, pendingWrites.length || 1));
294
+ let nextIndex = 0;
295
+ const worker = async () => {
296
+ while (true) {
297
+ const current = nextIndex;
298
+ nextIndex += 1;
299
+ if (current >= pendingWrites.length) return;
300
+ const result = pendingWrites[current];
301
+ const fullPath = pathModule.join(outputDir, result.filePath);
302
+ const tempPath = pathModule.join(pathModule.dirname(fullPath), `.${pathModule.basename(fullPath)}.askr-${process.pid}-${current}.tmp`);
303
+ try {
304
+ await fileOperations.writeFile(tempPath, result.html, "utf8");
305
+ await fileOperations.rename(tempPath, fullPath);
306
+ } finally {
307
+ await fileOperations.rm(tempPath, { force: true });
308
+ }
309
+ }
310
+ };
311
+ await Promise.all(Array.from({ length: concurrency }, () => worker()));
312
+ }
313
+ async function pruneEmptyDirs(startDir, rootDir, fileOperations) {
314
+ let current = startDir;
315
+ const normalizedRoot = pathModule.resolve(rootDir);
316
+ while (current.startsWith(normalizedRoot)) {
317
+ if (!fsSync.existsSync(current)) break;
318
+ if ((await fileOperations.readdir(current)).length > 0) break;
319
+ await fileOperations.rmdir(current);
320
+ if (pathModule.resolve(current) === normalizedRoot) break;
321
+ current = pathModule.dirname(current);
322
+ }
323
+ }
324
+ //#endregion
325
+ //#region src/ssg/generate-metadata.ts
326
+ /**
327
+ * Metadata generation for SSG
328
+ *
329
+ * Generates and serializes metadata about generated static files.
330
+ * This module is Node-only and not intended for browser builds.
331
+ */
332
+ /**
333
+ * Generate SSGResult from render results
334
+ */
335
+ function generateSSGResult(results, options = {}) {
336
+ let successful = 0;
337
+ let failed = 0;
338
+ let totalDuration = 0;
339
+ let rebuilt = 0;
340
+ let skipped = 0;
341
+ let removed = 0;
342
+ for (let index = 0; index < results.length; index += 1) {
343
+ const result = results[index];
344
+ totalDuration += result.renderDuration;
345
+ if (result.status === "success") {
346
+ successful += 1;
347
+ rebuilt += 1;
348
+ } else if (result.status === "error") {
349
+ failed += 1;
350
+ rebuilt += 1;
351
+ } else if (result.status === "skipped") skipped += 1;
352
+ else if (result.status === "removed") removed += 1;
353
+ }
354
+ return {
355
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
356
+ totalRoutes: results.length,
357
+ successful,
358
+ failed,
359
+ totalDuration: Math.round(totalDuration),
360
+ mode: options.mode ?? "full",
361
+ rebuilt,
362
+ skipped,
363
+ removed,
364
+ cacheHits: options.cacheHits ?? 0,
365
+ invalidatedKeys: options.invalidatedKeys?.slice() ?? [],
366
+ invalidatedRoutes: options.invalidatedRoutes?.slice() ?? [],
367
+ routes: results
368
+ };
369
+ }
370
+ /**
371
+ * Convert SSGResult to metadata for JSON serialization
372
+ */
373
+ function resultToMetadata(result) {
374
+ const routes = [];
375
+ for (let index = 0; index < result.routes.length; index += 1) {
376
+ const route = result.routes[index];
377
+ routes.push({
378
+ path: route.path,
379
+ filePath: route.filePath,
380
+ fileSize: route.fileSize,
381
+ renderDuration: route.renderDuration,
382
+ resourceCount: route.resourceCount,
383
+ status: route.status,
384
+ reason: route.reason,
385
+ written: route.written,
386
+ error: route.error
387
+ });
388
+ }
389
+ return {
390
+ generatedAt: result.generatedAt,
391
+ totalRoutes: result.totalRoutes,
392
+ successful: result.successful,
393
+ failed: result.failed,
394
+ totalDuration: result.totalDuration,
395
+ mode: result.mode,
396
+ rebuilt: result.rebuilt,
397
+ skipped: result.skipped,
398
+ removed: result.removed,
399
+ cacheHits: result.cacheHits,
400
+ invalidatedKeys: result.invalidatedKeys.slice(),
401
+ invalidatedRoutes: result.invalidatedRoutes.slice(),
402
+ routes
403
+ };
404
+ }
405
+ /**
406
+ * Write metadata.json to output directory
407
+ */
408
+ async function writeMetadata(metadata, outputDir) {
409
+ const filePath = pathModule.join(outputDir, "metadata.json");
410
+ await fs.mkdir(outputDir, { recursive: true });
411
+ await fs.writeFile(filePath, JSON.stringify(metadata, null, 2), "utf8");
412
+ }
413
+ const MANIFEST_DIR = ".askr";
414
+ const MANIFEST_FILE = "ssg-manifest.json";
415
+ function hashHtml(html) {
416
+ let hash = 2166136261;
417
+ for (let index = 0; index < html.length; index += 1) {
418
+ hash ^= html.charCodeAt(index);
419
+ hash = Math.imul(hash, 16777619);
420
+ }
421
+ return (hash >>> 0).toString(16).padStart(8, "0");
422
+ }
423
+ function getIncrementalManifestPath(outputDir) {
424
+ return pathModule.join(outputDir, MANIFEST_DIR, MANIFEST_FILE);
425
+ }
426
+ function readIncrementalManifest(outputDir, seed) {
427
+ const manifestPath = getIncrementalManifestPath(outputDir);
428
+ if (!fsSync.existsSync(manifestPath)) return null;
429
+ try {
430
+ const raw = fsSync.readFileSync(manifestPath, "utf8");
431
+ const parsed = JSON.parse(raw);
432
+ if (parsed.schemaVersion !== 1 || parsed.seed !== seed || !Array.isArray(parsed.routes)) return null;
433
+ const routes = parsed.routes.filter((entry) => !!entry && typeof entry.routeId === "string" && typeof entry.path === "string" && typeof entry.filePath === "string" && Array.isArray(entry.invalidationKeys) && (entry.htmlHash === null || typeof entry.htmlHash === "string") && (entry.lastStatus === "success" || entry.lastStatus === "error"));
434
+ if (routes.length !== parsed.routes.length) return null;
435
+ return {
436
+ schemaVersion: 1,
437
+ seed,
438
+ mode: parsed.mode === "incremental" ? "incremental" : "full",
439
+ routes
440
+ };
441
+ } catch {
442
+ return null;
443
+ }
444
+ }
445
+ async function writeIncrementalManifest(manifest, outputDir) {
446
+ const manifestPath = getIncrementalManifestPath(outputDir);
447
+ await fs.mkdir(pathModule.dirname(manifestPath), { recursive: true });
448
+ await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), "utf8");
449
+ }
450
+ function getExistingOutputFileSize(outputDir, filePath) {
451
+ const fullPath = pathModule.join(outputDir, filePath);
452
+ if (!fsSync.existsSync(fullPath)) return 0;
453
+ try {
454
+ return fsSync.statSync(fullPath).size;
455
+ } catch {
456
+ return 0;
457
+ }
458
+ }
459
+ function outputFileExists(outputDir, filePath) {
460
+ return fsSync.existsSync(pathModule.join(outputDir, filePath));
461
+ }
462
+ //#endregion
463
+ //#region src/ssg/generation-plan.ts
464
+ function dedupeStrings(values) {
465
+ return values ? Array.from(new Set(values)) : [];
466
+ }
467
+ function getRoutesToRender(selected) {
468
+ const routes = [];
469
+ for (let index = 0; index < selected.length; index += 1) routes.push(selected[index].descriptor.route);
470
+ return routes;
471
+ }
472
+ function selectRouteForGeneration(descriptor, previous, mode, changedKeys, changedRoutes) {
473
+ if (mode === "full") return {
474
+ descriptor,
475
+ reason: "full",
476
+ previous
477
+ };
478
+ if (!previous) return {
479
+ descriptor,
480
+ reason: "new-route",
481
+ previous
482
+ };
483
+ if (previous.lastStatus === "error" || previous.htmlHash === null) return {
484
+ descriptor,
485
+ reason: "new-route",
486
+ previous
487
+ };
488
+ if (descriptor.invalidationKeys.length === 0) return {
489
+ descriptor,
490
+ reason: "no-keys",
491
+ previous
492
+ };
493
+ if (changedRoutes.includes(descriptor.path)) return {
494
+ descriptor,
495
+ reason: "changed-route",
496
+ previous
497
+ };
498
+ if (descriptor.invalidationKeys.some((key) => changedKeys.includes(key))) return {
499
+ descriptor,
500
+ reason: "changed-key",
501
+ previous
502
+ };
503
+ return {
504
+ descriptor,
505
+ reason: "unchanged",
506
+ previous
507
+ };
508
+ }
509
+ function collectRemovedRouteResults(manifest, currentRouteIds) {
510
+ if (!manifest) return [];
511
+ const results = [];
512
+ for (let index = 0; index < manifest.routes.length; index += 1) {
513
+ const entry = manifest.routes[index];
514
+ if (currentRouteIds.has(entry.routeId)) continue;
515
+ results.push({
516
+ path: entry.path,
517
+ filePath: entry.filePath,
518
+ html: "",
519
+ fileSize: 0,
520
+ renderDuration: 0,
521
+ resourceCount: 0,
522
+ status: "removed",
523
+ reason: "deleted",
524
+ written: false
525
+ });
526
+ }
527
+ return results;
528
+ }
529
+ //#endregion
530
+ //#region src/ssg/static-routes.ts
531
+ function getRuntimeOnlyDiagnostic(route, path) {
532
+ const policies = route.policies ?? [];
533
+ if (route.auth) return `Skipped prerender for "${path}": routes with auth requirements are runtime-only by default.`;
534
+ if (policies.length > 0) return `Skipped prerender for "${path}": routes with policies are runtime-only by default.`;
535
+ return null;
536
+ }
537
+ function getRouteResultPath(route) {
538
+ return route.params ? interpolateRoutePath(route.path, route.params) : route.path;
539
+ }
540
+ function createRuntimeOnlyRoute(route, diagnostic) {
541
+ const path = getRouteResultPath(route);
542
+ const filePath = getOutputFilePath(path);
543
+ return {
544
+ routeId: `${path}::${filePath}`,
545
+ result: {
546
+ path,
547
+ filePath,
548
+ html: "",
549
+ fileSize: 0,
550
+ renderDuration: 0,
551
+ resourceCount: 0,
552
+ status: "skipped",
553
+ reason: "runtime-only",
554
+ written: false,
555
+ error: diagnostic
556
+ }
557
+ };
558
+ }
559
+ async function splitStaticRoutes(routes) {
560
+ const prerenderableRoutes = [];
561
+ const runtimeOnly = [];
562
+ const outputRouteIds = [];
563
+ for (const route of routes) {
564
+ const diagnostic = getRuntimeOnlyDiagnostic(route, getRouteResultPath(route));
565
+ if (diagnostic) {
566
+ const runtimeRoute = createRuntimeOnlyRoute(route, diagnostic);
567
+ runtimeOnly.push(runtimeRoute);
568
+ outputRouteIds.push(runtimeRoute.routeId);
569
+ continue;
570
+ }
571
+ const expanded = await expandRoutes([route]);
572
+ prerenderableRoutes.push(...expanded);
573
+ for (const expandedRoute of expanded) outputRouteIds.push(resolveRouteDescriptor(expandedRoute).routeId);
574
+ }
575
+ return {
576
+ routes: prerenderableRoutes,
577
+ runtimeOnly,
578
+ outputRouteIds
579
+ };
580
+ }
581
+ function normalizeStaticRoutes(options) {
582
+ if (options.registry) return routeRegistryToRouteConfigs(options.registry);
583
+ return [...options.routes ?? []];
584
+ }
585
+ function routeRegistryToRouteConfigs(registry) {
586
+ const routeConfigs = [];
587
+ for (const record of registry.manifest.records) {
588
+ if (record.isFallback) continue;
589
+ routeConfigs.push({
590
+ path: record.path,
591
+ handler: getRenderHandler(record),
592
+ namespace: record.options.namespace,
593
+ auth: record.options.auth,
594
+ policies: record.options.policies,
595
+ entries: record.options.entries,
596
+ loader: record.options.loader
597
+ });
598
+ }
599
+ return routeConfigs;
600
+ }
601
+ //#endregion
602
+ //#region src/ssg/create-static-gen.ts
603
+ function resolveParallelism(requested) {
604
+ if (requested !== "auto") return Math.max(1, requested ?? 1);
605
+ const maybeNavigator = globalThis;
606
+ const envWorkers = Number(maybeNavigator.process?.env?.ASKR_SSG_WORKERS ?? maybeNavigator.process?.env?.NUMBER_OF_PROCESSORS ?? maybeNavigator.process?.env?.UV_THREADPOOL_SIZE);
607
+ if (Number.isFinite(envWorkers) && envWorkers > 0) return Math.max(1, Math.trunc(envWorkers));
608
+ if (typeof maybeNavigator.navigator?.hardwareConcurrency === "number") return Math.max(1, maybeNavigator.navigator.hardwareConcurrency);
609
+ const availableParallelism = os.availableParallelism;
610
+ return Math.max(1, availableParallelism?.() ?? os.cpus().length ?? 1);
611
+ }
612
+ async function createStagingDirectory(outputDir) {
613
+ const parent = pathModule.dirname(outputDir);
614
+ const base = pathModule.basename(outputDir);
615
+ await fs.mkdir(parent, { recursive: true });
616
+ return fs.mkdtemp(pathModule.join(parent, `.${base}.askr-staging-`));
617
+ }
618
+ function resolveAssetDestination(outputDir, source) {
619
+ const relativeDestination = source.to ?? pathModule.basename(source.from);
620
+ const destination = pathModule.resolve(outputDir, relativeDestination);
621
+ const relative = pathModule.relative(pathModule.resolve(outputDir), destination);
622
+ if (relative.startsWith("..") || pathModule.isAbsolute(relative)) throw new Error(`SSG asset destination must stay inside outputDir: ${relativeDestination}`);
623
+ return destination;
624
+ }
625
+ async function copyStaticAssets(assets, outputDir) {
626
+ for (const source of assets ?? []) {
627
+ if (!source.from || source.from.trim().length === 0) throw new Error("SSG asset source requires a non-empty from path");
628
+ const from = pathModule.resolve(source.from);
629
+ const to = resolveAssetDestination(outputDir, source);
630
+ await fs.mkdir(pathModule.dirname(to), { recursive: true });
631
+ await fs.cp(from, to, {
632
+ recursive: true,
633
+ force: true
634
+ });
635
+ }
636
+ }
637
+ async function replaceOutputDirectory(stagingDir, outputDir, fileOperations = fs) {
638
+ const parent = pathModule.dirname(outputDir);
639
+ const backupDir = pathModule.join(parent, `.${pathModule.basename(outputDir)}.askr-backup-${Date.now()}`);
640
+ let backedUp = false;
641
+ try {
642
+ try {
643
+ await fileOperations.rename(outputDir, backupDir);
644
+ backedUp = true;
645
+ } catch (error) {
646
+ if (error.code !== "ENOENT") throw error;
647
+ }
648
+ await fileOperations.rename(stagingDir, outputDir);
649
+ await fileOperations.rm(backupDir, {
650
+ recursive: true,
651
+ force: true
652
+ });
653
+ } catch (error) {
654
+ if (backedUp) {
655
+ await fileOperations.rm(outputDir, {
656
+ recursive: true,
657
+ force: true
658
+ });
659
+ await fileOperations.rename(backupDir, outputDir);
660
+ }
661
+ throw error;
662
+ } finally {
663
+ await fileOperations.rm(stagingDir, {
664
+ recursive: true,
665
+ force: true
666
+ });
667
+ }
668
+ }
669
+ /**
670
+ * Create a Static Site Generator
671
+ *
672
+ * Usage:
673
+ * ```ts
674
+ * const ssg = createStaticGen({
675
+ * routes: [
676
+ * { path: '/', component: HomePage },
677
+ * { path: '/about', component: AboutPage },
678
+ * ],
679
+ * outputDir: './dist',
680
+ * dataOverrides: {
681
+ * '/api/posts': { posts: [...] }
682
+ * }
683
+ * });
684
+ *
685
+ * const result = await ssg.generate();
686
+ * console.log(`Generated ${result.successful}/${result.totalRoutes} routes`);
687
+ * ```
688
+ */
689
+ function createStaticGen(options) {
690
+ let result = null;
691
+ const configuredRoutes = normalizeStaticRoutes(options);
692
+ const seed = options.seed ?? 12345;
693
+ const resolvedParallelism = resolveParallelism(options.parallelism);
694
+ const resolvedConcurrency = Math.max(1, options.concurrency ?? resolvedParallelism);
695
+ if (configuredRoutes.length === 0) throw new Error("routes array or route registry is required");
696
+ if (!options.outputDir || options.outputDir.trim().length === 0) throw new Error("outputDir is required");
697
+ return {
698
+ /**
699
+ * Generate static HTML for all routes
700
+ * Writes to outputDir with metadata.json
701
+ * Returns detailed results
702
+ */
703
+ async generate(generateOptions = {}) {
704
+ const splitRoutes = await splitStaticRoutes(configuredRoutes);
705
+ const routes = splitRoutes.routes;
706
+ validateRoutes(routes);
707
+ const changedKeys = dedupeStrings(generateOptions.changedKeys);
708
+ const changedRoutes = dedupeStrings(generateOptions.changedRoutes);
709
+ const requestedMode = generateOptions.mode ?? "full";
710
+ const previousManifest = !generateOptions.forceFull && requestedMode === "incremental" ? readIncrementalManifest(options.outputDir, seed) : null;
711
+ const effectiveMode = generateOptions.forceFull || requestedMode !== "incremental" || previousManifest === null ? "full" : "incremental";
712
+ const dataMap = resolveSsgData(routes, { dataOverrides: options.dataOverrides });
713
+ const descriptors = routes.map(resolveRouteDescriptor);
714
+ const routeResultsById = /* @__PURE__ */ new Map();
715
+ for (const runtimeRoute of splitRoutes.runtimeOnly) routeResultsById.set(runtimeRoute.routeId, runtimeRoute.result);
716
+ const eligibleDescriptors = descriptors;
717
+ const previousEntries = new Map((previousManifest?.routes ?? []).map((entry) => [entry.routeId, entry]));
718
+ const currentRouteIds = new Set(eligibleDescriptors.map((descriptor) => descriptor.routeId));
719
+ const selected = [];
720
+ const routesToRender = [];
721
+ for (let index = 0; index < eligibleDescriptors.length; index += 1) {
722
+ const descriptor = eligibleDescriptors[index];
723
+ const entry = selectRouteForGeneration(descriptor, previousEntries.get(descriptor.routeId) ?? null, effectiveMode, changedKeys, changedRoutes);
724
+ selected.push(entry);
725
+ if (entry.reason !== "unchanged") routesToRender.push(entry);
726
+ }
727
+ const renderStartTime = performance.now();
728
+ const renderedResults = routesToRender.length > 0 ? await batchRenderRoutes(getRoutesToRender(routesToRender), {
729
+ seed,
730
+ dataMap,
731
+ concurrency: resolvedConcurrency,
732
+ document: options.document
733
+ }) : [];
734
+ performance.now() - renderStartTime;
735
+ const renderedByRouteId = /* @__PURE__ */ new Map();
736
+ for (let index = 0; index < renderedResults.length; index += 1) renderedByRouteId.set(routesToRender[index].descriptor.routeId, renderedResults[index]);
737
+ let cacheHits = 0;
738
+ const nextManifestRoutes = [];
739
+ for (const entry of selected) {
740
+ const { descriptor, previous, reason } = entry;
741
+ const resolvedData = resolveSsgRouteData(dataMap, descriptor.route.path, descriptor.path);
742
+ const baseData = resolvedData.hasData ? resolvedData.data : void 0;
743
+ const resourceCount = resolvedData.hasData && baseData ? Object.keys(baseData).length : 0;
744
+ if (reason === "unchanged") {
745
+ routeResultsById.set(descriptor.routeId, {
746
+ path: descriptor.path,
747
+ filePath: descriptor.filePath,
748
+ html: "",
749
+ fileSize: previous?.htmlHash !== null && previous !== null ? getExistingOutputFileSize(options.outputDir, descriptor.filePath) : 0,
750
+ renderDuration: 0,
751
+ resourceCount,
752
+ status: "skipped",
753
+ reason: "unchanged",
754
+ written: false
755
+ });
756
+ if (previous) nextManifestRoutes.push({
757
+ ...previous,
758
+ path: descriptor.path,
759
+ filePath: descriptor.filePath,
760
+ invalidationKeys: descriptor.invalidationKeys.slice()
761
+ });
762
+ continue;
763
+ }
764
+ const rendered = renderedByRouteId.get(descriptor.routeId);
765
+ if (!rendered) throw new Error(`Missing rendered result for route "${descriptor.path}"`);
766
+ const nextResult = {
767
+ ...rendered,
768
+ path: descriptor.path,
769
+ filePath: descriptor.filePath,
770
+ resourceCount,
771
+ reason,
772
+ written: false
773
+ };
774
+ if (nextResult.status === "success") {
775
+ const htmlDigest = hashHtml(nextResult.html);
776
+ const shouldWrite = effectiveMode === "full" || !previous || previous.htmlHash !== htmlDigest || !outputFileExists(options.outputDir, descriptor.filePath);
777
+ nextResult.written = shouldWrite;
778
+ if (!shouldWrite) cacheHits += 1;
779
+ nextManifestRoutes.push({
780
+ routeId: descriptor.routeId,
781
+ path: descriptor.path,
782
+ filePath: descriptor.filePath,
783
+ invalidationKeys: descriptor.invalidationKeys.slice(),
784
+ htmlHash: htmlDigest,
785
+ lastStatus: "success"
786
+ });
787
+ } else nextManifestRoutes.push({
788
+ routeId: descriptor.routeId,
789
+ path: descriptor.path,
790
+ filePath: descriptor.filePath,
791
+ invalidationKeys: descriptor.invalidationKeys.slice(),
792
+ htmlHash: previous?.htmlHash ?? null,
793
+ lastStatus: "error"
794
+ });
795
+ routeResultsById.set(descriptor.routeId, nextResult);
796
+ }
797
+ const removedResults = collectRemovedRouteResults(previousManifest, currentRouteIds);
798
+ const routeResults = [];
799
+ for (const routeId of splitRoutes.outputRouteIds) {
800
+ const routeResult = routeResultsById.get(routeId);
801
+ if (routeResult) routeResults.push(routeResult);
802
+ }
803
+ routeResults.push(...removedResults);
804
+ result = generateSSGResult(routeResults, {
805
+ mode: effectiveMode,
806
+ cacheHits,
807
+ invalidatedKeys: changedKeys,
808
+ invalidatedRoutes: changedRoutes
809
+ });
810
+ if (effectiveMode === "full" && result.failed > 0) return result;
811
+ const targetOutputDir = effectiveMode === "full" ? await createStagingDirectory(options.outputDir) : options.outputDir;
812
+ try {
813
+ const writeStartTime = performance.now();
814
+ await writeStaticFiles(routeResults, targetOutputDir, { concurrency: resolvedConcurrency });
815
+ performance.now() - writeStartTime;
816
+ await writeMetadata(resultToMetadata(result), targetOutputDir);
817
+ await writeIncrementalManifest({
818
+ schemaVersion: 1,
819
+ seed,
820
+ mode: effectiveMode,
821
+ routes: nextManifestRoutes
822
+ }, targetOutputDir);
823
+ await copyStaticAssets(options.assets, targetOutputDir);
824
+ if (effectiveMode === "full") await replaceOutputDirectory(targetOutputDir, options.outputDir);
825
+ } catch (error) {
826
+ if (effectiveMode === "full") await fs.rm(targetOutputDir, {
827
+ recursive: true,
828
+ force: true
829
+ });
830
+ throw error;
831
+ }
832
+ return result;
833
+ },
834
+ /**
835
+ * Get effective config in a serializable form for diagnostics.
836
+ */
837
+ getConfig() {
838
+ return {
839
+ routeCount: configuredRoutes.length,
840
+ outputDir: options.outputDir,
841
+ seed,
842
+ concurrency: resolvedConcurrency,
843
+ parallelism: resolvedParallelism,
844
+ hasDataOverrides: !!options.dataOverrides,
845
+ assetCount: options.assets?.length ?? 0
846
+ };
847
+ },
848
+ /**
849
+ * Get the last generation result
850
+ * Returns null if generate() hasn't been called
851
+ */
852
+ getResult() {
853
+ return result;
854
+ }
855
+ };
856
+ }
857
+ //#endregion
2
858
  export { createStaticGen };