@nifrajs/web 5.5.1 → 5.6.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 (457) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/dist/boundary.d.ts +67 -7
  3. package/dist/boundary.d.ts.map +1 -1
  4. package/dist/boundary.js +6 -4
  5. package/dist/boundary.js.map +1 -1
  6. package/dist/build-plan.d.ts +3 -0
  7. package/dist/build-plan.d.ts.map +1 -1
  8. package/dist/build-plan.js.map +1 -1
  9. package/dist/build-vite.d.ts.map +1 -1
  10. package/dist/build-vite.js +2 -0
  11. package/dist/build-vite.js.map +1 -1
  12. package/dist/build.d.ts +9 -2
  13. package/dist/build.d.ts.map +1 -1
  14. package/dist/build.js +9 -0
  15. package/dist/build.js.map +1 -1
  16. package/dist/client.d.ts +2 -1
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +140 -12
  19. package/dist/client.js.map +1 -1
  20. package/dist/csp.d.ts +8 -0
  21. package/dist/csp.d.ts.map +1 -1
  22. package/dist/csp.js +11 -2
  23. package/dist/csp.js.map +1 -1
  24. package/dist/deferred.d.ts +6 -4
  25. package/dist/deferred.d.ts.map +1 -1
  26. package/dist/deferred.js +10 -6
  27. package/dist/deferred.js.map +1 -1
  28. package/dist/dev-feed.d.ts.map +1 -1
  29. package/dist/dev-feed.js +11 -2
  30. package/dist/dev-feed.js.map +1 -1
  31. package/dist/dev-session.d.ts.map +1 -1
  32. package/dist/dev-session.js +13 -6
  33. package/dist/dev-session.js.map +1 -1
  34. package/dist/dev.d.ts +4 -1
  35. package/dist/dev.d.ts.map +1 -1
  36. package/dist/dev.js +12 -5
  37. package/dist/dev.js.map +1 -1
  38. package/dist/diagnostic-catalog.d.ts +4 -0
  39. package/dist/diagnostic-catalog.d.ts.map +1 -1
  40. package/dist/diagnostic-catalog.js +48 -0
  41. package/dist/diagnostic-catalog.js.map +1 -1
  42. package/dist/diagnostic.d.ts +1 -1
  43. package/dist/diagnostic.d.ts.map +1 -1
  44. package/dist/diagnostic.js +1 -1
  45. package/dist/diagnostic.js.map +1 -1
  46. package/dist/fn.d.ts +5 -3
  47. package/dist/fn.d.ts.map +1 -1
  48. package/dist/fn.js +20 -5
  49. package/dist/fn.js.map +1 -1
  50. package/dist/fs.d.ts.map +1 -1
  51. package/dist/fs.js +13 -3
  52. package/dist/fs.js.map +1 -1
  53. package/dist/identity.d.ts +22 -0
  54. package/dist/identity.d.ts.map +1 -0
  55. package/dist/identity.js +60 -0
  56. package/dist/identity.js.map +1 -0
  57. package/dist/index.d.ts +7 -6
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +4 -2
  60. package/dist/index.js.map +1 -1
  61. package/dist/internal/cdn/cloudflare.d.ts +2 -1
  62. package/dist/internal/cdn/cloudflare.d.ts.map +1 -1
  63. package/dist/internal/cdn/cloudflare.js +2 -1
  64. package/dist/internal/cdn/cloudflare.js.map +1 -1
  65. package/dist/internal/certified-components.d.ts +1 -1
  66. package/dist/internal/certified-components.js +1 -1
  67. package/dist/internal/codegen.d.ts +11 -10
  68. package/dist/internal/codegen.d.ts.map +1 -1
  69. package/dist/internal/codegen.js +65 -8
  70. package/dist/internal/codegen.js.map +1 -1
  71. package/dist/internal/dev-websocket.d.ts +73 -0
  72. package/dist/internal/dev-websocket.d.ts.map +1 -0
  73. package/dist/internal/dev-websocket.js +145 -0
  74. package/dist/internal/dev-websocket.js.map +1 -0
  75. package/dist/internal/hole-runtime.d.ts +66 -0
  76. package/dist/internal/hole-runtime.d.ts.map +1 -0
  77. package/dist/internal/hole-runtime.js +211 -0
  78. package/dist/internal/hole-runtime.js.map +1 -0
  79. package/dist/internal/identity-epoch.d.ts +50 -0
  80. package/dist/internal/identity-epoch.d.ts.map +1 -0
  81. package/dist/internal/identity-epoch.js +179 -0
  82. package/dist/internal/identity-epoch.js.map +1 -0
  83. package/dist/internal/invalidation-contract.d.ts +23 -0
  84. package/dist/internal/invalidation-contract.d.ts.map +1 -0
  85. package/dist/internal/invalidation-contract.js +11 -0
  86. package/dist/internal/invalidation-contract.js.map +1 -0
  87. package/dist/internal/invalidation.d.ts +62 -0
  88. package/dist/internal/invalidation.d.ts.map +1 -0
  89. package/dist/internal/invalidation.js +149 -0
  90. package/dist/internal/invalidation.js.map +1 -0
  91. package/dist/internal/island-bindings.d.ts +51 -0
  92. package/dist/internal/island-bindings.d.ts.map +1 -0
  93. package/dist/internal/island-bindings.js +147 -0
  94. package/dist/internal/island-bindings.js.map +1 -0
  95. package/dist/internal/island-list.d.ts +26 -0
  96. package/dist/internal/island-list.d.ts.map +1 -0
  97. package/dist/internal/island-list.js +78 -0
  98. package/dist/internal/island-list.js.map +1 -0
  99. package/dist/internal/island-mount.d.ts +4 -0
  100. package/dist/internal/island-mount.d.ts.map +1 -0
  101. package/dist/internal/island-mount.js +66 -0
  102. package/dist/internal/island-mount.js.map +1 -0
  103. package/dist/internal/island-owner.d.ts +5 -0
  104. package/dist/internal/island-owner.d.ts.map +1 -0
  105. package/dist/internal/island-owner.js +20 -0
  106. package/dist/internal/island-owner.js.map +1 -0
  107. package/dist/internal/island-resource.d.ts +30 -0
  108. package/dist/internal/island-resource.d.ts.map +1 -0
  109. package/dist/internal/island-resource.js +57 -0
  110. package/dist/internal/island-resource.js.map +1 -0
  111. package/dist/internal/island-signals.d.ts +51 -0
  112. package/dist/internal/island-signals.d.ts.map +1 -0
  113. package/dist/internal/island-signals.js +220 -0
  114. package/dist/internal/island-signals.js.map +1 -0
  115. package/dist/internal/keep-alive-table.d.ts +23 -0
  116. package/dist/internal/keep-alive-table.d.ts.map +1 -0
  117. package/dist/internal/keep-alive-table.js +53 -0
  118. package/dist/internal/keep-alive-table.js.map +1 -0
  119. package/dist/internal/live-contract.d.ts +96 -0
  120. package/dist/internal/live-contract.d.ts.map +1 -0
  121. package/dist/internal/live-contract.js +5 -0
  122. package/dist/internal/live-contract.js.map +1 -0
  123. package/dist/internal/live-queries.d.ts +22 -0
  124. package/dist/internal/live-queries.d.ts.map +1 -0
  125. package/dist/internal/live-queries.js +54 -0
  126. package/dist/internal/live-queries.js.map +1 -0
  127. package/dist/internal/page-events.d.ts +10 -0
  128. package/dist/internal/page-events.d.ts.map +1 -0
  129. package/dist/internal/page-events.js +26 -0
  130. package/dist/internal/page-events.js.map +1 -0
  131. package/dist/internal/page-execution.d.ts +14 -1
  132. package/dist/internal/page-execution.d.ts.map +1 -1
  133. package/dist/internal/page-execution.js +415 -31
  134. package/dist/internal/page-execution.js.map +1 -1
  135. package/dist/internal/ppr/admission.d.ts +83 -0
  136. package/dist/internal/ppr/admission.d.ts.map +1 -0
  137. package/dist/internal/ppr/admission.js +221 -0
  138. package/dist/internal/ppr/admission.js.map +1 -0
  139. package/dist/internal/ppr/canary.d.ts +24 -0
  140. package/dist/internal/ppr/canary.d.ts.map +1 -0
  141. package/dist/internal/ppr/canary.js +102 -0
  142. package/dist/internal/ppr/canary.js.map +1 -0
  143. package/dist/internal/ppr/compile-shell.d.ts +39 -0
  144. package/dist/internal/ppr/compile-shell.d.ts.map +1 -0
  145. package/dist/internal/ppr/compile-shell.js +298 -0
  146. package/dist/internal/ppr/compile-shell.js.map +1 -0
  147. package/dist/internal/ppr/contract.d.ts +177 -0
  148. package/dist/internal/ppr/contract.d.ts.map +1 -0
  149. package/dist/internal/ppr/contract.js +80 -0
  150. package/dist/internal/ppr/contract.js.map +1 -0
  151. package/dist/internal/ppr/frames.d.ts +71 -0
  152. package/dist/internal/ppr/frames.d.ts.map +1 -0
  153. package/dist/internal/ppr/frames.js +119 -0
  154. package/dist/internal/ppr/frames.js.map +1 -0
  155. package/dist/internal/ppr/integration.d.ts +19 -0
  156. package/dist/internal/ppr/integration.d.ts.map +1 -0
  157. package/dist/internal/ppr/integration.js +106 -0
  158. package/dist/internal/ppr/integration.js.map +1 -0
  159. package/dist/internal/ppr/options.d.ts +96 -0
  160. package/dist/internal/ppr/options.d.ts.map +1 -0
  161. package/dist/internal/ppr/options.js +125 -0
  162. package/dist/internal/ppr/options.js.map +1 -0
  163. package/dist/internal/ppr/route-rules.d.ts +12 -0
  164. package/dist/internal/ppr/route-rules.d.ts.map +1 -0
  165. package/dist/internal/ppr/route-rules.js +53 -0
  166. package/dist/internal/ppr/route-rules.js.map +1 -0
  167. package/dist/internal/ppr/runtime.d.ts +29 -0
  168. package/dist/internal/ppr/runtime.d.ts.map +1 -0
  169. package/dist/internal/ppr/runtime.js +32 -0
  170. package/dist/internal/ppr/runtime.js.map +1 -0
  171. package/dist/internal/ppr/server.d.ts +29 -0
  172. package/dist/internal/ppr/server.d.ts.map +1 -0
  173. package/dist/internal/ppr/server.js +1407 -0
  174. package/dist/internal/ppr/server.js.map +1 -0
  175. package/dist/internal/ppr/shell-store.d.ts +38 -0
  176. package/dist/internal/ppr/shell-store.d.ts.map +1 -0
  177. package/dist/internal/ppr/shell-store.js +90 -0
  178. package/dist/internal/ppr/shell-store.js.map +1 -0
  179. package/dist/internal/prerendered-pages.d.ts +1 -1
  180. package/dist/internal/prerendered-pages.d.ts.map +1 -1
  181. package/dist/internal/prerendered-pages.js +7 -4
  182. package/dist/internal/prerendered-pages.js.map +1 -1
  183. package/dist/internal/query-digest.d.ts +9 -0
  184. package/dist/internal/query-digest.d.ts.map +1 -0
  185. package/dist/internal/query-digest.js +23 -0
  186. package/dist/internal/query-digest.js.map +1 -0
  187. package/dist/internal/query-runtime.d.ts +6 -1
  188. package/dist/internal/query-runtime.d.ts.map +1 -1
  189. package/dist/internal/query-runtime.js +9 -0
  190. package/dist/internal/query-runtime.js.map +1 -1
  191. package/dist/internal/query-seam.d.ts +29 -0
  192. package/dist/internal/query-seam.d.ts.map +1 -0
  193. package/dist/internal/query-seam.js +23 -0
  194. package/dist/internal/query-seam.js.map +1 -0
  195. package/dist/internal/render-document.d.ts +28 -1
  196. package/dist/internal/render-document.d.ts.map +1 -1
  197. package/dist/internal/render-document.js +83 -18
  198. package/dist/internal/render-document.js.map +1 -1
  199. package/dist/internal/request-abort.d.ts +8 -0
  200. package/dist/internal/request-abort.d.ts.map +1 -0
  201. package/dist/internal/request-abort.js +22 -0
  202. package/dist/internal/request-abort.js.map +1 -0
  203. package/dist/internal/server-boundary.d.ts +2 -0
  204. package/dist/internal/server-boundary.d.ts.map +1 -1
  205. package/dist/internal/server-boundary.js +8 -1
  206. package/dist/internal/server-boundary.js.map +1 -1
  207. package/dist/internal/share-data.d.ts +10 -0
  208. package/dist/internal/share-data.d.ts.map +1 -0
  209. package/dist/internal/share-data.js +135 -0
  210. package/dist/internal/share-data.js.map +1 -0
  211. package/dist/internal/store-signature.d.ts +15 -0
  212. package/dist/internal/store-signature.d.ts.map +1 -0
  213. package/dist/internal/store-signature.js +114 -0
  214. package/dist/internal/store-signature.js.map +1 -0
  215. package/dist/internal/vite-plugin-compat.d.ts +2 -2
  216. package/dist/internal/vite-plugin-compat.js +2 -2
  217. package/dist/internal/web-app.d.ts +25 -0
  218. package/dist/internal/web-app.d.ts.map +1 -1
  219. package/dist/internal/web-app.js +78 -3
  220. package/dist/internal/web-app.js.map +1 -1
  221. package/dist/islands-swap.d.ts +41 -0
  222. package/dist/islands-swap.d.ts.map +1 -0
  223. package/dist/islands-swap.js +270 -0
  224. package/dist/islands-swap.js.map +1 -0
  225. package/dist/islands.d.ts +86 -24
  226. package/dist/islands.d.ts.map +1 -1
  227. package/dist/islands.js +138 -78
  228. package/dist/islands.js.map +1 -1
  229. package/dist/isr.d.ts +67 -13
  230. package/dist/isr.d.ts.map +1 -1
  231. package/dist/isr.js +247 -99
  232. package/dist/isr.js.map +1 -1
  233. package/dist/keep-alive.d.ts +147 -0
  234. package/dist/keep-alive.d.ts.map +1 -0
  235. package/dist/keep-alive.js +1069 -0
  236. package/dist/keep-alive.js.map +1 -0
  237. package/dist/live/bus.d.ts +56 -0
  238. package/dist/live/bus.d.ts.map +1 -0
  239. package/dist/live/bus.js +32 -0
  240. package/dist/live/bus.js.map +1 -0
  241. package/dist/live/core.d.ts +25 -0
  242. package/dist/live/core.d.ts.map +1 -0
  243. package/dist/live/core.js +29 -0
  244. package/dist/live/core.js.map +1 -0
  245. package/dist/live/history.d.ts +38 -0
  246. package/dist/live/history.d.ts.map +1 -0
  247. package/dist/live/history.js +104 -0
  248. package/dist/live/history.js.map +1 -0
  249. package/dist/live/hub-protocol.d.ts +46 -0
  250. package/dist/live/hub-protocol.d.ts.map +1 -0
  251. package/dist/live/hub-protocol.js +108 -0
  252. package/dist/live/hub-protocol.js.map +1 -0
  253. package/dist/live/hub.d.ts +181 -0
  254. package/dist/live/hub.d.ts.map +1 -0
  255. package/dist/live/hub.js +539 -0
  256. package/dist/live/hub.js.map +1 -0
  257. package/dist/live/keyring.d.ts +87 -0
  258. package/dist/live/keyring.d.ts.map +1 -0
  259. package/dist/live/keyring.js +260 -0
  260. package/dist/live/keyring.js.map +1 -0
  261. package/dist/live/read-capped.d.ts +6 -0
  262. package/dist/live/read-capped.d.ts.map +1 -0
  263. package/dist/live/read-capped.js +42 -0
  264. package/dist/live/read-capped.js.map +1 -0
  265. package/dist/live/revocations.d.ts +52 -0
  266. package/dist/live/revocations.d.ts.map +1 -0
  267. package/dist/live/revocations.js +116 -0
  268. package/dist/live/revocations.js.map +1 -0
  269. package/dist/live/settings.d.ts +14 -0
  270. package/dist/live/settings.d.ts.map +1 -0
  271. package/dist/live/settings.js +38 -0
  272. package/dist/live/settings.js.map +1 -0
  273. package/dist/live-client.d.ts +34 -0
  274. package/dist/live-client.d.ts.map +1 -0
  275. package/dist/live-client.js +840 -0
  276. package/dist/live-client.js.map +1 -0
  277. package/dist/live-hub.d.ts +130 -0
  278. package/dist/live-hub.d.ts.map +1 -0
  279. package/dist/live-hub.js +507 -0
  280. package/dist/live-hub.js.map +1 -0
  281. package/dist/live-redis.d.ts +48 -0
  282. package/dist/live-redis.d.ts.map +1 -0
  283. package/dist/live-redis.js +201 -0
  284. package/dist/live-redis.js.map +1 -0
  285. package/dist/live.d.ts +94 -0
  286. package/dist/live.d.ts.map +1 -0
  287. package/dist/live.js +869 -0
  288. package/dist/live.js.map +1 -0
  289. package/dist/manifest.d.ts +113 -2
  290. package/dist/manifest.d.ts.map +1 -1
  291. package/dist/manifest.js +109 -5
  292. package/dist/manifest.js.map +1 -1
  293. package/dist/navigation.d.ts +9 -3
  294. package/dist/navigation.d.ts.map +1 -1
  295. package/dist/navigation.js +13 -3
  296. package/dist/navigation.js.map +1 -1
  297. package/dist/plugins/vite-zone-guard.d.ts +6 -0
  298. package/dist/plugins/vite-zone-guard.d.ts.map +1 -1
  299. package/dist/plugins/vite-zone-guard.js +8 -2
  300. package/dist/plugins/vite-zone-guard.js.map +1 -1
  301. package/dist/ppr.d.ts +73 -0
  302. package/dist/ppr.d.ts.map +1 -0
  303. package/dist/ppr.js +76 -0
  304. package/dist/ppr.js.map +1 -0
  305. package/dist/query.d.ts +8 -13
  306. package/dist/query.d.ts.map +1 -1
  307. package/dist/query.js +112 -18
  308. package/dist/query.js.map +1 -1
  309. package/dist/render-seam.d.ts +30 -0
  310. package/dist/render-seam.d.ts.map +1 -1
  311. package/dist/render-seam.js +5 -0
  312. package/dist/render-seam.js.map +1 -1
  313. package/dist/route-types.d.ts.map +1 -1
  314. package/dist/route-types.js +2 -2
  315. package/dist/route-types.js.map +1 -1
  316. package/dist/router.d.ts +72 -4
  317. package/dist/router.d.ts.map +1 -1
  318. package/dist/router.js +374 -99
  319. package/dist/router.js.map +1 -1
  320. package/dist/server-components/build.d.ts.map +1 -1
  321. package/dist/server-components/build.js +3 -3
  322. package/dist/server-components/build.js.map +1 -1
  323. package/dist/server-components/client.d.ts +23 -1
  324. package/dist/server-components/client.d.ts.map +1 -1
  325. package/dist/server-components/client.js +92 -5
  326. package/dist/server-components/client.js.map +1 -1
  327. package/dist/server-components/hole.d.ts +8 -0
  328. package/dist/server-components/hole.d.ts.map +1 -0
  329. package/dist/server-components/hole.js +20 -0
  330. package/dist/server-components/hole.js.map +1 -0
  331. package/dist/server-components/html-policy.d.ts.map +1 -1
  332. package/dist/server-components/html-policy.js +62 -4
  333. package/dist/server-components/html-policy.js.map +1 -1
  334. package/dist/server-components/html-scan.d.ts +17 -0
  335. package/dist/server-components/html-scan.d.ts.map +1 -0
  336. package/dist/server-components/html-scan.js +180 -0
  337. package/dist/server-components/html-scan.js.map +1 -0
  338. package/dist/server-components/html.d.ts.map +1 -1
  339. package/dist/server-components/html.js +19 -4
  340. package/dist/server-components/html.js.map +1 -1
  341. package/dist/server-components/router-integration.d.ts +4 -1
  342. package/dist/server-components/router-integration.d.ts.map +1 -1
  343. package/dist/server-components/router-integration.js +23 -2
  344. package/dist/server-components/router-integration.js.map +1 -1
  345. package/dist/server-components/runtime.d.ts +6 -1
  346. package/dist/server-components/runtime.d.ts.map +1 -1
  347. package/dist/server-components/runtime.js +86 -28
  348. package/dist/server-components/runtime.js.map +1 -1
  349. package/dist/server-components/state.d.ts +3 -1
  350. package/dist/server-components/state.d.ts.map +1 -1
  351. package/dist/server-components/state.js +50 -38
  352. package/dist/server-components/state.js.map +1 -1
  353. package/dist/server-components/types.d.ts +9 -0
  354. package/dist/server-components/types.d.ts.map +1 -1
  355. package/dist/vite.d.ts +5 -1
  356. package/dist/vite.d.ts.map +1 -1
  357. package/dist/vite.js +58 -4
  358. package/dist/vite.js.map +1 -1
  359. package/package.json +48 -8
  360. package/src/boundary.ts +77 -5
  361. package/src/build-plan.ts +3 -0
  362. package/src/build-vite.ts +2 -0
  363. package/src/build.ts +19 -1
  364. package/src/client.ts +147 -10
  365. package/src/csp.ts +16 -2
  366. package/src/deferred.ts +11 -5
  367. package/src/dev-feed.ts +11 -2
  368. package/src/dev-session.ts +22 -11
  369. package/src/dev.ts +29 -8
  370. package/src/diagnostic-catalog.ts +53 -0
  371. package/src/diagnostic.ts +1 -0
  372. package/src/fn.ts +24 -7
  373. package/src/fs.ts +22 -8
  374. package/src/identity.ts +61 -0
  375. package/src/index.ts +19 -0
  376. package/src/internal/cdn/cloudflare.ts +2 -1
  377. package/src/internal/certified-components.ts +1 -1
  378. package/src/internal/codegen.ts +87 -8
  379. package/src/internal/dev-websocket.ts +230 -0
  380. package/src/internal/hole-runtime.ts +286 -0
  381. package/src/internal/identity-epoch.ts +235 -0
  382. package/src/internal/invalidation-contract.ts +35 -0
  383. package/src/internal/invalidation.ts +213 -0
  384. package/src/internal/island-bindings.ts +191 -0
  385. package/src/internal/island-list.ts +92 -0
  386. package/src/internal/island-mount.ts +68 -0
  387. package/src/internal/island-owner.ts +20 -0
  388. package/src/internal/island-resource.ts +76 -0
  389. package/src/internal/island-signals.ts +249 -0
  390. package/src/internal/keep-alive-table.ts +72 -0
  391. package/src/internal/live-contract.ts +106 -0
  392. package/src/internal/live-queries.ts +60 -0
  393. package/src/internal/page-events.ts +27 -0
  394. package/src/internal/page-execution.ts +579 -40
  395. package/src/internal/ppr/admission.ts +300 -0
  396. package/src/internal/ppr/canary.ts +122 -0
  397. package/src/internal/ppr/compile-shell.ts +379 -0
  398. package/src/internal/ppr/contract.ts +265 -0
  399. package/src/internal/ppr/frames.ts +170 -0
  400. package/src/internal/ppr/integration.ts +137 -0
  401. package/src/internal/ppr/options.ts +221 -0
  402. package/src/internal/ppr/route-rules.ts +77 -0
  403. package/src/internal/ppr/runtime.ts +36 -0
  404. package/src/internal/ppr/server.ts +1764 -0
  405. package/src/internal/ppr/shell-store.ts +139 -0
  406. package/src/internal/prerendered-pages.ts +7 -4
  407. package/src/internal/query-digest.ts +34 -0
  408. package/src/internal/query-runtime.ts +14 -1
  409. package/src/internal/query-seam.ts +48 -0
  410. package/src/internal/render-document.ts +149 -22
  411. package/src/internal/request-abort.ts +26 -0
  412. package/src/internal/server-boundary.ts +10 -1
  413. package/src/internal/share-data.ts +136 -0
  414. package/src/internal/store-signature.ts +149 -0
  415. package/src/internal/vite-plugin-compat.ts +2 -2
  416. package/src/internal/web-app.ts +121 -3
  417. package/src/islands-swap.ts +283 -0
  418. package/src/islands.ts +169 -72
  419. package/src/isr.ts +348 -106
  420. package/src/keep-alive.ts +1315 -0
  421. package/src/live/bus.ts +77 -0
  422. package/src/live/core.ts +52 -0
  423. package/src/live/history.ts +109 -0
  424. package/src/live/hub-protocol.ts +133 -0
  425. package/src/live/hub.ts +615 -0
  426. package/src/live/keyring.ts +379 -0
  427. package/src/live/read-capped.ts +36 -0
  428. package/src/live/revocations.ts +155 -0
  429. package/src/live/settings.ts +46 -0
  430. package/src/live-client.ts +973 -0
  431. package/src/live-hub.ts +658 -0
  432. package/src/live-redis.ts +259 -0
  433. package/src/live.ts +1096 -0
  434. package/src/manifest.ts +274 -6
  435. package/src/navigation.ts +14 -2
  436. package/src/plugins/vite-zone-guard.ts +15 -2
  437. package/src/ppr.ts +153 -0
  438. package/src/query.ts +147 -20
  439. package/src/render-seam.ts +35 -0
  440. package/src/route-types.ts +3 -1
  441. package/src/router.ts +494 -101
  442. package/src/server-components/build.ts +9 -3
  443. package/src/server-components/client.ts +89 -5
  444. package/src/server-components/hole.ts +23 -0
  445. package/src/server-components/html-policy.ts +63 -4
  446. package/src/server-components/html-scan.ts +159 -0
  447. package/src/server-components/html.ts +18 -4
  448. package/src/server-components/router-integration.ts +21 -2
  449. package/src/server-components/runtime.ts +112 -30
  450. package/src/server-components/state.ts +66 -44
  451. package/src/server-components/types.ts +16 -0
  452. package/src/vite.ts +75 -6
  453. package/dist/nano.d.ts +0 -125
  454. package/dist/nano.d.ts.map +0 -1
  455. package/dist/nano.js +0 -190
  456. package/dist/nano.js.map +0 -1
  457. package/src/nano.ts +0 -246
