@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,270 @@
1
+ /**
2
+ * @nifrajs/web/islands/swap - refresh one region of a server-rendered page from a plain link or form,
3
+ * without a full reload and without a client router.
4
+ *
5
+ * <form action="/hotels" data-swap="replace:results"><input name="q"></form>
6
+ * <ul data-swap-slot="results">...</ul>
7
+ * <a href="/hotels?page=2" data-swap="append:results">More</a>
8
+ *
9
+ * The request is the one the link or form makes anyway, plus an `x-nifra-swap: <slot>` header. The
10
+ * server runs the page as usual and answers with that slot's HTML alone (`slot()` in
11
+ * `@nifrajs/web-vanilla`), so the fragment is a slice of the real page. Any other answer - a redirect,
12
+ * another origin, a page without that slot - loads the URL normally. Only GET requests are enhanced:
13
+ * a POST form submits natively, so the browser applies its response's security policy and scripts,
14
+ * and the form is never sent twice.
15
+ */
16
+ import { mountIsland } from "./internal/island-mount.js";
17
+ import { SWAP_HEADER } from "./render-seam.js";
18
+ const MODE = /^(replace|append):([A-Za-z][\w-]{0,63})$/;
19
+ const SLOTS = "[data-swap-slot]:not([data-island-ignore],[data-island-ignore] *)";
20
+ const HISTORY_KEY = "nifraSwap";
21
+ // A control named like a DOM method shadows it on its form (`<input name="closest">`).
22
+ const attr = (el, name) => Element.prototype.getAttribute.call(el, name);
23
+ const here = () => location.pathname + location.search;
24
+ /** The slot names a history entry's swaps changed, from the first one in this tab up to it. */
25
+ const swappedIn = (state) => {
26
+ const names = typeof state === "object" && state !== null ? Reflect.get(state, HISTORY_KEY) : undefined;
27
+ return Array.isArray(names) ? names.filter((name) => typeof name === "string") : [];
28
+ };
29
+ /**
30
+ * Mount the page's islands, as `mountIslands` does, and make every `data-swap` link and GET form under
31
+ * `root` refresh its slot in place. Call it instead of `mountIslands`.
32
+ *
33
+ * - `data-swap="replace:<slot>"` replaces the content of the `data-swap-slot="<slot>"` element;
34
+ * `append:<slot>` adds to it, and a link or form inside that slot is spent: the slot's child holding
35
+ * it is removed when the next content arrives, so a "more" link at the end of a list gives way to
36
+ * the next page and its own "more" link.
37
+ * - A replacing GET pushes its URL, so a filtered list survives reload and can be shared; back and
38
+ * forward fetch the slots again for the URL they land on.
39
+ * - The islands inside a slot mount with it and unmount when it is replaced.
40
+ * - While a slot loads it carries `aria-busy="true"`; a newer swap of the same slot cancels the
41
+ * older one. When the request fails, the page stays as it is and the link or form gets
42
+ * `data-swap-error`.
43
+ *
44
+ * Nothing inside a `data-island-ignore` element swaps. Returns a disposer that removes the listeners,
45
+ * cancels pending swaps and unmounts every island.
46
+ */
47
+ export function enableSwap(
48
+ // `never` admits an enhancer of any props type, as in `mountIslands`.
49
+ enhancers, options = {}) {
50
+ const root = options.root ?? document;
51
+ const stops = new Map();
52
+ const pending = new Map();
53
+ let swapped = swappedIn(history.state);
54
+ let shown = here();
55
+ const islands = "[data-island]:not([data-island-ignore],[data-island-ignore] *)";
56
+ const attach = (scope) => {
57
+ const mount = (el) => {
58
+ const stop = mountIsland(el, enhancers);
59
+ if (stop !== undefined)
60
+ stops.set(el, stop);
61
+ };
62
+ if (scope instanceof HTMLElement && scope.matches(islands))
63
+ mount(scope);
64
+ for (const el of scope.querySelectorAll(islands))
65
+ if (scope.contains(el))
66
+ mount(el);
67
+ };
68
+ const release = (scope) => {
69
+ const cleanups = [];
70
+ for (const [node, stop] of stops)
71
+ if (scope.contains(node)) {
72
+ stops.delete(node);
73
+ cleanups.push(stop);
74
+ }
75
+ // Cleanup may itself detach descendants, so collect every owner before stopping any of them.
76
+ for (const stop of cleanups)
77
+ stop();
78
+ };
79
+ // The server answers with the first slot of a name in the page, so the client takes the first too.
80
+ const slotNamed = (name) => {
81
+ for (const slot of root.querySelectorAll(SLOTS))
82
+ if (slot.getAttribute("data-swap-slot") === name)
83
+ return slot;
84
+ return undefined;
85
+ };
86
+ const put = (slot, html, append, source) => {
87
+ const template = document.createElement("template");
88
+ // Parsed inert: scripts in it never run, as for any HTML set this way.
89
+ template.innerHTML = html;
90
+ const focused = slot.contains(document.activeElement);
91
+ if (append) {
92
+ for (const child of [...slot.children])
93
+ if (child === source || (source !== undefined && child.contains(source))) {
94
+ release(child);
95
+ slot.removeChild(child);
96
+ }
97
+ slot.append(template.content);
98
+ }
99
+ else {
100
+ release(slot);
101
+ slot.replaceChildren(template.content);
102
+ }
103
+ attach(slot);
104
+ if (focused && !slot.contains(document.activeElement) && slot instanceof HTMLElement) {
105
+ if (!slot.hasAttribute("tabindex"))
106
+ slot.tabIndex = -1;
107
+ slot.focus({ preventScroll: true });
108
+ }
109
+ };
110
+ const swap = async (slot, name, append, url, source) => {
111
+ pending.get(slot)?.abort();
112
+ const abort = new AbortController();
113
+ pending.set(slot, abort);
114
+ slot.setAttribute("aria-busy", "true");
115
+ try {
116
+ const response = await fetch(url, {
117
+ cache: "no-store",
118
+ headers: { [SWAP_HEADER]: name },
119
+ signal: abort.signal,
120
+ redirect: "manual",
121
+ });
122
+ const load = () => {
123
+ if (source === undefined)
124
+ location.reload();
125
+ else
126
+ location.assign(response.redirected ? response.url : url);
127
+ };
128
+ if (response.type !== "basic" ||
129
+ !response.headers.get("content-type")?.startsWith("text/html")) {
130
+ load();
131
+ return;
132
+ }
133
+ // A slot answer joins this document, so this document's CSP governs it, whatever headers the
134
+ // fetch carried; anything that is not one loads as its own document under its own policy.
135
+ if (response.headers.get(SWAP_HEADER) !== name) {
136
+ load();
137
+ return;
138
+ }
139
+ const html = await response.text();
140
+ if (!slot.isConnected)
141
+ return;
142
+ try {
143
+ put(slot, html, append, source);
144
+ }
145
+ catch {
146
+ // Trusted Types without a default policy refuses the HTML before the slot changes.
147
+ load();
148
+ return;
149
+ }
150
+ if (!append && source !== undefined) {
151
+ if (!swapped.includes(name))
152
+ swapped = [...swapped, name];
153
+ history.pushState({ [HISTORY_KEY]: swapped }, "", url);
154
+ shown = url.pathname + url.search;
155
+ }
156
+ }
157
+ catch {
158
+ if (abort.signal.aborted)
159
+ return;
160
+ // Back or forward left the URL ahead of the page: show what the URL shows.
161
+ if (source === undefined)
162
+ location.reload();
163
+ else
164
+ Element.prototype.setAttribute.call(source, "data-swap-error", "");
165
+ }
166
+ finally {
167
+ if (pending.get(slot) === abort) {
168
+ pending.delete(slot);
169
+ slot.removeAttribute("aria-busy");
170
+ }
171
+ }
172
+ };
173
+ const start = (event, source, url) => {
174
+ const mode = MODE.exec(attr(source, "data-swap") ?? "");
175
+ const name = mode?.[2];
176
+ if (name === undefined ||
177
+ url.origin !== location.origin ||
178
+ Element.prototype.closest.call(source, "[data-island-ignore]") !== null)
179
+ return;
180
+ const slot = slotNamed(name);
181
+ if (slot === undefined)
182
+ return;
183
+ event.preventDefault();
184
+ Element.prototype.removeAttribute.call(source, "data-swap-error");
185
+ void swap(slot, name, mode?.[1] === "append", url, source);
186
+ };
187
+ const onClick = (event) => {
188
+ if (!(event instanceof MouseEvent) || event.defaultPrevented || event.button !== 0)
189
+ return;
190
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
191
+ return;
192
+ const link = event.target instanceof Element ? event.target.closest("a[data-swap]") : null;
193
+ if (!(link instanceof HTMLAnchorElement) || !link.hasAttribute("href"))
194
+ return;
195
+ const target = link.getAttribute("target");
196
+ if ((target !== null && target !== "" && target !== "_self") || link.hasAttribute("download"))
197
+ return;
198
+ const url = new URL(link.href);
199
+ // An in-page anchor keeps its native jump.
200
+ if (url.hash !== "" && url.pathname + url.search === here())
201
+ return;
202
+ start(event, link, url);
203
+ };
204
+ const onSubmit = (event) => {
205
+ const form = event.target;
206
+ if (!(event instanceof SubmitEvent) ||
207
+ event.defaultPrevented ||
208
+ !(form instanceof HTMLFormElement) ||
209
+ attr(form, "data-swap") === null)
210
+ return;
211
+ const submitter = event.submitter;
212
+ // The button that submitted can override the form's method, action, target and encoding.
213
+ const pick = (name) => submitter?.hasAttribute(`form${name}`)
214
+ ? submitter.getAttribute(`form${name}`)
215
+ : attr(form, name);
216
+ // An empty method is a GET, as for the browser.
217
+ const method = (pick("method") || "get").toUpperCase();
218
+ const target = pick("target");
219
+ const enctype = pick("enctype")?.toLowerCase();
220
+ if (method !== "GET" ||
221
+ (target !== null && target !== "" && target !== "_self") ||
222
+ enctype === "text/plain")
223
+ return;
224
+ const action = pick("action");
225
+ const url = new URL(action === null || action === "" ? location.href : action, document.baseURI);
226
+ const data = new FormData(form, submitter);
227
+ const fields = new URLSearchParams();
228
+ for (const [key, value] of data)
229
+ fields.append(key, typeof value === "string" ? value : value.name);
230
+ url.search = fields.toString();
231
+ start(event, form, url);
232
+ };
233
+ const onPopState = (event) => {
234
+ if (here() === shown)
235
+ return;
236
+ shown = here();
237
+ const reached = swappedIn(event.state);
238
+ // Every slot a swap changed between the entry left and the one reached is in the later one's list.
239
+ const names = new Set([...swapped, ...reached]);
240
+ swapped = reached;
241
+ const targets = [];
242
+ for (const name of names) {
243
+ const slot = slotNamed(name);
244
+ if (slot === undefined) {
245
+ location.reload();
246
+ return;
247
+ }
248
+ targets.push([name, slot]);
249
+ }
250
+ for (const [name, slot] of targets)
251
+ void swap(slot, name, false, new URL(location.href));
252
+ };
253
+ const listen = (method) => {
254
+ root[method]("click", onClick);
255
+ root[method]("submit", onSubmit);
256
+ };
257
+ attach(root);
258
+ listen("addEventListener");
259
+ window.addEventListener("popstate", onPopState);
260
+ return () => {
261
+ listen("removeEventListener");
262
+ window.removeEventListener("popstate", onPopState);
263
+ for (const abort of pending.values())
264
+ abort.abort();
265
+ for (const stop of stops.values())
266
+ stop();
267
+ stops.clear();
268
+ };
269
+ }
270
+ //# sourceMappingURL=islands-swap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"islands-swap.js","sourceRoot":"","sources":["../src/islands-swap.ts"],"names":[],"mappings":"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"}
package/dist/islands.d.ts CHANGED
@@ -1,21 +1,29 @@
1
1
  /**
2
- * @nifrajs/web/islands - the framework-agnostic islands client runtime.
2
+ * @nifrajs/web/islands - the islands client runtime: interactivity for server-rendered pages without a
3
+ * framework runtime.
3
4
  *
4
- * An "island" is a server-rendered `<nifra-island>` element whose interactivity is mounted by a small
5
- * **plain-DOM** enhancer instead of a framework runtime. On a route that opts out of full-document
6
- * hydration (`export const hydrate = false`), the page ships **zero** framework JS; only the island
7
- * bundle (this runtime + your enhancers) loads. This variant ships ~99% less client JS than full
8
- * React hydration on a mostly-static page - the framework runtime is the cost, and islands skip it
9
- * entirely here.
5
+ * An island is a server-rendered element marked `data-island="<id>"`. Its interactivity is mounted by
6
+ * an enhancer instead of hydration, so on a route with `export const hydrate = false` the page ships
7
+ * no framework JS; only the island bundle (this runtime + your enhancers) loads via `islandScripts`.
10
8
  *
11
- * Server side: render the marker with `@nifrajs/web-react`'s `<Island>` (or any framework's host element
12
- * `<nifra-island data-id data-strategy data-props>`). Props are JSON-encoded inline in `data-props`
13
- * (attribute-escaped by the framework) - no central registry, so concurrent SSR renders never share
14
- * state. Client side: bundle one entry that calls `mountIslands({ <id>: enhancer })` and load it via
15
- * the route's `islandScripts`.
9
+ * Two tiers, one mount:
10
+ * - `defineIsland((el, props) => cleanup)` - plain DOM code. The default.
11
+ * - `bindIsland(({ state, onDispose }) => handlers)` - signals the markup binds by name through a
12
+ * closed set of `data-bind-*` attributes. No expression language: names only.
13
+ * `signal`/`computed`/`effect`, a keyed `bindList` and an async `resource` work inside either tier;
14
+ * whatever an enhancer creates stops when its island unmounts.
15
+ *
16
+ * Server side: `<div data-island="counter" data-island-props="${islandProps({ start: 0 })}">`, or
17
+ * `@nifrajs/web-react`'s `<Island>`. Optional `data-island-strategy` (`load` | `idle` | `visible` |
18
+ * `media`, with `data-island-media`). Props travel as JSON in the attribute - no central registry, so
19
+ * concurrent SSR renders never share state. Nothing inside a `data-island-ignore` element mounts or
20
+ * binds: render user HTML there.
16
21
  */
