@askrjs/askr 0.0.48 → 0.0.50

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 (401) hide show
  1. package/dist/benchmark.js +6 -6
  2. package/dist/benchmark.js.map +1 -1
  3. package/dist/boot/hydration.js +140 -0
  4. package/dist/boot/hydration.js.map +1 -0
  5. package/dist/boot/index.d.ts +3 -56
  6. package/dist/boot/index.d.ts.map +1 -1
  7. package/dist/boot/index.js +62 -410
  8. package/dist/boot/index.js.map +1 -1
  9. package/dist/boot/root-lifecycle.d.ts +15 -0
  10. package/dist/boot/root-lifecycle.d.ts.map +1 -0
  11. package/dist/boot/root-lifecycle.js +205 -0
  12. package/dist/boot/root-lifecycle.js.map +1 -0
  13. package/dist/boot/route-startup.js +45 -0
  14. package/dist/boot/route-startup.js.map +1 -0
  15. package/dist/boot/types.d.ts +62 -0
  16. package/dist/boot/types.d.ts.map +1 -0
  17. package/dist/common/component.d.ts +3 -1
  18. package/dist/common/component.d.ts.map +1 -1
  19. package/dist/common/jsx.d.ts +6 -2
  20. package/dist/common/jsx.d.ts.map +1 -1
  21. package/dist/common/jsx.js.map +1 -1
  22. package/dist/common/props.d.ts +1 -1
  23. package/dist/common/render-context.js +55 -0
  24. package/dist/common/render-context.js.map +1 -0
  25. package/dist/common/router.d.ts +5 -1
  26. package/dist/common/router.d.ts.map +1 -1
  27. package/dist/common/ssr.d.ts +1 -1
  28. package/dist/common/ssr.js.map +1 -1
  29. package/dist/common/vnode.d.ts +5 -4
  30. package/dist/common/vnode.d.ts.map +1 -1
  31. package/dist/common/vnode.js.map +1 -1
  32. package/dist/components/error-boundary.d.ts +1 -1
  33. package/dist/components/error-boundary.js +2 -1
  34. package/dist/components/error-boundary.js.map +1 -1
  35. package/dist/components/link.js.map +1 -1
  36. package/dist/control/for.js +2 -1
  37. package/dist/control/for.js.map +1 -1
  38. package/dist/data/data-runtime.d.ts +28 -0
  39. package/dist/data/data-runtime.d.ts.map +1 -0
  40. package/dist/data/data-runtime.js +114 -0
  41. package/dist/data/data-runtime.js.map +1 -0
  42. package/dist/data/index.d.ts +6 -142
  43. package/dist/data/index.js +5 -539
  44. package/dist/data/invalidation.d.ts +9 -0
  45. package/dist/data/invalidation.d.ts.map +1 -0
  46. package/dist/data/invalidation.js +27 -0
  47. package/dist/data/invalidation.js.map +1 -0
  48. package/dist/data/mutation-cell.d.ts +28 -0
  49. package/dist/data/mutation-cell.d.ts.map +1 -0
  50. package/dist/data/mutation-cell.js +132 -0
  51. package/dist/data/mutation-cell.js.map +1 -0
  52. package/dist/data/query-cell.d.ts +46 -0
  53. package/dist/data/query-cell.d.ts.map +1 -0
  54. package/dist/data/query-cell.js +290 -0
  55. package/dist/data/query-cell.js.map +1 -0
  56. package/dist/data/query-key.js +42 -0
  57. package/dist/data/query-key.js.map +1 -0
  58. package/dist/data/shared.js +20 -0
  59. package/dist/data/shared.js.map +1 -0
  60. package/dist/data/types.d.ts +161 -0
  61. package/dist/data/types.d.ts.map +1 -0
  62. package/dist/foundations/icon/icon.d.ts.map +1 -1
  63. package/dist/foundations/icon/icon.js.map +1 -1
  64. package/dist/foundations/structures/portal.d.ts +1 -1
  65. package/dist/foundations/structures/portal.d.ts.map +1 -1
  66. package/dist/foundations/structures/portal.js +2 -1
  67. package/dist/foundations/structures/portal.js.map +1 -1
  68. package/dist/fx/fx.d.ts +1 -1
  69. package/dist/fx/fx.js +5 -4
  70. package/dist/fx/fx.js.map +1 -1
  71. package/dist/fx/timing.d.ts.map +1 -1
  72. package/dist/fx/timing.js +10 -6
  73. package/dist/fx/timing.js.map +1 -1
  74. package/dist/index.d.ts +3 -2
  75. package/dist/index.js +4 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/jsx/index.d.ts +2 -1
  78. package/dist/jsx/index.js +3 -2
  79. package/dist/jsx/types.d.ts +3 -1
  80. package/dist/jsx/types.d.ts.map +1 -1
  81. package/dist/jsx/types.js +2 -1
  82. package/dist/jsx-dev-runtime.d.ts +2 -2
  83. package/dist/jsx-dev-runtime.d.ts.map +1 -1
  84. package/dist/jsx-dev-runtime.js.map +1 -1
  85. package/dist/jsx-runtime.d.ts +2 -2
  86. package/dist/jsx-runtime.d.ts.map +1 -1
  87. package/dist/jsx-runtime.js.map +1 -1
  88. package/dist/jsx-runtime2.d.ts +3 -2
  89. package/dist/jsx-runtime2.js +3 -2
  90. package/dist/renderer/attributes.js +231 -0
  91. package/dist/renderer/attributes.js.map +1 -0
  92. package/dist/renderer/boundaries.js +266 -0
  93. package/dist/renderer/boundaries.js.map +1 -0
  94. package/dist/renderer/child-shape.js +85 -0
  95. package/dist/renderer/child-shape.js.map +1 -0
  96. package/dist/renderer/children.js +3 -2
  97. package/dist/renderer/children.js.map +1 -1
  98. package/dist/renderer/cleanup.js +2 -1
  99. package/dist/renderer/cleanup.js.map +1 -1
  100. package/dist/renderer/component-host-cleanup.js +68 -0
  101. package/dist/renderer/component-host-cleanup.js.map +1 -0
  102. package/dist/renderer/component-host-instances.js +65 -0
  103. package/dist/renderer/component-host-instances.js.map +1 -0
  104. package/dist/renderer/component-host.js +247 -0
  105. package/dist/renderer/component-host.js.map +1 -0
  106. package/dist/renderer/dom-host.js +13 -0
  107. package/dist/renderer/dom-host.js.map +1 -0
  108. package/dist/renderer/dom-internal.js +185 -0
  109. package/dist/renderer/dom-internal.js.map +1 -0
  110. package/dist/renderer/dom.js +9 -2356
  111. package/dist/renderer/element-children.js +279 -0
  112. package/dist/renderer/element-children.js.map +1 -0
  113. package/dist/renderer/env.js +2 -1
  114. package/dist/renderer/error-boundary-dom.js +29 -0
  115. package/dist/renderer/error-boundary-dom.js.map +1 -0
  116. package/dist/renderer/evaluate-dom-range.js +85 -0
  117. package/dist/renderer/evaluate-dom-range.js.map +1 -0
  118. package/dist/renderer/evaluate-reconcile.js +281 -0
  119. package/dist/renderer/evaluate-reconcile.js.map +1 -0
  120. package/dist/renderer/evaluate.js +13 -399
  121. package/dist/renderer/evaluate.js.map +1 -1
  122. package/dist/renderer/fastpath.js +6 -5
  123. package/dist/renderer/fastpath.js.map +1 -1
  124. package/dist/renderer/for-commit-dom-map.js +83 -0
  125. package/dist/renderer/for-commit-dom-map.js.map +1 -0
  126. package/dist/renderer/for-commit-removal.js +36 -0
  127. package/dist/renderer/for-commit-removal.js.map +1 -0
  128. package/dist/renderer/for-commit-reorder.js +89 -0
  129. package/dist/renderer/for-commit-reorder.js.map +1 -0
  130. package/dist/renderer/for-commit.js +6 -188
  131. package/dist/renderer/for-commit.js.map +1 -1
  132. package/dist/renderer/index.js +28 -16
  133. package/dist/renderer/index.js.map +1 -1
  134. package/dist/renderer/keyed-children.js +32 -0
  135. package/dist/renderer/keyed-children.js.map +1 -0
  136. package/dist/renderer/keyed.js +2 -15
  137. package/dist/renderer/keyed.js.map +1 -1
  138. package/dist/renderer/namespaces.js +23 -0
  139. package/dist/renderer/namespaces.js.map +1 -0
  140. package/dist/renderer/prop-bindings.js +280 -0
  141. package/dist/renderer/prop-bindings.js.map +1 -0
  142. package/dist/renderer/reactive-child-dom.js +133 -0
  143. package/dist/renderer/reactive-child-dom.js.map +1 -0
  144. package/dist/renderer/reactive-child-sources.js +184 -0
  145. package/dist/renderer/reactive-child-sources.js.map +1 -0
  146. package/dist/renderer/reactive-children.js +294 -0
  147. package/dist/renderer/reactive-children.js.map +1 -0
  148. package/dist/renderer/reconcile-commit.js +38 -0
  149. package/dist/renderer/reconcile-commit.js.map +1 -0
  150. package/dist/renderer/reconcile-fastpaths.js +106 -0
  151. package/dist/renderer/reconcile-fastpaths.js.map +1 -0
  152. package/dist/renderer/reconcile-resolution.js +187 -0
  153. package/dist/renderer/reconcile-resolution.js.map +1 -0
  154. package/dist/renderer/reconcile.js +9 -371
  155. package/dist/renderer/reconcile.js.map +1 -1
  156. package/dist/renderer/retained-element-rollback.js +276 -0
  157. package/dist/renderer/retained-element-rollback.js.map +1 -0
  158. package/dist/renderer/stable-patch.js +82 -0
  159. package/dist/renderer/stable-patch.js.map +1 -0
  160. package/dist/renderer/static-reuse.js +96 -0
  161. package/dist/renderer/static-reuse.js.map +1 -0
  162. package/dist/renderer/types.js +2 -1
  163. package/dist/renderer/utils.js +4 -4
  164. package/dist/renderer/utils.js.map +1 -1
  165. package/dist/resources/index.d.ts +3 -2
  166. package/dist/resources/index.js +5 -2
  167. package/dist/router/access.js +36 -0
  168. package/dist/router/access.js.map +1 -0
  169. package/dist/router/activity.d.ts +10 -0
  170. package/dist/router/activity.d.ts.map +1 -0
  171. package/dist/router/activity.js +89 -0
  172. package/dist/router/activity.js.map +1 -0
  173. package/dist/router/authoring.d.ts +22 -0
  174. package/dist/router/authoring.d.ts.map +1 -0
  175. package/dist/router/authoring.js +198 -0
  176. package/dist/router/authoring.js.map +1 -0
  177. package/dist/router/index.d.ts +12 -4
  178. package/dist/router/index.js +10 -3
  179. package/dist/router/internal-types.d.ts +31 -0
  180. package/dist/router/internal-types.d.ts.map +1 -0
  181. package/dist/router/lazy.d.ts +19 -0
  182. package/dist/router/lazy.d.ts.map +1 -0
  183. package/dist/router/lazy.js +52 -0
  184. package/dist/router/lazy.js.map +1 -0
  185. package/dist/router/manifest.d.ts +10 -0
  186. package/dist/router/manifest.d.ts.map +1 -0
  187. package/dist/router/manifest.js +49 -0
  188. package/dist/router/manifest.js.map +1 -0
  189. package/dist/router/navigate.d.ts +4 -51
  190. package/dist/router/navigate.d.ts.map +1 -1
  191. package/dist/router/navigate.js +16 -459
  192. package/dist/router/navigate.js.map +1 -1
  193. package/dist/router/navigation-registry.d.ts +32 -0
  194. package/dist/router/navigation-registry.d.ts.map +1 -0
  195. package/dist/router/navigation-registry.js +105 -0
  196. package/dist/router/navigation-registry.js.map +1 -0
  197. package/dist/router/navigation-scroll.d.ts +14 -0
  198. package/dist/router/navigation-scroll.d.ts.map +1 -0
  199. package/dist/router/navigation-scroll.js +93 -0
  200. package/dist/router/navigation-scroll.js.map +1 -0
  201. package/dist/router/navigation-targets.d.ts +31 -0
  202. package/dist/router/navigation-targets.d.ts.map +1 -0
  203. package/dist/router/navigation-targets.js +253 -0
  204. package/dist/router/navigation-targets.js.map +1 -0
  205. package/dist/router/policy.d.ts +7 -1
  206. package/dist/router/policy.d.ts.map +1 -1
  207. package/dist/router/policy.js +27 -9
  208. package/dist/router/policy.js.map +1 -1
  209. package/dist/router/rendering.d.ts +10 -0
  210. package/dist/router/rendering.d.ts.map +1 -0
  211. package/dist/router/rendering.js +45 -0
  212. package/dist/router/rendering.js.map +1 -0
  213. package/dist/router/resolution.d.ts +17 -0
  214. package/dist/router/resolution.d.ts.map +1 -0
  215. package/dist/router/resolution.js +253 -0
  216. package/dist/router/resolution.js.map +1 -0
  217. package/dist/router/route-query.d.ts +17 -0
  218. package/dist/router/route-query.d.ts.map +1 -0
  219. package/dist/router/route-query.js +47 -0
  220. package/dist/router/route-query.js.map +1 -0
  221. package/dist/router/route.d.ts +8 -149
  222. package/dist/router/route.js +8 -854
  223. package/dist/router/store.d.ts +50 -0
  224. package/dist/router/store.d.ts.map +1 -0
  225. package/dist/router/store.js +171 -0
  226. package/dist/router/store.js.map +1 -0
  227. package/dist/runtime/access.js +45 -0
  228. package/dist/runtime/access.js.map +1 -0
  229. package/dist/runtime/child-scope.d.ts +1 -1
  230. package/dist/runtime/child-scope.js +4 -1
  231. package/dist/runtime/child-scope.js.map +1 -1
  232. package/dist/runtime/component-cleanup.d.ts +16 -0
  233. package/dist/runtime/component-cleanup.d.ts.map +1 -0
  234. package/dist/runtime/component-cleanup.js +70 -0
  235. package/dist/runtime/component-cleanup.js.map +1 -0
  236. package/dist/runtime/component-commit.js +165 -0
  237. package/dist/runtime/component-commit.js.map +1 -0
  238. package/dist/runtime/component-contracts.js +5 -0
  239. package/dist/runtime/component-facade.d.ts +5 -0
  240. package/dist/runtime/component-facade.js +4 -0
  241. package/dist/runtime/component-internal.d.ts +100 -0
  242. package/dist/runtime/component-internal.d.ts.map +1 -0
  243. package/dist/runtime/component-internal.js +219 -0
  244. package/dist/runtime/component-internal.js.map +1 -0
  245. package/dist/runtime/component-lifecycle.d.ts +49 -0
  246. package/dist/runtime/component-lifecycle.d.ts.map +1 -0
  247. package/dist/runtime/component-lifecycle.js +176 -0
  248. package/dist/runtime/component-lifecycle.js.map +1 -0
  249. package/dist/runtime/component-scope.d.ts +55 -0
  250. package/dist/runtime/component-scope.d.ts.map +1 -0
  251. package/dist/runtime/component-scope.js +154 -0
  252. package/dist/runtime/component-scope.js.map +1 -0
  253. package/dist/runtime/component.d.ts +4 -152
  254. package/dist/runtime/component.js +4 -692
  255. package/dist/runtime/context.d.ts +1 -1
  256. package/dist/runtime/context.js +6 -4
  257. package/dist/runtime/context.js.map +1 -1
  258. package/dist/runtime/control.d.ts +3 -3
  259. package/dist/runtime/control.js +2 -1
  260. package/dist/runtime/control.js.map +1 -1
  261. package/dist/runtime/derive.d.ts.map +1 -1
  262. package/dist/runtime/derive.js +6 -5
  263. package/dist/runtime/derive.js.map +1 -1
  264. package/dist/runtime/effect.d.ts +1 -1
  265. package/dist/runtime/effect.d.ts.map +1 -1
  266. package/dist/runtime/effect.js +2 -2
  267. package/dist/runtime/effect.js.map +1 -1
  268. package/dist/runtime/events.js +3 -3
  269. package/dist/runtime/events.js.map +1 -1
  270. package/dist/runtime/fastlane.js +13 -27
  271. package/dist/runtime/fastlane.js.map +1 -1
  272. package/dist/runtime/for-bench.d.ts +1 -1
  273. package/dist/runtime/for-bench.js +1 -4
  274. package/dist/runtime/for-bench.js.map +1 -1
  275. package/dist/runtime/for-internal.d.ts +43 -0
  276. package/dist/runtime/for-internal.d.ts.map +1 -0
  277. package/dist/runtime/for-internal.js +98 -0
  278. package/dist/runtime/for-internal.js.map +1 -0
  279. package/dist/runtime/for-reconcile.d.ts +8 -0
  280. package/dist/runtime/for-reconcile.d.ts.map +1 -0
  281. package/dist/runtime/for-reconcile.js +389 -0
  282. package/dist/runtime/for-reconcile.js.map +1 -0
  283. package/dist/runtime/for-scopes.d.ts +26 -0
  284. package/dist/runtime/for-scopes.d.ts.map +1 -0
  285. package/dist/runtime/for-scopes.js +160 -0
  286. package/dist/runtime/for-scopes.js.map +1 -0
  287. package/dist/runtime/for-signals.d.ts +30 -0
  288. package/dist/runtime/for-signals.d.ts.map +1 -0
  289. package/dist/runtime/for-signals.js +139 -0
  290. package/dist/runtime/for-signals.js.map +1 -0
  291. package/dist/runtime/for.d.ts +4 -66
  292. package/dist/runtime/for.js +5 -773
  293. package/dist/runtime/lifecycle-operations.d.ts +31 -0
  294. package/dist/runtime/lifecycle-operations.d.ts.map +1 -0
  295. package/dist/runtime/lifecycle-operations.js +195 -0
  296. package/dist/runtime/lifecycle-operations.js.map +1 -0
  297. package/dist/runtime/operations.d.ts +3 -40
  298. package/dist/runtime/operations.js +2 -357
  299. package/dist/runtime/readable.d.ts +2 -3
  300. package/dist/runtime/readable.d.ts.map +1 -1
  301. package/dist/runtime/readable.js +6 -5
  302. package/dist/runtime/readable.js.map +1 -1
  303. package/dist/runtime/resource-cell.js +2 -2
  304. package/dist/runtime/resource-cell.js.map +1 -1
  305. package/dist/runtime/resource-operation.d.ts +13 -0
  306. package/dist/runtime/resource-operation.d.ts.map +1 -0
  307. package/dist/runtime/resource-operation.js +170 -0
  308. package/dist/runtime/resource-operation.js.map +1 -0
  309. package/dist/runtime/runtime.d.ts +42 -0
  310. package/dist/runtime/runtime.d.ts.map +1 -0
  311. package/dist/runtime/runtime.js +59 -0
  312. package/dist/runtime/runtime.js.map +1 -0
  313. package/dist/runtime/scheduler.d.ts +5 -1
  314. package/dist/runtime/scheduler.d.ts.map +1 -1
  315. package/dist/runtime/scheduler.js +17 -17
  316. package/dist/runtime/scheduler.js.map +1 -1
  317. package/dist/runtime/selector.js +4 -3
  318. package/dist/runtime/selector.js.map +1 -1
  319. package/dist/runtime/snapshot-source.d.ts +1 -1
  320. package/dist/runtime/snapshot-source.js +1 -1
  321. package/dist/runtime/state.js +2 -1
  322. package/dist/runtime/state.js.map +1 -1
  323. package/dist/ssg/batch-render.js +2 -1
  324. package/dist/ssg/batch-render.js.map +1 -1
  325. package/dist/ssg/create-static-gen.d.ts +9 -3
  326. package/dist/ssg/create-static-gen.d.ts.map +1 -1
  327. package/dist/ssg/create-static-gen.js +12 -99
  328. package/dist/ssg/create-static-gen.js.map +1 -1
  329. package/dist/ssg/generation-plan.js +70 -0
  330. package/dist/ssg/generation-plan.js.map +1 -0
  331. package/dist/ssg/incremental-manifest.js +1 -1
  332. package/dist/ssg/static-routes.js +101 -0
  333. package/dist/ssg/static-routes.js.map +1 -0
  334. package/dist/ssg/types.d.ts +15 -7
  335. package/dist/ssg/types.d.ts.map +1 -1
  336. package/dist/ssr/boundaries.js +113 -0
  337. package/dist/ssr/boundaries.js.map +1 -0
  338. package/dist/ssr/component-runtime.js +111 -0
  339. package/dist/ssr/component-runtime.js.map +1 -0
  340. package/dist/ssr/context.d.ts +3 -1
  341. package/dist/ssr/context.d.ts.map +1 -1
  342. package/dist/ssr/context.js +9 -2
  343. package/dist/ssr/context.js.map +1 -1
  344. package/dist/ssr/errors.d.ts +2 -0
  345. package/dist/ssr/errors.js +11 -1
  346. package/dist/ssr/errors.js.map +1 -1
  347. package/dist/ssr/escape.js +3 -3
  348. package/dist/ssr/escape.js.map +1 -1
  349. package/dist/ssr/hydration-data.js +10 -0
  350. package/dist/ssr/hydration-data.js.map +1 -0
  351. package/dist/ssr/hydration-verify.d.ts +12 -0
  352. package/dist/ssr/hydration-verify.d.ts.map +1 -0
  353. package/dist/ssr/hydration-verify.js +144 -0
  354. package/dist/ssr/hydration-verify.js.map +1 -0
  355. package/dist/ssr/index-internal.d.ts +15 -0
  356. package/dist/ssr/index-internal.d.ts.map +1 -0
  357. package/dist/ssr/index-internal.js +19 -0
  358. package/dist/ssr/index-internal.js.map +1 -0
  359. package/dist/ssr/index.d.ts +5 -57
  360. package/dist/ssr/index.js +3 -738
  361. package/dist/ssr/render-keys.js +9 -32
  362. package/dist/ssr/render-keys.js.map +1 -1
  363. package/dist/ssr/render-resolved.d.ts +1 -1
  364. package/dist/ssr/render-resolved.d.ts.map +1 -1
  365. package/dist/ssr/render-resolved.js +4 -2
  366. package/dist/ssr/render-resolved.js.map +1 -1
  367. package/dist/ssr/render-sync.d.ts +21 -0
  368. package/dist/ssr/render-sync.d.ts.map +1 -0
  369. package/dist/ssr/render-sync.js +275 -0
  370. package/dist/ssr/render-sync.js.map +1 -0
  371. package/dist/ssr/route-policy-resolution.js +77 -0
  372. package/dist/ssr/route-policy-resolution.js.map +1 -0
  373. package/dist/ssr/route-render.d.ts +77 -0
  374. package/dist/ssr/route-render.d.ts.map +1 -0
  375. package/dist/ssr/route-render.js +119 -0
  376. package/dist/ssr/route-render.js.map +1 -0
  377. package/dist/ssr/sink.d.ts +26 -0
  378. package/dist/ssr/sink.d.ts.map +1 -0
  379. package/dist/ssr/types.d.ts +1 -0
  380. package/dist/ssr/types.d.ts.map +1 -1
  381. package/dist/ssr/verify-hydration.js.map +1 -1
  382. package/dist/testing/index.d.ts +1 -2
  383. package/dist/testing/index.d.ts.map +1 -1
  384. package/dist/testing/index.js +2 -1
  385. package/dist/testing/index.js.map +1 -1
  386. package/package.json +4 -3
  387. package/dist/data/index.d.ts.map +0 -1
  388. package/dist/data/index.js.map +0 -1
  389. package/dist/renderer/dom.js.map +0 -1
  390. package/dist/router/route.d.ts.map +0 -1
  391. package/dist/router/route.js.map +0 -1
  392. package/dist/runtime/component.d.ts.map +0 -1
  393. package/dist/runtime/component.js.map +0 -1
  394. package/dist/runtime/for.d.ts.map +0 -1
  395. package/dist/runtime/for.js.map +0 -1
  396. package/dist/runtime/operations.d.ts.map +0 -1
  397. package/dist/runtime/operations.js.map +0 -1
  398. package/dist/runtime/ssr-bridge.js +0 -24
  399. package/dist/runtime/ssr-bridge.js.map +0 -1
  400. package/dist/ssr/index.d.ts.map +0 -1
  401. package/dist/ssr/index.js.map +0 -1
