@nifrajs/web 5.5.1 → 5.7.0

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 (481) hide show
  1. package/CHANGELOG.md +243 -0
  2. package/README.md +21 -11
  3. package/dist/boundary.d.ts +67 -7
  4. package/dist/boundary.d.ts.map +1 -1
  5. package/dist/boundary.js +6 -4
  6. package/dist/boundary.js.map +1 -1
  7. package/dist/build-plan.d.ts +3 -0
  8. package/dist/build-plan.d.ts.map +1 -1
  9. package/dist/build-plan.js.map +1 -1
  10. package/dist/build-vite.d.ts.map +1 -1
  11. package/dist/build-vite.js +2 -0
  12. package/dist/build-vite.js.map +1 -1
  13. package/dist/build.d.ts +9 -2
  14. package/dist/build.d.ts.map +1 -1
  15. package/dist/build.js +10 -0
  16. package/dist/build.js.map +1 -1
  17. package/dist/client.d.ts +3 -1
  18. package/dist/client.d.ts.map +1 -1
  19. package/dist/client.js +174 -23
  20. package/dist/client.js.map +1 -1
  21. package/dist/csp.d.ts +8 -0
  22. package/dist/csp.d.ts.map +1 -1
  23. package/dist/csp.js +11 -2
  24. package/dist/csp.js.map +1 -1
  25. package/dist/deferred.d.ts +6 -4
  26. package/dist/deferred.d.ts.map +1 -1
  27. package/dist/deferred.js +10 -6
  28. package/dist/deferred.js.map +1 -1
  29. package/dist/dev-feed.d.ts.map +1 -1
  30. package/dist/dev-feed.js +11 -2
  31. package/dist/dev-feed.js.map +1 -1
  32. package/dist/dev-session.d.ts.map +1 -1
  33. package/dist/dev-session.js +13 -6
  34. package/dist/dev-session.js.map +1 -1
  35. package/dist/dev.d.ts +4 -1
  36. package/dist/dev.d.ts.map +1 -1
  37. package/dist/dev.js +12 -5
  38. package/dist/dev.js.map +1 -1
  39. package/dist/diagnostic-catalog.d.ts +4 -0
  40. package/dist/diagnostic-catalog.d.ts.map +1 -1
  41. package/dist/diagnostic-catalog.js +48 -0
  42. package/dist/diagnostic-catalog.js.map +1 -1
  43. package/dist/diagnostic.d.ts +1 -1
  44. package/dist/diagnostic.d.ts.map +1 -1
  45. package/dist/diagnostic.js +1 -1
  46. package/dist/diagnostic.js.map +1 -1
  47. package/dist/fn.d.ts +5 -3
  48. package/dist/fn.d.ts.map +1 -1
  49. package/dist/fn.js +20 -5
  50. package/dist/fn.js.map +1 -1
  51. package/dist/fs.d.ts.map +1 -1
  52. package/dist/fs.js +13 -3
  53. package/dist/fs.js.map +1 -1
  54. package/dist/identity.d.ts +22 -0
  55. package/dist/identity.d.ts.map +1 -0
  56. package/dist/identity.js +60 -0
  57. package/dist/identity.js.map +1 -0
  58. package/dist/index.d.ts +8 -6
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +6 -3
  61. package/dist/index.js.map +1 -1
  62. package/dist/internal/cdn/cloudflare.d.ts +2 -1
  63. package/dist/internal/cdn/cloudflare.d.ts.map +1 -1
  64. package/dist/internal/cdn/cloudflare.js +2 -1
  65. package/dist/internal/cdn/cloudflare.js.map +1 -1
  66. package/dist/internal/certified-components.d.ts +1 -1
  67. package/dist/internal/certified-components.js +1 -1
  68. package/dist/internal/codegen.d.ts +11 -10
  69. package/dist/internal/codegen.d.ts.map +1 -1
  70. package/dist/internal/codegen.js +73 -10
  71. package/dist/internal/codegen.js.map +1 -1
  72. package/dist/internal/dev-websocket.d.ts +73 -0
  73. package/dist/internal/dev-websocket.d.ts.map +1 -0
  74. package/dist/internal/dev-websocket.js +145 -0
  75. package/dist/internal/dev-websocket.js.map +1 -0
  76. package/dist/internal/hole-runtime.d.ts +66 -0
  77. package/dist/internal/hole-runtime.d.ts.map +1 -0
  78. package/dist/internal/hole-runtime.js +211 -0
  79. package/dist/internal/hole-runtime.js.map +1 -0
  80. package/dist/internal/identity-epoch.d.ts +50 -0
  81. package/dist/internal/identity-epoch.d.ts.map +1 -0
  82. package/dist/internal/identity-epoch.js +180 -0
  83. package/dist/internal/identity-epoch.js.map +1 -0
  84. package/dist/internal/invalidation-contract.d.ts +23 -0
  85. package/dist/internal/invalidation-contract.d.ts.map +1 -0
  86. package/dist/internal/invalidation-contract.js +11 -0
  87. package/dist/internal/invalidation-contract.js.map +1 -0
  88. package/dist/internal/invalidation.d.ts +62 -0
  89. package/dist/internal/invalidation.d.ts.map +1 -0
  90. package/dist/internal/invalidation.js +149 -0
  91. package/dist/internal/invalidation.js.map +1 -0
  92. package/dist/internal/island-bindings.d.ts +51 -0
  93. package/dist/internal/island-bindings.d.ts.map +1 -0
  94. package/dist/internal/island-bindings.js +147 -0
  95. package/dist/internal/island-bindings.js.map +1 -0
  96. package/dist/internal/island-list.d.ts +26 -0
  97. package/dist/internal/island-list.d.ts.map +1 -0
  98. package/dist/internal/island-list.js +78 -0
  99. package/dist/internal/island-list.js.map +1 -0
  100. package/dist/internal/island-mount.d.ts +4 -0
  101. package/dist/internal/island-mount.d.ts.map +1 -0
  102. package/dist/internal/island-mount.js +66 -0
  103. package/dist/internal/island-mount.js.map +1 -0
  104. package/dist/internal/island-owner.d.ts +5 -0
  105. package/dist/internal/island-owner.d.ts.map +1 -0
  106. package/dist/internal/island-owner.js +20 -0
  107. package/dist/internal/island-owner.js.map +1 -0
  108. package/dist/internal/island-resource.d.ts +30 -0
  109. package/dist/internal/island-resource.d.ts.map +1 -0
  110. package/dist/internal/island-resource.js +57 -0
  111. package/dist/internal/island-resource.js.map +1 -0
  112. package/dist/internal/island-signals.d.ts +51 -0
  113. package/dist/internal/island-signals.d.ts.map +1 -0
  114. package/dist/internal/island-signals.js +220 -0
  115. package/dist/internal/island-signals.js.map +1 -0
  116. package/dist/internal/keep-alive-table.d.ts +23 -0
  117. package/dist/internal/keep-alive-table.d.ts.map +1 -0
  118. package/dist/internal/keep-alive-table.js +53 -0
  119. package/dist/internal/keep-alive-table.js.map +1 -0
  120. package/dist/internal/live-contract.d.ts +101 -0
  121. package/dist/internal/live-contract.d.ts.map +1 -0
  122. package/dist/internal/live-contract.js +5 -0
  123. package/dist/internal/live-contract.js.map +1 -0
  124. package/dist/internal/live-queries.d.ts +22 -0
  125. package/dist/internal/live-queries.d.ts.map +1 -0
  126. package/dist/internal/live-queries.js +54 -0
  127. package/dist/internal/live-queries.js.map +1 -0
  128. package/dist/internal/page-events.d.ts +10 -0
  129. package/dist/internal/page-events.d.ts.map +1 -0
  130. package/dist/internal/page-events.js +26 -0
  131. package/dist/internal/page-events.js.map +1 -0
  132. package/dist/internal/page-execution.d.ts +16 -1
  133. package/dist/internal/page-execution.d.ts.map +1 -1
  134. package/dist/internal/page-execution.js +432 -31
  135. package/dist/internal/page-execution.js.map +1 -1
  136. package/dist/internal/parity.d.ts +3 -0
  137. package/dist/internal/parity.d.ts.map +1 -1
  138. package/dist/internal/parity.js +28 -5
  139. package/dist/internal/parity.js.map +1 -1
  140. package/dist/internal/ppr/admission.d.ts +83 -0
  141. package/dist/internal/ppr/admission.d.ts.map +1 -0
  142. package/dist/internal/ppr/admission.js +221 -0
  143. package/dist/internal/ppr/admission.js.map +1 -0
  144. package/dist/internal/ppr/canary.d.ts +24 -0
  145. package/dist/internal/ppr/canary.d.ts.map +1 -0
  146. package/dist/internal/ppr/canary.js +102 -0
  147. package/dist/internal/ppr/canary.js.map +1 -0
  148. package/dist/internal/ppr/compile-shell.d.ts +39 -0
  149. package/dist/internal/ppr/compile-shell.d.ts.map +1 -0
  150. package/dist/internal/ppr/compile-shell.js +298 -0
  151. package/dist/internal/ppr/compile-shell.js.map +1 -0
  152. package/dist/internal/ppr/contract.d.ts +177 -0
  153. package/dist/internal/ppr/contract.d.ts.map +1 -0
  154. package/dist/internal/ppr/contract.js +80 -0
  155. package/dist/internal/ppr/contract.js.map +1 -0
  156. package/dist/internal/ppr/frames.d.ts +71 -0
  157. package/dist/internal/ppr/frames.d.ts.map +1 -0
  158. package/dist/internal/ppr/frames.js +119 -0
  159. package/dist/internal/ppr/frames.js.map +1 -0
  160. package/dist/internal/ppr/integration.d.ts +19 -0
  161. package/dist/internal/ppr/integration.d.ts.map +1 -0
  162. package/dist/internal/ppr/integration.js +106 -0
  163. package/dist/internal/ppr/integration.js.map +1 -0
  164. package/dist/internal/ppr/options.d.ts +96 -0
  165. package/dist/internal/ppr/options.d.ts.map +1 -0
  166. package/dist/internal/ppr/options.js +125 -0
  167. package/dist/internal/ppr/options.js.map +1 -0
  168. package/dist/internal/ppr/route-rules.d.ts +12 -0
  169. package/dist/internal/ppr/route-rules.d.ts.map +1 -0
  170. package/dist/internal/ppr/route-rules.js +53 -0
  171. package/dist/internal/ppr/route-rules.js.map +1 -0
  172. package/dist/internal/ppr/runtime.d.ts +29 -0
  173. package/dist/internal/ppr/runtime.d.ts.map +1 -0
  174. package/dist/internal/ppr/runtime.js +35 -0
  175. package/dist/internal/ppr/runtime.js.map +1 -0
  176. package/dist/internal/ppr/server.d.ts +29 -0
  177. package/dist/internal/ppr/server.d.ts.map +1 -0
  178. package/dist/internal/ppr/server.js +1409 -0
  179. package/dist/internal/ppr/server.js.map +1 -0
  180. package/dist/internal/ppr/shell-store.d.ts +39 -0
  181. package/dist/internal/ppr/shell-store.d.ts.map +1 -0
  182. package/dist/internal/ppr/shell-store.js +106 -0
  183. package/dist/internal/ppr/shell-store.js.map +1 -0
  184. package/dist/internal/prerendered-pages.d.ts +1 -1
  185. package/dist/internal/prerendered-pages.d.ts.map +1 -1
  186. package/dist/internal/prerendered-pages.js +7 -4
  187. package/dist/internal/prerendered-pages.js.map +1 -1
  188. package/dist/internal/present.d.ts +11 -0
  189. package/dist/internal/present.d.ts.map +1 -0
  190. package/dist/internal/present.js +13 -0
  191. package/dist/internal/present.js.map +1 -0
  192. package/dist/internal/query-digest.d.ts +9 -0
  193. package/dist/internal/query-digest.d.ts.map +1 -0
  194. package/dist/internal/query-digest.js +23 -0
  195. package/dist/internal/query-digest.js.map +1 -0
  196. package/dist/internal/query-runtime.d.ts +6 -1
  197. package/dist/internal/query-runtime.d.ts.map +1 -1
  198. package/dist/internal/query-runtime.js +9 -0
  199. package/dist/internal/query-runtime.js.map +1 -1
  200. package/dist/internal/query-seam.d.ts +29 -0
  201. package/dist/internal/query-seam.d.ts.map +1 -0
  202. package/dist/internal/query-seam.js +23 -0
  203. package/dist/internal/query-seam.js.map +1 -0
  204. package/dist/internal/render-document.d.ts +34 -64
  205. package/dist/internal/render-document.d.ts.map +1 -1
  206. package/dist/internal/render-document.js +82 -64
  207. package/dist/internal/render-document.js.map +1 -1
  208. package/dist/internal/request-abort.d.ts +8 -0
  209. package/dist/internal/request-abort.d.ts.map +1 -0
  210. package/dist/internal/request-abort.js +22 -0
  211. package/dist/internal/request-abort.js.map +1 -0
  212. package/dist/internal/server-boundary.d.ts +2 -0
  213. package/dist/internal/server-boundary.d.ts.map +1 -1
  214. package/dist/internal/server-boundary.js +8 -1
  215. package/dist/internal/server-boundary.js.map +1 -1
  216. package/dist/internal/share-data.d.ts +10 -0
  217. package/dist/internal/share-data.d.ts.map +1 -0
  218. package/dist/internal/share-data.js +135 -0
  219. package/dist/internal/share-data.js.map +1 -0
  220. package/dist/internal/status-page.d.ts +68 -0
  221. package/dist/internal/status-page.d.ts.map +1 -0
  222. package/dist/internal/status-page.js +66 -0
  223. package/dist/internal/status-page.js.map +1 -0
  224. package/dist/internal/store-signature.d.ts +15 -0
  225. package/dist/internal/store-signature.d.ts.map +1 -0
  226. package/dist/internal/store-signature.js +114 -0
  227. package/dist/internal/store-signature.js.map +1 -0
  228. package/dist/internal/vite-plugin-compat.d.ts +2 -2
  229. package/dist/internal/vite-plugin-compat.js +2 -2
  230. package/dist/internal/web-app.d.ts +26 -0
  231. package/dist/internal/web-app.d.ts.map +1 -1
  232. package/dist/internal/web-app.js +79 -3
  233. package/dist/internal/web-app.js.map +1 -1
  234. package/dist/islands-swap.d.ts +41 -0
  235. package/dist/islands-swap.d.ts.map +1 -0
  236. package/dist/islands-swap.js +270 -0
  237. package/dist/islands-swap.js.map +1 -0
  238. package/dist/islands.d.ts +86 -24
  239. package/dist/islands.d.ts.map +1 -1
  240. package/dist/islands.js +138 -78
  241. package/dist/islands.js.map +1 -1
  242. package/dist/isr.d.ts +67 -13
  243. package/dist/isr.d.ts.map +1 -1
  244. package/dist/isr.js +247 -99
  245. package/dist/isr.js.map +1 -1
  246. package/dist/keep-alive.d.ts +147 -0
  247. package/dist/keep-alive.d.ts.map +1 -0
  248. package/dist/keep-alive.js +1102 -0
  249. package/dist/keep-alive.js.map +1 -0
  250. package/dist/live/bus.d.ts +70 -0
  251. package/dist/live/bus.d.ts.map +1 -0
  252. package/dist/live/bus.js +55 -0
  253. package/dist/live/bus.js.map +1 -0
  254. package/dist/live/core.d.ts +25 -0
  255. package/dist/live/core.d.ts.map +1 -0
  256. package/dist/live/core.js +29 -0
  257. package/dist/live/core.js.map +1 -0
  258. package/dist/live/history.d.ts +38 -0
  259. package/dist/live/history.d.ts.map +1 -0
  260. package/dist/live/history.js +104 -0
  261. package/dist/live/history.js.map +1 -0
  262. package/dist/live/hub-protocol.d.ts +46 -0
  263. package/dist/live/hub-protocol.d.ts.map +1 -0
  264. package/dist/live/hub-protocol.js +108 -0
  265. package/dist/live/hub-protocol.js.map +1 -0
  266. package/dist/live/hub.d.ts +185 -0
  267. package/dist/live/hub.d.ts.map +1 -0
  268. package/dist/live/hub.js +544 -0
  269. package/dist/live/hub.js.map +1 -0
  270. package/dist/live/keyring.d.ts +92 -0
  271. package/dist/live/keyring.d.ts.map +1 -0
  272. package/dist/live/keyring.js +265 -0
  273. package/dist/live/keyring.js.map +1 -0
  274. package/dist/live/read-capped.d.ts +6 -0
  275. package/dist/live/read-capped.d.ts.map +1 -0
  276. package/dist/live/read-capped.js +42 -0
  277. package/dist/live/read-capped.js.map +1 -0
  278. package/dist/live/revocations.d.ts +52 -0
  279. package/dist/live/revocations.d.ts.map +1 -0
  280. package/dist/live/revocations.js +116 -0
  281. package/dist/live/revocations.js.map +1 -0
  282. package/dist/live/settings.d.ts +14 -0
  283. package/dist/live/settings.d.ts.map +1 -0
  284. package/dist/live/settings.js +38 -0
  285. package/dist/live/settings.js.map +1 -0
  286. package/dist/live-client.d.ts +34 -0
  287. package/dist/live-client.d.ts.map +1 -0
  288. package/dist/live-client.js +878 -0
  289. package/dist/live-client.js.map +1 -0
  290. package/dist/live-hub.d.ts +130 -0
  291. package/dist/live-hub.d.ts.map +1 -0
  292. package/dist/live-hub.js +507 -0
  293. package/dist/live-hub.js.map +1 -0
  294. package/dist/live-redis.d.ts +60 -0
  295. package/dist/live-redis.d.ts.map +1 -0
  296. package/dist/live-redis.js +212 -0
  297. package/dist/live-redis.js.map +1 -0
  298. package/dist/live.d.ts +150 -0
  299. package/dist/live.d.ts.map +1 -0
  300. package/dist/live.js +972 -0
  301. package/dist/live.js.map +1 -0
  302. package/dist/manifest.d.ts +113 -2
  303. package/dist/manifest.d.ts.map +1 -1
  304. package/dist/manifest.js +109 -5
  305. package/dist/manifest.js.map +1 -1
  306. package/dist/navigation.d.ts +9 -3
  307. package/dist/navigation.d.ts.map +1 -1
  308. package/dist/navigation.js +13 -3
  309. package/dist/navigation.js.map +1 -1
  310. package/dist/plugins/vite-zone-guard.d.ts +6 -0
  311. package/dist/plugins/vite-zone-guard.d.ts.map +1 -1
  312. package/dist/plugins/vite-zone-guard.js +8 -2
  313. package/dist/plugins/vite-zone-guard.js.map +1 -1
  314. package/dist/ppr.d.ts +73 -0
  315. package/dist/ppr.d.ts.map +1 -0
  316. package/dist/ppr.js +76 -0
  317. package/dist/ppr.js.map +1 -0
  318. package/dist/query.d.ts +8 -13
  319. package/dist/query.d.ts.map +1 -1
  320. package/dist/query.js +112 -18
  321. package/dist/query.js.map +1 -1
  322. package/dist/render-seam.d.ts +32 -0
  323. package/dist/render-seam.d.ts.map +1 -1
  324. package/dist/render-seam.js +7 -0
  325. package/dist/render-seam.js.map +1 -1
  326. package/dist/route-types.d.ts.map +1 -1
  327. package/dist/route-types.js +2 -2
  328. package/dist/route-types.js.map +1 -1
  329. package/dist/router.d.ts +72 -4
  330. package/dist/router.d.ts.map +1 -1
  331. package/dist/router.js +416 -129
  332. package/dist/router.js.map +1 -1
  333. package/dist/server-components/build.d.ts.map +1 -1
  334. package/dist/server-components/build.js +3 -3
  335. package/dist/server-components/build.js.map +1 -1
  336. package/dist/server-components/client.d.ts +23 -1
  337. package/dist/server-components/client.d.ts.map +1 -1
  338. package/dist/server-components/client.js +92 -5
  339. package/dist/server-components/client.js.map +1 -1
  340. package/dist/server-components/definition.d.ts.map +1 -1
  341. package/dist/server-components/definition.js +2 -1
  342. package/dist/server-components/definition.js.map +1 -1
  343. package/dist/server-components/hole.d.ts +8 -0
  344. package/dist/server-components/hole.d.ts.map +1 -0
  345. package/dist/server-components/hole.js +20 -0
  346. package/dist/server-components/hole.js.map +1 -0
  347. package/dist/server-components/html-policy.d.ts.map +1 -1
  348. package/dist/server-components/html-policy.js +62 -4
  349. package/dist/server-components/html-policy.js.map +1 -1
  350. package/dist/server-components/html-scan.d.ts +17 -0
  351. package/dist/server-components/html-scan.d.ts.map +1 -0
  352. package/dist/server-components/html-scan.js +180 -0
  353. package/dist/server-components/html-scan.js.map +1 -0
  354. package/dist/server-components/html.d.ts.map +1 -1
  355. package/dist/server-components/html.js +19 -4
  356. package/dist/server-components/html.js.map +1 -1
  357. package/dist/server-components/router-integration.d.ts +4 -1
  358. package/dist/server-components/router-integration.d.ts.map +1 -1
  359. package/dist/server-components/router-integration.js +23 -2
  360. package/dist/server-components/router-integration.js.map +1 -1
  361. package/dist/server-components/runtime.d.ts +6 -1
  362. package/dist/server-components/runtime.d.ts.map +1 -1
  363. package/dist/server-components/runtime.js +88 -29
  364. package/dist/server-components/runtime.js.map +1 -1
  365. package/dist/server-components/state.d.ts +3 -1
  366. package/dist/server-components/state.d.ts.map +1 -1
  367. package/dist/server-components/state.js +50 -38
  368. package/dist/server-components/state.js.map +1 -1
  369. package/dist/server-components/types.d.ts +9 -0
  370. package/dist/server-components/types.d.ts.map +1 -1
  371. package/dist/server-components/vite.d.ts.map +1 -1
  372. package/dist/server-components/vite.js +26 -9
  373. package/dist/server-components/vite.js.map +1 -1
  374. package/dist/vite.d.ts +5 -1
  375. package/dist/vite.d.ts.map +1 -1
  376. package/dist/vite.js +58 -4
  377. package/dist/vite.js.map +1 -1
  378. package/package.json +48 -8
  379. package/src/boundary.ts +77 -5
  380. package/src/build-plan.ts +3 -0
  381. package/src/build-vite.ts +2 -0
  382. package/src/build.ts +20 -1
  383. package/src/client.ts +183 -23
  384. package/src/csp.ts +16 -2
  385. package/src/deferred.ts +11 -5
  386. package/src/dev-feed.ts +11 -2
  387. package/src/dev-session.ts +22 -11
  388. package/src/dev.ts +29 -8
  389. package/src/diagnostic-catalog.ts +53 -0
  390. package/src/diagnostic.ts +1 -0
  391. package/src/fn.ts +24 -7
  392. package/src/fs.ts +22 -8
  393. package/src/identity.ts +61 -0
  394. package/src/index.ts +20 -4
  395. package/src/internal/cdn/cloudflare.ts +2 -1
  396. package/src/internal/certified-components.ts +1 -1
  397. package/src/internal/codegen.ts +95 -9
  398. package/src/internal/dev-websocket.ts +230 -0
  399. package/src/internal/hole-runtime.ts +286 -0
  400. package/src/internal/identity-epoch.ts +239 -0
  401. package/src/internal/invalidation-contract.ts +35 -0
  402. package/src/internal/invalidation.ts +213 -0
  403. package/src/internal/island-bindings.ts +191 -0
  404. package/src/internal/island-list.ts +92 -0
  405. package/src/internal/island-mount.ts +68 -0
  406. package/src/internal/island-owner.ts +20 -0
  407. package/src/internal/island-resource.ts +76 -0
  408. package/src/internal/island-signals.ts +249 -0
  409. package/src/internal/keep-alive-table.ts +72 -0
  410. package/src/internal/live-contract.ts +111 -0
  411. package/src/internal/live-queries.ts +60 -0
  412. package/src/internal/page-events.ts +27 -0
  413. package/src/internal/page-execution.ts +605 -45
  414. package/src/internal/parity.ts +35 -6
  415. package/src/internal/ppr/admission.ts +300 -0
  416. package/src/internal/ppr/canary.ts +122 -0
  417. package/src/internal/ppr/compile-shell.ts +379 -0
  418. package/src/internal/ppr/contract.ts +265 -0
  419. package/src/internal/ppr/frames.ts +170 -0
  420. package/src/internal/ppr/integration.ts +137 -0
  421. package/src/internal/ppr/options.ts +221 -0
  422. package/src/internal/ppr/route-rules.ts +77 -0
  423. package/src/internal/ppr/runtime.ts +39 -0
  424. package/src/internal/ppr/server.ts +1766 -0
  425. package/src/internal/ppr/shell-store.ts +152 -0
  426. package/src/internal/prerendered-pages.ts +7 -4
  427. package/src/internal/present.ts +20 -0
  428. package/src/internal/query-digest.ts +34 -0
  429. package/src/internal/query-runtime.ts +14 -1
  430. package/src/internal/query-seam.ts +48 -0
  431. package/src/internal/render-document.ts +158 -113
  432. package/src/internal/request-abort.ts +26 -0
  433. package/src/internal/server-boundary.ts +10 -1
  434. package/src/internal/share-data.ts +136 -0
  435. package/src/internal/status-page.ts +95 -0
  436. package/src/internal/store-signature.ts +149 -0
  437. package/src/internal/vite-plugin-compat.ts +2 -2
  438. package/src/internal/web-app.ts +123 -3
  439. package/src/islands-swap.ts +283 -0
  440. package/src/islands.ts +169 -72
  441. package/src/isr.ts +348 -106
  442. package/src/keep-alive.ts +1354 -0
  443. package/src/live/bus.ts +104 -0
  444. package/src/live/core.ts +52 -0
  445. package/src/live/history.ts +109 -0
  446. package/src/live/hub-protocol.ts +133 -0
  447. package/src/live/hub.ts +620 -0
  448. package/src/live/keyring.ts +384 -0
  449. package/src/live/read-capped.ts +36 -0
  450. package/src/live/revocations.ts +155 -0
  451. package/src/live/settings.ts +46 -0
  452. package/src/live-client.ts +1011 -0
  453. package/src/live-hub.ts +658 -0
  454. package/src/live-redis.ts +284 -0
  455. package/src/live.ts +1257 -0
  456. package/src/manifest.ts +274 -6
  457. package/src/navigation.ts +14 -2
  458. package/src/plugins/vite-zone-guard.ts +15 -2
  459. package/src/ppr.ts +153 -0
  460. package/src/query.ts +147 -20
  461. package/src/render-seam.ts +37 -0
  462. package/src/route-types.ts +3 -1
  463. package/src/router.ts +534 -132
  464. package/src/server-components/build.ts +9 -3
  465. package/src/server-components/client.ts +89 -5
  466. package/src/server-components/definition.ts +2 -1
  467. package/src/server-components/hole.ts +23 -0
  468. package/src/server-components/html-policy.ts +63 -4
  469. package/src/server-components/html-scan.ts +159 -0
  470. package/src/server-components/html.ts +18 -4
  471. package/src/server-components/router-integration.ts +21 -2
  472. package/src/server-components/runtime.ts +114 -31
  473. package/src/server-components/state.ts +66 -44
  474. package/src/server-components/types.ts +16 -0
  475. package/src/server-components/vite.ts +33 -14
  476. package/src/vite.ts +75 -6
  477. package/dist/nano.d.ts +0 -125
  478. package/dist/nano.d.ts.map +0 -1
  479. package/dist/nano.js +0 -190
  480. package/dist/nano.js.map +0 -1
  481. package/src/nano.ts +0 -246
