@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":"create-static-gen.js","names":[],"sources":["../../src/ssg/create-static-gen.ts"],"sourcesContent":["/**\n * Static Site Generation API\n *\n * Main orchestrator for batch rendering, file I/O, and metadata generation\n */\n\nimport type {\n RouteRenderReason,\n RouteRenderResult,\n SSGGenerateOptions,\n SSGMode,\n SSGOptions,\n SSGResult,\n} from './types';\nimport { resolveSsgData, validateRoutes } from './resolve-ssg-data';\nimport { batchRenderRoutes } from './batch-render';\nimport { writeStaticFiles } from './write-static-files';\nimport {\n generateSSGResult,\n resultToMetadata,\n writeMetadata,\n} from './generate-metadata';\nimport {\n getExistingOutputFileSize,\n outputFileExists,\n readIncrementalManifest,\n type IncrementalManifest,\n type IncrementalManifestRouteEntry,\n writeIncrementalManifest,\n hashHtml,\n SSG_MANIFEST_SCHEMA_VERSION,\n} from './incremental-manifest';\nimport {\n resolveRouteDescriptor,\n type ResolvedRouteDescriptor,\n} from './route-utils';\nimport { addPerfDuration, incrementPerfMetric } from '../runtime/perf-metrics';\n\ninterface SelectedRoute {\n descriptor: ResolvedRouteDescriptor;\n reason: RouteRenderReason;\n previous: IncrementalManifestRouteEntry | null;\n}\n\nfunction getRuntimeOnlyDiagnostic(\n descriptor: ResolvedRouteDescriptor\n): string | null {\n const { route } = descriptor;\n\n if (route.auth === true) {\n return `Skipped prerender for \"${descriptor.path}\": authenticated routes are runtime-only by default.`;\n }\n\n if (route.role) {\n return `Skipped prerender for \"${descriptor.path}\": role-gated routes are runtime-only by default.`;\n }\n\n if (route.permission) {\n return `Skipped prerender for \"${descriptor.path}\": permission-gated routes are runtime-only by default.`;\n }\n\n if (route.policies && route.policies.length > 0) {\n return `Skipped prerender for \"${descriptor.path}\": routes with custom policies are runtime-only by default.`;\n }\n\n return null;\n}\n\nfunction resolveParallelism(requested: number | 'auto' | undefined): number {\n if (requested !== 'auto') {\n return Math.max(1, requested ?? 1);\n }\n\n const maybeNavigator = globalThis as typeof globalThis & {\n navigator?: { hardwareConcurrency?: number };\n process?: { env?: Record<string, string | undefined> };\n };\n\n const envWorkers = Number(\n maybeNavigator.process?.env?.ASKR_SSG_WORKERS ??\n maybeNavigator.process?.env?.NUMBER_OF_PROCESSORS ??\n maybeNavigator.process?.env?.UV_THREADPOOL_SIZE\n );\n if (Number.isFinite(envWorkers) && envWorkers > 0) {\n return Math.max(1, Math.trunc(envWorkers));\n }\n\n if (typeof maybeNavigator.navigator?.hardwareConcurrency === 'number') {\n return Math.max(1, maybeNavigator.navigator.hardwareConcurrency);\n }\n\n return 1;\n}\n\n/**\n * Create a Static Site Generator\n *\n * Usage:\n * ```ts\n * const ssg = createStaticGen({\n * routes: [\n * { path: '/', component: HomePage },\n * { path: '/about', component: AboutPage },\n * ],\n * outputDir: './dist',\n * dataOverrides: {\n * '/api/posts': { posts: [...] }\n * }\n * });\n *\n * const result = await ssg.generate();\n * console.log(`Generated ${result.successful}/${result.totalRoutes} routes`);\n * ```\n */\nexport function createStaticGen(options: SSGOptions) {\n let result: SSGResult | null = null;\n const seed = options.seed ?? 12345;\n const resolvedParallelism = resolveParallelism(options.parallelism);\n const resolvedConcurrency = Math.max(\n 1,\n options.concurrency ?? resolvedParallelism\n );\n\n if (!Array.isArray(options.routes) || options.routes.length === 0) {\n throw new Error('routes array is required');\n }\n\n if (!options.outputDir || options.outputDir.trim().length === 0) {\n throw new Error('outputDir is required');\n }\n\n return {\n /**\n * Generate static HTML for all routes\n * Writes to outputDir with metadata.json\n * Returns detailed results\n */\n async generate(\n generateOptions: SSGGenerateOptions = {}\n ): Promise<SSGResult> {\n // Validate input\n validateRoutes(options.routes);\n\n const changedKeys = dedupeStrings(generateOptions.changedKeys);\n const changedRoutes = dedupeStrings(generateOptions.changedRoutes);\n const requestedMode = generateOptions.mode ?? 'full';\n const previousManifest =\n !generateOptions.forceFull && requestedMode === 'incremental'\n ? readIncrementalManifest(options.outputDir, seed)\n : null;\n const effectiveMode: SSGMode =\n generateOptions.forceFull ||\n requestedMode !== 'incremental' ||\n previousManifest === null\n ? 'full'\n : 'incremental';\n\n // Resolve data\n const dataMap = resolveSsgData(options.routes, {\n dataOverrides: options.dataOverrides,\n });\n\n const descriptors = options.routes.map(resolveRouteDescriptor);\n const routeResultsById = new Map<string, RouteRenderResult>();\n const eligibleDescriptors: ResolvedRouteDescriptor[] = [];\n\n for (const descriptor of descriptors) {\n const diagnostic = getRuntimeOnlyDiagnostic(descriptor);\n if (diagnostic) {\n routeResultsById.set(descriptor.routeId, {\n path: descriptor.path,\n filePath: descriptor.filePath,\n html: '',\n fileSize: 0,\n renderDuration: 0,\n resourceCount: 0,\n status: 'skipped',\n reason: 'runtime-only',\n written: false,\n error: diagnostic,\n });\n continue;\n }\n\n eligibleDescriptors.push(descriptor);\n }\n\n const previousEntries = new Map(\n (previousManifest?.routes ?? []).map((entry) => [entry.routeId, entry])\n );\n const currentRouteIds = new Set(\n eligibleDescriptors.map((descriptor) => descriptor.routeId)\n );\n\n const selected: SelectedRoute[] = [];\n const routesToRender: SelectedRoute[] = [];\n for (let index = 0; index < eligibleDescriptors.length; index += 1) {\n const descriptor = eligibleDescriptors[index];\n const entry = selectRouteForGeneration(\n descriptor,\n previousEntries.get(descriptor.routeId) ?? null,\n effectiveMode,\n changedKeys,\n changedRoutes\n );\n selected.push(entry);\n if (entry.reason !== 'unchanged') {\n routesToRender.push(entry);\n }\n }\n const renderStartTime = performance.now();\n incrementPerfMetric('ssgWorkerCount', resolvedParallelism);\n const renderedResults =\n routesToRender.length > 0\n ? await batchRenderRoutes(getRoutesToRender(routesToRender), {\n seed,\n dataMap,\n concurrency: resolvedConcurrency,\n })\n : [];\n addPerfDuration('ssgRenderTimeMs', performance.now() - renderStartTime);\n const renderedByRouteId = new Map<string, RouteRenderResult>();\n for (let index = 0; index < renderedResults.length; index += 1) {\n renderedByRouteId.set(\n routesToRender[index].descriptor.routeId,\n renderedResults[index]\n );\n }\n\n let cacheHits = 0;\n const nextManifestRoutes: IncrementalManifestRouteEntry[] = [];\n\n for (const entry of selected) {\n const { descriptor, previous, reason } = entry;\n const baseData =\n dataMap[descriptor.route.path] ?? dataMap[descriptor.path] ?? {};\n const resourceCount = Object.keys(baseData).length;\n\n if (reason === 'unchanged') {\n routeResultsById.set(descriptor.routeId, {\n path: descriptor.path,\n filePath: descriptor.filePath,\n html: '',\n fileSize:\n previous?.htmlHash !== null && previous !== null\n ? getExistingOutputFileSize(\n options.outputDir,\n descriptor.filePath\n )\n : 0,\n renderDuration: 0,\n resourceCount,\n status: 'skipped',\n reason: 'unchanged',\n written: false,\n });\n\n if (previous) {\n nextManifestRoutes.push({\n ...previous,\n path: descriptor.path,\n filePath: descriptor.filePath,\n invalidationKeys: descriptor.invalidationKeys.slice(),\n });\n }\n continue;\n }\n\n const rendered = renderedByRouteId.get(descriptor.routeId);\n if (!rendered) {\n throw new Error(\n `Missing rendered result for route \"${descriptor.path}\"`\n );\n }\n\n const nextResult: RouteRenderResult = {\n ...rendered,\n path: descriptor.path,\n filePath: descriptor.filePath,\n resourceCount,\n reason,\n written: false,\n };\n\n if (nextResult.status === 'success') {\n const htmlDigest = hashHtml(nextResult.html);\n const shouldWrite =\n effectiveMode === 'full' ||\n !previous ||\n previous.htmlHash !== htmlDigest ||\n !outputFileExists(options.outputDir, descriptor.filePath);\n\n nextResult.written = shouldWrite;\n if (!shouldWrite) {\n cacheHits += 1;\n }\n\n nextManifestRoutes.push({\n routeId: descriptor.routeId,\n path: descriptor.path,\n filePath: descriptor.filePath,\n invalidationKeys: descriptor.invalidationKeys.slice(),\n htmlHash: htmlDigest,\n lastStatus: 'success',\n });\n } else {\n nextManifestRoutes.push({\n routeId: descriptor.routeId,\n path: descriptor.path,\n filePath: descriptor.filePath,\n invalidationKeys: descriptor.invalidationKeys.slice(),\n htmlHash: previous?.htmlHash ?? null,\n lastStatus: 'error',\n });\n }\n\n routeResultsById.set(descriptor.routeId, nextResult);\n }\n\n const removedResults = collectRemovedRouteResults(\n previousManifest,\n currentRouteIds\n );\n const routeResults: RouteRenderResult[] = [];\n for (let index = 0; index < descriptors.length; index += 1) {\n const routeResult = routeResultsById.get(descriptors[index].routeId);\n if (routeResult) {\n routeResults.push(routeResult);\n }\n }\n routeResults.push(...removedResults);\n\n // Write HTML files to disk and remove stale output\n const writeStartTime = performance.now();\n await writeStaticFiles(routeResults, options.outputDir, {\n concurrency: resolvedConcurrency,\n });\n addPerfDuration('ssgWriteTimeMs', performance.now() - writeStartTime);\n\n // Generate result object\n result = generateSSGResult(routeResults, {\n mode: effectiveMode,\n cacheHits,\n invalidatedKeys: changedKeys,\n invalidatedRoutes: changedRoutes,\n });\n\n // Write metadata\n const metadata = resultToMetadata(result);\n await writeMetadata(metadata, options.outputDir);\n\n await writeIncrementalManifest(\n {\n schemaVersion: SSG_MANIFEST_SCHEMA_VERSION,\n seed,\n mode: effectiveMode,\n routes: nextManifestRoutes,\n },\n options.outputDir\n );\n\n return result;\n },\n\n /**\n * Get effective config in a serializable form for diagnostics.\n */\n getConfig() {\n return {\n routeCount: options.routes.length,\n outputDir: options.outputDir,\n seed,\n concurrency: resolvedConcurrency,\n parallelism: resolvedParallelism,\n hasDataOverrides: !!options.dataOverrides,\n };\n },\n\n /**\n * Get the last generation result\n * Returns null if generate() hasn't been called\n */\n getResult(): SSGResult | null {\n return result;\n },\n };\n}\n\nfunction dedupeStrings(values?: string[]): string[] {\n return values ? Array.from(new Set(values)) : [];\n}\n\nfunction getRoutesToRender(selected: SelectedRoute[]): SSGOptions['routes'] {\n const routes: SSGOptions['routes'] = [];\n for (let index = 0; index < selected.length; index += 1) {\n routes.push(selected[index].descriptor.route);\n }\n return routes;\n}\n\nfunction selectRouteForGeneration(\n descriptor: ResolvedRouteDescriptor,\n previous: IncrementalManifestRouteEntry | null,\n mode: SSGMode,\n changedKeys: string[],\n changedRoutes: string[]\n): SelectedRoute {\n if (mode === 'full') {\n return { descriptor, reason: 'full', previous };\n }\n\n if (!previous) {\n return { descriptor, reason: 'new-route', previous };\n }\n\n if (previous.lastStatus === 'error' || previous.htmlHash === null) {\n return { descriptor, reason: 'new-route', previous };\n }\n\n if (descriptor.invalidationKeys.length === 0) {\n return { descriptor, reason: 'no-keys', previous };\n }\n\n if (changedRoutes.includes(descriptor.path)) {\n return { descriptor, reason: 'changed-route', previous };\n }\n\n if (descriptor.invalidationKeys.some((key) => changedKeys.includes(key))) {\n return { descriptor, reason: 'changed-key', previous };\n }\n\n return { descriptor, reason: 'unchanged', previous };\n}\n\nfunction collectRemovedRouteResults(\n manifest: IncrementalManifest | null,\n currentRouteIds: Set<string>\n): RouteRenderResult[] {\n if (!manifest) {\n return [];\n }\n\n const results: RouteRenderResult[] = [];\n for (let index = 0; index < manifest.routes.length; index += 1) {\n const entry = manifest.routes[index];\n if (currentRouteIds.has(entry.routeId)) {\n continue;\n }\n results.push({\n path: entry.path,\n filePath: entry.filePath,\n html: '',\n fileSize: 0,\n renderDuration: 0,\n resourceCount: 0,\n status: 'removed' as const,\n reason: 'deleted' as const,\n written: false,\n });\n }\n\n return results;\n}\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { RouteRenderResult, SSGMetadata, SSGMode, SSGResult } from "./types.js";
2
+
3
+ //#region src/ssg/generate-metadata.d.ts
4
+ interface GenerateResultOptions {
5
+ mode?: SSGMode;
6
+ cacheHits?: number;
7
+ invalidatedKeys?: string[];
8
+ invalidatedRoutes?: string[];
9
+ }
10
+ /**
11
+ * Generate SSGResult from render results
12
+ */
13
+ declare function generateSSGResult(results: RouteRenderResult[], options?: GenerateResultOptions): SSGResult;
14
+ /**
15
+ * Convert SSGResult to metadata for JSON serialization
16
+ */
17
+ declare function resultToMetadata(result: SSGResult): SSGMetadata;
18
+ /**
19
+ * Write metadata.json to output directory
20
+ */
21
+ declare function writeMetadata(metadata: Record<string, unknown>, outputDir: string): Promise<void>;
22
+ //#endregion
23
+ export { generateSSGResult, resultToMetadata, writeMetadata };
24
+ //# sourceMappingURL=generate-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-metadata.d.ts","names":[],"sources":["../../src/ssg/generate-metadata.ts"],"mappings":";;;UAgBU,qBAAA;EACR,IAAA,GAAO,OAAA;EACP,SAAA;EACA,eAAA;EACA,iBAAA;AAAA;;AAMF;;iBAAgB,iBAAA,CACd,OAAA,EAAS,iBAAA,IACT,OAAA,GAAS,qBAAA,GACR,SAAA;;;;iBA6Ca,gBAAA,CAAiB,MAAA,EAAQ,SAAA,GAAY,WAAA;;;;iBAsC/B,aAAA,CACpB,QAAA,EAAU,MAAA,mBACV,SAAA,WACC,OAAA"}
@@ -0,0 +1,94 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as pathModule from "node:path";
3
+ //#region src/ssg/generate-metadata.ts
4
+ /**
5
+ * Metadata generation for SSG
6
+ *
7
+ * Generates and serializes metadata about generated static files.
8
+ * This module is Node-only and not intended for browser builds.
9
+ */
10
+ /**
11
+ * Generate SSGResult from render results
12
+ */
13
+ function generateSSGResult(results, options = {}) {
14
+ let successful = 0;
15
+ let failed = 0;
16
+ let totalDuration = 0;
17
+ let rebuilt = 0;
18
+ let skipped = 0;
19
+ let removed = 0;
20
+ for (let index = 0; index < results.length; index += 1) {
21
+ const result = results[index];
22
+ totalDuration += result.renderDuration;
23
+ if (result.status === "success") {
24
+ successful += 1;
25
+ rebuilt += 1;
26
+ } else if (result.status === "error") {
27
+ failed += 1;
28
+ rebuilt += 1;
29
+ } else if (result.status === "skipped") skipped += 1;
30
+ else if (result.status === "removed") removed += 1;
31
+ }
32
+ return {
33
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
34
+ totalRoutes: results.length,
35
+ successful,
36
+ failed,
37
+ totalDuration: Math.round(totalDuration),
38
+ mode: options.mode ?? "full",
39
+ rebuilt,
40
+ skipped,
41
+ removed,
42
+ cacheHits: options.cacheHits ?? 0,
43
+ invalidatedKeys: options.invalidatedKeys?.slice() ?? [],
44
+ invalidatedRoutes: options.invalidatedRoutes?.slice() ?? [],
45
+ routes: results
46
+ };
47
+ }
48
+ /**
49
+ * Convert SSGResult to metadata for JSON serialization
50
+ */
51
+ function resultToMetadata(result) {
52
+ const routes = [];
53
+ for (let index = 0; index < result.routes.length; index += 1) {
54
+ const route = result.routes[index];
55
+ routes.push({
56
+ path: route.path,
57
+ filePath: route.filePath,
58
+ fileSize: route.fileSize,
59
+ renderDuration: route.renderDuration,
60
+ resourceCount: route.resourceCount,
61
+ status: route.status,
62
+ reason: route.reason,
63
+ written: route.written,
64
+ error: route.error
65
+ });
66
+ }
67
+ return {
68
+ generatedAt: result.generatedAt,
69
+ totalRoutes: result.totalRoutes,
70
+ successful: result.successful,
71
+ failed: result.failed,
72
+ totalDuration: result.totalDuration,
73
+ mode: result.mode,
74
+ rebuilt: result.rebuilt,
75
+ skipped: result.skipped,
76
+ removed: result.removed,
77
+ cacheHits: result.cacheHits,
78
+ invalidatedKeys: result.invalidatedKeys.slice(),
79
+ invalidatedRoutes: result.invalidatedRoutes.slice(),
80
+ routes
81
+ };
82
+ }
83
+ /**
84
+ * Write metadata.json to output directory
85
+ */
86
+ async function writeMetadata(metadata, outputDir) {
87
+ const filePath = pathModule.join(outputDir, "metadata.json");
88
+ await fs.mkdir(outputDir, { recursive: true });
89
+ await fs.writeFile(filePath, JSON.stringify(metadata, null, 2), "utf8");
90
+ }
91
+ //#endregion
92
+ export { generateSSGResult, resultToMetadata, writeMetadata };
93
+
94
+ //# sourceMappingURL=generate-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-metadata.js","names":[],"sources":["../../src/ssg/generate-metadata.ts"],"sourcesContent":["/**\n * Metadata generation for SSG\n *\n * Generates and serializes metadata about generated static files.\n * This module is Node-only and not intended for browser builds.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as pathModule from 'node:path';\nimport type {\n RouteRenderResult,\n SSGMetadata,\n SSGMode,\n SSGResult,\n} from './types';\n\ninterface GenerateResultOptions {\n mode?: SSGMode;\n cacheHits?: number;\n invalidatedKeys?: string[];\n invalidatedRoutes?: string[];\n}\n\n/**\n * Generate SSGResult from render results\n */\nexport function generateSSGResult(\n results: RouteRenderResult[],\n options: GenerateResultOptions = {}\n): SSGResult {\n let successful = 0;\n let failed = 0;\n let totalDuration = 0;\n let rebuilt = 0;\n let skipped = 0;\n let removed = 0;\n\n for (let index = 0; index < results.length; index += 1) {\n const result = results[index];\n totalDuration += result.renderDuration;\n\n if (result.status === 'success') {\n successful += 1;\n rebuilt += 1;\n } else if (result.status === 'error') {\n failed += 1;\n rebuilt += 1;\n } else if (result.status === 'skipped') {\n skipped += 1;\n } else if (result.status === 'removed') {\n removed += 1;\n }\n }\n\n return {\n generatedAt: new Date().toISOString(),\n totalRoutes: results.length,\n successful,\n failed,\n totalDuration: Math.round(totalDuration),\n mode: options.mode ?? 'full',\n rebuilt,\n skipped,\n removed,\n cacheHits: options.cacheHits ?? 0,\n invalidatedKeys: options.invalidatedKeys?.slice() ?? [],\n invalidatedRoutes: options.invalidatedRoutes?.slice() ?? [],\n routes: results,\n };\n}\n\n/**\n * Convert SSGResult to metadata for JSON serialization\n */\nexport function resultToMetadata(result: SSGResult): SSGMetadata {\n const routes: SSGMetadata['routes'] = [];\n\n for (let index = 0; index < result.routes.length; index += 1) {\n const route = result.routes[index];\n routes.push({\n path: route.path,\n filePath: route.filePath,\n fileSize: route.fileSize,\n renderDuration: route.renderDuration,\n resourceCount: route.resourceCount,\n status: route.status,\n reason: route.reason,\n written: route.written,\n error: route.error,\n });\n }\n\n return {\n generatedAt: result.generatedAt,\n totalRoutes: result.totalRoutes,\n successful: result.successful,\n failed: result.failed,\n totalDuration: result.totalDuration,\n mode: result.mode,\n rebuilt: result.rebuilt,\n skipped: result.skipped,\n removed: result.removed,\n cacheHits: result.cacheHits,\n invalidatedKeys: result.invalidatedKeys.slice(),\n invalidatedRoutes: result.invalidatedRoutes.slice(),\n routes,\n };\n}\n\n/**\n * Write metadata.json to output directory\n */\nexport async function writeMetadata(\n metadata: Record<string, unknown>,\n outputDir: string\n): Promise<void> {\n const filePath = pathModule.join(outputDir, 'metadata.json');\n\n // Ensure directory exists\n await fs.mkdir(outputDir, { recursive: true });\n\n // Write metadata file with formatting\n await fs.writeFile(filePath, JSON.stringify(metadata, null, 2), 'utf8');\n}\n"],"mappings":";;;;;;;;;;;;AA0BA,SAAgB,kBACd,SACA,UAAiC,EAAE,EACxB;CACX,IAAI,aAAa;CACjB,IAAI,SAAS;CACb,IAAI,gBAAgB;CACpB,IAAI,UAAU;CACd,IAAI,UAAU;CACd,IAAI,UAAU;AAEd,MAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;EACtD,MAAM,SAAS,QAAQ;AACvB,mBAAiB,OAAO;AAExB,MAAI,OAAO,WAAW,WAAW;AAC/B,iBAAc;AACd,cAAW;aACF,OAAO,WAAW,SAAS;AACpC,aAAU;AACV,cAAW;aACF,OAAO,WAAW,UAC3B,YAAW;WACF,OAAO,WAAW,UAC3B,YAAW;;AAIf,QAAO;EACL,8BAAa,IAAI,MAAM,EAAC,aAAa;EACrC,aAAa,QAAQ;EACrB;EACA;EACA,eAAe,KAAK,MAAM,cAAc;EACxC,MAAM,QAAQ,QAAQ;EACtB;EACA;EACA;EACA,WAAW,QAAQ,aAAa;EAChC,iBAAiB,QAAQ,iBAAiB,OAAO,IAAI,EAAE;EACvD,mBAAmB,QAAQ,mBAAmB,OAAO,IAAI,EAAE;EAC3D,QAAQ;EACT;;;;;AAMH,SAAgB,iBAAiB,QAAgC;CAC/D,MAAM,SAAgC,EAAE;AAExC,MAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,OAAO,QAAQ,SAAS,GAAG;EAC5D,MAAM,QAAQ,OAAO,OAAO;AAC5B,SAAO,KAAK;GACV,MAAM,MAAM;GACZ,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB,gBAAgB,MAAM;GACtB,eAAe,MAAM;GACrB,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,OAAO,MAAM;GACd,CAAC;;AAGJ,QAAO;EACL,aAAa,OAAO;EACpB,aAAa,OAAO;EACpB,YAAY,OAAO;EACnB,QAAQ,OAAO;EACf,eAAe,OAAO;EACtB,MAAM,OAAO;EACb,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB,WAAW,OAAO;EAClB,iBAAiB,OAAO,gBAAgB,OAAO;EAC/C,mBAAmB,OAAO,kBAAkB,OAAO;EACnD;EACD;;;;;AAMH,eAAsB,cACpB,UACA,WACe;CACf,MAAM,WAAW,WAAW,KAAK,WAAW,gBAAgB;AAG5D,OAAM,GAAG,MAAM,WAAW,EAAE,WAAW,MAAM,CAAC;AAG9C,OAAM,GAAG,UAAU,UAAU,KAAK,UAAU,UAAU,MAAM,EAAE,EAAE,OAAO"}
@@ -0,0 +1,56 @@
1
+ import * as fsPromises from "node:fs/promises";
2
+ import * as fs from "node:fs";
3
+ import * as pathModule from "node:path";
4
+ const MANIFEST_DIR = ".askr";
5
+ const MANIFEST_FILE = "ssg-manifest.json";
6
+ function hashHtml(html) {
7
+ let hash = 2166136261;
8
+ for (let index = 0; index < html.length; index += 1) {
9
+ hash ^= html.charCodeAt(index);
10
+ hash = Math.imul(hash, 16777619);
11
+ }
12
+ return (hash >>> 0).toString(16).padStart(8, "0");
13
+ }
14
+ function getIncrementalManifestPath(outputDir) {
15
+ return pathModule.join(outputDir, MANIFEST_DIR, MANIFEST_FILE);
16
+ }
17
+ function readIncrementalManifest(outputDir, seed) {
18
+ const manifestPath = getIncrementalManifestPath(outputDir);
19
+ if (!fs.existsSync(manifestPath)) return null;
20
+ try {
21
+ const raw = fs.readFileSync(manifestPath, "utf8");
22
+ const parsed = JSON.parse(raw);
23
+ if (parsed.schemaVersion !== 1 || parsed.seed !== seed || !Array.isArray(parsed.routes)) return null;
24
+ 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"));
25
+ if (routes.length !== parsed.routes.length) return null;
26
+ return {
27
+ schemaVersion: 1,
28
+ seed,
29
+ mode: parsed.mode === "incremental" ? "incremental" : "full",
30
+ routes
31
+ };
32
+ } catch {
33
+ return null;
34
+ }
35
+ }
36
+ async function writeIncrementalManifest(manifest, outputDir) {
37
+ const manifestPath = getIncrementalManifestPath(outputDir);
38
+ await fsPromises.mkdir(pathModule.dirname(manifestPath), { recursive: true });
39
+ await fsPromises.writeFile(manifestPath, JSON.stringify(manifest, null, 2), "utf8");
40
+ }
41
+ function getExistingOutputFileSize(outputDir, filePath) {
42
+ const fullPath = pathModule.join(outputDir, filePath);
43
+ if (!fs.existsSync(fullPath)) return 0;
44
+ try {
45
+ return fs.statSync(fullPath).size;
46
+ } catch {
47
+ return 0;
48
+ }
49
+ }
50
+ function outputFileExists(outputDir, filePath) {
51
+ return fs.existsSync(pathModule.join(outputDir, filePath));
52
+ }
53
+ //#endregion
54
+ export { getExistingOutputFileSize, hashHtml, outputFileExists, readIncrementalManifest, writeIncrementalManifest };
55
+
56
+ //# sourceMappingURL=incremental-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-manifest.js","names":[],"sources":["../../src/ssg/incremental-manifest.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as fsPromises from 'node:fs/promises';\nimport * as pathModule from 'node:path';\nimport type { RouteRenderStatus, SSGMode } from './types';\n\nexport const SSG_MANIFEST_SCHEMA_VERSION = 1;\nconst MANIFEST_DIR = '.askr';\nconst MANIFEST_FILE = 'ssg-manifest.json';\n\nexport interface IncrementalManifestRouteEntry {\n routeId: string;\n path: string;\n filePath: string;\n invalidationKeys: string[];\n htmlHash: string | null;\n lastStatus: Extract<RouteRenderStatus, 'success' | 'error'>;\n}\n\nexport interface IncrementalManifest {\n schemaVersion: number;\n seed: number;\n mode: SSGMode;\n routes: IncrementalManifestRouteEntry[];\n}\n\nexport function hashHtml(html: string): string {\n // Deterministic 32-bit FNV-1a hash is sufficient for incremental change checks.\n let hash = 0x811c9dc5;\n for (let index = 0; index < html.length; index += 1) {\n hash ^= html.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\nexport function getIncrementalManifestPath(outputDir: string): string {\n return pathModule.join(outputDir, MANIFEST_DIR, MANIFEST_FILE);\n}\n\nexport function readIncrementalManifest(\n outputDir: string,\n seed: number\n): IncrementalManifest | null {\n const manifestPath = getIncrementalManifestPath(outputDir);\n if (!fs.existsSync(manifestPath)) {\n return null;\n }\n\n try {\n const raw = fs.readFileSync(manifestPath, 'utf8');\n const parsed = JSON.parse(raw) as Partial<IncrementalManifest>;\n\n if (\n parsed.schemaVersion !== SSG_MANIFEST_SCHEMA_VERSION ||\n parsed.seed !== seed ||\n !Array.isArray(parsed.routes)\n ) {\n return null;\n }\n\n const routes = parsed.routes.filter(\n (entry): entry is IncrementalManifestRouteEntry =>\n !!entry &&\n typeof entry.routeId === 'string' &&\n typeof entry.path === 'string' &&\n typeof entry.filePath === 'string' &&\n Array.isArray(entry.invalidationKeys) &&\n (entry.htmlHash === null || typeof entry.htmlHash === 'string') &&\n (entry.lastStatus === 'success' || entry.lastStatus === 'error')\n );\n\n if (routes.length !== parsed.routes.length) {\n return null;\n }\n\n return {\n schemaVersion: SSG_MANIFEST_SCHEMA_VERSION,\n seed,\n mode: parsed.mode === 'incremental' ? 'incremental' : 'full',\n routes,\n };\n } catch {\n return null;\n }\n}\n\nexport async function writeIncrementalManifest(\n manifest: IncrementalManifest,\n outputDir: string\n): Promise<void> {\n const manifestPath = getIncrementalManifestPath(outputDir);\n await fsPromises.mkdir(pathModule.dirname(manifestPath), { recursive: true });\n await fsPromises.writeFile(\n manifestPath,\n JSON.stringify(manifest, null, 2),\n 'utf8'\n );\n}\n\nexport function getExistingOutputFileSize(\n outputDir: string,\n filePath: string\n): number {\n const fullPath = pathModule.join(outputDir, filePath);\n if (!fs.existsSync(fullPath)) {\n return 0;\n }\n\n try {\n return fs.statSync(fullPath).size;\n } catch {\n return 0;\n }\n}\n\nexport function outputFileExists(outputDir: string, filePath: string): boolean {\n return fs.existsSync(pathModule.join(outputDir, filePath));\n}\n"],"mappings":";;;AAMA,MAAM,eAAe;AACrB,MAAM,gBAAgB;AAkBtB,SAAgB,SAAS,MAAsB;CAE7C,IAAI,OAAO;AACX,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAQ,KAAK,WAAW,MAAM;AAC9B,SAAO,KAAK,KAAK,MAAM,SAAW;;AAEpC,SAAQ,SAAS,GAAG,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI;;AAGnD,SAAgB,2BAA2B,WAA2B;AACpE,QAAO,WAAW,KAAK,WAAW,cAAc,cAAc;;AAGhE,SAAgB,wBACd,WACA,MAC4B;CAC5B,MAAM,eAAe,2BAA2B,UAAU;AAC1D,KAAI,CAAC,GAAG,WAAW,aAAa,CAC9B,QAAO;AAGT,KAAI;EACF,MAAM,MAAM,GAAG,aAAa,cAAc,OAAO;EACjD,MAAM,SAAS,KAAK,MAAM,IAAI;AAE9B,MACE,OAAO,kBAAA,KACP,OAAO,SAAS,QAChB,CAAC,MAAM,QAAQ,OAAO,OAAO,CAE7B,QAAO;EAGT,MAAM,SAAS,OAAO,OAAO,QAC1B,UACC,CAAC,CAAC,SACF,OAAO,MAAM,YAAY,YACzB,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,aAAa,YAC1B,MAAM,QAAQ,MAAM,iBAAiB,KACpC,MAAM,aAAa,QAAQ,OAAO,MAAM,aAAa,cACrD,MAAM,eAAe,aAAa,MAAM,eAAe,SAC3D;AAED,MAAI,OAAO,WAAW,OAAO,OAAO,OAClC,QAAO;AAGT,SAAO;GACL,eAAA;GACA;GACA,MAAM,OAAO,SAAS,gBAAgB,gBAAgB;GACtD;GACD;SACK;AACN,SAAO;;;AAIX,eAAsB,yBACpB,UACA,WACe;CACf,MAAM,eAAe,2BAA2B,UAAU;AAC1D,OAAM,WAAW,MAAM,WAAW,QAAQ,aAAa,EAAE,EAAE,WAAW,MAAM,CAAC;AAC7E,OAAM,WAAW,UACf,cACA,KAAK,UAAU,UAAU,MAAM,EAAE,EACjC,OACD;;AAGH,SAAgB,0BACd,WACA,UACQ;CACR,MAAM,WAAW,WAAW,KAAK,WAAW,SAAS;AACrD,KAAI,CAAC,GAAG,WAAW,SAAS,CAC1B,QAAO;AAGT,KAAI;AACF,SAAO,GAAG,SAAS,SAAS,CAAC;SACvB;AACN,SAAO;;;AAIX,SAAgB,iBAAiB,WAAmB,UAA2B;AAC7E,QAAO,GAAG,WAAW,WAAW,KAAK,WAAW,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { DiscoveredResources, RouteConfig, RouteRenderReason, RouteRenderResult, RouteRenderStatus, SSGGenerateOptions, SSGMetadata, SSGMode, SSGOptions, SSGResult } from "./types.js";
2
+ import { createStaticGen } from "./create-static-gen.js";
3
+ import { batchRenderRoutes } from "./batch-render.js";
4
+ import { getOutputFilePath } from "./route-utils.js";
5
+ import { writeStaticFiles } from "./write-static-files.js";
6
+ import { generateSSGResult, resultToMetadata, writeMetadata } from "./generate-metadata.js";
7
+ import { resolveSsgData, validateRoutes } from "./resolve-ssg-data.js";
8
+ export { type DiscoveredResources, type RouteConfig, type RouteRenderReason, type RouteRenderResult, type RouteRenderStatus, type SSGGenerateOptions, type SSGMetadata, type SSGMode, type SSGOptions, type SSGResult, batchRenderRoutes, createStaticGen, generateSSGResult, getOutputFilePath, resolveSsgData, resultToMetadata, validateRoutes, writeMetadata, writeStaticFiles };
@@ -0,0 +1,7 @@
1
+ import { resolveSsgData, validateRoutes } from "./resolve-ssg-data.js";
2
+ import { getOutputFilePath } from "./route-utils.js";
3
+ import { batchRenderRoutes } from "./batch-render.js";
4
+ import { writeStaticFiles } from "./write-static-files.js";
5
+ import { generateSSGResult, resultToMetadata, writeMetadata } from "./generate-metadata.js";
6
+ import { createStaticGen } from "./create-static-gen.js";
7
+ export { batchRenderRoutes, createStaticGen, generateSSGResult, getOutputFilePath, resolveSsgData, resultToMetadata, validateRoutes, writeMetadata, writeStaticFiles };
@@ -0,0 +1,23 @@
1
+ import { RouteConfig } from "./types.js";
2
+ import { SSRData } from "../common/ssr.js";
3
+
4
+ //#region src/ssg/resolve-ssg-data.d.ts
5
+ interface DataResolutionOptions {
6
+ /** User-supplied data overrides per route path */
7
+ dataOverrides?: Record<string, unknown>;
8
+ }
9
+ /**
10
+ * Resolve and validate data for SSG routes
11
+ * Returns a map of route path -> SSRData
12
+ *
13
+ * In phase 1: accepts user-supplied dataOverrides
14
+ * In phase 2: can be extended to auto-discover resources
15
+ */
16
+ declare function resolveSsgData(routes: RouteConfig[], options?: DataResolutionOptions): Record<string, SSRData>;
17
+ /**
18
+ * Validate routes are properly configured
19
+ */
20
+ declare function validateRoutes(routes: RouteConfig[]): void;
21
+ //#endregion
22
+ export { resolveSsgData, validateRoutes };
23
+ //# sourceMappingURL=resolve-ssg-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-ssg-data.d.ts","names":[],"sources":["../../src/ssg/resolve-ssg-data.ts"],"mappings":";;;;UAUU,qBAAA;EAYM;EAVd,aAAA,GAAgB,MAAA;AAAA;;;;;;;;iBAUF,cAAA,CACd,MAAA,EAAQ,WAAA,IACR,OAAA,GAAS,qBAAA,GACR,MAAA,SAAe,OAAA;;;;iBAyBF,cAAA,CAAe,MAAA,EAAQ,WAAA"}
@@ -0,0 +1,46 @@
1
+ //#region src/ssg/resolve-ssg-data.ts
2
+ /**
3
+ * Resolve and validate data for SSG routes
4
+ * Returns a map of route path -> SSRData
5
+ *
6
+ * In phase 1: accepts user-supplied dataOverrides
7
+ * In phase 2: can be extended to auto-discover resources
8
+ */
9
+ function resolveSsgData(routes, options = {}) {
10
+ const { dataOverrides = {} } = options;
11
+ const dataMap = {};
12
+ for (const route of routes) if (route.path in dataOverrides) {
13
+ const data = dataOverrides[route.path];
14
+ if (typeof data !== "object" || data === null || Array.isArray(data)) throw new Error(`data for route "${route.path}" must be an object, got ${typeof data}`);
15
+ dataMap[route.path] = data;
16
+ }
17
+ return dataMap;
18
+ }
19
+ /**
20
+ * Validate routes are properly configured
21
+ */
22
+ function validateRoutes(routes) {
23
+ if (!Array.isArray(routes)) throw new Error("routes must be an array");
24
+ if (routes.length === 0) throw new Error("routes array cannot be empty");
25
+ const seen = /* @__PURE__ */ new Set();
26
+ for (const route of routes) {
27
+ if (typeof route.path !== "string" || !route.path.startsWith("/")) throw new Error(`route path must be a string starting with "/", got "${route.path}"`);
28
+ if (typeof (route.handler ?? route.component) !== "function") throw new Error(`route handler must be a function for path "${route.path}"`);
29
+ const key = `${route.path}::${JSON.stringify(route.params || {})}`;
30
+ if (seen.has(key)) throw new Error(`duplicate route entry detected for path "${route.path}"`);
31
+ seen.add(key);
32
+ if (route.path.includes("{")) {
33
+ const paramNames = Array.from(route.path.matchAll(/\{([^}]+)\}/g)).map((m) => m[1]);
34
+ if (!route.params) throw new Error(`route "${route.path}" uses path parameters and requires params`);
35
+ for (const name of paramNames) if (!(name in route.params)) throw new Error(`route "${route.path}" missing required param "${name}"`);
36
+ }
37
+ if (route.invalidationKeys !== void 0) {
38
+ if (!Array.isArray(route.invalidationKeys)) throw new Error(`route "${route.path}" invalidationKeys must be an array of strings`);
39
+ 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`);
40
+ }
41
+ }
42
+ }
43
+ //#endregion
44
+ export { resolveSsgData, validateRoutes };
45
+
46
+ //# sourceMappingURL=resolve-ssg-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-ssg-data.js","names":[],"sources":["../../src/ssg/resolve-ssg-data.ts"],"sourcesContent":["/**\n * Data resolution for SSG\n *\n * Merges user-supplied data overrides with any auto-discovered resources.\n * In phase 1, primarily handles user-supplied data.\n */\n\nimport type { SSRData } from '../common/ssr';\nimport type { RouteConfig } from './types';\n\ninterface DataResolutionOptions {\n /** User-supplied data overrides per route path */\n dataOverrides?: Record<string, unknown>;\n}\n\n/**\n * Resolve and validate data for SSG routes\n * Returns a map of route path -> SSRData\n *\n * In phase 1: accepts user-supplied dataOverrides\n * In phase 2: can be extended to auto-discover resources\n */\nexport function resolveSsgData(\n routes: RouteConfig[],\n options: DataResolutionOptions = {}\n): Record<string, SSRData> {\n const { dataOverrides = {} } = options;\n const dataMap: Record<string, SSRData> = {};\n\n for (const route of routes) {\n // Check if user provided data for this route\n if (route.path in dataOverrides) {\n const data = dataOverrides[route.path];\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new Error(\n `data for route \"${route.path}\" must be an object, got ${typeof data}`\n );\n }\n dataMap[route.path] = data as SSRData;\n }\n // In phase 1, routes without data are rendered with no SSR data\n // Phase 2 can add auto-discovery here\n }\n\n return dataMap;\n}\n\n/**\n * Validate routes are properly configured\n */\nexport function validateRoutes(routes: RouteConfig[]): void {\n if (!Array.isArray(routes)) {\n throw new Error('routes must be an array');\n }\n\n if (routes.length === 0) {\n throw new Error('routes array cannot be empty');\n }\n\n const seen = new Set<string>();\n\n for (const route of routes) {\n if (typeof route.path !== 'string' || !route.path.startsWith('/')) {\n throw new Error(\n `route path must be a string starting with \"/\", got \"${route.path}\"`\n );\n }\n\n const handler = route.handler ?? route.component;\n if (typeof handler !== 'function') {\n throw new Error(\n `route handler must be a function for path \"${route.path}\"`\n );\n }\n\n const key = `${route.path}::${JSON.stringify(route.params || {})}`;\n if (seen.has(key)) {\n throw new Error(\n `duplicate route entry detected for path \"${route.path}\"`\n );\n }\n seen.add(key);\n\n if (route.path.includes('{')) {\n const paramNames = Array.from(route.path.matchAll(/\\{([^}]+)\\}/g)).map(\n (m) => m[1]\n );\n if (!route.params) {\n throw new Error(\n `route \"${route.path}\" uses path parameters and requires params`\n );\n }\n for (const name of paramNames) {\n if (!(name in route.params)) {\n throw new Error(\n `route \"${route.path}\" missing required param \"${name}\"`\n );\n }\n }\n }\n\n if (route.invalidationKeys !== undefined) {\n if (!Array.isArray(route.invalidationKeys)) {\n throw new Error(\n `route \"${route.path}\" invalidationKeys must be an array of strings`\n );\n }\n for (const key of route.invalidationKeys) {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(\n `route \"${route.path}\" invalidationKeys must contain only non-empty strings`\n );\n }\n }\n }\n }\n}\n"],"mappings":";;;;;;;;AAsBA,SAAgB,eACd,QACA,UAAiC,EAAE,EACV;CACzB,MAAM,EAAE,gBAAgB,EAAE,KAAK;CAC/B,MAAM,UAAmC,EAAE;AAE3C,MAAK,MAAM,SAAS,OAElB,KAAI,MAAM,QAAQ,eAAe;EAC/B,MAAM,OAAO,cAAc,MAAM;AACjC,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,KAAK,CAClE,OAAM,IAAI,MACR,mBAAmB,MAAM,KAAK,2BAA2B,OAAO,OACjE;AAEH,UAAQ,MAAM,QAAQ;;AAM1B,QAAO;;;;;AAMT,SAAgB,eAAe,QAA6B;AAC1D,KAAI,CAAC,MAAM,QAAQ,OAAO,CACxB,OAAM,IAAI,MAAM,0BAA0B;AAG5C,KAAI,OAAO,WAAW,EACpB,OAAM,IAAI,MAAM,+BAA+B;CAGjD,MAAM,uBAAO,IAAI,KAAa;AAE9B,MAAK,MAAM,SAAS,QAAQ;AAC1B,MAAI,OAAO,MAAM,SAAS,YAAY,CAAC,MAAM,KAAK,WAAW,IAAI,CAC/D,OAAM,IAAI,MACR,uDAAuD,MAAM,KAAK,GACnE;AAIH,MAAI,QADY,MAAM,WAAW,MAAM,eAChB,WACrB,OAAM,IAAI,MACR,8CAA8C,MAAM,KAAK,GAC1D;EAGH,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,KAAK,UAAU,MAAM,UAAU,EAAE,CAAC;AAChE,MAAI,KAAK,IAAI,IAAI,CACf,OAAM,IAAI,MACR,4CAA4C,MAAM,KAAK,GACxD;AAEH,OAAK,IAAI,IAAI;AAEb,MAAI,MAAM,KAAK,SAAS,IAAI,EAAE;GAC5B,MAAM,aAAa,MAAM,KAAK,MAAM,KAAK,SAAS,eAAe,CAAC,CAAC,KAChE,MAAM,EAAE,GACV;AACD,OAAI,CAAC,MAAM,OACT,OAAM,IAAI,MACR,UAAU,MAAM,KAAK,4CACtB;AAEH,QAAK,MAAM,QAAQ,WACjB,KAAI,EAAE,QAAQ,MAAM,QAClB,OAAM,IAAI,MACR,UAAU,MAAM,KAAK,4BAA4B,KAAK,GACvD;;AAKP,MAAI,MAAM,qBAAqB,QAAW;AACxC,OAAI,CAAC,MAAM,QAAQ,MAAM,iBAAiB,CACxC,OAAM,IAAI,MACR,UAAU,MAAM,KAAK,gDACtB;AAEH,QAAK,MAAM,OAAO,MAAM,iBACtB,KAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,EAC5C,OAAM,IAAI,MACR,UAAU,MAAM,KAAK,wDACtB"}
@@ -0,0 +1,16 @@
1
+ import { RouteConfig } from "./types.js";
2
+
3
+ //#region src/ssg/route-utils.d.ts
4
+ interface ResolvedRouteDescriptor {
5
+ route: RouteConfig;
6
+ path: string;
7
+ filePath: string;
8
+ routeId: string;
9
+ invalidationKeys: string[];
10
+ }
11
+ declare function getOutputFilePath(pathStr: string): string;
12
+ declare function interpolateRoutePath(routePath: string, params?: Record<string, string>): string;
13
+ declare function resolveRouteDescriptor(route: RouteConfig): ResolvedRouteDescriptor;
14
+ //#endregion
15
+ export { getOutputFilePath };
16
+ //# sourceMappingURL=route-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-utils.d.ts","names":[],"sources":["../../src/ssg/route-utils.ts"],"mappings":";;;UAEiB,uBAAA;EACf,KAAA,EAAO,WAAA;EACP,IAAA;EACA,QAAA;EACA,OAAA;EACA,gBAAA;AAAA;AAAA,iBAGc,iBAAA,CAAkB,OAAA;AAAA,iBAQlB,oBAAA,CACd,SAAA,UACA,MAAA,GAAS,MAAA;AAAA,iBASK,sBAAA,CACd,KAAA,EAAO,WAAA,GACN,uBAAA"}
@@ -0,0 +1,24 @@
1
+ //#region src/ssg/route-utils.ts
2
+ function getOutputFilePath(pathStr) {
3
+ if (pathStr === "/") return "index.html";
4
+ return `${pathStr.replace(/^\/|\/$/g, "")}/index.html`;
5
+ }
6
+ function interpolateRoutePath(routePath, params) {
7
+ if (!params) return routePath;
8
+ return routePath.replace(/\{([^}]+)\}/g, (_, key) => params[key] ?? "");
9
+ }
10
+ function resolveRouteDescriptor(route) {
11
+ const path = interpolateRoutePath(route.path, route.params);
12
+ const filePath = getOutputFilePath(path);
13
+ return {
14
+ route,
15
+ path,
16
+ filePath,
17
+ routeId: `${path}::${filePath}`,
18
+ invalidationKeys: route.invalidationKeys?.slice() ?? []
19
+ };
20
+ }
21
+ //#endregion
22
+ export { getOutputFilePath, interpolateRoutePath, resolveRouteDescriptor };
23
+
24
+ //# sourceMappingURL=route-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-utils.js","names":[],"sources":["../../src/ssg/route-utils.ts"],"sourcesContent":["import type { RouteConfig } from './types';\n\nexport interface ResolvedRouteDescriptor {\n route: RouteConfig;\n path: string;\n filePath: string;\n routeId: string;\n invalidationKeys: string[];\n}\n\nexport function getOutputFilePath(pathStr: string): string {\n if (pathStr === '/') {\n return 'index.html';\n }\n const normalized = pathStr.replace(/^\\/|\\/$/g, '');\n return `${normalized}/index.html`;\n}\n\nexport function interpolateRoutePath(\n routePath: string,\n params?: Record<string, string>\n): string {\n if (!params) return routePath;\n return routePath.replace(\n /\\{([^}]+)\\}/g,\n (_, key: string) => params[key] ?? ''\n );\n}\n\nexport function resolveRouteDescriptor(\n route: RouteConfig\n): ResolvedRouteDescriptor {\n const path = interpolateRoutePath(route.path, route.params);\n const filePath = getOutputFilePath(path);\n return {\n route,\n path,\n filePath,\n routeId: `${path}::${filePath}`,\n invalidationKeys: route.invalidationKeys?.slice() ?? [],\n };\n}\n"],"mappings":";AAUA,SAAgB,kBAAkB,SAAyB;AACzD,KAAI,YAAY,IACd,QAAO;AAGT,QAAO,GADY,QAAQ,QAAQ,YAAY,GACrC,CAAW;;AAGvB,SAAgB,qBACd,WACA,QACQ;AACR,KAAI,CAAC,OAAQ,QAAO;AACpB,QAAO,UAAU,QACf,iBACC,GAAG,QAAgB,OAAO,QAAQ,GACpC;;AAGH,SAAgB,uBACd,OACyB;CACzB,MAAM,OAAO,qBAAqB,MAAM,MAAM,MAAM,OAAO;CAC3D,MAAM,WAAW,kBAAkB,KAAK;AACxC,QAAO;EACL;EACA;EACA;EACA,SAAS,GAAG,KAAK,IAAI;EACrB,kBAAkB,MAAM,kBAAkB,OAAO,IAAI,EAAE;EACxD"}
@@ -0,0 +1,177 @@
1
+ import { ComponentFunction } from "../common/component.js";
2
+ import { RouteAuthMode, RouteHandler, RoutePolicy } from "../common/router.js";
3
+
4
+ //#region src/ssg/types.d.ts
5
+ type SSGMode = 'full' | 'incremental';
6
+ type RouteRenderStatus = 'success' | 'error' | 'skipped' | 'removed';
7
+ type RouteRenderReason = 'full' | 'changed-key' | 'changed-route' | 'new-route' | 'no-keys' | 'unchanged' | 'deleted' | 'runtime-only';
8
+ /**
9
+ * Route config accepted by SSG.
10
+ *
11
+ * `handler` is preferred and matches router/SSR naming.
12
+ * `component` is kept for compatibility and is normalized to `handler`.
13
+ */
14
+ interface RouteConfig {
15
+ /** URL path to generate (e.g., "/blog/post-1", "/") */
16
+ path: string;
17
+ /** Route handler compatible with router/SSR */
18
+ handler?: RouteHandler;
19
+ /** Backward-compatible alias for handler */
20
+ component?: ComponentFunction;
21
+ /** Optional base props merged with route params during render */
22
+ props?: Record<string, unknown>;
23
+ /** Optional namespace for router compatibility */
24
+ namespace?: string;
25
+ /** Guest routes remain prerenderable; authenticated routes are runtime-only by default */
26
+ auth?: RouteAuthMode;
27
+ /** Role-gated routes are runtime-only by default */
28
+ role?: string;
29
+ /** Permission-gated routes are runtime-only by default */
30
+ permission?: string;
31
+ /** Advanced runtime access checks disable prerendering by default */
32
+ policies?: readonly RoutePolicy[];
33
+ /** Optional path parameter map for template paths like "/blog/{slug}" */
34
+ params?: Record<string, string>;
35
+ /** Optional explicit invalidation keys for incremental generation */
36
+ invalidationKeys?: string[];
37
+ /**
38
+ * SSG entry generator for parameterized routes.
39
+ *
40
+ * Return one param map per page to be generated. The path template is
41
+ * expanded with each map to produce a concrete URL, e.g.:
42
+ *
43
+ * ```ts
44
+ * route('/posts/{slug}', PostPage, {
45
+ * entries: async () => getPosts().map(p => ({ slug: p.slug })),
46
+ * });
47
+ * ```
48
+ */
49
+ entries?: () => Array<Record<string, string>> | Promise<Array<Record<string, string>>>;
50
+ }
51
+ /** Options for createStaticGen */
52
+ interface SSGOptions {
53
+ /** Routes to generate */
54
+ routes: RouteConfig[];
55
+ /** Output directory for generated HTML files */
56
+ outputDir: string;
57
+ /** Optional seed for deterministic rendering */
58
+ seed?: number;
59
+ /** Optional override data for resources (route-keyed) */
60
+ dataOverrides?: Record<string, unknown>;
61
+ /** Optional concurrency limit for rendering (default: 10) */
62
+ concurrency?: number;
63
+ /** Preferred render parallelism. `'auto'` resolves from the host machine. */
64
+ parallelism?: number | 'auto';
65
+ }
66
+ /** Options for a single generation run */
67
+ interface SSGGenerateOptions {
68
+ /** Generation mode */
69
+ mode?: SSGMode;
70
+ /** Changed invalidation keys for incremental runs */
71
+ changedKeys?: string[];
72
+ /** Changed concrete route paths for incremental runs */
73
+ changedRoutes?: string[];
74
+ /** Force a full rebuild even when incremental mode was requested */
75
+ forceFull?: boolean;
76
+ }
77
+ /** Result of rendering a single route */
78
+ interface RouteRenderResult {
79
+ /** URL path */
80
+ path: string;
81
+ /** Output file path relative to outputDir */
82
+ filePath: string;
83
+ /** Generated HTML content */
84
+ html: string;
85
+ /** File size in bytes */
86
+ fileSize: number;
87
+ /** Render duration in milliseconds */
88
+ renderDuration: number;
89
+ /** Number of resources discovered and rendered */
90
+ resourceCount: number;
91
+ /** Render or generation status */
92
+ status: RouteRenderStatus;
93
+ /** Why this route was rendered, skipped, or removed */
94
+ reason: RouteRenderReason;
95
+ /** Whether the output file was written during this run */
96
+ written: boolean;
97
+ /** Error message if rendering failed */
98
+ error?: string;
99
+ }
100
+ /** Overall result from SSG generation */
101
+ interface SSGResult {
102
+ /** ISO timestamp of generation */
103
+ generatedAt: string;
104
+ /** Total number of routes processed */
105
+ totalRoutes: number;
106
+ /** Number of successfully generated routes */
107
+ successful: number;
108
+ /** Number of failed routes */
109
+ failed: number;
110
+ /** Total generation duration in milliseconds */
111
+ totalDuration: number;
112
+ /** Effective generation mode */
113
+ mode: SSGMode;
114
+ /** Number of routes rendered during this run */
115
+ rebuilt: number;
116
+ /** Number of current routes skipped as unchanged */
117
+ skipped: number;
118
+ /** Number of stale routes removed from output */
119
+ removed: number;
120
+ /** Number of rendered routes whose HTML bytes were unchanged */
121
+ cacheHits: number;
122
+ /** Invalidation keys applied to this run */
123
+ invalidatedKeys: string[];
124
+ /** Concrete route paths applied to this run */
125
+ invalidatedRoutes: string[];
126
+ /** Per-route results */
127
+ routes: RouteRenderResult[];
128
+ }
129
+ /** Metadata to write to metadata.json */
130
+ interface SSGMetadata extends Record<string, unknown> {
131
+ /** ISO timestamp of generation */
132
+ generatedAt: string;
133
+ /** Total number of routes processed */
134
+ totalRoutes: number;
135
+ /** Number of successfully generated routes */
136
+ successful: number;
137
+ /** Number of failed routes */
138
+ failed: number;
139
+ /** Total generation duration in milliseconds */
140
+ totalDuration: number;
141
+ /** Effective generation mode */
142
+ mode: SSGMode;
143
+ /** Number of routes rendered during this run */
144
+ rebuilt: number;
145
+ /** Number of current routes skipped as unchanged */
146
+ skipped: number;
147
+ /** Number of stale routes removed from output */
148
+ removed: number;
149
+ /** Number of rendered routes whose HTML bytes were unchanged */
150
+ cacheHits: number;
151
+ /** Invalidation keys applied to this run */
152
+ invalidatedKeys: string[];
153
+ /** Concrete route paths applied to this run */
154
+ invalidatedRoutes: string[];
155
+ /** Per-route details */
156
+ routes: Array<{
157
+ /** URL path */path: string; /** Output file path relative to outputDir */
158
+ filePath: string; /** File size in bytes */
159
+ fileSize: number; /** Render duration in milliseconds */
160
+ renderDuration: number; /** Number of resources discovered and rendered */
161
+ resourceCount: number; /** Render or generation status */
162
+ status: RouteRenderStatus; /** Why this route was rendered, skipped, or removed */
163
+ reason: RouteRenderReason; /** Whether the output file was written during this run */
164
+ written: boolean; /** Error message if rendering failed */
165
+ error?: string;
166
+ }>;
167
+ }
168
+ /** Resource discovery result for a single route */
169
+ interface DiscoveredResources {
170
+ [key: string]: {
171
+ count: number;
172
+ dependencies: string[];
173
+ };
174
+ }
175
+ //#endregion
176
+ export { DiscoveredResources, RouteConfig, RouteRenderReason, RouteRenderResult, RouteRenderStatus, SSGGenerateOptions, SSGMetadata, SSGMode, SSGOptions, SSGResult };
177
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/ssg/types.ts"],"mappings":";;;;KAWY,OAAA;AAAA,KAEA,iBAAA;AAAA,KAEA,iBAAA;;AAFZ;;;;;UAkBiB,WAAA;EAhBY;EAkB3B,IAAA;EAlB2B;EAoB3B,OAAA,GAAU,YAAA;EAJK;EAMf,SAAA,GAAY,iBAAA;;EAEZ,KAAA,GAAQ,MAAA;EAFI;EAIZ,SAAA;EAEO;EAAP,IAAA,GAAO,aAAA;EAQE;EANT,IAAA;EAsBI;EApBJ,UAAA;EAqBY;EAnBZ,QAAA,YAAoB,WAAA;EAmBT;EAjBX,MAAA,GAAS,MAAA;EAlBT;EAoBA,gBAAA;EAlBU;;;;;;;;;;;;EA+BV,OAAA,SACI,KAAA,CAAM,MAAA,oBACN,OAAA,CAAQ,KAAA,CAAM,MAAA;AAAA;;UAIH,UAAA;EALX;EAOJ,MAAA,EAAQ,WAAA;EANJ;EAQJ,SAAA;EARkB;EAUlB,IAAA;EAVwB;EAYxB,aAAA,GAAgB,MAAA;EARS;EAUzB,WAAA;EAFsB;EAItB,WAAA;AAAA;;UAIe,kBAAA;EARf;EAUA,IAAA,GAAO,OAAA;EARP;EAUA,WAAA;EARW;EAUX,aAAA;EANe;EAQf,SAAA;AAAA;;UAIe,iBAAA;EAVR;EAYP,IAAA;EARA;EAUA,QAAA;EARS;EAUT,IAAA;EANe;EAQf,QAAA;;EAEA,cAAA;EARA;EAUA,aAAA;EANA;EAQA,MAAA,EAAQ,iBAAA;EAJR;EAMA,MAAA,EAAQ,iBAAA;EAFR;EAIA,OAAA;EAFA;EAIA,KAAA;AAAA;;UAIe,SAAA;EAJV;EAML,WAAA;EAFwB;EAIxB,WAAA;EAsByB;EApBzB,UAAA;EAFA;EAIA,MAAA;EAAA;EAEA,aAAA;EAEA;EAAA,IAAA,EAAM,OAAA;EAEN;EAAA,OAAA;EAIA;EAFA,OAAA;EAMA;EAJA,OAAA;EAQA;EANA,SAAA;EAMyB;EAJzB,eAAA;EAQe;EANf,iBAAA;;EAEA,MAAA,EAAQ,iBAAA;AAAA;;UAIO,WAAA,SAAoB,MAAA;EAAA;EAEnC,WAAA;EAFyC;EAIzC,WAAA;EAFA;EAIA,UAAA;EAAA;EAEA,MAAA;EAEA;EAAA,aAAA;EAEM;EAAN,IAAA,EAAM,OAAA;EAIN;EAFA,OAAA;EAMA;EAJA,OAAA;EAQA;EANA,OAAA;EAQQ;EANR,SAAA;EAUE;EARF,eAAA;EAYE;EAVF,iBAAA;EAcE;EAZF,MAAA,EAAQ,KAAA;IAcN,eAZA,IAAA,UAcA;IAZA,QAAA,UAcK;IAZL,QAAA,UAiBa;IAfb,cAAA,UAegC;IAbhC,aAAA,UAcD;IAZC,MAAA,EAAQ,iBAAA,EAcR;IAZA,MAAA,EAAQ,iBAAA,EAYI;IAVZ,OAAA;IAEA,KAAA;EAAA;AAAA;;UAKa,mBAAA;EAAA,CACd,GAAA;IACC,KAAA;IACA,YAAA;EAAA;AAAA"}
@@ -0,0 +1,15 @@
1
+ import { RouteRenderResult } from "./types.js";
2
+ import { getOutputFilePath } from "./route-utils.js";
3
+
4
+ //#region src/ssg/write-static-files.d.ts
5
+ interface WriteStaticFilesOptions {
6
+ concurrency?: number;
7
+ }
8
+ /**
9
+ * Write rendered routes to disk
10
+ * Creates outputDir/{route-path}/index.html structure
11
+ */
12
+ declare function writeStaticFiles(results: RouteRenderResult[], outputDir: string, options?: WriteStaticFilesOptions): Promise<void>;
13
+ //#endregion
14
+ export { writeStaticFiles };
15
+ //# sourceMappingURL=write-static-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-static-files.d.ts","names":[],"sources":["../../src/ssg/write-static-files.ts"],"mappings":";;;;UAYU,uBAAA;EACR,WAAA;AAAA;;;;;iBAOoB,gBAAA,CACpB,OAAA,EAAS,iBAAA,IACT,SAAA,UACA,OAAA,GAAS,uBAAA,GACR,OAAA"}