17
- import { type IslandStrategy, MAX_MEDIA_QUERY_LENGTH, scheduleTrigger } from "@nifrajs/island-trigger";
18
- export { type IslandStrategy, MAX_MEDIA_QUERY_LENGTH, scheduleTrigger };
22
+ import { type Signal } from "./internal/island-signals.js";
23
+ export { type IslandStrategy, MAX_MEDIA_QUERY_LENGTH, scheduleTrigger, } from "@nifrajs/island-trigger";
24
+ export { type BindListOptions, bindList, type ListContainer, type ListNode, } from "./internal/island-list.js";
25
+ export { type Resource, type ResourceState, resource } from "./internal/island-resource.js";
26
+ export { batch, type Computed, computed, effect, type Signal, signal, untrack, } from "./internal/island-signals.js";
19
27
  /** Optional teardown an enhancer returns (remove listeners/observers); run on `dispose()`. */
20
28
  export type IslandCleanup = () => void;
21
29
  /**
@@ -26,7 +34,7 @@ export type IslandCleanup = () => void;
26
34
  export type IslandEnhancer<P = unknown> = (el: HTMLElement, props: P) => IslandCleanup | void;
27
35
  /**
28
36
  * Author a typed enhancer. Pure identity at runtime (zero cost, tree-shaken away) - its only job is
29
- * to pin the `data-props` shape so `el` and `props` are typed inside the body and the enhancer is
37
+ * to pin the props shape so `el` and `props` are typed inside the body and the enhancer is
30
38
  * assignable to `mountIslands`. Prefer this over an inline arrow whenever an island reads props:
31
39
  *
32
40
  * const counter = defineIsland<{ start: number }>((el, props) => {
@@ -38,19 +46,73 @@ export type IslandEnhancer<P = unknown> = (el: HTMLElement, props: P) => IslandC
38
46
  * })
39
47
  * mountIslands({ counter })
40
48
  *
41
- * The props type is a contract, not a validator - `data-props` is JSON authored by your own SSR, so
42
- * it is trusted framing, not user input. Keep the enhancer body imperative: read the DOM, wire
43
- * listeners, return cleanup. No hidden reactivity to get wrong.
49
+ * The props type is a contract, not a validator - `data-island-props` is JSON authored by your own
50
+ * SSR, so it is trusted framing, not user input. Keep the enhancer body imperative: read the DOM,
51
+ * wire listeners, return cleanup.
44
52
  */