@@ -11,6 +11,8 @@
11
11
  */
12
12
  /** Modules whose exports become client stubs: `todos.fn.ts`, `x.fn.mjs`, or the extensionless `foo.fn`. */
13
13
  export declare const SERVER_FN_MODULE: RegExp;
14
+ /** A server-function namespace: lowercase, dot/dash separated, so a mount cannot invent a path. */
15
+ export declare const SERVER_FN_NAMESPACE: RegExp;
14
16
  /**
15
17
  * The namespace a `*.fn.ts` module is mounted under: its filename without the `.fn` suffix.
16
18
  *
@@ -1 +1 @@
1
- {"version":3,"file":"server-boundary.d.ts","sourceRoot":"","sources":["../../src/internal/server-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,2GAA2G;AAC3G,eAAO,MAAM,gBAAgB,QAA2B,CAAA;AAoFxD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5D;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAwC9E;AAMD,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKtE"}
1
+ {"version":3,"file":"server-boundary.d.ts","sourceRoot":"","sources":["../../src/internal/server-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,2GAA2G;AAC3G,eAAO,MAAM,gBAAgB,QAA2B,CAAA;AACxD,mGAAmG;AACnG,eAAO,MAAM,mBAAmB,QAAkC,CAAA;AAoFlE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU1D;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5D;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAwC9E;AAMD,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKtE"}
@@ -11,6 +11,8 @@
11
11
  */
