@timber-js/app 0.2.0-alpha.8 → 0.2.0-alpha.81
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/LICENSE +8 -0
- package/dist/_chunks/actions-Dg-ANYHb.js +421 -0
- package/dist/_chunks/actions-Dg-ANYHb.js.map +1 -0
- package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
- package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
- package/dist/_chunks/chunk-DYhsFzuS.js +33 -0
- package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
- package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
- package/dist/_chunks/define-C77ScO0m.js +106 -0
- package/dist/_chunks/define-C77ScO0m.js.map +1 -0
- package/dist/_chunks/define-CZqDwhSu.js +199 -0
- package/dist/_chunks/define-CZqDwhSu.js.map +1 -0
- package/dist/_chunks/define-cookie-C2IkoFGN.js +94 -0
- package/dist/_chunks/define-cookie-C2IkoFGN.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
- package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
- package/dist/_chunks/format-CYBGxKtc.js +14 -0
- package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
- package/dist/_chunks/{interception-BOoWmLUA.js → interception-Dpn_UfAD.js} +171 -97
- package/dist/_chunks/interception-Dpn_UfAD.js.map +1 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
- package/dist/_chunks/request-context-qMsWgy9C.js +478 -0
- package/dist/_chunks/request-context-qMsWgy9C.js.map +1 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
- package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
- package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
- package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
- package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
- package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
- package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
- package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-Lo_s_pw2.js} +4 -4
- package/dist/_chunks/use-query-states-Lo_s_pw2.js.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 +135 -11
- 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 +56 -13
- package/dist/adapters/nitro.js.map +1 -1
- 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 +142 -80
- 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.d.ts +6 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +27 -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 +23 -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 +10 -4
- 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 +3 -3
- 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 +7 -21
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +210 -1017
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +18 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +890 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +63 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +90 -32
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -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 +13 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- 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 +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.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/top-loader.d.ts +5 -5
- package/dist/client/top-loader.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-params.d.ts +6 -4
- package/dist/client/use-params.d.ts.map +1 -1
- package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
- 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/codec.d.ts +33 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +2 -0
- package/dist/config-types.d.ts +227 -0
- package/dist/config-types.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 +35 -14
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.js +1 -83
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/index.d.ts +45 -192
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12357 -11925
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +3 -3
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.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-browser-logs.d.ts +84 -0
- package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
- package/dist/plugins/dev-error-overlay.d.ts +26 -1
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- package/dist/plugins/dev-logs.d.ts +1 -1
- package/dist/plugins/dev-logs.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 +19 -5
- 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 +4 -4
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts +2 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/index.d.ts +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -2
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +46 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/status-file-lint.d.ts +2 -1
- package/dist/routing/status-file-lint.d.ts.map +1 -1
- package/dist/routing/types.d.ts +16 -4
- package/dist/routing/types.d.ts.map +1 -1
- 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 +139 -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 +32 -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 +78 -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 +4 -0
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +25 -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.map +1 -1
- package/dist/server/actions.d.ts +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +32 -4
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +2 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/debug.d.ts +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-page-resolver.d.ts +52 -0
- package/dist/server/deny-page-resolver.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-holding-server.d.ts +52 -0
- package/dist/server/dev-holding-server.d.ts.map +1 -0
- package/dist/server/dev-warnings.d.ts +1 -21
- package/dist/server/dev-warnings.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -5
- 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 +4 -3
- 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-injectors.d.ts +51 -11
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +5 -43
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +37 -2798
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +46 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2883 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +25 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +113 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/page-deny-boundary.d.ts +31 -0
- package/dist/server/page-deny-boundary.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.d.ts +42 -10
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/primitives.d.ts +69 -18
- 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 +112 -43
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +27 -1
- 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 +9 -2
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/api-handler.d.ts +2 -2
- 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 +48 -5
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +8 -3
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- 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 +4 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.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-entry.d.ts +22 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -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/status-code-resolver.d.ts +1 -1
- 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 +4 -4
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +22 -19
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/types.d.ts +1 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.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/navigation-client.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +3 -2
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/directive-parser.d.ts +5 -2
- package/dist/utils/directive-parser.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 +56 -22
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +342 -28
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +52 -8
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -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 +31 -0
- package/src/cache/timber-cache.ts +24 -20
- package/src/cli.ts +16 -6
- package/src/client/browser-dev.ts +128 -1
- package/src/client/browser-entry/action-dispatch.ts +116 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +138 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -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 +48 -16
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +9 -7
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +19 -38
- package/src/client/internal.ts +57 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +329 -97
- package/src/client/nav-link-store.ts +47 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +31 -6
- package/src/client/navigation-root.tsx +342 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +299 -72
- package/src/client/rsc-fetch.ts +97 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/top-loader.tsx +16 -8
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-params.ts +7 -5
- package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
- package/src/client/use-query-states.ts +3 -3
- package/src/client/use-router.ts +1 -1
- package/src/codec.ts +49 -0
- package/src/config-types.ts +225 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +78 -25
- package/src/cookies/index.ts +8 -0
- package/src/fonts/css.ts +2 -1
- package/src/index.ts +295 -354
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +9 -3
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +3 -3
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-browser-logs.ts +288 -0
- package/src/plugins/dev-error-overlay.ts +70 -1
- package/src/plugins/dev-logs.ts +1 -1
- package/src/plugins/dev-server.ts +70 -9
- package/src/plugins/entries.ts +71 -10
- package/src/plugins/fonts.ts +168 -61
- package/src/plugins/mdx.ts +1 -1
- package/src/plugins/routing.ts +57 -17
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +135 -35
- package/src/plugins/static-build.ts +17 -11
- package/src/routing/codegen.ts +165 -105
- package/src/routing/index.ts +2 -0
- package/src/routing/scanner.ts +93 -23
- package/src/routing/segment-classify.ts +89 -0
- package/src/routing/status-file-lint.ts +3 -2
- package/src/routing/types.ts +17 -4
- 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} +57 -20
- package/src/search-params/define.ts +482 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +85 -0
- package/src/segment-params/define.ts +279 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +70 -29
- package/src/server/action-client.ts +46 -11
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +21 -4
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +34 -6
- package/src/server/build-manifest.ts +10 -4
- package/src/server/compress.ts +25 -7
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-page-resolver.ts +154 -0
- package/src/server/deny-renderer.ts +24 -38
- package/src/server/dev-holding-server.ts +185 -0
- package/src/server/dev-warnings.ts +4 -49
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +31 -15
- 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 +76 -0
- package/src/server/html-injectors.ts +280 -120
- package/src/server/index.ts +25 -177
- package/src/server/internal.ts +169 -0
- package/src/server/logger.ts +44 -36
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +509 -0
- package/src/server/page-deny-boundary.tsx +56 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline.ts +227 -62
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +293 -132
- package/src/server/route-element-builder.ts +283 -191
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +24 -20
- package/src/server/rsc-entry/api-handler.ts +15 -16
- package/src/server/rsc-entry/error-renderer.ts +300 -89
- package/src/server/rsc-entry/helpers.ts +134 -5
- package/src/server/rsc-entry/index.ts +200 -112
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +65 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +168 -38
- package/src/server/safe-load.ts +60 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +244 -229
- package/src/server/ssr-entry.ts +211 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +20 -9
- package/src/server/tree-builder.ts +92 -58
- package/src/server/types.ts +3 -6
- package/src/server/version-skew.ts +104 -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 +1 -1
- package/src/shims/navigation.ts +7 -2
- package/src/utils/directive-parser.ts +5 -2
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
- package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
- 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/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/cookies/index.js.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/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.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/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.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/transition-root.tsx +0 -166
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dynamic-transform.ts +0 -161
- 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/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
package/src/index.ts
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @timber-js/app — Root entry point (public API).
|
|
3
|
+
*
|
|
4
|
+
* User-facing exports: timber(), defineConfig(), TimberUserConfig, Routes.
|
|
5
|
+
*
|
|
6
|
+
* Internal helpers (PluginContext, resolveAppDir, loadTimberConfigFile,
|
|
7
|
+
* warnConfigConflicts, resolveClientJavascript) live in plugin-context.ts
|
|
8
|
+
* and are NOT re-exported here. Sub-plugins import them via relative paths.
|
|
9
|
+
*
|
|
10
|
+
* Design doc: 18-build-system.md §"Plugin Architecture"
|
|
11
|
+
*/
|
|
12
|
+
|
|
1
13
|
import type { Plugin, PluginOption } from 'vite';
|
|
2
|
-
import {
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { pathToFileURL } from 'node:url';
|
|
14
|
+
import { join, resolve } from 'node:path';
|
|
5
15
|
import { createRequire } from 'node:module';
|
|
6
|
-
import react from '@vitejs/plugin-react';
|
|
7
|
-
import { cacheTransformPlugin } from './plugins/cache-transform';
|
|
16
|
+
import react, { reactCompilerPreset } from '@vitejs/plugin-react';
|
|
8
17
|
import { timberContent } from './plugins/content';
|
|
9
18
|
import { timberDevServer } from './plugins/dev-server';
|
|
10
19
|
import { timberEntries } from './plugins/entries';
|
|
@@ -13,358 +22,258 @@ import { timberRouting } from './plugins/routing';
|
|
|
13
22
|
import { timberShims } from './plugins/shims';
|
|
14
23
|
import { timberFonts } from './plugins/fonts';
|
|
15
24
|
import { timberStaticBuild } from './plugins/static-build';
|
|
16
|
-
import { timberDynamicTransform } from './plugins/dynamic-transform';
|
|
17
25
|
import { timberServerActionExports } from './plugins/server-action-exports';
|
|
18
26
|
import { timberBuildManifest } from './plugins/build-manifest';
|
|
19
27
|
import { timberDevLogs } from './plugins/dev-logs';
|
|
28
|
+
import { timberDevBrowserLogs } from './plugins/dev-browser-logs';
|
|
20
29
|
import { timberReactProd } from './plugins/react-prod';
|
|
21
30
|
import { timberChunks } from './plugins/chunks';
|
|
31
|
+
import { clientChunkGroup } from './plugins/client-chunks';
|
|
22
32
|
import { timberServerBundle } from './plugins/server-bundle';
|
|
23
33
|
import { timberAdapterBuild } from './plugins/adapter-build';
|
|
24
34
|
import { timberBuildReport } from './plugins/build-report';
|
|
25
|
-
import
|
|
26
|
-
import
|
|
27
|
-
import
|
|
28
|
-
import {
|
|
35
|
+
import { createNoopTimer } from './utils/startup-timer';
|
|
36
|
+
import { resolveEncryptionKeyExpression, shouldEnableEncryption } from './server/action-encryption';
|
|
37
|
+
import { createHoldingServer } from './server/dev-holding-server.js';
|
|
38
|
+
import type { TimberUserConfig } from './config-types.js';
|
|
39
|
+
import type { PluginContext } from './plugin-context.js';
|
|
40
|
+
import {
|
|
41
|
+
createPluginContext,
|
|
42
|
+
loadTimberConfigFile,
|
|
43
|
+
mergeFileConfig,
|
|
44
|
+
resolveAppDir,
|
|
45
|
+
resolveClientJavascript,
|
|
46
|
+
resolveBuildDir,
|
|
47
|
+
DEFAULT_BUILD_DIR,
|
|
48
|
+
} from './plugin-context.js';
|
|
29
49
|
|
|
30
|
-
|
|
31
|
-
export interface ClientJavascriptConfig {
|
|
32
|
-
/** When true, no client JS bundles are emitted or referenced in HTML. */
|
|
33
|
-
disabled: boolean;
|
|
34
|
-
/**
|
|
35
|
-
* When `disabled` is true, still inject the Vite HMR client in dev mode
|
|
36
|
-
* so hot reloading works during development. Default: true.
|
|
37
|
-
*/
|
|
38
|
-
enableHMRInDev?: boolean;
|
|
39
|
-
}
|
|
50
|
+
// ── Public API ────────────────────────────────────────────────────────────
|
|
40
51
|
|
|
41
|
-
|
|
42
|
-
export interface ResolvedClientJavascript {
|
|
43
|
-
disabled: boolean;
|
|
44
|
-
enableHMRInDev: boolean;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface TimberUserConfig {
|
|
48
|
-
output?: 'server' | 'static';
|
|
49
|
-
/**
|
|
50
|
-
* Enable timber debug logging in production builds.
|
|
51
|
-
*
|
|
52
|
-
* When `true`, timber's own diagnostics (dev warnings, verbose logging)
|
|
53
|
-
* are active even in production mode. React stays in production mode —
|
|
54
|
-
* only timber's logs are affected.
|
|
55
|
-
*
|
|
56
|
-
* Can also be enabled at runtime via the `TIMBER_DEBUG` environment variable.
|
|
57
|
-
*
|
|
58
|
-
* Default: `false`.
|
|
59
|
-
*/
|
|
60
|
-
debug?: boolean;
|
|
61
|
-
/**
|
|
62
|
-
* Control client-side JavaScript output.
|
|
63
|
-
*
|
|
64
|
-
* Boolean shorthand:
|
|
65
|
-
* `clientJavascript: false` disables all client JS (equivalent to `{ disabled: true }`).
|
|
66
|
-
* `clientJavascript: true` enables client JS (the default).
|
|
67
|
-
*
|
|
68
|
-
* Object form:
|
|
69
|
-
* `clientJavascript: { disabled: true, enableHMRInDev: true }` disables client JS
|
|
70
|
-
* in production but preserves Vite HMR in dev mode.
|
|
71
|
-
*
|
|
72
|
-
* When `disabled` is true, `enableHMRInDev` defaults to `true`.
|
|
73
|
-
* Server-side JS still runs — this only affects what is sent to the browser.
|
|
74
|
-
*/
|
|
75
|
-
clientJavascript?: boolean | ClientJavascriptConfig;
|
|
76
|
-
adapter?: unknown;
|
|
77
|
-
cacheHandler?: unknown;
|
|
78
|
-
allowedOrigins?: string[];
|
|
79
|
-
csrf?: boolean;
|
|
80
|
-
limits?: {
|
|
81
|
-
actionBodySize?: string;
|
|
82
|
-
uploadBodySize?: string;
|
|
83
|
-
maxFields?: number;
|
|
84
|
-
};
|
|
85
|
-
pageExtensions?: string[];
|
|
86
|
-
/**
|
|
87
|
-
* Slow request threshold in milliseconds. Requests exceeding this emit
|
|
88
|
-
* a warning via the logger. Set to 0 to disable. Default: 3000.
|
|
89
|
-
*
|
|
90
|
-
* See design/17-logging.md §"slowRequestMs".
|
|
91
|
-
*/
|
|
92
|
-
slowRequestMs?: number;
|
|
93
|
-
/** Dev-mode options. These have no effect in production builds. */
|
|
94
|
-
dev?: {
|
|
95
|
-
/** Threshold in ms to highlight slow phases in dev logging output. Default: 200. */
|
|
96
|
-
slowPhaseMs?: number;
|
|
97
|
-
};
|
|
98
|
-
/**
|
|
99
|
-
* Cookie signing configuration. See design/29-cookies.md §"Signed Cookies".
|
|
100
|
-
*
|
|
101
|
-
* Provide `secret` for a single key, or `secrets` (array) for key rotation.
|
|
102
|
-
* When `secrets` is used, index 0 is the signing key; all are tried for verification.
|
|
103
|
-
*/
|
|
104
|
-
cookies?: {
|
|
105
|
-
/** Single signing secret. Shorthand for `secrets: [secret]`. */
|
|
106
|
-
secret?: string;
|
|
107
|
-
/** Array of signing secrets for key rotation. Index 0 signs; all verify. */
|
|
108
|
-
secrets?: string[];
|
|
109
|
-
};
|
|
110
|
-
/**
|
|
111
|
-
* Override the app directory location. By default, timber auto-detects
|
|
112
|
-
* `app/` at the project root, falling back to `src/app/`.
|
|
113
|
-
*
|
|
114
|
-
* Set this to a relative path from the project root (e.g. `'src/app'`)
|
|
115
|
-
* to use a custom location.
|
|
116
|
-
*/
|
|
117
|
-
appDir?: string;
|
|
118
|
-
/** MDX compilation options passed to @mdx-js/rollup. See design/20-content-collections.md. */
|
|
119
|
-
mdx?: {
|
|
120
|
-
remarkPlugins?: unknown[];
|
|
121
|
-
rehypePlugins?: unknown[];
|
|
122
|
-
recmaPlugins?: unknown[];
|
|
123
|
-
remarkRehypeOptions?: Record<string, unknown>;
|
|
124
|
-
};
|
|
125
|
-
/**
|
|
126
|
-
* Built-in top-loader progress bar for client navigations.
|
|
127
|
-
* Shows an animated bar at the top of the viewport during RSC navigations.
|
|
128
|
-
* Enabled by default — set `enabled: false` to opt out.
|
|
129
|
-
*
|
|
130
|
-
* Users who want a fully custom progress indicator should disable this
|
|
131
|
-
* and use `useNavigationPending()` directly.
|
|
132
|
-
*
|
|
133
|
-
* See LOCAL-336 for design decisions.
|
|
134
|
-
*/
|
|
135
|
-
topLoader?: {
|
|
136
|
-
/** Whether the top-loader is enabled. Default: true. */
|
|
137
|
-
enabled?: boolean;
|
|
138
|
-
/** Bar color. Default: '#2299DD'. */
|
|
139
|
-
color?: string;
|
|
140
|
-
/** Bar height in pixels. Default: 3. */
|
|
141
|
-
height?: number;
|
|
142
|
-
/** Show subtle glow/shadow effect. Default: true. */
|
|
143
|
-
shadow?: boolean;
|
|
144
|
-
/** Delay in ms before showing the bar (avoids flash on fast navs). Default: 0. */
|
|
145
|
-
delay?: number;
|
|
146
|
-
/** CSS z-index. Default: 1600. */
|
|
147
|
-
zIndex?: number;
|
|
148
|
-
};
|
|
149
|
-
/**
|
|
150
|
-
* Response-level caching and deduplication.
|
|
151
|
-
*
|
|
152
|
-
* When enabled, concurrent requests to the same URL share a single render
|
|
153
|
-
* (singleflight), and recently rendered responses are reused from a short-TTL
|
|
154
|
-
* LRU cache without re-executing the RSC-to-SSR pipeline.
|
|
155
|
-
*
|
|
156
|
-
* Set to `false` to disable entirely. Default: enabled with sensible defaults.
|
|
157
|
-
*
|
|
158
|
-
* See design/31-benchmarking.md for performance context.
|
|
159
|
-
*/
|
|
160
|
-
responseCache?:
|
|
161
|
-
| false
|
|
162
|
-
| {
|
|
163
|
-
/** Maximum number of entries in the LRU cache. Default: 150. */
|
|
164
|
-
maxSize?: number;
|
|
165
|
-
/** TTL for cached entries in milliseconds. Default: 5000 (5s). */
|
|
166
|
-
ttlMs?: number;
|
|
167
|
-
/**
|
|
168
|
-
* When true (default), requests with Cookie or Authorization headers
|
|
169
|
-
* bypass the cache entirely. This prevents sharing user-specific
|
|
170
|
-
* responses across requests.
|
|
171
|
-
*
|
|
172
|
-
* Set to false to cache all responses regardless of auth state.
|
|
173
|
-
* Only do this if your pages are truly public and don't vary by user.
|
|
174
|
-
*/
|
|
175
|
-
publicOnly?: boolean;
|
|
176
|
-
};
|
|
177
|
-
}
|
|
52
|
+
export type { TimberUserConfig } from './config-types.js';
|
|
178
53
|
|
|
179
54
|
/**
|
|
180
|
-
*
|
|
55
|
+
* Route map interface — augmented by the generated timber-routes.d.ts.
|
|
56
|
+
*
|
|
57
|
+
* Each key is a route path pattern. Values have:
|
|
58
|
+
* segmentParams: shape of URL segment params (e.g. { id: string })
|
|
59
|
+
* searchParams: parsed type from search-params.ts, or {} if none
|
|
60
|
+
*
|
|
61
|
+
* This interface is empty by default and populated via codegen.
|
|
62
|
+
* See design/09-typescript.md §"Typed Routes".
|
|
181
63
|
*/
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
if (typeof config.clientJavascript === 'boolean') {
|
|
185
|
-
// `clientJavascript: false` → disabled
|
|
186
|
-
// `clientJavascript: true` → enabled (default)
|
|
187
|
-
return {
|
|
188
|
-
disabled: !config.clientJavascript,
|
|
189
|
-
enableHMRInDev: !config.clientJavascript, // default true when disabled
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
// Object form
|
|
193
|
-
return {
|
|
194
|
-
disabled: config.clientJavascript.disabled,
|
|
195
|
-
enableHMRInDev: config.clientJavascript.enableHMRInDev ?? config.clientJavascript.disabled,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Default: client JS enabled
|
|
200
|
-
return { disabled: false, enableHMRInDev: false };
|
|
201
|
-
}
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
65
|
+
export interface Routes {}
|
|
202
66
|
|
|
203
67
|
/**
|
|
204
|
-
*
|
|
68
|
+
* Type-safe helper for timber.config.ts files.
|
|
69
|
+
*
|
|
70
|
+
* A pass-through identity function that provides autocomplete and
|
|
71
|
+
* type checking for timber configuration. No runtime validation —
|
|
72
|
+
* purely a DX convenience (same pattern as Vite's defineConfig).
|
|
205
73
|
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* // timber.config.ts
|
|
77
|
+
* import { defineConfig } from '@timber-js/app';
|
|
78
|
+
*
|
|
79
|
+
* export default defineConfig({
|
|
80
|
+
* output: 'server',
|
|
81
|
+
* pageExtensions: ['tsx', 'ts', 'mdx'],
|
|
82
|
+
* });
|
|
83
|
+
* ```
|
|
209
84
|
*/
|
|
210
|
-
export
|
|
211
|
-
config
|
|
212
|
-
/** Resolved client JavaScript configuration */
|
|
213
|
-
clientJavascript: ResolvedClientJavascript;
|
|
214
|
-
/** The scanned route tree (populated by timber-routing, consumed by timber-entries) */
|
|
215
|
-
routeTree: RouteTree | null;
|
|
216
|
-
/** Absolute path to the app/ directory */
|
|
217
|
-
appDir: string;
|
|
218
|
-
/** Absolute path to the project root */
|
|
219
|
-
root: string;
|
|
220
|
-
/** Whether the dev server is running (set by timber-root-sync in configResolved) */
|
|
221
|
-
dev: boolean;
|
|
222
|
-
/** CSS build manifest (populated by adapter after client build, null in dev) */
|
|
223
|
-
buildManifest: BuildManifest | null;
|
|
224
|
-
/** Startup timer for profiling cold start phases (active in dev, no-op in prod) */
|
|
225
|
-
timer: StartupTimer;
|
|
226
|
-
/** URL path to font CSS file, set by timber-fonts when fonts are registered */
|
|
227
|
-
fontCssUrl?: string;
|
|
85
|
+
export function defineConfig(config: TimberUserConfig): TimberUserConfig {
|
|
86
|
+
return config;
|
|
228
87
|
}
|
|
229
88
|
|
|
89
|
+
// ── Private helpers ───────────────────────────────────────────────────────
|
|
90
|
+
|
|
230
91
|
/**
|
|
231
|
-
* Resolve the
|
|
232
|
-
* 1. Explicit `configAppDir` from timber.config.ts
|
|
233
|
-
* 2. `<root>/app`
|
|
234
|
-
* 3. `<root>/src/app`
|
|
92
|
+
* Resolve the React Compiler plugin via @rolldown/plugin-babel.
|
|
235
93
|
*
|
|
236
|
-
*
|
|
94
|
+
* Uses the `reactCompilerPreset` from @vitejs/plugin-react, which:
|
|
95
|
+
* - Uses Babel ONLY for the compiler pass (OXC handles JSX)
|
|
96
|
+
* - Automatically scopes to client environment via applyToEnvironmentHook
|
|
97
|
+
* - Uses react/compiler-runtime built into React 19
|
|
98
|
+
*
|
|
99
|
+
* @rolldown/plugin-babel and babel-plugin-react-compiler are optional peer deps.
|
|
100
|
+
* If either is missing, require() fails with a clear error message.
|
|
237
101
|
*/
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
102
|
+
function resolveReactCompilerPlugin(
|
|
103
|
+
config: true | { compilationMode?: string; target?: string },
|
|
104
|
+
req: NodeRequire
|
|
105
|
+
): PluginOption {
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
let babel: any;
|
|
108
|
+
try {
|
|
109
|
+
babel = req('@rolldown/plugin-babel');
|
|
110
|
+
} catch {
|
|
111
|
+
throw new Error(
|
|
112
|
+
'[timber] reactCompiler requires @rolldown/plugin-babel. ' +
|
|
113
|
+
'Install it: pnpm add -D @rolldown/plugin-babel babel-plugin-react-compiler'
|
|
114
|
+
);
|
|
245
115
|
}
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
if (existsSync(srcApp)) return srcApp;
|
|
252
|
-
|
|
253
|
-
throw new Error(
|
|
254
|
-
`[timber] Could not find app directory. Expected "app/" or "src/app/" in ${root}. ` +
|
|
255
|
-
`You can set appDir in timber.config.ts to specify a custom location.`
|
|
256
|
-
);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
function createPluginContext(config?: TimberUserConfig, root?: string): PluginContext {
|
|
260
|
-
const projectRoot = root ?? process.cwd();
|
|
261
|
-
const resolvedConfig: TimberUserConfig = { output: 'server', ...config };
|
|
262
|
-
// Timer starts as active — swapped to noop in configResolved for production builds
|
|
263
|
-
return {
|
|
264
|
-
config: resolvedConfig,
|
|
265
|
-
clientJavascript: resolveClientJavascript(resolvedConfig),
|
|
266
|
-
routeTree: null,
|
|
267
|
-
appDir: join(projectRoot, 'app'),
|
|
268
|
-
root: projectRoot,
|
|
269
|
-
dev: false,
|
|
270
|
-
buildManifest: null,
|
|
271
|
-
timer: createStartupTimer(),
|
|
272
|
-
};
|
|
116
|
+
const options = typeof config === 'object' ? config : {};
|
|
117
|
+
const babelPlugin = babel.default ?? babel;
|
|
118
|
+
return babelPlugin({
|
|
119
|
+
presets: [reactCompilerPreset(options as Parameters<typeof reactCompilerPreset>[0])],
|
|
120
|
+
}) as PluginOption;
|
|
273
121
|
}
|
|
274
122
|
|
|
275
123
|
/**
|
|
276
|
-
*
|
|
277
|
-
*
|
|
124
|
+
* Build the options object for @vitejs/plugin-rsc.
|
|
125
|
+
*
|
|
126
|
+
* Uses a getter for `enableActionEncryption` so the RSC plugin reads
|
|
127
|
+
* the value lazily — after ctx.dev is set in configResolved. This lets
|
|
128
|
+
* `actionEncryption.disableInDev` work correctly even though the RSC
|
|
129
|
+
* plugin is created before Vite resolves the command.
|
|
278
130
|
*/
|
|
279
|
-
|
|
280
|
-
|
|
131
|
+
function createRscOptions(
|
|
132
|
+
ctx: PluginContext,
|
|
133
|
+
encryptionKeyExpr: string | undefined
|
|
134
|
+
): Record<string, unknown> {
|
|
135
|
+
const options: Record<string, unknown> = {
|
|
136
|
+
serverHandler: false,
|
|
137
|
+
customClientEntry: true,
|
|
138
|
+
entries: {
|
|
139
|
+
rsc: 'virtual:timber-rsc-entry',
|
|
140
|
+
ssr: 'virtual:timber-ssr-entry',
|
|
141
|
+
client: 'virtual:timber-browser-entry',
|
|
142
|
+
},
|
|
143
|
+
// Group client references by layout boundary to balance route-scoped code
|
|
144
|
+
// splitting with HTTP request count. A constant group name ('client-refs')
|
|
145
|
+
// would collapse all routes into one chunk — any page downloads every
|
|
146
|
+
// client component. Per-serverChunk grouping creates many sub-500B files.
|
|
147
|
+
// Layout-boundary grouping is the middle ground: components under the same
|
|
148
|
+
// layout segment share a chunk. See design/27-chunking-strategy.md, TIM-440, TIM-499.
|
|
149
|
+
clientChunks: (meta: { id: string; normalizedId: string; serverChunk: string }) =>
|
|
150
|
+
clientChunkGroup(meta, ctx.appDir),
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Bound args encryption — AES-256-GCM authenticated encryption for
|
|
154
|
+
// closure variables in 'use server' functions. Always on in production,
|
|
155
|
+
// configurable in dev. See design/08-forms-and-actions.md §"Bound Args Encryption".
|
|
156
|
+
//
|
|
157
|
+
// Uses a getter so the RSC plugin reads the value lazily in its transform
|
|
158
|
+
// hooks, after ctx.dev is set in configResolved. This lets disableInDev
|
|
159
|
+
// work correctly — ctx.dev is false at construction time but true during
|
|
160
|
+
// dev server transforms.
|
|
161
|
+
Object.defineProperty(options, 'enableActionEncryption', {
|
|
162
|
+
get() {
|
|
163
|
+
return shouldEnableEncryption(ctx.dev, ctx.config.actionEncryption);
|
|
164
|
+
},
|
|
165
|
+
enumerable: true,
|
|
166
|
+
});
|
|
281
167
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
return (mod.default ?? mod) as TimberUserConfig;
|
|
287
|
-
}
|
|
168
|
+
// When TIMBER_ACTIONS_ENCRYPTION_KEY is set, pass it as a runtime expression
|
|
169
|
+
// so the RSC plugin uses it instead of auto-generating a per-build key.
|
|
170
|
+
if (encryptionKeyExpr) {
|
|
171
|
+
options.defineEncryptionKey = encryptionKeyExpr;
|
|
288
172
|
}
|
|
289
|
-
|
|
173
|
+
|
|
174
|
+
return options;
|
|
290
175
|
}
|
|
291
176
|
|
|
177
|
+
// NOTE: 'use cache' directive transform removed — future feature pending design doc.
|
|
178
|
+
// The timber.cache() API (createCache) remains available for explicit caching.
|
|
179
|
+
// See design/06-caching.md.
|
|
180
|
+
|
|
181
|
+
// ── Main plugin factory ──────────────────────────────────────────────────
|
|
182
|
+
|
|
292
183
|
/**
|
|
293
|
-
*
|
|
294
|
-
*
|
|
295
|
-
*
|
|
184
|
+
* Create the timber Vite plugin array.
|
|
185
|
+
*
|
|
186
|
+
* Loads timber.config.ts and all dependencies synchronously before
|
|
187
|
+
* constructing the plugin array. This ensures ALL plugins — including
|
|
188
|
+
* the RSC plugin and React Compiler — see the fully merged config
|
|
189
|
+
* (inline + file-based). No async, no deferred config, no stale reads.
|
|
296
190
|
*
|
|
297
|
-
*
|
|
191
|
+
* Requires Node >= 22.12 for synchronous require() of ESM modules
|
|
192
|
+
* (@vitejs/plugin-rsc is ESM-only).
|
|
193
|
+
*
|
|
194
|
+
* Previous versions used async loading and deferred config merging,
|
|
195
|
+
* causing file-based config for reactCompiler, actionEncryption, and
|
|
196
|
+
* output mode to be silently ignored. See TIM-451.
|
|
298
197
|
*/
|
|
299
|
-
export function
|
|
300
|
-
|
|
301
|
-
fileConfig: TimberUserConfig
|
|
302
|
-
): string[] {
|
|
303
|
-
const conflicts: string[] = [];
|
|
304
|
-
for (const key of Object.keys(fileConfig) as (keyof TimberUserConfig)[]) {
|
|
305
|
-
if (key === 'output') continue;
|
|
306
|
-
if (key in inline && inline[key] !== undefined) {
|
|
307
|
-
conflicts.push(key);
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
if (conflicts.length > 0) {
|
|
311
|
-
console.warn(
|
|
312
|
-
`[timber] Config conflict: ${conflicts.map((k) => `"${k}"`).join(', ')} set in both ` +
|
|
313
|
-
`vite.config.ts (inline) and timber.config.ts. ` +
|
|
314
|
-
`Move all config to timber.config.ts to avoid confusion. ` +
|
|
315
|
-
`The inline value from vite.config.ts will be used.`
|
|
316
|
-
);
|
|
317
|
-
}
|
|
318
|
-
return conflicts;
|
|
319
|
-
}
|
|
198
|
+
export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
199
|
+
const ctx = createPluginContext(config);
|
|
320
200
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
const inline = ctx.config;
|
|
201
|
+
// Resolve dependencies from the consumer's project (process.cwd()),
|
|
202
|
+
// not from timber's own node_modules. This is critical for pnpm link:
|
|
203
|
+
// when linked, timber's node_modules has a separate vite instance, and
|
|
204
|
+
// the RSC plugin must use the same vite instance as the dev server.
|
|
205
|
+
const consumerRequire = createRequire(join(process.cwd(), 'package.json'));
|
|
327
206
|
|
|
328
|
-
//
|
|
329
|
-
|
|
207
|
+
// ── Step 1: Load @vitejs/plugin-rsc ─────────────────────────────────
|
|
208
|
+
// Synchronous require() works for ESM modules on Node 22.12+.
|
|
209
|
+
ctx.timer.start('rsc-plugin-import');
|
|
210
|
+
const rscMod = consumerRequire('@vitejs/plugin-rsc');
|
|
211
|
+
const vitePluginRsc = rscMod.default ?? rscMod;
|
|
212
|
+
ctx.timer.end('rsc-plugin-import');
|
|
330
213
|
|
|
331
|
-
//
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
...inline,
|
|
335
|
-
// Deep merge for nested objects where both exist
|
|
336
|
-
...(fileConfig.limits && inline.limits
|
|
337
|
-
? { limits: { ...fileConfig.limits, ...inline.limits } }
|
|
338
|
-
: {}),
|
|
339
|
-
...(fileConfig.dev && inline.dev ? { dev: { ...fileConfig.dev, ...inline.dev } } : {}),
|
|
340
|
-
...(fileConfig.mdx && inline.mdx ? { mdx: { ...fileConfig.mdx, ...inline.mdx } } : {}),
|
|
341
|
-
};
|
|
342
|
-
}
|
|
214
|
+
// ── Step 2: Compute config-dependent options ────────────────────────
|
|
215
|
+
// encryptionKeyExpr is env-based and doesn't depend on file config.
|
|
216
|
+
const encryptionKeyExpr = resolveEncryptionKeyExpression();
|
|
343
217
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
218
|
+
// ── Step 3: Pre-load file config for plugin resolution ──────────────
|
|
219
|
+
// Load timber.config.ts eagerly from process.cwd() so we can resolve
|
|
220
|
+
// plugins (like React Compiler) and add them to the top-level array.
|
|
221
|
+
// Vite's config() hook return type is Omit<UserConfig, 'plugins'> —
|
|
222
|
+
// plugins returned from config() are silently ignored. See TIM-632.
|
|
223
|
+
//
|
|
224
|
+
// The config() hook still loads from the correct Vite root (which may
|
|
225
|
+
// differ from cwd in monorepo setups — see TIM-498), but only for
|
|
226
|
+
// non-plugin config merging.
|
|
227
|
+
const earlyFileConfig = loadTimberConfigFile(process.cwd());
|
|
347
228
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
//
|
|
351
|
-
//
|
|
352
|
-
// Also loads timber.config.ts and merges it into ctx.config (inline config wins).
|
|
229
|
+
// ── Step 4: Build rootSync plugin ───────────────────────────────────
|
|
230
|
+
// rootSync loads timber.config.ts from Vite's resolved root and merges
|
|
231
|
+
// it into ctx.config. Plugin resolution is handled eagerly above — the
|
|
232
|
+
// config() hook must NOT return a `plugins` field (Vite ignores it).
|
|
353
233
|
const rootSync: Plugin = {
|
|
354
234
|
name: 'timber-root-sync',
|
|
355
|
-
|
|
356
|
-
// Load timber.config.ts
|
|
357
|
-
//
|
|
358
|
-
//
|
|
359
|
-
|
|
235
|
+
config(userConfig, { command }) {
|
|
236
|
+
// ── Load timber.config.ts from the correct root ───────────────
|
|
237
|
+
// Vite's `config` hook fires before `configResolved`. The user's
|
|
238
|
+
// `root` option (if set) tells us where the project lives.
|
|
239
|
+
// `resolve()` mirrors Vite's own root resolution logic.
|
|
240
|
+
const viteRoot = resolve(userConfig.root ?? process.cwd());
|
|
360
241
|
ctx.timer.start('config-load');
|
|
361
|
-
const fileConfig =
|
|
242
|
+
const fileConfig = loadTimberConfigFile(viteRoot);
|
|
362
243
|
if (fileConfig) {
|
|
363
244
|
mergeFileConfig(ctx, fileConfig);
|
|
364
245
|
ctx.clientJavascript = resolveClientJavascript(ctx.config);
|
|
365
246
|
}
|
|
247
|
+
// Apply defaults AFTER merge so file-based config isn't overridden
|
|
248
|
+
// by defaults that were baked into the inline config object.
|
|
249
|
+
ctx.config.output ??= 'server';
|
|
366
250
|
ctx.timer.end('config-load');
|
|
367
251
|
|
|
252
|
+
// ── Resolve build output directory ─────────────────────────
|
|
253
|
+
// Priority: timber.config.ts `buildDir` > Vite `build.outDir` > .timber/dist
|
|
254
|
+
// Set Vite's build.outDir so the RSC plugin and all environment
|
|
255
|
+
// builds write to the correct location.
|
|
256
|
+
const viteOutDir = userConfig.build?.outDir;
|
|
257
|
+
const timberBuildDir = ctx.config.buildDir;
|
|
258
|
+
const resolvedRoot = resolve(userConfig.root ?? process.cwd());
|
|
259
|
+
ctx.buildDir = resolveBuildDir(resolvedRoot, timberBuildDir, viteOutDir);
|
|
260
|
+
|
|
261
|
+
// Warn if the Vite root differs from cwd and the re-loaded config
|
|
262
|
+
// has reactCompiler but the early cwd-based load missed it. In this
|
|
263
|
+
// edge case the user must move reactCompiler to inline config.
|
|
264
|
+
if (viteRoot !== process.cwd()) {
|
|
265
|
+
const hasCompilerInReloaded = !config?.reactCompiler && ctx.config.reactCompiler;
|
|
266
|
+
const hadCompilerInEarly = !config?.reactCompiler && earlyFileConfig?.reactCompiler;
|
|
267
|
+
if (hasCompilerInReloaded && !hadCompilerInEarly) {
|
|
268
|
+
console.warn(
|
|
269
|
+
'[timber] reactCompiler is set in timber.config.ts but could not be ' +
|
|
270
|
+
'registered because the config file is in a non-cwd root directory. ' +
|
|
271
|
+
'Move reactCompiler to the inline timber() config in vite.config.ts, or ' +
|
|
272
|
+
'run vite from the project root directory.'
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
368
277
|
// Force production JSX transform for builds.
|
|
369
278
|
//
|
|
370
279
|
// Vite determines dev vs prod JSX via `isProduction`, which checks
|
|
@@ -378,8 +287,60 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
378
287
|
// We explicitly set `oxc.jsx.development: false` for builds so
|
|
379
288
|
// the client bundle always uses jsx/jsxs from react/jsx-runtime,
|
|
380
289
|
// regardless of the ambient NODE_ENV value.
|
|
290
|
+
// ── Start holding server for dev mode ───────────────────────
|
|
291
|
+
// Bind the port immediately so browsers see a loading page
|
|
292
|
+
// instead of ERR_CONNECTION_REFUSED during the ~6-8s startup.
|
|
293
|
+
// The holding server is closed in timber-dev-server's
|
|
294
|
+
// configureServer hook (the last plugin), right before Vite
|
|
295
|
+
// calls server.listen().
|
|
296
|
+
// See design/21-dev-server.md §"Startup Holding Server", TIM-665.
|
|
297
|
+
if (command === 'serve') {
|
|
298
|
+
const port = (userConfig.server?.port as number) ?? 5173;
|
|
299
|
+
try {
|
|
300
|
+
ctx.holdingServer = createHoldingServer();
|
|
301
|
+
// listen() is async but we fire-and-forget — the server
|
|
302
|
+
// starts binding immediately and will be ready well before
|
|
303
|
+
// any browser request arrives. We can't await here because
|
|
304
|
+
// config() must return synchronously.
|
|
305
|
+
ctx.holdingServer.listen(port).then(
|
|
306
|
+
(boundPort) => {
|
|
307
|
+
const url = `http://localhost:${boundPort}`;
|
|
308
|
+
console.log(
|
|
309
|
+
`\n \x1b[2m🪵 timber.js dev server starting at\x1b[0m \x1b[36m${url}\x1b[0m\n`
|
|
310
|
+
);
|
|
311
|
+
},
|
|
312
|
+
() => {
|
|
313
|
+
// Port already in use — skip gracefully.
|
|
314
|
+
ctx.holdingServer = null;
|
|
315
|
+
}
|
|
316
|
+
);
|
|
317
|
+
} catch {
|
|
318
|
+
ctx.holdingServer = null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Return the resolved buildDir as Vite's build.outDir so the RSC
|
|
323
|
+
// plugin and all environment builds write to the correct location.
|
|
324
|
+
// This is always set — either from timber config, Vite config, or default.
|
|
325
|
+
const buildOutDir = timberBuildDir
|
|
326
|
+
? timberBuildDir
|
|
327
|
+
: viteOutDir && viteOutDir !== 'dist'
|
|
328
|
+
? viteOutDir
|
|
329
|
+
: DEFAULT_BUILD_DIR;
|
|
330
|
+
|
|
331
|
+
// Set per-environment build.outDir so Vite's RSC plugin writes
|
|
332
|
+
// each environment to the correct subdirectory under our buildDir.
|
|
333
|
+
// Without this, the RSC plugin defaults to dist/<envName> instead
|
|
334
|
+
// of <buildOutDir>/<envName>.
|
|
335
|
+
const envOutDirs: Record<string, { build: { outDir: string } }> = {};
|
|
336
|
+
for (const envName of ['rsc', 'ssr', 'client']) {
|
|
337
|
+
envOutDirs[envName] = { build: { outDir: join(buildOutDir, envName) } };
|
|
338
|
+
}
|
|
339
|
+
|
|
381
340
|
if (command === 'build') {
|
|
382
341
|
return {
|
|
342
|
+
build: { outDir: buildOutDir },
|
|
343
|
+
environments: envOutDirs,
|
|
383
344
|
oxc: {
|
|
384
345
|
jsx: {
|
|
385
346
|
development: false,
|
|
@@ -387,11 +348,17 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
387
348
|
},
|
|
388
349
|
};
|
|
389
350
|
}
|
|
351
|
+
|
|
352
|
+
// Dev mode: set outDir so dev-time references are consistent
|
|
353
|
+
return { build: { outDir: buildOutDir }, environments: envOutDirs };
|
|
390
354
|
},
|
|
391
355
|
configResolved(resolved) {
|
|
392
356
|
ctx.root = resolved.root;
|
|
393
357
|
ctx.appDir = resolveAppDir(resolved.root, ctx.config.appDir);
|
|
394
358
|
ctx.dev = resolved.command === 'serve';
|
|
359
|
+
// Sync buildDir from Vite's resolved build.outDir. Vite keeps
|
|
360
|
+
// outDir as-is (may be relative), so resolve against root.
|
|
361
|
+
ctx.buildDir = resolve(resolved.root, resolved.build.outDir);
|
|
395
362
|
// In production builds, swap to a no-op timer to avoid overhead
|
|
396
363
|
if (!ctx.dev) {
|
|
397
364
|
ctx.timer = createNoopTimer();
|
|
@@ -401,17 +368,28 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
401
368
|
}
|
|
402
369
|
},
|
|
403
370
|
};
|
|
371
|
+
|
|
372
|
+
// ── Step 5: Resolve optional plugins ────────────────────────────────
|
|
373
|
+
// React Compiler — resolved eagerly from either inline or file config.
|
|
374
|
+
// Vite's config() hook return type is Omit<UserConfig, 'plugins'>, so
|
|
375
|
+
// plugins MUST be in the top-level array — returning them from config()
|
|
376
|
+
// silently drops them. See TIM-632.
|
|
377
|
+
//
|
|
378
|
+
// Inline config takes precedence. File config (from the early cwd-based
|
|
379
|
+
// load) is used when inline config doesn't set reactCompiler.
|
|
380
|
+
const reactCompilerPlugins: PluginOption[] = [];
|
|
381
|
+
const effectiveReactCompiler = config?.reactCompiler ?? earlyFileConfig?.reactCompiler;
|
|
382
|
+
if (effectiveReactCompiler) {
|
|
383
|
+
reactCompilerPlugins.push(resolveReactCompilerPlugin(effectiveReactCompiler, consumerRequire));
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// ── Step 6: Assemble plugin array ─────────────────────────────────────
|
|
404
387
|
// @vitejs/plugin-rsc handles:
|
|
405
388
|
// - RSC/SSR/client environment setup
|
|
406
389
|
// - "use client" directive → client reference proxy transformation
|
|
407
390
|
// - "use server" directive → server reference transformation
|
|
408
391
|
// - Client reference tracking and module map generation
|
|
409
392
|
//
|
|
410
|
-
// Loaded via dynamic import() because @vitejs/plugin-rsc is ESM-only.
|
|
411
|
-
// Vite's config loader uses esbuild to transpile to CJS, which breaks
|
|
412
|
-
// static imports of ESM-only packages. The dynamic import() is preserved
|
|
413
|
-
// by esbuild and runs natively in ESM at runtime.
|
|
414
|
-
//
|
|
415
393
|
// serverHandler: false — timber has its own dev server (timber-dev-server)
|
|
416
394
|
// entries — tells the RSC plugin about timber's virtual entry modules so
|
|
417
395
|
// it correctly wires up the browser entry (needed for React Fast Refresh
|
|
@@ -424,30 +402,6 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
424
402
|
// We do NOT set customBuildApp — the RSC plugin's orchestration is correct
|
|
425
403
|
// and handles bundle ordering, asset manifest generation, and environment
|
|
426
404
|
// imports manifest. See @vitejs/plugin-rsc's buildApp implementation.
|
|
427
|
-
// Resolve @vitejs/plugin-rsc from the consumer's project (process.cwd()),
|
|
428
|
-
// not from timber's own node_modules. This is critical for pnpm link:
|
|
429
|
-
// when linked, timber's node_modules has a separate vite instance, and
|
|
430
|
-
// the RSC plugin must use the same vite instance as the dev server.
|
|
431
|
-
const consumerRequire = createRequire(join(process.cwd(), 'package.json'));
|
|
432
|
-
const rscPluginPath = consumerRequire.resolve('@vitejs/plugin-rsc');
|
|
433
|
-
ctx.timer.start('rsc-plugin-import');
|
|
434
|
-
const rscPluginsPromise = import(pathToFileURL(rscPluginPath).href).then(
|
|
435
|
-
({ default: vitePluginRsc }) => {
|
|
436
|
-
ctx.timer.end('rsc-plugin-import');
|
|
437
|
-
return vitePluginRsc({
|
|
438
|
-
serverHandler: false,
|
|
439
|
-
customClientEntry: true,
|
|
440
|
-
entries: {
|
|
441
|
-
rsc: 'virtual:timber-rsc-entry',
|
|
442
|
-
ssr: 'virtual:timber-ssr-entry',
|
|
443
|
-
client: 'virtual:timber-browser-entry',
|
|
444
|
-
},
|
|
445
|
-
// No custom clientChunks — Rolldown handles natural code splitting.
|
|
446
|
-
// See design/27-chunking-strategy.md and LOCAL-337.
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
);
|
|
450
|
-
|
|
451
405
|
return [
|
|
452
406
|
rootSync,
|
|
453
407
|
timberReactProd(),
|
|
@@ -456,15 +410,14 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
456
410
|
// following Vinext's convention — the RSC plugin's virtual browser entry
|
|
457
411
|
// coordinates with plugin-react via __vite_plugin_react_preamble_installed__.
|
|
458
412
|
react(),
|
|
413
|
+
...reactCompilerPlugins,
|
|
459
414
|
timberServerActionExports(),
|
|
460
|
-
|
|
415
|
+
vitePluginRsc(createRscOptions(ctx, encryptionKeyExpr)),
|
|
461
416
|
timberShims(ctx),
|
|
462
417
|
timberRouting(ctx),
|
|
463
418
|
timberEntries(ctx),
|
|
464
419
|
timberBuildManifest(ctx),
|
|
465
|
-
timberCache(ctx),
|
|
466
420
|
timberStaticBuild(ctx),
|
|
467
|
-
timberDynamicTransform(ctx),
|
|
468
421
|
timberFonts(ctx),
|
|
469
422
|
timberMdx(ctx),
|
|
470
423
|
timberContent(ctx),
|
|
@@ -473,21 +426,9 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
473
426
|
timberBuildReport(ctx), // Post-build: route table with bundle sizes
|
|
474
427
|
timberAdapterBuild(ctx), // Post-build: invoke adapter.buildOutput()
|
|
475
428
|
timberDevLogs(ctx), // Dev-only: forward server console.* to browser console
|
|
429
|
+
timberDevBrowserLogs(ctx), // Dev-only: forward browser console.* to server terminal
|
|
476
430
|
timberDevServer(ctx), // Must be last — configureServer post-hook runs after all watchers
|
|
477
431
|
];
|
|
478
432
|
}
|
|
479
433
|
|
|
480
|
-
/**
|
|
481
|
-
* Route map interface — augmented by the generated timber-routes.d.ts.
|
|
482
|
-
*
|
|
483
|
-
* Each key is a route path pattern. Values have:
|
|
484
|
-
* params: shape of URL params (e.g. { id: string })
|
|
485
|
-
* searchParams: parsed type from search-params.ts, or {} if none
|
|
486
|
-
*
|
|
487
|
-
* This interface is empty by default and populated via codegen.
|
|
488
|
-
* See design/09-typescript.md §"Typed Routes".
|
|
489
|
-
*/
|
|
490
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
491
|
-
export interface Routes {}
|
|
492
|
-
|
|
493
434
|
export default timber;
|