45
53
  export declare function defineIsland<P = unknown>(enhancer: IslandEnhancer<P>): IslandEnhancer<P>;
46
54
  /**
47
- * Find every `<nifra-island data-id>` under `root` (default `document`) and enhance each with the
48
- * matching enhancer, honoring its `data-strategy`. An island whose `id` has no enhancer is left as
49
- * inert SSR HTML (forward-compatible). An enhancer that throws is isolated - it never blocks the
50
- * others (each island is independent). Returns a disposer that cancels pending triggers and runs every
51
- * enhancer's cleanup (call it on soft-nav teardown; harmless if your app never navigates).
55
+ * Run `callback` each time the `keepAlive` page `el` renders in is hidden behind another page, just
56
+ * before it leaves the document. An island in a kept page stays mounted, and its timers and window
57
+ * listeners keep running, while the page is hidden: pause them here. Returns its removal - hand it back
58
+ * as part of the enhancer's cleanup. Never runs outside a kept page.
59
+ *
60
+ * const clock = defineIsland((el) => {
61
+ * let timer = setInterval(tick, 1000)
62
+ * const hide = onPageHide(el, () => clearInterval(timer))
63
+ * const show = onPageShow(el, () => { timer = setInterval(tick, 1000) })
64
+ * return () => { hide(); show(); clearInterval(timer) }
65
+ * })
66
+ */
67
+ export declare function onPageHide(el: Element, callback: () => void): () => void;
68
+ /** Run `callback` each time the `keepAlive` page `el` renders in is shown again; returns its removal. */
69
+ export declare function onPageShow(el: Element, callback: () => void): () => void;
70
+ /** What a `bindIsland` setup receives. */
71
+ export interface BindIslandContext<P> {
72
+ /** The island's host element. */
73
+ readonly root: HTMLElement;
74
+ /** The parsed `data-island-props`, or `undefined` when absent or malformed. */
75
+ readonly props: P | undefined;
76
+ /**
77
+ * The signal the markup binds as `key`, seeded from `props[key]` when present, else `fallback`.
78
+ * Each key returns the same signal across calls.
79
+ */
80
+ state<T>(key: string, fallback: T): Signal<T>;
81
+ /**
82
+ * Run `fn` when the island unmounts - for timers, requests and listeners the setup starts. Called
83
+ * after the island unmounted (say, once an awaited request settles), it runs `fn` at once.
84
+ */
85
+ onDispose(fn: () => void): void;
86
+ }
87
+ /**
88
+ * The binding tier: `setup` creates the island's state and returns the event handlers its markup
89
+ * names; the island's `data-bind-*` attributes then bind them.
90
+ *
91
+ * data-bind-text="count" data-bind-show="open" data-bind-class="active:open"
92
+ * data-bind-attr="aria-expanded:open" data-bind-value="query" data-bind-on="click:add"
93
+ *
94
+ * Attribute values are signal and handler names, never code; an unknown name warns once and the
95
+ * server-rendered content stays as it is. A binding belongs to its nearest island.
96
+ *
97
+ * A setup or binding that throws stops everything the island started before the error reaches
98
+ * `mountIslands`. On unmount every cleanup runs; one that throws is logged and the rest still run.
99
+ */
100
+ export declare function bindIsland<P = Record<string, unknown>>(setup: (ctx: BindIslandContext<P>) => Record<string, (event: Event) => void> | void): IslandEnhancer<P>;
101
+ /**
102
+ * The `data-island-props` value for `props`: JSON. Emit it through an escaping renderer into a quoted
103
+ * attribute (`data-island-props="${...}"`): unquoted, a space in the JSON ends the value and the rest
104
+ * parses as attributes.
105
+ */
106
+ export declare function islandProps(props: Record<string, unknown>): string;
107
+ /**
108
+ * Find every `[data-island]` element under `root` (default `document`) and enhance each with the
109
+ * matching enhancer, honoring its `data-island-strategy`. An island whose id has no enhancer, or that
110
+ * is already mounted, is left alone, so calling again after a soft navigation mounts only new hosts.
111
+ * An enhancer that throws is isolated - it never blocks the others. Every effect, list binding and
112
+ * resource an enhancer creates is owned by its island. Returns a disposer that cancels pending
113
+ * triggers and tears down every island it mounted (call it on soft-nav teardown).
52
114
  */