12
12
  /** Modules whose exports become client stubs: `todos.fn.ts`, `x.fn.mjs`, or the extensionless `foo.fn`. */
13
13
  export const SERVER_FN_MODULE = /\.fn(\.[cm]?[jt]sx?)?$/;
14
+ /** A server-function namespace: lowercase, dot/dash separated, so a mount cannot invent a path. */
15
+ export const SERVER_FN_NAMESPACE = /^[a-z0-9]+(?:[-.][a-z0-9]+)*$/;
14
16
  import { jsStringLiteral } from "./js-string.js";
15
17
  import { DATE_TAG, REVIVE_DATES_SOURCE } from "./revive-dates.js";
16
18
  // ---------------------------------------------------------------------------------------------------
@@ -104,7 +106,12 @@ function stringEnd(source, start) {
104
106
  */
105
107
  export function serverFnNamespace(filePath) {
106
108
  const base = filePath.replaceAll("\\", "/").split("/").pop() ?? "";
107
- return base.replace(SERVER_FN_MODULE, "");
109
+ const namespace = base.replace(SERVER_FN_MODULE, "");
110
+ // `serverFunctions()` refuses this namespace, so a stub calling it could never reach a function.
111
+ if (!SERVER_FN_NAMESPACE.test(namespace)) {
112
+ throw new Error(`[nifra/fn] ${base} names the server-function namespace ${JSON.stringify(namespace)}, which serverFunctions() refuses - name the file in lowercase dot/dash segments (todo-items.fn.ts).`);
113
+ }
114
+ return namespace;
108
115
  }
109
116
  /** The server functions a module declares, in source order. */
110
117
  export function scanServerFnExports(source) {
@@ -1 +1 @@
1
- {"version":3,"file":"server-boundary.js","sourceRoot":"","sources":["../../src/internal/server-boundary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server-boundary.js","sourceRoot":"","sources":["../../src/internal/server-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,2GAA2G;AAC3G,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAA;AACxD,mGAAmG;AACnG,MAAM,CAAC,MAAM,mBAAmB,GAAG,+BAA+B,CAAA;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEjE,sGAAsG;AACtG,4EAA4E;AAC5E,sGAAsG;AAEtG;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;2FAI2F;AAC3F,MAAM,WAAW,GACf,kFAAkF,CAAA;AACpF;;0FAE0F;AAC1F,MAAM,QAAQ,GAAG,oBAAoB,CAAA;AACrC;;;;yFAIyF;AACzF,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACtB,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjD,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAC1B,CAAC;aAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YACzC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;YACrC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;YAC5C,QAAQ,GAAG,CAAC,CAAA;QACd,CAAC;aAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAC3C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;YACrC,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA,CAAC,0BAA0B;YACvE,QAAQ,GAAG,CAAC,CAAA;QACd,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,CAAA;QACL,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACvB,CAAC;AAED;4FAC4F;AAC5F,SAAS,SAAS,CAAC,MAAc,EAAE,KAAa;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IACjB,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACtB,IAAI,IAAI,KAAK,IAAI;YAAE,CAAC,IAAI,CAAC,CAAA;aACpB,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,CAAA;aAChC,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,CAAC,CAAA;;YAC5C,CAAC,EAAE,CAAA;IACV,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;IACpD,iGAAiG;IACjG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,cAAc,IAAI,wCAAwC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,sGAAsG,CAC1L,CAAA;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAA;IACxE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;IACjD,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,2FAA2F;YACzF,+FAA+F;YAC/F,wFAAwF;YACxF,kGAAkG,CACrG,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,SAAiB;IACpE,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,KAAK;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,IAAI,6BAA6B,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;SAC/F,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,OAAO;sBACa,eAAe,CAAC,cAAc,SAAS,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA2BrC,QAAQ;;;EAGjC,mBAAmB;;EAEnB,KAAK;CACN,CAAA;AACD,CAAC;AAED,sGAAsG;AACtG,yEAAyE;AACzE,sGAAsG;AAEtG,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAAC,MAA0B;IAC5D,MAAM,UAAU,GAAG,MAAM,IAAI,SAAS,CAAA;IACtC,gGAAgG;IAChG,0FAA0F;IAC1F,OAAO,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,UAAU,CAAA;AACvE,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Structural sharing for reloaded route data. Plain objects and arrays compare by content and Dates
3
+ * by time; other values and symbol-bearing objects come from `next`. Non-tree client data stays
4
+ * intact. `plainJson` is only for freshly parsed JSON, before any client-loader transformation.
5
+ *
6
+ * Array elements with an `id` pair by it before position, preserving unchanged rows on a prepend or
7
+ * reorder. An array whose first 32 elements keep nothing is taken whole, without a full old-row index.
8
+ */
9
+ export declare function shareData<T>(prev: unknown, next: T, plainJson?: boolean): T;
10
+ //# sourceMappingURL=share-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-data.d.ts","sourceRoot":"","sources":["../../src/internal/share-data.ts"],"names":[],"mappings":"AAyBA;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,CAAC,CAAA"}
@@ -0,0 +1,135 @@
1
+ const isPlain = (value) => typeof value === "object" && value !== null && Object.getPrototypeOf(value) === Object.prototype;
2
+ const TOO_DEEP = Symbol("data too deep");
3
+ // Client loaders may return graphs, unlike JSON. Check the whole graph before comparing: a cycle
4
+ // inside a new subtree or beyond the array sample must not acquire copied parents. Shared references
5
+ // and accessors also keep the fresh result intact, rather than changing aliases or invoking getters.
6
+ function isTree(value, seen, depth) {
7
+ if (!Array.isArray(value) && !isPlain(value))
8
+ return true;
9
+ if (depth >= 128 || seen.has(value))
10
+ return false;
11
+ seen.add(value);
12
+ for (const key of Reflect.ownKeys(value)) {
13
+ const field = Object.getOwnPropertyDescriptor(value, key);
14
+ if (field === undefined ||
15
+ !("value" in field) ||
16
+ (!field.enumerable && !(Array.isArray(value) && key === "length")) ||
17
+ !isTree(field.value, seen, depth + 1))
18
+ return false;
19
+ }
20
+ return true;
21
+ }
22
+ export function shareData(prev, next, plainJson = false) {
23
+ if (Object.is(prev, next))
24
+ return prev;
25
+ if (!plainJson && !isTree(next, new Set(), 0))
26
+ return next;
27
+ try {
28
+ return share(prev, next, 0, plainJson);
29
+ }
30
+ catch (error) {
31
+ if (error === TOO_DEEP)
32
+ return next;
33
+ throw error;
34
+ }
35
+ }
36
+ // Client loaders can attach metadata that an enumerable-string-key copy would lose. Parsed JSON has
37
+ // no symbol keys, and the check would cost a third of a reload that changed one row.
38
+ const hasSymbols = (a, b) => Object.getOwnPropertySymbols(a).length > 0 || Object.getOwnPropertySymbols(b).length > 0;
39
+ function share(prev, next, depth, json) {
40
+ if (Object.is(prev, next))
41
+ return prev;
42
+ if (prev instanceof Date)
43
+ return next instanceof Date && prev.getTime() === next.getTime() ? prev : next;
44
+ if (Array.isArray(next)) {
45
+ if (!Array.isArray(prev) || (!json && hasSymbols(prev, next)))
46
+ return next;
47
+ if (depth >= 128)
48
+ throw TOO_DEEP;
49
+ const out = [];
50
+ let same = prev.length === next.length;
51
+ let byId;
52
+ let completeIndex = false;
53
+ // Which old elements a new one took, from the first id lookup on: each pairs at most once, so
54
+ // duplicate ids never put one old object at two places. Every element before that lookup took
55
+ // its own position.
56
+ let taken;
57
+ let kept = 0;
58
+ let i = 0;
59
+ for (const item of next) {
60
+ let old = taken?.[i] === 1 ? undefined : prev[i];
61
+ const id = isPlain(item) ? item.id : undefined;
62
+ if (id !== undefined && !(isPlain(old) && old.id === id)) {
63
+ if (taken === undefined) {
64
+ taken = new Uint8Array(prev.length);
65
+ taken.fill(1, 0, i);
66
+ }
67
+ if (byId === undefined || (i >= 32 && !completeIndex)) {
68
+ // Index only IDs needed by the sample until a kept row makes a full index worthwhile.
69
+ const wanted = i < 32
70
+ ? new Set(next.slice(0, 32).map((value) => (isPlain(value) ? value.id : undefined)))
71
+ : undefined;
72
+ completeIndex = wanted === undefined;
73
+ let min = Number.POSITIVE_INFINITY;
74
+ let max = Number.NEGATIVE_INFINITY;
75
+ for (const key of wanted ?? []) {
76
+ if (typeof key !== "number" || Number.isNaN(key)) {
77
+ min = Number.NEGATIVE_INFINITY;
78
+ max = Number.POSITIVE_INFINITY;
79
+ break;
80
+ }
81
+ min = Math.min(min, key);
82
+ max = Math.max(max, key);
83
+ }
84
+ byId = new Map();
85
+ for (let at = 0; at < prev.length; at++) {
86
+ const entry = prev[at];
87
+ if (!isPlain(entry))
88
+ continue;
89
+ const entryId = entry.id;
90
+ if (wanted === undefined ||
91
+ ((typeof entryId !== "number" || !(entryId < min || entryId > max)) &&
92
+ wanted.has(entryId)))
93
+ byId.set(entryId, at);
94
+ }
95
+ }
96
+ const at = byId.get(id);
97
+ old = at === undefined || taken[at] === 1 ? undefined : prev[at];
98
+ if (at !== undefined)
99
+ taken[at] = 1;
100
+ }
101
+ else if (taken !== undefined && i < taken.length && old !== undefined) {
102
+ taken[i] = 1;
103
+ }
104
+ const value = share(old, item, depth + 1, json);
105
+ out.push(value);
106
+ if (value === old)
107
+ kept++;
108
+ else if (i === 31 && kept === 0)
109
+ return next;
110
+ if (value !== prev[i])
111
+ same = false;
112
+ i++;
113
+ }
114
+ return same ? prev : out;
115
+ }
116
+ if (!isPlain(prev) || !isPlain(next) || (!json && hasSymbols(prev, next)))
117
+ return next;
118
+ if (depth >= 128)
119
+ throw TOO_DEEP;
120
+ const keys = Object.keys(next);
121
+ let same = keys.length === Object.keys(prev).length;
122
+ const out = {};
123
+ for (const key of keys) {
124
+ // A parsed payload can own a `__proto__` key, which a copy would turn into its prototype.
125
+ if (key === "__proto__")
126
+ return next;
127
+ const old = prev[key];
128
+ const value = share(old, next[key], depth + 1, json);
129
+ if (value !== old || (old === undefined && !Object.hasOwn(prev, key)))
130
+ same = false;
131
+ out[key] = value;
132
+ }
133
+ return same ? prev : out;
134
+ }
135
+ //# sourceMappingURL=share-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-data.js","sourceRoot":"","sources":["../../src/internal/share-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * The terminal-status helpers and their brand, free of server imports: `@nifrajs/web/client` re-exports
3
+ * them for route helpers the browser also loads, which the root entry would drag `node:crypto` into.
4
+ */
5
+ /** Derived from the `Headers` constructor rather than the DOM lib's `HeadersInit`: `@nifrajs/web`
6
+ * is consumed from DOM-free programs (the root tsconfig runs `types: ["bun"]`), and naming the DOM
7
+ * type here would break their build. Same workaround as `SSEInit.headers` in core. */
8
+ export type HeadersLike = ConstructorParameters<typeof Headers>[0];
9
+ /**
10
+ * Brand marking a `Response` as a **terminal-status signal** rather than a response to serve verbatim.
11
+ *
12
+ * A loader that throws a bare `Response` has always been passed straight through - that is how
13
+ * `throw redirect(...)` works, and apps rely on it. So "render the `_404` boundary at 404" cannot be
14
+ * expressed by throwing a plain `Response`: the framework would have no way to tell it apart from a
15
+ * hand-rolled body the app wants served exactly as written. The brand is that distinction, and
16
+ * checking it *before* the pass-through is what keeps every existing throw working unchanged.
17
+ *
18
+ * `Symbol.for` matches core's `RESPONSE_RESULT`: a registry symbol survives two copies of this module,
19
+ * which a `unique symbol` would not - and a duplicate-install turning a 404 into a raw 404 body would
20
+ * be a maddening bug to trace.
21
+ */
22
+ export declare const STATUS_SIGNAL: unique symbol;
23
+ export interface StatusSignal extends Response {
24
+ readonly [STATUS_SIGNAL]: {
25
+ readonly status: number;
26
+ readonly headers?: HeadersLike;
27
+ };
28
+ }
29
+ export declare function isStatusSignal(value: unknown): value is StatusSignal;
30
+ /** Options shared by {@link notFound}, {@link gone}, and {@link statusPage}. */
31
+ export interface StatusPageOptions {
32
+ /**
33
+ * Extra headers for the rendered response - `cache-control` above all.
34
+ *
35
+ * The defaults differ by status for a reason: a 404 may be a race with publication, so it wants a
36
+ * short TTL, while a 410 is a promise that the URL is permanently gone and can be cached hard.
37
+ * Getting this wrong is the difference between a crawler dropping a dead URL and re-fetching it
38
+ * for weeks.
39
+ */
40
+ readonly headers?: HeadersLike;
41
+ }
42
+ /**
43
+ * Render the nearest `_404` page at status **404**. `throw` it from a loader when the record does not
44
+ * exist.
45
+ *
46
+ * This is the fix for the soft 404: a matched route whose loader finds nothing has otherwise no way to
47
+ * answer 404, so the path of least resistance is to return empty data and render "not found" inside a
48
+ * **200**. That looks correct in a browser and is invisible in review, which is why it ships and stays
49
+ * shipped - while search engines penalise it and keep the dead URL indexed.
50
+ *
51
+ * Returns `never`: these throw, so a loader narrows without a redundant `return`, and the type states
52
+ * the thing the "loaders `throw` redirect, actions `return` it" rule already trips people on.
53
+ */
54
+ export declare function notFound(options?: StatusPageOptions): never;
55
+ /**
56
+ * Render a terminal page at status **410 Gone**. `throw` it from a loader for a record that existed and
57
+ * was deliberately removed - a withdrawn listing, a deleted post.
58
+ *
59
+ * 410 is not a pedantic 404: it tells a crawler to **drop** the URL rather than re-fetch it for weeks
60
+ * on the assumption the 404 was transient. Uses `_410.tsx` if the app has one, otherwise `_404`.
61
+ */
62
+ export declare function gone(options?: StatusPageOptions): never;
63
+ /**
64
+ * Render a terminal page at any 4xx/5xx status - the escape hatch behind {@link notFound} and
65
+ * {@link gone} (402, 451, …). Uses `_<status>.tsx` if present, otherwise `_404`.
66
+ */
67
+ export declare function statusPage(status: number, options?: StatusPageOptions): never;
68
+ //# sourceMappingURL=status-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-page.d.ts","sourceRoot":"","sources":["../../src/internal/status-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;sFAEsF;AACtF,MAAM,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AAElE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,eAAwC,CAAA;AAElE,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAA;KAAE,CAAA;CACtF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAiBD,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,iBAAsB,GAAG,KAAK,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,iBAAsB,GAAG,KAAK,CAE3D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,KAAK,CAEjF"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * The terminal-status helpers and their brand, free of server imports: `@nifrajs/web/client` re-exports
3
+ * them for route helpers the browser also loads, which the root entry would drag `node:crypto` into.
4
+ */
5
+ /**
6
+ * Brand marking a `Response` as a **terminal-status signal** rather than a response to serve verbatim.
7
+ *
8
+ * A loader that throws a bare `Response` has always been passed straight through - that is how
9
+ * `throw redirect(...)` works, and apps rely on it. So "render the `_404` boundary at 404" cannot be
10
+ * expressed by throwing a plain `Response`: the framework would have no way to tell it apart from a
11
+ * hand-rolled body the app wants served exactly as written. The brand is that distinction, and
12
+ * checking it *before* the pass-through is what keeps every existing throw working unchanged.
13
+ *
14
+ * `Symbol.for` matches core's `RESPONSE_RESULT`: a registry symbol survives two copies of this module,
15
+ * which a `unique symbol` would not - and a duplicate-install turning a 404 into a raw 404 body would
16
+ * be a maddening bug to trace.
17
+ */
18
+ export const STATUS_SIGNAL = Symbol.for("nifra.web.status-signal");
19
+ export function isStatusSignal(value) {
20
+ return value instanceof Response && STATUS_SIGNAL in value;
21
+ }
22
+ function statusSignal(status, options) {
23
+ if (!Number.isInteger(status) || status < 400 || status > 599) {
24
+ throw new Error(`[nifra/web] statusPage(${JSON.stringify(status)}) must be an integer 4xx or 5xx status. Use redirect() for 3xx, and return data for a successful render.`);
25
+ }
26
+ const response = new Response(null, { status });
27
+ // Non-enumerable so the brand never lands in a structured clone or a JSON log of the response.
28
+ Object.defineProperty(response, STATUS_SIGNAL, {
29
+ value: { status, ...(options.headers !== undefined ? { headers: options.headers } : {}) },
30
+ enumerable: false,
31
+ });
32
+ throw response;
33
+ }
34
+ /**
35
+ * Render the nearest `_404` page at status **404**. `throw` it from a loader when the record does not
36
+ * exist.
37
+ *
38
+ * This is the fix for the soft 404: a matched route whose loader finds nothing has otherwise no way to
39
+ * answer 404, so the path of least resistance is to return empty data and render "not found" inside a
40
+ * **200**. That looks correct in a browser and is invisible in review, which is why it ships and stays
41
+ * shipped - while search engines penalise it and keep the dead URL indexed.
42
+ *
43
+ * Returns `never`: these throw, so a loader narrows without a redundant `return`, and the type states
44
+ * the thing the "loaders `throw` redirect, actions `return` it" rule already trips people on.
45
+ */
46
+ export function notFound(options = {}) {
47
+ return statusSignal(404, options);
48
+ }
49
+ /**
50
+ * Render a terminal page at status **410 Gone**. `throw` it from a loader for a record that existed and
51
+ * was deliberately removed - a withdrawn listing, a deleted post.
52
+ *
53
+ * 410 is not a pedantic 404: it tells a crawler to **drop** the URL rather than re-fetch it for weeks
54
+ * on the assumption the 404 was transient. Uses `_410.tsx` if the app has one, otherwise `_404`.
55
+ */
56
+ export function gone(options = {}) {
57
+ return statusSignal(410, options);
58
+ }
59
+ /**
60
+ * Render a terminal page at any 4xx/5xx status - the escape hatch behind {@link notFound} and
61
+ * {@link gone} (402, 451, …). Uses `_<status>.tsx` if present, otherwise `_404`.
62
+ */
63
+ export function statusPage(status, options = {}) {
64
+ return statusSignal(status, options);
65
+ }
66
+ //# sourceMappingURL=status-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-page.js","sourceRoot":"","sources":["../../src/internal/status-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;AAMlE,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,QAAQ,IAAI,aAAa,IAAI,KAAK,CAAA;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,OAA0B;IAC9D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,0GAA0G,CAC3J,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/C,+FAA+F;IAC/F,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE;QAC7C,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QACzF,UAAU,EAAE,KAAK;KAClB,CAAC,CAAA;IACF,MAAM,QAAQ,CAAA;AAChB,CAAC;AAeD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CAAC,UAA6B,EAAE;IACtD,OAAO,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAAC,UAA6B,EAAE;IAClD,OAAO,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,UAA6B,EAAE;IACxE,OAAO,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACtC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** Below this, a secret is too short to sign with. */
2
+ export declare const MIN_STORE_SECRET_LENGTH = 32;
3
+ export declare const isStoreSecret: (value: unknown) => value is string;
4
+ /**
5
+ * Signs a list of strings. Each part is hashed behind its length, so no two lists hash the same
6
+ * bytes, whatever the parts hold.
7
+ */
8
+ export interface StoreSigner {
9
+ /** The parts' MAC, as lowercase hex. */
10
+ sign(parts: readonly string[]): Promise<string>;
11
+ /** Whether `mac` is the parts' MAC under this secret. Anything but 64 lowercase hex digits is not. */
12
+ verify(parts: readonly string[], mac: unknown): Promise<boolean>;
13
+ }
14
+ export declare function storeSigner(secret: string): StoreSigner;
15
+ //# sourceMappingURL=store-signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-signature.d.ts","sourceRoot":"","sources":["../../src/internal/store-signature.ts"],"names":[],"mappings":"AAeA,sDAAsD;AACtD,eAAO,MAAM,uBAAuB,KAAK,CAAA;AAEzC,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACc,CAAA;AAEtE;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,IAAI,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC/C,sGAAsG;IACtG,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACjE;AA4BD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAUvD"}
@@ -0,0 +1,114 @@
1
+ import { timingSafeEqual } from "./timing-safe-equal.js";
2
+ const TEXT = new TextEncoder();
3
+ const MAC_HEX = /^[0-9a-f]{64}$/;
4
+ // Code units of signed text a signer remembers as proven. A hot page then costs a comparison per
5
+ // hit, not a hash: about 1.5 ns a byte to hash against a fraction of that to compare.
6
+ const MAX_PROVEN_CHARS = 2 * 1024 * 1024;
7
+ const MAX_SIGNERS = 4;
8
+ /** Below this, a secret is too short to sign with. */
9
+ export const MIN_STORE_SECRET_LENGTH = 32;
10
+ export const isStoreSecret = (value) => typeof value === "string" && value.length >= MIN_STORE_SECRET_LENGTH;
11
+ // Looked up, never imported: a Worker without nodejs_compat cannot load node:crypto. Where it exists
12
+ // it is the cheaper path: Web Crypto answers on another thread, about 20 us a call on Bun, Node and
13
+ // Deno, more than hashing a 16 KB page.
14
+ function nodeCreateHmac() {
15
+ const createHmac = globalThis.process?.getBuiltinModule?.("node:crypto")?.createHmac;
16
+ return typeof createHmac === "function" ? createHmac : undefined;
17
+ }
18
+ const sameParts = (a, b) => a.length === b.length && a.every((part, at) => part === b[at]);
19
+ const lengthOf = (parts) => parts.reduce((sum, part) => sum + part.length, 0);
20
+ // One signer per secret for the process, so a handler built per request (a Worker reads its bindings
21
+ // in `fetch`) still finds the pages earlier requests proved.
22
+ const signers = new Map();
23
+ export function storeSigner(secret) {
24
+ const existing = signers.get(secret);
25
+ if (existing !== undefined)
26
+ return existing;
27
+ const signer = provingSigner(hasher(secret));
28
+ for (const oldest of signers.keys()) {
29
+ if (signers.size < MAX_SIGNERS)
30
+ break;
31
+ signers.delete(oldest);
32
+ }
33
+ signers.set(secret, signer);
34
+ return signer;
35
+ }
36
+ function provingSigner(hashing) {
37
+ // MAC to the parts this signer signed or verified, oldest first.
38
+ const proven = new Map();
39
+ let provenChars = 0;
40
+ const remember = (mac, parts) => {
41
+ const length = lengthOf(parts);
42
+ if (length > MAX_PROVEN_CHARS / 8)
43
+ return;
44
+ const had = proven.get(mac);
45
+ if (had !== undefined) {
46
+ proven.delete(mac);
47
+ provenChars -= lengthOf(had);
48
+ }
49
+ proven.set(mac, parts);
50
+ provenChars += length;
51
+ for (const [oldest, kept] of proven) {
52
+ if (provenChars <= MAX_PROVEN_CHARS)
53
+ break;
54
+ proven.delete(oldest);
55
+ provenChars -= lengthOf(kept);
56
+ }
57
+ };
58
+ return {
59
+ async sign(parts) {
60
+ const mac = await hashing.sign(parts);
61
+ remember(mac, parts);
62
+ return mac;
63
+ },
64
+ async verify(parts, mac) {
65
+ if (typeof mac !== "string" || !MAC_HEX.test(mac))
66
+ return false;
67
+ const known = proven.get(mac);
68
+ if (known !== undefined && sameParts(known, parts))
69
+ return true;
70
+ if (!(await hashing.matches(parts, mac)))
71
+ return false;
72
+ remember(mac, parts);
73
+ return true;
74
+ },
75
+ };
76
+ }
77
+ function hasher(secret) {
78
+ const createHmac = nodeCreateHmac();
79
+ if (createHmac !== undefined) {
80
+ const hex = (parts) => {
81
+ const hmac = createHmac("sha256", secret);
82
+ for (const part of parts)
83
+ hmac.update(`${part.length}:`).update(part);
84
+ return hmac.digest("hex");
85
+ };
86
+ return {
87
+ sign: async (parts) => hex(parts),
88
+ matches: async (parts, mac) => timingSafeEqual(hex(parts), mac),
89
+ };
90
+ }
91
+ let signingKey;
92
+ const key = () => {
93
+ signingKey ??= crypto.subtle.importKey("raw", TEXT.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign", "verify"]);
94
+ return signingKey;
95
+ };
96
+ const bytes = (parts) => TEXT.encode(parts.map((part) => `${part.length}:${part}`).join(""));
97
+ return {
98
+ async sign(parts) {
99
+ const mac = new Uint8Array(await crypto.subtle.sign("HMAC", await key(), bytes(parts)));
100
+ let hex = "";
101
+ for (const byte of mac)
102
+ hex += byte.toString(16).padStart(2, "0");
103
+ return hex;
104
+ },
105
+ async matches(parts, mac) {
106
+ const expected = new Uint8Array(mac.length / 2);
107
+ for (let at = 0; at < expected.length; at++) {
108
+ expected[at] = Number.parseInt(mac.slice(at * 2, at * 2 + 2), 16);
109
+ }
110
+ return crypto.subtle.verify("HMAC", await key(), expected, bytes(parts));
111
+ },
112
+ };
113
+ }
114
+ //# sourceMappingURL=store-signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-signature.js","sourceRoot":"","sources":["../../src/internal/store-signature.ts"],"names":[],"mappings":"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"}
@@ -16,8 +16,8 @@
16
16
  * Only a plugin's `config` hook output is rewritten, never mutated, and only under rolldown-vite.
17
17
  * Non-rolldown Vite is passed through verbatim.
18
18
  *
19
- * FLATTEN FIRST: a Vite plugin factory may return an ARRAY of plugins - `@vitejs/plugin-react`'s `react()`
20
- * returns `[vite:react-babel, vite:react-refresh]`, and it's `react:react-babel`'s `config` hook that emits
19
+ * FLATTEN FIRST: a plugin factory may return an ARRAY of plugins - `@vitejs/plugin-react@4.x`'s `react()`
20
+ * returns `[vite:react-babel, vite:react-refresh]`, and it's `vite:react-babel`'s `config` hook that emits
21
21
  * the offending `optimizeDeps.rollupOptions.jsx`. `nifra.config.ts` writes `vitePlugins = [react()]`, so the
22
22
  * plugin list arrives NESTED (`[[babel, refresh]]`). Without flattening, `.map` sees the inner array (which
23
23
  * has no `config`), leaves it untouched, and Vite - which flattens plugin arrays itself before running them
@@ -17,8 +17,8 @@ const isRecord = (value) => value !== null && typeof value === "object" && !Arra
17
17
  * Only a plugin's `config` hook output is rewritten, never mutated, and only under rolldown-vite.
18
18
  * Non-rolldown Vite is passed through verbatim.
19
19
  *
20
- * FLATTEN FIRST: a Vite plugin factory may return an ARRAY of plugins - `@vitejs/plugin-react`'s `react()`
21
- * returns `[vite:react-babel, vite:react-refresh]`, and it's `react:react-babel`'s `config` hook that emits
20
+ * FLATTEN FIRST: a plugin factory may return an ARRAY of plugins - `@vitejs/plugin-react@4.x`'s `react()`
21
+ * returns `[vite:react-babel, vite:react-refresh]`, and it's `vite:react-babel`'s `config` hook that emits
22
22
  * the offending `optimizeDeps.rollupOptions.jsx`. `nifra.config.ts` writes `vitePlugins = [react()]`, so the
23
23
  * plugin list arrives NESTED (`[[babel, refresh]]`). Without flattening, `.map` sees the inner array (which
24
24
  * has no `config`), leaves it untouched, and Vite - which flattens plugin arrays itself before running them
@@ -5,7 +5,10 @@ import type { CssLoadingMode } from "../css-contract.js";
5
5
  import { type BuildAssetSet, type HostPolicy } from "../host-policy.js";
6
6
  import type { Manifest } from "../manifest.js";
7
7
  import type { RenderAdapter } from "../render-seam.js";
8
+ import { type KeepAliveServerOptions } from "./identity-epoch.js";
9
+ import { type LiveRuntimeHandle } from "./live-contract.js";
8
10
  import { type NonceResolver } from "./page-execution.js";
11
+ import { type PprSetup } from "./ppr/contract.js";
9
12
  import { type PrerenderedPages } from "./prerendered-pages.js";
10
13
  export type { NonceResolver } from "./page-execution.js";
11
14
  /** An app's locale routing as `createWebApp` reads it: what `defineI18nRouting()` from
@@ -53,6 +56,15 @@ export interface CreateWebAppOptions<Env = unknown> {
53
56
  * and stays cacheable by `withISR` or a CDN. `meta` still receives a nonce to name.
54
57
  */
55
58
  readonly csp?: CspPolicy;
59
+ /** Experimental and unstable: features whose API may change in any release. */
60
+ readonly experimental?: {
61
+ /**
62
+ * Partial prerendering, from `partialPrerendering()` in `@nifrajs/web/ppr`. A route whose backend
63
+ * half exports `shellLoader` streams a shell shared by every visitor, then each `dynamic` boundary
64
+ * as it settles. Needs `csp` (hashes), not `nonce`.
65
+ */
66
+ readonly ppr?: PprSetup;
67
+ };
56
68
  /**
57
69
  * Options for the underlying `server()` - `requestTimeoutMs`, `admission`, `gracefulSignals`, and
58
70
  * the rest of {@link ServerOptions}.
@@ -173,6 +185,11 @@ export interface CreateWebAppOptions<Env = unknown> {
173
185
  * signed `__nifra_draft` cookie gets `ctx.draft === true` in loaders/actions (else always `false`).
174
186
  * Pair with `withISR({ draftSecret })` so editors bypass the cache. Omit to disable draft mode. */
175
187
  readonly draftSecret?: string;
188
+ /**
189
+ * Live data refresh, from `live()` in `@nifrajs/web/live`. Loaders declare keys with `ctx.live()`;
190
+ * the app answers live loads at the runtime's load endpoint. Omit and nothing live is loaded.
191
+ */
192
+ readonly live?: LiveRuntimeHandle;
176
193
  /** Per-route chunk URLs (`buildClient`'s `BuildManifest.routes`) - `routeId → [layout chunks…, own
177
194
  * chunk]`. When present, each page `modulepreload`s its matched route's chunks alongside the entry,
178
195
  * so the route code downloads in parallel (no entry→route-chunk waterfall). Omit ⇒ entry-only. */
@@ -228,6 +245,15 @@ export interface CreateWebAppOptions<Env = unknown> {
228
245
  * server entry, before its static files too. A refused path answers the policy's refusal.
229
246
  */
230
247
  readonly hostPolicy?: HostPolicy;
248
+ /**
249
+ * Which cookies say who is signed in, for an app with a `keepAlive` route. A response that changes
250
+ * or deletes one rotates the readable identity epoch cookie, and every tab drops the pages it kept
251
+ * for the previous visitor. The session cookies of `@nifrajs/auth` and Auth.js count under their
252
+ * default names, Better Auth's under any `cookiePrefix`; name any other in `identityCookies`. An app
253
+ * run by `nifra dev` and `nifra build` exports this from `backend/framework.ts`. Development reports, once per
254
+ * name, an `HttpOnly` cookie that changes and is in neither list (`NIFRA_KEEPALIVE_IDENTITY_COOKIE`).
255
+ */
256
+ readonly keepAlive?: KeepAliveServerOptions;
231
257
  /**
232
258
  * The files the build emitted, by request path: `buildAssets` from the generated server manifest.
233
259
  * A {@link hostPolicy} rule's `buildAssets` token matches exactly these. `nifra dev` serves the
@@ -1 +1 @@
1
- {"version":3,"file":"web-app.d.ts","sourceRoot":"","sources":["../../src/internal/web-app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-app.d.ts","sourceRoot":"","sources":["../../src/internal/web-app.ts"],"names":[],"mappings":"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"}