@nifrajs/web 4.0.2 → 5.1.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/README.md +19 -0
- package/dist/build-vite.d.ts +19 -0
- package/dist/build-vite.d.ts.map +1 -1
- package/dist/build-vite.js +31 -10
- package/dist/build-vite.js.map +1 -1
- package/dist/build.d.ts +8 -10
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +90 -31
- package/dist/build.js.map +1 -1
- package/dist/cdn.d.ts +8 -0
- package/dist/cdn.d.ts.map +1 -1
- package/dist/cdn.js +14 -15
- package/dist/cdn.js.map +1 -1
- package/dist/client.d.ts +6 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +46 -18
- package/dist/client.js.map +1 -1
- package/dist/deferred.d.ts +2 -2
- package/dist/deferred.d.ts.map +1 -1
- package/dist/deferred.js +28 -7
- package/dist/deferred.js.map +1 -1
- package/dist/dev-feed.d.ts.map +1 -1
- package/dist/dev-feed.js +24 -5
- package/dist/dev-feed.js.map +1 -1
- package/dist/dev-port.d.ts +3 -2
- package/dist/dev-port.d.ts.map +1 -1
- package/dist/dev-port.js +2 -6
- package/dist/dev-port.js.map +1 -1
- package/dist/dev-session.d.ts.map +1 -1
- package/dist/dev-session.js +4 -14
- package/dist/dev-session.js.map +1 -1
- package/dist/dev.d.ts +7 -17
- package/dist/dev.d.ts.map +1 -1
- package/dist/dev.js +13 -1
- package/dist/dev.js.map +1 -1
- package/dist/draft.d.ts +8 -5
- package/dist/draft.d.ts.map +1 -1
- package/dist/draft.js +30 -13
- package/dist/draft.js.map +1 -1
- package/dist/fonts-google.d.ts.map +1 -1
- package/dist/fonts-google.js +7 -0
- package/dist/fonts-google.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/internal/codegen.d.ts +1 -0
- package/dist/internal/codegen.d.ts.map +1 -1
- package/dist/internal/codegen.js +56 -29
- package/dist/internal/codegen.js.map +1 -1
- package/dist/internal/disposable-dir.d.ts +8 -0
- package/dist/internal/disposable-dir.d.ts.map +1 -0
- package/dist/internal/disposable-dir.js +25 -0
- package/dist/internal/disposable-dir.js.map +1 -0
- package/dist/internal/entry-chunks.d.ts +9 -0
- package/dist/internal/entry-chunks.d.ts.map +1 -0
- package/dist/internal/entry-chunks.js +15 -0
- package/dist/internal/entry-chunks.js.map +1 -0
- package/dist/internal/evidence-traversal.d.ts +12 -0
- package/dist/internal/evidence-traversal.d.ts.map +1 -0
- package/dist/internal/evidence-traversal.js +48 -0
- package/dist/internal/evidence-traversal.js.map +1 -0
- package/dist/internal/head-merge.d.ts +6 -0
- package/dist/internal/head-merge.d.ts.map +1 -1
- package/dist/internal/head-merge.js +9 -0
- package/dist/internal/head-merge.js.map +1 -1
- package/dist/internal/js-string.d.ts +2 -0
- package/dist/internal/js-string.d.ts.map +1 -1
- package/dist/internal/js-string.js +5 -1
- package/dist/internal/js-string.js.map +1 -1
- package/dist/internal/mount-shadow.js +1 -1
- package/dist/internal/mount-shadow.js.map +1 -1
- package/dist/internal/output-guard.d.ts +7 -0
- package/dist/internal/output-guard.d.ts.map +1 -1
- package/dist/internal/output-guard.js +80 -8
- package/dist/internal/output-guard.js.map +1 -1
- package/dist/internal/package-entries.d.ts +34 -0
- package/dist/internal/package-entries.d.ts.map +1 -0
- package/dist/internal/package-entries.js +324 -0
- package/dist/internal/package-entries.js.map +1 -0
- package/dist/internal/page-execution.d.ts +6 -0
- package/dist/internal/page-execution.d.ts.map +1 -1
- package/dist/internal/page-execution.js +437 -114
- package/dist/internal/page-execution.js.map +1 -1
- package/dist/internal/parity.d.ts.map +1 -1
- package/dist/internal/parity.js +15 -2
- package/dist/internal/parity.js.map +1 -1
- package/dist/internal/private-env.d.ts +8 -0
- package/dist/internal/private-env.d.ts.map +1 -1
- package/dist/internal/private-env.js +25 -10
- package/dist/internal/private-env.js.map +1 -1
- package/dist/internal/progressive-cookies.d.ts +14 -0
- package/dist/internal/progressive-cookies.d.ts.map +1 -0
- package/dist/internal/progressive-cookies.js +43 -0
- package/dist/internal/progressive-cookies.js.map +1 -0
- package/dist/internal/public-env.d.ts +2 -0
- package/dist/internal/public-env.d.ts.map +1 -0
- package/dist/internal/public-env.js +13 -0
- package/dist/internal/public-env.js.map +1 -0
- package/dist/internal/render-document.d.ts +5 -44
- package/dist/internal/render-document.d.ts.map +1 -1
- package/dist/internal/render-document.js +51 -63
- package/dist/internal/render-document.js.map +1 -1
- package/dist/internal/response-controls.d.ts +2 -0
- package/dist/internal/response-controls.d.ts.map +1 -1
- package/dist/internal/response-controls.js +26 -16
- package/dist/internal/response-controls.js.map +1 -1
- package/dist/internal/revive-dates.d.ts +16 -0
- package/dist/internal/revive-dates.d.ts.map +1 -0
- package/dist/internal/revive-dates.js +32 -0
- package/dist/internal/revive-dates.js.map +1 -0
- package/dist/internal/route-path.d.ts +14 -0
- package/dist/internal/route-path.d.ts.map +1 -0
- package/dist/internal/route-path.js +19 -0
- package/dist/internal/route-path.js.map +1 -0
- package/dist/internal/secret-scan.d.ts.map +1 -1
- package/dist/internal/secret-scan.js +190 -20
- package/dist/internal/secret-scan.js.map +1 -1
- package/dist/internal/server-boundary.d.ts.map +1 -1
- package/dist/internal/server-boundary.js +33 -5
- package/dist/internal/server-boundary.js.map +1 -1
- package/dist/internal/web-app.d.ts +25 -18
- package/dist/internal/web-app.d.ts.map +1 -1
- package/dist/internal/web-app.js +81 -24
- package/dist/internal/web-app.js.map +1 -1
- package/dist/internal/wire-date.d.ts +3 -0
- package/dist/internal/wire-date.d.ts.map +1 -0
- package/dist/internal/wire-date.js +14 -0
- package/dist/internal/wire-date.js.map +1 -0
- package/dist/internal/without-query.d.ts +4 -0
- package/dist/internal/without-query.d.ts.map +1 -0
- package/dist/internal/without-query.js +9 -0
- package/dist/internal/without-query.js.map +1 -0
- package/dist/internal/zone-graph.d.ts +4 -0
- package/dist/internal/zone-graph.d.ts.map +1 -1
- package/dist/internal/zone-graph.js +71 -20
- package/dist/internal/zone-graph.js.map +1 -1
- package/dist/isr.d.ts +59 -3
- package/dist/isr.d.ts.map +1 -1
- package/dist/isr.js +311 -41
- package/dist/isr.js.map +1 -1
- package/dist/llms-txt.d.ts +2 -0
- package/dist/llms-txt.d.ts.map +1 -1
- package/dist/llms-txt.js +29 -3
- package/dist/llms-txt.js.map +1 -1
- package/dist/manifest.d.ts +37 -4
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +4 -0
- package/dist/manifest.js.map +1 -1
- package/dist/open-resolved.d.ts +18 -0
- package/dist/open-resolved.d.ts.map +1 -0
- package/dist/open-resolved.js +62 -0
- package/dist/open-resolved.js.map +1 -0
- package/dist/plugins/kit.d.ts +1 -0
- package/dist/plugins/kit.d.ts.map +1 -1
- package/dist/plugins/kit.js +26 -11
- package/dist/plugins/kit.js.map +1 -1
- package/dist/plugins/vite-leak-guard.d.ts +9 -1
- package/dist/plugins/vite-leak-guard.d.ts.map +1 -1
- package/dist/plugins/vite-leak-guard.js +84 -7
- package/dist/plugins/vite-leak-guard.js.map +1 -1
- package/dist/plugins/vite-zone-guard.d.ts.map +1 -1
- package/dist/plugins/vite-zone-guard.js +17 -21
- package/dist/plugins/vite-zone-guard.js.map +1 -1
- package/dist/plugins/zone-guard.d.ts.map +1 -1
- package/dist/plugins/zone-guard.js +44 -3
- package/dist/plugins/zone-guard.js.map +1 -1
- package/dist/prerender.d.ts +5 -1
- package/dist/prerender.d.ts.map +1 -1
- package/dist/prerender.js +41 -19
- package/dist/prerender.js.map +1 -1
- package/dist/public-dir.d.ts +8 -1
- package/dist/public-dir.d.ts.map +1 -1
- package/dist/public-dir.js +17 -6
- package/dist/public-dir.js.map +1 -1
- package/dist/query.d.ts +13 -4
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +89 -26
- package/dist/query.js.map +1 -1
- package/dist/render-seam.d.ts +25 -2
- package/dist/render-seam.d.ts.map +1 -1
- package/dist/render-seam.js +1 -0
- package/dist/render-seam.js.map +1 -1
- package/dist/route-types.d.ts.map +1 -1
- package/dist/route-types.js +20 -9
- package/dist/route-types.js.map +1 -1
- package/dist/router.d.ts +9 -2
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +47 -50
- package/dist/router.js.map +1 -1
- package/dist/seo.d.ts +49 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +48 -0
- package/dist/seo.js.map +1 -0
- package/dist/server-components/build-info.d.ts +3 -0
- package/dist/server-components/build-info.d.ts.map +1 -0
- package/dist/server-components/build-info.js +7 -0
- package/dist/server-components/build-info.js.map +1 -0
- package/dist/server-components/build-target.d.ts +12 -0
- package/dist/server-components/build-target.d.ts.map +1 -0
- package/dist/server-components/build-target.js +153 -0
- package/dist/server-components/build-target.js.map +1 -0
- package/dist/server-components/build.d.ts +24 -0
- package/dist/server-components/build.d.ts.map +1 -0
- package/dist/server-components/build.js +366 -0
- package/dist/server-components/build.js.map +1 -0
- package/dist/server-components/bundle-proof.d.ts +3 -0
- package/dist/server-components/bundle-proof.d.ts.map +1 -0
- package/dist/server-components/bundle-proof.js +23 -0
- package/dist/server-components/bundle-proof.js.map +1 -0
- package/dist/server-components/client.d.ts +46 -0
- package/dist/server-components/client.d.ts.map +1 -0
- package/dist/server-components/client.js +594 -0
- package/dist/server-components/client.js.map +1 -0
- package/dist/server-components/definition.d.ts +11 -0
- package/dist/server-components/definition.d.ts.map +1 -0
- package/dist/server-components/definition.js +94 -0
- package/dist/server-components/definition.js.map +1 -0
- package/dist/server-components/dev-http.d.ts +5 -0
- package/dist/server-components/dev-http.d.ts.map +1 -0
- package/dist/server-components/dev-http.js +71 -0
- package/dist/server-components/dev-http.js.map +1 -0
- package/dist/server-components/error.d.ts +9 -0
- package/dist/server-components/error.d.ts.map +1 -0
- package/dist/server-components/error.js +24 -0
- package/dist/server-components/error.js.map +1 -0
- package/dist/server-components/frames.d.ts +7 -0
- package/dist/server-components/frames.d.ts.map +1 -0
- package/dist/server-components/frames.js +169 -0
- package/dist/server-components/frames.js.map +1 -0
- package/dist/server-components/html-policy.d.ts +6 -0
- package/dist/server-components/html-policy.d.ts.map +1 -0
- package/dist/server-components/html-policy.js +75 -0
- package/dist/server-components/html-policy.js.map +1 -0
- package/dist/server-components/html.d.ts +4 -0
- package/dist/server-components/html.d.ts.map +1 -0
- package/dist/server-components/html.js +67 -0
- package/dist/server-components/html.js.map +1 -0
- package/dist/server-components/islands.d.ts +44 -0
- package/dist/server-components/islands.d.ts.map +1 -0
- package/dist/server-components/islands.js +42 -0
- package/dist/server-components/islands.js.map +1 -0
- package/dist/server-components/native.d.ts +4 -0
- package/dist/server-components/native.d.ts.map +1 -0
- package/dist/server-components/native.js +81 -0
- package/dist/server-components/native.js.map +1 -0
- package/dist/server-components/portal.d.ts +6 -0
- package/dist/server-components/portal.d.ts.map +1 -0
- package/dist/server-components/portal.js +35 -0
- package/dist/server-components/portal.js.map +1 -0
- package/dist/server-components/props.d.ts +3 -0
- package/dist/server-components/props.d.ts.map +1 -0
- package/dist/server-components/props.js +14 -0
- package/dist/server-components/props.js.map +1 -0
- package/dist/server-components/protocol.d.ts +44 -0
- package/dist/server-components/protocol.d.ts.map +1 -0
- package/dist/server-components/protocol.js +139 -0
- package/dist/server-components/protocol.js.map +1 -0
- package/dist/server-components/range.d.ts +24 -0
- package/dist/server-components/range.d.ts.map +1 -0
- package/dist/server-components/range.js +263 -0
- package/dist/server-components/range.js.map +1 -0
- package/dist/server-components/registry.d.ts +6 -0
- package/dist/server-components/registry.d.ts.map +1 -0
- package/dist/server-components/registry.js +30 -0
- package/dist/server-components/registry.js.map +1 -0
- package/dist/server-components/response.d.ts +4 -0
- package/dist/server-components/response.d.ts.map +1 -0
- package/dist/server-components/response.js +32 -0
- package/dist/server-components/response.js.map +1 -0
- package/dist/server-components/router-integration.d.ts +9 -0
- package/dist/server-components/router-integration.d.ts.map +1 -0
- package/dist/server-components/router-integration.js +29 -0
- package/dist/server-components/router-integration.js.map +1 -0
- package/dist/server-components/runtime.d.ts +14 -0
- package/dist/server-components/runtime.d.ts.map +1 -0
- package/dist/server-components/runtime.js +276 -0
- package/dist/server-components/runtime.js.map +1 -0
- package/dist/server-components/scheduler.d.ts +14 -0
- package/dist/server-components/scheduler.d.ts.map +1 -0
- package/dist/server-components/scheduler.js +74 -0
- package/dist/server-components/scheduler.js.map +1 -0
- package/dist/server-components/schema.d.ts +4 -0
- package/dist/server-components/schema.d.ts.map +1 -0
- package/dist/server-components/schema.js +77 -0
- package/dist/server-components/schema.js.map +1 -0
- package/dist/server-components/server-entry.d.ts +12 -0
- package/dist/server-components/server-entry.d.ts.map +1 -0
- package/dist/server-components/server-entry.js +90 -0
- package/dist/server-components/server-entry.js.map +1 -0
- package/dist/server-components/source.d.ts +15 -0
- package/dist/server-components/source.d.ts.map +1 -0
- package/dist/server-components/source.js +269 -0
- package/dist/server-components/source.js.map +1 -0
- package/dist/server-components/state.d.ts +4 -0
- package/dist/server-components/state.d.ts.map +1 -0
- package/dist/server-components/state.js +123 -0
- package/dist/server-components/state.js.map +1 -0
- package/dist/server-components/stream.d.ts +6 -0
- package/dist/server-components/stream.d.ts.map +1 -0
- package/dist/server-components/stream.js +70 -0
- package/dist/server-components/stream.js.map +1 -0
- package/dist/server-components/trusted-html.d.ts +3 -0
- package/dist/server-components/trusted-html.d.ts.map +1 -0
- package/dist/server-components/trusted-html.js +14 -0
- package/dist/server-components/trusted-html.js.map +1 -0
- package/dist/server-components/types.d.ts +107 -0
- package/dist/server-components/types.d.ts.map +1 -0
- package/dist/server-components/types.js +2 -0
- package/dist/server-components/types.js.map +1 -0
- package/dist/server-components/typescript.d.ts +11 -0
- package/dist/server-components/typescript.d.ts.map +1 -0
- package/dist/server-components/typescript.js +28 -0
- package/dist/server-components/typescript.js.map +1 -0
- package/dist/server-components/value.d.ts +5 -0
- package/dist/server-components/value.d.ts.map +1 -0
- package/dist/server-components/value.js +77 -0
- package/dist/server-components/value.js.map +1 -0
- package/dist/server-components/vite.d.ts +12 -0
- package/dist/server-components/vite.d.ts.map +1 -0
- package/dist/server-components/vite.js +197 -0
- package/dist/server-components/vite.js.map +1 -0
- package/dist/server-components.d.ts +5 -0
- package/dist/server-components.d.ts.map +1 -0
- package/dist/server-components.js +4 -0
- package/dist/server-components.js.map +1 -0
- package/dist/service-worker.d.ts +8 -1
- package/dist/service-worker.d.ts.map +1 -1
- package/dist/service-worker.js +20 -6
- package/dist/service-worker.js.map +1 -1
- package/dist/vite.d.ts +12 -0
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +7 -1
- package/dist/vite.js.map +1 -1
- package/dist/zones.d.ts +64 -2
- package/dist/zones.d.ts.map +1 -1
- package/dist/zones.js +331 -28
- package/dist/zones.js.map +1 -1
- package/package.json +102 -4
- package/src/build-vite.ts +31 -9
- package/src/build.ts +109 -31
- package/src/cdn.ts +18 -12
- package/src/client.ts +48 -17
- package/src/deferred.ts +27 -9
- package/src/dev-feed.ts +24 -5
- package/src/dev-port.ts +4 -10
- package/src/dev-session.ts +4 -13
- package/src/dev.ts +29 -1
- package/src/draft.ts +35 -14
- package/src/fonts-google.ts +10 -0
- package/src/index.ts +5 -6
- package/src/internal/codegen.ts +60 -29
- package/src/internal/disposable-dir.ts +24 -0
- package/src/internal/entry-chunks.ts +18 -0
- package/src/internal/evidence-traversal.ts +57 -0
- package/src/internal/head-merge.ts +16 -0
- package/src/internal/js-string.ts +6 -1
- package/src/internal/mount-shadow.ts +1 -1
- package/src/internal/output-guard.ts +88 -7
- package/src/internal/package-entries.ts +331 -0
- package/src/internal/page-execution.ts +573 -114
- package/src/internal/parity.ts +15 -2
- package/src/internal/private-env.ts +27 -13
- package/src/internal/progressive-cookies.ts +60 -0
- package/src/internal/public-env.ts +14 -0
- package/src/internal/render-document.ts +66 -89
- package/src/internal/response-controls.ts +31 -14
- package/src/internal/revive-dates.ts +35 -0
- package/src/internal/route-path.ts +24 -0
- package/src/internal/secret-scan.ts +190 -18
- package/src/internal/server-boundary.ts +29 -5
- package/src/internal/web-app.ts +126 -42
- package/src/internal/wire-date.ts +16 -0
- package/src/internal/without-query.ts +8 -0
- package/src/internal/zone-graph.ts +78 -25
- package/src/isr.ts +364 -45
- package/src/llms-txt.ts +32 -3
- package/src/manifest.ts +38 -4
- package/src/open-resolved.ts +64 -0
- package/src/plugins/kit.ts +31 -11
- package/src/plugins/vite-leak-guard.ts +104 -8
- package/src/plugins/vite-zone-guard.ts +21 -19
- package/src/plugins/zone-guard.ts +41 -2
- package/src/prerender.ts +39 -18
- package/src/public-dir.ts +27 -8
- package/src/query.ts +107 -26
- package/src/render-seam.ts +30 -2
- package/src/route-types.ts +34 -7
- package/src/router.ts +66 -59
- package/src/seo.ts +68 -0
- package/src/server-components/build-info.ts +11 -0
- package/src/server-components/build-target.ts +194 -0
- package/src/server-components/build.ts +419 -0
- package/src/server-components/bundle-proof.ts +33 -0
- package/src/server-components/client.ts +663 -0
- package/src/server-components/definition.ts +125 -0
- package/src/server-components/dev-http.ts +75 -0
- package/src/server-components/error.ts +24 -0
- package/src/server-components/frames.ts +181 -0
- package/src/server-components/html-policy.ts +94 -0
- package/src/server-components/html.ts +81 -0
- package/src/server-components/islands.ts +111 -0
- package/src/server-components/native.ts +101 -0
- package/src/server-components/portal.ts +42 -0
- package/src/server-components/props.ts +19 -0
- package/src/server-components/protocol.ts +167 -0
- package/src/server-components/range.ts +313 -0
- package/src/server-components/registry.ts +34 -0
- package/src/server-components/response.ts +44 -0
- package/src/server-components/router-integration.ts +40 -0
- package/src/server-components/runtime.ts +376 -0
- package/src/server-components/scheduler.ts +84 -0
- package/src/server-components/schema.ts +69 -0
- package/src/server-components/server-entry.ts +98 -0
- package/src/server-components/source.ts +324 -0
- package/src/server-components/state.ts +143 -0
- package/src/server-components/stream.ts +71 -0
- package/src/server-components/trusted-html.ts +21 -0
- package/src/server-components/types.ts +138 -0
- package/src/server-components/typescript.ts +39 -0
- package/src/server-components/value.ts +82 -0
- package/src/server-components/vite.ts +242 -0
- package/src/server-components.ts +32 -0
- package/src/service-worker.ts +24 -7
- package/src/vite.ts +8 -1
- package/src/zones.ts +418 -32
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `t.date()` across the wire, server half. JSON has no dates, so the output guard hands the page a
|
|
3
|
+
* `wireDate()`: a real `Date` for the server render that serializes as `{ "__nifra_date": iso }`. The
|
|
4
|
+
* browser half (`revive-dates.ts`) rebuilds those tags, so both renders see the same value.
|
|
5
|
+
*/
|
|
6
|
+
import { DATE_TAG } from "./revive-dates.ts"
|
|
7
|
+
|
|
8
|
+
const WIRE_JSON: PropertyDescriptor = {
|
|
9
|
+
value(this: Date): Readonly<Record<string, string>> {
|
|
10
|
+
return { [DATE_TAG]: this.toISOString() }
|
|
11
|
+
},
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** A `Date` that crosses JSON tagged, so the browser can tell it from a string that looks like one. */
|
|
15
|
+
export const wireDate = (time: number): Date =>
|
|
16
|
+
Object.defineProperty(new Date(time), "toJSON", WIRE_JSON)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** A module id or specifier up to its first `?` or `#`. An index scan, since `/[?#].*$/` retries
|
|
2
|
+
* from every `#` and runs in quadratic time on a long run of them before a line break. */
|
|
3
|
+
export function withoutQuery(value: string): string {
|
|
4
|
+
const query = value.indexOf("?")
|
|
5
|
+
const hash = value.indexOf("#")
|
|
6
|
+
const cut = query === -1 ? hash : hash === -1 ? query : Math.min(query, hash)
|
|
7
|
+
return cut === -1 ? value : value.slice(0, cut)
|
|
8
|
+
}
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
} from "../zones.ts"
|
|
20
20
|
import { codeUnitOrder } from "./code-unit-order.ts"
|
|
21
21
|
import { isBareNodeBuiltin } from "./node-builtins.ts"
|
|
22
|
+
import { withoutQuery } from "./without-query.ts"
|
|
22
23
|
|
|
23
24
|
/** What a graph module id names. */
|
|
24
25
|
export type ModuleSource =
|
|
@@ -30,9 +31,8 @@ export type ModuleSource =
|
|
|
30
31
|
|
|
31
32
|
/** A namespace prefix needs two characters, so a Windows drive letter still reads as a path. */
|
|
32
33
|
const NAMESPACED = /^([a-z][\w.+-]+):(.*)$/i
|
|
33
|
-
const stripQuery = (id: string): string => id.replace(/[?#].*$/, "")
|
|
34
34
|
const virtualOf = (rest: string): ModuleSource => {
|
|
35
|
-
const file =
|
|
35
|
+
const file = withoutQuery(rest)
|
|
36
36
|
return isAbsolute(file) && existsSync(file) ? { kind: "virtual", file } : { kind: "virtual" }
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -42,7 +42,7 @@ export function bunModuleSource(cwd: string): (id: string) => ModuleSource {
|
|
|
42
42
|
if (id.startsWith("node:") || id.startsWith("bun:")) return { kind: "builtin" }
|
|
43
43
|
const namespaced = NAMESPACED.exec(id)
|
|
44
44
|
if (namespaced !== null && namespaced[1] !== "file") return virtualOf(namespaced[2] ?? "")
|
|
45
|
-
return { kind: "file", file: resolve(cwd,
|
|
45
|
+
return { kind: "file", file: resolve(cwd, withoutQuery(namespaced?.[2] ?? id)) }
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -50,7 +50,7 @@ export function bunModuleSource(cwd: string): (id: string) => ModuleSource {
|
|
|
50
50
|
export function rollupModuleSource(id: string): ModuleSource {
|
|
51
51
|
if (id.startsWith("node:") || id.includes("__vite-browser-external")) return { kind: "builtin" }
|
|
52
52
|
if (id.startsWith("\0")) return virtualOf(id.slice(1).replace(/^[\w-]+:/, ""))
|
|
53
|
-
const file =
|
|
53
|
+
const file = withoutQuery(id)
|
|
54
54
|
return isAbsolute(file) ? { kind: "file", file } : { kind: "virtual" }
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -60,6 +60,38 @@ export interface ZoneLeak {
|
|
|
60
60
|
readonly reason: string
|
|
61
61
|
/** Shortest import path from an entry: `[entry, ...as-written specifiers]`. */
|
|
62
62
|
readonly chain: readonly string[]
|
|
63
|
+
/** The undeclared package the refusal is about; its files share one line in the report. */
|
|
64
|
+
readonly package?: string
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const leakLine = (leak: ZoneLeak, module = leak.module): string =>
|
|
68
|
+
` - ${module}: ${leak.reason}${leak.chain.length > 1 ? `\n via ${leak.chain.join(" → ")}` : ""}`
|
|
69
|
+
|
|
70
|
+
/** One line per leak, except that the files of one undeclared package share a single line. */
|
|
71
|
+
function leakLines(leaks: readonly ZoneLeak[]): string[] {
|
|
72
|
+
const byPackage = new Map<string, ZoneLeak[]>()
|
|
73
|
+
for (const leak of leaks) {
|
|
74
|
+
if (leak.package === undefined) continue
|
|
75
|
+
const group = byPackage.get(leak.package)
|
|
76
|
+
if (group === undefined) byPackage.set(leak.package, [leak])
|
|
77
|
+
else group.push(leak)
|
|
78
|
+
}
|
|
79
|
+
const lines: string[] = []
|
|
80
|
+
for (const leak of leaks) {
|
|
81
|
+
const group = leak.package === undefined ? undefined : byPackage.get(leak.package)
|
|
82
|
+
if (group === undefined || group.length < 2) {
|
|
83
|
+
lines.push(leakLine(leak))
|
|
84
|
+
continue
|
|
85
|
+
}
|
|
86
|
+
if (group[0] !== leak) continue
|
|
87
|
+
const shown = group
|
|
88
|
+
.slice(0, 3)
|
|
89
|
+
.map((item) => item.module)
|
|
90
|
+
.join(", ")
|
|
91
|
+
const more = group.length > 3 ? ` and ${group.length - 3} more` : ""
|
|
92
|
+
lines.push(leakLine(leak, `${group.length} files (${shown}${more})`))
|
|
93
|
+
}
|
|
94
|
+
return lines
|
|
63
95
|
}
|
|
64
96
|
|
|
65
97
|
export interface ClientGraphVerdict {
|
|
@@ -71,6 +103,8 @@ export interface ClientGraphVerdict {
|
|
|
71
103
|
}
|
|
72
104
|
|
|
73
105
|
export interface VerifyClientGraphOptions {
|
|
106
|
+
/** Exact modules certified by the component compiler in this generation. */
|
|
107
|
+
readonly componentModules?: ReadonlySet<string>
|
|
74
108
|
readonly classifier: ZoneClassifier
|
|
75
109
|
readonly sourceOf: (id: string) => ModuleSource
|
|
76
110
|
/** The private-env denial for a browser-code file (see `privateEnvCheck`); unchecked when absent. */
|
|
@@ -192,16 +226,21 @@ export function verifyClientGraph(
|
|
|
192
226
|
}
|
|
193
227
|
|
|
194
228
|
const denied = new Map<string, string>()
|
|
229
|
+
const deniedPackage = new Map<string, string>()
|
|
195
230
|
for (const id of [...Object.keys(graph.modules), ...dropped]) {
|
|
196
231
|
const source = sourceOf(id)
|
|
197
232
|
const file = source.kind === "builtin" ? undefined : source.file
|
|
198
233
|
if (file === undefined) continue
|
|
199
234
|
const classification = classifier.classify(file)
|
|
200
235
|
let reason = browserDenial(classification)
|
|
201
|
-
|
|
236
|
+
// An import that names a package entry is judged by that entry's own declared side.
|
|
237
|
+
for (const spec of specifiers.get(id) ?? [])
|
|
238
|
+
reason ??= browserDenial(classifier.classify(file, spec), spec)
|
|
202
239
|
if (reason === undefined && BROWSER_CODE.has(classification.zone))
|
|
203
240
|
reason = options.privateEnv?.(file)
|
|
204
241
|
if (reason !== undefined) denied.set(id, reason)
|
|
242
|
+
if (classification.zone === "error" && classification.package !== undefined)
|
|
243
|
+
deniedPackage.set(id, classification.package)
|
|
205
244
|
}
|
|
206
245
|
|
|
207
246
|
// Chains start at a route file where they can: a lazily split module is an entry of its own chunk,
|
|
@@ -225,11 +264,15 @@ export function verifyClientGraph(
|
|
|
225
264
|
: entries
|
|
226
265
|
const chains = denied.size === 0 ? new Map<string, string[]>() : shortestChains(roots, edges)
|
|
227
266
|
const leaks = [...denied]
|
|
228
|
-
.map(([id, reason]) =>
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
267
|
+
.map(([id, reason]): ZoneLeak => {
|
|
268
|
+
const leak = {
|
|
269
|
+
module: labelOf(id),
|
|
270
|
+
reason,
|
|
271
|
+
chain: (chains.get(id) ?? [id]).map((label, i) => (i === 0 ? labelOf(label) : label)),
|
|
272
|
+
}
|
|
273
|
+
const pkg = deniedPackage.get(id)
|
|
274
|
+
return pkg === undefined ? leak : { ...leak, package: pkg }
|
|
275
|
+
})
|
|
233
276
|
.sort((a, b) => codeUnitOrder(a.module, b.module))
|
|
234
277
|
|
|
235
278
|
const misplacedExports: string[] = []
|
|
@@ -333,10 +376,14 @@ export function verifyServerGraph(
|
|
|
333
376
|
readonly module: string
|
|
334
377
|
readonly reason: string
|
|
335
378
|
readonly tail?: string
|
|
379
|
+
readonly package?: string
|
|
336
380
|
}> = []
|
|
337
381
|
for (const [id, module] of Object.entries(graph.modules)) {
|
|
338
382
|
const from = classOf(id)
|
|
339
|
-
if (from?.zone === "error")
|
|
383
|
+
if (from?.zone === "error") {
|
|
384
|
+
const at = { at: id, module: labelOf(id), reason: from.reason }
|
|
385
|
+
found.push(from.package === undefined ? at : { ...at, package: from.package })
|
|
386
|
+
}
|
|
340
387
|
const file = fileOf(id)
|
|
341
388
|
const env =
|
|
342
389
|
from !== undefined && file !== undefined && BROWSER_CODE.has(from.zone)
|
|
@@ -361,10 +408,23 @@ export function verifyServerGraph(
|
|
|
361
408
|
const target = resolveEdge(im)
|
|
362
409
|
if (target === undefined) continue
|
|
363
410
|
out.push({ to: target, label: im.original ?? labelOf(target) })
|
|
364
|
-
const
|
|
411
|
+
const targetFile = fileOf(target)
|
|
412
|
+
const to =
|
|
413
|
+
im.original === undefined || targetFile === undefined
|
|
414
|
+
? classOf(target)
|
|
415
|
+
: classifier.classify(targetFile, im.original)
|
|
416
|
+
if (to?.zone === "error" && to.entry !== undefined)
|
|
417
|
+
found.push({
|
|
418
|
+
at: id,
|
|
419
|
+
module: labelOf(target),
|
|
420
|
+
reason: to.reason,
|
|
421
|
+
tail: im.original ?? labelOf(target),
|
|
422
|
+
})
|
|
365
423
|
if (from === undefined || to === undefined || from.zone === "error" || to.zone === "error")
|
|
366
424
|
continue
|
|
367
|
-
|
|
425
|
+
const componentBridge =
|
|
426
|
+
to.zone === "component" && options.componentModules?.has(fileOf(target) ?? "") === true
|
|
427
|
+
if (!componentBridge && !importAllowed(from.zone, to.zone)) {
|
|
368
428
|
found.push({
|
|
369
429
|
at: id,
|
|
370
430
|
module: labelOf(target),
|
|
@@ -386,9 +446,10 @@ export function verifyServerGraph(
|
|
|
386
446
|
]
|
|
387
447
|
const chains = shortestChains(entries, edges)
|
|
388
448
|
const violations = found
|
|
389
|
-
.map(({ at, module, reason, tail }) => {
|
|
449
|
+
.map(({ at, module, reason, tail, package: pkg }): ZoneLeak => {
|
|
390
450
|
const chain = (chains.get(at) ?? [at]).map((label, i) => (i === 0 ? labelOf(label) : label))
|
|
391
|
-
|
|
451
|
+
const violation = { module, reason, chain: tail === undefined ? chain : [...chain, tail] }
|
|
452
|
+
return pkg === undefined ? violation : { ...violation, package: pkg }
|
|
392
453
|
})
|
|
393
454
|
.sort((a, b) => codeUnitOrder(a.module, b.module) || codeUnitOrder(a.reason, b.reason))
|
|
394
455
|
return { violations }
|
|
@@ -397,11 +458,7 @@ export function verifyServerGraph(
|
|
|
397
458
|
/** The build-failing message for a server graph that breaks the zone rules. */
|
|
398
459
|
export function formatServerGraphVerdict(verdict: ServerGraphVerdict): string | undefined {
|
|
399
460
|
if (verdict.violations.length === 0) return undefined
|
|
400
|
-
|
|
401
|
-
(v) =>
|
|
402
|
-
` - ${v.module}: ${v.reason}${v.chain.length > 1 ? `\n via ${v.chain.join(" → ")}` : ""}`,
|
|
403
|
-
)
|
|
404
|
-
return `[nifra/web] the server build breaks the zone rules:\n${lines.join("\n")}`
|
|
461
|
+
return `[nifra/web] the server build breaks the zone rules:\n${leakLines(verdict.violations).join("\n")}`
|
|
405
462
|
}
|
|
406
463
|
|
|
407
464
|
/** One emitted file, as the accounting sees it. */
|
|
@@ -561,12 +618,8 @@ const indent = (lines: readonly string[]): string => lines.map((line) => ` - ${
|
|
|
561
618
|
export function formatClientGraphVerdict(verdict: ClientGraphVerdict): string | undefined {
|
|
562
619
|
const sections: string[] = []
|
|
563
620
|
if (verdict.leaks.length > 0) {
|
|
564
|
-
const lines = verdict.leaks.map(
|
|
565
|
-
(leak) =>
|
|
566
|
-
` - ${leak.module}: ${leak.reason}${leak.chain.length > 1 ? `\n via ${leak.chain.join(" → ")}` : ""}`,
|
|
567
|
-
)
|
|
568
621
|
sections.push(
|
|
569
|
-
`[nifra/web] the browser build reached code that may not ship to a browser:\n${
|
|
622
|
+
`[nifra/web] the browser build reached code that may not ship to a browser:\n${leakLines(verdict.leaks).join("\n")}\n` +
|
|
570
623
|
"Reach backend code through a route's backend half (x.backend.ts) or a *.fn.ts server function; " +
|
|
571
624
|
"code both sides need belongs in shared/.",
|
|
572
625
|
)
|