@timber-js/app 0.2.0-alpha.14 → 0.2.0-alpha.141
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-DzFMnUAR.js +1147 -0
- package/dist/_chunks/actions-DzFMnUAR.js.map +1 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js +785 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DH-M8Poy.js +2 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-C3RvHQPK.js +195 -0
- package/dist/_chunks/define-C3RvHQPK.js.map +1 -0
- package/dist/_chunks/define-DMVhsipD.js +112 -0
- package/dist/_chunks/define-DMVhsipD.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/handler-store-DjISKYEB.js +54 -0
- package/dist/_chunks/handler-store-DjISKYEB.js.map +1 -0
- package/dist/_chunks/href-validation-EZktELp8.js +124 -0
- package/dist/_chunks/href-validation-EZktELp8.js.map +1 -0
- package/dist/_chunks/logger-Dt-jQaBO.js +291 -0
- package/dist/_chunks/logger-Dt-jQaBO.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BjepjefT.js} +32 -19
- package/dist/_chunks/metadata-routes-BjepjefT.js.map +1 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js +103 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js +77 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js +86 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js.map +1 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/tracing-M_zKubhk.js +358 -0
- package/dist/_chunks/tracing-M_zKubhk.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
- package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/validation-taUkvA4Q.js +113 -0
- package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
- package/dist/_chunks/walkers-7FBPM-hX.js +724 -0
- package/dist/_chunks/walkers-7FBPM-hX.js.map +1 -0
- package/dist/_chunks/{format-RyoGQL74.js → warnings-CNPXaypM.js} +6 -45
- package/dist/_chunks/warnings-CNPXaypM.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +154 -48
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +165 -117
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +39 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +48 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +26 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +29 -6
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +183 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +925 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +65 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +27 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +14 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +79 -10
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +46 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +3 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +7 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +251 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +172 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5315 -12687
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +114 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +20 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +31 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/client-chunks.d.ts +39 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +18 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +60 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -14
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +70 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +8 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +1 -1
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3126 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +111 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +74 -20
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +28 -2
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +50 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +12 -5
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +5 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +38 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +63 -22
- package/src/adapters/build-output-helper.ts +139 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +147 -60
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +39 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/timber-cache.ts +52 -24
- package/src/cli-schema-sync.ts +295 -0
- package/src/cli.ts +76 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +125 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +153 -0
- package/src/client/browser-entry/index.ts +151 -0
- package/src/client/browser-entry/post-hydration.ts +113 -0
- package/src/client/browser-entry/router-init.ts +219 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +116 -0
- package/src/client/link.tsx +343 -150
- package/src/client/nav-link-store.ts +37 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +338 -0
- package/src/client/navigation-context.ts +35 -7
- package/src/client/navigation-root.tsx +347 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +418 -128
- package/src/client/rsc-fetch.ts +208 -10
- package/src/client/segment-cache.ts +6 -3
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +26 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +507 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +131 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +3 -3
- package/src/fonts/pipeline.ts +337 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +235 -0
- package/src/index.ts +415 -345
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +116 -0
- package/src/plugin-context.ts +247 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/cache.ts +180 -0
- package/src/plugins/client-chunks.ts +113 -0
- package/src/plugins/cloudflare-wasm.ts +103 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +179 -37
- package/src/plugins/entries.ts +110 -8
- package/src/plugins/fonts.ts +167 -655
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +386 -47
- package/src/plugins/server-bundle.ts +59 -3
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +321 -177
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +310 -0
- package/src/routing/scanner.ts +165 -110
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +60 -22
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +309 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +34 -26
- package/src/server/als-registry.ts +108 -20
- package/src/server/asset-headers.ts +8 -34
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +17 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +473 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +32 -52
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +35 -27
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +101 -5
- package/src/server/html-injector-core.ts +418 -0
- package/src/server/html-injectors.ts +238 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +182 -0
- package/src/server/logger.ts +67 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +32 -18
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +527 -0
- package/src/server/pipeline.ts +201 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +130 -46
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +437 -208
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +128 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/error-renderer.ts +316 -89
- package/src/server/rsc-entry/helpers.ts +155 -26
- package/src/server/rsc-entry/index.ts +283 -329
- package/src/server/rsc-entry/render-route.ts +313 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -22
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +271 -41
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +148 -0
- package/src/server/slot-resolver.ts +234 -246
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +217 -78
- package/src/server/ssr-render.ts +344 -71
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +210 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/href-validation.ts +127 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/LICENSE +0 -8
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* timber-cloudflare-wasm — Handle WASM modules for Cloudflare Workers builds.
|
|
3
|
+
*
|
|
4
|
+
* Cloudflare Workers can natively import `.wasm` files as compiled
|
|
5
|
+
* WebAssembly.Module. But Rolldown can't load `.wasm` files at build time.
|
|
6
|
+
*
|
|
7
|
+
* This plugin bridges the gap:
|
|
8
|
+
* 1. Adds the `workerd` resolve condition so libraries like @takumi-rs/wasm
|
|
9
|
+
* resolve to their Cloudflare-native entry (bare `.wasm` import)
|
|
10
|
+
* 2. Externalizes `.wasm` imports so Rolldown skips them
|
|
11
|
+
* 3. Copies the WASM files to the build output so wrangler can find them
|
|
12
|
+
*
|
|
13
|
+
* Only active for Cloudflare adapter production builds.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { basename, resolve, dirname } from 'node:path';
|
|
17
|
+
import { copyFile, mkdir } from 'node:fs/promises';
|
|
18
|
+
import type { Plugin, ResolvedConfig } from 'vite';
|
|
19
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
20
|
+
|
|
21
|
+
function isCloudflareAdapter(ctx: PluginContext): boolean {
|
|
22
|
+
const adapter = ctx.config.adapter as { name?: string } | undefined;
|
|
23
|
+
return adapter?.name === 'cloudflare';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function timberCloudflareWasm(ctx: PluginContext): Plugin[] {
|
|
27
|
+
// Track resolved WASM file paths so we can copy them to the output
|
|
28
|
+
const wasmFiles = new Map<string, string>();
|
|
29
|
+
|
|
30
|
+
const plugin: Plugin = {
|
|
31
|
+
name: 'timber-cloudflare-wasm',
|
|
32
|
+
|
|
33
|
+
configResolved(resolved: ResolvedConfig) {
|
|
34
|
+
if (resolved.command !== 'build') return;
|
|
35
|
+
if (!isCloudflareAdapter(ctx)) return;
|
|
36
|
+
|
|
37
|
+
// Prepend `workerd` to resolve conditions for server environments
|
|
38
|
+
// so @takumi-rs/wasm/auto resolves to the Cloudflare-native entry
|
|
39
|
+
// (bare WASM import) instead of the Vite entry (?url + fetch).
|
|
40
|
+
// Must happen in configResolved because the RSC plugin sets its own
|
|
41
|
+
// conditions during config — merging via config() would lose them.
|
|
42
|
+
for (const envName of ['rsc', 'ssr']) {
|
|
43
|
+
const env = resolved.environments[envName];
|
|
44
|
+
if (!env) continue;
|
|
45
|
+
const conditions = env.resolve.conditions;
|
|
46
|
+
if (!conditions.includes('workerd')) {
|
|
47
|
+
conditions.unshift('workerd');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
resolveId: {
|
|
53
|
+
order: 'pre',
|
|
54
|
+
async handler(source, importer) {
|
|
55
|
+
if (!source.endsWith('.wasm')) return;
|
|
56
|
+
|
|
57
|
+
let absolutePath: string;
|
|
58
|
+
if (source.startsWith('.') && importer) {
|
|
59
|
+
absolutePath = resolve(dirname(importer), source);
|
|
60
|
+
} else {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const filename = basename(absolutePath);
|
|
65
|
+
wasmFiles.set(filename, absolutePath);
|
|
66
|
+
|
|
67
|
+
return { id: './' + filename, external: true };
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
async writeBundle(options, bundle) {
|
|
72
|
+
if (wasmFiles.size === 0) return;
|
|
73
|
+
|
|
74
|
+
const outDir = options.dir;
|
|
75
|
+
if (!outDir) return;
|
|
76
|
+
|
|
77
|
+
// Find which output chunks reference WASM files and copy the WASM
|
|
78
|
+
// to the same directory so the relative imports resolve correctly.
|
|
79
|
+
const targetDirs = new Set<string>();
|
|
80
|
+
for (const chunk of Object.values(bundle)) {
|
|
81
|
+
if (chunk.type !== 'chunk') continue;
|
|
82
|
+
for (const filename of wasmFiles.keys()) {
|
|
83
|
+
if (chunk.code.includes(filename)) {
|
|
84
|
+
targetDirs.add(dirname(resolve(outDir, chunk.fileName)));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (targetDirs.size === 0) return;
|
|
90
|
+
|
|
91
|
+
const copies: Promise<void>[] = [];
|
|
92
|
+
for (const dir of targetDirs) {
|
|
93
|
+
await mkdir(dir, { recursive: true });
|
|
94
|
+
for (const [filename, absolutePath] of wasmFiles) {
|
|
95
|
+
copies.push(copyFile(absolutePath, resolve(dir, filename)));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
await Promise.all(copies);
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
return [plugin];
|
|
103
|
+
}
|
package/src/plugins/content.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import type { Plugin } from 'vite';
|
|
12
12
|
import { existsSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
|
-
import type { PluginContext } from '
|
|
14
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
15
15
|
|
|
16
16
|
const CONFIG_FILE_NAMES = [
|
|
17
17
|
'content-collections.ts',
|
|
@@ -15,10 +15,23 @@
|
|
|
15
15
|
import type { Plugin, ViteDevServer, DevEnvironment } from 'vite';
|
|
16
16
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
17
17
|
import { join } from 'node:path';
|
|
18
|
-
import type { PluginContext } from '
|
|
19
|
-
import { setViteServer } from '
|
|
20
|
-
import {
|
|
21
|
-
|
|
18
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
19
|
+
import { setViteServer } from '../dev-tools/warnings.js';
|
|
20
|
+
import {
|
|
21
|
+
sendErrorToOverlay,
|
|
22
|
+
classifyErrorPhase,
|
|
23
|
+
fixErrorStacktrace,
|
|
24
|
+
parseFirstAppFrame,
|
|
25
|
+
type ErrorPhase,
|
|
26
|
+
} from '../dev-tools/overlay.js';
|
|
27
|
+
import {
|
|
28
|
+
generateDevErrorPage,
|
|
29
|
+
extractHmrOptions,
|
|
30
|
+
type DevErrorHmrOptions,
|
|
31
|
+
} from '../dev-tools/error-page.js';
|
|
32
|
+
import { addVirtualModuleContext } from '../config-validation.js';
|
|
33
|
+
import { compressResponse } from '../server/compress.js';
|
|
34
|
+
import { isMetadataRouteServePath } from '../server/metadata-routes.js';
|
|
22
35
|
|
|
23
36
|
// ─── Constants ────────────────────────────────────────────────────────────
|
|
24
37
|
|
|
@@ -72,16 +85,15 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
72
85
|
* filtered out explicitly and passed through to Vite.
|
|
73
86
|
*/
|
|
74
87
|
configureServer(server: ViteDevServer) {
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
88
|
+
// Ensure config files are in the watch set. Vite's watcher covers
|
|
89
|
+
// the project root, but `server.watcher.add()` is a no-op for files
|
|
90
|
+
// already watched, and ensures newly-created config files (e.g. from
|
|
91
|
+
// create-timber-app) are picked up. The actual restart logic is
|
|
92
|
+
// handled by Vite's built-in configFileDependencies check — see the
|
|
93
|
+
// configResolved hook in index.ts where we register the config path.
|
|
94
|
+
// See 21-dev-server.md §HMR Wiring.
|
|
78
95
|
const configPaths = CONFIG_FILE_NAMES.map((name) => join(ctx.root, name));
|
|
79
|
-
|
|
80
|
-
server.watcher.on('change', (filePath: string) => {
|
|
81
|
-
if (configPaths.includes(filePath)) {
|
|
82
|
-
server.restart();
|
|
83
|
-
}
|
|
84
|
-
});
|
|
96
|
+
server.watcher.add(configPaths);
|
|
85
97
|
|
|
86
98
|
// Register Vite server for browser console warning forwarding.
|
|
87
99
|
// See 21-dev-server.md §Dev-Mode Warnings.
|
|
@@ -96,6 +108,21 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
96
108
|
// Pre-hook — registers middleware before Vite's internals
|
|
97
109
|
server.middlewares.use(createTimberMiddleware(server, ctx.root));
|
|
98
110
|
|
|
111
|
+
// Wrap server.listen() to close the holding server immediately
|
|
112
|
+
// before Vite binds the port — no gap where nothing is listening.
|
|
113
|
+
// The holding server was started in rootSync's config() hook to
|
|
114
|
+
// serve a loading page during initialization.
|
|
115
|
+
// See design/21-dev-server.md §"Startup Holding Server", TIM-665.
|
|
116
|
+
if (ctx.holdingServer) {
|
|
117
|
+
const originalListen = server.listen.bind(server);
|
|
118
|
+
const holdingRef = ctx.holdingServer;
|
|
119
|
+
ctx.holdingServer = null;
|
|
120
|
+
server.listen = async (port?: number, isRestart?: boolean) => {
|
|
121
|
+
await holdingRef.close().catch(() => {});
|
|
122
|
+
return originalListen(port, isRestart);
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
99
126
|
// Log startup timing summary. configureServer runs on all plugins
|
|
100
127
|
// before the server listens, so this captures the full cold start.
|
|
101
128
|
ctx.timer.end('dev-server-setup');
|
|
@@ -122,6 +149,10 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
122
149
|
* calls next() to let Vite handle them.
|
|
123
150
|
*/
|
|
124
151
|
function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
152
|
+
// Extract HMR connection options once so the error page can construct
|
|
153
|
+
// a correct WebSocket URL (TIM-789).
|
|
154
|
+
const hmrOptions = extractHmrOptions(server.config);
|
|
155
|
+
|
|
125
156
|
return async (req: IncomingMessage, res: ServerResponse, next: () => void): Promise<void> => {
|
|
126
157
|
const url = req.url;
|
|
127
158
|
if (!url) {
|
|
@@ -135,8 +166,9 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
135
166
|
return;
|
|
136
167
|
}
|
|
137
168
|
|
|
138
|
-
// Pass through static asset requests
|
|
139
|
-
|
|
169
|
+
// Pass through static asset requests — but not metadata routes like
|
|
170
|
+
// /favicon.ico that match asset extensions but are handled by timber.
|
|
171
|
+
if (isAssetRequest(url) && !isMetadataRouteServePath(url)) {
|
|
140
172
|
next();
|
|
141
173
|
return;
|
|
142
174
|
}
|
|
@@ -160,13 +192,44 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
160
192
|
handler = rscModule.default as (req: Request) => Promise<Response>;
|
|
161
193
|
|
|
162
194
|
// Wire pipeline errors into the browser error overlay.
|
|
163
|
-
//
|
|
164
|
-
|
|
165
|
-
|
|
195
|
+
// Set devPipelineErrorHandler directly on the pipeline config —
|
|
196
|
+
// no module-level singleton. The handler receives optional RSC debug
|
|
197
|
+
// component data (component names, environments, stack frames) from
|
|
198
|
+
// the Flight debug channel for render errors.
|
|
199
|
+
const config = rscModule.pipelineConfig as
|
|
200
|
+
| {
|
|
201
|
+
devPipelineErrorHandler?: (
|
|
202
|
+
error: Error,
|
|
203
|
+
phase: string,
|
|
204
|
+
debugComponents?: Array<{
|
|
205
|
+
name: string;
|
|
206
|
+
env: string | null;
|
|
207
|
+
stack: unknown[] | null;
|
|
208
|
+
}>
|
|
209
|
+
) => void;
|
|
210
|
+
}
|
|
211
|
+
| undefined;
|
|
212
|
+
if (config) {
|
|
213
|
+
config.devPipelineErrorHandler = (error, _phase, debugComponents) => {
|
|
214
|
+
sendErrorToOverlay(
|
|
215
|
+
server,
|
|
216
|
+
error,
|
|
217
|
+
classifyErrorPhase(error, projectRoot),
|
|
218
|
+
projectRoot,
|
|
219
|
+
debugComponents
|
|
220
|
+
);
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Wire source-map handler so error pages show original positions.
|
|
225
|
+
// fixErrorStacktrace rewrites the error's stack trace in-place using
|
|
226
|
+
// the Vite dev server's module graph. See TIM-811.
|
|
227
|
+
const setSourceMap = rscModule.setDevSourceMapHandler as
|
|
228
|
+
| ((fn: (error: Error) => void) => void)
|
|
166
229
|
| undefined;
|
|
167
|
-
if (typeof
|
|
168
|
-
|
|
169
|
-
|
|
230
|
+
if (typeof setSourceMap === 'function') {
|
|
231
|
+
setSourceMap((error: Error) => {
|
|
232
|
+
fixErrorStacktrace(server, error);
|
|
170
233
|
});
|
|
171
234
|
}
|
|
172
235
|
} catch (error) {
|
|
@@ -174,9 +237,11 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
174
237
|
// Vite may already show its own overlay for these, but we still
|
|
175
238
|
// log to stderr with frame dimming for the terminal.
|
|
176
239
|
if (error instanceof Error) {
|
|
240
|
+
// Add context for virtual:timber-* module errors
|
|
241
|
+
addTimberContext(error);
|
|
177
242
|
sendErrorToOverlay(server, error, 'module-transform', projectRoot);
|
|
178
243
|
}
|
|
179
|
-
respond500(res, error);
|
|
244
|
+
respond500(res, error, 'module-transform', projectRoot, hmrOptions);
|
|
180
245
|
return;
|
|
181
246
|
}
|
|
182
247
|
|
|
@@ -191,8 +256,20 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
191
256
|
// Convert Node IncomingMessage → Web Request
|
|
192
257
|
const webRequest = toWebRequest(req);
|
|
193
258
|
|
|
194
|
-
//
|
|
195
|
-
|
|
259
|
+
// Check for a platform-specific request wrapper (e.g., Cloudflare
|
|
260
|
+
// dev bindings). The cloudflareDevBindings() plugin stores a wrapper
|
|
261
|
+
// function on the server instance using a well-known Symbol. The
|
|
262
|
+
// wrapper runs the handler inside an ALS context so platform APIs
|
|
263
|
+
// like getCloudflareBindings() work during dev.
|
|
264
|
+
// See design/35-cloudflare-primitives.md §"Dev Experience".
|
|
265
|
+
const wrapper = (server as any)[Symbol.for('timber:dev-request-wrapper')] as
|
|
266
|
+
| (<T>(fn: () => T) => T)
|
|
267
|
+
| undefined;
|
|
268
|
+
|
|
269
|
+
// Run the full pipeline (wrapped if a platform dev plugin is active)
|
|
270
|
+
const webResponse = wrapper
|
|
271
|
+
? await wrapper(() => handler(webRequest))
|
|
272
|
+
: await handler(webRequest);
|
|
196
273
|
|
|
197
274
|
// Compress the response if the client supports it.
|
|
198
275
|
// In dev mode, compression is always enabled for parity with production.
|
|
@@ -205,26 +282,71 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
205
282
|
// Pipeline error — classify the phase, send to overlay, respond 500.
|
|
206
283
|
// The dev server remains running for recovery on file fix + HMR.
|
|
207
284
|
if (error instanceof Error) {
|
|
208
|
-
|
|
209
|
-
|
|
285
|
+
// Unwrap SsrStreamError to show the real cause in the error overlay.
|
|
286
|
+
// SsrStreamError wraps the original RSC render error with a generic
|
|
287
|
+
// message; the developer needs to see the actual error (e.g.,
|
|
288
|
+
// "useSegmentParams is not a function"), not the wrapper.
|
|
289
|
+
const displayError =
|
|
290
|
+
error.name === 'SsrStreamError' && error.cause instanceof Error ? error.cause : error;
|
|
291
|
+
const phase = classifyErrorPhase(displayError, projectRoot);
|
|
292
|
+
sendErrorToOverlay(server, displayError, phase, projectRoot);
|
|
293
|
+
respond500(res, displayError, phase, projectRoot, hmrOptions);
|
|
210
294
|
} else {
|
|
211
295
|
process.stderr.write(`\x1b[31m[timber] Dev server error:\x1b[0m ${String(error)}\n`);
|
|
296
|
+
respond500(res, error, 'render', projectRoot, hmrOptions);
|
|
212
297
|
}
|
|
213
|
-
respond500(res, error);
|
|
214
298
|
}
|
|
215
299
|
};
|
|
216
300
|
}
|
|
217
301
|
|
|
218
302
|
/**
|
|
219
303
|
* Send a 500 response without crashing the dev server.
|
|
304
|
+
*
|
|
305
|
+
* In dev mode, renders a styled HTML error page with source context,
|
|
306
|
+
* classified stack trace, and auto-reload on HMR. Falls back to
|
|
307
|
+
* text/plain if the HTML generator fails (must never crash).
|
|
220
308
|
*/
|
|
221
|
-
function respond500(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
309
|
+
function respond500(
|
|
310
|
+
res: ServerResponse,
|
|
311
|
+
error: unknown,
|
|
312
|
+
phase: ErrorPhase,
|
|
313
|
+
projectRoot: string,
|
|
314
|
+
hmrOptions?: DevErrorHmrOptions
|
|
315
|
+
): void {
|
|
316
|
+
if (res.headersSent) return;
|
|
317
|
+
|
|
318
|
+
// Try to render the rich HTML error page
|
|
319
|
+
if (error instanceof Error) {
|
|
320
|
+
try {
|
|
321
|
+
const html = generateDevErrorPage(error, phase, projectRoot, hmrOptions);
|
|
322
|
+
res.statusCode = 500;
|
|
323
|
+
res.setHeader('content-type', 'text/html; charset=utf-8');
|
|
324
|
+
res.end(html);
|
|
325
|
+
return;
|
|
326
|
+
} catch (e) {
|
|
327
|
+
console.debug(
|
|
328
|
+
'[timber] dev error page generation failed, falling back to text/plain:',
|
|
329
|
+
e instanceof Error ? e.message : e
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Fallback: plain text (same as before)
|
|
335
|
+
res.statusCode = 500;
|
|
336
|
+
res.setHeader('content-type', 'text/plain');
|
|
337
|
+
res.end(
|
|
338
|
+
`[timber] Internal server error\n\n${error instanceof Error ? (error.stack ?? error.message) : String(error)}`
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Add timber-specific context to an error's message if it references
|
|
344
|
+
* internal virtual modules (virtual:timber-*). Mutates the error in place.
|
|
345
|
+
*/
|
|
346
|
+
function addTimberContext(error: Error): void {
|
|
347
|
+
const enriched = addVirtualModuleContext(error.message);
|
|
348
|
+
if (enriched !== error.message) {
|
|
349
|
+
error.message = enriched;
|
|
228
350
|
}
|
|
229
351
|
}
|
|
230
352
|
|
|
@@ -317,6 +439,17 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
|
|
|
317
439
|
nodeRes.flushHeaders();
|
|
318
440
|
|
|
319
441
|
const reader = webResponse.body.getReader();
|
|
442
|
+
|
|
443
|
+
// Cancel the reader when the client disconnects. This causes any pending
|
|
444
|
+
// reader.read() to reject, breaking the pump loop. Critical for SSE and
|
|
445
|
+
// other infinite streams — without this, disconnected clients leak readers.
|
|
446
|
+
let clientDisconnected = false;
|
|
447
|
+
const onClose = () => {
|
|
448
|
+
clientDisconnected = true;
|
|
449
|
+
reader.cancel('Client disconnected').catch(() => {});
|
|
450
|
+
};
|
|
451
|
+
nodeRes.on('close', onClose);
|
|
452
|
+
|
|
320
453
|
try {
|
|
321
454
|
while (true) {
|
|
322
455
|
const { done, value } = await reader.read();
|
|
@@ -325,9 +458,18 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
|
|
|
325
458
|
// don't need back-pressure here — just keep pushing chunks.
|
|
326
459
|
nodeRes.write(value);
|
|
327
460
|
}
|
|
461
|
+
} catch (err) {
|
|
462
|
+
// reader.cancel() from the close handler causes read() to reject.
|
|
463
|
+
// This is expected on client disconnect — not an error.
|
|
464
|
+
if (!clientDisconnected) {
|
|
465
|
+
throw err;
|
|
466
|
+
}
|
|
328
467
|
} finally {
|
|
468
|
+
nodeRes.off('close', onClose);
|
|
329
469
|
reader.releaseLock();
|
|
330
|
-
nodeRes.
|
|
470
|
+
if (!nodeRes.writableEnded) {
|
|
471
|
+
nodeRes.end();
|
|
472
|
+
}
|
|
331
473
|
}
|
|
332
474
|
}
|
|
333
475
|
|
|
@@ -392,8 +534,8 @@ function listenForClientErrors(server: ViteDevServer, projectRoot: string): void
|
|
|
392
534
|
loc: loc ? { file: loc.file, line: loc.line, column: loc.column } : undefined,
|
|
393
535
|
},
|
|
394
536
|
});
|
|
395
|
-
} catch {
|
|
396
|
-
|
|
537
|
+
} catch (e) {
|
|
538
|
+
console.debug('[timber] overlay send failed:', e instanceof Error ? e.message : e);
|
|
397
539
|
}
|
|
398
540
|
});
|
|
399
541
|
}
|
package/src/plugins/entries.ts
CHANGED
|
@@ -15,7 +15,7 @@ import type { Plugin } from 'vite';
|
|
|
15
15
|
import { resolve, dirname } from 'node:path';
|
|
16
16
|
import { fileURLToPath } from 'node:url';
|
|
17
17
|
import { existsSync } from 'node:fs';
|
|
18
|
-
import type { PluginContext } from '
|
|
18
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
19
19
|
|
|
20
20
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
21
|
|
|
@@ -34,6 +34,7 @@ const VIRTUAL_IDS = {
|
|
|
34
34
|
browserEntry: 'virtual:timber-browser-entry',
|
|
35
35
|
config: 'virtual:timber-config',
|
|
36
36
|
instrumentation: 'virtual:timber-instrumentation',
|
|
37
|
+
cacheHandler: 'virtual:timber-cache-handler',
|
|
37
38
|
} as const;
|
|
38
39
|
|
|
39
40
|
/**
|
|
@@ -48,7 +49,7 @@ const VIRTUAL_IDS = {
|
|
|
48
49
|
const ENTRY_FILE_MAP: Record<string, string> = {
|
|
49
50
|
[VIRTUAL_IDS.rscEntry]: resolve(SRC_DIR, 'server', 'rsc-entry', 'index.ts'),
|
|
50
51
|
[VIRTUAL_IDS.ssrEntry]: resolve(SRC_DIR, 'server', 'ssr-entry.ts'),
|
|
51
|
-
[VIRTUAL_IDS.browserEntry]: resolve(SRC_DIR, 'client', 'browser-entry.ts'),
|
|
52
|
+
[VIRTUAL_IDS.browserEntry]: resolve(SRC_DIR, 'client', 'browser-entry', 'index.ts'),
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
/** The \0-prefixed resolved ID for virtual:timber-config */
|
|
@@ -57,6 +58,9 @@ const RESOLVED_CONFIG_ID = `\0${VIRTUAL_IDS.config}`;
|
|
|
57
58
|
/** The \0-prefixed resolved ID for virtual:timber-instrumentation */
|
|
58
59
|
const RESOLVED_INSTRUMENTATION_ID = `\0${VIRTUAL_IDS.instrumentation}`;
|
|
59
60
|
|
|
61
|
+
/** The \0-prefixed resolved ID for virtual:timber-cache-handler */
|
|
62
|
+
const RESOLVED_CACHE_HANDLER_ID = `\0${VIRTUAL_IDS.cacheHandler}`;
|
|
63
|
+
|
|
60
64
|
/**
|
|
61
65
|
* Strip the \0 prefix from a module ID.
|
|
62
66
|
*
|
|
@@ -94,12 +98,39 @@ function stripRootPrefix(id: string, root: string): string {
|
|
|
94
98
|
*
|
|
95
99
|
* Serializes output mode and feature flags for runtime consumption.
|
|
96
100
|
*/
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
/**
|
|
102
|
+
* Extract the JSON-serializable subset of `forms` config.
|
|
103
|
+
*
|
|
104
|
+
* Drops function-valued `stripSensitiveFields` with a build-time warning —
|
|
105
|
+
* functions cannot cross the JSON boundary to the runtime, so users must
|
|
106
|
+
* configure function predicates per-action via `createActionClient` instead.
|
|
107
|
+
*/
|
|
108
|
+
function serializeFormsConfig(
|
|
109
|
+
forms: { stripSensitiveFields?: unknown } | undefined
|
|
110
|
+
): { stripSensitiveFields?: boolean | readonly string[] } | undefined {
|
|
111
|
+
if (!forms) return undefined;
|
|
112
|
+
const opt = forms.stripSensitiveFields;
|
|
113
|
+
if (opt === undefined) return {};
|
|
114
|
+
if (typeof opt === 'boolean') return { stripSensitiveFields: opt };
|
|
115
|
+
if (Array.isArray(opt)) {
|
|
116
|
+
// Coerce to a string array and drop any non-string entries.
|
|
117
|
+
const names = opt.filter((v): v is string => typeof v === 'string');
|
|
118
|
+
return { stripSensitiveFields: names };
|
|
119
|
+
}
|
|
120
|
+
if (typeof opt === 'function') {
|
|
121
|
+
console.warn(
|
|
122
|
+
'[timber] forms.stripSensitiveFields was set to a function in timber.config.ts — ' +
|
|
123
|
+
'this is not supported at the global level (functions cannot be serialized ' +
|
|
124
|
+
'into the runtime config). Use a per-action override via ' +
|
|
125
|
+
'`createActionClient({ stripSensitiveFields: (name) => ... })` instead. ' +
|
|
126
|
+
'The built-in deny-list will be used globally.'
|
|
127
|
+
);
|
|
128
|
+
return {};
|
|
129
|
+
}
|
|
130
|
+
return {};
|
|
131
|
+
}
|
|
102
132
|
|
|
133
|
+
function generateConfigModule(ctx: PluginContext): string {
|
|
103
134
|
const runtimeConfig = {
|
|
104
135
|
output: ctx.config.output ?? 'server',
|
|
105
136
|
csrf: ctx.config.csrf ?? true,
|
|
@@ -108,10 +139,24 @@ function generateConfigModule(ctx: PluginContext): string {
|
|
|
108
139
|
dev: ctx.dev ?? false,
|
|
109
140
|
slowPhaseMs: ctx.config.dev?.slowPhaseMs ?? 200,
|
|
110
141
|
slowRequestMs: ctx.config.slowRequestMs ?? 3000,
|
|
111
|
-
cookieSecrets,
|
|
112
142
|
topLoader: ctx.config.topLoader,
|
|
113
143
|
debug: ctx.config.debug ?? false,
|
|
114
144
|
serverTiming: ctx.config.serverTiming,
|
|
145
|
+
renderTimeoutMs: ctx.config.renderTimeoutMs ?? 30_000,
|
|
146
|
+
// Auto-generated sitemap config — opt-in via timber.config.ts.
|
|
147
|
+
// See design/16-metadata.md §"Auto-generated Sitemap"
|
|
148
|
+
sitemap: ctx.config.sitemap,
|
|
149
|
+
// Forms config — only the serializable subset. `stripSensitiveFields`
|
|
150
|
+
// accepts boolean | string[] at the global level. Functions must be
|
|
151
|
+
// configured per-action via `createActionClient({ stripSensitiveFields })`
|
|
152
|
+
// because JSON.stringify would silently drop them here. See TIM-816.
|
|
153
|
+
forms: serializeFormsConfig(ctx.config.forms),
|
|
154
|
+
// Per-build deployment ID for version skew detection (TIM-446).
|
|
155
|
+
// Null in dev mode — HMR handles code updates without full reloads.
|
|
156
|
+
deploymentId: ctx.deploymentId ?? null,
|
|
157
|
+
// Note: project root is NOT included here — it was leaking server
|
|
158
|
+
// filesystem paths to client bundles (TIM-787). Dev error pages get
|
|
159
|
+
// the root through the dev server, not the runtime config.
|
|
115
160
|
};
|
|
116
161
|
|
|
117
162
|
return [
|
|
@@ -177,6 +222,53 @@ export function generateInstrumentationModule(instrumentationPath: string | null
|
|
|
177
222
|
].join('\n');
|
|
178
223
|
}
|
|
179
224
|
|
|
225
|
+
/**
|
|
226
|
+
* Detect the user's timber.config file at the project root.
|
|
227
|
+
* Returns the absolute path or null if not found.
|
|
228
|
+
*/
|
|
229
|
+
function detectConfigFile(root: string): string | null {
|
|
230
|
+
const names = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
|
|
231
|
+
for (const name of names) {
|
|
232
|
+
const candidate = resolve(root, name);
|
|
233
|
+
if (existsSync(candidate)) return candidate;
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Generate the virtual:timber-cache-handler module source.
|
|
240
|
+
*
|
|
241
|
+
* When the user's config has a cacheHandler, generates a module that
|
|
242
|
+
* dynamically imports the config file and extracts the cacheHandler.
|
|
243
|
+
* The cacheHandler is a class instance (e.g. RedisCacheHandler) that
|
|
244
|
+
* cannot be JSON-serialized into virtual:timber-config, so it must
|
|
245
|
+
* be loaded at runtime via dynamic import. See TIM-599.
|
|
246
|
+
*/
|
|
247
|
+
function generateCacheHandlerModule(configPath: string | null, hasCacheHandler: boolean): string {
|
|
248
|
+
if (configPath && hasCacheHandler) {
|
|
249
|
+
return [
|
|
250
|
+
'// Auto-generated cache handler loader — do not edit.',
|
|
251
|
+
'// Generated by timber-entries plugin.',
|
|
252
|
+
'',
|
|
253
|
+
`export default async function loadCacheHandler() {`,
|
|
254
|
+
` const mod = await import(${JSON.stringify(configPath)});`,
|
|
255
|
+
` const config = mod.default ?? mod;`,
|
|
256
|
+
` return config.cacheHandler ?? null;`,
|
|
257
|
+
`}`,
|
|
258
|
+
].join('\n');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return [
|
|
262
|
+
'// Auto-generated cache handler loader — do not edit.',
|
|
263
|
+
'// Generated by timber-entries plugin.',
|
|
264
|
+
'// No cacheHandler configured in timber.config.',
|
|
265
|
+
'',
|
|
266
|
+
`export default async function loadCacheHandler() {`,
|
|
267
|
+
` return null;`,
|
|
268
|
+
`}`,
|
|
269
|
+
].join('\n');
|
|
270
|
+
}
|
|
271
|
+
|
|
180
272
|
/**
|
|
181
273
|
* Create the timber-entries Vite plugin.
|
|
182
274
|
*
|
|
@@ -219,6 +311,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
|
|
|
219
311
|
return RESOLVED_INSTRUMENTATION_ID;
|
|
220
312
|
}
|
|
221
313
|
|
|
314
|
+
// Check cache handler virtual module
|
|
315
|
+
if (cleanId === VIRTUAL_IDS.cacheHandler) {
|
|
316
|
+
return RESOLVED_CACHE_HANDLER_ID;
|
|
317
|
+
}
|
|
318
|
+
|
|
222
319
|
return null;
|
|
223
320
|
},
|
|
224
321
|
|
|
@@ -236,6 +333,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
|
|
|
236
333
|
const instrumentationPath = detectInstrumentationFile(ctx.root);
|
|
237
334
|
return generateInstrumentationModule(instrumentationPath);
|
|
238
335
|
}
|
|
336
|
+
if (id === RESOLVED_CACHE_HANDLER_ID) {
|
|
337
|
+
const configPath = detectConfigFile(ctx.root);
|
|
338
|
+
const hasCacheHandler = ctx.config.cacheHandler != null;
|
|
339
|
+
return generateCacheHandlerModule(configPath, hasCacheHandler);
|
|
340
|
+
}
|
|
239
341
|
return null;
|
|
240
342
|
},
|
|
241
343
|
|