@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,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side registry for schema segment param codecs.
|
|
3
|
+
*
|
|
4
|
+
* The Link component uses codec `serialize` functions to convert typed
|
|
5
|
+
* segment param values back to URL-safe strings. Without this registry,
|
|
6
|
+
* Link falls back to `String(value)` — which works for simple types
|
|
7
|
+
* but breaks for custom codecs (e.g., Date → '2026-04-10').
|
|
8
|
+
*
|
|
9
|
+
* Populated at startup by the browser entry importing `virtual:timber-schema`.
|
|
10
|
+
* Also usable on the server (isomorphic).
|
|
11
|
+
*
|
|
12
|
+
* Design doc: design/41-global-params.md §"Link Component"
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { Codec } from '../codec.js';
|
|
16
|
+
|
|
17
|
+
let _codecs: Record<string, Codec<unknown>> | null = null;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Register the resolved schema codecs for use by Link's URL interpolation.
|
|
21
|
+
* Called once at startup from the browser entry or RSC entry.
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export function setLinkCodecs(codecs: Record<string, Codec<unknown>> | null): void {
|
|
25
|
+
_codecs = codecs;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Look up a codec by bracket key (e.g. '[id]', '[...slug]').
|
|
30
|
+
* Returns undefined if no schema is registered or the key has no codec.
|
|
31
|
+
*/
|
|
32
|
+
export function getLinkCodec(bracketKey: string): Codec<unknown> | undefined {
|
|
33
|
+
return _codecs?.[bracketKey] ?? undefined;
|
|
34
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* defineSchema — global segment param schema definition.
|
|
3
|
+
*
|
|
4
|
+
* Identity function at runtime; the type information is what matters.
|
|
5
|
+
* The Vite plugin reads the schema at build time for codegen, and
|
|
6
|
+
* the pipeline reads it at runtime for coercion.
|
|
7
|
+
*
|
|
8
|
+
* Design doc: design/41-global-params.md
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { Codec, CatchAllCodec, OptionalCatchAllCodec } from '../codec.js';
|
|
12
|
+
import type { StandardSchemaV1 } from '../schema-bridge.js';
|
|
13
|
+
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Types
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Infer the output type from a Codec, StandardSchemaV1, or nuqs parser.
|
|
20
|
+
*
|
|
21
|
+
* Used by codegen to reference schema types without hardcoding:
|
|
22
|
+
* `InferCodecType<typeof schema.segmentParams['[year]']>`
|
|
23
|
+
*/
|
|
24
|
+
export type InferCodecType<V> =
|
|
25
|
+
V extends Codec<infer T>
|
|
26
|
+
? T
|
|
27
|
+
: V extends StandardSchemaV1<infer T>
|
|
28
|
+
? T
|
|
29
|
+
: V extends { parseServerSide: (value: string) => infer T }
|
|
30
|
+
? T
|
|
31
|
+
: string;
|
|
32
|
+
|
|
33
|
+
/** Acceptable codec value for segment params: a Codec or Standard Schema. */
|
|
34
|
+
export type SegmentParamCodec = Codec<unknown> | StandardSchemaV1<unknown>;
|
|
35
|
+
|
|
36
|
+
/** Codec constraint for catch-all segment keys (`[...name]`). */
|
|
37
|
+
export type CatchAllParamCodec = CatchAllCodec<unknown> | StandardSchemaV1<readonly unknown[]>;
|
|
38
|
+
|
|
39
|
+
/** Codec constraint for optional catch-all segment keys (`[[...name]]`). */
|
|
40
|
+
export type OptionalCatchAllParamCodec =
|
|
41
|
+
| OptionalCatchAllCodec<unknown>
|
|
42
|
+
| StandardSchemaV1<readonly unknown[] | undefined>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Resolves the required codec type for a given bracket key pattern.
|
|
46
|
+
* - `[...name]` → requires a catch-all codec
|
|
47
|
+
* - `[[...name]]` → requires an optional catch-all codec
|
|
48
|
+
* - `[name]` → accepts any segment param codec
|
|
49
|
+
*/
|
|
50
|
+
export type CodecForKey<K extends string> = K extends `[[...${string}]]`
|
|
51
|
+
? OptionalCatchAllParamCodec
|
|
52
|
+
: K extends `[...${string}]`
|
|
53
|
+
? CatchAllParamCodec
|
|
54
|
+
: SegmentParamCodec;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Registry interface augmented by codegen with known filesystem bracket keys.
|
|
58
|
+
* When empty (no codegen yet), ValidDynamicSegmentKeys falls back to string.
|
|
59
|
+
*/
|
|
60
|
+
// eslint-disable-next-line typescript/no-empty-interface -- augmented by codegen
|
|
61
|
+
export interface ValidDynamicSegmentKeysRegistry {}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Union of valid bracket keys for defineSchema.
|
|
65
|
+
* After codegen runs, this is the set of filesystem segment names.
|
|
66
|
+
* Before codegen (fresh project), accepts any string.
|
|
67
|
+
*/
|
|
68
|
+
export type ValidDynamicSegmentKeys = keyof ValidDynamicSegmentKeysRegistry extends never
|
|
69
|
+
? string
|
|
70
|
+
: keyof ValidDynamicSegmentKeysRegistry & string;
|
|
71
|
+
|
|
72
|
+
/** Configuration object for defineSchema. */
|
|
73
|
+
export interface SchemaConfig<S extends Record<string, SegmentParamCodec>> {
|
|
74
|
+
segmentParams: S;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Factory
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Define the global segment param schema.
|
|
83
|
+
*
|
|
84
|
+
* Each key uses the bracket syntax from the filesystem (`[id]`, `[...slug]`,
|
|
85
|
+
* `[[...slug]]`) mapped to a codec. This makes the relationship between
|
|
86
|
+
* filesystem segments and codecs visually obvious.
|
|
87
|
+
*
|
|
88
|
+
* A dynamic segment with no key here defaults to `string` at codegen time.
|
|
89
|
+
*
|
|
90
|
+
* ```ts
|
|
91
|
+
* // app/schema.ts
|
|
92
|
+
* import { defineSchema } from '@timber-js/app/params';
|
|
93
|
+
* import { codec } from '@timber-js/app/codec';
|
|
94
|
+
* import { z } from 'zod';
|
|
95
|
+
*
|
|
96
|
+
* export default defineSchema({
|
|
97
|
+
* segmentParams: {
|
|
98
|
+
* '[artistSlug]': codec.string,
|
|
99
|
+
* '[year]': codec.integer,
|
|
100
|
+
* '[id]': z.coerce.number().int(),
|
|
101
|
+
* },
|
|
102
|
+
* });
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export function defineSchema<
|
|
106
|
+
S extends {
|
|
107
|
+
[K in keyof S]: K extends ValidDynamicSegmentKeys
|
|
108
|
+
? K extends string
|
|
109
|
+
? CodecForKey<K>
|
|
110
|
+
: SegmentParamCodec
|
|
111
|
+
: never;
|
|
112
|
+
},
|
|
113
|
+
>(config: { segmentParams: S }): { segmentParams: S } {
|
|
114
|
+
return config;
|
|
115
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// @timber-js/app/params — Global segment param schema and typed accessors.
|
|
2
|
+
//
|
|
3
|
+
// This is the import path for defineSchema, InferCodecType, and
|
|
4
|
+
// the future getSegmentParams/useSegmentParams with route narrowing.
|
|
5
|
+
//
|
|
6
|
+
// See design/41-global-params.md
|
|
7
|
+
|
|
8
|
+
export { defineSchema } from './define-schema.js';
|
|
9
|
+
export type {
|
|
10
|
+
InferCodecType,
|
|
11
|
+
SchemaConfig,
|
|
12
|
+
SegmentParamCodec,
|
|
13
|
+
ValidDynamicSegmentKeys,
|
|
14
|
+
ValidDynamicSegmentKeysRegistry,
|
|
15
|
+
} from './define-schema.js';
|
|
16
|
+
export { resolveSchemaCodecs, toBracketKey } from './resolve-schema.js';
|
|
17
|
+
export { setLinkCodecs, getLinkCodec } from './codec-registry.js';
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema resolution — resolves the global schema's segmentParams into
|
|
3
|
+
* a runtime-ready codec map keyed by bracket name (e.g. '[id]').
|
|
4
|
+
*
|
|
5
|
+
* Bracket keys are preserved so that `[id]`, `[...id]`, and `[[...id]]`
|
|
6
|
+
* remain distinct entries. The coercion layer reconstructs bracket keys
|
|
7
|
+
* from matched segment metadata to look up the correct codec.
|
|
8
|
+
*
|
|
9
|
+
* Design doc: design/41-global-params.md §Pipeline Integration
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { Codec } from '../codec.js';
|
|
13
|
+
import { isCodec, isStandardSchema, validateSync } from '../schema-bridge.js';
|
|
14
|
+
import type { StandardSchemaV1 } from '../schema-bridge.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Wrap a Standard Schema into a Codec for route params.
|
|
18
|
+
* Parse throws on failure (invalid param → 404). Serialize returns string.
|
|
19
|
+
*/
|
|
20
|
+
function fromParamSchema<T>(fieldName: string, schema: StandardSchemaV1<T>): Codec<T> {
|
|
21
|
+
return {
|
|
22
|
+
parse(value: string | string[] | undefined): T {
|
|
23
|
+
const result = validateSync(schema, value);
|
|
24
|
+
if (!result.issues) {
|
|
25
|
+
return result.value;
|
|
26
|
+
}
|
|
27
|
+
const messages = result.issues.map((i) => i.message).join(', ');
|
|
28
|
+
throw new Error(`[timber] Param '${fieldName}' coercion failed: ${messages}`);
|
|
29
|
+
},
|
|
30
|
+
serialize(value: T): string | null {
|
|
31
|
+
if (value === null || value === undefined) return null;
|
|
32
|
+
if (Array.isArray(value)) return value.join('/');
|
|
33
|
+
return String(value);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Resolve a schema entry to a Codec. Accepts Codec<T> or StandardSchemaV1<T>.
|
|
40
|
+
*/
|
|
41
|
+
function resolveCodec(fieldName: string, value: unknown): Codec<unknown> {
|
|
42
|
+
if (isCodec(value)) return value;
|
|
43
|
+
if (isStandardSchema(value)) return fromParamSchema(fieldName, value);
|
|
44
|
+
throw new Error(`[timber] Schema field '${fieldName}' is not a valid codec or Standard Schema.`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Reconstruct the bracket key for a segment from its type and param name.
|
|
49
|
+
* Used by the coercion layer to look up codecs in the bracket-keyed map.
|
|
50
|
+
*
|
|
51
|
+
* 'dynamic' + 'id' → '[id]'
|
|
52
|
+
* 'catch-all' + 'slug' → '[...slug]'
|
|
53
|
+
* 'optional-catch-all' + 'slug' → '[[...slug]]'
|
|
54
|
+
*/
|
|
55
|
+
export function toBracketKey(segmentType: string, paramName: string): string {
|
|
56
|
+
switch (segmentType) {
|
|
57
|
+
case 'catch-all':
|
|
58
|
+
return `[...${paramName}]`;
|
|
59
|
+
case 'optional-catch-all':
|
|
60
|
+
return `[[...${paramName}]]`;
|
|
61
|
+
default:
|
|
62
|
+
return `[${paramName}]`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const CATCH_ALL_RE = /^\[\.\.\..+\]$/;
|
|
67
|
+
const OPTIONAL_CATCH_ALL_RE = /^\[\[\.\.\..+\]\]$/;
|
|
68
|
+
|
|
69
|
+
function isCatchAllKey(key: string): boolean {
|
|
70
|
+
return CATCH_ALL_RE.test(key) || OPTIONAL_CATCH_ALL_RE.test(key);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function isOptionalCatchAllKey(key: string): boolean {
|
|
74
|
+
return OPTIONAL_CATCH_ALL_RE.test(key);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Resolve the global schema's segmentParams into a map of bracket-keyed
|
|
79
|
+
* param name → resolved Codec.
|
|
80
|
+
*
|
|
81
|
+
* Keys are preserved exactly as written in `app/schema.ts` so that
|
|
82
|
+
* `[id]`, `[...id]`, and `[[...id]]` remain distinct entries.
|
|
83
|
+
* The coercion layer in `param-coercion.ts` reconstructs bracket keys
|
|
84
|
+
* from matched segment metadata to look up the correct codec.
|
|
85
|
+
*
|
|
86
|
+
* Input: { '[id]': z.coerce.number(), '[...slug]': codec.string }
|
|
87
|
+
* Output: { '[id]': Codec<number>, '[...slug]': Codec<string> }
|
|
88
|
+
*/
|
|
89
|
+
export function resolveSchemaCodecs(
|
|
90
|
+
segmentParams: Record<string, unknown>
|
|
91
|
+
): Record<string, Codec<unknown>> {
|
|
92
|
+
const resolved: Record<string, Codec<unknown>> = Object.create(null);
|
|
93
|
+
|
|
94
|
+
for (const [bracketName, value] of Object.entries(segmentParams)) {
|
|
95
|
+
if (isCatchAllKey(bracketName) && isCodec(value) && !('__catchAll' in value)) {
|
|
96
|
+
throw new Error(
|
|
97
|
+
`[timber] Schema error: '${bracketName}' is a catch-all segment and requires an array codec ` +
|
|
98
|
+
`(e.g. codec.catchAll(codec.string)). Got a scalar codec.`
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
if (
|
|
102
|
+
isOptionalCatchAllKey(bracketName) &&
|
|
103
|
+
isCodec(value) &&
|
|
104
|
+
'__catchAll' in value &&
|
|
105
|
+
!('__optional' in value)
|
|
106
|
+
) {
|
|
107
|
+
throw new Error(
|
|
108
|
+
`[timber] Schema error: '${bracketName}' is an optional catch-all segment and requires codec.optionalCatchAll() ` +
|
|
109
|
+
`(e.g. codec.optionalCatchAll(codec.string)). Got a non-optional catch-all codec.`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
resolved[bracketName] = resolveCodec(bracketName, value);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return resolved;
|
|
116
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin context — internal types and helpers for timber sub-plugins.
|
|
3
|
+
*
|
|
4
|
+
* These are NOT part of the user-facing API. They are consumed by
|
|
5
|
+
* sub-plugins (routing, entries, shims, etc.) via relative imports.
|
|
6
|
+
* The root entry point (index.ts) does not re-export them.
|
|
7
|
+
*
|
|
8
|
+
* Design doc: 18-build-system.md §"Shared Plugin Context"
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { createRequire } from 'node:module';
|
|
14
|
+
import type { RouteTree } from './routing/types';
|
|
15
|
+
import type { BuildManifest } from './server/build-manifest';
|
|
16
|
+
import type { StartupTimer } from './utils/startup-timer';
|
|
17
|
+
import { createStartupTimer } from './utils/startup-timer';
|
|
18
|
+
import type { TimberUserConfig, ClientJavascriptConfig } from './config-types.js';
|
|
19
|
+
import type { HoldingServer } from './dev-tools/holding-server.js';
|
|
20
|
+
|
|
21
|
+
// Re-export for sub-plugin convenience — they import from plugin-context.ts
|
|
22
|
+
export type { TimberUserConfig, ClientJavascriptConfig } from './config-types.js';
|
|
23
|
+
|
|
24
|
+
// ── Client JavaScript config ─────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
/** Fully resolved client JavaScript configuration (no optionals). */
|
|
27
|
+
export interface ResolvedClientJavascript {
|
|
28
|
+
disabled: boolean;
|
|
29
|
+
enableHMRInDev: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Resolve `clientJavascript` into a fully resolved config.
|
|
34
|
+
*/
|
|
35
|
+
export function resolveClientJavascript(config: TimberUserConfig): ResolvedClientJavascript {
|
|
36
|
+
if (config.clientJavascript !== undefined) {
|
|
37
|
+
if (typeof config.clientJavascript === 'boolean') {
|
|
38
|
+
return {
|
|
39
|
+
disabled: !config.clientJavascript,
|
|
40
|
+
enableHMRInDev: !config.clientJavascript,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
disabled: config.clientJavascript.disabled,
|
|
45
|
+
enableHMRInDev: config.clientJavascript.enableHMRInDev ?? config.clientJavascript.disabled,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return { disabled: false, enableHMRInDev: false };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ── Plugin Context ────────────────────────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Shared context object passed to all sub-plugins via closure.
|
|
55
|
+
*
|
|
56
|
+
* Sub-plugins communicate through this context — not through Vite's
|
|
57
|
+
* plugin API or global state.
|
|
58
|
+
* See design/18-build-system.md §"Shared Plugin Context".
|
|
59
|
+
*/
|
|
60
|
+
export interface PluginContext {
|
|
61
|
+
config: TimberUserConfig;
|
|
62
|
+
/** Resolved client JavaScript configuration */
|
|
63
|
+
clientJavascript: ResolvedClientJavascript;
|
|
64
|
+
/** The scanned route tree (populated by timber-routing, consumed by timber-entries) */
|
|
65
|
+
routeTree: RouteTree | null;
|
|
66
|
+
/** Absolute path to the app/ directory */
|
|
67
|
+
appDir: string;
|
|
68
|
+
/** Absolute path to the project root */
|
|
69
|
+
root: string;
|
|
70
|
+
/** Whether the dev server is running (set by timber-root-sync in configResolved) */
|
|
71
|
+
dev: boolean;
|
|
72
|
+
/** CSS build manifest (populated by adapter after client build, null in dev) */
|
|
73
|
+
buildManifest: BuildManifest | null;
|
|
74
|
+
/** Per-build deployment ID for version skew detection (null in dev) */
|
|
75
|
+
deploymentId: string | null;
|
|
76
|
+
/** Startup timer for profiling cold start phases (active in dev, no-op in prod) */
|
|
77
|
+
timer: StartupTimer;
|
|
78
|
+
/** Holding server that binds the port during dev startup (closed in timber-dev-server) */
|
|
79
|
+
holdingServer?: HoldingServer | null;
|
|
80
|
+
/**
|
|
81
|
+
* Resolved absolute path to the build output directory.
|
|
82
|
+
*
|
|
83
|
+
* Defaults to `<root>/.timber/dist`. Can be overridden via
|
|
84
|
+
* `timber.config.ts` `buildDir` or Vite's `build.outDir`.
|
|
85
|
+
* Timber config takes precedence when both are set.
|
|
86
|
+
*
|
|
87
|
+
* Used by adapter-build and cli preview.
|
|
88
|
+
*/
|
|
89
|
+
buildDir: string;
|
|
90
|
+
/**
|
|
91
|
+
* Per-route client reference keys captured during the RSC build.
|
|
92
|
+
* Maps absolute route file paths to the set of client reference
|
|
93
|
+
* hash keys they transitively import. Used by adapter-build to
|
|
94
|
+
* populate per-route modulepreload entries from clientReferenceDeps.
|
|
95
|
+
*/
|
|
96
|
+
routeClientRefKeys?: Map<string, Set<string>>;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ── App directory resolution ──────────────────────────────────────────────
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Resolve the app directory. Checks (in order):
|
|
103
|
+
* 1. Explicit `configAppDir` from timber.config.ts
|
|
104
|
+
* 2. `<root>/app`
|
|
105
|
+
* 3. `<root>/src/app`
|
|
106
|
+
*
|
|
107
|
+
* Throws if none exist.
|
|
108
|
+
*/
|
|
109
|
+
export function resolveAppDir(root: string, configAppDir?: string): string {
|
|
110
|
+
if (configAppDir) {
|
|
111
|
+
const explicit = join(root, configAppDir);
|
|
112
|
+
if (!existsSync(explicit)) {
|
|
113
|
+
throw new Error(`[timber] Configured appDir "${configAppDir}" does not exist at ${explicit}`);
|
|
114
|
+
}
|
|
115
|
+
return explicit;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const rootApp = join(root, 'app');
|
|
119
|
+
if (existsSync(rootApp)) return rootApp;
|
|
120
|
+
|
|
121
|
+
const srcApp = join(root, 'src', 'app');
|
|
122
|
+
if (existsSync(srcApp)) return srcApp;
|
|
123
|
+
|
|
124
|
+
throw new Error(
|
|
125
|
+
`[timber] Could not find app directory. Expected "app/" or "src/app/" in ${root}. ` +
|
|
126
|
+
`You can set appDir in timber.config.ts to specify a custom location.`
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ── Plugin context factory ────────────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
export function createPluginContext(config?: TimberUserConfig, root?: string): PluginContext {
|
|
133
|
+
const projectRoot = root ?? process.cwd();
|
|
134
|
+
const resolvedConfig: TimberUserConfig = { ...config };
|
|
135
|
+
return {
|
|
136
|
+
config: resolvedConfig,
|
|
137
|
+
clientJavascript: resolveClientJavascript(resolvedConfig),
|
|
138
|
+
routeTree: null,
|
|
139
|
+
appDir: join(projectRoot, 'app'),
|
|
140
|
+
root: projectRoot,
|
|
141
|
+
dev: false,
|
|
142
|
+
buildManifest: null,
|
|
143
|
+
deploymentId: null,
|
|
144
|
+
timer: createStartupTimer(),
|
|
145
|
+
holdingServer: null,
|
|
146
|
+
buildDir: resolveBuildDir(projectRoot, resolvedConfig.buildDir),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ── Build directory resolution ────────────────────────────────────────────
|
|
151
|
+
|
|
152
|
+
/** Default build output directory (relative to root). */
|
|
153
|
+
export const DEFAULT_BUILD_DIR = join('.timber', 'dist');
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Resolve the build output directory.
|
|
157
|
+
*
|
|
158
|
+
* Priority:
|
|
159
|
+
* 1. Explicit `timberBuildDir` from timber.config.ts
|
|
160
|
+
* 2. Explicit `viteBuildOutDir` from Vite's build.outDir (if not the default 'dist')
|
|
161
|
+
* 3. Default: `.timber/dist`
|
|
162
|
+
*
|
|
163
|
+
* Returns an absolute path.
|
|
164
|
+
*/
|
|
165
|
+
export function resolveBuildDir(
|
|
166
|
+
root: string,
|
|
167
|
+
timberBuildDir?: string,
|
|
168
|
+
viteBuildOutDir?: string
|
|
169
|
+
): string {
|
|
170
|
+
if (timberBuildDir) {
|
|
171
|
+
return join(root, timberBuildDir);
|
|
172
|
+
}
|
|
173
|
+
if (viteBuildOutDir && viteBuildOutDir !== 'dist') {
|
|
174
|
+
return join(root, viteBuildOutDir);
|
|
175
|
+
}
|
|
176
|
+
return join(root, DEFAULT_BUILD_DIR);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// ── Config file loading ───────────────────────────────────────────────────
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Load timber.config.ts (or .js, .mjs) from the project root.
|
|
183
|
+
* Returns the config object or null if no config file is found.
|
|
184
|
+
*
|
|
185
|
+
* Uses require() which works for ESM modules on Node 22.12+.
|
|
186
|
+
* This keeps timber() synchronous — no async config loading needed.
|
|
187
|
+
*/
|
|
188
|
+
export function loadTimberConfigFile(root: string): TimberUserConfig | null {
|
|
189
|
+
const configNames = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
|
|
190
|
+
const req = createRequire(join(root, 'package.json'));
|
|
191
|
+
|
|
192
|
+
for (const name of configNames) {
|
|
193
|
+
const configPath = join(root, name);
|
|
194
|
+
if (existsSync(configPath)) {
|
|
195
|
+
const mod = req(configPath);
|
|
196
|
+
return (mod.default ?? mod) as TimberUserConfig;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Detect config keys set in both inline (vite.config.ts) and file (timber.config.ts)
|
|
204
|
+
* and warn the user. The `output` key is excluded because it defaults to 'server'
|
|
205
|
+
* in createPluginContext and would always appear as an inline key.
|
|
206
|
+
*
|
|
207
|
+
* Returns the list of conflicting key names (for testing).
|
|
208
|
+
*/
|
|
209
|
+
export function warnConfigConflicts(
|
|
210
|
+
inline: TimberUserConfig,
|
|
211
|
+
fileConfig: TimberUserConfig
|
|
212
|
+
): string[] {
|
|
213
|
+
const conflicts: string[] = [];
|
|
214
|
+
for (const key of Object.keys(fileConfig) as (keyof TimberUserConfig)[]) {
|
|
215
|
+
if (key in inline && inline[key] !== undefined) {
|
|
216
|
+
conflicts.push(key);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (conflicts.length > 0) {
|
|
220
|
+
console.warn(
|
|
221
|
+
`[timber] Config conflict: ${conflicts.map((k) => `"${k}"`).join(', ')} set in both ` +
|
|
222
|
+
`vite.config.ts (inline) and timber.config.ts. ` +
|
|
223
|
+
`Move all config to timber.config.ts to avoid confusion. ` +
|
|
224
|
+
`The inline value from vite.config.ts will be used.`
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
return conflicts;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Merge file-based config into ctx.config. Inline config (already in ctx.config)
|
|
232
|
+
* takes precedence — file config only fills in missing fields.
|
|
233
|
+
*/
|
|
234
|
+
export function mergeFileConfig(ctx: PluginContext, fileConfig: TimberUserConfig): void {
|
|
235
|
+
const inline = ctx.config;
|
|
236
|
+
warnConfigConflicts(inline, fileConfig);
|
|
237
|
+
|
|
238
|
+
ctx.config = {
|
|
239
|
+
...fileConfig,
|
|
240
|
+
...inline,
|
|
241
|
+
...(fileConfig.limits && inline.limits
|
|
242
|
+
? { limits: { ...fileConfig.limits, ...inline.limits } }
|
|
243
|
+
: {}),
|
|
244
|
+
...(fileConfig.dev && inline.dev ? { dev: { ...fileConfig.dev, ...inline.dev } } : {}),
|
|
245
|
+
...(fileConfig.mdx && inline.mdx ? { mdx: { ...fileConfig.mdx, ...inline.mdx } } : {}),
|
|
246
|
+
};
|
|
247
|
+
}
|
|
@@ -16,8 +16,10 @@
|
|
|
16
16
|
import type { Plugin } from 'vite';
|
|
17
17
|
import { join } from 'node:path';
|
|
18
18
|
import { readFile, writeFile } from 'node:fs/promises';
|
|
19
|
-
import type { PluginContext } from '
|
|
20
|
-
import type { TimberPlatformAdapter, TimberConfig } from '
|
|
19
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
20
|
+
import type { TimberPlatformAdapter, TimberConfig } from '../adapters/types.js';
|
|
21
|
+
import type { BuildManifest } from '../server/build-manifest.js';
|
|
22
|
+
import { swallow } from '../server/logger.js';
|
|
21
23
|
|
|
22
24
|
export function timberAdapterBuild(ctx: PluginContext): Plugin {
|
|
23
25
|
return {
|
|
@@ -35,7 +37,20 @@ export function timberAdapterBuild(ctx: PluginContext): Plugin {
|
|
|
35
37
|
const adapter = ctx.config.adapter as TimberPlatformAdapter | undefined;
|
|
36
38
|
if (!adapter || typeof adapter.buildOutput !== 'function') return;
|
|
37
39
|
|
|
38
|
-
const buildDir =
|
|
40
|
+
const buildDir = ctx.buildDir;
|
|
41
|
+
|
|
42
|
+
// Merge per-route CSS and client reference JS from the RSC plugin's
|
|
43
|
+
// assets manifest into the build manifest. This data enables
|
|
44
|
+
// <link rel="stylesheet"> and <link rel="modulepreload"> tags in
|
|
45
|
+
// <head> for server component routes (TIM-1014).
|
|
46
|
+
if (ctx.buildManifest) {
|
|
47
|
+
await mergeRscAssetsManifest(
|
|
48
|
+
buildDir,
|
|
49
|
+
ctx.root,
|
|
50
|
+
ctx.buildManifest,
|
|
51
|
+
ctx.routeClientRefKeys
|
|
52
|
+
);
|
|
53
|
+
}
|
|
39
54
|
|
|
40
55
|
// Serialize the build manifest as a JS module that sets the global.
|
|
41
56
|
// The adapter writes this as _timber-manifest-init.mjs and imports it
|
|
@@ -50,6 +65,12 @@ export function timberAdapterBuild(ctx: PluginContext): Plugin {
|
|
|
50
65
|
: ctx.buildManifest;
|
|
51
66
|
const json = JSON.stringify(manifest);
|
|
52
67
|
manifestInit = `globalThis.__TIMBER_BUILD_MANIFEST__ = ${json};\n`;
|
|
68
|
+
|
|
69
|
+
// Embed the deployment ID for version skew detection (TIM-446).
|
|
70
|
+
// The server reads this at startup via setDeploymentId().
|
|
71
|
+
if (ctx.deploymentId) {
|
|
72
|
+
manifestInit += `globalThis.__TIMBER_DEPLOYMENT_ID__ = ${JSON.stringify(ctx.deploymentId)};\n`;
|
|
73
|
+
}
|
|
53
74
|
}
|
|
54
75
|
|
|
55
76
|
// Strip JS from the RSC plugin's assets manifest when client JS
|
|
@@ -81,6 +102,78 @@ export function timberAdapterBuild(ctx: PluginContext): Plugin {
|
|
|
81
102
|
* intercept them. This rewrites the files on disk after all builds
|
|
82
103
|
* complete but before the adapter copies them to the output directory.
|
|
83
104
|
*/
|
|
105
|
+
/**
|
|
106
|
+
* Read the RSC plugin's assets manifest and merge per-route CSS and
|
|
107
|
+
* per-route JS modulepreloads into the build manifest.
|
|
108
|
+
*
|
|
109
|
+
* CSS: `serverResources` maps server component paths to CSS URLs.
|
|
110
|
+
* JS: `clientReferenceDeps` maps reference hashes to JS dep URLs.
|
|
111
|
+
* Combined with `routeClientRefKeys` (from the RSC generateBundle
|
|
112
|
+
* module graph walk) to produce per-route modulepreload entries.
|
|
113
|
+
*/
|
|
114
|
+
export async function mergeRscAssetsManifest(
|
|
115
|
+
buildDir: string,
|
|
116
|
+
root: string,
|
|
117
|
+
buildManifest: BuildManifest,
|
|
118
|
+
routeClientRefKeys?: Map<string, Set<string>>
|
|
119
|
+
): Promise<void> {
|
|
120
|
+
const manifestPath = join(buildDir, 'rsc', '__vite_rsc_assets_manifest.js');
|
|
121
|
+
let content: string;
|
|
122
|
+
try {
|
|
123
|
+
content = await readFile(manifestPath, 'utf-8');
|
|
124
|
+
} catch {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const jsonStr = content.replace(/^export default\s*/, '').replace(/;?\s*$/, '');
|
|
129
|
+
let manifest: Record<string, unknown>;
|
|
130
|
+
try {
|
|
131
|
+
manifest = JSON.parse(jsonStr);
|
|
132
|
+
} catch {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Merge serverResources CSS into buildManifest.css.
|
|
137
|
+
// Keys in serverResources are root-relative (e.g., "app/layout.tsx" or
|
|
138
|
+
// "src/app/layout.tsx"). Convert to absolute paths to match the runtime
|
|
139
|
+
// route manifest's filePath values.
|
|
140
|
+
const serverResources = manifest.serverResources as
|
|
141
|
+
| Record<string, { js: string[]; css: string[] }>
|
|
142
|
+
| undefined;
|
|
143
|
+
if (serverResources) {
|
|
144
|
+
for (const [relativePath, deps] of Object.entries(serverResources)) {
|
|
145
|
+
if (deps.css && deps.css.length > 0) {
|
|
146
|
+
const absolutePath = join(root, relativePath);
|
|
147
|
+
buildManifest.css[absolutePath] = deps.css;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Build per-route modulepreload entries from routeClientRefKeys +
|
|
153
|
+
// clientReferenceDeps. Each route file's transitive client reference
|
|
154
|
+
// keys (captured during RSC generateBundle) are mapped to their JS
|
|
155
|
+
// chunk URLs via clientReferenceDeps.
|
|
156
|
+
if (routeClientRefKeys && routeClientRefKeys.size > 0) {
|
|
157
|
+
const clientReferenceDeps = manifest.clientReferenceDeps as
|
|
158
|
+
| Record<string, { js: string[]; css: string[] }>
|
|
159
|
+
| undefined;
|
|
160
|
+
if (clientReferenceDeps) {
|
|
161
|
+
for (const [filePath, refKeys] of routeClientRefKeys) {
|
|
162
|
+
const jsUrls = new Set<string>();
|
|
163
|
+
for (const key of refKeys) {
|
|
164
|
+
const deps = clientReferenceDeps[key];
|
|
165
|
+
if (deps?.js) {
|
|
166
|
+
for (const url of deps.js) jsUrls.add(url);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (jsUrls.size > 0) {
|
|
170
|
+
buildManifest.modulepreload[filePath] = Array.from(jsUrls);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
84
177
|
async function stripJsFromRscAssetsManifests(buildDir: string): Promise<void> {
|
|
85
178
|
const manifestName = '__vite_rsc_assets_manifest.js';
|
|
86
179
|
const paths = [join(buildDir, 'rsc', manifestName), join(buildDir, 'ssr', manifestName)];
|
|
@@ -97,7 +190,8 @@ async function stripJsFromRscAssetsManifests(buildDir: string): Promise<void> {
|
|
|
97
190
|
let manifest: Record<string, unknown>;
|
|
98
191
|
try {
|
|
99
192
|
manifest = JSON.parse(jsonStr);
|
|
100
|
-
} catch {
|
|
193
|
+
} catch (err) {
|
|
194
|
+
swallow(err, `corrupted RSC assets manifest: ${path}`, { level: 'warn' });
|
|
101
195
|
continue;
|
|
102
196
|
}
|
|
103
197
|
|