@@ -10,6 +10,7 @@ interface RenderContext {
10
10
  routes?: readonly Route[];
11
11
  routeAuth?: RouteAuthOptions;
12
12
  signal?: AbortSignal;
13
+ dataRuntime?: unknown;
13
14
  queryCache?: Map<string, unknown>;
14
15
  ssrCleanupFns: Array<() => void>;
15
16
  keyCounter: number;
@@ -23,6 +24,7 @@ declare function createRenderContext(seed?: number, opts?: {
23
24
  routes?: readonly Route[];
24
25
  routeAuth?: RouteAuthOptions;
25
26
  signal?: AbortSignal;
27
+ dataRuntime?: unknown;
26
28
  }): RenderContext;
27
29
  /**
28
30
  * Run a function with the given render context.
@@ -44,5 +46,5 @@ declare function runWithSSRContext<T>(ctx: RenderContext, fn: () => T): T;
44
46
  */
45
47
  declare function throwSSRDataMissing(): never;
46
48
  //#endregion
47
- export { RenderContext };
49
+ export { RenderContext, type SSRData, SSRDataMissingError, getRenderContext, withRenderContext };
48
50
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","names":[],"sources":["../../src/ssr/context.ts"],"mappings":";;;;UAgBiB,aAAA;EACf,GAAA;EACA,IAAA;EACA,IAAA,GAAO,OAAA;EACP,MAAA,GAAS,MAAA;EACT,MAAA,YAAkB,KAAA;EAClB,SAAA,GAAY,gBAAA;EACZ,MAAA,GAAS,WAAA;EACT,UAAA,GAAa,GAAA;EACb,aAAA,EAAe,KAAA;EAEf,UAAA;EACA,UAAA,EAAY,MAAA;AAAA;AAAA,KAIF,UAAA,GAAa,aAAa;AAAA,iBAoDtB,mBAAA,CACd,IAAA,WACA,IAAA;EACE,GAAA;EACA,IAAA,GAAO,OAAA;EACP,MAAA,GAAS,MAAA;EACT,MAAA,YAAkB,KAAA;EAClB,SAAA,GAAY,gBAAA;EACZ,MAAA,GAAS,WAAA;AAAA,IAEV,aAAA;;;;;iBAsBa,iBAAA,IAAqB,GAAA,EAAK,aAAA,EAAe,EAAA,QAAU,CAAA,GAAI,CAAA;;AAxFnD;AAIpB;;iBAuGgB,gBAAA,IAAoB,aAAa;AAAA,cASpC,aAAA,SAAa,gBAAmB;AAAA,cAChC,cAAA,SAAc,iBAAoB;AAAA,cAClC,oBAAA,SAAoB,gBAAmB;AAAA,iBAEpC,iBAAA,IAAqB,GAAA,EAAK,aAAA,EAAe,EAAA,QAAU,CAAA,GAAI,CAAA;;;;;iBASvD,mBAAA"}
1
+ {"version":3,"file":"context.d.ts","names":[],"sources":["../../src/ssr/context.ts"],"mappings":";;;;UAqBiB,aAAA;EACf,GAAA;EACA,IAAA;EACA,IAAA,GAAO,OAAA;EACP,MAAA,GAAS,MAAA;EACT,MAAA,YAAkB,KAAA;EAClB,SAAA,GAAY,gBAAA;EACZ,MAAA,GAAS,WAAA;EACT,WAAA;EACA,UAAA,GAAa,GAAA;EACb,aAAA,EAAe,KAAA;EAEf,UAAA;EACA,UAAA,EAAY,MAAA;AAAA;AAAA,KAIF,UAAA,GAAa,aAAa;AAAA,iBAoDtB,mBAAA,CACd,IAAA,WACA,IAAA;EACE,GAAA;EACA,IAAA,GAAO,OAAA;EACP,MAAA,GAAS,MAAA;EACT,MAAA,YAAkB,KAAA;EAClB,SAAA,GAAY,gBAAA;EACZ,MAAA,GAAS,WAAA;EACT,WAAA;AAAA,IAED,aAAA;;;;;iBAuBa,iBAAA,IAAqB,GAAA,EAAK,aAAA,EAAe,EAAA,QAAU,CAAA,GAAI,CAAA;AA1FnD;AAIpB;;;AAJoB,iBAiHJ,gBAAA,IAAoB,aAAa;AAAA,cAapC,aAAA,SAAa,gBAAmB;AAAA,cAChC,cAAA,SAAc,iBAAoB;AAAA,cAClC,oBAAA,SAAoB,gBAAmB;AAAA,iBAEpC,iBAAA,IAAqB,GAAA,EAAK,aAAA,EAAe,EAAA,QAAU,CAAA,GAAI,CAAA;;;;;iBASvD,mBAAA"}
@@ -1,4 +1,6 @@
1
+ import { isPromiseLike } from "../common/promise.js";
1
2
  import { SSRDataMissingError } from "../common/ssr-errors.js";
3
+ import { configureRenderContextProvider } from "../common/render-context.js";
2
4
  import "./errors.js";
3
5
  import { clearEscapeCache } from "./escape.js";
4
6
  //#region src/ssr/context.ts
@@ -9,6 +11,7 @@ import { clearEscapeCache } from "./escape.js";
9
11
  * Node SSR lazily installs AsyncLocalStorage on first use; browser builds use
10
12
  * the fallback stack.
11
13
  */
14
+ const FALLBACK_ASYNC_CONTEXT_ERROR = "[Askr] async SSR render context fallback is unsupported in this environment. Use synchronous SSR rendering or a runtime with AsyncLocalStorage.";
12
15
  let renderContextAccessor = null;
13
16
  let renderContextAccessorInitialized = false;
14
17
  let fallbackStack = null;
@@ -41,6 +44,7 @@ function createRenderContext(seed = 12345, opts = {}) {
41
44
  routes: opts.routes,
42
45
  routeAuth: opts.routeAuth,
43
46
  signal: opts.signal,
47
+ dataRuntime: opts.dataRuntime,
44
48
  queryCache: /* @__PURE__ */ new Map(),
45
49
  ssrCleanupFns: [],
46
50
  keyCounter: 0,
@@ -57,7 +61,9 @@ function withRenderContext(ctx, fn) {
57
61
  const prev = fallbackStack;
58
62
  fallbackStack = ctx;
59
63
  try {
60
- return fn();
64
+ const result = fn();
65
+ if (isPromiseLike(result)) throw new Error(FALLBACK_ASYNC_CONTEXT_ERROR);
66
+ return result;
61
67
  } finally {
62
68
  fallbackStack = prev;
63
69
  }
@@ -71,6 +77,7 @@ function getRenderContext() {
71
77
  if (renderContextAccessor) return renderContextAccessor.getStore() ?? null;
72
78
  return fallbackStack;
73
79
  }
80
+ configureRenderContextProvider({ getRenderContext });
74
81
  /**
75
82
  * Centralized SSR enforcement helper — throws a consistent error when async
76
83
  * data is encountered during synchronous SSR.
@@ -79,6 +86,6 @@ function throwSSRDataMissing() {
79
86
  throw new SSRDataMissingError();
80
87
  }
81
88
  //#endregion
82
- export { createRenderContext, getRenderContext, throwSSRDataMissing, withRenderContext };
89
+ export { SSRDataMissingError, createRenderContext, getRenderContext, throwSSRDataMissing, withRenderContext };
83
90
 
84
91
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../src/ssr/context.ts"],"sourcesContent":["/**\n * SSR Context Management\n *\n * Provides render-context storage for server-side rendering.\n * Node SSR lazily installs AsyncLocalStorage on first use; browser builds use\n * the fallback stack.\n */\n\nimport { SSRDataMissingError } from './errors';\nimport { clearEscapeCache } from './escape';\n\nexport type { SSRData } from '../common/ssr';\nimport type { SSRData } from '../common/ssr';\nimport type { Route, RouteAuthOptions } from '../common/router';\n\n// Unified per-render context combining SSRContext and RenderContext\nexport interface RenderContext {\n url: string;\n seed: number;\n data?: SSRData;\n params?: Record<string, string>;\n routes?: readonly Route[];\n routeAuth?: RouteAuthOptions;\n signal?: AbortSignal;\n queryCache?: Map<string, unknown>;\n ssrCleanupFns: Array<() => void>;\n // Per-render key state (moved from render-keys.ts globals)\n keyCounter: number;\n renderData: Record<string, unknown> | null;\n}\n\n// Legacy alias for compatibility\nexport type SSRContext = RenderContext;\n\ntype RenderContextAccessor = {\n getStore(): RenderContext | undefined;\n run<R>(store: RenderContext, fn: () => R): R;\n};\n\ntype AsyncHooksModule = {\n AsyncLocalStorage?: new () => RenderContextAccessor;\n};\n\nlet renderContextAccessor: RenderContextAccessor | null = null;\nlet renderContextAccessorInitialized = false;\n\n// Fallback stack for non-Node environments\nlet fallbackStack: RenderContext | null = null;\n\nfunction ensureRenderContextAccessor(): void {\n if (renderContextAccessorInitialized) {\n return;\n }\n\n renderContextAccessorInitialized = true;\n\n if (typeof process === 'undefined' || !process.versions?.node) {\n return;\n }\n\n try {\n // Hide the Node builtin from browser dependency scanners.\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const loadAsyncHooks = new Function(\n 'return require(' + JSON.stringify('async_hooks') + ');'\n ) as () => AsyncHooksModule;\n const asyncHooks = loadAsyncHooks();\n\n if (asyncHooks.AsyncLocalStorage) {\n const asyncLocalStorage = new asyncHooks.AsyncLocalStorage();\n renderContextAccessor = {\n getStore() {\n return asyncLocalStorage.getStore();\n },\n run<R>(store: RenderContext, fn: () => R): R {\n return asyncLocalStorage.run(store, fn);\n },\n };\n }\n } catch {\n // Keep the fallback stack when async_hooks is unavailable.\n }\n}\n\nexport function createRenderContext(\n seed = 12345,\n opts: {\n url?: string;\n data?: SSRData;\n params?: Record<string, string>;\n routes?: readonly Route[];\n routeAuth?: RouteAuthOptions;\n signal?: AbortSignal;\n } = {}\n): RenderContext {\n clearEscapeCache();\n\n return {\n url: opts.url ?? '',\n seed,\n data: opts.data,\n params: opts.params,\n routes: opts.routes,\n routeAuth: opts.routeAuth,\n signal: opts.signal,\n queryCache: new Map<string, unknown>(),\n ssrCleanupFns: [],\n keyCounter: 0,\n renderData: null,\n };\n}\n\n/**\n * Run a function with the given render context.\n * Concurrency-safe in Node.js via AsyncLocalStorage.\n */\nexport function withRenderContext<T>(ctx: RenderContext, fn: () => T): T {\n ensureRenderContextAccessor();\n if (renderContextAccessor) {\n return renderContextAccessor.run(ctx, fn);\n }\n // Fallback: stack-based (not concurrency-safe)\n const prev = fallbackStack;\n fallbackStack = ctx;\n try {\n return fn();\n } finally {\n fallbackStack = prev;\n }\n}\n\n/**\n * Get the current render context.\n * Returns null if not inside a render.\n */\nexport function getRenderContext(): RenderContext | null {\n ensureRenderContextAccessor();\n if (renderContextAccessor) {\n return renderContextAccessor.getStore() ?? null;\n }\n return fallbackStack;\n}\n\n// Legacy API aliases (deprecated, for backwards compatibility)\nexport const getSSRContext = getRenderContext;\nexport const withSSRContext = withRenderContext;\nexport const getCurrentSSRContext = getRenderContext;\n\nexport function runWithSSRContext<T>(ctx: RenderContext, fn: () => T): T {\n // This was a separate path for sync detection; now unified\n return withRenderContext(ctx, fn);\n}\n\n/**\n * Centralized SSR enforcement helper — throws a consistent error when async\n * data is encountered during synchronous SSR.\n */\nexport function throwSSRDataMissing(): never {\n throw new SSRDataMissingError();\n}\n\nexport { SSRDataMissingError };\n"],"mappings":";;;;;;;;;;;AA2CA,IAAI,wBAAsD;AAC1D,IAAI,mCAAmC;AAGvC,IAAI,gBAAsC;AAE1C,SAAS,8BAAoC;CAC3C,IAAI,kCACF;CAGF,mCAAmC;CAEnC,IAAI,OAAO,YAAY,eAAe,CAAC,QAAQ,UAAU,MACvD;CAGF,IAAI;EAMF,MAAM,aAAa,IAHQ,SACzB,oBAAoB,KAAK,UAAU,aAAa,IAAI,IAEnC,CAAA,CAAe;EAElC,IAAI,WAAW,mBAAmB;GAChC,MAAM,oBAAoB,IAAI,WAAW,kBAAkB;GAC3D,wBAAwB;IACtB,WAAW;KACT,OAAO,kBAAkB,SAAS;IACpC;IACA,IAAO,OAAsB,IAAgB;KAC3C,OAAO,kBAAkB,IAAI,OAAO,EAAE;IACxC;GACF;EACF;CACF,QAAQ,CAER;AACF;AAEA,SAAgB,oBACd,OAAO,OACP,OAOI,CAAC,GACU;CACf,iBAAiB;CAEjB,OAAO;EACL,KAAK,KAAK,OAAO;EACjB;EACA,MAAM,KAAK;EACX,QAAQ,KAAK;EACb,QAAQ,KAAK;EACb,WAAW,KAAK;EAChB,QAAQ,KAAK;EACb,4BAAY,IAAI,IAAqB;EACrC,eAAe,CAAC;EAChB,YAAY;EACZ,YAAY;CACd;AACF;;;;;AAMA,SAAgB,kBAAqB,KAAoB,IAAgB;CACvE,4BAA4B;CAC5B,IAAI,uBACF,OAAO,sBAAsB,IAAI,KAAK,EAAE;CAG1C,MAAM,OAAO;CACb,gBAAgB;CAChB,IAAI;EACF,OAAO,GAAG;CACZ,UAAU;EACR,gBAAgB;CAClB;AACF;;;;;AAMA,SAAgB,mBAAyC;CACvD,4BAA4B;CAC5B,IAAI,uBACF,OAAO,sBAAsB,SAAS,KAAK;CAE7C,OAAO;AACT;;;;;AAgBA,SAAgB,sBAA6B;CAC3C,MAAM,IAAI,oBAAoB;AAChC"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../src/ssr/context.ts"],"sourcesContent":["/**\n * SSR Context Management\n *\n * Provides render-context storage for server-side rendering.\n * Node SSR lazily installs AsyncLocalStorage on first use; browser builds use\n * the fallback stack.\n */\n\nimport { SSRDataMissingError } from './errors';\nimport { clearEscapeCache } from './escape';\nimport { isPromiseLike } from '../common/promise';\nimport { configureRenderContextProvider } from '../common/render-context';\n\nexport type { SSRData } from '../common/ssr';\nimport type { SSRData } from '../common/ssr';\nimport type { Route, RouteAuthOptions } from '../common/router';\n\nconst FALLBACK_ASYNC_CONTEXT_ERROR =\n '[Askr] async SSR render context fallback is unsupported in this environment. Use synchronous SSR rendering or a runtime with AsyncLocalStorage.';\n\n// Unified per-render context combining SSRContext and RenderContext\nexport interface RenderContext {\n url: string;\n seed: number;\n data?: SSRData;\n params?: Record<string, string>;\n routes?: readonly Route[];\n routeAuth?: RouteAuthOptions;\n signal?: AbortSignal;\n dataRuntime?: unknown;\n queryCache?: Map<string, unknown>;\n ssrCleanupFns: Array<() => void>;\n // Per-render key state (moved from render-keys.ts globals)\n keyCounter: number;\n renderData: Record<string, unknown> | null;\n}\n\n// Legacy alias for compatibility\nexport type SSRContext = RenderContext;\n\ntype RenderContextAccessor = {\n getStore(): RenderContext | undefined;\n run<R>(store: RenderContext, fn: () => R): R;\n};\n\ntype AsyncHooksModule = {\n AsyncLocalStorage?: new () => RenderContextAccessor;\n};\n\nlet renderContextAccessor: RenderContextAccessor | null = null;\nlet renderContextAccessorInitialized = false;\n\n// Fallback stack for non-Node environments\nlet fallbackStack: RenderContext | null = null;\n\nfunction ensureRenderContextAccessor(): void {\n if (renderContextAccessorInitialized) {\n return;\n }\n\n renderContextAccessorInitialized = true;\n\n if (typeof process === 'undefined' || !process.versions?.node) {\n return;\n }\n\n try {\n // Hide the Node builtin from browser dependency scanners.\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const loadAsyncHooks = new Function(\n 'return require(' + JSON.stringify('async_hooks') + ');'\n ) as () => AsyncHooksModule;\n const asyncHooks = loadAsyncHooks();\n\n if (asyncHooks.AsyncLocalStorage) {\n const asyncLocalStorage = new asyncHooks.AsyncLocalStorage();\n renderContextAccessor = {\n getStore() {\n return asyncLocalStorage.getStore();\n },\n run<R>(store: RenderContext, fn: () => R): R {\n return asyncLocalStorage.run(store, fn);\n },\n };\n }\n } catch {\n // Keep the fallback stack when async_hooks is unavailable.\n }\n}\n\nexport function createRenderContext(\n seed = 12345,\n opts: {\n url?: string;\n data?: SSRData;\n params?: Record<string, string>;\n routes?: readonly Route[];\n routeAuth?: RouteAuthOptions;\n signal?: AbortSignal;\n dataRuntime?: unknown;\n } = {}\n): RenderContext {\n clearEscapeCache();\n\n return {\n url: opts.url ?? '',\n seed,\n data: opts.data,\n params: opts.params,\n routes: opts.routes,\n routeAuth: opts.routeAuth,\n signal: opts.signal,\n dataRuntime: opts.dataRuntime,\n queryCache: new Map<string, unknown>(),\n ssrCleanupFns: [],\n keyCounter: 0,\n renderData: null,\n };\n}\n\n/**\n * Run a function with the given render context.\n * Concurrency-safe in Node.js via AsyncLocalStorage.\n */\nexport function withRenderContext<T>(ctx: RenderContext, fn: () => T): T {\n ensureRenderContextAccessor();\n if (renderContextAccessor) {\n return renderContextAccessor.run(ctx, fn);\n }\n // Fallback: stack-based (not concurrency-safe)\n const prev = fallbackStack;\n fallbackStack = ctx;\n try {\n const result = fn();\n if (isPromiseLike(result)) {\n throw new Error(FALLBACK_ASYNC_CONTEXT_ERROR);\n }\n return result;\n } finally {\n fallbackStack = prev;\n }\n}\n\n/**\n * Get the current render context.\n * Returns null if not inside a render.\n */\nexport function getRenderContext(): RenderContext | null {\n ensureRenderContextAccessor();\n if (renderContextAccessor) {\n return renderContextAccessor.getStore() ?? null;\n }\n return fallbackStack;\n}\n\nconfigureRenderContextProvider({\n getRenderContext,\n});\n\n// Legacy API aliases (deprecated, for backwards compatibility)\nexport const getSSRContext = getRenderContext;\nexport const withSSRContext = withRenderContext;\nexport const getCurrentSSRContext = getRenderContext;\n\nexport function runWithSSRContext<T>(ctx: RenderContext, fn: () => T): T {\n // This was a separate path for sync detection; now unified\n return withRenderContext(ctx, fn);\n}\n\n/**\n * Centralized SSR enforcement helper — throws a consistent error when async\n * data is encountered during synchronous SSR.\n */\nexport function throwSSRDataMissing(): never {\n throw new SSRDataMissingError();\n}\n\nexport { SSRDataMissingError };\n"],"mappings":";;;;;;;;;;;;;AAiBA,MAAM,+BACJ;AA+BF,IAAI,wBAAsD;AAC1D,IAAI,mCAAmC;AAGvC,IAAI,gBAAsC;AAE1C,SAAS,8BAAoC;CAC3C,IAAI,kCACF;CAGF,mCAAmC;CAEnC,IAAI,OAAO,YAAY,eAAe,CAAC,QAAQ,UAAU,MACvD;CAGF,IAAI;EAMF,MAAM,aAAa,IAHQ,SACzB,oBAAoB,KAAK,UAAU,aAAa,IAAI,IAEnC,CAAA,CAAe;EAElC,IAAI,WAAW,mBAAmB;GAChC,MAAM,oBAAoB,IAAI,WAAW,kBAAkB;GAC3D,wBAAwB;IACtB,WAAW;KACT,OAAO,kBAAkB,SAAS;IACpC;IACA,IAAO,OAAsB,IAAgB;KAC3C,OAAO,kBAAkB,IAAI,OAAO,EAAE;IACxC;GACF;EACF;CACF,QAAQ,CAER;AACF;AAEA,SAAgB,oBACd,OAAO,OACP,OAQI,CAAC,GACU;CACf,iBAAiB;CAEjB,OAAO;EACL,KAAK,KAAK,OAAO;EACjB;EACA,MAAM,KAAK;EACX,QAAQ,KAAK;EACb,QAAQ,KAAK;EACb,WAAW,KAAK;EAChB,QAAQ,KAAK;EACb,aAAa,KAAK;EAClB,4BAAY,IAAI,IAAqB;EACrC,eAAe,CAAC;EAChB,YAAY;EACZ,YAAY;CACd;AACF;;;;;AAMA,SAAgB,kBAAqB,KAAoB,IAAgB;CACvE,4BAA4B;CAC5B,IAAI,uBACF,OAAO,sBAAsB,IAAI,KAAK,EAAE;CAG1C,MAAM,OAAO;CACb,gBAAgB;CAChB,IAAI;EACF,MAAM,SAAS,GAAG;EAClB,IAAI,cAAc,MAAM,GACtB,MAAM,IAAI,MAAM,4BAA4B;EAE9C,OAAO;CACT,UAAU;EACR,gBAAgB;CAClB;AACF;;;;;AAMA,SAAgB,mBAAyC;CACvD,4BAA4B;CAC5B,IAAI,uBACF,OAAO,sBAAsB,SAAS,KAAK;CAE7C,OAAO;AACT;AAEA,+BAA+B,EAC7B,iBACF,CAAC;;;;;AAgBD,SAAgB,sBAA6B;CAC3C,MAAM,IAAI,oBAAoB;AAChC"}
@@ -5,4 +5,6 @@ declare class SSRInvariantError extends Error {
5
5
  readonly code = "SSR_INVARIANT_VIOLATION";
6
6
  constructor(message: string);
7
7
  }
8
+ //#endregion
9
+ export { SSRDataMissingError };
8
10
  //# sourceMappingURL=errors.d.ts.map
@@ -1,4 +1,14 @@
1
- import "../common/ssr-errors.js";
1
+ import { SSRDataMissingError } from "../common/ssr-errors.js";
2
+ //#region src/ssr/errors.ts
3
+ var SSRInvariantError = class SSRInvariantError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.code = "SSR_INVARIANT_VIOLATION";
7
+ this.name = "SSRInvariantError";
8
+ Object.setPrototypeOf(this, SSRInvariantError.prototype);
9
+ }
10
+ };
2
11
  //#endregion
12
+ export { SSRDataMissingError, SSRInvariantError };
3
13
 
4
14
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../../src/ssr/errors.ts"],"sourcesContent":["export { SSRDataMissingError } from '../common/ssr-errors';\n\nexport class SSRInvariantError extends Error {\n readonly code = 'SSR_INVARIANT_VIOLATION';\n constructor(message: string) {\n super(message);\n this.name = 'SSRInvariantError';\n Object.setPrototypeOf(this, SSRInvariantError.prototype);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../../src/ssr/errors.ts"],"sourcesContent":["export { SSRDataMissingError } from '../common/ssr-errors';\n\nexport class SSRInvariantError extends Error {\n readonly code = 'SSR_INVARIANT_VIOLATION';\n constructor(message: string) {\n super(message);\n this.name = 'SSRInvariantError';\n Object.setPrototypeOf(this, SSRInvariantError.prototype);\n }\n}\n"],"mappings":";;AAEA,IAAa,oBAAb,MAAa,0BAA0B,MAAM;CAE3C,YAAY,SAAiB;EAC3B,MAAM,OAAO;cAFC;EAGd,KAAK,OAAO;EACZ,OAAO,eAAe,MAAM,kBAAkB,SAAS;CACzD;AACF"}
@@ -5,7 +5,7 @@
5
5
  * Centralizes text and attribute escaping to avoid duplication
6
6
  * between sync and streaming SSR renderers.
7
7
  */
8
- const VOID_ELEMENTS = new Set([
8
+ const VOID_ELEMENTS = /* @__PURE__ */ new Set([
9
9
  "area",
10
10
  "base",
11
11
  "br",
@@ -26,7 +26,7 @@ const MAX_CACHE_SIZE = 256;
26
26
  const CSS_UNSAFE_RE = /[{}<>\\]/g;
27
27
  const CSS_URI_SCHEME_RE = /(?:^|[\s(,])([a-z][a-z0-9+.-]*):/i;
28
28
  const CSS_FUNCTION_NAME_RE = /([a-z-][a-z0-9-]*)\s*\(/gi;
29
- const CSS_ALLOWED_FUNCTIONS = new Set([
29
+ const CSS_ALLOWED_FUNCTIONS = /* @__PURE__ */ new Set([
30
30
  "var",
31
31
  "calc",
32
32
  "min",
@@ -188,6 +188,6 @@ function styleObjToCss(value) {
188
188
  return result || null;
189
189
  }
190
190
  //#endregion
191
- export { VOID_ELEMENTS, clearEscapeCache, escapeAttr, escapeText, needsEscapeAttr, styleObjToCss };
191
+ export { VOID_ELEMENTS, clearEscapeCache, escapeAttr, escapeText, needsEscapeAttr, needsEscapeText, styleObjToCss };
192
192
 
193
193
  //# sourceMappingURL=escape.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"escape.js","names":[],"sources":["../../src/ssr/escape.ts"],"sourcesContent":["/**\n * HTML escaping utilities for SSR\n *\n * Centralizes text and attribute escaping to avoid duplication\n * between sync and streaming SSR renderers.\n */\n\n// HTML5 void elements that don't have closing tags\nexport const VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\n// Escape cache for common values (bounded and clearable for long-running servers)\nconst escapeCache = new Map<string, string>();\nconst MAX_CACHE_SIZE = 256;\n\nconst _TEXT_ESCAPE_RE = /[&<>]/g;\n\nconst CSS_UNSAFE_RE = /[{}<>\\\\]/g;\nconst CSS_URI_SCHEME_RE = /(?:^|[\\s(,])([a-z][a-z0-9+.-]*):/i;\nconst CSS_FUNCTION_NAME_RE = /([a-z-][a-z0-9-]*)\\s*\\(/gi;\n\nconst CSS_ALLOWED_FUNCTIONS = new Set([\n 'var',\n 'calc',\n 'min',\n 'max',\n 'clamp',\n 'rgb',\n 'rgba',\n 'hsl',\n 'hsla',\n 'lab',\n 'lch',\n 'oklab',\n 'oklch',\n 'color',\n 'color-mix',\n 'translate',\n 'translatex',\n 'translatey',\n 'translatez',\n 'scale',\n 'scalex',\n 'scaley',\n 'scalez',\n 'rotate',\n 'rotatex',\n 'rotatey',\n 'rotatez',\n 'skew',\n 'skewx',\n 'skewy',\n 'matrix',\n 'matrix3d',\n 'linear-gradient',\n 'radial-gradient',\n 'conic-gradient',\n 'repeating-linear-gradient',\n 'repeating-radial-gradient',\n 'repeating-conic-gradient',\n 'cubic-bezier',\n 'steps',\n]);\n\nconst STYLE_PROP_CACHE = new Map<string, string>();\nconst MAX_STYLE_PROP_CACHE_SIZE = 512;\n\n// Pre-compute escape map functions for faster replacement\nconst _textEscapeMap = (ch: string): string => {\n const code = ch.charCodeAt(0);\n if (code === 38) return '&amp;'; // &\n if (code === 60) return '&lt;'; // <\n if (code === 62) return '&gt;'; // >\n return ch;\n};\n\nfunction toKebabCached(prop: string): string {\n const cached = STYLE_PROP_CACHE.get(prop);\n if (cached !== undefined) return cached;\n const kebab = prop.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n if (STYLE_PROP_CACHE.size < MAX_STYLE_PROP_CACHE_SIZE) {\n STYLE_PROP_CACHE.set(prop, kebab);\n }\n return kebab;\n}\n\n/**\n * Clear the escape cache. Call between SSR requests in long-running servers\n * to prevent memory buildup from unique strings.\n */\nexport function clearEscapeCache(): void {\n escapeCache.clear();\n}\n\n/**\n * Fast check if a string needs text escaping.\n * Used to skip the full escape call when not needed.\n */\nexport function needsEscapeText(text: string): boolean {\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (ch === 38 || ch === 60 || ch === 62) return true;\n }\n return false;\n}\n\n/**\n * Fast check if a string needs attribute escaping.\n * Checks for & \" ' < > characters.\n */\nexport function needsEscapeAttr(value: string): boolean {\n for (let i = 0; i < value.length; i++) {\n const ch = value.charCodeAt(i);\n // & \" ' < >\n if (ch === 38 || ch === 34 || ch === 39 || ch === 60 || ch === 62) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Escape HTML special characters in text content\n * Fast-path: cache first, then scan-then-escape for new strings\n */\nexport function escapeText(text: string): string {\n // Only use cache for short strings (likely to be repeated)\n const useCache = text.length <= 64;\n\n if (useCache) {\n const cached = escapeCache.get(text);\n if (cached !== undefined) return cached;\n }\n\n // Fast path: check if escaping needed\n if (!needsEscapeText(text)) {\n if (useCache && escapeCache.size < MAX_CACHE_SIZE) {\n escapeCache.set(text, text);\n }\n return text;\n }\n\n // Single-pass scan-and-build: avoids 3 separate regex passes\n let escaped = '';\n let lastIndex = 0;\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n let entity: string;\n if (ch === 38) entity = '&amp;';\n else if (ch === 60) entity = '&lt;';\n else if (ch === 62) entity = '&gt;';\n else continue;\n escaped += text.slice(lastIndex, i) + entity;\n lastIndex = i + 1;\n }\n const result = escaped + text.slice(lastIndex);\n\n if (useCache && escapeCache.size < MAX_CACHE_SIZE) {\n escapeCache.set(text, result);\n }\n return result;\n}\n\n/**\n * Escape HTML special characters in attribute values.\n * Single-pass scan: returns the original string unchanged when no special\n * characters are found, so callers can drop separate needsEscapeAttr checks.\n */\nexport function escapeAttr(value: string): string {\n let escaped = '';\n let lastIndex = 0;\n for (let i = 0; i < value.length; i++) {\n const ch = value.charCodeAt(i);\n let entity: string;\n if (ch === 38) entity = '&amp;';\n else if (ch === 34) entity = '&quot;';\n else if (ch === 39) entity = '&#x27;';\n else if (ch === 60) entity = '&lt;';\n else if (ch === 62) entity = '&gt;';\n else continue;\n escaped += value.slice(lastIndex, i) + entity;\n lastIndex = i + 1;\n }\n // Return original reference when nothing needed escaping (no allocation)\n return lastIndex === 0 ? value : escaped + value.slice(lastIndex);\n}\n\n/**\n * Escape CSS value to prevent injection attacks.\n * Removes characters that could break out of CSS context.\n */\nfunction escapeCssValue(value: string): string {\n const str = String(value);\n\n if (CSS_URI_SCHEME_RE.test(str)) {\n return '';\n }\n\n if (str.includes('(')) {\n for (const match of str.matchAll(CSS_FUNCTION_NAME_RE)) {\n if (!CSS_ALLOWED_FUNCTIONS.has(match[1].toLowerCase())) {\n return '';\n }\n }\n }\n\n // Remove characters that could break out of CSS value context\n return str.replace(CSS_UNSAFE_RE, '');\n}\n\n/**\n * Convert style object to CSS string with value escaping\n * Optimized to avoid Object.entries allocation\n */\nexport function styleObjToCss(value: unknown): string | null {\n if (!value || typeof value !== 'object') return null;\n\n const styleObj = value as Record<string, unknown>;\n let result = '';\n\n for (const k in styleObj) {\n const v = styleObj[k];\n if (v === null || v === undefined || v === false) continue;\n\n const prop = toKebabCached(k);\n const safeValue = escapeCssValue(String(v));\n if (safeValue) {\n result += `${prop}:${safeValue};`;\n }\n }\n\n return result || null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"escape.js","names":[],"sources":["../../src/ssr/escape.ts"],"sourcesContent":["/**\n * HTML escaping utilities for SSR\n *\n * Centralizes text and attribute escaping to avoid duplication\n * between sync and streaming SSR renderers.\n */\n\n// HTML5 void elements that don't have closing tags\nexport const VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\n// Escape cache for common values (bounded and clearable for long-running servers)\nconst escapeCache = new Map<string, string>();\nconst MAX_CACHE_SIZE = 256;\n\nconst _TEXT_ESCAPE_RE = /[&<>]/g;\n\nconst CSS_UNSAFE_RE = /[{}<>\\\\]/g;\nconst CSS_URI_SCHEME_RE = /(?:^|[\\s(,])([a-z][a-z0-9+.-]*):/i;\nconst CSS_FUNCTION_NAME_RE = /([a-z-][a-z0-9-]*)\\s*\\(/gi;\n\nconst CSS_ALLOWED_FUNCTIONS = new Set([\n 'var',\n 'calc',\n 'min',\n 'max',\n 'clamp',\n 'rgb',\n 'rgba',\n 'hsl',\n 'hsla',\n 'lab',\n 'lch',\n 'oklab',\n 'oklch',\n 'color',\n 'color-mix',\n 'translate',\n 'translatex',\n 'translatey',\n 'translatez',\n 'scale',\n 'scalex',\n 'scaley',\n 'scalez',\n 'rotate',\n 'rotatex',\n 'rotatey',\n 'rotatez',\n 'skew',\n 'skewx',\n 'skewy',\n 'matrix',\n 'matrix3d',\n 'linear-gradient',\n 'radial-gradient',\n 'conic-gradient',\n 'repeating-linear-gradient',\n 'repeating-radial-gradient',\n 'repeating-conic-gradient',\n 'cubic-bezier',\n 'steps',\n]);\n\nconst STYLE_PROP_CACHE = new Map<string, string>();\nconst MAX_STYLE_PROP_CACHE_SIZE = 512;\n\n// Pre-compute escape map functions for faster replacement\nconst _textEscapeMap = (ch: string): string => {\n const code = ch.charCodeAt(0);\n if (code === 38) return '&amp;'; // &\n if (code === 60) return '&lt;'; // <\n if (code === 62) return '&gt;'; // >\n return ch;\n};\n\nfunction toKebabCached(prop: string): string {\n const cached = STYLE_PROP_CACHE.get(prop);\n if (cached !== undefined) return cached;\n const kebab = prop.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n if (STYLE_PROP_CACHE.size < MAX_STYLE_PROP_CACHE_SIZE) {\n STYLE_PROP_CACHE.set(prop, kebab);\n }\n return kebab;\n}\n\n/**\n * Clear the escape cache. Call between SSR requests in long-running servers\n * to prevent memory buildup from unique strings.\n */\nexport function clearEscapeCache(): void {\n escapeCache.clear();\n}\n\n/**\n * Fast check if a string needs text escaping.\n * Used to skip the full escape call when not needed.\n */\nexport function needsEscapeText(text: string): boolean {\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (ch === 38 || ch === 60 || ch === 62) return true;\n }\n return false;\n}\n\n/**\n * Fast check if a string needs attribute escaping.\n * Checks for & \" ' < > characters.\n */\nexport function needsEscapeAttr(value: string): boolean {\n for (let i = 0; i < value.length; i++) {\n const ch = value.charCodeAt(i);\n // & \" ' < >\n if (ch === 38 || ch === 34 || ch === 39 || ch === 60 || ch === 62) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Escape HTML special characters in text content\n * Fast-path: cache first, then scan-then-escape for new strings\n */\nexport function escapeText(text: string): string {\n // Only use cache for short strings (likely to be repeated)\n const useCache = text.length <= 64;\n\n if (useCache) {\n const cached = escapeCache.get(text);\n if (cached !== undefined) return cached;\n }\n\n // Fast path: check if escaping needed\n if (!needsEscapeText(text)) {\n if (useCache && escapeCache.size < MAX_CACHE_SIZE) {\n escapeCache.set(text, text);\n }\n return text;\n }\n\n // Single-pass scan-and-build: avoids 3 separate regex passes\n let escaped = '';\n let lastIndex = 0;\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n let entity: string;\n if (ch === 38) entity = '&amp;';\n else if (ch === 60) entity = '&lt;';\n else if (ch === 62) entity = '&gt;';\n else continue;\n escaped += text.slice(lastIndex, i) + entity;\n lastIndex = i + 1;\n }\n const result = escaped + text.slice(lastIndex);\n\n if (useCache && escapeCache.size < MAX_CACHE_SIZE) {\n escapeCache.set(text, result);\n }\n return result;\n}\n\n/**\n * Escape HTML special characters in attribute values.\n * Single-pass scan: returns the original string unchanged when no special\n * characters are found, so callers can drop separate needsEscapeAttr checks.\n */\nexport function escapeAttr(value: string): string {\n let escaped = '';\n let lastIndex = 0;\n for (let i = 0; i < value.length; i++) {\n const ch = value.charCodeAt(i);\n let entity: string;\n if (ch === 38) entity = '&amp;';\n else if (ch === 34) entity = '&quot;';\n else if (ch === 39) entity = '&#x27;';\n else if (ch === 60) entity = '&lt;';\n else if (ch === 62) entity = '&gt;';\n else continue;\n escaped += value.slice(lastIndex, i) + entity;\n lastIndex = i + 1;\n }\n // Return original reference when nothing needed escaping (no allocation)\n return lastIndex === 0 ? value : escaped + value.slice(lastIndex);\n}\n\n/**\n * Escape CSS value to prevent injection attacks.\n * Removes characters that could break out of CSS context.\n */\nfunction escapeCssValue(value: string): string {\n const str = String(value);\n\n if (CSS_URI_SCHEME_RE.test(str)) {\n return '';\n }\n\n if (str.includes('(')) {\n for (const match of str.matchAll(CSS_FUNCTION_NAME_RE)) {\n if (!CSS_ALLOWED_FUNCTIONS.has(match[1].toLowerCase())) {\n return '';\n }\n }\n }\n\n // Remove characters that could break out of CSS value context\n return str.replace(CSS_UNSAFE_RE, '');\n}\n\n/**\n * Convert style object to CSS string with value escaping\n * Optimized to avoid Object.entries allocation\n */\nexport function styleObjToCss(value: unknown): string | null {\n if (!value || typeof value !== 'object') return null;\n\n const styleObj = value as Record<string, unknown>;\n let result = '';\n\n for (const k in styleObj) {\n const v = styleObj[k];\n if (v === null || v === undefined || v === false) continue;\n\n const prop = toKebabCached(k);\n const safeValue = escapeCssValue(String(v));\n if (safeValue) {\n result += `${prop}:${safeValue};`;\n }\n }\n\n return result || null;\n}\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { SSR_RENDER_DATA_ATTR } from "../common/ssr.js";
2
+ //#region src/ssr/hydration-data.ts
3
+ function serializeHydrationRenderData(data) {
4
+ if (!data || Object.keys(data).length === 0) return "";
5
+ return `<script type="application/json" ${SSR_RENDER_DATA_ATTR}="true">${JSON.stringify(data).replace(/</g, "\\u003C").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029")}<\/script>`;
6
+ }
7
+ //#endregion
8
+ export { serializeHydrationRenderData };
9
+
10
+ //# sourceMappingURL=hydration-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration-data.js","names":[],"sources":["../../src/ssr/hydration-data.ts"],"sourcesContent":["import { SSR_RENDER_DATA_ATTR } from '../common/ssr';\nimport type { SSRData } from './context';\n\nexport function serializeHydrationRenderData(\n data: SSRData | undefined\n): string {\n if (!data || Object.keys(data).length === 0) {\n return '';\n }\n\n return `<script type=\"application/json\" ${SSR_RENDER_DATA_ATTR}=\"true\">${JSON.stringify(\n data\n )\n .replace(/</g, '\\\\u003C')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')}</script>`;\n}\n"],"mappings":";;AAGA,SAAgB,6BACd,MACQ;CACR,IAAI,CAAC,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,WAAW,GACxC,OAAO;CAGT,OAAO,mCAAmC,qBAAqB,UAAU,KAAK,UAC5E,IACF,CAAC,CACE,QAAQ,MAAM,SAAS,CAAC,CACxB,QAAQ,WAAW,SAAS,CAAC,CAC7B,QAAQ,WAAW,SAAS,EAAE;AACnC"}
@@ -0,0 +1,12 @@
1
+ import { RenderContext } from "./context.js";
2
+
3
+ //#region src/ssr/hydration-verify.d.ts
4
+ type VerifyState = {
5
+ current: ChildNode | null;
6
+ pendingText: string;
7
+ };
8
+ declare function verifyRenderableNode(value: unknown, state: VerifyState, ctx: RenderContext): boolean;
9
+ declare const hydrationVerifier: {
10
+ verifyRenderableNode: typeof verifyRenderableNode;
11
+ };
12
+ //# sourceMappingURL=hydration-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration-verify.d.ts","names":[],"sources":["../../src/ssr/hydration-verify.ts"],"mappings":";;;KAoBK,WAAA;EACH,OAAA,EAAS,SAAS;EAClB,WAAA;AAAA;AAAA,iBAkSO,oBAAA,CACP,KAAA,WACA,KAAA,EAAO,WAAA,EACP,GAAA,EAAK,aAAa;AAAA,cAOP,iBAAA;+BAEZ,oBAAA;AAAA"}
@@ -0,0 +1,144 @@
1
+ import { __CONTROL_BOUNDARY__ } from "../common/control.js";
2
+ import { __ERROR_BOUNDARY__ } from "../common/vnode.js";
3
+ import { Fragment } from "../common/jsx.js";
4
+ import { getPublicAttributeName } from "../common/attr-names.js";
5
+ import "../jsx/index.js";
6
+ import { VOID_ELEMENTS, styleObjToCss } from "./escape.js";
7
+ import { executeComponentSync } from "./component-runtime.js";
8
+ import { createErrorBoundaryReset, evaluateControlBoundaryChildren, getErrorBoundaryState, getRenderableChildren, normalizeRenderableChildren, resolveErrorBoundaryFallbackNode } from "./boundaries.js";
9
+ import { inheritRenderableKey } from "./render-sync.js";
10
+ //#region src/ssr/hydration-verify.ts
11
+ function isSSRAttrEventHandler(key) {
12
+ return key.length >= 3 && key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.charCodeAt(2) >= 65 && key.charCodeAt(2) <= 90;
13
+ }
14
+ function flushPendingText(state) {
15
+ if (state.pendingText.length === 0) return true;
16
+ if (!state.current || state.current.nodeType !== Node.TEXT_NODE) return false;
17
+ if (state.current.textContent !== state.pendingText) return false;
18
+ state.current = state.current.nextSibling;
19
+ state.pendingText = "";
20
+ return true;
21
+ }
22
+ function verifyRenderedAttrs(element, props) {
23
+ const matchedAttrs = /* @__PURE__ */ new Set();
24
+ let dangerousHtml;
25
+ if (!props || typeof props !== "object") return {
26
+ matched: element.attributes.length === 0,
27
+ dangerousHtml
28
+ };
29
+ const propsObj = props;
30
+ for (const key in propsObj) {
31
+ const value = propsObj[key];
32
+ if (key === "children" || key === "key" || key === "ref" || key === "dangerouslySetInnerHTML") {
33
+ if (key === "dangerouslySetInnerHTML" && value && typeof value === "object" && "__html" in value) dangerousHtml = String(value.__html);
34
+ continue;
35
+ }
36
+ if (isSSRAttrEventHandler(key) || key.charCodeAt(0) === 95) continue;
37
+ const attrName = key === "class" ? "class" : getPublicAttributeName(key);
38
+ if (attrName === "style") {
39
+ const css = typeof value === "string" ? value : styleObjToCss(value);
40
+ if (!css) continue;
41
+ if (element.getAttribute("style") !== css) return { matched: false };
42
+ matchedAttrs.add("style");
43
+ continue;
44
+ }
45
+ if (value === true) {
46
+ if (!element.hasAttribute(attrName)) return { matched: false };
47
+ matchedAttrs.add(attrName);
48
+ continue;
49
+ }
50
+ if (value === false || value === null || value === void 0) continue;
51
+ const stringValue = String(value);
52
+ if (element.getAttribute(attrName) !== stringValue) return { matched: false };
53
+ matchedAttrs.add(attrName);
54
+ }
55
+ if (element.attributes.length !== matchedAttrs.size) return { matched: false };
56
+ return {
57
+ matched: true,
58
+ dangerousHtml
59
+ };
60
+ }
61
+ function verifyExpectedNode(node, state, ctx) {
62
+ if (node === null || node === void 0 || node === false) return true;
63
+ if (typeof node === "string" || typeof node === "number") {
64
+ state.pendingText += String(node);
65
+ return true;
66
+ }
67
+ if (Array.isArray(node)) return verifyExpectedChildren(node, state, ctx);
68
+ if (!node || typeof node !== "object" || !("type" in node)) return true;
69
+ const vnode = node;
70
+ const { type, props } = vnode;
71
+ if (typeof type === "function") return verifyRenderableNode(inheritRenderableKey(vnode, executeComponentSync(type, props, ctx)), state, ctx);
72
+ if (typeof type === "symbol") {
73
+ if (type === __CONTROL_BOUNDARY__) {
74
+ const children = evaluateControlBoundaryChildren(vnode);
75
+ if (!children || children.length === 0) return true;
76
+ for (let index = 0; index < children.length; index += 1) if (!verifyExpectedNode(children[index], state, ctx)) return false;
77
+ return true;
78
+ }
79
+ if (type === __ERROR_BOUNDARY__) {
80
+ const boundaryState = getErrorBoundaryState(vnode);
81
+ const fallback = props?.fallback;
82
+ const reset = createErrorBoundaryReset(vnode);
83
+ const snapshot = {
84
+ current: state.current,
85
+ pendingText: state.pendingText
86
+ };
87
+ if (boundaryState?.error != null) return verifyRenderableNode(resolveErrorBoundaryFallbackNode(fallback, boundaryState.error, reset), state, ctx);
88
+ try {
89
+ if (verifyExpectedChildren(normalizeRenderableChildren(props?.children), state, ctx)) return true;
90
+ } catch (error) {
91
+ if (boundaryState) {
92
+ boundaryState.error = error;
93
+ boundaryState.notified = true;
94
+ }
95
+ }
96
+ state.current = snapshot.current;
97
+ state.pendingText = snapshot.pendingText;
98
+ return verifyRenderableNode(resolveErrorBoundaryFallbackNode(fallback, boundaryState?.error ?? /* @__PURE__ */ new Error("ErrorBoundary render failed"), reset), state, ctx);
99
+ }
100
+ if (type !== Fragment) throw new Error(`verifyHydrationSyncForUrl: unsupported VNode symbol type: ${String(type)}`);
101
+ const children = getRenderableChildren(vnode);
102
+ if (!children || children.length === 0) return true;
103
+ for (let index = 0; index < children.length; index += 1) if (!verifyExpectedNode(children[index], state, ctx)) return false;
104
+ return true;
105
+ }
106
+ if (!flushPendingText(state)) return false;
107
+ if (!state.current || state.current.nodeType !== Node.ELEMENT_NODE) return false;
108
+ const actualElement = state.current;
109
+ if (actualElement.tagName.toLowerCase() !== String(type).toLowerCase()) return false;
110
+ const attrMatch = verifyRenderedAttrs(actualElement, props);
111
+ if (!attrMatch.matched) return false;
112
+ if (VOID_ELEMENTS.has(String(type))) {
113
+ if (actualElement.firstChild !== null) return false;
114
+ state.current = actualElement.nextSibling;
115
+ return true;
116
+ }
117
+ if (attrMatch.dangerousHtml !== void 0) {
118
+ if (actualElement.innerHTML !== attrMatch.dangerousHtml) return false;
119
+ state.current = actualElement.nextSibling;
120
+ return true;
121
+ }
122
+ const childState = {
123
+ current: actualElement.firstChild,
124
+ pendingText: ""
125
+ };
126
+ const children = getRenderableChildren(vnode);
127
+ if (children && children.length > 0) {
128
+ for (let index = 0; index < children.length; index += 1) if (!verifyExpectedNode(children[index], childState, ctx)) return false;
129
+ }
130
+ if (!flushPendingText(childState) || childState.current !== null) return false;
131
+ state.current = actualElement.nextSibling;
132
+ return true;
133
+ }
134
+ function verifyExpectedChildren(children, state, ctx) {
135
+ if (!children || children.length === 0) return true;
136
+ for (let index = 0; index < children.length; index += 1) if (!verifyExpectedNode(children[index], state, ctx)) return false;
137
+ return true;
138
+ }
139
+ function verifyRenderableNode(value, state, ctx) {
140
+ return Array.isArray(value) ? verifyExpectedChildren(normalizeRenderableChildren(value), state, ctx) : verifyExpectedNode(value, state, ctx);
141
+ }
142
+ //#endregion
143
+
144
+ //# sourceMappingURL=hydration-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration-verify.js","names":[],"sources":["../../src/ssr/hydration-verify.ts"],"sourcesContent":["import { getPublicAttributeName } from '../common/attr-names';\nimport { __CONTROL_BOUNDARY__ } from '../common/control';\nimport type { JSXElement } from '../common/jsx';\nimport type { Props } from '../common/props';\nimport { __ERROR_BOUNDARY__ } from '../common/vnode';\nimport { Fragment } from '../jsx';\nimport {\n createErrorBoundaryReset,\n evaluateControlBoundaryChildren,\n getErrorBoundaryState,\n getRenderableChildren,\n normalizeRenderableChildren,\n resolveErrorBoundaryFallbackNode,\n} from './boundaries';\nimport { executeComponentSync, type Component } from './component-runtime';\nimport type { RenderContext } from './context';\nimport { VOID_ELEMENTS, styleObjToCss } from './escape';\nimport { inheritRenderableKey } from './render-sync';\nimport type { VNode } from './types';\n\ntype VerifyState = {\n current: ChildNode | null;\n pendingText: string;\n};\n\nfunction isSSRAttrEventHandler(key: string): boolean {\n return (\n key.length >= 3 &&\n key.charCodeAt(0) === 111 &&\n key.charCodeAt(1) === 110 &&\n key.charCodeAt(2) >= 65 &&\n key.charCodeAt(2) <= 90\n );\n}\n\nfunction flushPendingText(state: VerifyState): boolean {\n if (state.pendingText.length === 0) {\n return true;\n }\n if (!state.current || state.current.nodeType !== Node.TEXT_NODE) {\n return false;\n }\n if (state.current.textContent !== state.pendingText) {\n return false;\n }\n state.current = state.current.nextSibling;\n state.pendingText = '';\n return true;\n}\n\nfunction verifyRenderedAttrs(\n element: Element,\n props: Props | undefined\n): { matched: boolean; dangerousHtml?: string } {\n const matchedAttrs = new Set<string>();\n let dangerousHtml: string | undefined;\n\n if (!props || typeof props !== 'object') {\n return {\n matched: element.attributes.length === 0,\n dangerousHtml,\n };\n }\n\n const propsObj = props as Record<string, unknown>;\n for (const key in propsObj) {\n const value = propsObj[key];\n\n if (\n key === 'children' ||\n key === 'key' ||\n key === 'ref' ||\n key === 'dangerouslySetInnerHTML'\n ) {\n if (\n key === 'dangerouslySetInnerHTML' &&\n value &&\n typeof value === 'object' &&\n '__html' in value\n ) {\n dangerousHtml = String((value as { __html: unknown }).__html);\n }\n continue;\n }\n\n if (isSSRAttrEventHandler(key) || key.charCodeAt(0) === 95) {\n continue;\n }\n\n const attrName = key === 'class' ? 'class' : getPublicAttributeName(key);\n\n if (attrName === 'style') {\n const css = typeof value === 'string' ? value : styleObjToCss(value);\n if (!css) continue;\n if (element.getAttribute('style') !== css) {\n return { matched: false };\n }\n matchedAttrs.add('style');\n continue;\n }\n\n if (value === true) {\n if (!element.hasAttribute(attrName)) {\n return { matched: false };\n }\n matchedAttrs.add(attrName);\n continue;\n }\n\n if (value === false || value === null || value === undefined) {\n continue;\n }\n\n const stringValue = String(value);\n if (element.getAttribute(attrName) !== stringValue) {\n return { matched: false };\n }\n matchedAttrs.add(attrName);\n }\n\n if (element.attributes.length !== matchedAttrs.size) {\n return { matched: false };\n }\n\n return { matched: true, dangerousHtml };\n}\n\nfunction verifyExpectedNode(\n node: unknown,\n state: VerifyState,\n ctx: RenderContext\n): boolean {\n if (node === null || node === undefined || node === false) {\n return true;\n }\n\n if (typeof node === 'string' || typeof node === 'number') {\n state.pendingText += String(node);\n return true;\n }\n\n if (Array.isArray(node)) {\n return verifyExpectedChildren(node, state, ctx);\n }\n\n if (!node || typeof node !== 'object' || !('type' in node)) {\n return true;\n }\n\n const vnode = node as VNode | JSXElement;\n const { type, props } = vnode;\n\n if (typeof type === 'function') {\n return verifyRenderableNode(\n inheritRenderableKey(\n vnode,\n executeComponentSync(type as Component, props, ctx)\n ),\n state,\n ctx\n );\n }\n\n if (typeof type === 'symbol') {\n if (type === __CONTROL_BOUNDARY__) {\n const children = evaluateControlBoundaryChildren(vnode);\n if (!children || children.length === 0) {\n return true;\n }\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], state, ctx)) {\n return false;\n }\n }\n return true;\n }\n if (type === __ERROR_BOUNDARY__) {\n const boundaryState = getErrorBoundaryState(vnode);\n const fallback = props?.fallback;\n const reset = createErrorBoundaryReset(vnode);\n\n const snapshot: VerifyState = {\n current: state.current,\n pendingText: state.pendingText,\n };\n\n if (boundaryState?.error != null) {\n const fallbackNode = resolveErrorBoundaryFallbackNode(\n fallback,\n boundaryState.error,\n reset\n );\n return verifyRenderableNode(fallbackNode, state, ctx);\n }\n\n try {\n if (\n verifyExpectedChildren(\n normalizeRenderableChildren(props?.children),\n state,\n ctx\n )\n ) {\n return true;\n }\n } catch (error) {\n if (boundaryState) {\n boundaryState.error = error;\n boundaryState.notified = true;\n }\n }\n\n state.current = snapshot.current;\n state.pendingText = snapshot.pendingText;\n\n const fallbackNode = resolveErrorBoundaryFallbackNode(\n fallback,\n boundaryState?.error ?? new Error('ErrorBoundary render failed'),\n reset\n );\n return verifyRenderableNode(fallbackNode, state, ctx);\n }\n if (type !== Fragment) {\n throw new Error(\n `verifyHydrationSyncForUrl: unsupported VNode symbol type: ${String(type)}`\n );\n }\n const children = getRenderableChildren(vnode);\n if (!children || children.length === 0) {\n return true;\n }\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], state, ctx)) {\n return false;\n }\n }\n return true;\n }\n\n if (!flushPendingText(state)) {\n return false;\n }\n\n if (!state.current || state.current.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n\n const actualElement = state.current as Element;\n if (actualElement.tagName.toLowerCase() !== String(type).toLowerCase()) {\n return false;\n }\n\n const attrMatch = verifyRenderedAttrs(actualElement, props);\n if (!attrMatch.matched) {\n return false;\n }\n\n if (VOID_ELEMENTS.has(String(type))) {\n if (actualElement.firstChild !== null) {\n return false;\n }\n state.current = actualElement.nextSibling;\n return true;\n }\n\n if (attrMatch.dangerousHtml !== undefined) {\n if (actualElement.innerHTML !== attrMatch.dangerousHtml) {\n return false;\n }\n state.current = actualElement.nextSibling;\n return true;\n }\n\n const childState: VerifyState = {\n current: actualElement.firstChild,\n pendingText: '',\n };\n const children = getRenderableChildren(vnode);\n if (children && children.length > 0) {\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], childState, ctx)) {\n return false;\n }\n }\n }\n\n if (!flushPendingText(childState) || childState.current !== null) {\n return false;\n }\n\n state.current = actualElement.nextSibling;\n return true;\n}\n\nfunction verifyExpectedChildren(\n children: unknown[] | undefined,\n state: VerifyState,\n ctx: RenderContext\n): boolean {\n if (!children || children.length === 0) {\n return true;\n }\n\n for (let index = 0; index < children.length; index += 1) {\n if (!verifyExpectedNode(children[index], state, ctx)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction verifyRenderableNode(\n value: unknown,\n state: VerifyState,\n ctx: RenderContext\n): boolean {\n return Array.isArray(value)\n ? verifyExpectedChildren(normalizeRenderableChildren(value), state, ctx)\n : verifyExpectedNode(value, state, ctx);\n}\n\nexport const hydrationVerifier = {\n verifyRenderableNode,\n};\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { JSXElement } from "../common/jsx.js";
2
+ import { DocumentRenderArgs, DocumentRenderContext, DocumentRenderer } from "../common/ssr.js";
3
+ import { SSRDataMissingError } from "../common/ssr-errors.js";
4
+ import { RouteRenderOptions, RouteStreamOptions, SSRRoute, resolveRequest } from "./route-render.js";
5
+ import { SSRComponent, VNode } from "./types.js";
6
+ import { renderToStringSync } from "./render-sync.js";
7
+ import { renderResolvedToStringSync } from "./render-resolved.js";
8
+
9
+ //#region src/ssr/index-internal.d.ts
10
+ declare function renderToString(component: (props?: Record<string, unknown>) => VNode | JSXElement | string | number | null): string;
11
+ declare function renderToString(opts: RouteRenderOptions): string;
12
+ declare function renderToStream(opts: RouteStreamOptions): void;
13
+ //#endregion
14
+ export { type DocumentRenderArgs, type DocumentRenderContext, type DocumentRenderer, type SSRComponent, SSRDataMissingError, type SSRRoute, type VNode, renderResolvedToStringSync, renderToStream, renderToString, renderToStringSync, resolveRequest };
15
+ //# sourceMappingURL=index-internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-internal.d.ts","names":[],"sources":["../../src/ssr/index-internal.ts"],"mappings":";;;;;;;;;iBA4BgB,cAAA,CACd,SAAA,GACE,KAAA,GAAQ,MAAA,sBACL,KAAA,GAAQ,UAAA;AAAA,iBAEC,cAAA,CAAe,IAAwB,EAAlB,kBAAkB;AAAA,iBAavC,cAAA,CAAe,IAAwB,EAAlB,kBAAkB"}
@@ -0,0 +1,19 @@
1
+ import { SSRDataMissingError } from "../common/ssr-errors.js";
2
+ import "./context.js";
3
+ import { renderRouteToStream, renderRouteToString, resolveRequest } from "./route-render.js";
4
+ import { renderSSRRouteAppToSink, renderToStringSync } from "./render-sync.js";
5
+ import "./hydration-verify.js";
6
+ import { renderResolvedToStringSync } from "./render-resolved.js";
7
+ //#region src/ssr/index-internal.ts
8
+ const routeRenderHost = { renderAppToSink: renderSSRRouteAppToSink };
9
+ function renderToString(arg) {
10
+ if (typeof arg === "function") return renderToStringSync(arg);
11
+ return renderRouteToString(arg, routeRenderHost);
12
+ }
13
+ function renderToStream(opts) {
14
+ renderRouteToStream(opts, routeRenderHost);
15
+ }
16
+ //#endregion
17
+ export { SSRDataMissingError, renderResolvedToStringSync, renderToStream, renderToString, renderToStringSync, resolveRequest };
18
+
19
+ //# sourceMappingURL=index-internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-internal.js","names":[],"sources":["../../src/ssr/index-internal.ts"],"sourcesContent":["import type { JSXElement } from '../common/jsx';\nimport {\n renderRouteToStream,\n renderRouteToString,\n resolveRequest,\n type RouteRenderHost,\n type RouteRenderOptions,\n type RouteStreamOptions,\n} from './route-render';\nimport { renderSSRRouteAppToSink, renderToStringSync } from './render-sync';\nimport type { VNode } from './types';\nimport './hydration-verify';\n\nexport { SSRDataMissingError } from './context';\nexport type {\n DocumentRenderArgs,\n DocumentRenderContext,\n DocumentRenderer,\n} from '../common/ssr';\nexport type { SSRRoute } from './route-render';\nexport type { VNode, SSRComponent } from './types';\nexport { renderResolvedToStringSync } from './render-resolved';\nexport { renderToStringSync, resolveRequest };\n\nconst routeRenderHost: RouteRenderHost = {\n renderAppToSink: renderSSRRouteAppToSink,\n};\n\nexport function renderToString(\n component: (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | null\n): string;\nexport function renderToString(opts: RouteRenderOptions): string;\nexport function renderToString(arg: unknown): string {\n if (typeof arg === 'function') {\n return renderToStringSync(\n arg as (\n props?: Record<string, unknown>\n ) => VNode | JSXElement | string | number | null\n );\n }\n const opts = arg as RouteRenderOptions;\n return renderRouteToString(opts, routeRenderHost);\n}\n\nexport function renderToStream(opts: RouteStreamOptions): void {\n renderRouteToStream(opts, routeRenderHost);\n}\n"],"mappings":";;;;;;;AAwBA,MAAM,kBAAmC,EACvC,iBAAiB,wBACnB;AAQA,SAAgB,eAAe,KAAsB;CACnD,IAAI,OAAO,QAAQ,YACjB,OAAO,mBACL,GAGF;CAGF,OAAO,oBAAoB,KAAM,eAAe;AAClD;AAEA,SAAgB,eAAe,MAAgC;CAC7D,oBAAoB,MAAM,eAAe;AAC3C"}
@@ -1,60 +1,8 @@
1
- import { JSXElement } from "../common/jsx.js";
2
- import { DocumentRenderArgs, DocumentRenderContext, DocumentRenderer, SSRData } from "../common/ssr.js";
3
- import { RouteAuthOptions, RouteHandler, RouteManifest, RouteRequestResult } from "../common/router.js";
1
+ import { DocumentRenderArgs, DocumentRenderContext, DocumentRenderer } from "../common/ssr.js";
4
2
  import { SSRDataMissingError } from "../common/ssr-errors.js";
3
+ import { SSRRoute, resolveRequest } from "./route-render.js";
5
4
  import { SSRComponent, VNode } from "./types.js";
5
+ import { renderToStringSync } from "./render-sync.js";
6
6
  import { renderResolvedToStringSync } from "./render-resolved.js";
7
-
8
- //#region src/ssr/index.d.ts
9
- /**
10
- * Single synchronous SSR entrypoint: render a component to an HTML string.
11
- * This is strictly synchronous and deterministic. Optionally provide a seed
12
- * for deterministic randomness via `options.seed`.
13
- */
14
- declare function renderToStringSync(component: (props?: Record<string, unknown>) => VNode | JSXElement | string | number | boolean | null | undefined, props?: Record<string, unknown>, options?: {
15
- seed?: number;
16
- data?: SSRData;
17
- }): string;
18
- declare function resolveRequest(opts: {
19
- url: string;
20
- manifest: RouteManifest;
21
- routes?: Array<{
22
- path: string;
23
- handler: RouteHandler;
24
- namespace?: string;
25
- }>;
26
- auth?: RouteAuthOptions;
27
- signal?: AbortSignal;
28
- } | {
29
- url: string;
30
- manifest?: RouteManifest;
31
- routes: Array<{
32
- path: string;
33
- handler: RouteHandler;
34
- namespace?: string;
35
- }>;
36
- auth?: RouteAuthOptions;
37
- signal?: AbortSignal;
38
- }): Promise<RouteRequestResult>;
39
- type SSRRoute = {
40
- path: string;
41
- handler: RouteHandler;
42
- namespace?: string;
43
- };
44
- type RouteRenderOptions = {
45
- url: string;
46
- routes: SSRRoute[];
47
- seed?: number;
48
- data?: SSRData;
49
- document?: DocumentRenderer;
50
- };
51
- type RouteStreamOptions = RouteRenderOptions & {
52
- onChunk(html: string): void;
53
- onComplete(): void;
54
- };
55
- declare function renderToString(component: (props?: Record<string, unknown>) => VNode | JSXElement | string | number | null): string;
56
- declare function renderToString(opts: RouteRenderOptions): string;
57
- declare function renderToStream(opts: RouteStreamOptions): void;
58
- //#endregion
59
- export { type DocumentRenderArgs, type DocumentRenderContext, type DocumentRenderer, type SSRComponent, SSRDataMissingError, SSRRoute, type VNode, renderResolvedToStringSync, renderToStream, renderToString, renderToStringSync, resolveRequest };
60
- //# sourceMappingURL=index.d.ts.map
7
+ import { renderToStream, renderToString } from "./index-internal.js";
8
+ export { type DocumentRenderArgs, type DocumentRenderContext, type DocumentRenderer, type SSRComponent, SSRDataMissingError, type SSRRoute, type VNode, renderResolvedToStringSync, renderToStream, renderToString, renderToStringSync, resolveRequest };