@timber-js/app 0.2.0-alpha.9 → 0.2.0-alpha.91
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-DLnUaR65.js +421 -0
- package/dist/_chunks/actions-DLnUaR65.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-BYIpzuS7.js +39 -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-Itxvcd7F.js +199 -0
- package/dist/_chunks/define-Itxvcd7F.js.map +1 -0
- package/dist/_chunks/define-cookie-BowvzoP0.js +94 -0
- package/dist/_chunks/define-cookie-BowvzoP0.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-ErnB33JX.js} +301 -133
- package/dist/_chunks/interception-ErnB33JX.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-CK5tZqIP.js +478 -0
- package/dist/_chunks/request-context-CK5tZqIP.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-BiV5GJgm.js} +7 -4
- package/dist/_chunks/use-query-states-BiV5GJgm.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 +6 -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 +9 -21
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +229 -1018
- 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 +62 -55
- 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 +266 -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 +35 -14
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.js +1 -83
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +138 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +72 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +45 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +59 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +45 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4294 -2453
- 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-404-page.d.ts +56 -0
- package/dist/plugins/dev-404-page.d.ts.map +1 -0
- 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 +49 -9
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- package/dist/plugins/dev-error-page.d.ts +58 -0
- package/dist/plugins/dev-error-page.d.ts.map +1 -0
- 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/dev-terminal-error.d.ts +28 -0
- package/dist/plugins/dev-terminal-error.d.ts.map +1 -0
- 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 +4 -4
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +38 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +36 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +2 -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 +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -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.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 +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 +7 -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-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.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 +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-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 +195 -2800
- 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 +2900 -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 +52 -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 +16 -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 +20 -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 +14 -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/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-entry.d.ts +23 -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 +51 -16
- 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 +143 -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 +14 -7
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +65 -38
- package/src/client/internal.ts +57 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +342 -113
- 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 +18 -6
- 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 +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/codec.ts +49 -0
- package/src/config-types.ts +264 -0
- package/src/config-validation.ts +303 -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/bundle.ts +142 -0
- package/src/fonts/css.ts +2 -1
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/pipeline.ts +275 -0
- package/src/fonts/transform.ts +353 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +159 -0
- package/src/index.ts +314 -355
- 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-404-page.ts +418 -0
- package/src/plugins/dev-browser-logs.ts +288 -0
- package/src/plugins/dev-error-overlay.ts +286 -42
- package/src/plugins/dev-error-page.ts +536 -0
- package/src/plugins/dev-logs.ts +1 -1
- package/src/plugins/dev-server.ts +146 -19
- package/src/plugins/dev-terminal-error.ts +217 -0
- package/src/plugins/entries.ts +111 -10
- package/src/plugins/fonts.ts +133 -638
- package/src/plugins/mdx.ts +1 -1
- package/src/plugins/routing.ts +213 -31
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +17 -11
- package/src/routing/codegen-shared.ts +74 -0
- package/src/routing/codegen-types.ts +37 -0
- package/src/routing/codegen.ts +112 -173
- package/src/routing/convention-lint.ts +356 -0
- package/src/routing/index.ts +2 -0
- package/src/routing/link-codegen.ts +262 -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 +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +53 -6
- 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-source-map.ts +31 -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 +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 +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 +261 -66
- 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 +31 -20
- package/src/server/rsc-entry/api-handler.ts +15 -16
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +134 -5
- package/src/server/rsc-entry/index.ts +304 -111
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +81 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +171 -38
- 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 +126 -0
- package/src/server/slot-resolver.ts +244 -229
- package/src/server/ssr-entry.ts +215 -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/plugins/mdx.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import type { Plugin } from 'vite';
|
|
12
12
|
import { existsSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
|
-
import type { PluginContext } from '
|
|
14
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
15
15
|
|
|
16
16
|
const MDX_EXTENSIONS = ['mdx', 'md'];
|
|
17
17
|
|
package/src/plugins/routing.ts
CHANGED
|
@@ -10,25 +10,46 @@
|
|
|
10
10
|
|
|
11
11
|
import type { Plugin, ViteDevServer } from 'vite';
|
|
12
12
|
import { writeFile, mkdir } from 'node:fs/promises';
|
|
13
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
13
14
|
import { join } from 'node:path';
|
|
14
|
-
import { scanRoutes } from '
|
|
15
|
-
import { generateRouteMap } from '
|
|
16
|
-
import { collectInterceptionRewrites } from '
|
|
15
|
+
import { scanRoutes } from '../routing/scanner.js';
|
|
16
|
+
import { generateRouteMap } from '../routing/codegen.js';
|
|
17
|
+
import { collectInterceptionRewrites } from '../routing/interception.js';
|
|
17
18
|
import {
|
|
18
19
|
lintStatusFileDirectives,
|
|
19
20
|
formatStatusFileLintWarnings,
|
|
20
|
-
} from '
|
|
21
|
-
import
|
|
22
|
-
|
|
21
|
+
} from '../routing/status-file-lint.js';
|
|
22
|
+
import {
|
|
23
|
+
lintConventions,
|
|
24
|
+
checkAppDirExists,
|
|
25
|
+
formatConventionWarnings,
|
|
26
|
+
} from '../routing/convention-lint.js';
|
|
27
|
+
import type { RouteTree, SegmentNode, RouteFile } from '../routing/types.js';
|
|
28
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
23
29
|
|
|
24
30
|
const VIRTUAL_MODULE_ID = 'virtual:timber-route-manifest';
|
|
25
31
|
const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_MODULE_ID}`;
|
|
26
32
|
|
|
33
|
+
// TIM-830: Search-params registry virtual module.
|
|
34
|
+
//
|
|
35
|
+
// Statically imports the `searchParams` named export from every page
|
|
36
|
+
// that exports one, and registers each definition into the shared
|
|
37
|
+
// search-params registry keyed by the un-interpolated route pattern
|
|
38
|
+
// (e.g. '/products/[id]'). This lets `<Link>` serialize flat
|
|
39
|
+
// `Partial<T>` values at runtime without callers importing the
|
|
40
|
+
// definition at the call site.
|
|
41
|
+
//
|
|
42
|
+
// The imports are STATIC (`import { searchParams as r0 } from '...'`)
|
|
43
|
+
// so Vite/Rolldown tree-shakes each page's component body out of the
|
|
44
|
+
// registry chunk — only the `searchParams` named export is pulled in.
|
|
45
|
+
const SEARCH_PARAMS_REGISTRY_ID = 'virtual:timber-search-params-registry';
|
|
46
|
+
const RESOLVED_SEARCH_PARAMS_REGISTRY_ID = `\0${SEARCH_PARAMS_REGISTRY_ID}`;
|
|
47
|
+
|
|
27
48
|
/**
|
|
28
49
|
* File convention names we track for changes that require manifest regeneration.
|
|
29
50
|
*/
|
|
30
51
|
const ROUTE_FILE_PATTERNS =
|
|
31
|
-
/\/(page|layout|middleware|access|route|error|default|denied|
|
|
52
|
+
/\/(page|layout|middleware|access|route|error|global-error|default|denied|params|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|twitter-image|apple-icon)\./;
|
|
32
53
|
|
|
33
54
|
/**
|
|
34
55
|
* Create the timber-routing Vite plugin.
|
|
@@ -83,6 +104,24 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
83
104
|
const warnedFiles = new Set<string>();
|
|
84
105
|
|
|
85
106
|
function rescan(): void {
|
|
107
|
+
// Check app/ directory exists before scanning
|
|
108
|
+
const appDirWarning = checkAppDirExists(ctx.appDir);
|
|
109
|
+
if (appDirWarning) {
|
|
110
|
+
const formatted = formatConventionWarnings([appDirWarning]);
|
|
111
|
+
if (formatted) process.stderr.write(`${formatted}\n`);
|
|
112
|
+
// Still create an empty tree so the rest of the pipeline doesn't crash
|
|
113
|
+
ctx.routeTree = {
|
|
114
|
+
root: {
|
|
115
|
+
segmentName: '',
|
|
116
|
+
segmentType: 'static',
|
|
117
|
+
urlPath: '/',
|
|
118
|
+
children: [],
|
|
119
|
+
slots: new Map(),
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
86
125
|
ctx.timer.start('route-scan');
|
|
87
126
|
ctx.routeTree = scanRoutes(ctx.appDir, {
|
|
88
127
|
pageExtensions: ctx.config.pageExtensions,
|
|
@@ -91,11 +130,20 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
91
130
|
writeCodegen(ctx);
|
|
92
131
|
|
|
93
132
|
// Lint status files for missing 'use client' directive
|
|
94
|
-
const
|
|
95
|
-
const
|
|
96
|
-
if (
|
|
97
|
-
for (const w of
|
|
98
|
-
console.warn(formatStatusFileLintWarnings(
|
|
133
|
+
const statusWarnings = lintStatusFileDirectives(ctx.routeTree);
|
|
134
|
+
const newStatusWarnings = statusWarnings.filter((w) => !warnedFiles.has(w.filePath));
|
|
135
|
+
if (newStatusWarnings.length > 0) {
|
|
136
|
+
for (const w of newStatusWarnings) warnedFiles.add(w.filePath);
|
|
137
|
+
console.warn(formatStatusFileLintWarnings(newStatusWarnings));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Lint conventions (empty app, missing methods, missing root layout)
|
|
141
|
+
const conventionWarnings = lintConventions(ctx.routeTree, ctx.appDir);
|
|
142
|
+
const newConventionWarnings = conventionWarnings.filter((w) => !warnedFiles.has(w.id));
|
|
143
|
+
if (newConventionWarnings.length > 0) {
|
|
144
|
+
for (const w of newConventionWarnings) warnedFiles.add(w.id);
|
|
145
|
+
const formatted = formatConventionWarnings(newConventionWarnings);
|
|
146
|
+
if (formatted) process.stderr.write(`${formatted}\n`);
|
|
99
147
|
}
|
|
100
148
|
}
|
|
101
149
|
|
|
@@ -123,6 +171,14 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
123
171
|
return RESOLVED_VIRTUAL_ID;
|
|
124
172
|
}
|
|
125
173
|
|
|
174
|
+
// TIM-830: Search-params registry virtual module
|
|
175
|
+
if (
|
|
176
|
+
cleanId === SEARCH_PARAMS_REGISTRY_ID ||
|
|
177
|
+
cleanId.endsWith(`/${SEARCH_PARAMS_REGISTRY_ID}`)
|
|
178
|
+
) {
|
|
179
|
+
return RESOLVED_SEARCH_PARAMS_REGISTRY_ID;
|
|
180
|
+
}
|
|
181
|
+
|
|
126
182
|
return null;
|
|
127
183
|
},
|
|
128
184
|
|
|
@@ -133,14 +189,22 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
133
189
|
* with absolute import paths for all file references.
|
|
134
190
|
*/
|
|
135
191
|
load(id: string) {
|
|
136
|
-
if (id
|
|
192
|
+
if (id === RESOLVED_VIRTUAL_ID) {
|
|
193
|
+
// If routeTree hasn't been built yet (shouldn't happen), scan now
|
|
194
|
+
if (!ctx.routeTree) {
|
|
195
|
+
rescan();
|
|
196
|
+
}
|
|
197
|
+
return generateManifestModule(ctx.routeTree!, ctx.root);
|
|
198
|
+
}
|
|
137
199
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
200
|
+
if (id === RESOLVED_SEARCH_PARAMS_REGISTRY_ID) {
|
|
201
|
+
if (!ctx.routeTree) {
|
|
202
|
+
rescan();
|
|
203
|
+
}
|
|
204
|
+
return generateSearchParamsRegistryModule(ctx.routeTree!);
|
|
141
205
|
}
|
|
142
206
|
|
|
143
|
-
return
|
|
207
|
+
return null;
|
|
144
208
|
},
|
|
145
209
|
|
|
146
210
|
/**
|
|
@@ -168,20 +232,49 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
168
232
|
// Watch the app directory
|
|
169
233
|
devServer.watcher.add(ctx.appDir);
|
|
170
234
|
|
|
171
|
-
|
|
172
|
-
|
|
235
|
+
/** Snapshot of the last generated manifest, used to detect structural changes. */
|
|
236
|
+
let lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Handle a route-significant file being added or removed.
|
|
240
|
+
* Always triggers a full-reload since the route tree structure changed.
|
|
241
|
+
*/
|
|
242
|
+
const handleStructuralChange = (filePath: string) => {
|
|
173
243
|
if (!filePath.startsWith(ctx.appDir)) return;
|
|
174
244
|
if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
|
|
175
245
|
|
|
176
|
-
// Rescan the route tree
|
|
177
246
|
rescan();
|
|
178
|
-
|
|
179
|
-
// Invalidate the virtual module in all environments
|
|
247
|
+
lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
|
|
180
248
|
invalidateManifest(devServer);
|
|
181
249
|
};
|
|
182
250
|
|
|
183
|
-
|
|
184
|
-
|
|
251
|
+
/**
|
|
252
|
+
* Handle a route file's content changing.
|
|
253
|
+
*
|
|
254
|
+
* Most content edits (JSX changes, fixing typos) don't affect route
|
|
255
|
+
* metadata — Vite's React Fast Refresh handles those via normal HMR.
|
|
256
|
+
* Only rescan and full-reload when route metadata actually changed
|
|
257
|
+
* (e.g., searchParams export added/removed, metadata export changed).
|
|
258
|
+
*/
|
|
259
|
+
const handleContentChange = (filePath: string) => {
|
|
260
|
+
if (!filePath.startsWith(ctx.appDir)) return;
|
|
261
|
+
if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
|
|
262
|
+
|
|
263
|
+
rescan();
|
|
264
|
+
const newManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
|
|
265
|
+
if (newManifest !== lastManifest) {
|
|
266
|
+
lastManifest = newManifest;
|
|
267
|
+
invalidateManifest(devServer);
|
|
268
|
+
}
|
|
269
|
+
// Otherwise: content edit didn't change route metadata — let Vite HMR handle it
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
devServer.watcher.on('add', handleStructuralChange);
|
|
273
|
+
devServer.watcher.on('unlink', handleStructuralChange);
|
|
274
|
+
// Watch content changes to page files — searchParams detection depends
|
|
275
|
+
// on file contents (export const searchParams), not just file presence.
|
|
276
|
+
// But only full-reload when route metadata actually changes.
|
|
277
|
+
devServer.watcher.on('change', handleContentChange);
|
|
185
278
|
// Also watch renames (which are add+unlink) — handled by the above
|
|
186
279
|
},
|
|
187
280
|
};
|
|
@@ -198,9 +291,11 @@ function invalidateManifest(server: ViteDevServer): void {
|
|
|
198
291
|
const env = server.environments[envName];
|
|
199
292
|
if (!env?.moduleGraph) continue;
|
|
200
293
|
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
294
|
+
for (const virtualId of [RESOLVED_VIRTUAL_ID, RESOLVED_SEARCH_PARAMS_REGISTRY_ID]) {
|
|
295
|
+
const mod = env.moduleGraph.getModuleById(virtualId);
|
|
296
|
+
if (mod) {
|
|
297
|
+
env.moduleGraph.invalidateModule(mod);
|
|
298
|
+
}
|
|
204
299
|
}
|
|
205
300
|
}
|
|
206
301
|
|
|
@@ -208,13 +303,88 @@ function invalidateManifest(server: ViteDevServer): void {
|
|
|
208
303
|
server.hot.send({ type: 'full-reload' });
|
|
209
304
|
}
|
|
210
305
|
|
|
306
|
+
/**
|
|
307
|
+
* TIM-830: Walk the route tree and collect every page that exports a
|
|
308
|
+
* `searchParams` definition, then emit a module that statically imports
|
|
309
|
+
* each export and registers it into the shared search-params registry.
|
|
310
|
+
*
|
|
311
|
+
* Keys use the un-interpolated route pattern (e.g. '/products/[id]') so
|
|
312
|
+
* <Link> can look up the definition from the original `href` prop before
|
|
313
|
+
* segmentParams are interpolated.
|
|
314
|
+
*/
|
|
315
|
+
function generateSearchParamsRegistryModule(tree: RouteTree): string {
|
|
316
|
+
const entries: Array<{ urlPath: string; filePath: string }> = [];
|
|
317
|
+
|
|
318
|
+
function walk(node: SegmentNode): void {
|
|
319
|
+
// params.ts is the canonical location for `export const searchParams`;
|
|
320
|
+
// page.tsx is the legacy fallback (see codegen.ts `collectRoutes`).
|
|
321
|
+
if (node.page) {
|
|
322
|
+
if (node.params && fileHasSearchParamsExport(node.params.filePath)) {
|
|
323
|
+
entries.push({ urlPath: node.urlPath, filePath: node.params.filePath });
|
|
324
|
+
} else if (fileHasSearchParamsExport(node.page.filePath)) {
|
|
325
|
+
entries.push({ urlPath: node.urlPath, filePath: node.page.filePath });
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
for (const child of node.children) walk(child);
|
|
329
|
+
for (const [, slot] of node.slots) walk(slot);
|
|
330
|
+
}
|
|
331
|
+
walk(tree.root);
|
|
332
|
+
|
|
333
|
+
// Deterministic order for stable output / snapshots
|
|
334
|
+
entries.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
|
|
335
|
+
|
|
336
|
+
const lines: string[] = [];
|
|
337
|
+
lines.push('// Auto-generated search-params registry — do not edit.');
|
|
338
|
+
lines.push('// Generated by timber-routing plugin (TIM-830).');
|
|
339
|
+
lines.push('');
|
|
340
|
+
lines.push("import { registerSearchParams } from '@timber-js/app/search-params';");
|
|
341
|
+
lines.push('');
|
|
342
|
+
|
|
343
|
+
// Static imports — Vite/Rolldown tree-shakes the page component body out
|
|
344
|
+
// of this chunk, leaving only the `searchParams` named export.
|
|
345
|
+
entries.forEach((entry, i) => {
|
|
346
|
+
lines.push(`import { searchParams as r${i} } from ${JSON.stringify(entry.filePath)};`);
|
|
347
|
+
});
|
|
348
|
+
lines.push('');
|
|
349
|
+
|
|
350
|
+
entries.forEach((entry, i) => {
|
|
351
|
+
lines.push(`registerSearchParams(${JSON.stringify(entry.urlPath)}, r${i});`);
|
|
352
|
+
});
|
|
353
|
+
lines.push('');
|
|
354
|
+
|
|
355
|
+
// Exporting an empty object keeps the module a real ESM module even
|
|
356
|
+
// when there are zero entries (no top-level imports in that case).
|
|
357
|
+
lines.push('export {};');
|
|
358
|
+
lines.push('');
|
|
359
|
+
|
|
360
|
+
return lines.join('\n');
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Lightweight check for a `searchParams` named export. Mirrors
|
|
365
|
+
* `fileHasExport('searchParams')` in routing/codegen.ts so we stay
|
|
366
|
+
* in sync with what the type codegen detects.
|
|
367
|
+
*/
|
|
368
|
+
function fileHasSearchParamsExport(filePath: string): boolean {
|
|
369
|
+
try {
|
|
370
|
+
if (!existsSync(filePath)) return false;
|
|
371
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
372
|
+
return (
|
|
373
|
+
/export\s+(const|let|var)\s+searchParams\b/.test(content) ||
|
|
374
|
+
/export\s*\{[^}]*\bsearchParams\b[^}]*\}/.test(content)
|
|
375
|
+
);
|
|
376
|
+
} catch {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
211
381
|
/**
|
|
212
382
|
* Generate the virtual module source code for the route manifest.
|
|
213
383
|
*
|
|
214
384
|
* The output is a default-exported object containing the serialized route tree.
|
|
215
385
|
* All file references use absolute paths (required for virtual modules).
|
|
216
386
|
*/
|
|
217
|
-
function generateManifestModule(tree: RouteTree): string {
|
|
387
|
+
function generateManifestModule(tree: RouteTree, viteRoot: string): string {
|
|
218
388
|
const imports: string[] = [];
|
|
219
389
|
let importIndex = 0;
|
|
220
390
|
|
|
@@ -301,12 +471,15 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
301
471
|
`${nextIndent}denied: { load: ${v}, filePath: ${JSON.stringify(node.denied.filePath)} },`
|
|
302
472
|
);
|
|
303
473
|
}
|
|
304
|
-
if (node.
|
|
305
|
-
const v = addImport(node.
|
|
474
|
+
if (node.params) {
|
|
475
|
+
const v = addImport(node.params);
|
|
306
476
|
parts.push(
|
|
307
|
-
`${nextIndent}
|
|
477
|
+
`${nextIndent}params: { load: ${v}, filePath: ${JSON.stringify(node.params.filePath)} },`
|
|
308
478
|
);
|
|
309
479
|
}
|
|
480
|
+
// searchParams is now a named export from page.tsx, not a separate file.
|
|
481
|
+
// The page module's searchParams export is loaded via the page's lazy import.
|
|
482
|
+
// Runtime registration happens in the route loader using the page module.
|
|
310
483
|
|
|
311
484
|
// Status-code files
|
|
312
485
|
if (node.statusFiles && node.statusFiles.size > 0) {
|
|
@@ -391,6 +564,13 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
391
564
|
proxyLine = ` proxy: { load: ${v}, filePath: ${JSON.stringify(tree.proxy.filePath)} },`;
|
|
392
565
|
}
|
|
393
566
|
|
|
567
|
+
// Global error page (Tier 2)
|
|
568
|
+
let globalErrorLine = '';
|
|
569
|
+
if (tree.globalError) {
|
|
570
|
+
const v = addImport(tree.globalError);
|
|
571
|
+
globalErrorLine = ` globalError: { load: ${v}, filePath: ${JSON.stringify(tree.globalError.filePath)} },`;
|
|
572
|
+
}
|
|
573
|
+
|
|
394
574
|
// Interception rewrites — computed at build time from the route tree.
|
|
395
575
|
// Only interceptedPattern and interceptingPrefix are needed at runtime.
|
|
396
576
|
const rewrites = collectInterceptionRewrites(tree.root);
|
|
@@ -406,7 +586,9 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
406
586
|
...imports,
|
|
407
587
|
'',
|
|
408
588
|
'const manifest = {',
|
|
589
|
+
` viteRoot: ${JSON.stringify(viteRoot)},`,
|
|
409
590
|
proxyLine,
|
|
591
|
+
globalErrorLine,
|
|
410
592
|
rewritesLine,
|
|
411
593
|
` root: ${rootSerialized},`,
|
|
412
594
|
'};',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Plugin } from 'vite';
|
|
2
2
|
import { Parser } from 'acorn';
|
|
3
3
|
import acornJsx from 'acorn-jsx';
|
|
4
|
-
import { detectFileDirective } from '
|
|
4
|
+
import { detectFileDirective } from '../utils/directive-parser.js';
|
|
5
5
|
|
|
6
6
|
const jsxParser = Parser.extend(acornJsx());
|
|
7
7
|
|
|
@@ -137,5 +137,36 @@ export function timberServerBundle(): Plugin[] {
|
|
|
137
137
|
},
|
|
138
138
|
};
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
// Fix Rolldown's `createRequire(import.meta.url)` CJS interop shim for
|
|
141
|
+
// Cloudflare Workers. Rolldown emits this for CJS dependencies (e.g.
|
|
142
|
+
// @opentelemetry/context-async-hooks) that use `require()`. On Workers,
|
|
143
|
+
// `import.meta.url` is `undefined` for non-entry modules, causing:
|
|
144
|
+
// TypeError: The argument 'path' must be a file URL object, a file URL
|
|
145
|
+
// string, or an absolute path string. Received 'undefined'
|
|
146
|
+
//
|
|
147
|
+
// The fix: provide a fallback URL when `import.meta.url` is undefined.
|
|
148
|
+
// The actual URL doesn't matter — `createRequire` only needs it for
|
|
149
|
+
// resolving relative paths, but the only `__require()` calls are for
|
|
150
|
+
// Node built-ins (events, async_hooks) which resolve from any base.
|
|
151
|
+
//
|
|
152
|
+
// The top-level `ssr: { target: 'webworker' }` was supposed to prevent
|
|
153
|
+
// this, but it doesn't propagate to custom environments (rsc) in Vite's
|
|
154
|
+
// Environment API. See LOCAL-405.
|
|
155
|
+
const createRequireFixPlugin: Plugin = {
|
|
156
|
+
name: 'timber-create-require-fix',
|
|
157
|
+
applyToEnvironment(environment) {
|
|
158
|
+
return environment.name === 'rsc' || environment.name === 'ssr';
|
|
159
|
+
},
|
|
160
|
+
renderChunk(code) {
|
|
161
|
+
const pattern = 'createRequire(import.meta.url)';
|
|
162
|
+
if (!code.includes(pattern)) return null;
|
|
163
|
+
|
|
164
|
+
return {
|
|
165
|
+
code: code.replace(pattern, 'createRequire(import.meta.url || "file:///app")'),
|
|
166
|
+
map: null,
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
return [bundlePlugin, esmInitFixPlugin, createRequireFixPlugin];
|
|
141
172
|
}
|
package/src/plugins/shims.ts
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* shim implementations. This enables Next.js-compatible libraries
|
|
6
6
|
* (nuqs, next-intl, etc.) to work unmodified.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* This plugin also remaps ALL @timber-js/app/* subpath imports to src/ in
|
|
9
|
+
* server environments (RSC + SSR). This is required because dist/ chunks
|
|
10
|
+
* are pre-built and miss Vite's RSC transforms (e.g. createContext from
|
|
11
|
+
* 'react' doesn't exist in RSC's React build). It also ensures a single
|
|
12
|
+
* module instance for shared mutable state. See SUBPATH_SRC_MAP and TIM-568.
|
|
12
13
|
*
|
|
13
14
|
* Design doc: 18-build-system.md §"Shim Map"
|
|
14
15
|
*/
|
|
@@ -16,7 +17,7 @@
|
|
|
16
17
|
import type { Plugin } from 'vite';
|
|
17
18
|
import { resolve, dirname } from 'node:path';
|
|
18
19
|
import { fileURLToPath } from 'node:url';
|
|
19
|
-
import type { PluginContext } from '
|
|
20
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
20
21
|
|
|
21
22
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
22
23
|
// Detect whether we're running from source (src/plugins/) or dist (dist/).
|
|
@@ -38,6 +39,24 @@ const SHIMS_DIR = resolve(PKG_ROOT, 'src', 'shims');
|
|
|
38
39
|
const SERVER_ONLY_VIRTUAL = '\0timber:server-only';
|
|
39
40
|
const CLIENT_ONLY_VIRTUAL = '\0timber:client-only';
|
|
40
41
|
|
|
42
|
+
/**
|
|
43
|
+
* Map from @timber-js/app/<subpath> to relative src/ file paths.
|
|
44
|
+
*
|
|
45
|
+
* Used by the catch-all resolveId rule to remap subpath imports to src/
|
|
46
|
+
* in server environments. When adding a new subpath export to package.json,
|
|
47
|
+
* add it here too. See TIM-568.
|
|
48
|
+
*/
|
|
49
|
+
const SUBPATH_SRC_MAP: Record<string, string> = {
|
|
50
|
+
'cache': 'cache/index.ts',
|
|
51
|
+
'cookies': 'cookies/index.ts',
|
|
52
|
+
'search-params': 'search-params/index.ts',
|
|
53
|
+
'segment-params': 'segment-params/index.ts',
|
|
54
|
+
|
|
55
|
+
'adapters/cloudflare': 'adapters/cloudflare.ts',
|
|
56
|
+
'adapters/cloudflare/dev': 'adapters/cloudflare-dev.ts',
|
|
57
|
+
'adapters/nitro': 'adapters/nitro.ts',
|
|
58
|
+
};
|
|
59
|
+
|
|
41
60
|
/**
|
|
42
61
|
* Map from next/* import specifiers to shim file paths.
|
|
43
62
|
*
|
|
@@ -49,10 +68,14 @@ const SHIM_MAP: Record<string, string> = {
|
|
|
49
68
|
'next/image': resolve(SHIMS_DIR, 'image.ts'),
|
|
50
69
|
'next/navigation': resolve(SHIMS_DIR, 'navigation.ts'),
|
|
51
70
|
'next/headers': resolve(SHIMS_DIR, 'headers.ts'),
|
|
52
|
-
// next/font/*
|
|
53
|
-
// The fonts plugin's load hook serves the actual module
|
|
71
|
+
// next/font/* and @timber-js/app/fonts/* redirect to the timber-fonts
|
|
72
|
+
// virtual modules. The fonts plugin's load hook serves the actual module
|
|
73
|
+
// code. The package.json exports point to shim stubs for non-Vite contexts
|
|
74
|
+
// (tsc, tests), but in Vite the virtual module takes priority via this map.
|
|
54
75
|
'next/font/google': '\0@timber/fonts/google',
|
|
55
76
|
'next/font/local': '\0@timber/fonts/local',
|
|
77
|
+
'@timber-js/app/fonts/google': '\0@timber/fonts/google',
|
|
78
|
+
'@timber-js/app/fonts/local': '\0@timber/fonts/local',
|
|
56
79
|
};
|
|
57
80
|
|
|
58
81
|
/**
|
|
@@ -88,14 +111,14 @@ export function timberShims(_ctx: PluginContext): Plugin {
|
|
|
88
111
|
* 3. Check next/* shim map
|
|
89
112
|
* 4. Return null (pass through) for everything else
|
|
90
113
|
*
|
|
91
|
-
* @timber-js/app
|
|
92
|
-
*
|
|
93
|
-
*
|
|
114
|
+
* All @timber-js/app/* subpath imports resolve to dist/ via package.json
|
|
115
|
+
* exports in all environments. This ensures a single module instance
|
|
116
|
+
* for each module — the dist/ chunks share code via rollup's code
|
|
117
|
+
* splitting. No src/ remapping is needed (see TIM-568).
|
|
94
118
|
*
|
|
95
|
-
* @timber-js/app/
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* is preserved on the entry for client boundary detection.
|
|
119
|
+
* The only exception is @timber-js/app/server in the client (browser)
|
|
120
|
+
* environment, which returns a virtual stub — server code must never
|
|
121
|
+
* be bundled into the browser.
|
|
99
122
|
*/
|
|
100
123
|
resolveId(id: string) {
|
|
101
124
|
// Poison pill packages — resolve to virtual modules handled by load()
|
|
@@ -117,38 +140,110 @@ export function timberShims(_ctx: PluginContext): Plugin {
|
|
|
117
140
|
return SHIM_MAP[cleanId];
|
|
118
141
|
}
|
|
119
142
|
|
|
120
|
-
// @timber-js/app
|
|
121
|
-
//
|
|
122
|
-
//
|
|
123
|
-
//
|
|
143
|
+
// ── @timber-js/app/* → src/ resolution in server environments ──
|
|
144
|
+
//
|
|
145
|
+
// All @timber-js/app/* subpath imports are remapped to src/ in server
|
|
146
|
+
// environments (RSC + SSR). This is required for two reasons:
|
|
147
|
+
//
|
|
148
|
+
// 1. RSC correctness: dist/ chunks eagerly import from 'react' (e.g.
|
|
149
|
+
// createContext in segment-context) which doesn't exist in RSC's
|
|
150
|
+
// React build. Vite's RSC plugin only transforms src/ files —
|
|
151
|
+
// dist/ chunks are pre-built and served as-is.
|
|
152
|
+
//
|
|
153
|
+
// 2. Module singleton correctness: framework internals use relative
|
|
154
|
+
// imports that resolve within src/. If user code resolved to dist/
|
|
155
|
+
// while framework code resolved to src/, mutable module-level state
|
|
156
|
+
// (ALS refs, registered callbacks) would be duplicated. By remapping
|
|
157
|
+
// all @timber-js/app/* to src/, everything shares one module graph.
|
|
158
|
+
//
|
|
159
|
+
// Exception: @timber-js/app/client in RSC resolves to dist/ where
|
|
160
|
+
// 'use client' is preserved for client boundary detection.
|
|
161
|
+
//
|
|
162
|
+
// In the client (browser) environment, all imports resolve to dist/
|
|
163
|
+
// via package.json exports (no remapping needed).
|
|
164
|
+
|
|
165
|
+
// ── #imports resolution for package-internal modules ─────────────
|
|
166
|
+
//
|
|
167
|
+
// #server-internal and #client-internal are Node package imports
|
|
168
|
+
// (package.json "imports" field). They are only resolvable from
|
|
169
|
+
// within this package — external consumers get module-not-found.
|
|
170
|
+
//
|
|
171
|
+
// In Vite, we intercept them here to resolve to src/ for dev/build
|
|
172
|
+
// correctness (same rationale as the @timber-js/app/* remap above).
|
|
173
|
+
if (cleanId === '#server-internal') {
|
|
174
|
+
const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
|
|
175
|
+
if (envName === 'client') {
|
|
176
|
+
return '\0timber:server-empty';
|
|
177
|
+
}
|
|
178
|
+
return resolve(PKG_ROOT, 'src', 'server', 'internal.ts');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (cleanId === '#client-internal') {
|
|
182
|
+
// Always resolve to src/ — all environments (RSC, SSR, client)
|
|
183
|
+
// use src/ for framework internals. In the client env, this
|
|
184
|
+
// ensures browser-entry and @timber-js/app/client share the
|
|
185
|
+
// same module graph (both resolve to src/).
|
|
186
|
+
return resolve(PKG_ROOT, 'src', 'client', 'internal.ts');
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (cleanId === '#routing') {
|
|
190
|
+
return resolve(PKG_ROOT, 'src', 'routing', 'index.ts');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Legacy aliases — vitest and monorepo configs may still reference
|
|
194
|
+
// the old @timber-js/app/server/internal and @timber-js/app/client/internal
|
|
195
|
+
// specifiers via resolve.alias. When those aliases resolve to the
|
|
196
|
+
// absolute src/ path, they bypass this plugin entirely. But if the
|
|
197
|
+
// specifier reaches us unresolved (e.g., in a Vite build without
|
|
198
|
+
// aliases), handle it the same way as the #imports above.
|
|
199
|
+
if (cleanId === '@timber-js/app/server/internal') {
|
|
200
|
+
const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
|
|
201
|
+
if (envName === 'client') {
|
|
202
|
+
return '\0timber:server-empty';
|
|
203
|
+
}
|
|
204
|
+
return resolve(PKG_ROOT, 'src', 'server', 'internal.ts');
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (cleanId === '@timber-js/app/client/internal') {
|
|
208
|
+
// Same as #client-internal above — always resolve to src/.
|
|
209
|
+
return resolve(PKG_ROOT, 'src', 'client', 'internal.ts');
|
|
210
|
+
}
|
|
211
|
+
|
|
124
212
|
if (cleanId === '@timber-js/app/server') {
|
|
125
213
|
const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
|
|
126
214
|
if (envName === 'client') {
|
|
127
215
|
return '\0timber:server-empty';
|
|
128
216
|
}
|
|
217
|
+
// RSC + SSR: remap to src/
|
|
129
218
|
return resolve(PKG_ROOT, 'src', 'server', 'index.ts');
|
|
130
219
|
}
|
|
131
220
|
|
|
132
|
-
// @timber-js/app/client → src/ in the SSR environment so client hooks
|
|
133
|
-
// (useParams, usePathname, etc.) share the same module instance as
|
|
134
|
-
// ssr-entry.ts's internal imports (via #/client/...).
|
|
135
|
-
//
|
|
136
|
-
// Without this remap, @timber-js/app/client resolves to dist/ (via
|
|
137
|
-
// package.json exports), creating a module instance split: ssr-entry.ts
|
|
138
|
-
// registers the ALS-backed SSR data provider on the src/ instance of
|
|
139
|
-
// ssr-data.ts, but client component hooks read getSsrData() from the
|
|
140
|
-
// dist/ instance — which has no provider. Result: hooks like useParams()
|
|
141
|
-
// return empty defaults during SSR.
|
|
142
|
-
//
|
|
143
|
-
// This remap is SSR-only. The RSC environment still resolves to dist/
|
|
144
|
-
// where 'use client' is preserved on the entry (needed for client
|
|
145
|
-
// boundary detection). The client (browser) environment uses dist/
|
|
146
|
-
// for bundling.
|
|
147
221
|
if (cleanId === '@timber-js/app/client') {
|
|
148
222
|
const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
|
|
149
|
-
|
|
223
|
+
// RSC: return null — needs dist/ for 'use client' boundary detection.
|
|
224
|
+
// SSR + Client: resolve to src/ so that browser-entry (which uses
|
|
225
|
+
// relative imports from src/) and user code (which uses the bare
|
|
226
|
+
// specifier @timber-js/app/client) share the same module instances.
|
|
227
|
+
// Without this, state.ts is loaded twice (src/ and dist/) and
|
|
228
|
+
// setGlobalRouter() writes to one copy while getRouterOrNull()
|
|
229
|
+
// reads from the other (always null).
|
|
230
|
+
if (envName === 'ssr' || envName === 'client') {
|
|
150
231
|
return resolve(PKG_ROOT, 'src', 'client', 'index.ts');
|
|
151
232
|
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Catch-all: remap any other @timber-js/app/<subpath> to src/
|
|
237
|
+
// in non-client environments (RSC + SSR).
|
|
238
|
+
if (cleanId.startsWith('@timber-js/app/') && cleanId !== '@timber-js/app/package.json') {
|
|
239
|
+
const envName = (this as unknown as { environment?: { name?: string } }).environment?.name;
|
|
240
|
+
if (envName !== 'client') {
|
|
241
|
+
const subpath = cleanId.slice('@timber-js/app/'.length);
|
|
242
|
+
const srcPath = SUBPATH_SRC_MAP[subpath];
|
|
243
|
+
if (srcPath) {
|
|
244
|
+
return resolve(PKG_ROOT, 'src', srcPath);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
152
247
|
}
|
|
153
248
|
|
|
154
249
|
return null;
|
|
@@ -202,6 +297,12 @@ const msg = "[timber] @timber-js/app/server was imported from client code. " +
|
|
|
202
297
|
function stub() { throw new Error(msg); }
|
|
203
298
|
export const headers = stub;
|
|
204
299
|
export const cookies = stub;
|
|
300
|
+
export const getHeaders = stub;
|
|
301
|
+
export const getHeader = stub;
|
|
302
|
+
export const getCookies = stub;
|
|
303
|
+
export const getCookie = stub;
|
|
304
|
+
export const getSearchParams = stub;
|
|
305
|
+
export const getSegmentParams = stub;
|
|
205
306
|
export const searchParams = stub;
|
|
206
307
|
export const deny = stub;
|
|
207
308
|
export const notFound = stub;
|
|
@@ -209,7 +310,7 @@ export const redirect = stub;
|
|
|
209
310
|
export const permanentRedirect = stub;
|
|
210
311
|
export const redirectExternal = stub;
|
|
211
312
|
export const waitUntil = stub;
|
|
212
|
-
export const
|
|
313
|
+
export const DenyOptions = {};
|
|
213
314
|
export const RedirectType = {};
|
|
214
315
|
export const DenySignal = stub;
|
|
215
316
|
export const RedirectSignal = stub;
|