@timber-js/app 0.2.0-alpha.147 → 0.2.0-alpha.148
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/_chunks/{actions-OIZ8siQu.js → actions-a0RczDnB.js} +8 -34
- package/dist/_chunks/{actions-OIZ8siQu.js.map → actions-a0RczDnB.js.map} +1 -1
- package/dist/_chunks/cache-api-Co-yI-gP.js +424 -0
- package/dist/_chunks/cache-api-Co-yI-gP.js.map +1 -0
- package/dist/_chunks/{metadata-routes-BjepjefT.js → canonicalize-P41GR6tY.js} +65 -2
- package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
- package/dist/_chunks/{cli-schema-sync-CQaxupHv.js → cli-schema-sync-DJDdyEae.js} +111 -260
- package/dist/_chunks/cli-schema-sync-DJDdyEae.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D_IhHEUW.js +2 -0
- package/dist/_chunks/{define-DMVhsipD.js → define-Bssfp6ot.js} +3 -33
- package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
- package/dist/_chunks/{define-C3RvHQPK.js → define-CFmvb4Bt.js} +15 -7
- package/dist/_chunks/define-CFmvb4Bt.js.map +1 -0
- package/dist/_chunks/{href-validation-DyZIzfMJ.js → href-validation-FiA_rToW.js} +2 -1
- package/dist/_chunks/{href-validation-DyZIzfMJ.js.map → href-validation-FiA_rToW.js.map} +1 -1
- package/dist/_chunks/{tracing-M_zKubhk.js → logger-CM0clugc.js} +394 -107
- package/dist/_chunks/logger-CM0clugc.js.map +1 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -1
- package/dist/_chunks/plugin-context-DurqFBuY.js +2 -0
- package/dist/_chunks/plugin-context-GfDWsdd2.js +268 -0
- package/dist/_chunks/plugin-context-GfDWsdd2.js.map +1 -0
- package/dist/_chunks/{resolve-schema-Dj8tQloi.js → resolve-schema-3iUvBV5T.js} +3 -30
- package/dist/_chunks/resolve-schema-3iUvBV5T.js.map +1 -0
- package/dist/_chunks/{schema-bridge-DK_89h8O.js → schema-bridge-BY3QLBL7.js} +35 -2
- package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
- package/dist/_chunks/tree-match-D2l830j2.js +102 -0
- package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -1
- package/dist/_chunks/{walkers-Ck4Y45XN.js → walkers-DvWDj453.js} +107 -82
- package/dist/_chunks/walkers-DvWDj453.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -1
- package/dist/adapters/cloudflare-kv-cache.js +36 -14
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -1
- package/dist/adapters/compress-module.d.ts +5 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +1 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +14 -134
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/cache/cache-api.d.ts.map +1 -1
- package/dist/cache/index.d.ts +3 -1
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +20 -235
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +13 -0
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/timber-cache.d.ts +17 -9
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +21 -1
- package/dist/cli-schema-sync.d.ts.map +1 -1
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -31
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-entry/hmr.d.ts.map +1 -1
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
- package/dist/client/browser-entry/router-init.d.ts.map +1 -1
- package/dist/client/history.d.ts +10 -17
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.js +30 -33
- package/dist/client/internal.js.map +1 -1
- package/dist/client/navigation-api.d.ts +9 -2
- package/dist/client/navigation-api.d.ts.map +1 -1
- package/dist/client/navigation-context.d.ts +0 -11
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +0 -5
- package/dist/client/navigation-root.d.ts.map +1 -1
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +10 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/codec.js +1 -1
- package/dist/config-validation.d.ts.map +1 -1
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.js +2 -4
- package/dist/cookies/index.js.map +1 -1
- package/dist/dev-tools/dev-page-shell.d.ts +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -1
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +1 -2
- package/dist/dev-tools/index.d.ts.map +1 -1
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +23 -11
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +3 -1
- package/dist/fonts/bundle.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +1 -1
- package/dist/fonts/dev-middleware.d.ts.map +1 -1
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +3 -3
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +7 -21
- package/dist/fonts/pipeline.d.ts.map +1 -1
- package/dist/fonts/transform.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +1 -18
- package/dist/fonts/virtual-modules.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +609 -406
- package/dist/index.js.map +1 -1
- package/dist/params/index.js +1 -1
- package/dist/params/resolve-schema.d.ts.map +1 -1
- package/dist/plugin-context.d.ts +28 -5
- package/dist/plugin-context.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +13 -5
- package/dist/plugins/cache.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +1 -2
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts.map +1 -1
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.js +2 -2
- package/dist/routing/interception.d.ts +0 -5
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/manifest-codegen.d.ts +32 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +15 -0
- package/dist/schema-bridge.d.ts.map +1 -1
- package/dist/search-params/define.d.ts.map +1 -1
- package/dist/search-params/index.js +7 -3
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/wrappers.d.ts.map +1 -1
- package/dist/segment-params/define.d.ts.map +1 -1
- package/dist/segment-params/index.js +1 -1
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/actions.d.ts +0 -14
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +0 -29
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/deny-renderer.d.ts +1 -1
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +8 -0
- package/dist/server/html-injector-core.d.ts.map +1 -1
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/internal.d.ts +1 -5
- package/dist/server/internal.d.ts.map +1 -1
- package/dist/server/internal.js +12 -171
- package/dist/server/internal.js.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +0 -11
- package/dist/server/node-stream-transforms.d.ts.map +1 -1
- package/dist/server/render-utils.d.ts +25 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +11 -25
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +2 -18
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/shared/href-validation.d.ts.map +1 -1
- package/dist/shims/image.d.ts +15 -15
- package/package.json +2 -2
- package/src/adapters/cloudflare-kv-cache.ts +56 -19
- package/src/adapters/compress-module.ts +27 -118
- package/src/adapters/nitro.ts +3 -41
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/cache/cache-api.ts +9 -1
- package/src/cache/index.ts +5 -2
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/redis-handler.ts +33 -2
- package/src/cache/timber-cache.ts +109 -53
- package/src/cli-schema-sync.ts +123 -30
- package/src/cli.ts +33 -37
- package/src/client/browser-entry/hmr.ts +0 -11
- package/src/client/browser-entry/hydrate.ts +39 -5
- package/src/client/browser-entry/post-hydration.ts +6 -15
- package/src/client/browser-entry/router-init.ts +98 -3
- package/src/client/history.ts +10 -24
- package/src/client/navigation-api.ts +14 -9
- package/src/client/navigation-context.ts +1 -21
- package/src/client/navigation-root.tsx +0 -8
- package/src/client/router.ts +18 -8
- package/src/client/rsc-fetch.ts +7 -2
- package/src/client/use-search-params.ts +10 -5
- package/src/config-validation.ts +33 -25
- package/src/cookies/define-cookie.ts +2 -18
- package/src/dev-tools/dev-page-shell.ts +6 -2
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +3 -16
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +91 -249
- package/src/fonts/bundle.ts +16 -9
- package/src/fonts/dev-middleware.ts +16 -5
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +7 -3
- package/src/fonts/local.ts +7 -6
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +27 -48
- package/src/fonts/transform.ts +27 -0
- package/src/fonts/virtual-modules.ts +1 -57
- package/src/index.ts +5 -11
- package/src/params/resolve-schema.ts +2 -34
- package/src/plugin-context.ts +95 -17
- package/src/plugins/cache.ts +64 -17
- package/src/plugins/dev-server.ts +61 -9
- package/src/plugins/fonts.ts +21 -6
- package/src/plugins/routing.ts +5 -348
- package/src/routing/codegen.ts +3 -2
- package/src/routing/convention-lint.ts +4 -3
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/interception.ts +2 -21
- package/src/routing/manifest-codegen.ts +290 -0
- package/src/routing/scanner.ts +5 -17
- package/src/routing/schema-validation.ts +2 -2
- package/src/schema-bridge.ts +63 -2
- package/src/search-params/define.ts +34 -2
- package/src/search-params/wrappers.ts +21 -3
- package/src/segment-params/define.ts +2 -62
- package/src/server/access-gate.tsx +8 -0
- package/src/server/actions.ts +8 -31
- package/src/server/build-manifest.ts +0 -56
- package/src/server/canonicalize.ts +6 -3
- package/src/server/deny-renderer.ts +6 -0
- package/src/server/html-injector-core.ts +19 -0
- package/src/server/html-injectors.ts +14 -4
- package/src/server/internal.ts +1 -18
- package/src/server/node-stream-transforms.ts +5 -72
- package/src/server/render-utils.ts +31 -0
- package/src/server/route-element-builder.ts +77 -47
- package/src/server/rsc-entry/error-renderer.ts +1 -0
- package/src/server/rsc-entry/helpers.ts +6 -34
- package/src/server/rsc-entry/index.ts +11 -0
- package/src/server/rsc-entry/render-route.ts +7 -9
- package/src/server/rsc-entry/rsc-payload.ts +2 -1
- package/src/server/rsc-entry/ssr-renderer.ts +2 -2
- package/src/server/ssr-render.ts +1 -11
- package/src/shared/href-validation.ts +8 -0
- package/dist/_chunks/cli-schema-sync-CBiMEtqa.js +0 -2
- package/dist/_chunks/cli-schema-sync-CQaxupHv.js.map +0 -1
- package/dist/_chunks/define-C3RvHQPK.js.map +0 -1
- package/dist/_chunks/define-DMVhsipD.js.map +0 -1
- package/dist/_chunks/handler-store-BVDgyTh7.js +0 -78
- package/dist/_chunks/handler-store-BVDgyTh7.js.map +0 -1
- package/dist/_chunks/logger-Dt-jQaBO.js +0 -291
- package/dist/_chunks/logger-Dt-jQaBO.js.map +0 -1
- package/dist/_chunks/metadata-routes-BjepjefT.js.map +0 -1
- package/dist/_chunks/resolve-schema-Dj8tQloi.js.map +0 -1
- package/dist/_chunks/schema-bridge-DK_89h8O.js.map +0 -1
- package/dist/_chunks/tracing-M_zKubhk.js.map +0 -1
- package/dist/_chunks/walkers-Ck4Y45XN.js.map +0 -1
- package/dist/_chunks/warnings-CNPXaypM.js +0 -125
- package/dist/_chunks/warnings-CNPXaypM.js.map +0 -1
- package/dist/client/link-pending-store.d.ts +0 -65
- package/dist/client/link-pending-store.d.ts.map +0 -1
- package/dist/client/nav-link-store.d.ts +0 -27
- package/dist/client/nav-link-store.d.ts.map +0 -1
- package/dist/dev-tools/warnings.d.ts +0 -109
- package/dist/dev-tools/warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/src/client/link-pending-store.ts +0 -116
- package/src/client/nav-link-store.ts +0 -37
- package/src/dev-tools/warnings.ts +0 -238
- package/src/server/flush.ts +0 -183
|
@@ -116,15 +116,4 @@ export declare function createNodeFlightInjector(rscStream: ReadableStream<Uint8
|
|
|
116
116
|
* pipeline() used to provide.
|
|
117
117
|
*/
|
|
118
118
|
export declare function runNodePipelineWithErrorHandling(source: Readable, transforms: readonly [Transform, ...Transform[]], signal?: AbortSignal): PassThrough;
|
|
119
|
-
/**
|
|
120
|
-
* Create a Node.js gzip Transform using native node:zlib.
|
|
121
|
-
*
|
|
122
|
-
* Uses `createGzip()` which is backed by C++ zlib — significantly faster
|
|
123
|
-
* than the Web Streams `CompressionStream` API (which is a JS wrapper
|
|
124
|
-
* around the same zlib but with per-chunk Promise overhead).
|
|
125
|
-
*
|
|
126
|
-
* Returns null if the response shouldn't be compressed (wrong content type,
|
|
127
|
-
* client doesn't accept gzip, already encoded, etc.).
|
|
128
|
-
*/
|
|
129
|
-
export declare function createNodeGzipCompressor(requestHeaders: Headers, responseHeaders: Headers): Transform | null;
|
|
130
119
|
//# sourceMappingURL=node-stream-transforms.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-stream-transforms.d.ts","sourceRoot":"","sources":["../../src/server/node-stream-transforms.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"node-stream-transforms.d.ts","sourceRoot":"","sources":["../../src/server/node-stream-transforms.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAGL,YAAY,EAOb,MAAM,yBAAyB,CAAC;AAOjC,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,4BAAiC,GAAG,SAAS,CA2BjG;AAID;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,IAAI,SAAS,CAoBzD;AAGD,OAAO,EAAE,YAAY,EAAE,CAAC;AAIxB;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CA2BlE;AAID;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,yBAAyB,GAClC,SAAS,CAiEX;AAID;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,SAAS,CAAC,SAAS,EAAE,GAAG,SAAS,EAAE,CAAC,EAChD,MAAM,CAAC,EAAE,WAAW,GACnB,WAAW,CAgCb"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared render-phase utilities — used by both the Node.js and Web
|
|
3
|
+
* stream wrappers. Pure functions only; no stream-shape dependencies.
|
|
4
|
+
*
|
|
5
|
+
* Consolidated from duplicated copies in node-stream-transforms.ts,
|
|
6
|
+
* ssr-render.ts, and rsc-entry/helpers.ts. See TIM-1071 item 1.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Check if an error is an abort error (connection closed by client).
|
|
10
|
+
*
|
|
11
|
+
* When the browser aborts a request (page refresh, navigation away),
|
|
12
|
+
* the AbortSignal fires and React/streams throw an AbortError. This
|
|
13
|
+
* is not an application error — suppress it from error boundaries and logs.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isAbortError(error: unknown): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Inline script that adds `<meta name="robots" content="noindex">` to the
|
|
18
|
+
* document head. Injected when a render-phase error replaces the shell so
|
|
19
|
+
* search engines don't index error pages.
|
|
20
|
+
*
|
|
21
|
+
* MUST be byte-identical across all stream wrappers (Node and Web) to
|
|
22
|
+
* ensure consistent Content-Length headers.
|
|
23
|
+
*/
|
|
24
|
+
export declare const NOINDEX_SCRIPT = "<script>document.head.appendChild(Object.assign(document.createElement(\"meta\"),{name:\"robots\",content:\"noindex\"}))</script>";
|
|
25
|
+
//# sourceMappingURL=render-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-utils.d.ts","sourceRoot":"","sources":["../../src/server/render-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIpD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,sIACoG,CAAC"}
|
|
@@ -6,18 +6,16 @@
|
|
|
6
6
|
* rsc-entry.ts under the 500-line limit.
|
|
7
7
|
*
|
|
8
8
|
* This module handles:
|
|
9
|
-
* 1.
|
|
10
|
-
* 2.
|
|
11
|
-
* 3. Resolving metadata (
|
|
9
|
+
* 1. Running access.ts checks eagerly to gate metadata resolution (TIM-1027)
|
|
10
|
+
* 2. Loading page/layout components from the segment chain
|
|
11
|
+
* 3. Resolving metadata (skipped for denied segments to prevent side effects)
|
|
12
12
|
* 4. Building the React element tree (page → error boundaries → access gates → layouts)
|
|
13
13
|
* 5. Resolving parallel slots
|
|
14
|
-
* 6. Wrapping the tree with AccessPreRunner for React.cache-scoped access checks
|
|
15
14
|
*
|
|
16
15
|
* See design/02-rendering-pipeline.md, design/04-authorization.md
|
|
17
16
|
*/
|
|
18
17
|
import type { RouteMatch } from './pipeline.js';
|
|
19
18
|
import type { ManifestSegmentNode } from './route-matcher.js';
|
|
20
|
-
import { DenySignal, RedirectSignal } from './primitives.js';
|
|
21
19
|
import type { InterceptionContext } from './pipeline.js';
|
|
22
20
|
/**
|
|
23
21
|
* Detect whether a component is a React client reference.
|
|
@@ -67,33 +65,21 @@ export interface RouteElementResult {
|
|
|
67
65
|
*/
|
|
68
66
|
skippedSegments: string[];
|
|
69
67
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Wraps a DenySignal or RedirectSignal with the layout components loaded
|
|
72
|
-
* so far, enabling the caller to render deny pages inside the layout shell.
|
|
73
|
-
*
|
|
74
|
-
* @deprecated No longer thrown by buildRouteElement since TIM-662. Access
|
|
75
|
-
* checks now run inside AccessPreRunner during renderToReadableStream, and
|
|
76
|
-
* signals are caught by onError. Kept for backward compat with external code.
|
|
77
|
-
*/
|
|
78
|
-
export declare class RouteSignalWithContext extends Error {
|
|
79
|
-
readonly signal: DenySignal | RedirectSignal;
|
|
80
|
-
readonly layoutComponents: LayoutComponentEntry[];
|
|
81
|
-
readonly segments: ManifestSegmentNode[];
|
|
82
|
-
constructor(signal: DenySignal | RedirectSignal, layoutComponents: LayoutComponentEntry[], segments: ManifestSegmentNode[]);
|
|
83
|
-
}
|
|
84
68
|
/**
|
|
85
69
|
* Build a React element tree from a matched route.
|
|
86
70
|
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
71
|
+
* Runs access checks eagerly to gate metadata resolution, then loads
|
|
72
|
+
* modules, resolves metadata (skipping denied segments), and constructs
|
|
73
|
+
* the element tree. DenySignal and RedirectSignal from access are stored
|
|
74
|
+
* as AccessGate verdicts for synchronous replay during render.
|
|
90
75
|
*
|
|
91
76
|
* Does NOT serialize to RSC Flight — the caller decides whether to render
|
|
92
77
|
* to a stream or use the element directly (e.g., for action revalidation).
|
|
93
78
|
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
79
|
+
* For passing segments, AccessGate re-runs access during render so that
|
|
80
|
+
* React.cache is populated for layout dedup (TIM-662). For denied
|
|
81
|
+
* segments, the pre-computed verdict is replayed — no re-execution,
|
|
82
|
+
* no metadata side effects, no head leak (TIM-1027).
|
|
97
83
|
*/
|
|
98
84
|
export declare function buildRouteElement(req: Request, match: RouteMatch, interception?: InterceptionContext, clientStateTree?: Set<string> | null, metadataRouteHashes?: Record<string, string>): Promise<RouteElementResult>;
|
|
99
85
|
//# sourceMappingURL=route-element-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-element-builder.d.ts","sourceRoot":"","sources":["../../src/server/route-element-builder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"route-element-builder.d.ts","sourceRoot":"","sources":["../../src/server/route-element-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AA0B9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAyCzD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAM7D;AAID;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAID,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CACvC;AAED,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;IAC3C,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC;IAC5B,2CAA2C;IAC3C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,wDAAwD;IACxD,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;IACzC,qCAAqC;IACrC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AA8DD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,YAAY,CAAC,EAAE,mBAAmB,EAClC,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EACpC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3C,OAAO,CAAC,kBAAkB,CAAC,CAme7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-renderer.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/error-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAavD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0GD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,gBAAgB,EAAE,WAAW,EAAE,EAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,eAAe,EAAE,qBAAqB,EACtC,WAAW,CAAC,EAAE,eAAe,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAwCnB;AAqID;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,mBAAmB,EAChC,eAAe,EAAE,OAAO,EACxB,eAAe,EAAE,qBAAqB,GACrC,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"error-renderer.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/error-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAavD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0GD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,gBAAgB,EAAE,WAAW,EAAE,EAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,eAAe,EAAE,qBAAqB,EACtC,WAAW,CAAC,EAAE,eAAe,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAwCnB;AAqID;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,mBAAmB,EAChC,eAAe,EAAE,OAAO,EACxB,eAAe,EAAE,qBAAqB,GACrC,OAAO,CAAC,QAAQ,CAAC,CAwCnB"}
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* Small, stateless functions used across the RSC entry modules.
|
|
5
5
|
*/
|
|
6
6
|
import type { ManifestSegmentNode } from '../route-matcher.js';
|
|
7
|
-
import { RedirectSignal } from '../primitives.js';
|
|
8
7
|
/** RSC content type for client navigation payload requests. */
|
|
9
8
|
export declare const RSC_CONTENT_TYPE = "text/x-component";
|
|
10
9
|
/**
|
|
@@ -91,23 +90,8 @@ export declare function buildSegmentInfo(segments: ManifestSegmentNode[], layout
|
|
|
91
90
|
* rather than full HTML. Client-side navigation sends Accept: text/x-component.
|
|
92
91
|
*/
|
|
93
92
|
export declare function isRscPayloadRequest(req: Request): boolean;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
* return 204 + X-Timber-Redirect header instead of a raw 302. The browser's
|
|
97
|
-
* fetch with redirect: "manual" turns a 302 into an opaque redirect (status 0,
|
|
98
|
-
* null body, inaccessible headers), which crashes createFromFetch when it
|
|
99
|
-
* tries to call .body.getReader(). The X-Timber-Redirect header lets the
|
|
100
|
-
* client detect the redirect and perform a soft SPA navigation.
|
|
101
|
-
*/
|
|
102
|
-
export declare function buildRedirectResponse(req: Request, signal: RedirectSignal, responseHeaders: Headers): Response;
|
|
103
|
-
/**
|
|
104
|
-
* Check if an error is an abort error (connection closed by client).
|
|
105
|
-
*
|
|
106
|
-
* When the browser aborts a request (page refresh, navigation away),
|
|
107
|
-
* the AbortSignal fires and React/streams throw an AbortError. This
|
|
108
|
-
* is not an application error — suppress it from error boundaries and logs.
|
|
109
|
-
*/
|
|
110
|
-
export declare function isAbortError(error: unknown): boolean;
|
|
93
|
+
export { buildRedirectResponse } from '../pipeline-helpers.js';
|
|
94
|
+
export { isAbortError } from '../render-utils.js';
|
|
111
95
|
export { escapeHtml } from '../utils/escape-html.js';
|
|
112
96
|
/**
|
|
113
97
|
* Parse a Cookie header string into a name→value Map.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,IAAI;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAQ/F;AAID;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,yDAAyD;IACzD,gBAAgB,IAAI,MAAM,CAAC;IAC3B,yEAAyE;IACzE,aAAa,IAAI,mBAAmB,EAAE,CAAC;CACxC;AAED,wBAAgB,2BAA2B,IAAI,qBAAqB,CAkCnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,EAAE,CA8ClE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,gBAAgB,EAAE,KAAK,CAAC;IACtB,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;IAC3C,OAAO,EAAE,mBAAmB,CAAC;CAC9B,CAAC,GACD,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA8B/D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGzD;AAMD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAW1E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/index.ts"],"names":[],"mappings":"AAuBA,OAAO,uCAAuC,CAAC;AAqB/C,OAAO,KAAK,EAAuB,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAoCtF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAE5E;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/index.ts"],"names":[],"mappings":"AAuBA,OAAO,uCAAuC,CAAC;AAqB/C,OAAO,KAAK,EAAuB,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAoCtF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAE5E;AAiXD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAInE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,QAAA,MAAiB,QAAQ,qCAGxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,gBAAkB,CAAC;AAE9C,eAAe,QAAQ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-route.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/render-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAY1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAkB/D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,qBAAqB,CAAC;IACvC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,mBAAmB,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,IAAI,EAAE,eAAe,EACrB,YAAY,CAAC,EAAE,mBAAmB,GACjC,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"render-route.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/render-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAY1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAkB/D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,qBAAqB,CAAC;IACvC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,mBAAmB,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,IAAI,EAAE,eAAe,EACrB,YAAY,CAAC,EAAE,mBAAmB,GACjC,OAAO,CAAC,QAAQ,CAAC,CAoOnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rsc-payload.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/rsc-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAQ/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,gBAAgB,EAAE,oBAAoB,EAAE,EACxC,YAAY,EAAE,WAAW,EAAE,EAC3B,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"rsc-payload.d.ts","sourceRoot":"","sources":["../../../src/server/rsc-entry/rsc-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAQ/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EACrC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,gBAAgB,EAAE,oBAAoB,EAAE,EACxC,YAAY,EAAE,WAAW,EAAE,EAC3B,KAAK,EAAE,UAAU,EACjB,eAAe,EAAE,OAAO,EACxB,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,QAAQ,CAAC,CAsKnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr-render.d.ts","sourceRoot":"","sources":["../../src/server/ssr-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ssr-render.d.ts","sourceRoot":"","sources":["../../src/server/ssr-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAsFvC;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,SAAS,EAClB,OAAO,CAAC,EAAE;IACR,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CACtD,GACA,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAErC;AAED,wEAAwE;AACxE,eAAO,MAAM,cAAc,SAAkB,CAAC;AAU9C;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,SAAS,EAClB,OAAO,CAAC,EAAE;IACR,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CACtD,GACA,OAAO,CAAC,OAAO,aAAa,EAAE,QAAQ,CAAC,CAqGzC;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,aAAa,EAAE,QAAQ,GACvC,cAAc,CAAC,UAAU,CAAC,CAE5B;AA2GD;;;;;;;;;;;;GAYG;AACH,2CAA2C;AAC3C,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,UAAU,CAAC,CA2B5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,EACtC,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,OAAO,GACvB,QAAQ,CASV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"href-validation.d.ts","sourceRoot":"","sources":["../../src/shared/href-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAuBH;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAqBzD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUpD;AAKD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"href-validation.d.ts","sourceRoot":"","sources":["../../src/shared/href-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAuBH;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAqBzD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUpD;AAKD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiB7D;AAID;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAiCpF"}
|
package/dist/shims/image.d.ts
CHANGED
|
@@ -51,17 +51,17 @@ export declare function Image({ priority: _priority, quality: _quality, fill: _f
|
|
|
51
51
|
autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {});
|
|
52
52
|
autoFocus?: boolean | undefined;
|
|
53
53
|
className?: string | undefined;
|
|
54
|
-
contentEditable?: (boolean | "
|
|
54
|
+
contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
|
|
55
55
|
contextMenu?: string | undefined;
|
|
56
56
|
dir?: string | undefined;
|
|
57
|
-
draggable?: (boolean | "
|
|
57
|
+
draggable?: (boolean | "true" | "false") | undefined;
|
|
58
58
|
enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
|
|
59
59
|
hidden?: boolean | undefined;
|
|
60
60
|
id?: string | undefined;
|
|
61
61
|
lang?: string | undefined;
|
|
62
62
|
nonce?: string | undefined;
|
|
63
63
|
slot?: string | undefined;
|
|
64
|
-
spellCheck?: (boolean | "
|
|
64
|
+
spellCheck?: (boolean | "true" | "false") | undefined;
|
|
65
65
|
style?: import("react").CSSProperties | undefined;
|
|
66
66
|
tabIndex?: number | undefined;
|
|
67
67
|
title?: string | undefined;
|
|
@@ -99,11 +99,11 @@ export declare function Image({ priority: _priority, quality: _quality, fill: _f
|
|
|
99
99
|
exportparts?: string | undefined;
|
|
100
100
|
part?: string | undefined;
|
|
101
101
|
"aria-activedescendant"?: string | undefined;
|
|
102
|
-
"aria-atomic"?: (boolean | "
|
|
102
|
+
"aria-atomic"?: (boolean | "true" | "false") | undefined;
|
|
103
103
|
"aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined;
|
|
104
104
|
"aria-braillelabel"?: string | undefined;
|
|
105
105
|
"aria-brailleroledescription"?: string | undefined;
|
|
106
|
-
"aria-busy"?: (boolean | "
|
|
106
|
+
"aria-busy"?: (boolean | "true" | "false") | undefined;
|
|
107
107
|
"aria-checked"?: boolean | "false" | "mixed" | "true" | undefined;
|
|
108
108
|
"aria-colcount"?: number | undefined;
|
|
109
109
|
"aria-colindex"?: number | undefined;
|
|
@@ -114,37 +114,37 @@ export declare function Image({ priority: _priority, quality: _quality, fill: _f
|
|
|
114
114
|
"aria-describedby"?: string | undefined;
|
|
115
115
|
"aria-description"?: string | undefined;
|
|
116
116
|
"aria-details"?: string | undefined;
|
|
117
|
-
"aria-disabled"?: (boolean | "
|
|
117
|
+
"aria-disabled"?: (boolean | "true" | "false") | undefined;
|
|
118
118
|
"aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined;
|
|
119
119
|
"aria-errormessage"?: string | undefined;
|
|
120
|
-
"aria-expanded"?: (boolean | "
|
|
120
|
+
"aria-expanded"?: (boolean | "true" | "false") | undefined;
|
|
121
121
|
"aria-flowto"?: string | undefined;
|
|
122
|
-
"aria-grabbed"?: (boolean | "
|
|
122
|
+
"aria-grabbed"?: (boolean | "true" | "false") | undefined;
|
|
123
123
|
"aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined;
|
|
124
|
-
"aria-hidden"?: (boolean | "
|
|
124
|
+
"aria-hidden"?: (boolean | "true" | "false") | undefined;
|
|
125
125
|
"aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
|
|
126
126
|
"aria-keyshortcuts"?: string | undefined;
|
|
127
127
|
"aria-label"?: string | undefined;
|
|
128
128
|
"aria-labelledby"?: string | undefined;
|
|
129
129
|
"aria-level"?: number | undefined;
|
|
130
130
|
"aria-live"?: "off" | "assertive" | "polite" | undefined;
|
|
131
|
-
"aria-modal"?: (boolean | "
|
|
132
|
-
"aria-multiline"?: (boolean | "
|
|
133
|
-
"aria-multiselectable"?: (boolean | "
|
|
131
|
+
"aria-modal"?: (boolean | "true" | "false") | undefined;
|
|
132
|
+
"aria-multiline"?: (boolean | "true" | "false") | undefined;
|
|
133
|
+
"aria-multiselectable"?: (boolean | "true" | "false") | undefined;
|
|
134
134
|
"aria-orientation"?: "horizontal" | "vertical" | undefined;
|
|
135
135
|
"aria-owns"?: string | undefined;
|
|
136
136
|
"aria-placeholder"?: string | undefined;
|
|
137
137
|
"aria-posinset"?: number | undefined;
|
|
138
138
|
"aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined;
|
|
139
|
-
"aria-readonly"?: (boolean | "
|
|
139
|
+
"aria-readonly"?: (boolean | "true" | "false") | undefined;
|
|
140
140
|
"aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined;
|
|
141
|
-
"aria-required"?: (boolean | "
|
|
141
|
+
"aria-required"?: (boolean | "true" | "false") | undefined;
|
|
142
142
|
"aria-roledescription"?: string | undefined;
|
|
143
143
|
"aria-rowcount"?: number | undefined;
|
|
144
144
|
"aria-rowindex"?: number | undefined;
|
|
145
145
|
"aria-rowindextext"?: string | undefined;
|
|
146
146
|
"aria-rowspan"?: number | undefined;
|
|
147
|
-
"aria-selected"?: (boolean | "
|
|
147
|
+
"aria-selected"?: (boolean | "true" | "false") | undefined;
|
|
148
148
|
"aria-setsize"?: number | undefined;
|
|
149
149
|
"aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
|
|
150
150
|
"aria-valuemax"?: number | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@timber-js/app",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.148",
|
|
4
4
|
"description": "Vite-native React framework built for Servers and Serverless Platforms — correct HTTP semantics, real status codes, pages that work without JavaScript",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cloudflare-workers",
|
|
@@ -161,6 +161,6 @@
|
|
|
161
161
|
}
|
|
162
162
|
},
|
|
163
163
|
"engines": {
|
|
164
|
-
"node": ">=22.
|
|
164
|
+
"node": ">=22.18.0"
|
|
165
165
|
}
|
|
166
166
|
}
|
|
@@ -19,6 +19,38 @@ interface KVCacheEntry {
|
|
|
19
19
|
expiresAt: number;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
interface TagIndexEntry {
|
|
23
|
+
key: string;
|
|
24
|
+
/** Physical KV expiry — the 2× TTL deadline. Members are pruned at this
|
|
25
|
+
* timestamp (not the logical expiresAt) so stale entries in the SWR window
|
|
26
|
+
* remain in the index for `invalidate({tag})` to find. */
|
|
27
|
+
expiresAt: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// 30 days in ms — used as the grace period for legacy tag index entries whose
|
|
31
|
+
// original expiry is unknown. Must be a concrete number, not Infinity, because
|
|
32
|
+
// JSON.stringify(Infinity) produces null and the entry would be pruned on read.
|
|
33
|
+
const LEGACY_GRACE_MS = 30 * 86400 * 1000;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Parse a tag index value, handling both the old format (string[]) and the
|
|
37
|
+
* new format (TagIndexEntry[]). Old-format entries get a 30-day grace period
|
|
38
|
+
* so they survive until explicitly invalidated or cycled through a new set().
|
|
39
|
+
*/
|
|
40
|
+
function parseTagIndex(raw: unknown): TagIndexEntry[] {
|
|
41
|
+
if (!Array.isArray(raw)) return [];
|
|
42
|
+
const legacyDeadline = Date.now() + LEGACY_GRACE_MS;
|
|
43
|
+
return raw.map((item: unknown) => {
|
|
44
|
+
if (typeof item === 'string') return { key: item, expiresAt: legacyDeadline };
|
|
45
|
+
return item as TagIndexEntry;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function computeIndexTtl(entries: TagIndexEntry[], now: number): number {
|
|
50
|
+
const maxExpiresAt = Math.max(...entries.map((e) => e.expiresAt));
|
|
51
|
+
return Math.max(Math.ceil((maxExpiresAt - now) / 1000), 60);
|
|
52
|
+
}
|
|
53
|
+
|
|
22
54
|
/**
|
|
23
55
|
* Cloudflare Workers KV–backed CacheHandler.
|
|
24
56
|
*
|
|
@@ -93,16 +125,20 @@ export class CloudflareKVCacheHandler implements CacheHandler {
|
|
|
93
125
|
const kvTtl = Math.max(opts.ttl * 2, 60);
|
|
94
126
|
await kv.put(this.dataKey(key), JSON.stringify(entry), { expirationTtl: kvTtl });
|
|
95
127
|
|
|
96
|
-
// Update tag indexes
|
|
97
|
-
//
|
|
128
|
+
// Update tag indexes — prune physically expired members on each write so
|
|
129
|
+
// indexes don't grow unboundedly. Uses the physical KV expiry (2× TTL) as
|
|
130
|
+
// the deadline, not the logical expiresAt, so stale entries in the SWR
|
|
131
|
+
// window remain in the index for invalidate({tag}) to find.
|
|
132
|
+
const now = Date.now();
|
|
133
|
+
const kvExpiresAt = now + kvTtl * 1000;
|
|
98
134
|
await Promise.all(
|
|
99
135
|
opts.tags.map(async (tag) => {
|
|
100
|
-
const existing = (await kv.get(this.tagKey(tag), { type: 'json' }))
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
136
|
+
const existing = parseTagIndex(await kv.get(this.tagKey(tag), { type: 'json' }));
|
|
137
|
+
const fresh = existing.filter((e) => e.expiresAt > now && e.key !== key);
|
|
138
|
+
fresh.push({ key, expiresAt: kvExpiresAt });
|
|
139
|
+
await kv.put(this.tagKey(tag), JSON.stringify(fresh), {
|
|
140
|
+
expirationTtl: computeIndexTtl(fresh, now),
|
|
141
|
+
});
|
|
106
142
|
})
|
|
107
143
|
);
|
|
108
144
|
}
|
|
@@ -116,14 +152,15 @@ export class CloudflareKVCacheHandler implements CacheHandler {
|
|
|
116
152
|
if (raw) {
|
|
117
153
|
await Promise.all(
|
|
118
154
|
raw.tags.map(async (tag) => {
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
155
|
+
const entries = parseTagIndex(await kv.get(this.tagKey(tag), { type: 'json' }));
|
|
156
|
+
const now = Date.now();
|
|
157
|
+
const filtered = entries.filter((e) => e.key !== opts.key);
|
|
158
|
+
if (filtered.length > 0) {
|
|
159
|
+
await kv.put(this.tagKey(tag), JSON.stringify(filtered), {
|
|
160
|
+
expirationTtl: computeIndexTtl(filtered, now),
|
|
161
|
+
});
|
|
162
|
+
} else {
|
|
163
|
+
await kv.delete(this.tagKey(tag));
|
|
127
164
|
}
|
|
128
165
|
})
|
|
129
166
|
);
|
|
@@ -132,9 +169,9 @@ export class CloudflareKVCacheHandler implements CacheHandler {
|
|
|
132
169
|
}
|
|
133
170
|
|
|
134
171
|
if (opts.tag) {
|
|
135
|
-
const
|
|
136
|
-
if (
|
|
137
|
-
await Promise.all(
|
|
172
|
+
const entries = parseTagIndex(await kv.get(this.tagKey(opts.tag), { type: 'json' }));
|
|
173
|
+
if (entries.length > 0) {
|
|
174
|
+
await Promise.all(entries.map((e) => kv.delete(this.dataKey(e.key))));
|
|
138
175
|
}
|
|
139
176
|
await kv.delete(this.tagKey(opts.tag));
|
|
140
177
|
}
|
|
@@ -1,127 +1,36 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Compiles server/compress.ts into a standalone ESM module (_compress.mjs)
|
|
2
|
+
// for self-hosted deployments. The adapter writes this to the build output
|
|
3
|
+
// during buildOutput(). It's imported by the Nitro entry and preview server
|
|
4
|
+
// at runtime.
|
|
2
5
|
//
|
|
3
|
-
//
|
|
4
|
-
// written
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
|
|
6
|
+
// By compiling the actual TypeScript source rather than maintaining a
|
|
7
|
+
// hand-written string template, any fix to server/compress.ts automatically
|
|
8
|
+
// flows to the production module. See design/18-build-system.md ("entry
|
|
9
|
+
// modules are real TypeScript files, not codegen strings").
|
|
10
|
+
|
|
11
|
+
import { transformWithOxc } from 'vite';
|
|
12
|
+
// Vite's ?raw import embeds the file as a string at build time — works
|
|
13
|
+
// in both dev (Vite resolves the TS source) and the published package
|
|
14
|
+
// (the string is inlined into the compiled adapter entry).
|
|
15
|
+
import compressSource from '../server/compress.ts?raw';
|
|
13
16
|
|
|
14
17
|
/**
|
|
15
|
-
*
|
|
18
|
+
* Compile server/compress.ts into a standalone ESM module.
|
|
16
19
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
20
|
+
* Uses Vite's OXC transform to strip TypeScript types from the
|
|
21
|
+
* embedded source. The result is written to `_compress.mjs` during
|
|
22
|
+
* buildOutput.
|
|
19
23
|
*
|
|
20
24
|
* @internal Exported for testing.
|
|
21
25
|
*/
|
|
22
|
-
export function generateCompressModule(): string {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
// Uses node:zlib createGzip() (C++ native) on Node.js, falls back to
|
|
26
|
-
// CompressionStream (Web API) on other runtimes. Brotli is left to CDNs/reverse
|
|
27
|
-
// proxies — at streaming quality levels its ratio advantage is marginal.
|
|
28
|
-
import { Readable, pipeline } from 'node:stream';
|
|
29
|
-
import { createGzip, constants } from 'node:zlib';
|
|
30
|
-
|
|
31
|
-
const COMPRESSIBLE_TYPES = new Set([
|
|
32
|
-
'text/html', 'text/css', 'text/plain', 'text/xml', 'text/javascript',
|
|
33
|
-
'text/x-component', 'application/json', 'application/javascript',
|
|
34
|
-
'application/xml', 'application/xhtml+xml', 'application/rss+xml',
|
|
35
|
-
'application/atom+xml', 'image/svg+xml',
|
|
36
|
-
]);
|
|
37
|
-
|
|
38
|
-
const NO_COMPRESS_STATUSES = new Set([204, 304]);
|
|
39
|
-
|
|
40
|
-
function negotiateEncoding(acceptEncoding) {
|
|
41
|
-
if (!acceptEncoding) return null;
|
|
42
|
-
// Parse tokens with quality values. Per RFC 9110 §12.5.3, q=0 means
|
|
43
|
-
// "not acceptable" — the client explicitly rejects that encoding.
|
|
44
|
-
// Brotli (br) is intentionally not handled at the application level.
|
|
45
|
-
const parts = acceptEncoding.split(',');
|
|
46
|
-
for (const part of parts) {
|
|
47
|
-
const [token, ...params] = part.split(';');
|
|
48
|
-
const name = token.trim().toLowerCase();
|
|
49
|
-
if (name !== 'gzip') continue;
|
|
50
|
-
let qValue = 1;
|
|
51
|
-
for (const param of params) {
|
|
52
|
-
const trimmed = param.trim().toLowerCase();
|
|
53
|
-
if (trimmed.startsWith('q=')) {
|
|
54
|
-
qValue = parseFloat(trimmed.slice(2));
|
|
55
|
-
if (Number.isNaN(qValue)) qValue = 1;
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (qValue > 0) return 'gzip';
|
|
60
|
-
}
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function shouldCompress(response) {
|
|
65
|
-
if (!response.body) return false;
|
|
66
|
-
if (NO_COMPRESS_STATUSES.has(response.status)) return false;
|
|
67
|
-
if (response.headers.has('Content-Encoding')) return false;
|
|
68
|
-
const contentType = response.headers.get('Content-Type');
|
|
69
|
-
if (!contentType) return false;
|
|
70
|
-
const mimeType = contentType.split(';')[0].trim().toLowerCase();
|
|
71
|
-
if (mimeType === 'text/event-stream') return false;
|
|
72
|
-
return COMPRESSIBLE_TYPES.has(mimeType);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function compressWithGzip(body) {
|
|
76
|
-
// Use node:zlib (C++ native) for gzip compression. The Web Streams
|
|
77
|
-
// CompressionStream works but every chunk crosses the JS/Promise boundary.
|
|
78
|
-
// node:zlib.createGzip() compresses entirely in C++ with zero per-chunk
|
|
79
|
-
// Promise overhead.
|
|
80
|
-
//
|
|
81
|
-
// Convert: Web ReadableStream → Node Readable → pipe through gzip →
|
|
82
|
-
// Node Readable → Readable.toWeb() → Web ReadableStream
|
|
83
|
-
try {
|
|
84
|
-
const nodeReadable = Readable.fromWeb(body);
|
|
85
|
-
// Z_SYNC_FLUSH ensures each chunk is flushed immediately so the browser
|
|
86
|
-
// receives the HTML shell before Suspense boundaries resolve. Without it,
|
|
87
|
-
// gzip buffers internally and breaks streaming.
|
|
88
|
-
const gzip = createGzip({ flush: constants.Z_SYNC_FLUSH });
|
|
89
|
-
// pipeline() instead of bare pipe(): pipe() does not forward source
|
|
90
|
-
// errors, so an erroring body would emit an unhandled 'error' event and
|
|
91
|
-
// crash the process. pipeline() destroys gzip on source error — the web
|
|
92
|
-
// stream rejects — and propagates consumer cancel back to the source
|
|
93
|
-
// body. Errors reach the consumer via the web stream; the callback only
|
|
94
|
-
// marks them handled at the Node layer.
|
|
95
|
-
pipeline(nodeReadable, gzip, () => {});
|
|
96
|
-
return Readable.toWeb(gzip);
|
|
97
|
-
} catch {
|
|
98
|
-
// Fallback: CompressionStream (CF Workers, or if node:stream unavailable)
|
|
99
|
-
return body.pipeThrough(new CompressionStream('gzip'));
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export function compressResponse(request, response) {
|
|
104
|
-
if (!shouldCompress(response)) return response;
|
|
105
|
-
const acceptEncoding = request.headers.get('Accept-Encoding') || '';
|
|
106
|
-
const encoding = negotiateEncoding(acceptEncoding);
|
|
107
|
-
if (!encoding) return response;
|
|
108
|
-
const compressedBody = compressWithGzip(response.body);
|
|
109
|
-
const headers = new Headers(response.headers);
|
|
110
|
-
headers.set('Content-Encoding', encoding);
|
|
111
|
-
headers.delete('Content-Length');
|
|
112
|
-
const existingVary = headers.get('Vary');
|
|
113
|
-
if (existingVary) {
|
|
114
|
-
if (!existingVary.toLowerCase().includes('accept-encoding')) {
|
|
115
|
-
headers.set('Vary', existingVary + ', Accept-Encoding');
|
|
116
|
-
}
|
|
117
|
-
} else {
|
|
118
|
-
headers.set('Vary', 'Accept-Encoding');
|
|
119
|
-
}
|
|
120
|
-
return new Response(compressedBody, {
|
|
121
|
-
status: response.status,
|
|
122
|
-
statusText: response.statusText,
|
|
123
|
-
headers,
|
|
26
|
+
export async function generateCompressModule(): Promise<string> {
|
|
27
|
+
const result = await transformWithOxc(compressSource, 'compress.ts', {
|
|
28
|
+
lang: 'ts',
|
|
124
29
|
});
|
|
125
|
-
|
|
126
|
-
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
'// Generated by @timber-js/app — compiled from server/compress.ts.\n' +
|
|
33
|
+
'// Do not edit — this file is regenerated on each build.\n' +
|
|
34
|
+
result.code
|
|
35
|
+
);
|
|
127
36
|
}
|