@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.
- package/CHANGELOG.md +154 -0
- package/dist/boundary.d.ts +67 -7
- package/dist/boundary.d.ts.map +1 -1
- package/dist/boundary.js +6 -4
- package/dist/boundary.js.map +1 -1
- package/dist/build-plan.d.ts +3 -0
- package/dist/build-plan.d.ts.map +1 -1
- package/dist/build-plan.js.map +1 -1
- package/dist/build-vite.d.ts.map +1 -1
- package/dist/build-vite.js +2 -0
- package/dist/build-vite.js.map +1 -1
- package/dist/build.d.ts +9 -2
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +9 -0
- package/dist/build.js.map +1 -1
- package/dist/client.d.ts +2 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +140 -12
- package/dist/client.js.map +1 -1
- package/dist/csp.d.ts +8 -0
- package/dist/csp.d.ts.map +1 -1
- package/dist/csp.js +11 -2
- package/dist/csp.js.map +1 -1
- package/dist/deferred.d.ts +6 -4
- package/dist/deferred.d.ts.map +1 -1
- package/dist/deferred.js +10 -6
- package/dist/deferred.js.map +1 -1
- package/dist/dev-feed.d.ts.map +1 -1
- package/dist/dev-feed.js +11 -2
- package/dist/dev-feed.js.map +1 -1
- package/dist/dev-session.d.ts.map +1 -1
- package/dist/dev-session.js +13 -6
- package/dist/dev-session.js.map +1 -1
- package/dist/dev.d.ts +4 -1
- package/dist/dev.d.ts.map +1 -1
- package/dist/dev.js +12 -5
- package/dist/dev.js.map +1 -1
- package/dist/diagnostic-catalog.d.ts +4 -0
- package/dist/diagnostic-catalog.d.ts.map +1 -1
- package/dist/diagnostic-catalog.js +48 -0
- package/dist/diagnostic-catalog.js.map +1 -1
- package/dist/diagnostic.d.ts +1 -1
- package/dist/diagnostic.d.ts.map +1 -1
- package/dist/diagnostic.js +1 -1
- package/dist/diagnostic.js.map +1 -1
- package/dist/fn.d.ts +5 -3
- package/dist/fn.d.ts.map +1 -1
- package/dist/fn.js +20 -5
- package/dist/fn.js.map +1 -1
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +13 -3
- package/dist/fs.js.map +1 -1
- package/dist/identity.d.ts +22 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +60 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/cdn/cloudflare.d.ts +2 -1
- package/dist/internal/cdn/cloudflare.d.ts.map +1 -1
- package/dist/internal/cdn/cloudflare.js +2 -1
- package/dist/internal/cdn/cloudflare.js.map +1 -1
- package/dist/internal/certified-components.d.ts +1 -1
- package/dist/internal/certified-components.js +1 -1
- package/dist/internal/codegen.d.ts +11 -10
- package/dist/internal/codegen.d.ts.map +1 -1
- package/dist/internal/codegen.js +65 -8
- package/dist/internal/codegen.js.map +1 -1
- package/dist/internal/dev-websocket.d.ts +73 -0
- package/dist/internal/dev-websocket.d.ts.map +1 -0
- package/dist/internal/dev-websocket.js +145 -0
- package/dist/internal/dev-websocket.js.map +1 -0
- package/dist/internal/hole-runtime.d.ts +66 -0
- package/dist/internal/hole-runtime.d.ts.map +1 -0
- package/dist/internal/hole-runtime.js +211 -0
- package/dist/internal/hole-runtime.js.map +1 -0
- package/dist/internal/identity-epoch.d.ts +50 -0
- package/dist/internal/identity-epoch.d.ts.map +1 -0
- package/dist/internal/identity-epoch.js +179 -0
- package/dist/internal/identity-epoch.js.map +1 -0
- package/dist/internal/invalidation-contract.d.ts +23 -0
- package/dist/internal/invalidation-contract.d.ts.map +1 -0
- package/dist/internal/invalidation-contract.js +11 -0
- package/dist/internal/invalidation-contract.js.map +1 -0
- package/dist/internal/invalidation.d.ts +62 -0
- package/dist/internal/invalidation.d.ts.map +1 -0
- package/dist/internal/invalidation.js +149 -0
- package/dist/internal/invalidation.js.map +1 -0
- package/dist/internal/island-bindings.d.ts +51 -0
- package/dist/internal/island-bindings.d.ts.map +1 -0
- package/dist/internal/island-bindings.js +147 -0
- package/dist/internal/island-bindings.js.map +1 -0
- package/dist/internal/island-list.d.ts +26 -0
- package/dist/internal/island-list.d.ts.map +1 -0
- package/dist/internal/island-list.js +78 -0
- package/dist/internal/island-list.js.map +1 -0
- package/dist/internal/island-mount.d.ts +4 -0
- package/dist/internal/island-mount.d.ts.map +1 -0
- package/dist/internal/island-mount.js +66 -0
- package/dist/internal/island-mount.js.map +1 -0
- package/dist/internal/island-owner.d.ts +5 -0
- package/dist/internal/island-owner.d.ts.map +1 -0
- package/dist/internal/island-owner.js +20 -0
- package/dist/internal/island-owner.js.map +1 -0
- package/dist/internal/island-resource.d.ts +30 -0
- package/dist/internal/island-resource.d.ts.map +1 -0
- package/dist/internal/island-resource.js +57 -0
- package/dist/internal/island-resource.js.map +1 -0
- package/dist/internal/island-signals.d.ts +51 -0
- package/dist/internal/island-signals.d.ts.map +1 -0
- package/dist/internal/island-signals.js +220 -0
- package/dist/internal/island-signals.js.map +1 -0
- package/dist/internal/keep-alive-table.d.ts +23 -0
- package/dist/internal/keep-alive-table.d.ts.map +1 -0
- package/dist/internal/keep-alive-table.js +53 -0
- package/dist/internal/keep-alive-table.js.map +1 -0
- package/dist/internal/live-contract.d.ts +96 -0
- package/dist/internal/live-contract.d.ts.map +1 -0
- package/dist/internal/live-contract.js +5 -0
- package/dist/internal/live-contract.js.map +1 -0
- package/dist/internal/live-queries.d.ts +22 -0
- package/dist/internal/live-queries.d.ts.map +1 -0
- package/dist/internal/live-queries.js +54 -0
- package/dist/internal/live-queries.js.map +1 -0
- package/dist/internal/page-events.d.ts +10 -0
- package/dist/internal/page-events.d.ts.map +1 -0
- package/dist/internal/page-events.js +26 -0
- package/dist/internal/page-events.js.map +1 -0
- package/dist/internal/page-execution.d.ts +14 -1
- package/dist/internal/page-execution.d.ts.map +1 -1
- package/dist/internal/page-execution.js +415 -31
- package/dist/internal/page-execution.js.map +1 -1
- package/dist/internal/ppr/admission.d.ts +83 -0
- package/dist/internal/ppr/admission.d.ts.map +1 -0
- package/dist/internal/ppr/admission.js +221 -0
- package/dist/internal/ppr/admission.js.map +1 -0
- package/dist/internal/ppr/canary.d.ts +24 -0
- package/dist/internal/ppr/canary.d.ts.map +1 -0
- package/dist/internal/ppr/canary.js +102 -0
- package/dist/internal/ppr/canary.js.map +1 -0
- package/dist/internal/ppr/compile-shell.d.ts +39 -0
- package/dist/internal/ppr/compile-shell.d.ts.map +1 -0
- package/dist/internal/ppr/compile-shell.js +298 -0
- package/dist/internal/ppr/compile-shell.js.map +1 -0
- package/dist/internal/ppr/contract.d.ts +177 -0
- package/dist/internal/ppr/contract.d.ts.map +1 -0
- package/dist/internal/ppr/contract.js +80 -0
- package/dist/internal/ppr/contract.js.map +1 -0
- package/dist/internal/ppr/frames.d.ts +71 -0
- package/dist/internal/ppr/frames.d.ts.map +1 -0
- package/dist/internal/ppr/frames.js +119 -0
- package/dist/internal/ppr/frames.js.map +1 -0
- package/dist/internal/ppr/integration.d.ts +19 -0
- package/dist/internal/ppr/integration.d.ts.map +1 -0
- package/dist/internal/ppr/integration.js +106 -0
- package/dist/internal/ppr/integration.js.map +1 -0
- package/dist/internal/ppr/options.d.ts +96 -0
- package/dist/internal/ppr/options.d.ts.map +1 -0
- package/dist/internal/ppr/options.js +125 -0
- package/dist/internal/ppr/options.js.map +1 -0
- package/dist/internal/ppr/route-rules.d.ts +12 -0
- package/dist/internal/ppr/route-rules.d.ts.map +1 -0
- package/dist/internal/ppr/route-rules.js +53 -0
- package/dist/internal/ppr/route-rules.js.map +1 -0
- package/dist/internal/ppr/runtime.d.ts +29 -0
- package/dist/internal/ppr/runtime.d.ts.map +1 -0
- package/dist/internal/ppr/runtime.js +32 -0
- package/dist/internal/ppr/runtime.js.map +1 -0
- package/dist/internal/ppr/server.d.ts +29 -0
- package/dist/internal/ppr/server.d.ts.map +1 -0
- package/dist/internal/ppr/server.js +1407 -0
- package/dist/internal/ppr/server.js.map +1 -0
- package/dist/internal/ppr/shell-store.d.ts +38 -0
- package/dist/internal/ppr/shell-store.d.ts.map +1 -0
- package/dist/internal/ppr/shell-store.js +90 -0
- package/dist/internal/ppr/shell-store.js.map +1 -0
- package/dist/internal/prerendered-pages.d.ts +1 -1
- package/dist/internal/prerendered-pages.d.ts.map +1 -1
- package/dist/internal/prerendered-pages.js +7 -4
- package/dist/internal/prerendered-pages.js.map +1 -1
- package/dist/internal/query-digest.d.ts +9 -0
- package/dist/internal/query-digest.d.ts.map +1 -0
- package/dist/internal/query-digest.js +23 -0
- package/dist/internal/query-digest.js.map +1 -0
- package/dist/internal/query-runtime.d.ts +6 -1
- package/dist/internal/query-runtime.d.ts.map +1 -1
- package/dist/internal/query-runtime.js +9 -0
- package/dist/internal/query-runtime.js.map +1 -1
- package/dist/internal/query-seam.d.ts +29 -0
- package/dist/internal/query-seam.d.ts.map +1 -0
- package/dist/internal/query-seam.js +23 -0
- package/dist/internal/query-seam.js.map +1 -0
- package/dist/internal/render-document.d.ts +28 -1
- package/dist/internal/render-document.d.ts.map +1 -1
- package/dist/internal/render-document.js +83 -18
- package/dist/internal/render-document.js.map +1 -1
- package/dist/internal/request-abort.d.ts +8 -0
- package/dist/internal/request-abort.d.ts.map +1 -0
- package/dist/internal/request-abort.js +22 -0
- package/dist/internal/request-abort.js.map +1 -0
- package/dist/internal/server-boundary.d.ts +2 -0
- package/dist/internal/server-boundary.d.ts.map +1 -1
- package/dist/internal/server-boundary.js +8 -1
- package/dist/internal/server-boundary.js.map +1 -1
- package/dist/internal/share-data.d.ts +10 -0
- package/dist/internal/share-data.d.ts.map +1 -0
- package/dist/internal/share-data.js +135 -0
- package/dist/internal/share-data.js.map +1 -0
- package/dist/internal/store-signature.d.ts +15 -0
- package/dist/internal/store-signature.d.ts.map +1 -0
- package/dist/internal/store-signature.js +114 -0
- package/dist/internal/store-signature.js.map +1 -0
- package/dist/internal/vite-plugin-compat.d.ts +2 -2
- package/dist/internal/vite-plugin-compat.js +2 -2
- package/dist/internal/web-app.d.ts +25 -0
- package/dist/internal/web-app.d.ts.map +1 -1
- package/dist/internal/web-app.js +78 -3
- package/dist/internal/web-app.js.map +1 -1
- package/dist/islands-swap.d.ts +41 -0
- package/dist/islands-swap.d.ts.map +1 -0
- package/dist/islands-swap.js +270 -0
- package/dist/islands-swap.js.map +1 -0
- package/dist/islands.d.ts +86 -24
- package/dist/islands.d.ts.map +1 -1
- package/dist/islands.js +138 -78
- package/dist/islands.js.map +1 -1
- package/dist/isr.d.ts +67 -13
- package/dist/isr.d.ts.map +1 -1
- package/dist/isr.js +247 -99
- package/dist/isr.js.map +1 -1
- package/dist/keep-alive.d.ts +147 -0
- package/dist/keep-alive.d.ts.map +1 -0
- package/dist/keep-alive.js +1069 -0
- package/dist/keep-alive.js.map +1 -0
- package/dist/live/bus.d.ts +56 -0
- package/dist/live/bus.d.ts.map +1 -0
- package/dist/live/bus.js +32 -0
- package/dist/live/bus.js.map +1 -0
- package/dist/live/core.d.ts +25 -0
- package/dist/live/core.d.ts.map +1 -0
- package/dist/live/core.js +29 -0
- package/dist/live/core.js.map +1 -0
- package/dist/live/history.d.ts +38 -0
- package/dist/live/history.d.ts.map +1 -0
- package/dist/live/history.js +104 -0
- package/dist/live/history.js.map +1 -0
- package/dist/live/hub-protocol.d.ts +46 -0
- package/dist/live/hub-protocol.d.ts.map +1 -0
- package/dist/live/hub-protocol.js +108 -0
- package/dist/live/hub-protocol.js.map +1 -0
- package/dist/live/hub.d.ts +181 -0
- package/dist/live/hub.d.ts.map +1 -0
- package/dist/live/hub.js +539 -0
- package/dist/live/hub.js.map +1 -0
- package/dist/live/keyring.d.ts +87 -0
- package/dist/live/keyring.d.ts.map +1 -0
- package/dist/live/keyring.js +260 -0
- package/dist/live/keyring.js.map +1 -0
- package/dist/live/read-capped.d.ts +6 -0
- package/dist/live/read-capped.d.ts.map +1 -0
- package/dist/live/read-capped.js +42 -0
- package/dist/live/read-capped.js.map +1 -0
- package/dist/live/revocations.d.ts +52 -0
- package/dist/live/revocations.d.ts.map +1 -0
- package/dist/live/revocations.js +116 -0
- package/dist/live/revocations.js.map +1 -0
- package/dist/live/settings.d.ts +14 -0
- package/dist/live/settings.d.ts.map +1 -0
- package/dist/live/settings.js +38 -0
- package/dist/live/settings.js.map +1 -0
- package/dist/live-client.d.ts +34 -0
- package/dist/live-client.d.ts.map +1 -0
- package/dist/live-client.js +840 -0
- package/dist/live-client.js.map +1 -0
- package/dist/live-hub.d.ts +130 -0
- package/dist/live-hub.d.ts.map +1 -0
- package/dist/live-hub.js +507 -0
- package/dist/live-hub.js.map +1 -0
- package/dist/live-redis.d.ts +48 -0
- package/dist/live-redis.d.ts.map +1 -0
- package/dist/live-redis.js +201 -0
- package/dist/live-redis.js.map +1 -0
- package/dist/live.d.ts +94 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +869 -0
- package/dist/live.js.map +1 -0
- package/dist/manifest.d.ts +113 -2
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +109 -5
- package/dist/manifest.js.map +1 -1
- package/dist/navigation.d.ts +9 -3
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +13 -3
- package/dist/navigation.js.map +1 -1
- package/dist/plugins/vite-zone-guard.d.ts +6 -0
- package/dist/plugins/vite-zone-guard.d.ts.map +1 -1
- package/dist/plugins/vite-zone-guard.js +8 -2
- package/dist/plugins/vite-zone-guard.js.map +1 -1
- package/dist/ppr.d.ts +73 -0
- package/dist/ppr.d.ts.map +1 -0
- package/dist/ppr.js +76 -0
- package/dist/ppr.js.map +1 -0
- package/dist/query.d.ts +8 -13
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +112 -18
- package/dist/query.js.map +1 -1
- package/dist/render-seam.d.ts +30 -0
- package/dist/render-seam.d.ts.map +1 -1
- package/dist/render-seam.js +5 -0
- package/dist/render-seam.js.map +1 -1
- package/dist/route-types.d.ts.map +1 -1
- package/dist/route-types.js +2 -2
- package/dist/route-types.js.map +1 -1
- package/dist/router.d.ts +72 -4
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +374 -99
- package/dist/router.js.map +1 -1
- package/dist/server-components/build.d.ts.map +1 -1
- package/dist/server-components/build.js +3 -3
- package/dist/server-components/build.js.map +1 -1
- package/dist/server-components/client.d.ts +23 -1
- package/dist/server-components/client.d.ts.map +1 -1
- package/dist/server-components/client.js +92 -5
- package/dist/server-components/client.js.map +1 -1
- package/dist/server-components/hole.d.ts +8 -0
- package/dist/server-components/hole.d.ts.map +1 -0
- package/dist/server-components/hole.js +20 -0
- package/dist/server-components/hole.js.map +1 -0
- package/dist/server-components/html-policy.d.ts.map +1 -1
- package/dist/server-components/html-policy.js +62 -4
- package/dist/server-components/html-policy.js.map +1 -1
- package/dist/server-components/html-scan.d.ts +17 -0
- package/dist/server-components/html-scan.d.ts.map +1 -0
- package/dist/server-components/html-scan.js +180 -0
- package/dist/server-components/html-scan.js.map +1 -0
- package/dist/server-components/html.d.ts.map +1 -1
- package/dist/server-components/html.js +19 -4
- package/dist/server-components/html.js.map +1 -1
- package/dist/server-components/router-integration.d.ts +4 -1
- package/dist/server-components/router-integration.d.ts.map +1 -1
- package/dist/server-components/router-integration.js +23 -2
- package/dist/server-components/router-integration.js.map +1 -1
- package/dist/server-components/runtime.d.ts +6 -1
- package/dist/server-components/runtime.d.ts.map +1 -1
- package/dist/server-components/runtime.js +86 -28
- package/dist/server-components/runtime.js.map +1 -1
- package/dist/server-components/state.d.ts +3 -1
- package/dist/server-components/state.d.ts.map +1 -1
- package/dist/server-components/state.js +50 -38
- package/dist/server-components/state.js.map +1 -1
- package/dist/server-components/types.d.ts +9 -0
- package/dist/server-components/types.d.ts.map +1 -1
- package/dist/vite.d.ts +5 -1
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +58 -4
- package/dist/vite.js.map +1 -1
- package/package.json +48 -8
- package/src/boundary.ts +77 -5
- package/src/build-plan.ts +3 -0
- package/src/build-vite.ts +2 -0
- package/src/build.ts +19 -1
- package/src/client.ts +147 -10
- package/src/csp.ts +16 -2
- package/src/deferred.ts +11 -5
- package/src/dev-feed.ts +11 -2
- package/src/dev-session.ts +22 -11
- package/src/dev.ts +29 -8
- package/src/diagnostic-catalog.ts +53 -0
- package/src/diagnostic.ts +1 -0
- package/src/fn.ts +24 -7
- package/src/fs.ts +22 -8
- package/src/identity.ts +61 -0
- package/src/index.ts +19 -0
- package/src/internal/cdn/cloudflare.ts +2 -1
- package/src/internal/certified-components.ts +1 -1
- package/src/internal/codegen.ts +87 -8
- package/src/internal/dev-websocket.ts +230 -0
- package/src/internal/hole-runtime.ts +286 -0
- package/src/internal/identity-epoch.ts +235 -0
- package/src/internal/invalidation-contract.ts +35 -0
- package/src/internal/invalidation.ts +213 -0
- package/src/internal/island-bindings.ts +191 -0
- package/src/internal/island-list.ts +92 -0
- package/src/internal/island-mount.ts +68 -0
- package/src/internal/island-owner.ts +20 -0
- package/src/internal/island-resource.ts +76 -0
- package/src/internal/island-signals.ts +249 -0
- package/src/internal/keep-alive-table.ts +72 -0
- package/src/internal/live-contract.ts +106 -0
- package/src/internal/live-queries.ts +60 -0
- package/src/internal/page-events.ts +27 -0
- package/src/internal/page-execution.ts +579 -40
- package/src/internal/ppr/admission.ts +300 -0
- package/src/internal/ppr/canary.ts +122 -0
- package/src/internal/ppr/compile-shell.ts +379 -0
- package/src/internal/ppr/contract.ts +265 -0
- package/src/internal/ppr/frames.ts +170 -0
- package/src/internal/ppr/integration.ts +137 -0
- package/src/internal/ppr/options.ts +221 -0
- package/src/internal/ppr/route-rules.ts +77 -0
- package/src/internal/ppr/runtime.ts +36 -0
- package/src/internal/ppr/server.ts +1764 -0
- package/src/internal/ppr/shell-store.ts +139 -0
- package/src/internal/prerendered-pages.ts +7 -4
- package/src/internal/query-digest.ts +34 -0
- package/src/internal/query-runtime.ts +14 -1
- package/src/internal/query-seam.ts +48 -0
- package/src/internal/render-document.ts +149 -22
- package/src/internal/request-abort.ts +26 -0
- package/src/internal/server-boundary.ts +10 -1
- package/src/internal/share-data.ts +136 -0
- package/src/internal/store-signature.ts +149 -0
- package/src/internal/vite-plugin-compat.ts +2 -2
- package/src/internal/web-app.ts +121 -3
- package/src/islands-swap.ts +283 -0
- package/src/islands.ts +169 -72
- package/src/isr.ts +348 -106
- package/src/keep-alive.ts +1315 -0
- package/src/live/bus.ts +77 -0
- package/src/live/core.ts +52 -0
- package/src/live/history.ts +109 -0
- package/src/live/hub-protocol.ts +133 -0
- package/src/live/hub.ts +615 -0
- package/src/live/keyring.ts +379 -0
- package/src/live/read-capped.ts +36 -0
- package/src/live/revocations.ts +155 -0
- package/src/live/settings.ts +46 -0
- package/src/live-client.ts +973 -0
- package/src/live-hub.ts +658 -0
- package/src/live-redis.ts +259 -0
- package/src/live.ts +1096 -0
- package/src/manifest.ts +274 -6
- package/src/navigation.ts +14 -2
- package/src/plugins/vite-zone-guard.ts +15 -2
- package/src/ppr.ts +153 -0
- package/src/query.ts +147 -20
- package/src/render-seam.ts +35 -0
- package/src/route-types.ts +3 -1
- package/src/router.ts +494 -101
- package/src/server-components/build.ts +9 -3
- package/src/server-components/client.ts +89 -5
- package/src/server-components/hole.ts +23 -0
- package/src/server-components/html-policy.ts +63 -4
- package/src/server-components/html-scan.ts +159 -0
- package/src/server-components/html.ts +18 -4
- package/src/server-components/router-integration.ts +21 -2
- package/src/server-components/runtime.ts +112 -30
- package/src/server-components/state.ts +66 -44
- package/src/server-components/types.ts +16 -0
- package/src/vite.ts +75 -6
- package/dist/nano.d.ts +0 -125
- package/dist/nano.d.ts.map +0 -1
- package/dist/nano.js +0 -190
- package/dist/nano.js.map +0 -1
- package/src/nano.ts +0 -246
package/dist/islands.js
CHANGED
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @nifrajs/web/islands - the
|
|
2
|
+
* @nifrajs/web/islands - the islands client runtime: interactivity for server-rendered pages without a
|
|
3
|
+
* framework runtime.
|
|
3
4
|
*
|
|
4
|
-
* An
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* (
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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 {
|
|
18
|
-
|
|
22
|
+
import { bindScope } from "./internal/island-bindings.js";
|
|
23
|
+
import { mountIsland } from "./internal/island-mount.js";
|
|
24
|
+
import { owned } from "./internal/island-owner.js";
|
|
25
|
+
import { signal } from "./internal/island-signals.js";
|
|
26
|
+
import { PAGE_HIDE_EVENT, PAGE_SHOW_EVENT } from "./internal/page-events.js";
|
|
27
|
+
export { MAX_MEDIA_QUERY_LENGTH, scheduleTrigger, } from "@nifrajs/island-trigger";
|
|
28
|
+
export { bindList, } from "./internal/island-list.js";
|
|
29
|
+
export { resource } from "./internal/island-resource.js";
|
|
30
|
+
export { batch, computed, effect, signal, untrack, } from "./internal/island-signals.js";
|
|
19
31
|
/**
|
|
20
32
|
* Author a typed enhancer. Pure identity at runtime (zero cost, tree-shaken away) - its only job is
|
|
21
|
-
* to pin the
|
|
33
|
+
* to pin the props shape so `el` and `props` are typed inside the body and the enhancer is
|
|
22
34
|
* assignable to `mountIslands`. Prefer this over an inline arrow whenever an island reads props:
|
|
23
35
|
*
|
|
24
36
|
* const counter = defineIsland<{ start: number }>((el, props) => {
|
|
@@ -30,80 +42,128 @@ export { MAX_MEDIA_QUERY_LENGTH, scheduleTrigger };
|
|
|
30
42
|
* })
|
|
31
43
|
* mountIslands({ counter })
|
|
32
44
|
*
|
|
33
|
-
* The props type is a contract, not a validator - `data-props` is JSON authored by your own
|
|
34
|
-
* it is trusted framing, not user input. Keep the enhancer body imperative: read the DOM,
|
|
35
|
-
* listeners, return cleanup.
|
|
45
|
+
* The props type is a contract, not a validator - `data-island-props` is JSON authored by your own
|
|
46
|
+
* SSR, so it is trusted framing, not user input. Keep the enhancer body imperative: read the DOM,
|
|
47
|
+
* wire listeners, return cleanup.
|
|
36
48
|
*/
|
|
37
49
|
export function defineIsland(enhancer) {
|
|
38
50
|
return enhancer;
|
|
39
51
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
52
|
+
const onPage = (type, el, callback) => {
|
|
53
|
+
if (typeof document === "undefined")
|
|
54
|
+
return () => { };
|
|
55
|
+
const listener = (event) => {
|
|
56
|
+
if (event.target instanceof Node && event.target.contains(el))
|
|
57
|
+
callback();
|
|
58
|
+
};
|
|
59
|
+
document.addEventListener(type, listener);
|
|
60
|
+
return () => document.removeEventListener(type, listener);
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Run `callback` each time the `keepAlive` page `el` renders in is hidden behind another page, just
|
|
64
|
+
* before it leaves the document. An island in a kept page stays mounted, and its timers and window
|
|
65
|
+
* listeners keep running, while the page is hidden: pause them here. Returns its removal - hand it back
|
|
66
|
+
* as part of the enhancer's cleanup. Never runs outside a kept page.
|
|
67
|
+
*
|
|
68
|
+
* const clock = defineIsland((el) => {
|
|
69
|
+
* let timer = setInterval(tick, 1000)
|
|
70
|
+
* const hide = onPageHide(el, () => clearInterval(timer))
|
|
71
|
+
* const show = onPageShow(el, () => { timer = setInterval(tick, 1000) })
|
|
72
|
+
* return () => { hide(); show(); clearInterval(timer) }
|
|
73
|
+
* })
|
|
74
|
+
*/
|
|
75
|
+
export function onPageHide(el, callback) {
|
|
76
|
+
return onPage(PAGE_HIDE_EVENT, el, callback);
|
|
77
|
+
}
|
|
78
|
+
/** Run `callback` each time the `keepAlive` page `el` renders in is shown again; returns its removal. */
|
|
79
|
+
export function onPageShow(el, callback) {
|
|
80
|
+
return onPage(PAGE_SHOW_EVENT, el, callback);
|
|
51
81
|
}
|
|
52
82
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
83
|
+
* The binding tier: `setup` creates the island's state and returns the event handlers its markup
|
|
84
|
+
* names; the island's `data-bind-*` attributes then bind them.
|
|
85
|
+
*
|
|
86
|
+
* data-bind-text="count" data-bind-show="open" data-bind-class="active:open"
|
|
87
|
+
* data-bind-attr="aria-expanded:open" data-bind-value="query" data-bind-on="click:add"
|
|
88
|
+
*
|
|
89
|
+
* Attribute values are signal and handler names, never code; an unknown name warns once and the
|
|
90
|
+
* server-rendered content stays as it is. A binding belongs to its nearest island.
|
|
91
|
+
*
|
|
92
|
+
* A setup or binding that throws stops everything the island started before the error reaches
|
|
93
|
+
* `mountIslands`. On unmount every cleanup runs; one that throws is logged and the rest still run.
|
|
58
94
|
*/
|
|
59
|
-
export function
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
catch (err) {
|
|
92
|
-
// One island's failure must not take down the others; surface it without throwing.
|
|
93
|
-
console.error(`[nifra/islands] enhancer "${id}" failed:`, err);
|
|
95
|
+
export function bindIsland(setup) {
|
|
96
|
+
return (root, props) => {
|
|
97
|
+
const stops = [];
|
|
98
|
+
let live = true;
|
|
99
|
+
const seeded = typeof props === "object" && props !== null ? props : {};
|
|
100
|
+
// No prototype: a state key like `constructor` is an entry like any other.
|
|
101
|
+
const signals = Object.create(null);
|
|
102
|
+
const ctx = {
|
|
103
|
+
root,
|
|
104
|
+
props,
|
|
105
|
+
state(key, fallback) {
|
|
106
|
+
signals[key] ??= signal(Object.hasOwn(seeded, key) ? seeded[key] : fallback);
|
|
107
|
+
// biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: each key's signal is created once, from this call's type
|
|
108
|
+
return signals[key];
|
|
109
|
+
},
|
|
110
|
+
onDispose: (fn) => {
|
|
111
|
+
if (live)
|
|
112
|
+
stops.push(fn);
|
|
113
|
+
else
|
|
114
|
+
fn();
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
const dispose = () => {
|
|
118
|
+
live = false;
|
|
119
|
+
for (let stop = stops.pop(); stop !== undefined; stop = stops.pop()) {
|
|
120
|
+
try {
|
|
121
|
+
stop();
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
console.error("[nifra/islands] cleanup failed:", err);
|
|
125
|
+
}
|
|
94
126
|
}
|
|
95
127
|
};
|
|
96
|
-
|
|
128
|
+
try {
|
|
129
|
+
// Owned, so a binding whose first run throws is registered before it throws.
|
|
130
|
+
owned(stops, () => bindScope(root, { signals, handlers: setup(ctx) ?? {} }, stops));
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
dispose();
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
return dispose;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The `data-island-props` value for `props`: JSON. Emit it through an escaping renderer into a quoted
|
|
141
|
+
* attribute (`data-island-props="${...}"`): unquoted, a space in the JSON ends the value and the rest
|
|
142
|
+
* parses as attributes.
|
|
143
|
+
*/
|
|
144
|
+
export function islandProps(props) {
|
|
145
|
+
return JSON.stringify(props);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Find every `[data-island]` element under `root` (default `document`) and enhance each with the
|
|
149
|
+
* matching enhancer, honoring its `data-island-strategy`. An island whose id has no enhancer, or that
|
|
150
|
+
* is already mounted, is left alone, so calling again after a soft navigation mounts only new hosts.
|
|
151
|
+
* An enhancer that throws is isolated - it never blocks the others. Every effect, list binding and
|
|
152
|
+
* resource an enhancer creates is owned by its island. Returns a disposer that cancels pending
|
|
153
|
+
* triggers and tears down every island it mounted (call it on soft-nav teardown).
|
|
154
|
+
*/
|
|
155
|
+
export function mountIslands(
|
|
156
|
+
// `never` admits an enhancer of any props type: each one's props are its own island's JSON.
|
|
157
|
+
enhancers, options = {}) {
|
|
158
|
+
const disposers = [];
|
|
159
|
+
for (const el of (options.root ?? document).querySelectorAll("[data-island]:not([data-island-ignore],[data-island-ignore] *)")) {
|
|
160
|
+
const dispose = mountIsland(el, enhancers);
|
|
161
|
+
if (dispose !== undefined)
|
|
162
|
+
disposers.push(dispose);
|
|
97
163
|
}
|
|
98
164
|
return () => {
|
|
99
|
-
for (const dispose of disposers)
|
|
100
|
-
|
|
101
|
-
dispose();
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
// best-effort teardown - a failing cleanup must not block the rest
|
|
105
|
-
}
|
|
106
|
-
}
|
|
165
|
+
for (const dispose of disposers.splice(0))
|
|
166
|
+
dispose();
|
|
107
167
|
};
|
|
108
168
|
}
|
|
109
169
|
/**
|
package/dist/islands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"islands.js","sourceRoot":"","sources":["../src/islands.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"islands.js","sourceRoot":"","sources":["../src/islands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAe,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE5E,OAAO,EAEL,sBAAsB,EACtB,eAAe,GAChB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAEL,QAAQ,GAGT,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAqC,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAC3F,OAAO,EACL,KAAK,EAEL,QAAQ,EACR,MAAM,EAEN,MAAM,EACN,OAAO,GACR,MAAM,8BAA8B,CAAA;AAarC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAAc,QAA2B;IACnE,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAW,EAAE,QAAoB,EAAgB,EAAE;IAC/E,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;IACpD,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAQ,EAAE;QACtC,IAAI,KAAK,CAAC,MAAM,YAAY,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,QAAQ,EAAE,CAAA;IAC3E,CAAC,CAAA;IACD,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACzC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC3D,CAAC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,EAAW,EAAE,QAAoB;IAC1D,OAAO,MAAM,CAAC,eAAe,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;AAC9C,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,UAAU,CAAC,EAAW,EAAE,QAAoB;IAC1D,OAAO,MAAM,CAAC,eAAe,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;AAC9C,CAAC;AAoBD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CACxB,KAAmF;IAEnF,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,KAAK,GAAsB,EAAE,CAAA;QACnC,IAAI,IAAI,GAAG,IAAI,CAAA;QACf,MAAM,MAAM,GAA4B,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAChG,2EAA2E;QAC3E,MAAM,OAAO,GAAoC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACpE,MAAM,GAAG,GAAyB;YAChC,IAAI;YACJ,KAAK;YACL,KAAK,CAAI,GAAW,EAAE,QAAW;gBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;gBAC5E,0HAA0H;gBAC1H,OAAO,OAAO,CAAC,GAAG,CAAc,CAAA;YAClC,CAAC;YACD,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE;gBAChB,IAAI,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;;oBACnB,EAAE,EAAE,CAAA;YACX,CAAC;SACF,CAAA;QACD,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,GAAG,KAAK,CAAA;YACZ,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,KAAK,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;gBACpE,IAAI,CAAC;oBACH,IAAI,EAAE,CAAA;gBACR,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAA;gBACvD,CAAC;YACH,CAAC;QACH,CAAC,CAAA;QACD,IAAI,CAAC;YACH,6EAA6E;YAC7E,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,CAAA;YACT,MAAM,GAAG,CAAA;QACX,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAA8B;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY;AAC1B,4FAA4F;AAC5F,SAA0D,EAC1D,UAA0C,EAAE;IAE5C,MAAM,SAAS,GAAsB,EAAE,CAAA;IACvC,KAAK,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,gBAAgB,CAC1D,gEAAgE,CACjE,EAAE,CAAC;QACF,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;QAC1C,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAA;IACtD,CAAC,CAAA;AACH,CAAC;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,eAAe;IAM7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8C,CAAA;IACtE,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,MAAM;YACf,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAM;YAClC,wFAAwF;YACxF,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,CAAC;oBAAC,OAA4C,CAAC,MAAM,CAAC,CAAA;gBACxD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;gBACjF,CAAC;YACH,CAAC;QACH,CAAC;QACD,EAAE,CAAC,IAAI,EAAE,OAAO;YACd,IAAI,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;gBACpB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YAC9B,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,OAAkC,CAAC,CAAA;YAChD,OAAO,GAAG,EAAE;gBACV,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC9B,IAAI,GAAG,KAAK,SAAS;oBAAE,OAAM;gBAC7B,GAAG,CAAC,MAAM,CAAC,OAAkC,CAAC,CAAA;gBAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;oBAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC3C,CAAC,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/isr.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type InvalidationReport } from "./internal/invalidation.js";
|
|
1
2
|
/** A cached SSR response - the bytes + metadata a {@link CacheStore} persists. */
|
|
2
3
|
export interface CachedResponse {
|
|
3
4
|
/** The rendered document (UTF-8 HTML, fully buffered). */
|
|
@@ -34,7 +35,9 @@ export interface CacheStore {
|
|
|
34
35
|
* The current point in this store's purge order. `withISR` takes one before each render and hands it
|
|
35
36
|
* back as {@link CachedResponse.fence}, and `set` skips that entry when its key or one of its tags
|
|
36
37
|
* was purged after the point. Without it, a purge that lands while a page renders is undone when the
|
|
37
|
-
* render stores the page it built from data read before the purge.
|
|
38
|
+
* render stores the page it built from data read before the purge. A store whose purges reach other
|
|
39
|
+
* instances late must also check on read, as {@link KVCacheStore} does: `set` there cannot see a
|
|
40
|
+
* purge that has not arrived yet.
|
|
38
41
|
*/
|
|
39
42
|
readonly fence?: () => number | Promise<number>;
|
|
40
43
|
}
|
|
@@ -46,6 +49,10 @@ export declare function serializeISRTags(tags: readonly string[]): string | unde
|
|
|
46
49
|
/** What a `revalidateTags` function is given: the URL and route params only, both already public. */
|
|
47
50
|
export interface RevalidateTagsInput {
|
|
48
51
|
readonly params: Readonly<Record<string, string>>;
|
|
52
|
+
/**
|
|
53
|
+
* The request's URL. On a partially prerendered route and its shared holes, the shell's: the
|
|
54
|
+
* configured origin, the path and the declared variations, never the visitor's Host or other query.
|
|
55
|
+
*/
|
|
49
56
|
readonly url: URL;
|
|
50
57
|
}
|
|
51
58
|
/**
|
|
@@ -132,7 +139,8 @@ export interface KVCacheStoreOptions {
|
|
|
132
139
|
* binding) - the production-grade shared/durable store ISR wants: cached pages and on-demand purges
|
|
133
140
|
* hold *across* worker instances (unlike the per-instance {@link MemoryCacheStore}). Entries serialize
|
|
134
141
|
* to JSON; every read is validated before it's trusted (a malformed/version-skewed entry is treated as
|
|
135
|
-
* a miss). Construct it in your Workers `fetch` from the binding: `new KVCacheStore(env.ISR_CACHE)
|
|
142
|
+
* a miss). Construct it in your Workers `fetch` from the binding: `new KVCacheStore(env.ISR_CACHE)`,
|
|
143
|
+
* and give `withISR` the `storeSecret` it signs these pages with.
|
|
136
144
|
*
|
|
137
145
|
* Cloudflare is the default, not a requirement: {@link KVNamespaceLike} is three structural methods,
|
|
138
146
|
* so a Redis, Deno KV, or Upstash binding satisfies it (pass `minExpirationTtl` for their TTL floor).
|
|
@@ -142,17 +150,23 @@ export interface KVCacheStoreOptions {
|
|
|
142
150
|
export declare class KVCacheStore implements CacheStore {
|
|
143
151
|
private readonly kv;
|
|
144
152
|
private readonly putOptions;
|
|
153
|
+
private readonly pathEpochOptions;
|
|
145
154
|
constructor(kv: KVNamespaceLike, options?: KVCacheStoreOptions);
|
|
146
155
|
get(key: string): Promise<CachedResponse | undefined>;
|
|
147
|
-
/** Wall-clock time, so purges on any instance order against it. KV is eventually consistent, so
|
|
148
|
-
*
|
|
156
|
+
/** Wall-clock time, so purges on any instance order against it. KV is eventually consistent, so
|
|
157
|
+
* `set` refuses only purges this location has already seen; a page stored before a purge reached
|
|
158
|
+
* its location keeps the older epoch and reads as a miss once the purge arrives. */
|
|
149
159
|
fence(): number;
|
|
150
160
|
set(key: string, value: CachedResponse): Promise<void>;
|
|
151
|
-
/**
|
|
152
|
-
*
|
|
161
|
+
/** Moves the path's epoch and leaves the page: a page stored under the old epoch reads as a miss,
|
|
162
|
+
* even one another location stored before this purge reached it, and `set` refuses a render begun
|
|
163
|
+
* before the purge. */
|
|
153
164
|
delete(key: string): Promise<void>;
|
|
154
165
|
invalidateTag(tag: string): Promise<void>;
|
|
155
166
|
private tagKey;
|
|
167
|
+
/** The page key under a prefix, or its digest when that would pass KV's key limit. */
|
|
168
|
+
private pathKey;
|
|
169
|
+
private pathEpoch;
|
|
156
170
|
}
|
|
157
171
|
/** Minimal platform shape `withISR` needs - just `waitUntil` (edge runtimes extend the response
|
|
158
172
|
* lifetime so background regeneration finishes). Off-edge it's absent and regen runs fire-and-forget. */
|
|
@@ -184,6 +198,19 @@ export declare function openCacheChannel(app: object): void;
|
|
|
184
198
|
export declare function withoutCacheChannel(res: Response): Response;
|
|
185
199
|
export interface ISROptions {
|
|
186
200
|
readonly store: CacheStore;
|
|
201
|
+
/**
|
|
202
|
+
* Signs every page written to `store` and checks the signature on every read, so whoever else can
|
|
203
|
+
* write the store (another service on the same KV namespace, a leaked token) cannot hand visitors a
|
|
204
|
+
* page this app did not render. Required for every store but a {@link MemoryCacheStore}, whose
|
|
205
|
+
* pages never leave the process and stay unsigned. The same in every process, at least 32
|
|
206
|
+
* characters, and random: generate it, such as 32 random bytes as hex, since a guessable secret
|
|
207
|
+
* can be found from any signed page and then signs pages of its own. A page whose signature is
|
|
208
|
+
* missing or wrong reads as a miss and renders again, so a new secret only empties the cache. It
|
|
209
|
+
* cannot stop a store writer from deleting pages, or from putting back an older page this app
|
|
210
|
+
* stored for the same key. That page keeps its age: still within its freshness window, it is a hit
|
|
211
|
+
* until the window ends; past it, it serves stale and regenerates.
|
|
212
|
+
*/
|
|
213
|
+
readonly storeSecret?: string;
|
|
187
214
|
/** Default freshness window (**seconds**) for a cached page; older ⇒ stale (served, regenerated
|
|
188
215
|
* behind). A route overrides it per-page via `export const revalidate` (surfaced as the
|
|
189
216
|
* `x-nifra-isr-revalidate` response header). */
|
|
@@ -194,7 +221,10 @@ export interface ISROptions {
|
|
|
194
221
|
* so host-routed apps do not share entries across tenants. Return `null` to bypass the cache for
|
|
195
222
|
* this request (it goes straight to the app, uncached). Replaces `query` entirely. Under the default
|
|
196
223
|
* key a request carrying `Authorization` or a cookie outside `anonymousCookies` never reads the
|
|
197
|
-
* store; a custom key takes that decision over, so include whatever identifies the visitor in it.
|
|
224
|
+
* store; a custom key takes that decision over, so include whatever identifies the visitor in it.
|
|
225
|
+
* An action's `revalidate(paths)` keys each path with the action request's own headers, so it purges
|
|
226
|
+
* the variant that client reads; a variant keyed on another header value (another language) is not
|
|
227
|
+
* reached - tag those pages and revalidate the tag. */
|
|
198
228
|
readonly key?: (req: Request) => string | null;
|
|
199
229
|
/**
|
|
200
230
|
* Cookie names that never change the page, such as a consent or analytics cookie. Under the default
|
|
@@ -217,10 +247,11 @@ export interface ISROptions {
|
|
|
217
247
|
* fresh, and a draft render is never written to the store (it can't poison the public cache). */
|
|
218
248
|
readonly draftSecret?: string;
|
|
219
249
|
/**
|
|
220
|
-
* Called when a store call fails: it throws, rejects, or outlives {@link storeTimeoutMs}
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
*
|
|
250
|
+
* Called when a store call fails: it throws, rejects, or outlives {@link storeTimeoutMs}, or (op
|
|
251
|
+
* `"verify"`) a page it returns fails its {@link storeSecret} signature check. The request is served
|
|
252
|
+
* without the cache either way - a failed read is a miss, a failed write still returns the rendered
|
|
253
|
+
* page, a failed regeneration keeps the stale entry - so a store outage never changes a status.
|
|
254
|
+
* Default: one `console.error` line per operation per minute, never naming the cache key.
|
|
224
255
|
*/
|
|
225
256
|
readonly onStoreError?: (error: unknown, info: {
|
|
226
257
|
readonly op: ISRStoreOp;
|
|
@@ -230,9 +261,25 @@ export interface ISROptions {
|
|
|
230
261
|
* the request; set it when the store is a network service.
|
|
231
262
|
*/
|
|
232
263
|
readonly storeTimeoutMs?: number;
|
|
264
|
+
/**
|
|
265
|
+
* Caches below the pages whose entries carry the same tags, such as a `@nifrajs/cache` holding loader
|
|
266
|
+
* data. An action's `revalidate(paths, data, { tags })` invalidates them first, then this store, then
|
|
267
|
+
* publishes to live pages, then purges `cdn`; a cache that fails stops the rest, so no client reloads
|
|
268
|
+
* stale data.
|
|
269
|
+
*/
|
|
270
|
+
readonly dataCaches?: readonly {
|
|
271
|
+
invalidateTag(tag: string): unknown;
|
|
272
|
+
}[];
|
|
273
|
+
/** A CDN an action's invalidation purges last (a `@nifrajs/web/cdn` provider). */
|
|
274
|
+
readonly cdn?: CdnPurgeTarget;
|
|
275
|
+
/**
|
|
276
|
+
* An action's invalidation that still failed after its retries; the action's own answer never
|
|
277
|
+
* changes. Default: one `console.error` line naming the operation id and stage.
|
|
278
|
+
*/
|
|
279
|
+
readonly onInvalidationError?: (report: InvalidationReport) => void;
|
|
233
280
|
}
|
|
234
281
|
/** The store operation an {@link ISROptions.onStoreError} report is about. */
|
|
235
|
-
export type ISRStoreOp = "get" | "set" | "delete" | "fence";
|
|
282
|
+
export type ISRStoreOp = "get" | "set" | "delete" | "fence" | "verify";
|
|
236
283
|
/** Which query parameters an ISR key carries - see {@link ISROptions.query}. */
|
|
237
284
|
export type ISRQuery = "bypass" | "all" | readonly string[];
|
|
238
285
|
/** The default key for a URL under a `query` policy, or `null` when the URL must bypass the cache. */
|
|
@@ -240,7 +287,7 @@ export declare const urlKeyOf: (query?: ISRQuery) => ((url: URL) => string | nul
|
|
|
240
287
|
/**
|
|
241
288
|
* Whether `res` may be stored by a shared cache and served to anyone requesting `req`'s URL: a
|
|
242
289
|
* full-document `GET` 200 `text/html` with no Set-Cookie, no `private`/`no-store`, no `Vary` beyond
|
|
243
|
-
* the data
|
|
290
|
+
* the data/swap headers, and, for a request carrying a cookie or Authorization or accepted by an
|
|
244
291
|
* authentication stage, an explicit `public`.
|
|
245
292
|
* The one rule both `withISR` and `@nifrajs/web/cdn` cache by.
|
|
246
293
|
*/
|
|
@@ -303,6 +350,13 @@ export interface RevalidateEndpointOptions {
|
|
|
303
350
|
readonly dataCaches?: readonly {
|
|
304
351
|
invalidateTag(tag: string): unknown;
|
|
305
352
|
}[];
|
|
353
|
+
/**
|
|
354
|
+
* The app's live runtime: a purge also tells live pages watching a purged tag to reload, after the
|
|
355
|
+
* caches and before the CDN. A publish that fails answers `502` with `origin: "done"`.
|
|
356
|
+
*/
|
|
357
|
+
readonly live?: {
|
|
358
|
+
publish(...keys: string[]): Promise<void>;
|
|
359
|
+
};
|
|
306
360
|
}
|
|
307
361
|
/**
|
|
308
362
|
* An **on-demand revalidation** (purge) endpoint - a `fetch` handler that drops cached pages by path
|
package/dist/isr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isr.d.ts","sourceRoot":"","sources":["../src/isr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isr.d.ts","sourceRoot":"","sources":["../src/isr.ts"],"names":[],"mappings":"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"}
|