@timber-js/app 0.2.0-alpha.14 → 0.2.0-alpha.141
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/actions-DzFMnUAR.js +1147 -0
- package/dist/_chunks/actions-DzFMnUAR.js.map +1 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js +785 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DH-M8Poy.js +2 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-C3RvHQPK.js +195 -0
- package/dist/_chunks/define-C3RvHQPK.js.map +1 -0
- package/dist/_chunks/define-DMVhsipD.js +112 -0
- package/dist/_chunks/define-DMVhsipD.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/handler-store-DjISKYEB.js +54 -0
- package/dist/_chunks/handler-store-DjISKYEB.js.map +1 -0
- package/dist/_chunks/href-validation-EZktELp8.js +124 -0
- package/dist/_chunks/href-validation-EZktELp8.js.map +1 -0
- package/dist/_chunks/logger-Dt-jQaBO.js +291 -0
- package/dist/_chunks/logger-Dt-jQaBO.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BjepjefT.js} +32 -19
- package/dist/_chunks/metadata-routes-BjepjefT.js.map +1 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js +103 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js +77 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js +86 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js.map +1 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/tracing-M_zKubhk.js +358 -0
- package/dist/_chunks/tracing-M_zKubhk.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
- package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/validation-taUkvA4Q.js +113 -0
- package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
- package/dist/_chunks/walkers-7FBPM-hX.js +724 -0
- package/dist/_chunks/walkers-7FBPM-hX.js.map +1 -0
- package/dist/_chunks/{format-RyoGQL74.js → warnings-CNPXaypM.js} +6 -45
- package/dist/_chunks/warnings-CNPXaypM.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +154 -48
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +165 -117
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +39 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +48 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +26 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +29 -6
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +183 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +925 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +65 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +27 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +14 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +79 -10
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +46 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +3 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +7 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +251 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +172 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5315 -12687
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +114 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +20 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +31 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/client-chunks.d.ts +39 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +18 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +60 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -14
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +70 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +8 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +1 -1
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3126 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +111 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +74 -20
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +28 -2
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +50 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +12 -5
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +5 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +38 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +63 -22
- package/src/adapters/build-output-helper.ts +139 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +147 -60
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +39 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/timber-cache.ts +52 -24
- package/src/cli-schema-sync.ts +295 -0
- package/src/cli.ts +76 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +125 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +153 -0
- package/src/client/browser-entry/index.ts +151 -0
- package/src/client/browser-entry/post-hydration.ts +113 -0
- package/src/client/browser-entry/router-init.ts +219 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +116 -0
- package/src/client/link.tsx +343 -150
- package/src/client/nav-link-store.ts +37 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +338 -0
- package/src/client/navigation-context.ts +35 -7
- package/src/client/navigation-root.tsx +347 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +418 -128
- package/src/client/rsc-fetch.ts +208 -10
- package/src/client/segment-cache.ts +6 -3
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +26 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +507 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +131 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +3 -3
- package/src/fonts/pipeline.ts +337 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +235 -0
- package/src/index.ts +415 -345
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +116 -0
- package/src/plugin-context.ts +247 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/cache.ts +180 -0
- package/src/plugins/client-chunks.ts +113 -0
- package/src/plugins/cloudflare-wasm.ts +103 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +179 -37
- package/src/plugins/entries.ts +110 -8
- package/src/plugins/fonts.ts +167 -655
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +386 -47
- package/src/plugins/server-bundle.ts +59 -3
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +321 -177
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +310 -0
- package/src/routing/scanner.ts +165 -110
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +60 -22
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +309 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +34 -26
- package/src/server/als-registry.ts +108 -20
- package/src/server/asset-headers.ts +8 -34
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +17 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +473 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +32 -52
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +35 -27
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +101 -5
- package/src/server/html-injector-core.ts +418 -0
- package/src/server/html-injectors.ts +238 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +182 -0
- package/src/server/logger.ts +67 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +32 -18
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +527 -0
- package/src/server/pipeline.ts +201 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +130 -46
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +437 -208
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +128 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/error-renderer.ts +316 -89
- package/src/server/rsc-entry/helpers.ts +155 -26
- package/src/server/rsc-entry/index.ts +283 -329
- package/src/server/rsc-entry/render-route.ts +313 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -22
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +271 -41
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +148 -0
- package/src/server/slot-resolver.ts +234 -246
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +217 -78
- package/src/server/ssr-render.ts +344 -71
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +210 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/href-validation.ts +127 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/LICENSE +0 -8
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
package/src/plugins/routing.ts
CHANGED
|
@@ -10,25 +10,65 @@
|
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
import
|
|
19
|
+
buildDirToRouteMap,
|
|
20
|
+
writeSegmentTypes,
|
|
21
|
+
type SegmentInfo,
|
|
22
|
+
} from '../routing/segment-codegen.js';
|
|
23
|
+
import { validateSchemaAgainstRoutes } from '../routing/schema-validation.js';
|
|
24
|
+
|
|
25
|
+
import {
|
|
26
|
+
lintConventions,
|
|
27
|
+
checkAppDirExists,
|
|
28
|
+
formatConventionWarnings,
|
|
29
|
+
} from '../routing/convention-lint.js';
|
|
30
|
+
import type { RouteTree, SegmentNode, RouteFile } from '../routing/types.js';
|
|
31
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
23
32
|
|
|
24
33
|
const VIRTUAL_MODULE_ID = 'virtual:timber-route-manifest';
|
|
25
34
|
const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_MODULE_ID}`;
|
|
26
35
|
|
|
36
|
+
// TIM-830: Search-params registry virtual module.
|
|
37
|
+
//
|
|
38
|
+
// Statically imports the `searchParams` named export from every page
|
|
39
|
+
// that exports one, and registers each definition into the shared
|
|
40
|
+
// search-params registry keyed by the un-interpolated route pattern
|
|
41
|
+
// (e.g. '/products/[id]'). This lets `<Link>` serialize flat
|
|
42
|
+
// `Partial<T>` values at runtime without callers importing the
|
|
43
|
+
// definition at the call site.
|
|
44
|
+
//
|
|
45
|
+
// The imports are STATIC (`import { searchParams as r0 } from '...'`)
|
|
46
|
+
// so Vite/Rolldown tree-shakes each page's component body out of the
|
|
47
|
+
// registry chunk — only the `searchParams` named export is pulled in.
|
|
48
|
+
const SEARCH_PARAMS_REGISTRY_ID = 'virtual:timber-search-params-registry';
|
|
49
|
+
const RESOLVED_SEARCH_PARAMS_REGISTRY_ID = `\0${SEARCH_PARAMS_REGISTRY_ID}`;
|
|
50
|
+
|
|
51
|
+
// TIM-931: Schema virtual module.
|
|
52
|
+
//
|
|
53
|
+
// When app/schema.ts exists, this module imports it and resolves the
|
|
54
|
+
// bracket-keyed segmentParams codecs into a bare-name codec map for
|
|
55
|
+
// runtime coercion. When no schema exists, exports null.
|
|
56
|
+
const SCHEMA_ID = 'virtual:timber-schema';
|
|
57
|
+
const RESOLVED_SCHEMA_ID = `\0${SCHEMA_ID}`;
|
|
58
|
+
|
|
59
|
+
// TIM-935: $segment virtual module prefix.
|
|
60
|
+
// Resolved ID encodes segment info as JSON after the prefix.
|
|
61
|
+
//
|
|
62
|
+
// Each route directory gets a virtual module that exports the route
|
|
63
|
+
// and segmentPath. `import { route, segmentPath } from './$segment'`
|
|
64
|
+
// resolves to `\0$segment:<json>`.
|
|
65
|
+
const SEGMENT_PREFIX = '\0$segment:';
|
|
66
|
+
|
|
27
67
|
/**
|
|
28
68
|
* File convention names we track for changes that require manifest regeneration.
|
|
29
69
|
*/
|
|
30
70
|
const ROUTE_FILE_PATTERNS =
|
|
31
|
-
/\/(page|layout|middleware|access|route|error|default|denied|
|
|
71
|
+
/\/(page|layout|middleware|access|route|error|global-error|default|denied|params|schema|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|apple-icon)\./;
|
|
32
72
|
|
|
33
73
|
/**
|
|
34
74
|
* Create the timber-routing Vite plugin.
|
|
@@ -44,12 +84,25 @@ const CODEGEN_OUTPUT = '.timber/timber-routes.d.ts';
|
|
|
44
84
|
* Uses a triple-slash reference so TypeScript auto-discovers the generated
|
|
45
85
|
* route map without the user needing to edit tsconfig.json — same pattern
|
|
46
86
|
* as Next.js's next-env.d.ts.
|
|
87
|
+
*
|
|
88
|
+
* Also references `vite/client` so side-effect imports like
|
|
89
|
+
* `import './globals.css'` type-check without ts(2882), and so
|
|
90
|
+
* `import.meta.env`, `import.meta.hot`, `import.meta.glob`, asset
|
|
91
|
+
* imports (`*.png`, `*.svg`, …), CSS modules, and `?url`/`?raw`/
|
|
92
|
+
* `?inline` query variants all resolve without the user editing
|
|
93
|
+
* tsconfig.json themselves. Next.js's next-env.d.ts plays the same
|
|
94
|
+
* role via `next/types/global`.
|
|
95
|
+
*
|
|
96
|
+
* `vite` is a peer dep of `@timber-js/app`, so the reference always
|
|
97
|
+
* resolves in a correctly-installed project.
|
|
47
98
|
*/
|
|
48
99
|
const TIMBER_ENV_DTS = [
|
|
49
100
|
'// This file is auto-generated by timber.js. Do not edit.',
|
|
50
|
-
'// It ensures TypeScript picks up the generated route types
|
|
51
|
-
'//
|
|
101
|
+
'// It ensures TypeScript picks up the generated route types and',
|
|
102
|
+
'// Vite-provided ambient types (CSS, assets, import.meta.env, HMR).',
|
|
103
|
+
'/* eslint-disable @typescript-eslint/triple-slash-reference */',
|
|
52
104
|
'/// <reference path=".timber/timber-routes.d.ts" />',
|
|
105
|
+
'/// <reference types="vite/client" />',
|
|
53
106
|
'',
|
|
54
107
|
].join('\n');
|
|
55
108
|
|
|
@@ -70,6 +123,7 @@ function writeCodegen(ctx: PluginContext): void {
|
|
|
70
123
|
Promise.all([
|
|
71
124
|
writeFile(routesPath, content, 'utf-8'),
|
|
72
125
|
writeFile(envPath, TIMBER_ENV_DTS, 'utf-8'),
|
|
126
|
+
writeSegmentTypes(ctx.routeTree!, ctx.appDir, ctx.root),
|
|
73
127
|
])
|
|
74
128
|
)
|
|
75
129
|
.catch((err) => {
|
|
@@ -82,20 +136,48 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
82
136
|
/** Track warned files to avoid repeating warnings on rescan. */
|
|
83
137
|
const warnedFiles = new Set<string>();
|
|
84
138
|
|
|
139
|
+
/** Maps absolute filesystem directory → segment info for $segment resolution. */
|
|
140
|
+
let dirToRoute: Map<string, SegmentInfo> = new Map();
|
|
141
|
+
|
|
85
142
|
function rescan(): void {
|
|
143
|
+
// Check app/ directory exists before scanning
|
|
144
|
+
const appDirWarning = checkAppDirExists(ctx.appDir);
|
|
145
|
+
if (appDirWarning) {
|
|
146
|
+
const formatted = formatConventionWarnings([appDirWarning]);
|
|
147
|
+
if (formatted) process.stderr.write(`${formatted}\n`);
|
|
148
|
+
// Still create an empty tree so the rest of the pipeline doesn't crash
|
|
149
|
+
ctx.routeTree = {
|
|
150
|
+
root: {
|
|
151
|
+
segmentName: '',
|
|
152
|
+
segmentType: 'static',
|
|
153
|
+
urlPath: '/',
|
|
154
|
+
children: [],
|
|
155
|
+
slots: {},
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
86
161
|
ctx.timer.start('route-scan');
|
|
87
162
|
ctx.routeTree = scanRoutes(ctx.appDir, {
|
|
88
163
|
pageExtensions: ctx.config.pageExtensions,
|
|
89
164
|
});
|
|
90
165
|
ctx.timer.end('route-scan');
|
|
166
|
+
dirToRoute = buildDirToRouteMap(ctx.routeTree, ctx.appDir);
|
|
91
167
|
writeCodegen(ctx);
|
|
92
168
|
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
169
|
+
// Validate schema keys against filesystem segments.
|
|
170
|
+
// Warns on stale keys, bracket form mismatches, and missing keys.
|
|
171
|
+
// See design/41-global-params.md §Auto-Scaffolding
|
|
172
|
+
warnSchemaValidation(ctx);
|
|
173
|
+
|
|
174
|
+
// Lint conventions (empty app, missing methods, missing root layout)
|
|
175
|
+
const conventionWarnings = lintConventions(ctx.routeTree, ctx.appDir);
|
|
176
|
+
const newConventionWarnings = conventionWarnings.filter((w) => !warnedFiles.has(w.id));
|
|
177
|
+
if (newConventionWarnings.length > 0) {
|
|
178
|
+
for (const w of newConventionWarnings) warnedFiles.add(w.id);
|
|
179
|
+
const formatted = formatConventionWarnings(newConventionWarnings);
|
|
180
|
+
if (formatted) process.stderr.write(`${formatted}\n`);
|
|
99
181
|
}
|
|
100
182
|
}
|
|
101
183
|
|
|
@@ -110,7 +192,7 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
110
192
|
* - <root>/virtual:timber-route-manifest (Vite SSR build root prefix)
|
|
111
193
|
* - \0virtual:timber-route-manifest (RSC plugin re-imports)
|
|
112
194
|
*/
|
|
113
|
-
resolveId(id: string) {
|
|
195
|
+
resolveId(id: string, importer?: string) {
|
|
114
196
|
// Strip \0 prefix if present (RSC plugin generates these)
|
|
115
197
|
const cleanId = id.startsWith('\0') ? id.slice(1) : id;
|
|
116
198
|
|
|
@@ -123,6 +205,35 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
123
205
|
return RESOLVED_VIRTUAL_ID;
|
|
124
206
|
}
|
|
125
207
|
|
|
208
|
+
// TIM-830: Search-params registry virtual module
|
|
209
|
+
if (
|
|
210
|
+
cleanId === SEARCH_PARAMS_REGISTRY_ID ||
|
|
211
|
+
cleanId.endsWith(`/${SEARCH_PARAMS_REGISTRY_ID}`)
|
|
212
|
+
) {
|
|
213
|
+
return RESOLVED_SEARCH_PARAMS_REGISTRY_ID;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// TIM-931: Schema virtual module
|
|
217
|
+
if (cleanId === SCHEMA_ID || cleanId.endsWith(`/${SCHEMA_ID}`)) {
|
|
218
|
+
return RESOLVED_SCHEMA_ID;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// TIM-935: $segment virtual module.
|
|
222
|
+
// Resolves `import { route } from './$segment'` based on the
|
|
223
|
+
// importing file's directory in the app/ tree.
|
|
224
|
+
if (
|
|
225
|
+
importer &&
|
|
226
|
+
(cleanId === './$segment' || cleanId === './$segment.js' || cleanId === './$segment.ts')
|
|
227
|
+
) {
|
|
228
|
+
// Strip \0 prefix from importer if present
|
|
229
|
+
const cleanImporter = importer.startsWith('\0') ? importer.slice(1) : importer;
|
|
230
|
+
const importerDir = cleanImporter.substring(0, cleanImporter.lastIndexOf('/'));
|
|
231
|
+
const segmentInfo = dirToRoute.get(importerDir);
|
|
232
|
+
if (segmentInfo !== undefined) {
|
|
233
|
+
return `${SEGMENT_PREFIX}${JSON.stringify(segmentInfo)}`;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
126
237
|
return null;
|
|
127
238
|
},
|
|
128
239
|
|
|
@@ -133,14 +244,36 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
133
244
|
* with absolute import paths for all file references.
|
|
134
245
|
*/
|
|
135
246
|
load(id: string) {
|
|
136
|
-
if (id
|
|
247
|
+
if (id === RESOLVED_VIRTUAL_ID) {
|
|
248
|
+
// If routeTree hasn't been built yet (shouldn't happen), scan now
|
|
249
|
+
if (!ctx.routeTree) {
|
|
250
|
+
rescan();
|
|
251
|
+
}
|
|
252
|
+
return generateManifestModule(ctx.routeTree!, ctx.root);
|
|
253
|
+
}
|
|
137
254
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
255
|
+
if (id === RESOLVED_SEARCH_PARAMS_REGISTRY_ID) {
|
|
256
|
+
if (!ctx.routeTree) {
|
|
257
|
+
rescan();
|
|
258
|
+
}
|
|
259
|
+
return generateSearchParamsRegistryModule(ctx.routeTree!);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (id === RESOLVED_SCHEMA_ID) {
|
|
263
|
+
return generateSchemaModule(ctx.appDir);
|
|
141
264
|
}
|
|
142
265
|
|
|
143
|
-
|
|
266
|
+
// TIM-935: $segment virtual module — exports route and segmentPath.
|
|
267
|
+
if (id.startsWith(SEGMENT_PREFIX)) {
|
|
268
|
+
const info: SegmentInfo = JSON.parse(id.slice(SEGMENT_PREFIX.length));
|
|
269
|
+
return [
|
|
270
|
+
`export const ROUTE = ${JSON.stringify(info.route)};`,
|
|
271
|
+
`export const SEGMENT_PATH = ${JSON.stringify(info.segmentPath)};`,
|
|
272
|
+
'',
|
|
273
|
+
].join('\n');
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return null;
|
|
144
277
|
},
|
|
145
278
|
|
|
146
279
|
/**
|
|
@@ -168,20 +301,49 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
168
301
|
// Watch the app directory
|
|
169
302
|
devServer.watcher.add(ctx.appDir);
|
|
170
303
|
|
|
171
|
-
|
|
172
|
-
|
|
304
|
+
/** Snapshot of the last generated manifest, used to detect structural changes. */
|
|
305
|
+
let lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Handle a route-significant file being added or removed.
|
|
309
|
+
* Always triggers a full-reload since the route tree structure changed.
|
|
310
|
+
*/
|
|
311
|
+
const handleStructuralChange = (filePath: string) => {
|
|
173
312
|
if (!filePath.startsWith(ctx.appDir)) return;
|
|
174
313
|
if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
|
|
175
314
|
|
|
176
|
-
// Rescan the route tree
|
|
177
315
|
rescan();
|
|
178
|
-
|
|
179
|
-
// Invalidate the virtual module in all environments
|
|
316
|
+
lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
|
|
180
317
|
invalidateManifest(devServer);
|
|
181
318
|
};
|
|
182
319
|
|
|
183
|
-
|
|
184
|
-
|
|
320
|
+
/**
|
|
321
|
+
* Handle a route file's content changing.
|
|
322
|
+
*
|
|
323
|
+
* Most content edits (JSX changes, fixing typos) don't affect route
|
|
324
|
+
* metadata — Vite's React Fast Refresh handles those via normal HMR.
|
|
325
|
+
* Only rescan and full-reload when route metadata actually changed
|
|
326
|
+
* (e.g., searchParams export added/removed, metadata export changed).
|
|
327
|
+
*/
|
|
328
|
+
const handleContentChange = (filePath: string) => {
|
|
329
|
+
if (!filePath.startsWith(ctx.appDir)) return;
|
|
330
|
+
if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
|
|
331
|
+
|
|
332
|
+
rescan();
|
|
333
|
+
const newManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
|
|
334
|
+
if (newManifest !== lastManifest) {
|
|
335
|
+
lastManifest = newManifest;
|
|
336
|
+
invalidateManifest(devServer);
|
|
337
|
+
}
|
|
338
|
+
// Otherwise: content edit didn't change route metadata — let Vite HMR handle it
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
devServer.watcher.on('add', handleStructuralChange);
|
|
342
|
+
devServer.watcher.on('unlink', handleStructuralChange);
|
|
343
|
+
// Watch content changes to page files — searchParams detection depends
|
|
344
|
+
// on file contents (export const searchParams), not just file presence.
|
|
345
|
+
// But only full-reload when route metadata actually changes.
|
|
346
|
+
devServer.watcher.on('change', handleContentChange);
|
|
185
347
|
// Also watch renames (which are add+unlink) — handled by the above
|
|
186
348
|
},
|
|
187
349
|
};
|
|
@@ -193,14 +355,58 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
193
355
|
* When the route tree changes, any environment that has imported the manifest
|
|
194
356
|
* needs to be invalidated so the next request/transform picks up the new tree.
|
|
195
357
|
*/
|
|
358
|
+
/** Set of warning keys we've already emitted — avoid repeating on every rescan. */
|
|
359
|
+
const _warnedKeys = new Set<string>();
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Validate schema keys against the filesystem route tree.
|
|
363
|
+
* Warns on stale keys, bracket form mismatches, and missing keys.
|
|
364
|
+
* Uses the already-scanned route tree instead of re-scanning.
|
|
365
|
+
*/
|
|
366
|
+
function warnSchemaValidation(ctx: PluginContext): void {
|
|
367
|
+
if (!ctx.routeTree) return;
|
|
368
|
+
const warnings = validateSchemaAgainstRoutes(ctx.routeTree, ctx.appDir);
|
|
369
|
+
|
|
370
|
+
for (const w of warnings) {
|
|
371
|
+
const warnKey = `${w.type}:${w.key}`;
|
|
372
|
+
if (_warnedKeys.has(warnKey)) continue;
|
|
373
|
+
_warnedKeys.add(warnKey);
|
|
374
|
+
|
|
375
|
+
switch (w.type) {
|
|
376
|
+
case 'stale-key':
|
|
377
|
+
console.warn(`[timber] ${w.message}`);
|
|
378
|
+
break;
|
|
379
|
+
case 'bracket-mismatch':
|
|
380
|
+
console.warn(`[timber] ${w.message}`);
|
|
381
|
+
break;
|
|
382
|
+
case 'missing-key':
|
|
383
|
+
console.warn(`[timber] ${w.message}`);
|
|
384
|
+
break;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
196
389
|
function invalidateManifest(server: ViteDevServer): void {
|
|
197
390
|
for (const envName of Object.keys(server.environments)) {
|
|
198
391
|
const env = server.environments[envName];
|
|
199
392
|
if (!env?.moduleGraph) continue;
|
|
200
393
|
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
394
|
+
for (const virtualId of [
|
|
395
|
+
RESOLVED_VIRTUAL_ID,
|
|
396
|
+
RESOLVED_SEARCH_PARAMS_REGISTRY_ID,
|
|
397
|
+
RESOLVED_SCHEMA_ID,
|
|
398
|
+
]) {
|
|
399
|
+
const mod = env.moduleGraph.getModuleById(virtualId);
|
|
400
|
+
if (mod) {
|
|
401
|
+
env.moduleGraph.invalidateModule(mod);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// TIM-935: Invalidate all $segment virtual modules (prefixed \0$segment:)
|
|
406
|
+
for (const mod of env.moduleGraph.idToModuleMap.values()) {
|
|
407
|
+
if (mod.id?.startsWith(SEGMENT_PREFIX)) {
|
|
408
|
+
env.moduleGraph.invalidateModule(mod);
|
|
409
|
+
}
|
|
204
410
|
}
|
|
205
411
|
}
|
|
206
412
|
|
|
@@ -208,13 +414,132 @@ function invalidateManifest(server: ViteDevServer): void {
|
|
|
208
414
|
server.hot.send({ type: 'full-reload' });
|
|
209
415
|
}
|
|
210
416
|
|
|
417
|
+
/**
|
|
418
|
+
* TIM-830: Walk the route tree and collect every page that exports a
|
|
419
|
+
* `searchParams` definition, then emit a module that statically imports
|
|
420
|
+
* each export and registers it into the shared search-params registry.
|
|
421
|
+
*
|
|
422
|
+
* Keys use the un-interpolated route pattern (e.g. '/products/[id]') so
|
|
423
|
+
* <Link> can look up the definition from the original `href` prop before
|
|
424
|
+
* segmentParams are interpolated.
|
|
425
|
+
*/
|
|
426
|
+
/** Schema file extensions to check, in priority order. */
|
|
427
|
+
const SCHEMA_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* TIM-931: Generate the virtual:timber-schema module.
|
|
431
|
+
*
|
|
432
|
+
* When app/schema.{ts,tsx,js,jsx} exists, generates a module that
|
|
433
|
+
* imports the schema and resolves its segmentParams codecs into a
|
|
434
|
+
* bare-name codec map for runtime coercion.
|
|
435
|
+
*
|
|
436
|
+
* When no schema exists, exports null.
|
|
437
|
+
*/
|
|
438
|
+
function generateSchemaModule(appDir: string): string {
|
|
439
|
+
let schemaPath: string | null = null;
|
|
440
|
+
for (const ext of SCHEMA_EXTENSIONS) {
|
|
441
|
+
const candidate = join(appDir, `schema${ext}`);
|
|
442
|
+
if (existsSync(candidate)) {
|
|
443
|
+
schemaPath = candidate;
|
|
444
|
+
break;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
if (!schemaPath) {
|
|
449
|
+
return [
|
|
450
|
+
'// Auto-generated schema loader — no app/schema.ts found.',
|
|
451
|
+
'export default null;',
|
|
452
|
+
].join('\n');
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
return [
|
|
456
|
+
'// Auto-generated schema loader — do not edit.',
|
|
457
|
+
'// Generated by timber-routing plugin (TIM-931).',
|
|
458
|
+
'',
|
|
459
|
+
`import schema from ${JSON.stringify(schemaPath)};`,
|
|
460
|
+
`import { resolveSchemaCodecs } from '@timber-js/app/params';`,
|
|
461
|
+
'',
|
|
462
|
+
'const globalCodecs = schema?.segmentParams',
|
|
463
|
+
' ? resolveSchemaCodecs(schema.segmentParams)',
|
|
464
|
+
' : null;',
|
|
465
|
+
'',
|
|
466
|
+
'export default globalCodecs;',
|
|
467
|
+
].join('\n');
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function generateSearchParamsRegistryModule(tree: RouteTree): string {
|
|
471
|
+
const entries: Array<{ urlPath: string; filePath: string }> = [];
|
|
472
|
+
|
|
473
|
+
function walk(node: SegmentNode): void {
|
|
474
|
+
// params.ts is the canonical location for `export const searchParams`;
|
|
475
|
+
// page.tsx is the legacy fallback (see codegen.ts `collectRoutes`).
|
|
476
|
+
if (node.page) {
|
|
477
|
+
if (node.params && fileHasSearchParamsExport(node.params.filePath)) {
|
|
478
|
+
entries.push({ urlPath: node.urlPath, filePath: node.params.filePath });
|
|
479
|
+
} else if (fileHasSearchParamsExport(node.page.filePath)) {
|
|
480
|
+
entries.push({ urlPath: node.urlPath, filePath: node.page.filePath });
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
for (const child of node.children) walk(child);
|
|
484
|
+
for (const slot of Object.values(node.slots)) walk(slot);
|
|
485
|
+
}
|
|
486
|
+
walk(tree.root);
|
|
487
|
+
|
|
488
|
+
// Deterministic order for stable output / snapshots
|
|
489
|
+
entries.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
|
|
490
|
+
|
|
491
|
+
const lines: string[] = [];
|
|
492
|
+
lines.push('// Auto-generated search-params registry — do not edit.');
|
|
493
|
+
lines.push('// Generated by timber-routing plugin (TIM-830).');
|
|
494
|
+
lines.push('');
|
|
495
|
+
lines.push("import { registerSearchParams } from '@timber-js/app/search-params';");
|
|
496
|
+
lines.push('');
|
|
497
|
+
|
|
498
|
+
// Static imports — Vite/Rolldown tree-shakes the page component body out
|
|
499
|
+
// of this chunk, leaving only the `searchParams` named export.
|
|
500
|
+
entries.forEach((entry, i) => {
|
|
501
|
+
lines.push(`import { searchParams as r${i} } from ${JSON.stringify(entry.filePath)};`);
|
|
502
|
+
});
|
|
503
|
+
lines.push('');
|
|
504
|
+
|
|
505
|
+
entries.forEach((entry, i) => {
|
|
506
|
+
lines.push(`registerSearchParams(${JSON.stringify(entry.urlPath)}, r${i});`);
|
|
507
|
+
});
|
|
508
|
+
lines.push('');
|
|
509
|
+
|
|
510
|
+
// Exporting an empty object keeps the module a real ESM module even
|
|
511
|
+
// when there are zero entries (no top-level imports in that case).
|
|
512
|
+
lines.push('export {};');
|
|
513
|
+
lines.push('');
|
|
514
|
+
|
|
515
|
+
return lines.join('\n');
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Lightweight check for a `searchParams` named export. Mirrors
|
|
520
|
+
* `fileHasExport('searchParams')` in routing/codegen.ts so we stay
|
|
521
|
+
* in sync with what the type codegen detects.
|
|
522
|
+
*/
|
|
523
|
+
function fileHasSearchParamsExport(filePath: string): boolean {
|
|
524
|
+
try {
|
|
525
|
+
if (!existsSync(filePath)) return false;
|
|
526
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
527
|
+
return (
|
|
528
|
+
/export\s+(const|let|var)\s+searchParams\b/.test(content) ||
|
|
529
|
+
/export\s*\{[^}]*\bsearchParams\b[^}]*\}/.test(content)
|
|
530
|
+
);
|
|
531
|
+
} catch {
|
|
532
|
+
return false;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
211
536
|
/**
|
|
212
537
|
* Generate the virtual module source code for the route manifest.
|
|
213
538
|
*
|
|
214
539
|
* The output is a default-exported object containing the serialized route tree.
|
|
215
540
|
* All file references use absolute paths (required for virtual modules).
|
|
216
541
|
*/
|
|
217
|
-
function generateManifestModule(tree: RouteTree): string {
|
|
542
|
+
function generateManifestModule(tree: RouteTree, viteRoot: string): string {
|
|
218
543
|
const imports: string[] = [];
|
|
219
544
|
let importIndex = 0;
|
|
220
545
|
|
|
@@ -301,17 +626,20 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
301
626
|
`${nextIndent}denied: { load: ${v}, filePath: ${JSON.stringify(node.denied.filePath)} },`
|
|
302
627
|
);
|
|
303
628
|
}
|
|
304
|
-
if (node.
|
|
305
|
-
const v = addImport(node.
|
|
629
|
+
if (node.params) {
|
|
630
|
+
const v = addImport(node.params);
|
|
306
631
|
parts.push(
|
|
307
|
-
`${nextIndent}
|
|
632
|
+
`${nextIndent}params: { load: ${v}, filePath: ${JSON.stringify(node.params.filePath)} },`
|
|
308
633
|
);
|
|
309
634
|
}
|
|
635
|
+
// searchParams is now a named export from page.tsx, not a separate file.
|
|
636
|
+
// The page module's searchParams export is loaded via the page's lazy import.
|
|
637
|
+
// Runtime registration happens in the route loader using the page module.
|
|
310
638
|
|
|
311
639
|
// Status-code files
|
|
312
|
-
if (node.statusFiles && node.statusFiles.
|
|
640
|
+
if (node.statusFiles && Object.keys(node.statusFiles).length > 0) {
|
|
313
641
|
const statusEntries: string[] = [];
|
|
314
|
-
for (const [code, file] of node.statusFiles) {
|
|
642
|
+
for (const [code, file] of Object.entries(node.statusFiles)) {
|
|
315
643
|
const v = addImport(file);
|
|
316
644
|
statusEntries.push(
|
|
317
645
|
`${nextIndent} ${JSON.stringify(code)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
|
|
@@ -321,9 +649,9 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
321
649
|
}
|
|
322
650
|
|
|
323
651
|
// JSON status-code files
|
|
324
|
-
if (node.jsonStatusFiles && node.jsonStatusFiles.
|
|
652
|
+
if (node.jsonStatusFiles && Object.keys(node.jsonStatusFiles).length > 0) {
|
|
325
653
|
const jsonEntries: string[] = [];
|
|
326
|
-
for (const [code, file] of node.jsonStatusFiles) {
|
|
654
|
+
for (const [code, file] of Object.entries(node.jsonStatusFiles)) {
|
|
327
655
|
const v = addImport(file);
|
|
328
656
|
jsonEntries.push(
|
|
329
657
|
`${nextIndent} ${JSON.stringify(code)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
|
|
@@ -333,9 +661,9 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
333
661
|
}
|
|
334
662
|
|
|
335
663
|
// Legacy status files
|
|
336
|
-
if (node.legacyStatusFiles && node.legacyStatusFiles.
|
|
664
|
+
if (node.legacyStatusFiles && Object.keys(node.legacyStatusFiles).length > 0) {
|
|
337
665
|
const legacyEntries: string[] = [];
|
|
338
|
-
for (const [name, file] of node.legacyStatusFiles) {
|
|
666
|
+
for (const [name, file] of Object.entries(node.legacyStatusFiles)) {
|
|
339
667
|
const v = addImport(file);
|
|
340
668
|
legacyEntries.push(
|
|
341
669
|
`${nextIndent} ${JSON.stringify(name)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
|
|
@@ -347,9 +675,9 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
347
675
|
}
|
|
348
676
|
|
|
349
677
|
// Metadata route files (sitemap.ts, robots.ts, icon.tsx, etc.)
|
|
350
|
-
if (node.metadataRoutes && node.metadataRoutes.
|
|
678
|
+
if (node.metadataRoutes && Object.keys(node.metadataRoutes).length > 0) {
|
|
351
679
|
const metaEntries: string[] = [];
|
|
352
|
-
for (const [name, file] of node.metadataRoutes) {
|
|
680
|
+
for (const [name, file] of Object.entries(node.metadataRoutes)) {
|
|
353
681
|
const v = addImport(file);
|
|
354
682
|
metaEntries.push(
|
|
355
683
|
`${nextIndent} ${JSON.stringify(name)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
|
|
@@ -367,9 +695,11 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
367
695
|
}
|
|
368
696
|
|
|
369
697
|
// Parallel slots
|
|
370
|
-
|
|
698
|
+
const slotKeys = Object.keys(node.slots);
|
|
699
|
+
if (slotKeys.length > 0) {
|
|
371
700
|
const slotEntries: string[] = [];
|
|
372
|
-
for (const
|
|
701
|
+
for (const slotName of slotKeys) {
|
|
702
|
+
const slotNode = node.slots[slotName]!;
|
|
373
703
|
slotEntries.push(
|
|
374
704
|
`${nextIndent} ${JSON.stringify(slotName)}: ${serializeNode(slotNode, nextIndent + ' ')}`
|
|
375
705
|
);
|
|
@@ -391,6 +721,13 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
391
721
|
proxyLine = ` proxy: { load: ${v}, filePath: ${JSON.stringify(tree.proxy.filePath)} },`;
|
|
392
722
|
}
|
|
393
723
|
|
|
724
|
+
// Global error page (Tier 2)
|
|
725
|
+
let globalErrorLine = '';
|
|
726
|
+
if (tree.globalError) {
|
|
727
|
+
const v = addImport(tree.globalError);
|
|
728
|
+
globalErrorLine = ` globalError: { load: ${v}, filePath: ${JSON.stringify(tree.globalError.filePath)} },`;
|
|
729
|
+
}
|
|
730
|
+
|
|
394
731
|
// Interception rewrites — computed at build time from the route tree.
|
|
395
732
|
// Only interceptedPattern and interceptingPrefix are needed at runtime.
|
|
396
733
|
const rewrites = collectInterceptionRewrites(tree.root);
|
|
@@ -406,7 +743,9 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
406
743
|
...imports,
|
|
407
744
|
'',
|
|
408
745
|
'const manifest = {',
|
|
746
|
+
` viteRoot: ${JSON.stringify(viteRoot)},`,
|
|
409
747
|
proxyLine,
|
|
748
|
+
globalErrorLine,
|
|
410
749
|
rewritesLine,
|
|
411
750
|
` root: ${rootSerialized},`,
|
|
412
751
|
'};',
|
|
@@ -13,6 +13,31 @@
|
|
|
13
13
|
|
|
14
14
|
import type { Plugin } from 'vite';
|
|
15
15
|
|
|
16
|
+
// Build-time-only packages that must never be bundled into the runtime
|
|
17
|
+
// server environments. With `noExternal: true` rolldown otherwise follows
|
|
18
|
+
// the transitive graph through the user's `timber.config.ts` (loaded by the
|
|
19
|
+
// `virtual:timber-cache-handler` dynamic import) into adapter code, dragging
|
|
20
|
+
// build tooling into the prod server bundle. The most visible symptom is
|
|
21
|
+
// rolldown trying to parse `fsevents.node` as JS and failing with
|
|
22
|
+
// `[UNLOADABLE_DEPENDENCY] … stream did not contain valid UTF-8`.
|
|
23
|
+
//
|
|
24
|
+
// - `nitro`, `@mdx-js/rollup` — build-time tooling reachable
|
|
25
|
+
// transitively through adapter modules and timber's own MDX activation.
|
|
26
|
+
// - `rollup` — pulled in by nitro and
|
|
27
|
+
// @mdx-js/rollup; declares `fsevents` as an optional native dep.
|
|
28
|
+
// - `fsevents`, `chokidar` — native/optional deps of
|
|
29
|
+
// rollup/vite. They are macOS-only file watchers with no runtime use
|
|
30
|
+
// in a server bundle.
|
|
31
|
+
//
|
|
32
|
+
// Mirrored on both rsc and ssr environments. See TIM-988.
|
|
33
|
+
const BUILD_ONLY_EXTERNALS: string[] = [
|
|
34
|
+
'nitro',
|
|
35
|
+
'rollup',
|
|
36
|
+
'@mdx-js/rollup',
|
|
37
|
+
'fsevents',
|
|
38
|
+
'chokidar',
|
|
39
|
+
];
|
|
40
|
+
|
|
16
41
|
export function timberServerBundle(): Plugin[] {
|
|
17
42
|
const bundlePlugin: Plugin = {
|
|
18
43
|
name: 'timber-server-bundle',
|
|
@@ -80,11 +105,11 @@ export function timberServerBundle(): Plugin[] {
|
|
|
80
105
|
ssr: { target: 'webworker' },
|
|
81
106
|
environments: {
|
|
82
107
|
rsc: {
|
|
83
|
-
resolve: { noExternal: true },
|
|
108
|
+
resolve: { noExternal: true, external: BUILD_ONLY_EXTERNALS },
|
|
84
109
|
define: serverDefine,
|
|
85
110
|
},
|
|
86
111
|
ssr: {
|
|
87
|
-
resolve: { noExternal: true },
|
|
112
|
+
resolve: { noExternal: true, external: BUILD_ONLY_EXTERNALS },
|
|
88
113
|
define: serverDefine,
|
|
89
114
|
},
|
|
90
115
|
},
|
|
@@ -137,5 +162,36 @@ export function timberServerBundle(): Plugin[] {
|
|
|
137
162
|
},
|
|
138
163
|
};
|
|
139
164
|
|
|
140
|
-
|
|
165
|
+
// Fix Rolldown's `createRequire(import.meta.url)` CJS interop shim for
|
|
166
|
+
// Cloudflare Workers. Rolldown emits this for CJS dependencies (e.g.
|
|
167
|
+
// @opentelemetry/context-async-hooks) that use `require()`. On Workers,
|
|
168
|
+
// `import.meta.url` is `undefined` for non-entry modules, causing:
|
|
169
|
+
// TypeError: The argument 'path' must be a file URL object, a file URL
|
|
170
|
+
// string, or an absolute path string. Received 'undefined'
|
|
171
|
+
//
|
|
172
|
+
// The fix: provide a fallback URL when `import.meta.url` is undefined.
|
|
173
|
+
// The actual URL doesn't matter — `createRequire` only needs it for
|
|
174
|
+
// resolving relative paths, but the only `__require()` calls are for
|
|
175
|
+
// Node built-ins (events, async_hooks) which resolve from any base.
|
|
176
|
+
//
|
|
177
|
+
// The top-level `ssr: { target: 'webworker' }` was supposed to prevent
|
|
178
|
+
// this, but it doesn't propagate to custom environments (rsc) in Vite's
|
|
179
|
+
// Environment API. See LOCAL-405.
|
|
180
|
+
const createRequireFixPlugin: Plugin = {
|
|
181
|
+
name: 'timber-create-require-fix',
|
|
182
|
+
applyToEnvironment(environment) {
|
|
183
|
+
return environment.name === 'rsc' || environment.name === 'ssr';
|
|
184
|
+
},
|
|
185
|
+
renderChunk(code) {
|
|
186
|
+
const pattern = 'createRequire(import.meta.url)';
|
|
187
|
+
if (!code.includes(pattern)) return null;
|
|
188
|
+
|
|
189
|
+
return {
|
|
190
|
+
code: code.replace(pattern, 'createRequire(import.meta.url || "file:///app")'),
|
|
191
|
+
map: null,
|
|
192
|
+
};
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
return [bundlePlugin, esmInitFixPlugin, createRequireFixPlugin];
|
|
141
197
|
}
|