@@ -0,0 +1 @@
1
+ {"version":3,"file":"island-resource.d.ts","sourceRoot":"","sources":["../../src/internal/island-resource.ts"],"names":[],"mappings":"AAGA,iGAAiG;AACjG,MAAM,MAAM,aAAa,CAAC,CAAC,IACvB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GACpF;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAC1E;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAA;AAEpF,mEAAmE;AACnE,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,IAAI,aAAa,CAAC,CAAC,CAAC,CAAA;IACpB,2DAA2D;IAC3D,OAAO,IAAI,IAAI,CAAA;IACf,8EAA8E;IAC9E,OAAO,IAAI,IAAI,CAAA;CAChB,CAAA;AAID;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,MAAM,EAAE,MAAM,CAAC,EACf,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAClD,QAAQ,CAAC,CAAC,CAAC,CA8Cb"}
@@ -0,0 +1,57 @@
1
+ import { adopt } from "./island-owner.js";
2
+ import { effect, signal, untrack } from "./island-signals.js";
3
+ const PENDING = { status: "pending", value: undefined, error: undefined };
4
+ /**
5
+ * An async value keyed by `source`. `source` runs tracked, so a write to any signal it reads starts a
6
+ * new fetch; `fetcher` runs untracked with that key, so nothing it reads (before or after an `await`)
7
+ * is a dependency. A newer fetch aborts the older one and only the newest result lands. Inside an
8
+ * island, unmounting disposes it: the request in flight is aborted and its late result dropped.
9
+ */
10
+ export function resource(source, fetcher) {
11
+ const state = signal(PENDING);
12
+ let generation = 0;
13
+ let live = true;
14
+ let controller;
15
+ let key;
16
+ const run = () => {
17
+ const mine = ++generation;
18
+ controller?.abort();
19
+ const active = new AbortController();
20
+ controller = active;
21
+ state.set(PENDING);
22
+ let pending;
23
+ try {
24
+ pending = fetcher(key, active.signal);
25
+ }
26
+ catch (error) {
27
+ pending = Promise.reject(error);
28
+ }
29
+ pending.then((value) => {
30
+ if (mine === generation)
31
+ state.set({ status: "ready", value, error: undefined });
32
+ }, (error) => {
33
+ // A superseded or aborted fetch is not an error the reader should see.
34
+ if (mine === generation && !active.signal.aborted)
35
+ state.set({ status: "error", value: undefined, error });
36
+ });
37
+ };
38
+ const stop = effect(() => {
39
+ key = source();
40
+ untrack(run);
41
+ });
42
+ // biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: `refetch` and `dispose` are assigned below
43
+ const read = (() => state());
44
+ read.refetch = () => {
45
+ if (live)
46
+ untrack(run);
47
+ };
48
+ read.dispose = () => {
49
+ live = false;
50
+ stop();
51
+ generation++;
52
+ controller?.abort();
53
+ };
54
+ adopt(read.dispose);
55
+ return read;
56
+ }
57
+ //# sourceMappingURL=island-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"island-resource.js","sourceRoot":"","sources":["../../src/internal/island-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAiB7D,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAW,CAAA;AAElF;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CACtB,MAAe,EACf,OAAmD;IAEnD,MAAM,KAAK,GAAG,MAAM,CAAmB,OAAO,CAAC,CAAA;IAC/C,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,IAAI,GAAG,IAAI,CAAA;IACf,IAAI,UAAuC,CAAA;IAC3C,IAAI,GAAM,CAAA;IACV,MAAM,GAAG,GAAG,GAAS,EAAE;QACrB,MAAM,IAAI,GAAG,EAAE,UAAU,CAAA;QACzB,UAAU,EAAE,KAAK,EAAE,CAAA;QACnB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;QACpC,UAAU,GAAG,MAAM,CAAA;QACnB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAClB,IAAI,OAAmB,CAAA;QACvB,IAAI,CAAC;YACH,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,IAAI,KAAK,UAAU;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QAClF,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,uEAAuE;YACvE,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;gBAC/C,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3D,CAAC,CACF,CAAA;IACH,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE;QACvB,GAAG,GAAG,MAAM,EAAE,CAAA;QACd,OAAO,CAAC,GAAG,CAAC,CAAA;IACd,CAAC,CAAC,CAAA;IACF,4GAA4G;IAC5G,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAgB,CAAA;IAC3C,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;QAClB,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC,CAAA;IACD,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;QAClB,IAAI,GAAG,KAAK,CAAA;QACZ,IAAI,EAAE,CAAA;QACN,UAAU,EAAE,CAAA;QACZ,UAAU,EAAE,KAAK,EAAE,CAAA;IACrB,CAAC,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnB,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Fine-grained signals - the reactive core of `@nifrajs/web/islands`. Pull-based auto-tracking with
3
+ * per-run re-tracking (a branch switch drops the stale branch's subscriptions), `Object.is`
4
+ * equality skips, and an explicit synchronous {@link batch} that coalesces effect re-runs.
5
+ *
6
+ * Deliberately tiny and synchronous: a write recomputes the computeds it feeds at once and runs its
7
+ * effects before `set` returns, each once, after every computed has settled - predictable for
8
+ * island-scale code (a counter, a filter drawer), and the whole core stays well under a kilobyte.
9
+ * This is NOT a general app framework - just island-scale reactivity.
10
+ */
11
+ /** Run `fn` without subscribing the running effect or computed to the signals it reads. */
12
+ export declare function untrack<T>(fn: () => T): T;
13
+ /** A readable/writable reactive value: call it to read (tracking), `.set` to write. */
14
+ export type Signal<T> = {
15
+ (): T;
16
+ set(next: T | ((prev: T) => T)): void;
17
+ };
18
+ /**
19
+ * Batch writes: effects triggered inside `fn` run ONCE after it returns, deduplicated - so
20
+ * `setA(); setB()` updates the DOM once, not twice. Re-entrant; an effect re-queued during the
21
+ * flush runs in the same flush.
22
+ */
23
+ export declare function batch<T>(fn: () => T): T;
24
+ /** Create a signal. Reads inside an {@link effect} (or {@link computed}) subscribe automatically. */
25
+ export declare function signal<T>(initial: T): Signal<T>;
26
+ /**
27
+ * Call `fn` with `source`'s value now and after each change, queued and batched like an effect but
28
+ * subscribed once instead of tracking reads. Any other getter (a computed, a derived function) is
29
+ * tracked as an effect. Either way `fn` runs untracked. Internal to the binding walker, whose bindings each read one named signal,
30
+ * and to `bindList`; not exported from `@nifrajs/web/islands`.
31
+ */
32
+ export declare function watch<T>(source: () => T, fn: (value: T) => void): () => void;
33
+ /** A derived value: call it to read (tracking), `.dispose()` to stop recomputing it. */
34
+ export type Computed<T> = {
35
+ (): T;
36
+ dispose(): void;
37
+ };
38
+ /**
39
+ * Derived value, cached into a signal and computed on first read. While an effect (or another
40
+ * computed) reads it, it recomputes when its tracked inputs change. Once nothing reads it, the next
41
+ * input change stops it instead of recomputing, so a dropped computed costs nothing; reading it
42
+ * again starts it afresh. `dispose()` stops it at once.
43
+ */
44
+ export declare function computed<T>(fn: () => T): Computed<T>;
45
+ /**
46
+ * Run `fn` now and again whenever any signal it read changes. Returns a disposer. Dependencies
47
+ * re-track on every run, so conditional reads subscribe to exactly the live branch. Every run,
48
+ * the first included, finishes before the effects its writes trigger run, itself among them.
49
+ */
50
+ export declare function effect(fn: () => void): () => void;
51
+ //# sourceMappingURL=island-signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"island-signals.d.ts","sourceRoot":"","sources":["../../src/internal/island-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqBH,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAQzC;AAKD,uFAAuF;AACvF,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IACtB,IAAI,CAAC,CAAA;IACL,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAA;CACtC,CAAA;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAOvC;AAyBD,qGAAqG;AACrG,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAK/C;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CA6B5E;AA0CD,wFAAwF;AACxF,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,IAAI,CAAC,CAAA;IACL,OAAO,IAAI,IAAI,CAAA;CAChB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAmBpD;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Fine-grained signals - the reactive core of `@nifrajs/web/islands`. Pull-based auto-tracking with
3
+ * per-run re-tracking (a branch switch drops the stale branch's subscriptions), `Object.is`
4
+ * equality skips, and an explicit synchronous {@link batch} that coalesces effect re-runs.
5
+ *
6
+ * Deliberately tiny and synchronous: a write recomputes the computeds it feeds at once and runs its
7
+ * effects before `set` returns, each once, after every computed has settled - predictable for
8
+ * island-scale code (a counter, a filter drawer), and the whole core stays well under a kilobyte.
9
+ * This is NOT a general app framework - just island-scale reactivity.
10
+ */
11
+ import { adopt } from "./island-owner.js";
12
+ let currentEffect;
13
+ /** Run `fn` without subscribing the running effect or computed to the signals it reads. */
14
+ export function untrack(fn) {
15
+ const prev = currentEffect;
16
+ currentEffect = undefined;
17
+ try {
18
+ return fn();
19
+ }
20
+ finally {
21
+ currentEffect = prev;
22
+ }
23
+ }
24
+ let batchDepth = 0;
25
+ const queue = [];
26
+ /**
27
+ * Batch writes: effects triggered inside `fn` run ONCE after it returns, deduplicated - so
28
+ * `setA(); setB()` updates the DOM once, not twice. Re-entrant; an effect re-queued during the
29
+ * flush runs in the same flush.
30
+ */
31
+ export function batch(fn) {
32
+ batchDepth++;
33
+ try {
34
+ return fn();
35
+ }
36
+ finally {
37
+ flush();
38
+ }
39
+ }
40
+ // Closes one batch level; the outermost runs the queue.
41
+ function flush() {
42
+ let i = 0;
43
+ try {
44
+ // The flush still counts as a batch: a write an effect makes here queues, so none runs twice.
45
+ while (batchDepth === 1 && i < queue.length) {
46
+ const next = queue[i++];
47
+ if (next?.q) {
48
+ next.q = false;
49
+ next.run();
50
+ }
51
+ }
52
+ }
53
+ finally {
54
+ // A throwing effect leaves the rest queued for the next flush.
55
+ if (i === queue.length)
56
+ queue.length = 0;
57
+ else
58
+ queue.splice(0, i);
59
+ batchDepth--;
60
+ }
61
+ }
62
+ // Each plain signal's reader set, so `watch` can subscribe without tracking.
63
+ const readers = new WeakMap();
64
+ /** Create a signal. Reads inside an {@link effect} (or {@link computed}) subscribe automatically. */
65
+ export function signal(initial) {
66
+ const subs = new Set();
67
+ const s = readable(initial, subs);
68
+ readers.set(s, subs);
69
+ return s;
70
+ }
71
+ /**
72
+ * Call `fn` with `source`'s value now and after each change, queued and batched like an effect but
73
+ * subscribed once instead of tracking reads. Any other getter (a computed, a derived function) is
74
+ * tracked as an effect. Either way `fn` runs untracked. Internal to the binding walker, whose bindings each read one named signal,
75
+ * and to `bindList`; not exported from `@nifrajs/web/islands`.
76
+ */
77
+ export function watch(source, fn) {
78
+ const subs = readers.get(source);
79
+ if (!subs)
80
+ return effect(() => {
81
+ const value = source();
82
+ untrack(() => fn(value));
83
+ });
84
+ const e = {
85
+ deps: new Map([[subs, 0]]),
86
+ v: 0,
87
+ n: 1,
88
+ run: () => {
89
+ const prev = currentEffect;
90
+ currentEffect = undefined;
91
+ try {
92
+ fn(source());
93
+ }
94
+ finally {
95
+ currentEffect = prev;
96
+ }
97
+ },
98
+ };
99
+ const stop = () => {
100
+ subs.delete(e);
101
+ e.q = false;
102
+ };
103
+ subs.add(e);
104
+ adopt(stop);
105
+ batch(e.run);
106
+ return stop;
107
+ }
108
+ // A signal whose readers are `subs`, so a computed can see whether anything still reads it.
109
+ function readable(initial, subs) {
110
+ let value = initial;
111
+ // biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: `set` is assigned below, before the signal is returned
112
+ const read = (() => {
113
+ const e = currentEffect;
114
+ if (e) {
115
+ const seen = e.deps.get(subs);
116
+ if (seen !== e.v) {
117
+ if (seen === undefined)
118
+ subs.add(e);
119
+ e.deps.set(subs, e.v);
120
+ e.n++;
121
+ }
122
+ }
123
+ return value;
124
+ });
125
+ read.set = (next) => {
126
+ // biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: a function passed to `set` is always the updater form
127
+ const resolved = typeof next === "function" ? next(value) : next;
128
+ if (Object.is(resolved, value))
129
+ return;
130
+ value = resolved;
131
+ // Snapshot: an effect created while this write flushes must not run in it.
132
+ batchDepth++;
133
+ try {
134
+ for (const e of [...subs]) {
135
+ // A running effect is requeued only by a source its current run has already read.
136
+ if (e.r && e.deps.get(subs) !== e.v)
137
+ continue;
138
+ if (e.c)
139
+ e.run();
140
+ else if (!e.q) {
141
+ e.q = true;
142
+ queue.push(e);
143
+ }
144
+ }
145
+ }
146
+ finally {
147
+ flush();
148
+ }
149
+ };
150
+ return read;
151
+ }
152
+ /**
153
+ * Derived value, cached into a signal and computed on first read. While an effect (or another
154
+ * computed) reads it, it recomputes when its tracked inputs change. Once nothing reads it, the next
155
+ * input change stops it instead of recomputing, so a dropped computed costs nothing; reading it
156
+ * again starts it afresh. `dispose()` stops it at once.
157
+ */
158
+ export function computed(fn) {
159
+ const subs = new Set();
160
+ // biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: the first read computes it before returning
161
+ const out = readable(undefined, subs);
162
+ let stop;
163
+ // biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: `dispose` is assigned below
164
+ const read = (() => {
165
+ // biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: the implementation takes the computed flag its public overload hides
166
+ stop ??= effect(() => {
167
+ if (!stop || subs.size)
168
+ out.set(fn());
169
+ else
170
+ read.dispose();
171
+ }, true);
172
+ return out();
173
+ });
174
+ read.dispose = () => {
175
+ stop?.();
176
+ stop = undefined;
177
+ };
178
+ return read;
179
+ }
180
+ export function effect(fn, c) {
181
+ const stop = () => {
182
+ for (const subs of e.deps.keys())
183
+ subs.delete(e);
184
+ e.deps.clear();
185
+ e.q = false;
186
+ };
187
+ const e = {
188
+ c,
189
+ deps: new Map(),
190
+ v: 0,
191
+ n: 0,
192
+ // Subscriptions persist across runs; a source this run did not read is dropped afterwards.
193
+ run: () => {
194
+ ++e.v;
195
+ e.n = 0;
196
+ e.q = false;
197
+ e.r = true;
198
+ const prev = currentEffect;
199
+ currentEffect = e;
200
+ try {
201
+ fn();
202
+ }
203
+ finally {
204
+ currentEffect = prev;
205
+ e.r = false;
206
+ if (e.n < e.deps.size)
207
+ for (const [subs, seen] of e.deps)
208
+ if (seen !== e.v) {
209
+ subs.delete(e);
210
+ e.deps.delete(subs);
211
+ }
212
+ }
213
+ },
214
+ };
215
+ adopt(stop);
216
+ // Batched, so a write in the first run cannot re-enter it before it finishes.
217
+ batch(e.run);
218
+ return stop;
219
+ }
220
+ //# sourceMappingURL=island-signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"island-signals.js","sourceRoot":"","sources":["../../src/internal/island-signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Where the slot wrappers of kept pages go, decided once from the route table so that the server's
3
+ * markup and every client render agree: a wrapper that appeared or vanished with what is kept would
4
+ * remount the page inside it, and one the server did not render fails hydration.
5
+ */
6
+ import type { Manifest } from "../manifest.js";
7
+ /** What the server and the browser both read to place the slot wrappers. */
8
+ export interface KeepAliveTable {
9
+ /** Routes whose page renders inside the slot wrappers: the build found a `keepAlive` export. */
10
+ readonly routes: readonly string[];
11
+ /** Layouts rendered inside the slot wrappers, because another chain the browser can render shares
12
+ * the layouts above one of them and not that one: a kept page then sits there beside the page on
13
+ * screen. A layout every chain shares is never wrapped. */
14
+ readonly layouts: readonly string[];
15
+ }
16
+ /** The table for `manifest`, or `undefined` when no route keeps its page alive. */
17
+ export declare function keepAliveTable(manifest: Manifest): KeepAliveTable | undefined;
18
+ /**
19
+ * The chain indices to render inside slot wrappers for a chain of `layoutIds` and then the page of
20
+ * `routeId`: each wrapped layout, and the page when its route keeps alive.
21
+ */
22
+ export declare function slotDepths(table: KeepAliveTable, layoutIds: readonly string[], routeId: string | undefined): readonly number[];
23
+ //# sourceMappingURL=keep-alive-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keep-alive-table.d.ts","sourceRoot":"","sources":["../../src/internal/keep-alive-table.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,gGAAgG;IAChG,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC;;+DAE2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAOD,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,GAAG,SAAS,CA+B7E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,SAAS,MAAM,EAAE,CAOnB"}
@@ -0,0 +1,53 @@
1
+ const sharesAbove = (a, b, depth) => {
2
+ for (let i = 0; i < depth; i++)
3
+ if (a[i] !== b[i])
4
+ return false;
5
+ return true;
6
+ };
7
+ /** The table for `manifest`, or `undefined` when no route keeps its page alive. */
8
+ export function keepAliveTable(manifest) {
9
+ const kept = manifest.routes.filter((route) => route.keepAlive === true);
10
+ if (kept.length === 0)
11
+ return undefined;
12
+ // Every layout chain the browser renders: each route's, a root status page's (inside the root
13
+ // layout unless the page opts out, which only its module says), and a `_loading` page's, which takes
14
+ // the layouts the two pages of a navigation share, so any prefix of a route under it.
15
+ const chains = manifest.routes.map((route) => route.layoutIds);
16
+ if (manifest.notFound !== undefined || Object.keys(manifest.statusPages ?? {}).length > 0) {
17
+ chains.push(manifest.layouts._layout === undefined ? [] : ["_layout"]);
18
+ }
19
+ for (const [id, loading] of Object.entries(manifest.loadings ?? {})) {
20
+ for (const route of manifest.routes) {
21
+ if (!route.loadingIds?.includes(id))
22
+ continue;
23
+ for (let n = loading.layoutIds.length; n <= route.layoutIds.length; n++) {
24
+ chains.push(route.layoutIds.slice(0, n));
25
+ }
26
+ }
27
+ }
28
+ const layouts = new Set();
29
+ for (const route of kept) {
30
+ route.layoutIds.forEach((layout, depth) => {
31
+ if (layouts.has(layout))
32
+ return;
33
+ if (chains.some((chain) => chain[depth] !== layout && sharesAbove(chain, route.layoutIds, depth)))
34
+ layouts.add(layout);
35
+ });
36
+ }
37
+ return { routes: [...new Set(kept.map((route) => route.id))], layouts: [...layouts] };
38
+ }
39
+ /**
40
+ * The chain indices to render inside slot wrappers for a chain of `layoutIds` and then the page of
41
+ * `routeId`: each wrapped layout, and the page when its route keeps alive.
42
+ */
43
+ export function slotDepths(table, layoutIds, routeId) {
44
+ const depths = [];
45
+ layoutIds.forEach((layout, depth) => {
46
+ if (table.layouts.includes(layout))
47
+ depths.push(depth);
48
+ });
49
+ if (routeId !== undefined && table.routes.includes(routeId))
50
+ depths.push(layoutIds.length);
51
+ return depths;
52
+ }
53
+ //# sourceMappingURL=keep-alive-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keep-alive-table.js","sourceRoot":"","sources":["../../src/internal/keep-alive-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * The seam between page execution and a configured live runtime (`@nifrajs/web/live`): types and one
3
+ * symbol. An app without `live` imports nothing from the live module itself.
4
+ */
5
+ import type { IdentityPlugin, WebSocketHandler } from "@nifrajs/core/server";
6
+ import type { LoaderContext } from "../manifest.js";
7
+ import type { LiveClientEntry } from "./codegen.js";
8
+ /** What `createWebApp` tells the runtime about its routes. */
9
+ export interface LiveRouteMatch {
10
+ readonly routeId: string;
11
+ readonly layoutIds: readonly string[];
12
+ }
13
+ /** The app the live socket registers on. */
14
+ export interface LiveHostApp {
15
+ use(plugin: IdentityPlugin): unknown;
16
+ ws<Data>(path: string, handler: WebSocketHandler<Data>): unknown;
17
+ publish(topic: string, data: string): void;
18
+ }
19
+ export interface LiveAttachInput {
20
+ /** The route a canonical `pathname + search` renders, or `null`. */
21
+ readonly matchRoute: (path: string) => LiveRouteMatch | null;
22
+ readonly app: LiveHostApp;
23
+ }
24
+ export interface LiveAttachment {
25
+ /** Admission and dispatch for the live load endpoint; `undefined` for every other request. */
26
+ readonly onRequest: (req: Request) => Promise<Request | Response> | undefined;
27
+ /** The live load a page request belongs to, or `undefined` for every request that is not one. */
28
+ readonly loadOf: (req: Request) => LiveLoad | undefined;
29
+ }
30
+ /** One live load, from the page handler's side. */
31
+ export interface LiveLoad {
32
+ /** The route the endpoint mapped the retain list against. */
33
+ readonly routeId: string;
34
+ /** `undefined` when admitted; else the 503 to answer with. An admitted load is released once. */
35
+ admit(): Response | undefined;
36
+ /** Release the admission slot once the response is complete: at once, or when its stream ends. */
37
+ settle(response: Response): Response;
38
+ release(): void;
39
+ /**
40
+ * After middleware: resolve the viewer's subject. `false` when the presented grant's retention no
41
+ * longer applies (another subject), so every owner loads fresh.
42
+ */
43
+ bind(ctx: LoaderContext): Promise<boolean>;
44
+ /** Skip the page loader: the page owner is retained. Read after {@link bind}. */
45
+ readonly retainPage: boolean;
46
+ /** `ctx.live` for one owner. */
47
+ collector(owner: string): (...keys: string[]) => void;
48
+ /** Close an owner's collector once its loader has settled. */
49
+ seal(owner: string): void;
50
+ /** The envelope's `live` member, built after every loader settled without a throw or status. */
51
+ finish(input: LiveFinish): Promise<LiveEnvelope>;
52
+ }
53
+ export interface LiveFinish {
54
+ /** Owners whose loaders ran and resolved. */
55
+ readonly fresh: readonly string[];
56
+ /** Owners whose loaders were skipped: their keys come from the presented grant. */
57
+ readonly retained: readonly string[];
58
+ readonly ctx: LoaderContext;
59
+ }
60
+ export interface LiveEnvelope {
61
+ /**
62
+ * Opaque and stable per viewer, one per listed secret, newest first. A load sharing none with the
63
+ * last one is another user, so client caches are cleared; a rotation always leaves one in common.
64
+ */
65
+ readonly subjects: readonly string[];
66
+ /** Absent when no grant could be issued; the client then polls. */
67
+ readonly grant?: string;
68
+ /** Wire tag to the frame's owners that watch its key. */
69
+ readonly tags?: Readonly<Record<string, readonly string[]>>;
70
+ /** The page loader did not run: the client keeps its page data. */
71
+ readonly page?: "retained";
72
+ /** Seconds the grant stays valid from now; the client renews a minute before. */
73
+ readonly ttl?: number;
74
+ /** For query hooks: with `queryKeys`, and in development so the page can warn. */
75
+ readonly query?: LiveQueryKeys;
76
+ }
77
+ export interface LiveQueryKeys {
78
+ /** Fresh per load; absent when `queryKeys` is off. */
79
+ readonly salt?: string;
80
+ /** Wire tag to its key's digest under `salt`. */
81
+ readonly keys?: Readonly<Record<string, string>>;
82
+ /** The app runs in development: the page warns about query keys no grant holds. */
83
+ readonly dev?: true;
84
+ }
85
+ /** The owner a hole of a partially prerendered page is in its page's live frame. */
86
+ export declare const holeOwner: (hole: string, routeId: string) => string;
87
+ /** `createWebApp` reads the runtime through this symbol, so it is not public API on the object. */
88
+ export declare const LIVE_ATTACH: unique symbol;
89
+ export interface LiveRuntimeHandle {
90
+ readonly [LIVE_ATTACH]: (input: LiveAttachInput) => LiveAttachment;
91
+ /** The client entry's `live` option for this runtime: the endpoints it serves, where not the default. */
92
+ readonly clientEntry: LiveClientEntry;
93
+ /** Announce changed keys; resolves once this process applied the change. */
94
+ publish(...keys: string[]): Promise<void>;
95
+ }
96
+ //# sourceMappingURL=live-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-contract.d.ts","sourceRoot":"","sources":["../../src/internal/live-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** The owner a hole of a partially prerendered page is in its page's live frame. */
2
+ export const holeOwner = (hole, routeId) => `B:${hole}:${routeId}`;
3
+ /** `createWebApp` reads the runtime through this symbol, so it is not public API on the object. */
4
+ export const LIVE_ATTACH = Symbol.for("nifra.web.live.attach");
5
+ //# sourceMappingURL=live-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-contract.js","sourceRoot":"","sources":["../../src/internal/live-contract.ts"],"names":[],"mappings":"AA6FA,oFAAoF;AACpF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,OAAe,EAAU,EAAE,CAAC,KAAK,IAAI,IAAI,OAAO,EAAE,CAAA;AAE1F,mGAAmG;AACnG,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * The live client's side of the query seam. A mounted query with live keys registers here, and the
3
+ * live client matches its keys to the tags each live load grants. Importing this module installs the
4
+ * seam.
5
+ */
6
+ import { type LiveQuery } from "./query-seam.js";
7
+ export type { LiveQuery };
8
+ /** Read by a query as each fetch starts. */
9
+ export declare const liveTick: () => number;
10
+ /**
11
+ * Advanced as each live load's response arrives, and as each query registers. A query whose fetch
12
+ * started after a load arrived read the server after that load took its watermark.
13
+ */
14
+ export declare const advanceLiveTick: () => number;
15
+ export declare function liveQueries(): Iterable<LiveQuery>;
16
+ /** The live tick `query` registered at, or `undefined` once it left. */
17
+ export declare function registeredAt(query: LiveQuery): number | undefined;
18
+ /** Returns the function that stops watching. */
19
+ export declare function watchLiveQueries(watcher: () => void): () => void;
20
+ /** Another viewer: no query client keeps data loaded for the last one. */
21
+ export declare function clearQueryClients(): void;
22
+ //# sourceMappingURL=live-queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-queries.d.ts","sourceRoot":"","sources":["../../src/internal/live-queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAoB,KAAK,SAAS,EAAgB,MAAM,iBAAiB,CAAA;AAEhF,YAAY,EAAE,SAAS,EAAE,CAAA;AAIzB,4CAA4C;AAC5C,eAAO,MAAM,QAAQ,QAAO,MAAc,CAAA;AAE1C;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,MAAgB,CAAA;AAUnD,wBAAgB,WAAW,IAAI,QAAQ,CAAC,SAAS,CAAC,CAEjD;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKhE;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The live client's side of the query seam. A mounted query with live keys registers here, and the
3
+ * live client matches its keys to the tags each live load grants. Importing this module installs the
4
+ * seam.
5
+ */
6
+ import { installQuerySeam, queryClients } from "./query-seam.js";
7
+ let tick = 0;
8
+ /** Read by a query as each fetch starts. */
9
+ export const liveTick = () => tick;
10
+ /**
11
+ * Advanced as each live load's response arrives, and as each query registers. A query whose fetch
12
+ * started after a load arrived read the server after that load took its watermark.
13
+ */
14
+ export const advanceLiveTick = () => ++tick;
15
+ // Query to the live tick it registered at: a change before that never reached it.
16
+ const queries = new Map();
17
+ const watchers = new Set();
18
+ function changed() {
19
+ for (const watcher of watchers)
20
+ watcher();
21
+ }
22
+ export function liveQueries() {
23
+ return queries.keys();
24
+ }
25
+ /** The live tick `query` registered at, or `undefined` once it left. */
26
+ export function registeredAt(query) {
27
+ return queries.get(query);
28
+ }
29
+ /** Returns the function that stops watching. */
30
+ export function watchLiveQueries(watcher) {
31
+ watchers.add(watcher);
32
+ return () => {
33
+ watchers.delete(watcher);
34
+ };
35
+ }
36
+ /** Another viewer: no query client keeps data loaded for the last one. */
37
+ export function clearQueryClients() {
38
+ for (const ref of queryClients())
39
+ ref.deref()?.clear();
40
+ }
41
+ installQuerySeam({
42
+ tick: liveTick,
43
+ track(query, mounted) {
44
+ if (mounted && query.keys().length > 0) {
45
+ if (queries.has(query))
46
+ return;
47
+ queries.set(query, advanceLiveTick());
48
+ changed();
49
+ }
50
+ else if (queries.delete(query))
51
+ changed();
52
+ },
53
+ });
54
+ //# sourceMappingURL=live-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-queries.js","sourceRoot":"","sources":["../../src/internal/live-queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAAkB,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAIhF,IAAI,IAAI,GAAG,CAAC,CAAA;AAEZ,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAW,EAAE,CAAC,IAAI,CAAA;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAW,EAAE,CAAC,EAAE,IAAI,CAAA;AAEnD,kFAAkF;AAClF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAA;AAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAc,CAAA;AAEtC,SAAS,OAAO;IACd,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,OAAO,EAAE,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,IAAI,EAAE,CAAA;AACvB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,YAAY,CAAC,KAAgB;IAC3C,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AAC3B,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,OAAmB;IAClD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,OAAO,GAAG,EAAE;QACV,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC,CAAA;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB;IAC/B,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE;QAAE,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAA;AACxD,CAAC;AAED,gBAAgB,CAAC;IACf,IAAI,EAAE,QAAQ;IACd,KAAK,CAAC,KAAK,EAAE,OAAO;QAClB,IAAI,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAM;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,CAAA;YACrC,OAAO,EAAE,CAAA;QACX,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;IAC7C,CAAC;CACF,CAAC,CAAA"}