@nifrajs/web 3.5.0 → 4.0.2
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/dist/backend-only.d.ts +15 -0
- package/dist/backend-only.d.ts.map +1 -0
- package/dist/backend-only.js +16 -0
- package/dist/backend-only.js.map +1 -0
- package/dist/boundary.d.ts +5 -0
- package/dist/boundary.d.ts.map +1 -1
- package/dist/boundary.js +11 -2
- package/dist/boundary.js.map +1 -1
- package/dist/build-plan.d.ts +18 -6
- package/dist/build-plan.d.ts.map +1 -1
- package/dist/build-plan.js +82 -34
- package/dist/build-plan.js.map +1 -1
- package/dist/build-vite.d.ts +4 -0
- package/dist/build-vite.d.ts.map +1 -1
- package/dist/build-vite.js +68 -13
- package/dist/build-vite.js.map +1 -1
- package/dist/build.d.ts +57 -23
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +356 -85
- package/dist/build.js.map +1 -1
- package/dist/bun-dev-entry.d.ts +1 -1
- package/dist/bun-dev-entry.js +1 -1
- package/dist/cdn.d.ts +74 -0
- package/dist/cdn.d.ts.map +1 -0
- package/dist/cdn.js +132 -0
- package/dist/cdn.js.map +1 -0
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +136 -35
- package/dist/client.js.map +1 -1
- package/dist/conformance.d.ts +4 -3
- package/dist/conformance.d.ts.map +1 -1
- package/dist/conformance.js +12 -3
- package/dist/conformance.js.map +1 -1
- package/dist/csp.d.ts +93 -0
- package/dist/csp.d.ts.map +1 -0
- package/dist/csp.js +122 -0
- package/dist/csp.js.map +1 -0
- package/dist/dev-client.d.ts +76 -0
- package/dist/dev-client.d.ts.map +1 -0
- package/dist/dev-client.js +280 -0
- package/dist/dev-client.js.map +1 -0
- package/dist/dev-diagnostics.d.ts +26 -2
- package/dist/dev-diagnostics.d.ts.map +1 -1
- package/dist/dev-diagnostics.js +38 -7
- package/dist/dev-diagnostics.js.map +1 -1
- package/dist/dev-error.d.ts +4 -13
- package/dist/dev-error.d.ts.map +1 -1
- package/dist/dev-error.js +46 -4
- package/dist/dev-error.js.map +1 -1
- package/dist/dev-feed.d.ts +298 -0
- package/dist/dev-feed.d.ts.map +1 -0
- package/dist/dev-feed.js +797 -0
- package/dist/dev-feed.js.map +1 -0
- package/dist/dev-indicator.d.ts +38 -0
- package/dist/dev-indicator.d.ts.map +1 -0
- package/dist/dev-indicator.js +93 -0
- package/dist/dev-indicator.js.map +1 -0
- package/dist/dev-session.d.ts +77 -0
- package/dist/dev-session.d.ts.map +1 -0
- package/dist/dev-session.js +580 -0
- package/dist/dev-session.js.map +1 -0
- package/dist/dev-sourcemap.d.ts +27 -0
- package/dist/dev-sourcemap.d.ts.map +1 -0
- package/dist/dev-sourcemap.js +235 -0
- package/dist/dev-sourcemap.js.map +1 -0
- package/dist/dev-ssr-graph.d.ts.map +1 -1
- package/dist/dev-ssr-graph.js +13 -5
- package/dist/dev-ssr-graph.js.map +1 -1
- package/dist/dev.d.ts +15 -2
- package/dist/dev.d.ts.map +1 -1
- package/dist/dev.js +69 -44
- package/dist/dev.js.map +1 -1
- package/dist/diagnostic-catalog.d.ts +35 -0
- package/dist/diagnostic-catalog.d.ts.map +1 -0
- package/dist/diagnostic-catalog.js +203 -0
- package/dist/diagnostic-catalog.js.map +1 -0
- package/dist/diagnostic-prompt.d.ts +49 -0
- package/dist/diagnostic-prompt.d.ts.map +1 -0
- package/dist/diagnostic-prompt.js +303 -0
- package/dist/diagnostic-prompt.js.map +1 -0
- package/dist/diagnostic.d.ts +17 -23
- package/dist/diagnostic.d.ts.map +1 -1
- package/dist/diagnostic.js +31 -39
- package/dist/diagnostic.js.map +1 -1
- package/dist/draft.d.ts.map +1 -1
- package/dist/draft.js +4 -1
- package/dist/draft.js.map +1 -1
- package/dist/fn.d.ts +5 -0
- package/dist/fn.d.ts.map +1 -1
- package/dist/fn.js +13 -3
- package/dist/fn.js.map +1 -1
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +4 -2
- package/dist/fs.js.map +1 -1
- package/dist/index.d.ts +13 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -12
- package/dist/index.js.map +1 -1
- package/dist/internal/cdn/cloudflare.d.ts +48 -0
- package/dist/internal/cdn/cloudflare.d.ts.map +1 -0
- package/dist/internal/cdn/cloudflare.js +94 -0
- package/dist/internal/cdn/cloudflare.js.map +1 -0
- package/dist/internal/cdn/core.d.ts +91 -0
- package/dist/internal/cdn/core.d.ts.map +1 -0
- package/dist/internal/cdn/core.js +220 -0
- package/dist/internal/cdn/core.js.map +1 -0
- package/dist/internal/cdn/fastly.d.ts +17 -0
- package/dist/internal/cdn/fastly.d.ts.map +1 -0
- package/dist/internal/cdn/fastly.js +43 -0
- package/dist/internal/cdn/fastly.js.map +1 -0
- package/dist/internal/cdn/vercel.d.ts +31 -0
- package/dist/internal/cdn/vercel.d.ts.map +1 -0
- package/dist/internal/cdn/vercel.js +56 -0
- package/dist/internal/cdn/vercel.js.map +1 -0
- package/dist/internal/code-unit-order.d.ts +4 -0
- package/dist/internal/code-unit-order.d.ts.map +1 -0
- package/dist/internal/code-unit-order.js +6 -0
- package/dist/internal/code-unit-order.js.map +1 -0
- package/dist/internal/codegen.d.ts.map +1 -1
- package/dist/internal/codegen.js +141 -25
- package/dist/internal/codegen.js.map +1 -1
- package/dist/internal/dev-csp.d.ts +24 -0
- package/dist/internal/dev-csp.d.ts.map +1 -0
- package/dist/internal/dev-csp.js +160 -0
- package/dist/internal/dev-csp.js.map +1 -0
- package/dist/internal/dev-reserved.d.ts +25 -0
- package/dist/internal/dev-reserved.d.ts.map +1 -0
- package/dist/internal/dev-reserved.js +39 -0
- package/dist/internal/dev-reserved.js.map +1 -0
- package/dist/internal/html-spans.d.ts +10 -0
- package/dist/internal/html-spans.d.ts.map +1 -0
- package/dist/internal/html-spans.js +46 -0
- package/dist/internal/html-spans.js.map +1 -0
- package/dist/internal/loading-runtime.d.ts +44 -0
- package/dist/internal/loading-runtime.d.ts.map +1 -0
- package/dist/internal/loading-runtime.js +206 -0
- package/dist/internal/loading-runtime.js.map +1 -0
- package/dist/internal/matches-runtime.d.ts +8 -0
- package/dist/internal/matches-runtime.d.ts.map +1 -0
- package/dist/internal/matches-runtime.js +61 -0
- package/dist/internal/matches-runtime.js.map +1 -0
- package/dist/internal/mount-shadow.d.ts +36 -0
- package/dist/internal/mount-shadow.d.ts.map +1 -0
- package/dist/internal/mount-shadow.js +65 -0
- package/dist/internal/mount-shadow.js.map +1 -0
- package/dist/internal/node-builtins.d.ts +3 -0
- package/dist/internal/node-builtins.d.ts.map +1 -0
- package/dist/internal/node-builtins.js +79 -0
- package/dist/internal/node-builtins.js.map +1 -0
- package/dist/internal/output-guard.d.ts +65 -0
- package/dist/internal/output-guard.d.ts.map +1 -0
- package/dist/internal/output-guard.js +630 -0
- package/dist/internal/output-guard.js.map +1 -0
- package/dist/internal/page-execution.d.ts +20 -8
- package/dist/internal/page-execution.d.ts.map +1 -1
- package/dist/internal/page-execution.js +571 -105
- package/dist/internal/page-execution.js.map +1 -1
- package/dist/internal/parity.d.ts +21 -0
- package/dist/internal/parity.d.ts.map +1 -1
- package/dist/internal/parity.js +104 -22
- package/dist/internal/parity.js.map +1 -1
- package/dist/internal/private-env.d.ts +12 -0
- package/dist/internal/private-env.d.ts.map +1 -0
- package/dist/internal/private-env.js +335 -0
- package/dist/internal/private-env.js.map +1 -0
- package/dist/internal/public-url.d.ts +3 -0
- package/dist/internal/public-url.d.ts.map +1 -0
- package/dist/internal/public-url.js +18 -0
- package/dist/internal/public-url.js.map +1 -0
- package/dist/internal/render-document.d.ts +25 -19
- package/dist/internal/render-document.d.ts.map +1 -1
- package/dist/internal/render-document.js +77 -61
- package/dist/internal/render-document.js.map +1 -1
- package/dist/internal/response-controls.d.ts +75 -0
- package/dist/internal/response-controls.d.ts.map +1 -0
- package/dist/internal/response-controls.js +256 -0
- package/dist/internal/response-controls.js.map +1 -0
- package/dist/internal/runtime-contract.d.ts +11 -16
- package/dist/internal/runtime-contract.d.ts.map +1 -1
- package/dist/internal/runtime-contract.js.map +1 -1
- package/dist/internal/secret-scan.d.ts +104 -0
- package/dist/internal/secret-scan.d.ts.map +1 -0
- package/dist/internal/secret-scan.js +503 -0
- package/dist/internal/secret-scan.js.map +1 -0
- package/dist/internal/server-boundary.d.ts +6 -29
- package/dist/internal/server-boundary.d.ts.map +1 -1
- package/dist/internal/server-boundary.js +6 -66
- package/dist/internal/server-boundary.js.map +1 -1
- package/dist/internal/source-map.d.ts +47 -0
- package/dist/internal/source-map.d.ts.map +1 -0
- package/dist/internal/source-map.js +225 -0
- package/dist/internal/source-map.js.map +1 -0
- package/dist/internal/target-compat.d.ts +27 -0
- package/dist/internal/target-compat.d.ts.map +1 -0
- package/dist/internal/target-compat.js +77 -0
- package/dist/internal/target-compat.js.map +1 -0
- package/dist/internal/timing-safe-equal.d.ts +6 -0
- package/dist/internal/timing-safe-equal.d.ts.map +1 -1
- package/dist/internal/timing-safe-equal.js +10 -0
- package/dist/internal/timing-safe-equal.js.map +1 -1
- package/dist/internal/vitals-runtime.d.ts +18 -0
- package/dist/internal/vitals-runtime.d.ts.map +1 -0
- package/dist/internal/vitals-runtime.js +38 -0
- package/dist/internal/vitals-runtime.js.map +1 -0
- package/dist/internal/web-app.d.ts +38 -9
- package/dist/internal/web-app.d.ts.map +1 -1
- package/dist/internal/web-app.js +199 -59
- package/dist/internal/web-app.js.map +1 -1
- package/dist/internal/zone-graph.d.ts +89 -0
- package/dist/internal/zone-graph.d.ts.map +1 -0
- package/dist/internal/zone-graph.js +492 -0
- package/dist/internal/zone-graph.js.map +1 -0
- package/dist/isr.d.ts +83 -6
- package/dist/isr.d.ts.map +1 -1
- package/dist/isr.js +263 -36
- package/dist/isr.js.map +1 -1
- package/dist/llms-txt.d.ts.map +1 -1
- package/dist/llms-txt.js +31 -6
- package/dist/llms-txt.js.map +1 -1
- package/dist/manifest.d.ts +220 -13
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +394 -9
- package/dist/manifest.js.map +1 -1
- package/dist/module-graph.d.ts +26 -5
- package/dist/module-graph.d.ts.map +1 -1
- package/dist/module-graph.js +17 -7
- package/dist/module-graph.js.map +1 -1
- package/dist/navigation.d.ts +17 -3
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +11 -5
- package/dist/navigation.js.map +1 -1
- package/dist/nonce.d.ts +47 -0
- package/dist/nonce.d.ts.map +1 -0
- package/dist/nonce.js +63 -0
- package/dist/nonce.js.map +1 -0
- package/dist/plugins/css-modules.d.ts.map +1 -1
- package/dist/plugins/css-modules.js +4 -3
- package/dist/plugins/css-modules.js.map +1 -1
- package/dist/plugins/kit.d.ts +9 -0
- package/dist/plugins/kit.d.ts.map +1 -1
- package/dist/plugins/kit.js +18 -0
- package/dist/plugins/kit.js.map +1 -1
- package/dist/plugins/svg.d.ts +22 -3
- package/dist/plugins/svg.d.ts.map +1 -1
- package/dist/plugins/svg.js +112 -1
- package/dist/plugins/svg.js.map +1 -1
- package/dist/plugins/vite-leak-guard.d.ts +107 -3
- package/dist/plugins/vite-leak-guard.d.ts.map +1 -1
- package/dist/plugins/vite-leak-guard.js +378 -17
- package/dist/plugins/vite-leak-guard.js.map +1 -1
- package/dist/plugins/vite-zone-guard.d.ts +61 -0
- package/dist/plugins/vite-zone-guard.d.ts.map +1 -0
- package/dist/plugins/vite-zone-guard.js +208 -0
- package/dist/plugins/vite-zone-guard.js.map +1 -0
- package/dist/plugins/zone-guard.d.ts +27 -0
- package/dist/plugins/zone-guard.d.ts.map +1 -0
- package/dist/plugins/zone-guard.js +80 -0
- package/dist/plugins/zone-guard.js.map +1 -0
- package/dist/prerender.d.ts +10 -0
- package/dist/prerender.d.ts.map +1 -1
- package/dist/prerender.js +35 -3
- package/dist/prerender.js.map +1 -1
- package/dist/public-dir.d.ts +9 -0
- package/dist/public-dir.d.ts.map +1 -1
- package/dist/public-dir.js +67 -9
- package/dist/public-dir.js.map +1 -1
- package/dist/pwa-manifest.d.ts +68 -0
- package/dist/pwa-manifest.d.ts.map +1 -0
- package/dist/pwa-manifest.js +178 -0
- package/dist/pwa-manifest.js.map +1 -0
- package/dist/query.js +4 -4
- package/dist/query.js.map +1 -1
- package/dist/render-seam.d.ts +42 -2
- package/dist/render-seam.d.ts.map +1 -1
- package/dist/render-seam.js +6 -0
- package/dist/render-seam.js.map +1 -1
- package/dist/route-manifest.d.ts +3 -0
- package/dist/route-manifest.d.ts.map +1 -1
- package/dist/route-manifest.js +26 -3
- package/dist/route-manifest.js.map +1 -1
- package/dist/route-types.d.ts +24 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +195 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router.d.ts +28 -6
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +129 -40
- package/dist/router.js.map +1 -1
- package/dist/vitals.d.ts +33 -0
- package/dist/vitals.d.ts.map +1 -0
- package/dist/vitals.js +16 -0
- package/dist/vitals.js.map +1 -0
- package/dist/vite.d.ts +16 -1
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +248 -43
- package/dist/vite.js.map +1 -1
- package/dist/zones.d.ts +70 -0
- package/dist/zones.d.ts.map +1 -0
- package/dist/zones.js +365 -0
- package/dist/zones.js.map +1 -0
- package/package.json +67 -14
- package/src/backend-only.ts +16 -0
- package/src/boundary.ts +18 -5
- package/src/build-plan.ts +90 -35
- package/src/build-vite.ts +77 -11
- package/src/build.ts +466 -96
- package/src/bun-dev-entry.ts +1 -1
- package/src/cdn.ts +216 -0
- package/src/client.ts +135 -36
- package/src/conformance.ts +16 -3
- package/src/csp.ts +194 -0
- package/src/dev-client.ts +349 -0
- package/src/dev-diagnostics.ts +60 -7
- package/src/dev-error.ts +49 -5
- package/src/dev-feed.ts +1140 -0
- package/src/dev-indicator.ts +113 -0
- package/src/dev-session.ts +729 -0
- package/src/dev-sourcemap.ts +281 -0
- package/src/dev-ssr-graph.ts +16 -5
- package/src/dev.ts +86 -43
- package/src/diagnostic-catalog.ts +243 -0
- package/src/diagnostic-prompt.ts +355 -0
- package/src/diagnostic.ts +63 -66
- package/src/draft.ts +4 -1
- package/src/fn.ts +19 -3
- package/src/fs.ts +13 -2
- package/src/index.ts +42 -10
- package/src/internal/cdn/cloudflare.ts +146 -0
- package/src/internal/cdn/core.ts +316 -0
- package/src/internal/cdn/fastly.ts +62 -0
- package/src/internal/cdn/vercel.ts +95 -0
- package/src/internal/code-unit-order.ts +5 -0
- package/src/internal/codegen.ts +161 -24
- package/src/internal/dev-csp.ts +176 -0
- package/src/internal/dev-reserved.ts +52 -0
- package/src/internal/html-spans.ts +50 -0
- package/src/internal/loading-runtime.ts +244 -0
- package/src/internal/matches-runtime.ts +62 -0
- package/src/internal/mount-shadow.ts +88 -0
- package/src/internal/node-builtins.ts +79 -0
- package/src/internal/output-guard.ts +701 -0
- package/src/internal/page-execution.ts +795 -185
- package/src/internal/parity.ts +150 -36
- package/src/internal/private-env.ts +334 -0
- package/src/internal/public-url.ts +22 -0
- package/src/internal/render-document.ts +114 -67
- package/src/internal/response-controls.ts +284 -0
- package/src/internal/runtime-contract.ts +10 -15
- package/src/internal/secret-scan.ts +638 -0
- package/src/internal/server-boundary.ts +6 -69
- package/src/internal/source-map.ts +256 -0
- package/src/internal/target-compat.ts +92 -0
- package/src/internal/timing-safe-equal.ts +13 -0
- package/src/internal/vitals-runtime.ts +53 -0
- package/src/internal/web-app.ts +262 -84
- package/src/internal/zone-graph.ts +593 -0
- package/src/isr.ts +325 -37
- package/src/llms-txt.ts +28 -4
- package/src/manifest.ts +682 -16
- package/src/module-graph.ts +53 -9
- package/src/navigation.ts +29 -6
- package/src/nonce.ts +104 -0
- package/src/plugins/css-modules.ts +5 -3
- package/src/plugins/kit.ts +24 -0
- package/src/plugins/svg.ts +135 -4
- package/src/plugins/vite-leak-guard.ts +529 -16
- package/src/plugins/vite-zone-guard.ts +263 -0
- package/src/plugins/zone-guard.ts +119 -0
- package/src/prerender.ts +49 -3
- package/src/public-dir.ts +69 -8
- package/src/pwa-manifest.ts +226 -0
- package/src/query.ts +4 -4
- package/src/render-seam.ts +46 -1
- package/src/route-manifest.ts +15 -3
- package/src/route-types.ts +264 -0
- package/src/router.ts +163 -63
- package/src/vitals.ts +44 -0
- package/src/vite.ts +257 -42
- package/src/zones.ts +430 -0
- package/dist/plugins/vite-server-only.d.ts +0 -49
- package/dist/plugins/vite-server-only.d.ts.map +0 -1
- package/dist/plugins/vite-server-only.js +0 -57
- package/dist/plugins/vite-server-only.js.map +0 -1
- package/dist/server-only.d.ts +0 -21
- package/dist/server-only.d.ts.map +0 -1
- package/dist/server-only.js +0 -25
- package/dist/server-only.js.map +0 -1
- package/src/plugins/vite-server-only.ts +0 -75
- package/src/server-only.ts +0 -25
package/dist/fn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fn.d.ts","sourceRoot":"","sources":["../src/fn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAEL,KAAK,OAAO,EAEZ,KAAK,cAAc,EAEnB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"fn.d.ts","sourceRoot":"","sources":["../src/fn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAEL,KAAK,OAAO,EAEZ,KAAK,cAAc,EAEnB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAA;AAG7B,oGAAoG;AACpG,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAE5C,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAErC,oDAAoD;AACpD,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACjD;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAA;IAClC,8FAA8F;IAC9F,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1C;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,QAAQ,CAAC,KAAK,EAAE,MAAM;IACrC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACtD,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAA;CAC5C;AAED,qFAAqF;AACrF,MAAM,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,YAAY,CAAC,MAAM,CAAC,CAAA;AAElF,+FAA+F;AAC/F,MAAM,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,GACvB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;AAEjC,wGAAwG;AACxG,eAAO,MAAM,SAAS,EAAE,OAAO,MAA6C,CAAA;AAE5E;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,KAAK,GAAG,IAAI,EAAE,MAAM,GAAG,OAAO,EACrD,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,EAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,YAAY,CAAC,MAAM,CAAC,GAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAEzB;AAiBD,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,GACnC,IAAI,CAAA;CACR;AAED,oEAAoE;AACpE,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAE9D;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,cAAc,CAsDzF"}
|
package/dist/fn.js
CHANGED
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
* bespoke dispatcher.
|
|
46
46
|
*/
|
|
47
47
|
import { defineIdentityPlugin, isSameOriginRequest, } from "@nifrajs/core/server";
|
|
48
|
+
import { guardChannel, outputGuard } from "./internal/output-guard.js";
|
|
48
49
|
/** The URL prefix every mounted function lives under. Namespaced per mount, then by export name. */
|
|
49
50
|
export const SERVER_FN_PREFIX = "/_nifra/fn";
|
|
50
51
|
/** Brand identifying a value produced by {@link serverFn}, so mounting cannot pick up stray exports. */
|
|
@@ -97,6 +98,12 @@ export function serverFunctions(namespace, module) {
|
|
|
97
98
|
throw new Error(`[nifra/fn] server function ${JSON.stringify(name)} in namespace ${JSON.stringify(namespace)} is not a valid identifier.`);
|
|
98
99
|
}
|
|
99
100
|
const config = fn[SERVER_FN];
|
|
101
|
+
const label = `server function "${namespace}.${name}"`;
|
|
102
|
+
const guarded = guardChannel(fn, {
|
|
103
|
+
label,
|
|
104
|
+
guard: config.output === undefined ? undefined : outputGuard(config.output, label, "output"),
|
|
105
|
+
missing: "an output schema in its serverFn({ output }) config",
|
|
106
|
+
});
|
|
100
107
|
const schema = {
|
|
101
108
|
...(config.input !== undefined ? { body: config.input } : {}),
|
|
102
109
|
...(config.capabilities !== undefined ? { capabilities: config.capabilities } : {}),
|
|
@@ -107,17 +114,20 @@ export function serverFunctions(namespace, module) {
|
|
|
107
114
|
// has happened yet, so rejecting here is a complete refusal.
|
|
108
115
|
const request = c.req;
|
|
109
116
|
const contentType = request.headers.get("content-type") ?? "";
|
|
110
|
-
|
|
117
|
+
const semi = contentType.indexOf(";");
|
|
118
|
+
const mediaType = (semi === -1 ? contentType : contentType.slice(0, semi)).trim();
|
|
119
|
+
if (mediaType.toLowerCase() !== "application/json") {
|
|
111
120
|
// A form cannot send this content type cross-origin without a preflight. Rejecting anything
|
|
112
121
|
// else is what makes form-driven CSRF against a server function impossible rather than
|
|
113
|
-
// merely unlikely.
|
|
122
|
+
// merely unlikely. Compare the media type, never search the header: `text/plain;
|
|
123
|
+
// x=application/json` contains the string but is a no-preflight `text/plain` request.
|
|
114
124
|
return c.json({ ok: false, error: "unsupported_media_type" }, 415);
|
|
115
125
|
}
|
|
116
126
|
const origin = request.headers.get("origin");
|
|
117
127
|
if (origin !== null && !sameOrigin(origin, request)) {
|
|
118
128
|
return c.json({ ok: false, error: "forbidden_origin" }, 403);
|
|
119
129
|
}
|
|
120
|
-
return
|
|
130
|
+
return guarded(config.input === undefined ? undefined : c.body, c);
|
|
121
131
|
}));
|
|
122
132
|
}
|
|
123
133
|
return app;
|
package/dist/fn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fn.js","sourceRoot":"","sources":["../src/fn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAGL,oBAAoB,EAEpB,mBAAmB,GAGpB,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"fn.js","sourceRoot":"","sources":["../src/fn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAGL,oBAAoB,EAEpB,mBAAmB,GAGpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAEtE,oGAAoG;AACpG,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAA;AA2C5C,wGAAwG;AACxG,MAAM,CAAC,MAAM,SAAS,GAAkB,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,MAA6B,EAC7B,EAA4D;IAE5D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAA4B,CAAA;AAC9E,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAc,EAAuC,EAAE,CACzE,OAAO,KAAK,KAAK,UAAU,IAAI,SAAS,IAAK,KAAgB,CAAA;AAE/D,uGAAuG;AACvG,MAAM,SAAS,GAAG,+BAA+B,CAAA;AACjD,kEAAkE;AAClE,MAAM,WAAW,GAAG,4BAA4B,CAAA;AAEhD;;;;GAIG;AACH,MAAM,UAAU,GAAG,mBAAmB,CAAA;AAetC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,MAAsB;IACvE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,gDAAgD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,6DAA6D,CACvI,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3C,CAAC,KAAK,EAAiD,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/E,CAAA;IAED,MAAM,KAAK,GAAG,CAAsB,GAAM,EAAK,EAAE;QAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,6BAA6B,CAC1H,CAAA;YACH,CAAC;YACD,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YAC5B,MAAM,KAAK,GAAG,oBAAoB,SAAS,IAAI,IAAI,GAAG,CAAA;YACtD,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,EAAE;gBAC/B,KAAK;gBACL,KAAK,EACH,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;gBACvF,OAAO,EAAE,qDAAqD;aAC/D,CAAC,CAAA;YACF,MAAM,MAAM,GAAgB;gBAC1B,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpF,CAAA;YACD,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,gBAAgB,IAAI,SAAS,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAU,EAAE,EAAE;gBACvF,2FAA2F;gBAC3F,8FAA8F;gBAC9F,6DAA6D;gBAC7D,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAA;gBACrB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;gBAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACrC,MAAM,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACjF,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,kBAAkB,EAAE,CAAC;oBACnD,4FAA4F;oBAC5F,uFAAuF;oBACvF,iFAAiF;oBACjF,sFAAsF;oBACtF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBAC5C,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;oBACpD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAA;gBAC9D,CAAC;gBACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YACpE,CAAC,CAAgC,CAAC,CAAA;QACpC,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,CAAA;IACD,OAAO,oBAAoB,CAAC,mBAAmB,SAAS,EAAE,EAAE,KAAK,CAAC,CAAA;AACpE,CAAC"}
|
package/dist/fs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAOA,OAAO,
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAOA,OAAO,EAIL,KAAK,QAAQ,EAEd,MAAM,eAAe,CAAA;AAEtB,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC;;sEAEkE;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC3D;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,QAAQ,CAmBzF"}
|
package/dist/fs.js
CHANGED
|
@@ -13,12 +13,14 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
|
|
|
13
13
|
*/
|
|
14
14
|
import { readdirSync } from "node:fs";
|
|
15
15
|
import { join } from "node:path";
|
|
16
|
-
import { buildManifest } from "./manifest.js";
|
|
16
|
+
import { buildManifest, isMiddlewareFile, isRouteBackendFile, } from "./manifest.js";
|
|
17
17
|
/** Scan a `routes/` directory (recursively) and build the route manifest. */
|
|
18
18
|
export function discoverRoutes(dir, options = {}) {
|
|
19
19
|
const files = readdirSync(dir, { recursive: true })
|
|
20
20
|
.map((file) => file.replaceAll("\\", "/")) // normalize Windows separators
|
|
21
|
-
.filter((file) => /\.(tsx|jsx|svelte|vue|mdx)$/.test(file)
|
|
21
|
+
.filter((file) => /\.(tsx|jsx|svelte|vue|mdx)$/.test(file) ||
|
|
22
|
+
isRouteBackendFile(file) ||
|
|
23
|
+
isMiddlewareFile(file));
|
|
22
24
|
const query = options.importQuery ? `?${options.importQuery}` : "";
|
|
23
25
|
const load = options.load;
|
|
24
26
|
return buildManifest(files, (file) => load === undefined
|
package/dist/fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":";;;;;;;;AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":";;;;;;;;AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,GAGnB,MAAM,eAAe,CAAA;AAsBtB,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,UAAiC,EAAE;IAC7E,MAAM,KAAK,GAAI,WAAW,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAc;SAC9D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,+BAA+B;SACzE,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CACP,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC;QACxC,kBAAkB,CAAC,IAAI,CAAC;QACxB,gBAAgB,CAAC,IAAI,CAAC,CACzB,CAAA;IACH,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IACzB,OAAO,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CACnC,IAAI,KAAK,SAAS;QAChB,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,kCAAC,GAAG,GAAG,IAAI,IAAI,GAAG,KAAK,EAAE,EAAyB;QAChE,CAAC,CAAC,2FAA2F;YAC3F,yFAAyF;YACzF,yBAAyB;YACzB,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAyB,CACxD,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export { assertStaticBoundaryImports, type Boundary, type BoundaryDescriptor, type BoundaryError, type BoundaryMode, type BoundaryRegistration, type BoundaryRequestCtx, type BoundaryState, type BoundaryStates, type BoundaryStatus, boundaryDescriptors, boundaryModeKey, type DynamicBoundary, type DynamicBoundaryBatch, type InterceptBoundary, MemoryStaticBoundaryCache, type PendingBoundary, resolveDynamicBoundaries, resolveStaticBoundaries, type StaticBoundary, type StaticBoundaryCache, type StaticBoundaryImportEdge, type StaticBoundaryRoot, type StaticCtx, startDynamicBoundaries, } from "./boundary.js";
|
|
11
11
|
export { assertRenderAdapterConformance, RenderAdapterConformanceError, type RenderAdapterConformanceFixture, } from "./conformance.js";
|
|
12
|
+
export { type CreateCspPolicyOptions, type CspHeaderContext, type CspPolicy, createCspPolicy, nifraScriptHashes, } from "./csp.js";
|
|
12
13
|
export { assertCssLoadingCompatible, type CssLoadingMode, DEFAULT_CSS_LOADING, normalizeCssLoading, } from "./css-contract.js";
|
|
13
14
|
export { type Deferred, defer } from "./deferred.js";
|
|
14
15
|
export { DRAFT_COOKIE, type DraftCookieControls, disableDraft, type EnableDraftOptions, enableDraft, isDraftEnabled, type PreviewEndpointOptions, previewEndpoint, } from "./draft.js";
|
|
@@ -16,25 +17,22 @@ export { type FontDisplay, type FontFace, type FontPreloadInput, type FontSource
|
|
|
16
17
|
export { type GenerateClientEntryOptions, type GenerateRouteSearchTypesOptions, type GenerateServerManifestOptions, generateClientEntry, generateRouteSearchTypes, generateServerManifest, } from "./internal/codegen.js";
|
|
17
18
|
export { mergeHeads, resolveMeta } from "./internal/head-merge.js";
|
|
18
19
|
export { canonical, gone, jsonLd, notFound, type OpenGraphInput, openGraph, type RedirectOptions, type RenderAssemblyCache, type RenderedPage, type RenderPageInput, type RenderPageOptions, type RevalidateResult, redirect, renderPage, renderPageResult, revalidate, type StatusPageOptions, serializeData, statusPage, unsafeInlineScript, } from "./internal/render-document.js";
|
|
19
|
-
export { DEFAULT_DEV_PORT, PRE_HYDRATION_GUARD,
|
|
20
|
+
export { type BackendOnly, DEFAULT_DEV_PORT, PRE_HYDRATION_GUARD, } from "./internal/runtime-contract.js";
|
|
20
21
|
/**
|
|
21
|
-
* The
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* bundler takes no plugins) so it must REFUSE instead, and a refusal driven by its own hand-written
|
|
26
|
-
* glob drifts from the transform - which is how `.fn.mts` came to be stubbed by both build pipelines
|
|
27
|
-
* and waved through by the guard that exists to stop it leaking. Anything deciding "is this module
|
|
28
|
-
* server-only" should import the matcher rather than re-encode it.
|
|
22
|
+
* The `*.fn` server-function convention: the browser build REPLACES such a module with client stubs.
|
|
23
|
+
* Exported so anything deciding "is this a server-function module" imports the matcher instead of
|
|
24
|
+
* re-encoding it - a hand-written glob drifts from the transform, which is how `.fn.mts` was once
|
|
25
|
+
* stubbed by both build pipelines and waved through by the guard meant to stop it leaking.
|
|
29
26
|
*/
|
|
30
|
-
export { SERVER_FN_MODULE
|
|
31
|
-
export { type CreateWebAppOptions, createWebApp, type NonceResolver, } from "./internal/web-app.js";
|
|
32
|
-
export { type CachedResponse, type CacheStore, ISR_REVALIDATE_HEADER, ISR_REVALIDATE_TAGS_HEADER, ISR_STATUS_HEADER, type ISRApp, type ISROptions, type ISRPlatform, KVCacheStore, type KVCacheStoreOptions, type KVNamespaceLike, MemoryCacheStore, type MemoryCacheStoreOptions, type RevalidateEndpointOptions, revalidateEndpoint, withISR, } from "./isr.js";
|
|
33
|
-
export { type Action, buildManifest, type ClientAction, type ClientActionArgs, type ClientActionResult, type ClientLoader, type ClientLoaderArgs, type ClientRequestBody, type ClientRouteHooks, enumerateStaticRoutes, filePathToPattern, filePathToPatterns, type GetStaticPaths, type InertScriptType, type LayoutEntry, type LinkDescriptor, type Loader, type LoaderContext, type Manifest, type Meta, type MetaArgs, type MetaDescriptor, type MetaInput, type RouteEntry, type RouteModule, type ScriptDescriptor, type StaticPath, type StaticPaths, type StaticRoutes, type UnsafeScriptDescriptor, } from "./manifest.js";
|
|
34
|
-
export { type Blocker, type BlockerController, type BlockerFunction, type BlockerLocation, type BlockerState, type BrowserNavigate, getBrowserNavigate, IDLE_BLOCKER, type NavigateFunction, type NavigateOptions, type NavigateSearchOf, type NavigateTargetInput, type RouteSearch, registerBlocker, resolveNavigate, setBlockerController, setBrowserNavigate, } from "./navigation.js";
|
|
27
|
+
export { SERVER_FN_MODULE } from "./internal/server-boundary.js";
|
|
28
|
+
export { type CreateWebAppOptions, createWebApp, type NonceResolver, webProjectEvidence, } from "./internal/web-app.js";
|
|
29
|
+
export { type CachedResponse, type CacheStore, type CdnPurgeOutcome, type CdnPurgeTarget, ISR_REVALIDATE_HEADER, ISR_REVALIDATE_TAGS_HEADER, ISR_STATUS_HEADER, type ISRApp, type ISROptions, type ISRPlatform, type ISRQuery, isCacheablePage, KVCacheStore, type KVCacheStoreOptions, type KVNamespaceLike, MemoryCacheStore, type MemoryCacheStoreOptions, type RevalidateEndpointOptions, type RevalidateTags, type RevalidateTagsInput, revalidateEndpoint, withISR, } from "./isr.js";
|
|
30
|
+
export { type Action, buildManifest, type ClientAction, type ClientActionArgs, type ClientActionResult, type ClientLoader, type ClientLoaderArgs, type ClientRequestBody, type ClientRouteHooks, enumerateStaticRoutes, filePathToPattern, filePathToPatterns, type GetStaticPaths, type InertScriptType, type LayoutEntry, type LinkDescriptor, type Loader, type LoaderContext, type LoaderResponseControls, type LoadingEntry, type Manifest, type Meta, type MetaArgs, type MetaDescriptor, type MetaInput, type MiddlewareOutcome, type NotFoundEntry, type NotFoundScope, type RouteEntry, type RouteMiddleware, type RouteModule, type ScriptDescriptor, type ShouldRevalidate, type ShouldRevalidateArgs, type StaticPath, type StaticPaths, type StaticRoutes, type UnsafeScriptDescriptor, } from "./manifest.js";
|
|
31
|
+
export { type Blocker, type BlockerController, type BlockerFunction, type BlockerLocation, type BlockerState, type BrowserNavigate, getBrowserNavigate, IDLE_BLOCKER, type NavigateFunction, type NavigateOptions, type NavigateSearchOf, type NavigateTargetInput, type PrefetchMode, type RouteSearch, registerBlocker, resolveNavigate, setBlockerController, setBrowserNavigate, } from "./navigation.js";
|
|
32
|
+
export { type CreateNonceResolverOptions, createNonceResolver, type NonceContext, type NonceGenerator, type NonceHeader, type NonceHeaderContext, } from "./nonce.js";
|
|
35
33
|
export { type PublicDirCache, resolvePublicPath, type ServePublicDirOptions, servePublicDir, } from "./public-dir.js";
|
|
36
34
|
export { createMutation, createQueryClient, type DehydratedState, hashQueryKey, type InfiniteData, type InfiniteQueryHandle, type InfiniteQueryOptions, type MutationCallbacks, type MutationHandle, type MutationState, type MutationStatus, type QueryClient, type QueryClientOptions, type QueryHandle, type QueryOptions, type QueryState, type QueryStatus, } from "./query.js";
|
|
37
|
-
export { ACTION_GLOBAL, BOUNDARY_GLOBAL, DATA_GLOBAL, LAYOUT_DATA_GLOBAL, type RenderAdapter, type RenderProps, ROOT_ATTRIBUTE, ROUTE_GLOBAL, type SsrModuleLoader, setSsrModuleLoader, ssrModuleLoader, } from "./render-seam.js";
|
|
35
|
+
export { ACTION_GLOBAL, BOUNDARY_GLOBAL, DATA_GLOBAL, HANDOVER_ID, LAYOUT_DATA_GLOBAL, type MatchChain, type RenderAdapter, type RenderProps, type RenderStreamOptions, ROOT_ATTRIBUTE, ROUTE_GLOBAL, type SsrModuleLoader, setSsrModuleLoader, ssrModuleLoader, type UIMatch, } from "./render-seam.js";
|
|
38
36
|
export { type ClientRouter, type ClientRouterOptions, createClientRouter, createMatcher, DATA_HEADER, type Fetcher, type FetcherState, type FetchRouteData, type MountRouterOptions, NAV_FROM_HEADER, REDIRECT_HEADER, RETAIN_HEADER, REVALIDATE_HEADER, type RouteMatch, type RoutePattern, type RouterState, STATUS_HEADER, type Submission, type SubmitOptions, } from "./router.js";
|
|
39
37
|
export { type SearchOf, searchOf, searchOfChain, serializeSearch } from "./search.js";
|
|
40
38
|
export { type HtmlSanitizer, type SanitizedHtml, sanitizedHtml, sanitizeHtml, type TrustedHtml, trustHtml, } from "./trusted-html.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,2BAA2B,EAC3B,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,mBAAmB,EACnB,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,yBAAyB,EACzB,KAAK,eAAe,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,sBAAsB,GACvB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,EAC7B,KAAK,+BAA+B,GACrC,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
// Draft / preview mode - a signed cookie that flips `ctx.draft` for loaders + bypasses ISR for editors.
|
|
11
11
|
export { assertStaticBoundaryImports, boundaryDescriptors, boundaryModeKey, MemoryStaticBoundaryCache, resolveDynamicBoundaries, resolveStaticBoundaries, startDynamicBoundaries, } from "./boundary.js";
|
|
12
12
|
export { assertRenderAdapterConformance, RenderAdapterConformanceError, } from "./conformance.js";
|
|
13
|
+
// Hash-based CSP: a document carries a nonce only when it needs one, so a CSP page stays cacheable.
|
|
14
|
+
export { createCspPolicy, nifraScriptHashes, } from "./csp.js";
|
|
13
15
|
export { assertCssLoadingCompatible, DEFAULT_CSS_LOADING, normalizeCssLoading, } from "./css-contract.js";
|
|
14
16
|
// Deferred loader data (`defer()` + the `Deferred<T>` type) - consumed by the adapter's `<Await>`.
|
|
15
17
|
export { defer } from "./deferred.js";
|
|
@@ -23,31 +25,28 @@ export { mergeHeads, resolveMeta } from "./internal/head-merge.js";
|
|
|
23
25
|
export { canonical, gone, jsonLd, notFound, openGraph, redirect, renderPage, renderPageResult, revalidate, serializeData, statusPage, unsafeInlineScript, } from "./internal/render-document.js";
|
|
24
26
|
export { DEFAULT_DEV_PORT, PRE_HYDRATION_GUARD, } from "./internal/runtime-contract.js";
|
|
25
27
|
/**
|
|
26
|
-
* The
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* bundler takes no plugins) so it must REFUSE instead, and a refusal driven by its own hand-written
|
|
31
|
-
* glob drifts from the transform - which is how `.fn.mts` came to be stubbed by both build pipelines
|
|
32
|
-
* and waved through by the guard that exists to stop it leaking. Anything deciding "is this module
|
|
33
|
-
* server-only" should import the matcher rather than re-encode it.
|
|
28
|
+
* The `*.fn` server-function convention: the browser build REPLACES such a module with client stubs.
|
|
29
|
+
* Exported so anything deciding "is this a server-function module" imports the matcher instead of
|
|
30
|
+
* re-encoding it - a hand-written glob drifts from the transform, which is how `.fn.mts` was once
|
|
31
|
+
* stubbed by both build pipelines and waved through by the guard meant to stop it leaking.
|
|
34
32
|
*/
|
|
35
|
-
export { SERVER_FN_MODULE
|
|
36
|
-
export { createWebApp, } from "./internal/web-app.js";
|
|
33
|
+
export { SERVER_FN_MODULE } from "./internal/server-boundary.js";
|
|
34
|
+
export { createWebApp, webProjectEvidence, } from "./internal/web-app.js";
|
|
37
35
|
// ISR (incremental static regeneration): a pluggable cache store + the `withISR` stale-while-revalidate
|
|
38
36
|
// wrapper for rendered SSR responses.
|
|
39
|
-
export { ISR_REVALIDATE_HEADER, ISR_REVALIDATE_TAGS_HEADER, ISR_STATUS_HEADER, KVCacheStore, MemoryCacheStore, revalidateEndpoint, withISR, } from "./isr.js";
|
|
37
|
+
export { ISR_REVALIDATE_HEADER, ISR_REVALIDATE_TAGS_HEADER, ISR_STATUS_HEADER, isCacheablePage, KVCacheStore, MemoryCacheStore, revalidateEndpoint, withISR, } from "./isr.js";
|
|
40
38
|
// File-based routing manifest - pure + fs-free. `discoverRoutes` (fs) lives in `@nifrajs/web/fs`.
|
|
41
39
|
export { buildManifest, enumerateStaticRoutes, filePathToPattern, filePathToPatterns, } from "./manifest.js";
|
|
42
40
|
// Navigation bridge - a DOM-free seam the browser layer (`installHistory`) populates so an adapter's
|
|
43
41
|
// `useNavigate` (a route component, importing only this agnostic entry) reaches history-aware nav.
|
|
44
42
|
export { getBrowserNavigate, IDLE_BLOCKER, registerBlocker, resolveNavigate, setBlockerController, setBrowserNavigate, } from "./navigation.js";
|
|
43
|
+
export { createNonceResolver, } from "./nonce.js";
|
|
45
44
|
// public/ - user-authored static files, served identically in dev and production by one handler.
|
|
46
45
|
export { resolvePublicPath, servePublicDir, } from "./public-dir.js";
|
|
47
46
|
// Keyed query-cache (agnostic) - a `query(key, fn)` primitive (dedup + staleness + invalidation + GC)
|
|
48
47
|
// consumed by the per-adapter `useQuery`/`createQuery` bindings.
|
|
49
48
|
export { createMutation, createQueryClient, hashQueryKey, } from "./query.js";
|
|
50
|
-
export { ACTION_GLOBAL, BOUNDARY_GLOBAL, DATA_GLOBAL, LAYOUT_DATA_GLOBAL, ROOT_ATTRIBUTE, ROUTE_GLOBAL, setSsrModuleLoader, ssrModuleLoader, } from "./render-seam.js";
|
|
49
|
+
export { ACTION_GLOBAL, BOUNDARY_GLOBAL, DATA_GLOBAL, HANDOVER_ID, LAYOUT_DATA_GLOBAL, ROOT_ATTRIBUTE, ROUTE_GLOBAL, setSsrModuleLoader, ssrModuleLoader, } from "./render-seam.js";
|
|
51
50
|
// Agnostic client-side router core (pure + DOM-free) - consumed by per-adapter Router bindings.
|
|
52
51
|
// `DATA_HEADER` marks a navigation's data-only GET; `createWebApp` answers it with loader JSON.
|
|
53
52
|
export { createClientRouter, createMatcher, DATA_HEADER, NAV_FROM_HEADER, REDIRECT_HEADER, RETAIN_HEADER, REVALIDATE_HEADER, STATUS_HEADER, } from "./router.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wGAAwG;AACxG,OAAO,EACL,2BAA2B,EAU3B,mBAAmB,EACnB,eAAe,EAIf,yBAAyB,EAEzB,wBAAwB,EACxB,uBAAuB,EAMvB,sBAAsB,GACvB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAE9B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,0BAA0B,EAE1B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAC1B,mGAAmG;AACnG,OAAO,EAAiB,KAAK,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EACL,YAAY,EAEZ,YAAY,EAEZ,WAAW,EACX,cAAc,EAEd,eAAe,GAChB,MAAM,YAAY,CAAA;AACnB,oGAAoG;AACpG,OAAO,EAKL,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAIL,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,uBAAuB,CAAA;AAC9B,4FAA4F;AAC5F,sGAAsG;AACtG,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EACL,SAAS,EACT,IAAI,EACJ,MAAM,EACN,QAAQ,EAER,SAAS,EAOT,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,UAAU,EAEV,aAAa,EACb,UAAU,EACV,kBAAkB,GACnB,MAAM,+BAA+B,CAAA;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare: a proxied zone in front of the origin, and Workers Cache in front of a Worker. Both read
|
|
3
|
+
* `Cache-Tag` and `Cloudflare-CDN-Cache-Control` and strip them before the browser; the zone purges
|
|
4
|
+
* through the API (at most 100 tags a call; the Free plan allows 5 calls a minute), Workers Cache
|
|
5
|
+
* through the Worker's own `cache.purge` (always Free-plan limits).
|
|
6
|
+
*/
|
|
7
|
+
import { type CdnProvider, type PurgeQueueOptions } from "./core.js";
|
|
8
|
+
export interface CloudflareZoneOptions {
|
|
9
|
+
/** The zone id (32 hex characters, on the zone's Overview page). */
|
|
10
|
+
readonly zoneId: string;
|
|
11
|
+
/** An API token scoped to Zone > Cache Purge for this zone. Keep it in an env binding. */
|
|
12
|
+
readonly apiToken: string;
|
|
13
|
+
readonly queue?: PurgeQueueOptions;
|
|
14
|
+
/** The fetch purge calls go through; tests pass their own. */
|
|
15
|
+
readonly fetch?: typeof fetch;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A Cloudflare zone proxying the origin. HTML is only cached by a Cache Rule that makes it eligible,
|
|
19
|
+
* and the zone's cache ignores `Vary`: the rule must also bypass the cache when the request carries
|
|
20
|
+
* `x-nifra-data` (soft navigations fetch the page URL with that header). `nifra cdn-check` tests both.
|
|
21
|
+
*/
|
|
22
|
+
export declare function cloudflareZone(options: CloudflareZoneOptions): CdnProvider;
|
|
23
|
+
/** The Worker's cache binding: `import { cache } from "cloudflare:workers"`, or `ctx.cache`. */
|
|
24
|
+
export interface WorkersCacheLike {
|
|
25
|
+
purge(options: {
|
|
26
|
+
tags?: string[];
|
|
27
|
+
pathPrefixes?: string[];
|
|
28
|
+
}): Promise<{
|
|
29
|
+
success: boolean;
|
|
30
|
+
errors?: readonly {
|
|
31
|
+
code?: number;
|
|
32
|
+
message?: string;
|
|
33
|
+
}[];
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
export interface CloudflareWorkersCacheOptions {
|
|
37
|
+
/** `import { cache } from "cloudflare:workers"` (needs `[cache] enabled = true` in wrangler). */
|
|
38
|
+
readonly cache: WorkersCacheLike;
|
|
39
|
+
/**
|
|
40
|
+
* Whether the Worker serves different content per hostname. Workers Cache keys entries by path, not
|
|
41
|
+
* host, so such an app would serve one host's page to another: `true` is refused.
|
|
42
|
+
*/
|
|
43
|
+
readonly hostRouted?: boolean;
|
|
44
|
+
readonly queue?: PurgeQueueOptions;
|
|
45
|
+
}
|
|
46
|
+
/** Workers Cache in front of the Worker serving the app. Purges are scoped to the calling entrypoint. */
|
|
47
|
+
export declare function cloudflareWorkersCache(options: CloudflareWorkersCacheOptions): CdnProvider;
|
|
48
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../../src/internal/cdn/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAGL,KAAK,WAAW,EAGhB,KAAK,iBAAiB,EACvB,MAAM,WAAW,CAAA;AAQlB,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAA;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,WAAW,CAkD1E;AAED,gGAAgG;AAChG,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC;QACpE,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,CAAC,EAAE,SAAS;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KACxD,CAAC,CAAA;CACH;AAED,MAAM,WAAW,6BAA6B;IAC5C,iGAAiG;IACjG,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAA;CACnC;AAED,yGAAyG;AACzG,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,WAAW,CAqC1F"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare: a proxied zone in front of the origin, and Workers Cache in front of a Worker. Both read
|
|
3
|
+
* `Cache-Tag` and `Cloudflare-CDN-Cache-Control` and strip them before the browser; the zone purges
|
|
4
|
+
* through the API (at most 100 tags a call; the Free plan allows 5 calls a minute), Workers Cache
|
|
5
|
+
* through the Worker's own `cache.purge` (always Free-plan limits).
|
|
6
|
+
*/
|
|
7
|
+
import { attemptFromStatus, cdnDirectives, defineCdnProvider, } from "./core.js";
|
|
8
|
+
const headersFor = (input) => ({
|
|
9
|
+
"cache-tag": input.tags.join(","),
|
|
10
|
+
"cloudflare-cdn-cache-control": cdnDirectives(input),
|
|
11
|
+
});
|
|
12
|
+
const NO_STORE = { "cloudflare-cdn-cache-control": "no-store" };
|
|
13
|
+
/**
|
|
14
|
+
* A Cloudflare zone proxying the origin. HTML is only cached by a Cache Rule that makes it eligible,
|
|
15
|
+
* and the zone's cache ignores `Vary`: the rule must also bypass the cache when the request carries
|
|
16
|
+
* `x-nifra-data` (soft navigations fetch the page URL with that header). `nifra cdn-check` tests both.
|
|
17
|
+
*/
|
|
18
|
+
export function cloudflareZone(options) {
|
|
19
|
+
if (!/^[a-f0-9]{32}$/.test(options.zoneId)) {
|
|
20
|
+
throw new TypeError("[nifra/web/cdn] cloudflareZone: zoneId must be the 32-character hex zone id");
|
|
21
|
+
}
|
|
22
|
+
if (typeof options.apiToken !== "string" || options.apiToken === "") {
|
|
23
|
+
throw new TypeError("[nifra/web/cdn] cloudflareZone: apiToken is empty (is the env binding set?)");
|
|
24
|
+
}
|
|
25
|
+
const send = options.fetch ?? fetch;
|
|
26
|
+
const endpoint = `https://api.cloudflare.com/client/v4/zones/${options.zoneId}/purge_cache`;
|
|
27
|
+
return defineCdnProvider({
|
|
28
|
+
name: "cloudflare",
|
|
29
|
+
tagsPerCall: 100,
|
|
30
|
+
maxResponseTags: 1000,
|
|
31
|
+
cacheHeaders: headersFor,
|
|
32
|
+
noStoreHeaders: () => NO_STORE,
|
|
33
|
+
async purgeTags(tags) {
|
|
34
|
+
const res = await send(endpoint, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: {
|
|
37
|
+
authorization: `Bearer ${options.apiToken}`,
|
|
38
|
+
"content-type": "application/json",
|
|
39
|
+
},
|
|
40
|
+
body: JSON.stringify({ tags }),
|
|
41
|
+
});
|
|
42
|
+
const attempt = attemptFromStatus(res, "cloudflare");
|
|
43
|
+
if (!res.ok) {
|
|
44
|
+
await res.body?.cancel();
|
|
45
|
+
return attempt;
|
|
46
|
+
}
|
|
47
|
+
// A 200 can still carry `success: false`; only `true` means the purge was received.
|
|
48
|
+
const body = await res.json().catch(() => null);
|
|
49
|
+
const field = (from, name) => typeof from === "object" && from !== null ? Reflect.get(from, name) : undefined;
|
|
50
|
+
if (field(body, "success") === true)
|
|
51
|
+
return attempt;
|
|
52
|
+
const errors = field(body, "errors");
|
|
53
|
+
const code = field(Array.isArray(errors) ? errors[0] : undefined, "code");
|
|
54
|
+
return {
|
|
55
|
+
ok: false,
|
|
56
|
+
retryable: false,
|
|
57
|
+
reason: typeof code === "number" ? `cloudflare_error_${code}` : "cloudflare_unsuccessful",
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
}, options.queue);
|
|
61
|
+
}
|
|
62
|
+
/** Workers Cache in front of the Worker serving the app. Purges are scoped to the calling entrypoint. */
|
|
63
|
+
export function cloudflareWorkersCache(options) {
|
|
64
|
+
if (options.hostRouted === true) {
|
|
65
|
+
throw new Error("[nifra/web/cdn] NIFRA_CDN_HOST_ROUTED: Workers Cache keys pages by path, not host, so a Worker that serves different content per hostname would serve one host's page to another. Put a Cloudflare zone (cloudflareZone) in front instead, or serve each host from its own Worker.");
|
|
66
|
+
}
|
|
67
|
+
if (typeof options.cache?.purge !== "function") {
|
|
68
|
+
throw new TypeError('[nifra/web/cdn] cloudflareWorkersCache: pass `cache` from `import { cache } from "cloudflare:workers"`');
|
|
69
|
+
}
|
|
70
|
+
return defineCdnProvider({
|
|
71
|
+
name: "cloudflare-workers-cache",
|
|
72
|
+
tagsPerCall: 100,
|
|
73
|
+
maxResponseTags: 1000,
|
|
74
|
+
cacheHeaders: headersFor,
|
|
75
|
+
noStoreHeaders: () => NO_STORE,
|
|
76
|
+
async purgeTags(tags) {
|
|
77
|
+
const result = await options.cache.purge({ tags: [...tags] });
|
|
78
|
+
if (result.success)
|
|
79
|
+
return { ok: true };
|
|
80
|
+
const first = result.errors?.[0];
|
|
81
|
+
// A rate-limit refusal is the one worth retrying; anything else is configuration.
|
|
82
|
+
const limited = /rate/i.test(first?.message ?? "");
|
|
83
|
+
return {
|
|
84
|
+
ok: false,
|
|
85
|
+
retryable: limited,
|
|
86
|
+
rateLimited: limited,
|
|
87
|
+
reason: typeof first?.code === "number"
|
|
88
|
+
? `workers_cache_${first.code}`
|
|
89
|
+
: "workers_cache_refused",
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
}, options.queue);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=cloudflare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../../src/internal/cdn/cloudflare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The provider-neutral half of `@nifrajs/web/cdn`: the path tag every cached page carries, and the
|
|
3
|
+
* purge queue each provider runs its API calls through (coalescing, chunking, `Retry-After`).
|
|
4
|
+
*/
|
|
5
|
+
import type { CdnPurgeTarget } from "../../isr.js";
|
|
6
|
+
/** What a cacheable page tells the CDN: its tags and how long the CDN may serve it. */
|
|
7
|
+
export interface CdnCacheInput {
|
|
8
|
+
readonly tags: readonly string[];
|
|
9
|
+
/** Seconds the CDN may serve the page as fresh. */
|
|
10
|
+
readonly maxAge: number;
|
|
11
|
+
/** Seconds past `maxAge` the CDN may serve it while it refetches. */
|
|
12
|
+
readonly staleWhileRevalidate: number;
|
|
13
|
+
/** Seconds past `maxAge` the CDN may serve it while the origin errors. */
|
|
14
|
+
readonly staleIfError?: number | undefined;
|
|
15
|
+
}
|
|
16
|
+
/** A CDN nifra can tag pages for and purge. Build one with {@link defineCdnProvider}. */
|
|
17
|
+
export interface CdnProvider extends CdnPurgeTarget {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
/** Most tags one response may carry on this CDN. */
|
|
20
|
+
readonly maxResponseTags: number;
|
|
21
|
+
/** Headers that let the CDN store a page under `input.tags` (consumed by the CDN, not the browser). */
|
|
22
|
+
cacheHeaders(input: CdnCacheInput): Readonly<Record<string, string>>;
|
|
23
|
+
/** Headers that keep the CDN from storing a page, whatever its rules say. */
|
|
24
|
+
noStoreHeaders(): Readonly<Record<string, string>>;
|
|
25
|
+
}
|
|
26
|
+
/** One purge API call's result. A refusal is `retryable` when sending it again may succeed. */
|
|
27
|
+
export type PurgeAttempt = {
|
|
28
|
+
readonly ok: true;
|
|
29
|
+
} | {
|
|
30
|
+
readonly ok: false;
|
|
31
|
+
readonly retryable: boolean;
|
|
32
|
+
readonly reason: string;
|
|
33
|
+
readonly retryAfterMs?: number | undefined;
|
|
34
|
+
readonly rateLimited?: boolean | undefined;
|
|
35
|
+
};
|
|
36
|
+
/** What a provider file supplies; {@link defineCdnProvider} adds the queue. */
|
|
37
|
+
export interface CdnProviderDefinition {
|
|
38
|
+
readonly name: string;
|
|
39
|
+
/** Most tags one purge API call may name. */
|
|
40
|
+
readonly tagsPerCall: number;
|
|
41
|
+
readonly maxResponseTags: number;
|
|
42
|
+
cacheHeaders(input: CdnCacheInput): Readonly<Record<string, string>>;
|
|
43
|
+
noStoreHeaders(): Readonly<Record<string, string>>;
|
|
44
|
+
purgeTags(tags: readonly string[]): Promise<PurgeAttempt>;
|
|
45
|
+
}
|
|
46
|
+
/** A purge that did not go through, as reported to {@link PurgeQueueOptions.onError}. */
|
|
47
|
+
export interface CdnPurgeError {
|
|
48
|
+
readonly code: "NIFRA_CDN_PURGE_FAILED" | "NIFRA_CDN_RATE_LIMITED";
|
|
49
|
+
readonly provider: string;
|
|
50
|
+
readonly reason: string;
|
|
51
|
+
/** How many tags the refused call named (never the tags or the credentials). */
|
|
52
|
+
readonly tags: number;
|
|
53
|
+
/** Whether the queue gave up on them. */
|
|
54
|
+
readonly final: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface PurgeQueueOptions {
|
|
57
|
+
/** Tags arriving within this window go out in one call (ms). Default 250. */
|
|
58
|
+
readonly debounceMs?: number;
|
|
59
|
+
/** Attempts per call before a retryable refusal is given up on. Default 5. */
|
|
60
|
+
readonly maxAttempts?: number;
|
|
61
|
+
/** Longest wait between attempts, `Retry-After` included (ms). Default 60000. */
|
|
62
|
+
readonly maxBackoffMs?: number;
|
|
63
|
+
/** Most tags waiting or retrying at once; a purge past it is refused as retryable. Default 5000. */
|
|
64
|
+
readonly maxQueuedTags?: number;
|
|
65
|
+
/** Where a refused purge is reported. Default: one `console.error` line per refusal. */
|
|
66
|
+
readonly onError?: (error: CdnPurgeError) => void;
|
|
67
|
+
/** Timer for the debounce and the backoff; tests pass their own. */
|
|
68
|
+
readonly sleep?: (ms: number) => Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The tag every page a CDN stores carries for its own path, so a path purge works on CDNs that only
|
|
72
|
+
* purge by tag. It hashes the normalized pathname alone: the query and the host stay out, so one purge
|
|
73
|
+
* reaches every query variant and needs no knowledge of the public origin. Two hosts serving the same
|
|
74
|
+
* path share the tag, which can only make a purge reach more than asked, never serve a wrong page.
|
|
75
|
+
*/
|
|
76
|
+
export declare function pathTag(path: string): Promise<string>;
|
|
77
|
+
/** `Retry-After` as milliseconds: delta seconds or an HTTP date; undefined when absent or unreadable. */
|
|
78
|
+
export declare function retryAfterMs(value: string | null, now?: number): number | undefined;
|
|
79
|
+
/** A purge API reply read the same way for every HTTP provider. */
|
|
80
|
+
export declare function attemptFromStatus(res: Response, reason: string): PurgeAttempt;
|
|
81
|
+
/** `max-age=..., stale-while-revalidate=...[, stale-if-error=...]` for a CDN TTL header. */
|
|
82
|
+
export declare function cdnDirectives(input: CdnCacheInput): string;
|
|
83
|
+
/**
|
|
84
|
+
* A {@link CdnProvider} from a provider's API calls, with the purge queue in front: tags arriving
|
|
85
|
+
* within `debounceMs` go out together, chunked to the provider's per-call limit and sent one call at
|
|
86
|
+
* a time; a 429 or 5xx is retried with capped exponential backoff that honors `Retry-After`. A
|
|
87
|
+
* `purge` resolves once its tags' first attempt is answered: `accepted`, `queued` (a retry is
|
|
88
|
+
* pending, kept alive with `platform.waitUntil` on edge runtimes), or `failed`.
|
|
89
|
+
*/
|
|
90
|
+
export declare function defineCdnProvider(definition: CdnProviderDefinition, options?: PurgeQueueOptions): CdnProvider;
|
|
91
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/internal/cdn/core.ts"],"names":[],"mappings":"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"}
|