53
- export declare function mountIslands(enhancers: Readonly<Record<string, IslandEnhancer>>, options?: {
115
+ export declare function mountIslands(enhancers: Readonly<Record<string, IslandEnhancer<never>>>, options?: {
54
116
  readonly root?: ParentNode;
55
117
  }): () => void;
56
118
  /** Unsubscribe one bus handler; calling twice is a no-op. Also returned so an enhancer can hand it
@@ -1 +1 @@
1
- {"version":3,"file":"islands.d.ts","sourceRoot":"","sources":["../src/islands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,KAAK,cAAc,EACnB,sBAAsB,EACtB,eAAe,EAChB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,KAAK,cAAc,EAAE,sBAAsB,EAAE,eAAe,EAAE,CAAA;AAEvE,8FAA8F;AAC9F,MAAM,MAAM,aAAa,GAAG,MAAM,IAAI,CAAA;AAEtC;;;;GAIG;AAEH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,KAAK,aAAa,GAAG,IAAI,CAAA;AAE7F;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAExF;AAaD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EACnD,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAO,GAC3C,MAAM,IAAI,CA4CZ;AAED;2CAC2C;AAC3C,MAAM,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7D;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAC9D,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,oBAAoB,CAAA;CAChG,CA8BA"}
1
+ {"version":3,"file":"islands.d.ts","sourceRoot":"","sources":["../src/islands.ts"],"names":[],"mappings":"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"}