@nifrajs/web 5.5.1 → 5.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +243 -0
- package/README.md +21 -11
- 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 +10 -0
- package/dist/build.js.map +1 -1
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +174 -23
- 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 +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- 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 +73 -10
- 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 +180 -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 +101 -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 +16 -1
- package/dist/internal/page-execution.d.ts.map +1 -1
- package/dist/internal/page-execution.js +432 -31
- package/dist/internal/page-execution.js.map +1 -1
- package/dist/internal/parity.d.ts +3 -0
- package/dist/internal/parity.d.ts.map +1 -1
- package/dist/internal/parity.js +28 -5
- package/dist/internal/parity.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 +35 -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 +1409 -0
- package/dist/internal/ppr/server.js.map +1 -0
- package/dist/internal/ppr/shell-store.d.ts +39 -0
- package/dist/internal/ppr/shell-store.d.ts.map +1 -0
- package/dist/internal/ppr/shell-store.js +106 -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/present.d.ts +11 -0
- package/dist/internal/present.d.ts.map +1 -0
- package/dist/internal/present.js +13 -0
- package/dist/internal/present.js.map +1 -0
- 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 +34 -64
- package/dist/internal/render-document.d.ts.map +1 -1
- package/dist/internal/render-document.js +82 -64
- 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/status-page.d.ts +68 -0
- package/dist/internal/status-page.d.ts.map +1 -0
- package/dist/internal/status-page.js +66 -0
- package/dist/internal/status-page.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 +26 -0
- package/dist/internal/web-app.d.ts.map +1 -1
- package/dist/internal/web-app.js +79 -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 +1102 -0
- package/dist/keep-alive.js.map +1 -0
- package/dist/live/bus.d.ts +70 -0
- package/dist/live/bus.d.ts.map +1 -0
- package/dist/live/bus.js +55 -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 +185 -0
- package/dist/live/hub.d.ts.map +1 -0
- package/dist/live/hub.js +544 -0
- package/dist/live/hub.js.map +1 -0
- package/dist/live/keyring.d.ts +92 -0
- package/dist/live/keyring.d.ts.map +1 -0
- package/dist/live/keyring.js +265 -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 +878 -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 +60 -0
- package/dist/live-redis.d.ts.map +1 -0
- package/dist/live-redis.js +212 -0
- package/dist/live-redis.js.map +1 -0
- package/dist/live.d.ts +150 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +972 -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 +32 -0
- package/dist/render-seam.d.ts.map +1 -1
- package/dist/render-seam.js +7 -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 +416 -129
- 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/definition.d.ts.map +1 -1
- package/dist/server-components/definition.js +2 -1
- package/dist/server-components/definition.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 +88 -29
- 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/server-components/vite.d.ts.map +1 -1
- package/dist/server-components/vite.js +26 -9
- package/dist/server-components/vite.js.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 +20 -1
- package/src/client.ts +183 -23
- 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 +20 -4
- package/src/internal/cdn/cloudflare.ts +2 -1
- package/src/internal/certified-components.ts +1 -1
- package/src/internal/codegen.ts +95 -9
- package/src/internal/dev-websocket.ts +230 -0
- package/src/internal/hole-runtime.ts +286 -0
- package/src/internal/identity-epoch.ts +239 -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 +111 -0
- package/src/internal/live-queries.ts +60 -0
- package/src/internal/page-events.ts +27 -0
- package/src/internal/page-execution.ts +605 -45
- package/src/internal/parity.ts +35 -6
- 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 +39 -0
- package/src/internal/ppr/server.ts +1766 -0
- package/src/internal/ppr/shell-store.ts +152 -0
- package/src/internal/prerendered-pages.ts +7 -4
- package/src/internal/present.ts +20 -0
- 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 +158 -113
- 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/status-page.ts +95 -0
- package/src/internal/store-signature.ts +149 -0
- package/src/internal/vite-plugin-compat.ts +2 -2
- package/src/internal/web-app.ts +123 -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 +1354 -0
- package/src/live/bus.ts +104 -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 +620 -0
- package/src/live/keyring.ts +384 -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 +1011 -0
- package/src/live-hub.ts +658 -0
- package/src/live-redis.ts +284 -0
- package/src/live.ts +1257 -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 +37 -0
- package/src/route-types.ts +3 -1
- package/src/router.ts +534 -132
- package/src/server-components/build.ts +9 -3
- package/src/server-components/client.ts +89 -5
- package/src/server-components/definition.ts +2 -1
- 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 +114 -31
- package/src/server-components/state.ts +66 -44
- package/src/server-components/types.ts +16 -0
- package/src/server-components/vite.ts +33 -14
- 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
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
/** Modules whose exports become client stubs: `todos.fn.ts`, `x.fn.mjs`, or the extensionless `foo.fn`. */
|
|
13
13
|
export declare const SERVER_FN_MODULE: RegExp;
|
|
14
|
+
/** A server-function namespace: lowercase, dot/dash separated, so a mount cannot invent a path. */
|
|
15
|
+
export declare const SERVER_FN_NAMESPACE: RegExp;
|
|
14
16
|
/**
|
|
15
17
|
* The namespace a `*.fn.ts` module is mounted under: its filename without the `.fn` suffix.
|
|
16
18
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-boundary.d.ts","sourceRoot":"","sources":["../../src/internal/server-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,2GAA2G;AAC3G,eAAO,MAAM,gBAAgB,QAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"server-boundary.d.ts","sourceRoot":"","sources":["../../src/internal/server-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,2GAA2G;AAC3G,eAAO,MAAM,gBAAgB,QAA2B,CAAA;AACxD,mGAAmG;AACnG,eAAO,MAAM,mBAAmB,QAAkC,CAAA;AAoFlE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU1D;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5D;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAwC9E;AAMD,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKtE"}
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
/** Modules whose exports become client stubs: `todos.fn.ts`, `x.fn.mjs`, or the extensionless `foo.fn`. */
|
|
13
13
|
export const SERVER_FN_MODULE = /\.fn(\.[cm]?[jt]sx?)?$/;
|
|
14
|
+
/** A server-function namespace: lowercase, dot/dash separated, so a mount cannot invent a path. */
|
|
15
|
+
export const SERVER_FN_NAMESPACE = /^[a-z0-9]+(?:[-.][a-z0-9]+)*$/;
|
|
14
16
|
import { jsStringLiteral } from "./js-string.js";
|
|
15
17
|
import { DATE_TAG, REVIVE_DATES_SOURCE } from "./revive-dates.js";
|
|
16
18
|
// ---------------------------------------------------------------------------------------------------
|
|
@@ -104,7 +106,12 @@ function stringEnd(source, start) {
|
|
|
104
106
|
*/
|
|
105
107
|
export function serverFnNamespace(filePath) {
|
|
106
108
|
const base = filePath.replaceAll("\\", "/").split("/").pop() ?? "";
|
|
107
|
-
|
|
109
|
+
const namespace = base.replace(SERVER_FN_MODULE, "");
|
|
110
|
+
// `serverFunctions()` refuses this namespace, so a stub calling it could never reach a function.
|
|
111
|
+
if (!SERVER_FN_NAMESPACE.test(namespace)) {
|
|
112
|
+
throw new Error(`[nifra/fn] ${base} names the server-function namespace ${JSON.stringify(namespace)}, which serverFunctions() refuses - name the file in lowercase dot/dash segments (todo-items.fn.ts).`);
|
|
113
|
+
}
|
|
114
|
+
return namespace;
|
|
108
115
|
}
|
|
109
116
|
/** The server functions a module declares, in source order. */
|
|
110
117
|
export function scanServerFnExports(source) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-boundary.js","sourceRoot":"","sources":["../../src/internal/server-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,2GAA2G;AAC3G,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"server-boundary.js","sourceRoot":"","sources":["../../src/internal/server-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,2GAA2G;AAC3G,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAA;AACxD,mGAAmG;AACnG,MAAM,CAAC,MAAM,mBAAmB,GAAG,+BAA+B,CAAA;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEjE,sGAAsG;AACtG,4EAA4E;AAC5E,sGAAsG;AAEtG;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;2FAI2F;AAC3F,MAAM,WAAW,GACf,kFAAkF,CAAA;AACpF;;0FAE0F;AAC1F,MAAM,QAAQ,GAAG,oBAAoB,CAAA;AACrC;;;;yFAIyF;AACzF,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACtB,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjD,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAC1B,CAAC;aAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YACzC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;YACrC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;YAC5C,QAAQ,GAAG,CAAC,CAAA;QACd,CAAC;aAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAC3C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;YACrC,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA,CAAC,0BAA0B;YACvE,QAAQ,GAAG,CAAC,CAAA;QACd,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,CAAA;QACL,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACvB,CAAC;AAED;4FAC4F;AAC5F,SAAS,SAAS,CAAC,MAAc,EAAE,KAAa;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IACjB,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACtB,IAAI,IAAI,KAAK,IAAI;YAAE,CAAC,IAAI,CAAC,CAAA;aACpB,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,CAAA;aAChC,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,CAAC,CAAA;;YAC5C,CAAC,EAAE,CAAA;IACV,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;IACpD,iGAAiG;IACjG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,cAAc,IAAI,wCAAwC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,sGAAsG,CAC1L,CAAA;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAA;IACxE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;IACjD,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,2FAA2F;YACzF,+FAA+F;YAC/F,wFAAwF;YACxF,kGAAkG,CACrG,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,SAAiB;IACpE,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,KAAK;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,IAAI,6BAA6B,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;SAC/F,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,OAAO;sBACa,eAAe,CAAC,cAAc,SAAS,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA2BrC,QAAQ;;;EAGjC,mBAAmB;;EAEnB,KAAK;CACN,CAAA;AACD,CAAC;AAED,sGAAsG;AACtG,yEAAyE;AACzE,sGAAsG;AAEtG,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAAC,MAA0B;IAC5D,MAAM,UAAU,GAAG,MAAM,IAAI,SAAS,CAAA;IACtC,gGAAgG;IAChG,0FAA0F;IAC1F,OAAO,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,UAAU,CAAA;AACvE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural sharing for reloaded route data. Plain objects and arrays compare by content and Dates
|
|
3
|
+
* by time; other values and symbol-bearing objects come from `next`. Non-tree client data stays
|
|
4
|
+
* intact. `plainJson` is only for freshly parsed JSON, before any client-loader transformation.
|
|
5
|
+
*
|
|
6
|
+
* Array elements with an `id` pair by it before position, preserving unchanged rows on a prepend or
|
|
7
|
+
* reorder. An array whose first 32 elements keep nothing is taken whole, without a full old-row index.
|
|
8
|
+
*/
|
|
9
|
+
export declare function shareData<T>(prev: unknown, next: T, plainJson?: boolean): T;
|
|
10
|
+
//# sourceMappingURL=share-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-data.d.ts","sourceRoot":"","sources":["../../src/internal/share-data.ts"],"names":[],"mappings":"AAyBA;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,CAAC,CAAA"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
const isPlain = (value) => typeof value === "object" && value !== null && Object.getPrototypeOf(value) === Object.prototype;
|
|
2
|
+
const TOO_DEEP = Symbol("data too deep");
|
|
3
|
+
// Client loaders may return graphs, unlike JSON. Check the whole graph before comparing: a cycle
|
|
4
|
+
// inside a new subtree or beyond the array sample must not acquire copied parents. Shared references
|
|
5
|
+
// and accessors also keep the fresh result intact, rather than changing aliases or invoking getters.
|
|
6
|
+
function isTree(value, seen, depth) {
|
|
7
|
+
if (!Array.isArray(value) && !isPlain(value))
|
|
8
|
+
return true;
|
|
9
|
+
if (depth >= 128 || seen.has(value))
|
|
10
|
+
return false;
|
|
11
|
+
seen.add(value);
|
|
12
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
13
|
+
const field = Object.getOwnPropertyDescriptor(value, key);
|
|
14
|
+
if (field === undefined ||
|
|
15
|
+
!("value" in field) ||
|
|
16
|
+
(!field.enumerable && !(Array.isArray(value) && key === "length")) ||
|
|
17
|
+
!isTree(field.value, seen, depth + 1))
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
export function shareData(prev, next, plainJson = false) {
|
|
23
|
+
if (Object.is(prev, next))
|
|
24
|
+
return prev;
|
|
25
|
+
if (!plainJson && !isTree(next, new Set(), 0))
|
|
26
|
+
return next;
|
|
27
|
+
try {
|
|
28
|
+
return share(prev, next, 0, plainJson);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error === TOO_DEEP)
|
|
32
|
+
return next;
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Client loaders can attach metadata that an enumerable-string-key copy would lose. Parsed JSON has
|
|
37
|
+
// no symbol keys, and the check would cost a third of a reload that changed one row.
|
|
38
|
+
const hasSymbols = (a, b) => Object.getOwnPropertySymbols(a).length > 0 || Object.getOwnPropertySymbols(b).length > 0;
|
|
39
|
+
function share(prev, next, depth, json) {
|
|
40
|
+
if (Object.is(prev, next))
|
|
41
|
+
return prev;
|
|
42
|
+
if (prev instanceof Date)
|
|
43
|
+
return next instanceof Date && prev.getTime() === next.getTime() ? prev : next;
|
|
44
|
+
if (Array.isArray(next)) {
|
|
45
|
+
if (!Array.isArray(prev) || (!json && hasSymbols(prev, next)))
|
|
46
|
+
return next;
|
|
47
|
+
if (depth >= 128)
|
|
48
|
+
throw TOO_DEEP;
|
|
49
|
+
const out = [];
|
|
50
|
+
let same = prev.length === next.length;
|
|
51
|
+
let byId;
|
|
52
|
+
let completeIndex = false;
|
|
53
|
+
// Which old elements a new one took, from the first id lookup on: each pairs at most once, so
|
|
54
|
+
// duplicate ids never put one old object at two places. Every element before that lookup took
|
|
55
|
+
// its own position.
|
|
56
|
+
let taken;
|
|
57
|
+
let kept = 0;
|
|
58
|
+
let i = 0;
|
|
59
|
+
for (const item of next) {
|
|
60
|
+
let old = taken?.[i] === 1 ? undefined : prev[i];
|
|
61
|
+
const id = isPlain(item) ? item.id : undefined;
|
|
62
|
+
if (id !== undefined && !(isPlain(old) && old.id === id)) {
|
|
63
|
+
if (taken === undefined) {
|
|
64
|
+
taken = new Uint8Array(prev.length);
|
|
65
|
+
taken.fill(1, 0, i);
|
|
66
|
+
}
|
|
67
|
+
if (byId === undefined || (i >= 32 && !completeIndex)) {
|
|
68
|
+
// Index only IDs needed by the sample until a kept row makes a full index worthwhile.
|
|
69
|
+
const wanted = i < 32
|
|
70
|
+
? new Set(next.slice(0, 32).map((value) => (isPlain(value) ? value.id : undefined)))
|
|
71
|
+
: undefined;
|
|
72
|
+
completeIndex = wanted === undefined;
|
|
73
|
+
let min = Number.POSITIVE_INFINITY;
|
|
74
|
+
let max = Number.NEGATIVE_INFINITY;
|
|
75
|
+
for (const key of wanted ?? []) {
|
|
76
|
+
if (typeof key !== "number" || Number.isNaN(key)) {
|
|
77
|
+
min = Number.NEGATIVE_INFINITY;
|
|
78
|
+
max = Number.POSITIVE_INFINITY;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
min = Math.min(min, key);
|
|
82
|
+
max = Math.max(max, key);
|
|
83
|
+
}
|
|
84
|
+
byId = new Map();
|
|
85
|
+
for (let at = 0; at < prev.length; at++) {
|
|
86
|
+
const entry = prev[at];
|
|
87
|
+
if (!isPlain(entry))
|
|
88
|
+
continue;
|
|
89
|
+
const entryId = entry.id;
|
|
90
|
+
if (wanted === undefined ||
|
|
91
|
+
((typeof entryId !== "number" || !(entryId < min || entryId > max)) &&
|
|
92
|
+
wanted.has(entryId)))
|
|
93
|
+
byId.set(entryId, at);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const at = byId.get(id);
|
|
97
|
+
old = at === undefined || taken[at] === 1 ? undefined : prev[at];
|
|
98
|
+
if (at !== undefined)
|
|
99
|
+
taken[at] = 1;
|
|
100
|
+
}
|
|
101
|
+
else if (taken !== undefined && i < taken.length && old !== undefined) {
|
|
102
|
+
taken[i] = 1;
|
|
103
|
+
}
|
|
104
|
+
const value = share(old, item, depth + 1, json);
|
|
105
|
+
out.push(value);
|
|
106
|
+
if (value === old)
|
|
107
|
+
kept++;
|
|
108
|
+
else if (i === 31 && kept === 0)
|
|
109
|
+
return next;
|
|
110
|
+
if (value !== prev[i])
|
|
111
|
+
same = false;
|
|
112
|
+
i++;
|
|
113
|
+
}
|
|
114
|
+
return same ? prev : out;
|
|
115
|
+
}
|
|
116
|
+
if (!isPlain(prev) || !isPlain(next) || (!json && hasSymbols(prev, next)))
|
|
117
|
+
return next;
|
|
118
|
+
if (depth >= 128)
|
|
119
|
+
throw TOO_DEEP;
|
|
120
|
+
const keys = Object.keys(next);
|
|
121
|
+
let same = keys.length === Object.keys(prev).length;
|
|
122
|
+
const out = {};
|
|
123
|
+
for (const key of keys) {
|
|
124
|
+
// A parsed payload can own a `__proto__` key, which a copy would turn into its prototype.
|
|
125
|
+
if (key === "__proto__")
|
|
126
|
+
return next;
|
|
127
|
+
const old = prev[key];
|
|
128
|
+
const value = share(old, next[key], depth + 1, json);
|
|
129
|
+
if (value !== old || (old === undefined && !Object.hasOwn(prev, key)))
|
|
130
|
+
same = false;
|
|
131
|
+
out[key] = value;
|
|
132
|
+
}
|
|
133
|
+
return same ? prev : out;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=share-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-data.js","sourceRoot":"","sources":["../../src/internal/share-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The terminal-status helpers and their brand, free of server imports: `@nifrajs/web/client` re-exports
|
|
3
|
+
* them for route helpers the browser also loads, which the root entry would drag `node:crypto` into.
|
|
4
|
+
*/
|
|
5
|
+
/** Derived from the `Headers` constructor rather than the DOM lib's `HeadersInit`: `@nifrajs/web`
|
|
6
|
+
* is consumed from DOM-free programs (the root tsconfig runs `types: ["bun"]`), and naming the DOM
|
|
7
|
+
* type here would break their build. Same workaround as `SSEInit.headers` in core. */
|
|
8
|
+
export type HeadersLike = ConstructorParameters<typeof Headers>[0];
|
|
9
|
+
/**
|
|
10
|
+
* Brand marking a `Response` as a **terminal-status signal** rather than a response to serve verbatim.
|
|
11
|
+
*
|
|
12
|
+
* A loader that throws a bare `Response` has always been passed straight through - that is how
|
|
13
|
+
* `throw redirect(...)` works, and apps rely on it. So "render the `_404` boundary at 404" cannot be
|
|
14
|
+
* expressed by throwing a plain `Response`: the framework would have no way to tell it apart from a
|
|
15
|
+
* hand-rolled body the app wants served exactly as written. The brand is that distinction, and
|
|
16
|
+
* checking it *before* the pass-through is what keeps every existing throw working unchanged.
|
|
17
|
+
*
|
|
18
|
+
* `Symbol.for` matches core's `RESPONSE_RESULT`: a registry symbol survives two copies of this module,
|
|
19
|
+
* which a `unique symbol` would not - and a duplicate-install turning a 404 into a raw 404 body would
|
|
20
|
+
* be a maddening bug to trace.
|
|
21
|
+
*/
|
|
22
|
+
export declare const STATUS_SIGNAL: unique symbol;
|
|
23
|
+
export interface StatusSignal extends Response {
|
|
24
|
+
readonly [STATUS_SIGNAL]: {
|
|
25
|
+
readonly status: number;
|
|
26
|
+
readonly headers?: HeadersLike;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export declare function isStatusSignal(value: unknown): value is StatusSignal;
|
|
30
|
+
/** Options shared by {@link notFound}, {@link gone}, and {@link statusPage}. */
|
|
31
|
+
export interface StatusPageOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Extra headers for the rendered response - `cache-control` above all.
|
|
34
|
+
*
|
|
35
|
+
* The defaults differ by status for a reason: a 404 may be a race with publication, so it wants a
|
|
36
|
+
* short TTL, while a 410 is a promise that the URL is permanently gone and can be cached hard.
|
|
37
|
+
* Getting this wrong is the difference between a crawler dropping a dead URL and re-fetching it
|
|
38
|
+
* for weeks.
|
|
39
|
+
*/
|
|
40
|
+
readonly headers?: HeadersLike;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Render the nearest `_404` page at status **404**. `throw` it from a loader when the record does not
|
|
44
|
+
* exist.
|
|
45
|
+
*
|
|
46
|
+
* This is the fix for the soft 404: a matched route whose loader finds nothing has otherwise no way to
|
|
47
|
+
* answer 404, so the path of least resistance is to return empty data and render "not found" inside a
|
|
48
|
+
* **200**. That looks correct in a browser and is invisible in review, which is why it ships and stays
|
|
49
|
+
* shipped - while search engines penalise it and keep the dead URL indexed.
|
|
50
|
+
*
|
|
51
|
+
* Returns `never`: these throw, so a loader narrows without a redundant `return`, and the type states
|
|
52
|
+
* the thing the "loaders `throw` redirect, actions `return` it" rule already trips people on.
|
|
53
|
+
*/
|
|
54
|
+
export declare function notFound(options?: StatusPageOptions): never;
|
|
55
|
+
/**
|
|
56
|
+
* Render a terminal page at status **410 Gone**. `throw` it from a loader for a record that existed and
|
|
57
|
+
* was deliberately removed - a withdrawn listing, a deleted post.
|
|
58
|
+
*
|
|
59
|
+
* 410 is not a pedantic 404: it tells a crawler to **drop** the URL rather than re-fetch it for weeks
|
|
60
|
+
* on the assumption the 404 was transient. Uses `_410.tsx` if the app has one, otherwise `_404`.
|
|
61
|
+
*/
|
|
62
|
+
export declare function gone(options?: StatusPageOptions): never;
|
|
63
|
+
/**
|
|
64
|
+
* Render a terminal page at any 4xx/5xx status - the escape hatch behind {@link notFound} and
|
|
65
|
+
* {@link gone} (402, 451, …). Uses `_<status>.tsx` if present, otherwise `_404`.
|
|
66
|
+
*/
|
|
67
|
+
export declare function statusPage(status: number, options?: StatusPageOptions): never;
|
|
68
|
+
//# sourceMappingURL=status-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-page.d.ts","sourceRoot":"","sources":["../../src/internal/status-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;sFAEsF;AACtF,MAAM,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AAElE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,eAAwC,CAAA;AAElE,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAA;KAAE,CAAA;CACtF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAiBD,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,iBAAsB,GAAG,KAAK,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,iBAAsB,GAAG,KAAK,CAE3D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,KAAK,CAEjF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The terminal-status helpers and their brand, free of server imports: `@nifrajs/web/client` re-exports
|
|
3
|
+
* them for route helpers the browser also loads, which the root entry would drag `node:crypto` into.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Brand marking a `Response` as a **terminal-status signal** rather than a response to serve verbatim.
|
|
7
|
+
*
|
|
8
|
+
* A loader that throws a bare `Response` has always been passed straight through - that is how
|
|
9
|
+
* `throw redirect(...)` works, and apps rely on it. So "render the `_404` boundary at 404" cannot be
|
|
10
|
+
* expressed by throwing a plain `Response`: the framework would have no way to tell it apart from a
|
|
11
|
+
* hand-rolled body the app wants served exactly as written. The brand is that distinction, and
|
|
12
|
+
* checking it *before* the pass-through is what keeps every existing throw working unchanged.
|
|
13
|
+
*
|
|
14
|
+
* `Symbol.for` matches core's `RESPONSE_RESULT`: a registry symbol survives two copies of this module,
|
|
15
|
+
* which a `unique symbol` would not - and a duplicate-install turning a 404 into a raw 404 body would
|
|
16
|
+
* be a maddening bug to trace.
|
|
17
|
+
*/
|
|
18
|
+
export const STATUS_SIGNAL = Symbol.for("nifra.web.status-signal");
|
|
19
|
+
export function isStatusSignal(value) {
|
|
20
|
+
return value instanceof Response && STATUS_SIGNAL in value;
|
|
21
|
+
}
|
|
22
|
+
function statusSignal(status, options) {
|
|
23
|
+
if (!Number.isInteger(status) || status < 400 || status > 599) {
|
|
24
|
+
throw new Error(`[nifra/web] statusPage(${JSON.stringify(status)}) must be an integer 4xx or 5xx status. Use redirect() for 3xx, and return data for a successful render.`);
|
|
25
|
+
}
|
|
26
|
+
const response = new Response(null, { status });
|
|
27
|
+
// Non-enumerable so the brand never lands in a structured clone or a JSON log of the response.
|
|
28
|
+
Object.defineProperty(response, STATUS_SIGNAL, {
|
|
29
|
+
value: { status, ...(options.headers !== undefined ? { headers: options.headers } : {}) },
|
|
30
|
+
enumerable: false,
|
|
31
|
+
});
|
|
32
|
+
throw response;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Render the nearest `_404` page at status **404**. `throw` it from a loader when the record does not
|
|
36
|
+
* exist.
|
|
37
|
+
*
|
|
38
|
+
* This is the fix for the soft 404: a matched route whose loader finds nothing has otherwise no way to
|
|
39
|
+
* answer 404, so the path of least resistance is to return empty data and render "not found" inside a
|
|
40
|
+
* **200**. That looks correct in a browser and is invisible in review, which is why it ships and stays
|
|
41
|
+
* shipped - while search engines penalise it and keep the dead URL indexed.
|
|
42
|
+
*
|
|
43
|
+
* Returns `never`: these throw, so a loader narrows without a redundant `return`, and the type states
|
|
44
|
+
* the thing the "loaders `throw` redirect, actions `return` it" rule already trips people on.
|
|
45
|
+
*/
|
|
46
|
+
export function notFound(options = {}) {
|
|
47
|
+
return statusSignal(404, options);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Render a terminal page at status **410 Gone**. `throw` it from a loader for a record that existed and
|
|
51
|
+
* was deliberately removed - a withdrawn listing, a deleted post.
|
|
52
|
+
*
|
|
53
|
+
* 410 is not a pedantic 404: it tells a crawler to **drop** the URL rather than re-fetch it for weeks
|
|
54
|
+
* on the assumption the 404 was transient. Uses `_410.tsx` if the app has one, otherwise `_404`.
|
|
55
|
+
*/
|
|
56
|
+
export function gone(options = {}) {
|
|
57
|
+
return statusSignal(410, options);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Render a terminal page at any 4xx/5xx status - the escape hatch behind {@link notFound} and
|
|
61
|
+
* {@link gone} (402, 451, …). Uses `_<status>.tsx` if present, otherwise `_404`.
|
|
62
|
+
*/
|
|
63
|
+
export function statusPage(status, options = {}) {
|
|
64
|
+
return statusSignal(status, options);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=status-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-page.js","sourceRoot":"","sources":["../../src/internal/status-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;AAMlE,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,QAAQ,IAAI,aAAa,IAAI,KAAK,CAAA;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,OAA0B;IAC9D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,0GAA0G,CAC3J,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/C,+FAA+F;IAC/F,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE;QAC7C,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QACzF,UAAU,EAAE,KAAK;KAClB,CAAC,CAAA;IACF,MAAM,QAAQ,CAAA;AAChB,CAAC;AAeD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CAAC,UAA6B,EAAE;IACtD,OAAO,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAAC,UAA6B,EAAE;IAClD,OAAO,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,UAA6B,EAAE;IACxE,OAAO,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Below this, a secret is too short to sign with. */
|
|
2
|
+
export declare const MIN_STORE_SECRET_LENGTH = 32;
|
|
3
|
+
export declare const isStoreSecret: (value: unknown) => value is string;
|
|
4
|
+
/**
|
|
5
|
+
* Signs a list of strings. Each part is hashed behind its length, so no two lists hash the same
|
|
6
|
+
* bytes, whatever the parts hold.
|
|
7
|
+
*/
|
|
8
|
+
export interface StoreSigner {
|
|
9
|
+
/** The parts' MAC, as lowercase hex. */
|
|
10
|
+
sign(parts: readonly string[]): Promise<string>;
|
|
11
|
+
/** Whether `mac` is the parts' MAC under this secret. Anything but 64 lowercase hex digits is not. */
|
|
12
|
+
verify(parts: readonly string[], mac: unknown): Promise<boolean>;
|
|
13
|
+
}
|
|
14
|
+
export declare function storeSigner(secret: string): StoreSigner;
|
|
15
|
+
//# sourceMappingURL=store-signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-signature.d.ts","sourceRoot":"","sources":["../../src/internal/store-signature.ts"],"names":[],"mappings":"AAeA,sDAAsD;AACtD,eAAO,MAAM,uBAAuB,KAAK,CAAA;AAEzC,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACc,CAAA;AAEtE;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,IAAI,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC/C,sGAAsG;IACtG,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACjE;AA4BD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAUvD"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { timingSafeEqual } from "./timing-safe-equal.js";
|
|
2
|
+
const TEXT = new TextEncoder();
|
|
3
|
+
const MAC_HEX = /^[0-9a-f]{64}$/;
|
|
4
|
+
// Code units of signed text a signer remembers as proven. A hot page then costs a comparison per
|
|
5
|
+
// hit, not a hash: about 1.5 ns a byte to hash against a fraction of that to compare.
|
|
6
|
+
const MAX_PROVEN_CHARS = 2 * 1024 * 1024;
|
|
7
|
+
const MAX_SIGNERS = 4;
|
|
8
|
+
/** Below this, a secret is too short to sign with. */
|
|
9
|
+
export const MIN_STORE_SECRET_LENGTH = 32;
|
|
10
|
+
export const isStoreSecret = (value) => typeof value === "string" && value.length >= MIN_STORE_SECRET_LENGTH;
|
|
11
|
+
// Looked up, never imported: a Worker without nodejs_compat cannot load node:crypto. Where it exists
|
|
12
|
+
// it is the cheaper path: Web Crypto answers on another thread, about 20 us a call on Bun, Node and
|
|
13
|
+
// Deno, more than hashing a 16 KB page.
|
|
14
|
+
function nodeCreateHmac() {
|
|
15
|
+
const createHmac = globalThis.process?.getBuiltinModule?.("node:crypto")?.createHmac;
|
|
16
|
+
return typeof createHmac === "function" ? createHmac : undefined;
|
|
17
|
+
}
|
|
18
|
+
const sameParts = (a, b) => a.length === b.length && a.every((part, at) => part === b[at]);
|
|
19
|
+
const lengthOf = (parts) => parts.reduce((sum, part) => sum + part.length, 0);
|
|
20
|
+
// One signer per secret for the process, so a handler built per request (a Worker reads its bindings
|
|
21
|
+
// in `fetch`) still finds the pages earlier requests proved.
|
|
22
|
+
const signers = new Map();
|
|
23
|
+
export function storeSigner(secret) {
|
|
24
|
+
const existing = signers.get(secret);
|
|
25
|
+
if (existing !== undefined)
|
|
26
|
+
return existing;
|
|
27
|
+
const signer = provingSigner(hasher(secret));
|
|
28
|
+
for (const oldest of signers.keys()) {
|
|
29
|
+
if (signers.size < MAX_SIGNERS)
|
|
30
|
+
break;
|
|
31
|
+
signers.delete(oldest);
|
|
32
|
+
}
|
|
33
|
+
signers.set(secret, signer);
|
|
34
|
+
return signer;
|
|
35
|
+
}
|
|
36
|
+
function provingSigner(hashing) {
|
|
37
|
+
// MAC to the parts this signer signed or verified, oldest first.
|
|
38
|
+
const proven = new Map();
|
|
39
|
+
let provenChars = 0;
|
|
40
|
+
const remember = (mac, parts) => {
|
|
41
|
+
const length = lengthOf(parts);
|
|
42
|
+
if (length > MAX_PROVEN_CHARS / 8)
|
|
43
|
+
return;
|
|
44
|
+
const had = proven.get(mac);
|
|
45
|
+
if (had !== undefined) {
|
|
46
|
+
proven.delete(mac);
|
|
47
|
+
provenChars -= lengthOf(had);
|
|
48
|
+
}
|
|
49
|
+
proven.set(mac, parts);
|
|
50
|
+
provenChars += length;
|
|
51
|
+
for (const [oldest, kept] of proven) {
|
|
52
|
+
if (provenChars <= MAX_PROVEN_CHARS)
|
|
53
|
+
break;
|
|
54
|
+
proven.delete(oldest);
|
|
55
|
+
provenChars -= lengthOf(kept);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
async sign(parts) {
|
|
60
|
+
const mac = await hashing.sign(parts);
|
|
61
|
+
remember(mac, parts);
|
|
62
|
+
return mac;
|
|
63
|
+
},
|
|
64
|
+
async verify(parts, mac) {
|
|
65
|
+
if (typeof mac !== "string" || !MAC_HEX.test(mac))
|
|
66
|
+
return false;
|
|
67
|
+
const known = proven.get(mac);
|
|
68
|
+
if (known !== undefined && sameParts(known, parts))
|
|
69
|
+
return true;
|
|
70
|
+
if (!(await hashing.matches(parts, mac)))
|
|
71
|
+
return false;
|
|
72
|
+
remember(mac, parts);
|
|
73
|
+
return true;
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function hasher(secret) {
|
|
78
|
+
const createHmac = nodeCreateHmac();
|
|
79
|
+
if (createHmac !== undefined) {
|
|
80
|
+
const hex = (parts) => {
|
|
81
|
+
const hmac = createHmac("sha256", secret);
|
|
82
|
+
for (const part of parts)
|
|
83
|
+
hmac.update(`${part.length}:`).update(part);
|
|
84
|
+
return hmac.digest("hex");
|
|
85
|
+
};
|
|
86
|
+
return {
|
|
87
|
+
sign: async (parts) => hex(parts),
|
|
88
|
+
matches: async (parts, mac) => timingSafeEqual(hex(parts), mac),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
let signingKey;
|
|
92
|
+
const key = () => {
|
|
93
|
+
signingKey ??= crypto.subtle.importKey("raw", TEXT.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign", "verify"]);
|
|
94
|
+
return signingKey;
|
|
95
|
+
};
|
|
96
|
+
const bytes = (parts) => TEXT.encode(parts.map((part) => `${part.length}:${part}`).join(""));
|
|
97
|
+
return {
|
|
98
|
+
async sign(parts) {
|
|
99
|
+
const mac = new Uint8Array(await crypto.subtle.sign("HMAC", await key(), bytes(parts)));
|
|
100
|
+
let hex = "";
|
|
101
|
+
for (const byte of mac)
|
|
102
|
+
hex += byte.toString(16).padStart(2, "0");
|
|
103
|
+
return hex;
|
|
104
|
+
},
|
|
105
|
+
async matches(parts, mac) {
|
|
106
|
+
const expected = new Uint8Array(mac.length / 2);
|
|
107
|
+
for (let at = 0; at < expected.length; at++) {
|
|
108
|
+
expected[at] = Number.parseInt(mac.slice(at * 2, at * 2 + 2), 16);
|
|
109
|
+
}
|
|
110
|
+
return crypto.subtle.verify("HMAC", await key(), expected, bytes(parts));
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=store-signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-signature.js","sourceRoot":"","sources":["../../src/internal/store-signature.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
* Only a plugin's `config` hook output is rewritten, never mutated, and only under rolldown-vite.
|
|
17
17
|
* Non-rolldown Vite is passed through verbatim.
|
|
18
18
|
*
|
|
19
|
-
* FLATTEN FIRST: a
|
|
20
|
-
* returns `[vite:react-babel, vite:react-refresh]`, and it's `
|
|
19
|
+
* FLATTEN FIRST: a plugin factory may return an ARRAY of plugins - `@vitejs/plugin-react@4.x`'s `react()`
|
|
20
|
+
* returns `[vite:react-babel, vite:react-refresh]`, and it's `vite:react-babel`'s `config` hook that emits
|
|
21
21
|
* the offending `optimizeDeps.rollupOptions.jsx`. `nifra.config.ts` writes `vitePlugins = [react()]`, so the
|
|
22
22
|
* plugin list arrives NESTED (`[[babel, refresh]]`). Without flattening, `.map` sees the inner array (which
|
|
23
23
|
* has no `config`), leaves it untouched, and Vite - which flattens plugin arrays itself before running them
|
|
@@ -17,8 +17,8 @@ const isRecord = (value) => value !== null && typeof value === "object" && !Arra
|
|
|
17
17
|
* Only a plugin's `config` hook output is rewritten, never mutated, and only under rolldown-vite.
|
|
18
18
|
* Non-rolldown Vite is passed through verbatim.
|
|
19
19
|
*
|
|
20
|
-
* FLATTEN FIRST: a
|
|
21
|
-
* returns `[vite:react-babel, vite:react-refresh]`, and it's `
|
|
20
|
+
* FLATTEN FIRST: a plugin factory may return an ARRAY of plugins - `@vitejs/plugin-react@4.x`'s `react()`
|
|
21
|
+
* returns `[vite:react-babel, vite:react-refresh]`, and it's `vite:react-babel`'s `config` hook that emits
|
|
22
22
|
* the offending `optimizeDeps.rollupOptions.jsx`. `nifra.config.ts` writes `vitePlugins = [react()]`, so the
|
|
23
23
|
* plugin list arrives NESTED (`[[babel, refresh]]`). Without flattening, `.map` sees the inner array (which
|
|
24
24
|
* has no `config`), leaves it untouched, and Vite - which flattens plugin arrays itself before running them
|
|
@@ -5,7 +5,10 @@ import type { CssLoadingMode } from "../css-contract.js";
|
|
|
5
5
|
import { type BuildAssetSet, type HostPolicy } from "../host-policy.js";
|
|
6
6
|
import type { Manifest } from "../manifest.js";
|
|
7
7
|
import type { RenderAdapter } from "../render-seam.js";
|
|
8
|
+
import { type KeepAliveServerOptions } from "./identity-epoch.js";
|
|
9
|
+
import { type LiveRuntimeHandle } from "./live-contract.js";
|
|
8
10
|
import { type NonceResolver } from "./page-execution.js";
|
|
11
|
+
import { type PprSetup } from "./ppr/contract.js";
|
|
9
12
|
import { type PrerenderedPages } from "./prerendered-pages.js";
|
|
10
13
|
export type { NonceResolver } from "./page-execution.js";
|
|
11
14
|
/** An app's locale routing as `createWebApp` reads it: what `defineI18nRouting()` from
|
|
@@ -53,6 +56,15 @@ export interface CreateWebAppOptions<Env = unknown> {
|
|
|
53
56
|
* and stays cacheable by `withISR` or a CDN. `meta` still receives a nonce to name.
|
|
54
57
|
*/
|
|
55
58
|
readonly csp?: CspPolicy;
|
|
59
|
+
/** Experimental and unstable: features whose API may change in any release. */
|
|
60
|
+
readonly experimental?: {
|
|
61
|
+
/**
|
|
62
|
+
* Partial prerendering, from `partialPrerendering()` in `@nifrajs/web/ppr`. A route whose backend
|
|
63
|
+
* half exports `shellLoader` streams a shell shared by every visitor, then each `dynamic` boundary
|
|
64
|
+
* as it settles. Needs `csp` (hashes), not `nonce`.
|
|
65
|
+
*/
|
|
66
|
+
readonly ppr?: PprSetup;
|
|
67
|
+
};
|
|
56
68
|
/**
|
|
57
69
|
* Options for the underlying `server()` - `requestTimeoutMs`, `admission`, `gracefulSignals`, and
|
|
58
70
|
* the rest of {@link ServerOptions}.
|
|
@@ -173,6 +185,11 @@ export interface CreateWebAppOptions<Env = unknown> {
|
|
|
173
185
|
* signed `__nifra_draft` cookie gets `ctx.draft === true` in loaders/actions (else always `false`).
|
|
174
186
|
* Pair with `withISR({ draftSecret })` so editors bypass the cache. Omit to disable draft mode. */
|
|
175
187
|
readonly draftSecret?: string;
|
|
188
|
+
/**
|
|
189
|
+
* Live data refresh, from `live()` in `@nifrajs/web/live`. Loaders declare keys with `ctx.live()`;
|
|
190
|
+
* the app answers live loads at the runtime's load endpoint. Omit and nothing live is loaded.
|
|
191
|
+
*/
|
|
192
|
+
readonly live?: LiveRuntimeHandle;
|
|
176
193
|
/** Per-route chunk URLs (`buildClient`'s `BuildManifest.routes`) - `routeId → [layout chunks…, own
|
|
177
194
|
* chunk]`. When present, each page `modulepreload`s its matched route's chunks alongside the entry,
|
|
178
195
|
* so the route code downloads in parallel (no entry→route-chunk waterfall). Omit ⇒ entry-only. */
|
|
@@ -228,6 +245,15 @@ export interface CreateWebAppOptions<Env = unknown> {
|
|
|
228
245
|
* server entry, before its static files too. A refused path answers the policy's refusal.
|
|
229
246
|
*/
|
|
230
247
|
readonly hostPolicy?: HostPolicy;
|
|
248
|
+
/**
|
|
249
|
+
* Which cookies say who is signed in, for an app with a `keepAlive` route. A response that changes
|
|
250
|
+
* or deletes one rotates the readable identity epoch cookie, and every tab drops the pages it kept
|
|
251
|
+
* for the previous visitor. The session cookies of `@nifrajs/auth` and Auth.js count under their
|
|
252
|
+
* default names, Better Auth's under any `cookiePrefix`; name any other in `identityCookies`. An app
|
|
253
|
+
* run by `nifra dev` and `nifra build` exports this from `backend/framework.ts`. Development reports, once per
|
|
254
|
+
* name, an `HttpOnly` cookie that changes and is in neither list (`NIFRA_KEEPALIVE_IDENTITY_COOKIE`).
|
|
255
|
+
*/
|
|
256
|
+
readonly keepAlive?: KeepAliveServerOptions;
|
|
231
257
|
/**
|
|
232
258
|
* The files the build emitted, by request path: `buildAssets` from the generated server manifest.
|
|
233
259
|
* A {@link hostPolicy} rule's `buildAssets` token matches exactly these. `nifra dev` serves the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-app.d.ts","sourceRoot":"","sources":["../../src/internal/web-app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web-app.d.ts","sourceRoot":"","sources":["../../src/internal/web-app.ts"],"names":[],"mappings":"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"}
|