@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission.js","sourceRoot":"","sources":["../../../src/internal/ppr/admission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Where a canary value went into the request whose shell carried it. */
|
|
2
|
+
export type CanaryCarrier = "cookie" | "authorization" | "header" | "query";
|
|
3
|
+
export interface ShellCanaryFinding {
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly via: CanaryCarrier;
|
|
6
|
+
/** The shared hole whose frame carried it; absent when the shell did. */
|
|
7
|
+
readonly hole?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ShellCanaryOptions {
|
|
10
|
+
/** The origin the requests are made against. Default `http://canary.invalid`. */
|
|
11
|
+
readonly origin?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The canary check. Each path is requested through the app's own middleware and gates with a
|
|
15
|
+
* unique value in a cookie, an `Authorization` header, a custom header and the query, until a
|
|
16
|
+
* response carries a shell (`shellAfterRequests` decides which request builds it) and a built frame
|
|
17
|
+
* for each shared hole, and those are scanned for every value the path's requests carried. It
|
|
18
|
+
* catches visitor data the app keeps in module state, which no import check sees. Run it against a
|
|
19
|
+
* fresh app before it serves traffic: a shell or frame already cached was built without the canaries.
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkShellCanaries(app: {
|
|
22
|
+
fetch(request: Request): Response | Promise<Response>;
|
|
23
|
+
}, paths: readonly string[], options?: ShellCanaryOptions): Promise<readonly ShellCanaryFinding[]>;
|
|
24
|
+
//# sourceMappingURL=canary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canary.d.ts","sourceRoot":"","sources":["../../../src/internal/ppr/canary.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAoDD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE;IAAE,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAAE,EAC9D,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CA0CxC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { MAX_SHELL_AFTER_REQUESTS } from "./options.js";
|
|
2
|
+
const CARRIERS = ["cookie", "authorization", "header", "query"];
|
|
3
|
+
/** Where a streamed document's per-response part starts: everything before it is the shared shell. */
|
|
4
|
+
const REQUEST_SCRIPT = '<script type="application/json" id="nifra-ppr-req">';
|
|
5
|
+
const SCRIPT_END = "</script>";
|
|
6
|
+
/** Requests per path: enough for a shell to be built, then for each shared hole's entry. */
|
|
7
|
+
const MAX_ATTEMPTS = 2 * MAX_SHELL_AFTER_REQUESTS;
|
|
8
|
+
/** The JSON text of the inert script element opened by `opener`, or `undefined` without one. */
|
|
9
|
+
const scriptText = (html, opener) => {
|
|
10
|
+
const start = html.indexOf(opener);
|
|
11
|
+
if (start === -1)
|
|
12
|
+
return undefined;
|
|
13
|
+
const end = html.indexOf(SCRIPT_END, start + opener.length);
|
|
14
|
+
return end === -1 ? undefined : html.slice(start + opener.length, end);
|
|
15
|
+
};
|
|
16
|
+
const parsed = (text) => {
|
|
17
|
+
if (text === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(text);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
/** The shared holes' frames a response carries, by name, when every one carries its entry. */
|
|
27
|
+
function sharedFrames(html) {
|
|
28
|
+
const request = parsed(scriptText(html, REQUEST_SCRIPT));
|
|
29
|
+
const names = typeof request === "object" && request !== null ? Reflect.get(request, "shared") : undefined;
|
|
30
|
+
const frames = new Map();
|
|
31
|
+
if (!Array.isArray(names))
|
|
32
|
+
return frames;
|
|
33
|
+
for (const name of names) {
|
|
34
|
+
if (typeof name !== "string")
|
|
35
|
+
return undefined;
|
|
36
|
+
const text = scriptText(html, `<script type="application/json" id="nifra-ppr:${name}">`);
|
|
37
|
+
const frame = parsed(text);
|
|
38
|
+
// An error frame holds nothing built: the entry is not there yet.
|
|
39
|
+
if (text === undefined || typeof frame !== "object" || frame === null)
|
|
40
|
+
return undefined;
|
|
41
|
+
if (Reflect.get(frame, "error") === true)
|
|
42
|
+
return undefined;
|
|
43
|
+
frames.set(name, text);
|
|
44
|
+
}
|
|
45
|
+
return frames;
|
|
46
|
+
}
|
|
47
|
+
const randomHex = () => Array.from(crypto.getRandomValues(new Uint8Array(12)), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
48
|
+
/**
|
|
49
|
+
* The canary check. Each path is requested through the app's own middleware and gates with a
|
|
50
|
+
* unique value in a cookie, an `Authorization` header, a custom header and the query, until a
|
|
51
|
+
* response carries a shell (`shellAfterRequests` decides which request builds it) and a built frame
|
|
52
|
+
* for each shared hole, and those are scanned for every value the path's requests carried. It
|
|
53
|
+
* catches visitor data the app keeps in module state, which no import check sees. Run it against a
|
|
54
|
+
* fresh app before it serves traffic: a shell or frame already cached was built without the canaries.
|
|
55
|
+
*/
|
|
56
|
+
export async function checkShellCanaries(app, paths, options = {}) {
|
|
57
|
+
const findings = [];
|
|
58
|
+
for (const path of paths) {
|
|
59
|
+
const sent = [];
|
|
60
|
+
// A route that renders whole every time reports nothing.
|
|
61
|
+
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
|
|
62
|
+
const values = {
|
|
63
|
+
cookie: `nifra-canary-${randomHex()}`,
|
|
64
|
+
authorization: `nifra-canary-${randomHex()}`,
|
|
65
|
+
header: `nifra-canary-${randomHex()}`,
|
|
66
|
+
query: `nifra-canary-${randomHex()}`,
|
|
67
|
+
};
|
|
68
|
+
sent.push(values);
|
|
69
|
+
const url = new URL(path, options.origin ?? "http://canary.invalid");
|
|
70
|
+
url.searchParams.set("nifra_canary", values.query);
|
|
71
|
+
const response = await app.fetch(new Request(url.href, {
|
|
72
|
+
headers: {
|
|
73
|
+
cookie: `nifra_canary=${values.cookie}`,
|
|
74
|
+
authorization: `Bearer ${values.authorization}`,
|
|
75
|
+
"x-nifra-canary": values.header,
|
|
76
|
+
},
|
|
77
|
+
}));
|
|
78
|
+
const html = await response.text();
|
|
79
|
+
const end = html.indexOf(REQUEST_SCRIPT);
|
|
80
|
+
// No shared shell yet: this request rendered whole, so nothing it saw is shared.
|
|
81
|
+
if (end === -1)
|
|
82
|
+
continue;
|
|
83
|
+
const frames = sharedFrames(html);
|
|
84
|
+
// A shared hole whose entry is still being built: a later request gets it.
|
|
85
|
+
if (frames === undefined && attempt < MAX_ATTEMPTS - 1)
|
|
86
|
+
continue;
|
|
87
|
+
const shell = html.slice(0, end);
|
|
88
|
+
const carried = (text, via) => sent.some((earlier) => text.includes(earlier[via]));
|
|
89
|
+
for (const via of CARRIERS)
|
|
90
|
+
if (carried(shell, via))
|
|
91
|
+
findings.push({ path, via });
|
|
92
|
+
for (const [hole, frame] of frames ?? []) {
|
|
93
|
+
for (const via of CARRIERS)
|
|
94
|
+
if (carried(frame, via))
|
|
95
|
+
findings.push({ path, via, hole });
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return findings;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=canary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canary.js","sourceRoot":"","sources":["../../../src/internal/ppr/canary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Manifest } from "../../manifest.js";
|
|
2
|
+
/**
|
|
3
|
+
* Which routes passed the shell check for one deployment. The server shares a shell only for a route
|
|
4
|
+
* listed here under its own deployment; anything else renders blocking (fail closed).
|
|
5
|
+
*/
|
|
6
|
+
export interface ShellCheckRecord {
|
|
7
|
+
readonly v: 1;
|
|
8
|
+
readonly deployment: string;
|
|
9
|
+
/** Route id to the sha256 of the checked shell bundle. */
|
|
10
|
+
readonly routes: Readonly<Record<string, string>>;
|
|
11
|
+
/** Route id to the shared holes whose loaders were checked in that bundle: only these are stored. */
|
|
12
|
+
readonly sharedHoles?: Readonly<Record<string, readonly string[]>>;
|
|
13
|
+
}
|
|
14
|
+
export declare class ShellCheckError extends Error {
|
|
15
|
+
readonly routeId: string;
|
|
16
|
+
readonly chain: readonly string[];
|
|
17
|
+
readonly name = "ShellCheckError";
|
|
18
|
+
constructor(routeId: string, chain: readonly string[]);
|
|
19
|
+
}
|
|
20
|
+
export interface CompileShellsOptions {
|
|
21
|
+
readonly routesDir: string;
|
|
22
|
+
readonly manifest: Manifest;
|
|
23
|
+
/** The deployment the record is for: the server refuses a record made for another one. */
|
|
24
|
+
readonly deployment: string;
|
|
25
|
+
/** True for a module (absolute path, `/` separators) whose code reads the visitor's request. */
|
|
26
|
+
readonly requestScoped: (moduleId: string) => boolean;
|
|
27
|
+
/** Called for each route that fails; the route is left out of the record. Default: rethrow. */
|
|
28
|
+
readonly onFailure?: (routeId: string, error: unknown) => void;
|
|
29
|
+
/** Bun plugins the server build uses for route files, such as `svelteBunPlugin("ssr")`. */
|
|
30
|
+
readonly plugins?: readonly import("bun").BunPlugin[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Bundle each route's shell (its page and layout modules, its backend `shellLoader`, and nothing else)
|
|
34
|
+
* and refuse it when the emitted code reaches a request-scoped module. A module counts only
|
|
35
|
+
* when its code reached the output, so an import only a hole loader uses is not a leak. Routes whose
|
|
36
|
+
* backend half has no `shellLoader` are skipped. Bun only.
|
|
37
|
+
*/
|
|
38
|
+
export declare function compileShells(options: CompileShellsOptions): Promise<ShellCheckRecord>;
|
|
39
|
+
//# sourceMappingURL=compile-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-shell.d.ts","sourceRoot":"","sources":["../../../src/internal/ppr/compile-shell.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAA;AAI7D;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAA;IACb,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,qGAAqG;IACrG,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAA;CACnE;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAGtC,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE;IAHnC,SAAkB,IAAI,qBAAoB;gBAE/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,MAAM,EAAE;CAMpC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,gGAAgG;IAChG,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IACrD,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9D,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,EAAE,CAAA;CACtD;AAgDD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4B5F"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { basename, join, resolve } from "node:path";
|
|
3
|
+
import { fromBunMetafile } from "../../module-graph.js";
|
|
4
|
+
import { isTypeScriptCompiler } from "../typescript-api.js";
|
|
5
|
+
export class ShellCheckError extends Error {
|
|
6
|
+
routeId;
|
|
7
|
+
chain;
|
|
8
|
+
name = "ShellCheckError";
|
|
9
|
+
constructor(routeId, chain) {
|
|
10
|
+
super(`[nifra/web] ppr: the shell of route "${routeId}" reaches request-scoped module "${chain.at(-1)}" through ${chain.join(" -> ")}. Move that read into a dynamic boundary's loader: a shared boundary's loader is part of the shell`);
|
|
11
|
+
this.routeId = routeId;
|
|
12
|
+
this.chain = chain;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const NAMESPACE = "nifra-ppr-shell";
|
|
16
|
+
const toPosix = (path) => path.replaceAll("\\", "/");
|
|
17
|
+
const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
18
|
+
/**
|
|
19
|
+
* nifra's own modules that read the visitor's request from async context. Packages stay external in
|
|
20
|
+
* the shell bundle, so these are bundled in instead: the output graph then shows whether shell code
|
|
21
|
+
* calls them, not merely whether a module beside it imports them.
|
|
22
|
+
*/
|
|
23
|
+
const NIFRA_REQUEST_SCOPED = ["@nifrajs/middleware/context-storage"];
|
|
24
|
+
const NIFRA_REQUEST_SCOPED_FILTER = new RegExp(`^(?:${NIFRA_REQUEST_SCOPED.map(escapeRegExp).join("|")})$`);
|
|
25
|
+
/** Hands any module the Worker's `env`, its secrets included, with no request in sight. */
|
|
26
|
+
const PLATFORM_ENV = /^cloudflare:workers$/;
|
|
27
|
+
/** The import chain from `root` to the first request-scoped module it reaches, breadth first. */
|
|
28
|
+
function requestScopedChain(root, next, scoped) {
|
|
29
|
+
const parent = new Map([[root, undefined]]);
|
|
30
|
+
const queue = [root];
|
|
31
|
+
for (let cursor = 0; cursor < queue.length; cursor++) {
|
|
32
|
+
const module = queue[cursor];
|
|
33
|
+
if (module === undefined)
|
|
34
|
+
break;
|
|
35
|
+
if (scoped.has(module)) {
|
|
36
|
+
const chain = [];
|
|
37
|
+
for (let at = module; at !== undefined; at = parent.get(at))
|
|
38
|
+
chain.push(at);
|
|
39
|
+
return chain.reverse();
|
|
40
|
+
}
|
|
41
|
+
for (const child of next.get(module) ?? []) {
|
|
42
|
+
if (!parent.has(child)) {
|
|
43
|
+
parent.set(child, module);
|
|
44
|
+
queue.push(child);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Bundle each route's shell (its page and layout modules, its backend `shellLoader`, and nothing else)
|
|
52
|
+
* and refuse it when the emitted code reaches a request-scoped module. A module counts only
|
|
53
|
+
* when its code reached the output, so an import only a hole loader uses is not a leak. Routes whose
|
|
54
|
+
* backend half has no `shellLoader` are skipped. Bun only.
|
|
55
|
+
*/
|
|
56
|
+
export async function compileShells(options) {
|
|
57
|
+
const dir = resolve(options.routesDir);
|
|
58
|
+
const routes = {};
|
|
59
|
+
const sharedHoles = {};
|
|
60
|
+
const parser = typeScriptFor(dir);
|
|
61
|
+
for (const route of options.manifest.routes) {
|
|
62
|
+
if (route.backend === undefined)
|
|
63
|
+
continue;
|
|
64
|
+
try {
|
|
65
|
+
const checked = await compileShell(dir, options.manifest, route, route.backend, options.requestScoped, options.plugins ?? [], parser);
|
|
66
|
+
if (checked === undefined)
|
|
67
|
+
continue;
|
|
68
|
+
routes[route.id] = checked.hash;
|
|
69
|
+
if (checked.sharedHoles.length > 0)
|
|
70
|
+
sharedHoles[route.id] = checked.sharedHoles;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (options.onFailure === undefined)
|
|
74
|
+
throw error;
|
|
75
|
+
options.onFailure(route.id, error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return Object.keys(sharedHoles).length === 0
|
|
79
|
+
? { v: 1, deployment: options.deployment, routes }
|
|
80
|
+
: { v: 1, deployment: options.deployment, routes, sharedHoles };
|
|
81
|
+
}
|
|
82
|
+
/** The app's TypeScript compiler, read only when a backend half has boundary loaders to sort. */
|
|
83
|
+
function typeScriptFor(dir) {
|
|
84
|
+
let loaded;
|
|
85
|
+
let tried = false;
|
|
86
|
+
return () => {
|
|
87
|
+
if (tried)
|
|
88
|
+
return loaded;
|
|
89
|
+
tried = true;
|
|
90
|
+
let ts;
|
|
91
|
+
try {
|
|
92
|
+
ts = createRequire(join(dir, "package.json"))("typescript");
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
ts = undefined;
|
|
96
|
+
}
|
|
97
|
+
if (isTypeScriptCompiler(ts))
|
|
98
|
+
loaded = ts;
|
|
99
|
+
else {
|
|
100
|
+
console.warn("[nifra/web] ppr: no shared hole's loader is checked, so each loads for every visitor: finding them reads boundaryLoaders with the TypeScript compiler API, which the app's TypeScript does not have (TypeScript 7 ships none; install typescript@^6 as a dev dependency)");
|
|
101
|
+
}
|
|
102
|
+
return loaded;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/** `node` without the `satisfies`, `as` and parentheses around it. */
|
|
106
|
+
function unwrapped(ts, node) {
|
|
107
|
+
let at = node;
|
|
108
|
+
while (ts.isSatisfiesExpression(at) || ts.isAsExpression(at) || ts.isParenthesizedExpression(at))
|
|
109
|
+
at = at.expression;
|
|
110
|
+
return at;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The backend half with `boundaryLoaders` cut down to its shared entries, and their names. A shared
|
|
114
|
+
* entry is one written inline with `revalidate`, which only a shared boundary's entry may have; one the
|
|
115
|
+
* source does not spell out that way is left out, so its hole is not stored (fail closed). A per-visitor
|
|
116
|
+
* entry's loader may read the request, so it never joins the shell bundle.
|
|
117
|
+
*/
|
|
118
|
+
function sharedLoaders(ts, module) {
|
|
119
|
+
const file = ts.createSourceFile(module.path, module.source, ts.ScriptTarget.Latest, true, module.loader === "tsx" ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
|
|
120
|
+
for (const statement of file.statements) {
|
|
121
|
+
if (!ts.isVariableStatement(statement))
|
|
122
|
+
continue;
|
|
123
|
+
for (const declaration of statement.declarationList.declarations) {
|
|
124
|
+
if (!ts.isIdentifier(declaration.name) || declaration.name.text !== "boundaryLoaders")
|
|
125
|
+
continue;
|
|
126
|
+
const initializer = declaration.initializer && unwrapped(ts, declaration.initializer);
|
|
127
|
+
if (initializer === undefined || !ts.isObjectLiteralExpression(initializer))
|
|
128
|
+
return undefined;
|
|
129
|
+
const names = [];
|
|
130
|
+
const kept = [];
|
|
131
|
+
for (const property of initializer.properties) {
|
|
132
|
+
if (!ts.isPropertyAssignment(property))
|
|
133
|
+
continue;
|
|
134
|
+
const { name } = property;
|
|
135
|
+
if (!ts.isIdentifier(name) && !ts.isStringLiteral(name))
|
|
136
|
+
continue;
|
|
137
|
+
const entry = unwrapped(ts, property.initializer);
|
|
138
|
+
if (!ts.isObjectLiteralExpression(entry))
|
|
139
|
+
continue;
|
|
140
|
+
const shared = entry.properties.some((field) => field.name !== undefined &&
|
|
141
|
+
(ts.isIdentifier(field.name) || ts.isStringLiteral(field.name)) &&
|
|
142
|
+
field.name.text === "revalidate");
|
|
143
|
+
if (!shared)
|
|
144
|
+
continue;
|
|
145
|
+
names.push(name.text);
|
|
146
|
+
kept.push(module.source.slice(property.getStart(file), property.getEnd()));
|
|
147
|
+
}
|
|
148
|
+
if (names.length === 0)
|
|
149
|
+
return undefined;
|
|
150
|
+
const source = `${module.source.slice(0, initializer.getStart(file))}{ ${kept.join(", ")} }${module.source.slice(initializer.getEnd())}`;
|
|
151
|
+
return { source, names };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
async function readModule(dir, file) {
|
|
157
|
+
const path = toPosix(resolve(dir, file));
|
|
158
|
+
const loader = /\.[cm]?tsx$|\.jsx$/.test(path) ? "tsx" : "ts";
|
|
159
|
+
const source = await Bun.file(path).text();
|
|
160
|
+
return { path, loader, source, exports: new Bun.Transpiler({ loader }).scan(source).exports };
|
|
161
|
+
}
|
|
162
|
+
async function compileShell(dir, manifest, route, backend, requestScoped, plugins, parser) {
|
|
163
|
+
const backendModule = await readModule(dir, backend);
|
|
164
|
+
if (!backendModule.exports.includes("shellLoader"))
|
|
165
|
+
return undefined;
|
|
166
|
+
const ts = backendModule.exports.includes("boundaryLoaders") ? parser() : undefined;
|
|
167
|
+
const shared = ts === undefined ? undefined : sharedLoaders(ts, backendModule);
|
|
168
|
+
const kept = shared === undefined ? ["shellLoader"] : ["shellLoader", "boundaryLoaders"];
|
|
169
|
+
// A gate's loader runs for its redirect or refusal and its data never reaches the shell; any other
|
|
170
|
+
// layout loader reads the request for data the shell would show every visitor.
|
|
171
|
+
for (const id of route.layoutIds) {
|
|
172
|
+
const layoutBackend = manifest.layouts[id]?.backend;
|
|
173
|
+
if (layoutBackend === undefined)
|
|
174
|
+
continue;
|
|
175
|
+
const names = (await readModule(dir, layoutBackend)).exports;
|
|
176
|
+
if (names.includes("loader") && !names.includes("gate")) {
|
|
177
|
+
throw new Error(`[nifra/web] ppr: route "${route.id}" has a shellLoader, but its layout "${id}" has a loader that is not a gate. Its output would be in a shell shared by every visitor; move that data into a dynamic boundary, or mark the layout \`gate\` if it loads only to redirect or refuse`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const at = (file) => JSON.stringify(toPosix(resolve(dir, file)));
|
|
181
|
+
// A page's and each layout's module whole: the shell runs `meta`, `handle` and `searchSchema` as
|
|
182
|
+
// well as the component, and an import only one of them uses must not escape the check.
|
|
183
|
+
const lines = [
|
|
184
|
+
`export { ${kept.join(", ")} } from ${at(backend)}`,
|
|
185
|
+
`export * as page from ${at(route.file)}`,
|
|
186
|
+
];
|
|
187
|
+
route.layoutIds.forEach((id, index) => {
|
|
188
|
+
const layout = manifest.layouts[id];
|
|
189
|
+
if (layout !== undefined)
|
|
190
|
+
lines.push(`export * as layout${index} from ${at(layout.file)}`);
|
|
191
|
+
});
|
|
192
|
+
const nifraScoped = new Set();
|
|
193
|
+
const envImporters = new Set();
|
|
194
|
+
const result = await Bun.build({
|
|
195
|
+
// Bun reads a `/` in an entry name as a directory, and route ids have them.
|
|
196
|
+
entrypoints: [`${NAMESPACE}:${encodeURIComponent(route.id)}`],
|
|
197
|
+
target: "bun",
|
|
198
|
+
packages: "external",
|
|
199
|
+
metafile: true,
|
|
200
|
+
throw: false,
|
|
201
|
+
plugins: [
|
|
202
|
+
// Ours first: its resolve and load hooks claim the entry and the backend half before theirs.
|
|
203
|
+
{
|
|
204
|
+
name: NAMESPACE,
|
|
205
|
+
setup(build) {
|
|
206
|
+
build.onResolve({ filter: new RegExp(`^${NAMESPACE}:`) }, (args) => ({
|
|
207
|
+
path: args.path,
|
|
208
|
+
namespace: NAMESPACE,
|
|
209
|
+
}));
|
|
210
|
+
build.onLoad({ filter: /.*/, namespace: NAMESPACE }, () => ({
|
|
211
|
+
loader: "ts",
|
|
212
|
+
contents: lines.join("\n"),
|
|
213
|
+
}));
|
|
214
|
+
build.onResolve({ filter: NIFRA_REQUEST_SCOPED_FILTER }, (args) => {
|
|
215
|
+
let path;
|
|
216
|
+
try {
|
|
217
|
+
path = toPosix(Bun.resolveSync(args.path, args.resolveDir));
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// Not installed, so no shell code can call it.
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
nifraScoped.add(path);
|
|
224
|
+
return { path };
|
|
225
|
+
});
|
|
226
|
+
build.onResolve({ filter: PLATFORM_ENV }, (args) => {
|
|
227
|
+
envImporters.add(toPosix(resolve(args.importer)));
|
|
228
|
+
return { path: args.path, external: true };
|
|
229
|
+
});
|
|
230
|
+
// The backend half's other exports are not shell code. A hole loader's `output: t.object()`
|
|
231
|
+
// is a call into a package, which the bundler must keep, and with it every import the
|
|
232
|
+
// hole uses. Eliminating them first scopes the check to `shellLoader` and the shared
|
|
233
|
+
// holes' loaders; their imports stay as bare imports, so a module with top-level effects
|
|
234
|
+
// still counts. The file is matched by its `/` form: Bun hands a plugin `\` on Windows.
|
|
235
|
+
build.onLoad({ filter: new RegExp(`${escapeRegExp(basename(backendModule.path))}$`) }, (args) => toPosix(args.path) !== backendModule.path
|
|
236
|
+
? undefined
|
|
237
|
+
: {
|
|
238
|
+
loader: "js",
|
|
239
|
+
contents: new Bun.Transpiler({
|
|
240
|
+
loader: backendModule.loader,
|
|
241
|
+
trimUnusedImports: true,
|
|
242
|
+
exports: {
|
|
243
|
+
eliminate: backendModule.exports.filter((name) => !kept.includes(name)),
|
|
244
|
+
},
|
|
245
|
+
}).transformSync(shared?.source ?? backendModule.source),
|
|
246
|
+
});
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
...plugins,
|
|
250
|
+
],
|
|
251
|
+
});
|
|
252
|
+
if (!result.success) {
|
|
253
|
+
throw new AggregateError(result.logs, `[nifra/web] ppr: the shell of "${route.id}" failed to build`);
|
|
254
|
+
}
|
|
255
|
+
// biome-ignore lint/plugin/noChainedTypeAssertions: Bun returns the metafile when `metafile: true`; @types/bun does not name it yet, and fromBunMetafile fails closed on a missing one.
|
|
256
|
+
// biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: Bun returns the metafile when `metafile: true`; @types/bun does not name it yet, and fromBunMetafile fails closed on a missing one.
|
|
257
|
+
const meta = result.metafile;
|
|
258
|
+
const graph = fromBunMetafile(meta);
|
|
259
|
+
const entry = Object.values(meta?.outputs ?? {}).find((output) => output.entryPoint?.startsWith(`${NAMESPACE}:`));
|
|
260
|
+
if (entry === undefined)
|
|
261
|
+
throw new Error(`[nifra/web] ppr: no output for the shell of "${route.id}"`);
|
|
262
|
+
// Re-exports and the virtual entry have zero bytes too, so every edge stays and only the
|
|
263
|
+
// request-scoped test reads bytes.
|
|
264
|
+
const emitted = (id) => {
|
|
265
|
+
const input = entry.inputs?.[id];
|
|
266
|
+
return (typeof input === "object" &&
|
|
267
|
+
input !== null &&
|
|
268
|
+
"bytesInOutput" in input &&
|
|
269
|
+
typeof input.bytesInOutput === "number" &&
|
|
270
|
+
input.bytesInOutput > 0);
|
|
271
|
+
};
|
|
272
|
+
const absolute = (id) => id.startsWith(`${NAMESPACE}:`) ? id : toPosix(resolve(id));
|
|
273
|
+
const next = new Map();
|
|
274
|
+
const scoped = new Set();
|
|
275
|
+
let root;
|
|
276
|
+
for (const [id, module] of Object.entries(graph.modules)) {
|
|
277
|
+
const from = absolute(id);
|
|
278
|
+
if (id.startsWith(`${NAMESPACE}:`))
|
|
279
|
+
root = from;
|
|
280
|
+
if (emitted(id) && (nifraScoped.has(from) || envImporters.has(from) || requestScoped(from)))
|
|
281
|
+
scoped.add(from);
|
|
282
|
+
next.set(from, module.imports.flatMap((edge) => (edge.path === undefined ? [] : [absolute(edge.path)])));
|
|
283
|
+
}
|
|
284
|
+
if (root === undefined)
|
|
285
|
+
throw new Error(`[nifra/web] ppr: no entry module for "${route.id}"`);
|
|
286
|
+
const chain = requestScopedChain(root, next, scoped);
|
|
287
|
+
if (chain !== undefined)
|
|
288
|
+
throw new ShellCheckError(route.id, chain.slice(1));
|
|
289
|
+
const output = result.outputs.find((artifact) => artifact.kind === "entry-point");
|
|
290
|
+
if (output === undefined)
|
|
291
|
+
throw new Error(`[nifra/web] ppr: no bundle for the shell of "${route.id}"`);
|
|
292
|
+
const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(await output.text())));
|
|
293
|
+
return {
|
|
294
|
+
hash: Array.from(digest, (byte) => byte.toString(16).padStart(2, "0")).join(""),
|
|
295
|
+
sharedHoles: shared?.names ?? [],
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=compile-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-shell.js","sourceRoot":"","sources":["../../../src/internal/ppr/compile-shell.ts"],"names":[],"mappings":"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"}
|