@timber-js/app 0.2.0-alpha.12 → 0.2.0-alpha.120
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-Cw-7NfJJ.js +1101 -0
- package/dist/_chunks/actions-Cw-7NfJJ.js.map +1 -0
- package/dist/_chunks/build-output-helper-DhxiT18k.js +61 -0
- package/dist/_chunks/build-output-helper-DhxiT18k.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-XV0I47Gj.js +2 -0
- package/dist/_chunks/cli-schema-sync-q2wB0DyJ.js +358 -0
- package/dist/_chunks/cli-schema-sync-q2wB0DyJ.js.map +1 -0
- package/dist/_chunks/codec-registry-V7ARyeLN.js +21 -0
- package/dist/_chunks/codec-registry-V7ARyeLN.js.map +1 -0
- package/dist/_chunks/define-8zQ8Vm7x.js +195 -0
- package/dist/_chunks/define-8zQ8Vm7x.js.map +1 -0
- package/dist/_chunks/define-zQX6e1tN.js +124 -0
- package/dist/_chunks/define-zQX6e1tN.js.map +1 -0
- package/dist/_chunks/format-CR6v1pWE.js +14 -0
- package/dist/_chunks/format-CR6v1pWE.js.map +1 -0
- package/dist/_chunks/handler-store-iqnt2ghN.js +54 -0
- package/dist/_chunks/handler-store-iqnt2ghN.js.map +1 -0
- package/dist/_chunks/logger-DDmK5skc.js +291 -0
- package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
- package/dist/_chunks/merge-search-params-CwxJzBLS.js +41 -0
- package/dist/_chunks/merge-search-params-CwxJzBLS.js.map +1 -0
- package/dist/_chunks/navigation-root-DKsJ5Di7.js +96 -0
- package/dist/_chunks/navigation-root-DKsJ5Di7.js.map +1 -0
- package/dist/_chunks/registry-Dp_hJL4s.js +20 -0
- package/dist/_chunks/registry-Dp_hJL4s.js.map +1 -0
- package/dist/_chunks/resolve-schema-23Mc8aLi.js +65 -0
- package/dist/_chunks/resolve-schema-23Mc8aLi.js.map +1 -0
- package/dist/_chunks/router-ref-sektkr-t.js +28 -0
- package/dist/_chunks/router-ref-sektkr-t.js.map +1 -0
- package/dist/_chunks/scanner-DmfoB7iK.js +336 -0
- package/dist/_chunks/scanner-DmfoB7iK.js.map +1 -0
- package/dist/_chunks/schema-bridge-eL5vQDSA.js +86 -0
- package/dist/_chunks/schema-bridge-eL5vQDSA.js.map +1 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
- package/dist/_chunks/segment-context-Bg0pFbLT.js +34 -0
- package/dist/_chunks/segment-context-Bg0pFbLT.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BO5OvEvg.js} +1 -1
- package/dist/_chunks/ssr-data-BO5OvEvg.js.map +1 -0
- package/dist/_chunks/stale-reload-BCPRG0Cv.js +64 -0
- package/dist/_chunks/stale-reload-BCPRG0Cv.js.map +1 -0
- package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
- package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-D9SBlAfp.js} +7 -20
- package/dist/_chunks/use-query-states-D9SBlAfp.js.map +1 -0
- package/dist/_chunks/use-segment-params-CskiK-59.js +185 -0
- package/dist/_chunks/use-segment-params-CskiK-59.js.map +1 -0
- package/dist/_chunks/validation-Bm3Je-09.js +84 -0
- package/dist/_chunks/validation-Bm3Je-09.js.map +1 -0
- package/dist/_chunks/walkers-DgOXkTts.js +609 -0
- package/dist/_chunks/walkers-DgOXkTts.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
- package/dist/_chunks/warnings-B30wpfaS.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 +143 -45
- 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 +151 -81
- 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 +37 -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 +42 -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 +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 +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 +9 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +172 -1100
- 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 +964 -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/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-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/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 +51 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +46 -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 +46 -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 +167 -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 +45 -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 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4799 -12730
- 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 +53 -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 +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 +9 -7
- 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-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 +63 -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 +5 -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/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 +95 -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 +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +53 -5
- 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/build-manifest.d.ts +2 -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/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-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- 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 -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-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 +155 -2905
- 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 +2947 -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/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 +52 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +118 -23
- 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 +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 +62 -107
- 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 +21 -34
- 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 +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 +49 -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/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 +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/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-entry.d.ts +30 -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/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 +41 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +49 -4
- 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/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 +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 +56 -16
- package/src/adapters/build-output-helper.ts +77 -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 +142 -59
- package/src/adapters/shared.ts +40 -0
- 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 +33 -0
- package/src/cache/timber-cache.ts +25 -20
- package/src/cli-schema-sync.ts +207 -0
- package/src/cli.ts +65 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +126 -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 +149 -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 +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 +69 -44
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +366 -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 +300 -73
- package/src/client/rsc-fetch.ts +112 -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/state.ts +2 -2
- package/src/client/top-loader.tsx +18 -6
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- 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/client/{use-params.ts → use-segment-params.ts} +8 -6
- package/src/codec.ts +97 -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 +134 -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 +506 -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 +142 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +1 -1
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +233 -0
- package/src/index.ts +409 -357
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +73 -0
- package/src/params/index.ts +11 -0
- package/src/params/resolve-schema.ts +88 -0
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +175 -35
- package/src/plugins/entries.ts +111 -9
- package/src/plugins/fonts.ts +157 -654
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +374 -45
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +109 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +269 -179
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +5 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +308 -0
- package/src/routing/scanner.ts +107 -110
- 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} +57 -20
- 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 +336 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +55 -7
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +10 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +468 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +31 -50
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- 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-injector-core.ts +417 -0
- package/src/server/html-injectors.ts +235 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +176 -0
- package/src/server/logger.ts +67 -36
- 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 +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +176 -0
- package/src/server/pipeline-phases.ts +460 -0
- package/src/server/pipeline.ts +154 -394
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -333
- package/src/server/route-element-builder.ts +309 -195
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +50 -231
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +16 -17
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +137 -12
- package/src/server/rsc-entry/index.ts +316 -352
- package/src/server/rsc-entry/render-route.ts +307 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +187 -38
- 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 +126 -0
- package/src/server/slot-resolver.ts +228 -246
- package/src/server/ssr-entry.ts +229 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +4 -1
- 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 +202 -90
- package/src/server/tree-match.ts +198 -0
- package/src/server/types.ts +55 -6
- package/src/server/utils/escape-html.ts +20 -0
- 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 +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js +0 -108
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- 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/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/transition-root.d.ts.map +0 -1
- 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/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.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/transition-root.tsx +0 -166
- 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/server/response-cache.ts +0 -410
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
package/src/plugins/mdx.ts
CHANGED
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
import type { Plugin } from 'vite';
|
|
12
12
|
import { existsSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
|
-
import
|
|
14
|
+
import { createRequire } from 'node:module';
|
|
15
|
+
import { pathToFileURL } from 'node:url';
|
|
16
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
15
17
|
|
|
16
18
|
const MDX_EXTENSIONS = ['mdx', 'md'];
|
|
17
19
|
|
|
@@ -54,15 +56,49 @@ function shouldActivate(ctx: PluginContext): boolean {
|
|
|
54
56
|
}
|
|
55
57
|
|
|
56
58
|
/**
|
|
57
|
-
* Try to dynamically import a module by name
|
|
58
|
-
*
|
|
59
|
+
* Try to dynamically import a module by name, resolving from the user's
|
|
60
|
+
* project root rather than from `@timber-js/app`'s own location.
|
|
61
|
+
*
|
|
62
|
+
* Why this matters: pnpm only hoists declared (peer) dependencies into a
|
|
63
|
+
* package's resolution scope. The MDX integration's optional companions
|
|
64
|
+
* — `remark-frontmatter`, `remark-mdx-frontmatter`, `@mdx-js/rollup` — are
|
|
65
|
+
* installed as direct deps of the consumer (e.g. `packages/website`), not
|
|
66
|
+
* `@timber-js/app`. A bare `import('remark-frontmatter')` from inside this
|
|
67
|
+
* file resolves against `packages/timber-app/node_modules` and silently
|
|
68
|
+
* fails with `ERR_MODULE_NOT_FOUND`, which made `tryImport` return
|
|
69
|
+
* `undefined` and skipped frontmatter parsing entirely — leaving MDX to
|
|
70
|
+
* choke on YAML as JS expressions (TIM-840).
|
|
71
|
+
*
|
|
72
|
+
* Resolving relative to `projectRoot` (via `createRequire`) makes the
|
|
73
|
+
* lookup walk the consumer's `node_modules` tree first, which is where
|
|
74
|
+
* pnpm puts the user's deps.
|
|
75
|
+
*
|
|
76
|
+
* Returns the default export, the module itself, or undefined if the
|
|
77
|
+
* module is not installed.
|
|
59
78
|
*/
|
|
60
|
-
async function tryImport(name: string): Promise<unknown | undefined> {
|
|
79
|
+
async function tryImport(name: string, projectRoot: string): Promise<unknown | undefined> {
|
|
61
80
|
try {
|
|
62
|
-
|
|
81
|
+
// Anchor resolution at the consumer's package.json so we walk their
|
|
82
|
+
// node_modules tree, not @timber-js/app's. createRequire().resolve()
|
|
83
|
+
// returns an absolute file path that ESM dynamic import accepts when
|
|
84
|
+
// wrapped as a file:// URL.
|
|
85
|
+
const require = createRequire(join(projectRoot, 'package.json'));
|
|
86
|
+
const resolved = require.resolve(name);
|
|
87
|
+
const mod = await import(pathToFileURL(resolved).href);
|
|
63
88
|
return mod.default ?? mod;
|
|
64
89
|
} catch {
|
|
65
|
-
|
|
90
|
+
// Fall back to a bare import — covers the rare case where the package
|
|
91
|
+
// lives next to @timber-js/app (e.g. monorepo with hoisted deps).
|
|
92
|
+
try {
|
|
93
|
+
const mod = await import(name);
|
|
94
|
+
return mod.default ?? mod;
|
|
95
|
+
} catch (e) {
|
|
96
|
+
console.debug(
|
|
97
|
+
`[timber] optional MDX dependency '${name}' not available:`,
|
|
98
|
+
e instanceof Error ? e.message : e
|
|
99
|
+
);
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
66
102
|
}
|
|
67
103
|
}
|
|
68
104
|
|
|
@@ -80,7 +116,7 @@ export function timberMdx(ctx: PluginContext): Plugin {
|
|
|
80
116
|
async function activate(): Promise<void> {
|
|
81
117
|
if (innerPlugin !== null || !shouldActivate(ctx)) return;
|
|
82
118
|
|
|
83
|
-
const createMdxPlugin = (await tryImport('@mdx-js/rollup')) as
|
|
119
|
+
const createMdxPlugin = (await tryImport('@mdx-js/rollup', ctx.root)) as
|
|
84
120
|
| ((options?: Record<string, unknown>) => Plugin)
|
|
85
121
|
| undefined;
|
|
86
122
|
|
|
@@ -99,10 +135,11 @@ export function timberMdx(ctx: PluginContext): Plugin {
|
|
|
99
135
|
|
|
100
136
|
const mdxConfig = ctx.config.mdx ?? {};
|
|
101
137
|
|
|
102
|
-
// Auto-register frontmatter plugins
|
|
138
|
+
// Auto-register frontmatter plugins. Resolve from the consumer's root
|
|
139
|
+
// so pnpm finds packages declared in the user's package.json (TIM-840).
|
|
103
140
|
const remarkPlugins: unknown[] = [];
|
|
104
|
-
const remarkFrontmatter = await tryImport('remark-frontmatter');
|
|
105
|
-
const remarkMdxFrontmatter = await tryImport('remark-mdx-frontmatter');
|
|
141
|
+
const remarkFrontmatter = await tryImport('remark-frontmatter', ctx.root);
|
|
142
|
+
const remarkMdxFrontmatter = await tryImport('remark-mdx-frontmatter', ctx.root);
|
|
106
143
|
if (remarkFrontmatter) remarkPlugins.push(remarkFrontmatter);
|
|
107
144
|
if (remarkMdxFrontmatter) remarkPlugins.push(remarkMdxFrontmatter);
|
|
108
145
|
|
package/src/plugins/routing.ts
CHANGED
|
@@ -10,25 +10,69 @@
|
|
|
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 {
|
|
24
|
+
collectDynamicSegments,
|
|
25
|
+
findSchemaFile,
|
|
26
|
+
parseExistingSchemaKeys,
|
|
27
|
+
} from '../cli-schema-sync.js';
|
|
28
|
+
|
|
29
|
+
import {
|
|
30
|
+
lintConventions,
|
|
31
|
+
checkAppDirExists,
|
|
32
|
+
formatConventionWarnings,
|
|
33
|
+
} from '../routing/convention-lint.js';
|
|
34
|
+
import type { RouteTree, SegmentNode, RouteFile } from '../routing/types.js';
|
|
35
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
23
36
|
|
|
24
37
|
const VIRTUAL_MODULE_ID = 'virtual:timber-route-manifest';
|
|
25
38
|
const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_MODULE_ID}`;
|
|
26
39
|
|
|
40
|
+
// TIM-830: Search-params registry virtual module.
|
|
41
|
+
//
|
|
42
|
+
// Statically imports the `searchParams` named export from every page
|
|
43
|
+
// that exports one, and registers each definition into the shared
|
|
44
|
+
// search-params registry keyed by the un-interpolated route pattern
|
|
45
|
+
// (e.g. '/products/[id]'). This lets `<Link>` serialize flat
|
|
46
|
+
// `Partial<T>` values at runtime without callers importing the
|
|
47
|
+
// definition at the call site.
|
|
48
|
+
//
|
|
49
|
+
// The imports are STATIC (`import { searchParams as r0 } from '...'`)
|
|
50
|
+
// so Vite/Rolldown tree-shakes each page's component body out of the
|
|
51
|
+
// registry chunk — only the `searchParams` named export is pulled in.
|
|
52
|
+
const SEARCH_PARAMS_REGISTRY_ID = 'virtual:timber-search-params-registry';
|
|
53
|
+
const RESOLVED_SEARCH_PARAMS_REGISTRY_ID = `\0${SEARCH_PARAMS_REGISTRY_ID}`;
|
|
54
|
+
|
|
55
|
+
// TIM-931: Schema virtual module.
|
|
56
|
+
//
|
|
57
|
+
// When app/schema.ts exists, this module imports it and resolves the
|
|
58
|
+
// bracket-keyed segmentParams codecs into a bare-name codec map for
|
|
59
|
+
// runtime coercion. When no schema exists, exports null.
|
|
60
|
+
const SCHEMA_ID = 'virtual:timber-schema';
|
|
61
|
+
const RESOLVED_SCHEMA_ID = `\0${SCHEMA_ID}`;
|
|
62
|
+
|
|
63
|
+
// TIM-935: $segment virtual module prefix.
|
|
64
|
+
// Resolved ID encodes segment info as JSON after the prefix.
|
|
65
|
+
//
|
|
66
|
+
// Each route directory gets a virtual module that exports the route
|
|
67
|
+
// and segmentPath. `import { route, segmentPath } from './$segment'`
|
|
68
|
+
// resolves to `\0$segment:<json>`.
|
|
69
|
+
const SEGMENT_PREFIX = '\0$segment:';
|
|
70
|
+
|
|
27
71
|
/**
|
|
28
72
|
* File convention names we track for changes that require manifest regeneration.
|
|
29
73
|
*/
|
|
30
74
|
const ROUTE_FILE_PATTERNS =
|
|
31
|
-
/\/(page|layout|middleware|access|route|error|default|denied|
|
|
75
|
+
/\/(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|twitter-image|apple-icon)\./;
|
|
32
76
|
|
|
33
77
|
/**
|
|
34
78
|
* Create the timber-routing Vite plugin.
|
|
@@ -70,6 +114,7 @@ function writeCodegen(ctx: PluginContext): void {
|
|
|
70
114
|
Promise.all([
|
|
71
115
|
writeFile(routesPath, content, 'utf-8'),
|
|
72
116
|
writeFile(envPath, TIMBER_ENV_DTS, 'utf-8'),
|
|
117
|
+
writeSegmentTypes(ctx.routeTree!, ctx.appDir, ctx.root),
|
|
73
118
|
])
|
|
74
119
|
)
|
|
75
120
|
.catch((err) => {
|
|
@@ -82,20 +127,48 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
82
127
|
/** Track warned files to avoid repeating warnings on rescan. */
|
|
83
128
|
const warnedFiles = new Set<string>();
|
|
84
129
|
|
|
130
|
+
/** Maps absolute filesystem directory → segment info for $segment resolution. */
|
|
131
|
+
let dirToRoute: Map<string, SegmentInfo> = new Map();
|
|
132
|
+
|
|
85
133
|
function rescan(): void {
|
|
134
|
+
// Check app/ directory exists before scanning
|
|
135
|
+
const appDirWarning = checkAppDirExists(ctx.appDir);
|
|
136
|
+
if (appDirWarning) {
|
|
137
|
+
const formatted = formatConventionWarnings([appDirWarning]);
|
|
138
|
+
if (formatted) process.stderr.write(`${formatted}\n`);
|
|
139
|
+
// Still create an empty tree so the rest of the pipeline doesn't crash
|
|
140
|
+
ctx.routeTree = {
|
|
141
|
+
root: {
|
|
142
|
+
segmentName: '',
|
|
143
|
+
segmentType: 'static',
|
|
144
|
+
urlPath: '/',
|
|
145
|
+
children: [],
|
|
146
|
+
slots: {},
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
86
152
|
ctx.timer.start('route-scan');
|
|
87
153
|
ctx.routeTree = scanRoutes(ctx.appDir, {
|
|
88
154
|
pageExtensions: ctx.config.pageExtensions,
|
|
89
155
|
});
|
|
90
156
|
ctx.timer.end('route-scan');
|
|
157
|
+
dirToRoute = buildDirToRouteMap(ctx.routeTree, ctx.appDir);
|
|
91
158
|
writeCodegen(ctx);
|
|
92
159
|
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
160
|
+
// Dev: warn about dynamic segments not registered in app/schema.ts.
|
|
161
|
+
// Only logs a suggestion, never auto-modifies the schema file.
|
|
162
|
+
// See design/41-global-params.md §Auto-Scaffolding
|
|
163
|
+
warnUnregisteredSegments(ctx);
|
|
164
|
+
|
|
165
|
+
// Lint conventions (empty app, missing methods, missing root layout)
|
|
166
|
+
const conventionWarnings = lintConventions(ctx.routeTree, ctx.appDir);
|
|
167
|
+
const newConventionWarnings = conventionWarnings.filter((w) => !warnedFiles.has(w.id));
|
|
168
|
+
if (newConventionWarnings.length > 0) {
|
|
169
|
+
for (const w of newConventionWarnings) warnedFiles.add(w.id);
|
|
170
|
+
const formatted = formatConventionWarnings(newConventionWarnings);
|
|
171
|
+
if (formatted) process.stderr.write(`${formatted}\n`);
|
|
99
172
|
}
|
|
100
173
|
}
|
|
101
174
|
|
|
@@ -110,7 +183,7 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
110
183
|
* - <root>/virtual:timber-route-manifest (Vite SSR build root prefix)
|
|
111
184
|
* - \0virtual:timber-route-manifest (RSC plugin re-imports)
|
|
112
185
|
*/
|
|
113
|
-
resolveId(id: string) {
|
|
186
|
+
resolveId(id: string, importer?: string) {
|
|
114
187
|
// Strip \0 prefix if present (RSC plugin generates these)
|
|
115
188
|
const cleanId = id.startsWith('\0') ? id.slice(1) : id;
|
|
116
189
|
|
|
@@ -123,6 +196,35 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
123
196
|
return RESOLVED_VIRTUAL_ID;
|
|
124
197
|
}
|
|
125
198
|
|
|
199
|
+
// TIM-830: Search-params registry virtual module
|
|
200
|
+
if (
|
|
201
|
+
cleanId === SEARCH_PARAMS_REGISTRY_ID ||
|
|
202
|
+
cleanId.endsWith(`/${SEARCH_PARAMS_REGISTRY_ID}`)
|
|
203
|
+
) {
|
|
204
|
+
return RESOLVED_SEARCH_PARAMS_REGISTRY_ID;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// TIM-931: Schema virtual module
|
|
208
|
+
if (cleanId === SCHEMA_ID || cleanId.endsWith(`/${SCHEMA_ID}`)) {
|
|
209
|
+
return RESOLVED_SCHEMA_ID;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// TIM-935: $segment virtual module.
|
|
213
|
+
// Resolves `import { route } from './$segment'` based on the
|
|
214
|
+
// importing file's directory in the app/ tree.
|
|
215
|
+
if (
|
|
216
|
+
importer &&
|
|
217
|
+
(cleanId === './$segment' || cleanId === './$segment.js' || cleanId === './$segment.ts')
|
|
218
|
+
) {
|
|
219
|
+
// Strip \0 prefix from importer if present
|
|
220
|
+
const cleanImporter = importer.startsWith('\0') ? importer.slice(1) : importer;
|
|
221
|
+
const importerDir = cleanImporter.substring(0, cleanImporter.lastIndexOf('/'));
|
|
222
|
+
const segmentInfo = dirToRoute.get(importerDir);
|
|
223
|
+
if (segmentInfo !== undefined) {
|
|
224
|
+
return `${SEGMENT_PREFIX}${JSON.stringify(segmentInfo)}`;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
126
228
|
return null;
|
|
127
229
|
},
|
|
128
230
|
|
|
@@ -133,14 +235,36 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
133
235
|
* with absolute import paths for all file references.
|
|
134
236
|
*/
|
|
135
237
|
load(id: string) {
|
|
136
|
-
if (id
|
|
238
|
+
if (id === RESOLVED_VIRTUAL_ID) {
|
|
239
|
+
// If routeTree hasn't been built yet (shouldn't happen), scan now
|
|
240
|
+
if (!ctx.routeTree) {
|
|
241
|
+
rescan();
|
|
242
|
+
}
|
|
243
|
+
return generateManifestModule(ctx.routeTree!, ctx.root);
|
|
244
|
+
}
|
|
137
245
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
246
|
+
if (id === RESOLVED_SEARCH_PARAMS_REGISTRY_ID) {
|
|
247
|
+
if (!ctx.routeTree) {
|
|
248
|
+
rescan();
|
|
249
|
+
}
|
|
250
|
+
return generateSearchParamsRegistryModule(ctx.routeTree!);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (id === RESOLVED_SCHEMA_ID) {
|
|
254
|
+
return generateSchemaModule(ctx.appDir);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// TIM-935: $segment virtual module — exports route and segmentPath.
|
|
258
|
+
if (id.startsWith(SEGMENT_PREFIX)) {
|
|
259
|
+
const info: SegmentInfo = JSON.parse(id.slice(SEGMENT_PREFIX.length));
|
|
260
|
+
return [
|
|
261
|
+
`export const ROUTE = ${JSON.stringify(info.route)};`,
|
|
262
|
+
`export const SEGMENT_PATH = ${JSON.stringify(info.segmentPath)};`,
|
|
263
|
+
'',
|
|
264
|
+
].join('\n');
|
|
141
265
|
}
|
|
142
266
|
|
|
143
|
-
return
|
|
267
|
+
return null;
|
|
144
268
|
},
|
|
145
269
|
|
|
146
270
|
/**
|
|
@@ -168,20 +292,49 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
168
292
|
// Watch the app directory
|
|
169
293
|
devServer.watcher.add(ctx.appDir);
|
|
170
294
|
|
|
171
|
-
|
|
172
|
-
|
|
295
|
+
/** Snapshot of the last generated manifest, used to detect structural changes. */
|
|
296
|
+
let lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Handle a route-significant file being added or removed.
|
|
300
|
+
* Always triggers a full-reload since the route tree structure changed.
|
|
301
|
+
*/
|
|
302
|
+
const handleStructuralChange = (filePath: string) => {
|
|
173
303
|
if (!filePath.startsWith(ctx.appDir)) return;
|
|
174
304
|
if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
|
|
175
305
|
|
|
176
|
-
// Rescan the route tree
|
|
177
306
|
rescan();
|
|
178
|
-
|
|
179
|
-
// Invalidate the virtual module in all environments
|
|
307
|
+
lastManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
|
|
180
308
|
invalidateManifest(devServer);
|
|
181
309
|
};
|
|
182
310
|
|
|
183
|
-
|
|
184
|
-
|
|
311
|
+
/**
|
|
312
|
+
* Handle a route file's content changing.
|
|
313
|
+
*
|
|
314
|
+
* Most content edits (JSX changes, fixing typos) don't affect route
|
|
315
|
+
* metadata — Vite's React Fast Refresh handles those via normal HMR.
|
|
316
|
+
* Only rescan and full-reload when route metadata actually changed
|
|
317
|
+
* (e.g., searchParams export added/removed, metadata export changed).
|
|
318
|
+
*/
|
|
319
|
+
const handleContentChange = (filePath: string) => {
|
|
320
|
+
if (!filePath.startsWith(ctx.appDir)) return;
|
|
321
|
+
if (!ROUTE_FILE_PATTERNS.test(filePath)) return;
|
|
322
|
+
|
|
323
|
+
rescan();
|
|
324
|
+
const newManifest = ctx.routeTree ? generateManifestModule(ctx.routeTree, ctx.root) : '';
|
|
325
|
+
if (newManifest !== lastManifest) {
|
|
326
|
+
lastManifest = newManifest;
|
|
327
|
+
invalidateManifest(devServer);
|
|
328
|
+
}
|
|
329
|
+
// Otherwise: content edit didn't change route metadata — let Vite HMR handle it
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
devServer.watcher.on('add', handleStructuralChange);
|
|
333
|
+
devServer.watcher.on('unlink', handleStructuralChange);
|
|
334
|
+
// Watch content changes to page files — searchParams detection depends
|
|
335
|
+
// on file contents (export const searchParams), not just file presence.
|
|
336
|
+
// But only full-reload when route metadata actually changes.
|
|
337
|
+
devServer.watcher.on('change', handleContentChange);
|
|
185
338
|
// Also watch renames (which are add+unlink) — handled by the above
|
|
186
339
|
},
|
|
187
340
|
};
|
|
@@ -193,14 +346,57 @@ export function timberRouting(ctx: PluginContext): Plugin {
|
|
|
193
346
|
* When the route tree changes, any environment that has imported the manifest
|
|
194
347
|
* needs to be invalidated so the next request/transform picks up the new tree.
|
|
195
348
|
*/
|
|
349
|
+
/** Set of segments we've already warned about — avoid repeating on every rescan. */
|
|
350
|
+
const _warnedSegments = new Set<string>();
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Warn about dynamic segments not registered in app/schema.ts.
|
|
354
|
+
* Only fires when a schema file exists. Logs once per segment per session.
|
|
355
|
+
*/
|
|
356
|
+
function warnUnregisteredSegments(ctx: PluginContext): void {
|
|
357
|
+
const schemaPath = findSchemaFile(ctx.appDir);
|
|
358
|
+
if (!schemaPath) return;
|
|
359
|
+
|
|
360
|
+
const filesystemSegments = collectDynamicSegments(ctx.appDir);
|
|
361
|
+
if (filesystemSegments.length === 0) return;
|
|
362
|
+
|
|
363
|
+
const content = readFileSync(schemaPath, 'utf-8');
|
|
364
|
+
const existingKeys = parseExistingSchemaKeys(content);
|
|
365
|
+
const missing = filesystemSegments.filter(
|
|
366
|
+
(seg) => !existingKeys.includes(seg) && !_warnedSegments.has(seg)
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
if (missing.length === 0) return;
|
|
370
|
+
|
|
371
|
+
for (const seg of missing) _warnedSegments.add(seg);
|
|
372
|
+
|
|
373
|
+
console.warn(
|
|
374
|
+
`[timber] New segment${missing.length > 1 ? 's' : ''} not in schema: ${missing.join(', ')}\n` +
|
|
375
|
+
` Run: timber schema sync`
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
|
|
196
379
|
function invalidateManifest(server: ViteDevServer): void {
|
|
197
380
|
for (const envName of Object.keys(server.environments)) {
|
|
198
381
|
const env = server.environments[envName];
|
|
199
382
|
if (!env?.moduleGraph) continue;
|
|
200
383
|
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
384
|
+
for (const virtualId of [
|
|
385
|
+
RESOLVED_VIRTUAL_ID,
|
|
386
|
+
RESOLVED_SEARCH_PARAMS_REGISTRY_ID,
|
|
387
|
+
RESOLVED_SCHEMA_ID,
|
|
388
|
+
]) {
|
|
389
|
+
const mod = env.moduleGraph.getModuleById(virtualId);
|
|
390
|
+
if (mod) {
|
|
391
|
+
env.moduleGraph.invalidateModule(mod);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// TIM-935: Invalidate all $segment virtual modules (prefixed \0$segment:)
|
|
396
|
+
for (const mod of env.moduleGraph.idToModuleMap.values()) {
|
|
397
|
+
if (mod.id?.startsWith(SEGMENT_PREFIX)) {
|
|
398
|
+
env.moduleGraph.invalidateModule(mod);
|
|
399
|
+
}
|
|
204
400
|
}
|
|
205
401
|
}
|
|
206
402
|
|
|
@@ -208,13 +404,132 @@ function invalidateManifest(server: ViteDevServer): void {
|
|
|
208
404
|
server.hot.send({ type: 'full-reload' });
|
|
209
405
|
}
|
|
210
406
|
|
|
407
|
+
/**
|
|
408
|
+
* TIM-830: Walk the route tree and collect every page that exports a
|
|
409
|
+
* `searchParams` definition, then emit a module that statically imports
|
|
410
|
+
* each export and registers it into the shared search-params registry.
|
|
411
|
+
*
|
|
412
|
+
* Keys use the un-interpolated route pattern (e.g. '/products/[id]') so
|
|
413
|
+
* <Link> can look up the definition from the original `href` prop before
|
|
414
|
+
* segmentParams are interpolated.
|
|
415
|
+
*/
|
|
416
|
+
/** Schema file extensions to check, in priority order. */
|
|
417
|
+
const SCHEMA_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* TIM-931: Generate the virtual:timber-schema module.
|
|
421
|
+
*
|
|
422
|
+
* When app/schema.{ts,tsx,js,jsx} exists, generates a module that
|
|
423
|
+
* imports the schema and resolves its segmentParams codecs into a
|
|
424
|
+
* bare-name codec map for runtime coercion.
|
|
425
|
+
*
|
|
426
|
+
* When no schema exists, exports null.
|
|
427
|
+
*/
|
|
428
|
+
function generateSchemaModule(appDir: string): string {
|
|
429
|
+
let schemaPath: string | null = null;
|
|
430
|
+
for (const ext of SCHEMA_EXTENSIONS) {
|
|
431
|
+
const candidate = join(appDir, `schema${ext}`);
|
|
432
|
+
if (existsSync(candidate)) {
|
|
433
|
+
schemaPath = candidate;
|
|
434
|
+
break;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
if (!schemaPath) {
|
|
439
|
+
return [
|
|
440
|
+
'// Auto-generated schema loader — no app/schema.ts found.',
|
|
441
|
+
'export default null;',
|
|
442
|
+
].join('\n');
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
return [
|
|
446
|
+
'// Auto-generated schema loader — do not edit.',
|
|
447
|
+
'// Generated by timber-routing plugin (TIM-931).',
|
|
448
|
+
'',
|
|
449
|
+
`import schema from ${JSON.stringify(schemaPath)};`,
|
|
450
|
+
`import { resolveSchemaCodecs } from '@timber-js/app/params';`,
|
|
451
|
+
'',
|
|
452
|
+
'const globalCodecs = schema?.segmentParams',
|
|
453
|
+
' ? resolveSchemaCodecs(schema.segmentParams)',
|
|
454
|
+
' : null;',
|
|
455
|
+
'',
|
|
456
|
+
'export default globalCodecs;',
|
|
457
|
+
].join('\n');
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
function generateSearchParamsRegistryModule(tree: RouteTree): string {
|
|
461
|
+
const entries: Array<{ urlPath: string; filePath: string }> = [];
|
|
462
|
+
|
|
463
|
+
function walk(node: SegmentNode): void {
|
|
464
|
+
// params.ts is the canonical location for `export const searchParams`;
|
|
465
|
+
// page.tsx is the legacy fallback (see codegen.ts `collectRoutes`).
|
|
466
|
+
if (node.page) {
|
|
467
|
+
if (node.params && fileHasSearchParamsExport(node.params.filePath)) {
|
|
468
|
+
entries.push({ urlPath: node.urlPath, filePath: node.params.filePath });
|
|
469
|
+
} else if (fileHasSearchParamsExport(node.page.filePath)) {
|
|
470
|
+
entries.push({ urlPath: node.urlPath, filePath: node.page.filePath });
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
for (const child of node.children) walk(child);
|
|
474
|
+
for (const slot of Object.values(node.slots)) walk(slot);
|
|
475
|
+
}
|
|
476
|
+
walk(tree.root);
|
|
477
|
+
|
|
478
|
+
// Deterministic order for stable output / snapshots
|
|
479
|
+
entries.sort((a, b) => a.urlPath.localeCompare(b.urlPath));
|
|
480
|
+
|
|
481
|
+
const lines: string[] = [];
|
|
482
|
+
lines.push('// Auto-generated search-params registry — do not edit.');
|
|
483
|
+
lines.push('// Generated by timber-routing plugin (TIM-830).');
|
|
484
|
+
lines.push('');
|
|
485
|
+
lines.push("import { registerSearchParams } from '@timber-js/app/search-params';");
|
|
486
|
+
lines.push('');
|
|
487
|
+
|
|
488
|
+
// Static imports — Vite/Rolldown tree-shakes the page component body out
|
|
489
|
+
// of this chunk, leaving only the `searchParams` named export.
|
|
490
|
+
entries.forEach((entry, i) => {
|
|
491
|
+
lines.push(`import { searchParams as r${i} } from ${JSON.stringify(entry.filePath)};`);
|
|
492
|
+
});
|
|
493
|
+
lines.push('');
|
|
494
|
+
|
|
495
|
+
entries.forEach((entry, i) => {
|
|
496
|
+
lines.push(`registerSearchParams(${JSON.stringify(entry.urlPath)}, r${i});`);
|
|
497
|
+
});
|
|
498
|
+
lines.push('');
|
|
499
|
+
|
|
500
|
+
// Exporting an empty object keeps the module a real ESM module even
|
|
501
|
+
// when there are zero entries (no top-level imports in that case).
|
|
502
|
+
lines.push('export {};');
|
|
503
|
+
lines.push('');
|
|
504
|
+
|
|
505
|
+
return lines.join('\n');
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Lightweight check for a `searchParams` named export. Mirrors
|
|
510
|
+
* `fileHasExport('searchParams')` in routing/codegen.ts so we stay
|
|
511
|
+
* in sync with what the type codegen detects.
|
|
512
|
+
*/
|
|
513
|
+
function fileHasSearchParamsExport(filePath: string): boolean {
|
|
514
|
+
try {
|
|
515
|
+
if (!existsSync(filePath)) return false;
|
|
516
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
517
|
+
return (
|
|
518
|
+
/export\s+(const|let|var)\s+searchParams\b/.test(content) ||
|
|
519
|
+
/export\s*\{[^}]*\bsearchParams\b[^}]*\}/.test(content)
|
|
520
|
+
);
|
|
521
|
+
} catch {
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
211
526
|
/**
|
|
212
527
|
* Generate the virtual module source code for the route manifest.
|
|
213
528
|
*
|
|
214
529
|
* The output is a default-exported object containing the serialized route tree.
|
|
215
530
|
* All file references use absolute paths (required for virtual modules).
|
|
216
531
|
*/
|
|
217
|
-
function generateManifestModule(tree: RouteTree): string {
|
|
532
|
+
function generateManifestModule(tree: RouteTree, viteRoot: string): string {
|
|
218
533
|
const imports: string[] = [];
|
|
219
534
|
let importIndex = 0;
|
|
220
535
|
|
|
@@ -301,17 +616,20 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
301
616
|
`${nextIndent}denied: { load: ${v}, filePath: ${JSON.stringify(node.denied.filePath)} },`
|
|
302
617
|
);
|
|
303
618
|
}
|
|
304
|
-
if (node.
|
|
305
|
-
const v = addImport(node.
|
|
619
|
+
if (node.params) {
|
|
620
|
+
const v = addImport(node.params);
|
|
306
621
|
parts.push(
|
|
307
|
-
`${nextIndent}
|
|
622
|
+
`${nextIndent}params: { load: ${v}, filePath: ${JSON.stringify(node.params.filePath)} },`
|
|
308
623
|
);
|
|
309
624
|
}
|
|
625
|
+
// searchParams is now a named export from page.tsx, not a separate file.
|
|
626
|
+
// The page module's searchParams export is loaded via the page's lazy import.
|
|
627
|
+
// Runtime registration happens in the route loader using the page module.
|
|
310
628
|
|
|
311
629
|
// Status-code files
|
|
312
|
-
if (node.statusFiles && node.statusFiles.
|
|
630
|
+
if (node.statusFiles && Object.keys(node.statusFiles).length > 0) {
|
|
313
631
|
const statusEntries: string[] = [];
|
|
314
|
-
for (const [code, file] of node.statusFiles) {
|
|
632
|
+
for (const [code, file] of Object.entries(node.statusFiles)) {
|
|
315
633
|
const v = addImport(file);
|
|
316
634
|
statusEntries.push(
|
|
317
635
|
`${nextIndent} ${JSON.stringify(code)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
|
|
@@ -321,9 +639,9 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
321
639
|
}
|
|
322
640
|
|
|
323
641
|
// JSON status-code files
|
|
324
|
-
if (node.jsonStatusFiles && node.jsonStatusFiles.
|
|
642
|
+
if (node.jsonStatusFiles && Object.keys(node.jsonStatusFiles).length > 0) {
|
|
325
643
|
const jsonEntries: string[] = [];
|
|
326
|
-
for (const [code, file] of node.jsonStatusFiles) {
|
|
644
|
+
for (const [code, file] of Object.entries(node.jsonStatusFiles)) {
|
|
327
645
|
const v = addImport(file);
|
|
328
646
|
jsonEntries.push(
|
|
329
647
|
`${nextIndent} ${JSON.stringify(code)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
|
|
@@ -333,9 +651,9 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
333
651
|
}
|
|
334
652
|
|
|
335
653
|
// Legacy status files
|
|
336
|
-
if (node.legacyStatusFiles && node.legacyStatusFiles.
|
|
654
|
+
if (node.legacyStatusFiles && Object.keys(node.legacyStatusFiles).length > 0) {
|
|
337
655
|
const legacyEntries: string[] = [];
|
|
338
|
-
for (const [name, file] of node.legacyStatusFiles) {
|
|
656
|
+
for (const [name, file] of Object.entries(node.legacyStatusFiles)) {
|
|
339
657
|
const v = addImport(file);
|
|
340
658
|
legacyEntries.push(
|
|
341
659
|
`${nextIndent} ${JSON.stringify(name)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
|
|
@@ -347,9 +665,9 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
347
665
|
}
|
|
348
666
|
|
|
349
667
|
// Metadata route files (sitemap.ts, robots.ts, icon.tsx, etc.)
|
|
350
|
-
if (node.metadataRoutes && node.metadataRoutes.
|
|
668
|
+
if (node.metadataRoutes && Object.keys(node.metadataRoutes).length > 0) {
|
|
351
669
|
const metaEntries: string[] = [];
|
|
352
|
-
for (const [name, file] of node.metadataRoutes) {
|
|
670
|
+
for (const [name, file] of Object.entries(node.metadataRoutes)) {
|
|
353
671
|
const v = addImport(file);
|
|
354
672
|
metaEntries.push(
|
|
355
673
|
`${nextIndent} ${JSON.stringify(name)}: { load: ${v}, filePath: ${JSON.stringify(file.filePath)} }`
|
|
@@ -367,9 +685,11 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
367
685
|
}
|
|
368
686
|
|
|
369
687
|
// Parallel slots
|
|
370
|
-
|
|
688
|
+
const slotKeys = Object.keys(node.slots);
|
|
689
|
+
if (slotKeys.length > 0) {
|
|
371
690
|
const slotEntries: string[] = [];
|
|
372
|
-
for (const
|
|
691
|
+
for (const slotName of slotKeys) {
|
|
692
|
+
const slotNode = node.slots[slotName]!;
|
|
373
693
|
slotEntries.push(
|
|
374
694
|
`${nextIndent} ${JSON.stringify(slotName)}: ${serializeNode(slotNode, nextIndent + ' ')}`
|
|
375
695
|
);
|
|
@@ -391,6 +711,13 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
391
711
|
proxyLine = ` proxy: { load: ${v}, filePath: ${JSON.stringify(tree.proxy.filePath)} },`;
|
|
392
712
|
}
|
|
393
713
|
|
|
714
|
+
// Global error page (Tier 2)
|
|
715
|
+
let globalErrorLine = '';
|
|
716
|
+
if (tree.globalError) {
|
|
717
|
+
const v = addImport(tree.globalError);
|
|
718
|
+
globalErrorLine = ` globalError: { load: ${v}, filePath: ${JSON.stringify(tree.globalError.filePath)} },`;
|
|
719
|
+
}
|
|
720
|
+
|
|
394
721
|
// Interception rewrites — computed at build time from the route tree.
|
|
395
722
|
// Only interceptedPattern and interceptingPrefix are needed at runtime.
|
|
396
723
|
const rewrites = collectInterceptionRewrites(tree.root);
|
|
@@ -406,7 +733,9 @@ function generateManifestModule(tree: RouteTree): string {
|
|
|
406
733
|
...imports,
|
|
407
734
|
'',
|
|
408
735
|
'const manifest = {',
|
|
736
|
+
` viteRoot: ${JSON.stringify(viteRoot)},`,
|
|
409
737
|
proxyLine,
|
|
738
|
+
globalErrorLine,
|
|
410
739
|
rewritesLine,
|
|
411
740
|
` root: ${rootSerialized},`,
|
|
412
741
|
'};',
|