@timber-js/app 0.2.0-alpha.14 → 0.2.0-alpha.141
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/actions-DzFMnUAR.js +1147 -0
- package/dist/_chunks/actions-DzFMnUAR.js.map +1 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js +785 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DH-M8Poy.js +2 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-C3RvHQPK.js +195 -0
- package/dist/_chunks/define-C3RvHQPK.js.map +1 -0
- package/dist/_chunks/define-DMVhsipD.js +112 -0
- package/dist/_chunks/define-DMVhsipD.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/handler-store-DjISKYEB.js +54 -0
- package/dist/_chunks/handler-store-DjISKYEB.js.map +1 -0
- package/dist/_chunks/href-validation-EZktELp8.js +124 -0
- package/dist/_chunks/href-validation-EZktELp8.js.map +1 -0
- package/dist/_chunks/logger-Dt-jQaBO.js +291 -0
- package/dist/_chunks/logger-Dt-jQaBO.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BjepjefT.js} +32 -19
- package/dist/_chunks/metadata-routes-BjepjefT.js.map +1 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js +103 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js +77 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js +86 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js.map +1 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/tracing-M_zKubhk.js +358 -0
- package/dist/_chunks/tracing-M_zKubhk.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
- package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/validation-taUkvA4Q.js +113 -0
- package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
- package/dist/_chunks/walkers-7FBPM-hX.js +724 -0
- package/dist/_chunks/walkers-7FBPM-hX.js.map +1 -0
- package/dist/_chunks/{format-RyoGQL74.js → warnings-CNPXaypM.js} +6 -45
- package/dist/_chunks/warnings-CNPXaypM.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +154 -48
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +165 -117
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +39 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +48 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +26 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +29 -6
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +183 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +925 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +65 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +27 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +14 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +79 -10
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +46 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +3 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +7 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +251 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +172 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5315 -12687
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +114 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +20 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +31 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/client-chunks.d.ts +39 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +18 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +60 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -14
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +70 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +8 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +1 -1
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3126 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +111 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +74 -20
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +28 -2
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +50 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +12 -5
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +5 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +38 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +63 -22
- package/src/adapters/build-output-helper.ts +139 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +147 -60
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +39 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/timber-cache.ts +52 -24
- package/src/cli-schema-sync.ts +295 -0
- package/src/cli.ts +76 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +125 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +153 -0
- package/src/client/browser-entry/index.ts +151 -0
- package/src/client/browser-entry/post-hydration.ts +113 -0
- package/src/client/browser-entry/router-init.ts +219 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +116 -0
- package/src/client/link.tsx +343 -150
- package/src/client/nav-link-store.ts +37 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +338 -0
- package/src/client/navigation-context.ts +35 -7
- package/src/client/navigation-root.tsx +347 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +418 -128
- package/src/client/rsc-fetch.ts +208 -10
- package/src/client/segment-cache.ts +6 -3
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +26 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +507 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +131 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +3 -3
- package/src/fonts/pipeline.ts +337 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +235 -0
- package/src/index.ts +415 -345
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +116 -0
- package/src/plugin-context.ts +247 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/cache.ts +180 -0
- package/src/plugins/client-chunks.ts +113 -0
- package/src/plugins/cloudflare-wasm.ts +103 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +179 -37
- package/src/plugins/entries.ts +110 -8
- package/src/plugins/fonts.ts +167 -655
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +386 -47
- package/src/plugins/server-bundle.ts +59 -3
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +321 -177
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +310 -0
- package/src/routing/scanner.ts +165 -110
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +60 -22
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +309 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +34 -26
- package/src/server/als-registry.ts +108 -20
- package/src/server/asset-headers.ts +8 -34
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +17 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +473 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +32 -52
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +35 -27
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +101 -5
- package/src/server/html-injector-core.ts +418 -0
- package/src/server/html-injectors.ts +238 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +182 -0
- package/src/server/logger.ts +67 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +32 -18
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +527 -0
- package/src/server/pipeline.ts +201 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +130 -46
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +437 -208
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +128 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/error-renderer.ts +316 -89
- package/src/server/rsc-entry/helpers.ts +155 -26
- package/src/server/rsc-entry/index.ts +283 -329
- package/src/server/rsc-entry/render-route.ts +313 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -22
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +271 -41
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +148 -0
- package/src/server/slot-resolver.ts +234 -246
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +217 -78
- package/src/server/ssr-render.ts +344 -71
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +210 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/href-validation.ts +127 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/LICENSE +0 -8
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -0,0 +1,785 @@
|
|
|
1
|
+
import { a as isDynamicMetadataExtension, n as classifyMetadataRoute } from "./metadata-routes-BjepjefT.js";
|
|
2
|
+
import { r as DEFAULT_PAGE_EXTENSIONS, t as classifySegment } from "./segment-classify-CDDRVKs7.js";
|
|
3
|
+
import { h as swallow } from "./logger-Dt-jQaBO.js";
|
|
4
|
+
import { basename, extname, join } from "node:path";
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
|
+
import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { performance } from "node:perf_hooks";
|
|
8
|
+
//#region src/routing/scanner.ts
|
|
9
|
+
/**
|
|
10
|
+
* Route discovery scanner.
|
|
11
|
+
*
|
|
12
|
+
* Pure function: (appDir, config) → RouteTree
|
|
13
|
+
*
|
|
14
|
+
* Scans the app/ directory and builds a segment tree recognizing all
|
|
15
|
+
* timber.js file conventions. Does NOT handle request matching — this
|
|
16
|
+
* is discovery only.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Pattern matching encoded path delimiters that must be rejected during route discovery.
|
|
20
|
+
* %2F / %2f (forward slash) and %5C / %5c (backslash) can cause route collisions
|
|
21
|
+
* when decoded. See design/13-security.md §"Encoded separators rejected".
|
|
22
|
+
*/
|
|
23
|
+
var ENCODED_SEPARATOR_PATTERN = /%(?:2[fF]|5[cC])/;
|
|
24
|
+
/**
|
|
25
|
+
* Pattern matching encoded null bytes (%00) that must be rejected.
|
|
26
|
+
* See design/13-security.md §"Null bytes rejected".
|
|
27
|
+
*/
|
|
28
|
+
var ENCODED_NULL_PATTERN = /%00/;
|
|
29
|
+
/**
|
|
30
|
+
* File convention names that use pageExtensions (can be .tsx, .ts, .jsx, .js, .mdx, etc.)
|
|
31
|
+
*/
|
|
32
|
+
var PAGE_EXT_CONVENTIONS = new Set([
|
|
33
|
+
"page",
|
|
34
|
+
"layout",
|
|
35
|
+
"error",
|
|
36
|
+
"default",
|
|
37
|
+
"denied"
|
|
38
|
+
]);
|
|
39
|
+
/**
|
|
40
|
+
* Legacy compat status-code files.
|
|
41
|
+
* Maps legacy file name → HTTP status code for the fallback chain.
|
|
42
|
+
* See design/10-error-handling.md §"Fallback Chain".
|
|
43
|
+
*/
|
|
44
|
+
var LEGACY_STATUS_FILES = {
|
|
45
|
+
"not-found": 404,
|
|
46
|
+
"forbidden": 403,
|
|
47
|
+
"unauthorized": 401
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* File convention names that are always .ts/.tsx (never .mdx etc.)
|
|
51
|
+
*/
|
|
52
|
+
var FIXED_CONVENTIONS = new Set([
|
|
53
|
+
"middleware",
|
|
54
|
+
"access",
|
|
55
|
+
"route",
|
|
56
|
+
"params"
|
|
57
|
+
]);
|
|
58
|
+
/**
|
|
59
|
+
* Status-code file patterns:
|
|
60
|
+
* - Exact 3-digit codes: 401.tsx, 429.tsx, 503.tsx
|
|
61
|
+
* - Category catch-alls: 4xx.tsx, 5xx.tsx
|
|
62
|
+
*/
|
|
63
|
+
var STATUS_CODE_PATTERN = /^(\d{3}|[45]xx)$/;
|
|
64
|
+
/**
|
|
65
|
+
* Scan the app/ directory and build the route tree.
|
|
66
|
+
*
|
|
67
|
+
* @param appDir - Absolute path to the app/ directory
|
|
68
|
+
* @param config - Scanner configuration
|
|
69
|
+
* @returns The complete route tree
|
|
70
|
+
*/
|
|
71
|
+
function scanRoutes(appDir, config = {}) {
|
|
72
|
+
const pageExtensions = config.pageExtensions ?? DEFAULT_PAGE_EXTENSIONS;
|
|
73
|
+
const extSet = new Set(pageExtensions);
|
|
74
|
+
const tree = { root: createSegmentNode("", "static", "/") };
|
|
75
|
+
const proxyFile = findFixedFile(appDir, "proxy");
|
|
76
|
+
if (proxyFile) tree.proxy = proxyFile;
|
|
77
|
+
const globalErrorFile = findPageExtFile(appDir, "global-error", extSet);
|
|
78
|
+
if (globalErrorFile) tree.globalError = globalErrorFile;
|
|
79
|
+
scanSegmentFiles(appDir, tree.root, extSet);
|
|
80
|
+
scanChildren(appDir, tree.root, extSet);
|
|
81
|
+
validateRouteGroupCollisions(tree.root);
|
|
82
|
+
validateDuplicateParamNames(tree.root);
|
|
83
|
+
validateUniqueBracketForms(tree.root);
|
|
84
|
+
return tree;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create an empty segment node.
|
|
88
|
+
*/
|
|
89
|
+
function createSegmentNode(segmentName, segmentType, urlPath, paramName, interceptionMarker, interceptedSegmentName) {
|
|
90
|
+
return {
|
|
91
|
+
segmentName,
|
|
92
|
+
segmentType,
|
|
93
|
+
urlPath,
|
|
94
|
+
paramName,
|
|
95
|
+
interceptionMarker,
|
|
96
|
+
interceptedSegmentName,
|
|
97
|
+
children: [],
|
|
98
|
+
slots: {}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Compute the URL path for a child segment given its parent's URL path.
|
|
103
|
+
* Route groups, slots, and intercepting routes do NOT add URL depth.
|
|
104
|
+
*/
|
|
105
|
+
function computeUrlPath(parentUrlPath, dirName, segmentType) {
|
|
106
|
+
if (segmentType === "group" || segmentType === "slot" || segmentType === "intercepting") return parentUrlPath;
|
|
107
|
+
return `${parentUrlPath === "/" ? "" : parentUrlPath}/${dirName}`;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Scan a directory for file conventions and populate the segment node.
|
|
111
|
+
*/
|
|
112
|
+
function scanSegmentFiles(dirPath, node, extSet) {
|
|
113
|
+
let entries;
|
|
114
|
+
try {
|
|
115
|
+
entries = readdirSync(dirPath);
|
|
116
|
+
} catch (err) {
|
|
117
|
+
swallow(err, `scanSegmentFiles: unreadable directory ${dirPath}`, { level: "warn" });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
for (const entry of entries) {
|
|
121
|
+
const fullPath = join(dirPath, entry);
|
|
122
|
+
try {
|
|
123
|
+
if (statSync(fullPath).isDirectory()) continue;
|
|
124
|
+
} catch {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const ext = extname(entry).slice(1);
|
|
128
|
+
const name = basename(entry, `.${ext}`);
|
|
129
|
+
if (PAGE_EXT_CONVENTIONS.has(name) && extSet.has(ext)) {
|
|
130
|
+
const file = {
|
|
131
|
+
filePath: fullPath,
|
|
132
|
+
extension: ext
|
|
133
|
+
};
|
|
134
|
+
switch (name) {
|
|
135
|
+
case "page":
|
|
136
|
+
node.page = file;
|
|
137
|
+
break;
|
|
138
|
+
case "layout":
|
|
139
|
+
node.layout = file;
|
|
140
|
+
break;
|
|
141
|
+
case "error":
|
|
142
|
+
node.error = file;
|
|
143
|
+
break;
|
|
144
|
+
case "default":
|
|
145
|
+
node.default = file;
|
|
146
|
+
break;
|
|
147
|
+
case "denied":
|
|
148
|
+
node.denied = file;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (FIXED_CONVENTIONS.has(name) && /\.?[jt]sx?$/.test(ext)) {
|
|
154
|
+
const file = {
|
|
155
|
+
filePath: fullPath,
|
|
156
|
+
extension: ext
|
|
157
|
+
};
|
|
158
|
+
switch (name) {
|
|
159
|
+
case "middleware":
|
|
160
|
+
node.middleware = file;
|
|
161
|
+
break;
|
|
162
|
+
case "access":
|
|
163
|
+
node.access = file;
|
|
164
|
+
break;
|
|
165
|
+
case "route":
|
|
166
|
+
node.route = file;
|
|
167
|
+
break;
|
|
168
|
+
case "params":
|
|
169
|
+
node.params = file;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (STATUS_CODE_PATTERN.test(name) && ext === "json") {
|
|
175
|
+
if (!node.jsonStatusFiles) node.jsonStatusFiles = {};
|
|
176
|
+
node.jsonStatusFiles[name] = {
|
|
177
|
+
filePath: fullPath,
|
|
178
|
+
extension: ext
|
|
179
|
+
};
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (STATUS_CODE_PATTERN.test(name) && extSet.has(ext)) {
|
|
183
|
+
if (!node.statusFiles) node.statusFiles = {};
|
|
184
|
+
node.statusFiles[name] = {
|
|
185
|
+
filePath: fullPath,
|
|
186
|
+
extension: ext
|
|
187
|
+
};
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (name in LEGACY_STATUS_FILES && extSet.has(ext)) {
|
|
191
|
+
if (!node.legacyStatusFiles) node.legacyStatusFiles = {};
|
|
192
|
+
node.legacyStatusFiles[name] = {
|
|
193
|
+
filePath: fullPath,
|
|
194
|
+
extension: ext
|
|
195
|
+
};
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (classifyMetadataRoute(entry)) {
|
|
199
|
+
if (!node.metadataRoutes) node.metadataRoutes = {};
|
|
200
|
+
const existing = node.metadataRoutes[name];
|
|
201
|
+
if (existing) {
|
|
202
|
+
const existingIsDynamic = isDynamicMetadataExtension(name, existing.extension);
|
|
203
|
+
if (isDynamicMetadataExtension(name, ext) || !existingIsDynamic) node.metadataRoutes[name] = {
|
|
204
|
+
filePath: fullPath,
|
|
205
|
+
extension: ext
|
|
206
|
+
};
|
|
207
|
+
} else node.metadataRoutes[name] = {
|
|
208
|
+
filePath: fullPath,
|
|
209
|
+
extension: ext
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (node.route && node.page) throw new Error(`Build error: route.ts and page.* cannot coexist in the same segment.\n route.ts: ${node.route.filePath}\n page: ${node.page.filePath}\nA URL is either an API endpoint or a rendered page, not both.`);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Recursively scan child directories and build the segment tree.
|
|
217
|
+
*/
|
|
218
|
+
function scanChildren(dirPath, parentNode, extSet) {
|
|
219
|
+
let entries;
|
|
220
|
+
try {
|
|
221
|
+
entries = readdirSync(dirPath);
|
|
222
|
+
} catch (err) {
|
|
223
|
+
swallow(err, `scanChildren: unreadable directory ${dirPath}`, { level: "warn" });
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
for (const entry of entries) {
|
|
227
|
+
const fullPath = join(dirPath, entry);
|
|
228
|
+
try {
|
|
229
|
+
if (!statSync(fullPath).isDirectory()) continue;
|
|
230
|
+
} catch {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
if (ENCODED_SEPARATOR_PATTERN.test(entry)) throw new Error(`Build error: directory name contains an encoded path delimiter (%%2F or %%5C).\n Directory: ${fullPath}\nEncoded separators in directory names cause route collisions when decoded. Rename the directory to remove the encoded delimiter.`);
|
|
234
|
+
if (ENCODED_NULL_PATTERN.test(entry)) throw new Error(`Build error: directory name contains an encoded null byte (%%00).\n Directory: ${fullPath}\nEncoded null bytes in directory names are not allowed. Rename the directory to remove the null byte encoding.`);
|
|
235
|
+
const { type, paramName, interceptionMarker, interceptedSegmentName } = classifySegment(entry);
|
|
236
|
+
if (type === "private") continue;
|
|
237
|
+
const childNode = createSegmentNode(entry, type, computeUrlPath(parentNode.urlPath, entry, type), paramName, interceptionMarker, interceptedSegmentName);
|
|
238
|
+
scanSegmentFiles(fullPath, childNode, extSet);
|
|
239
|
+
scanChildren(fullPath, childNode, extSet);
|
|
240
|
+
if (type === "slot") {
|
|
241
|
+
const slotName = entry.slice(1);
|
|
242
|
+
parentNode.slots[slotName] = childNode;
|
|
243
|
+
} else parentNode.children.push(childNode);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Validate that route groups don't produce conflicting pages/routes at the same URL path.
|
|
248
|
+
*
|
|
249
|
+
* Two route groups like (auth)/login/page.tsx and (marketing)/login/page.tsx both claim
|
|
250
|
+
* /login — the scanner must detect and reject this at build time.
|
|
251
|
+
*
|
|
252
|
+
* Parallel slots are excluded from collision detection — they intentionally coexist at
|
|
253
|
+
* the same URL path as their parent (that's the whole point of parallel routes).
|
|
254
|
+
*/
|
|
255
|
+
function validateRouteGroupCollisions(root) {
|
|
256
|
+
collectRoutableLeaves(root, /* @__PURE__ */ new Map(), "", false);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Walk the segment tree and collect all routable leaves (page or route files),
|
|
260
|
+
* throwing on collision. Slots are tracked in their own collision space since
|
|
261
|
+
* they are parallel routes that intentionally share URL paths with their parent.
|
|
262
|
+
*/
|
|
263
|
+
function collectRoutableLeaves(node, seen, segmentPath, insideSlot) {
|
|
264
|
+
const currentPath = segmentPath ? `${segmentPath}/${node.segmentName}` : node.segmentName || "(root)";
|
|
265
|
+
if (!insideSlot) {
|
|
266
|
+
const routableFile = node.page ?? node.route;
|
|
267
|
+
if (routableFile) {
|
|
268
|
+
const existing = seen.get(node.urlPath);
|
|
269
|
+
if (existing) throw new Error(`Build error: route collision — multiple route groups produce a page/route at the same URL path.\n URL path: ${node.urlPath}\n File 1: ${existing.filePath} (via ${existing.segmentPath})\n File 2: ${routableFile.filePath} (via ${currentPath})\nEach URL path must map to exactly one page or route handler. Rename or move one of the conflicting files.`);
|
|
270
|
+
seen.set(node.urlPath, {
|
|
271
|
+
filePath: routableFile.filePath,
|
|
272
|
+
segmentPath: currentPath
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
for (const child of node.children) collectRoutableLeaves(child, seen, currentPath, insideSlot);
|
|
277
|
+
for (const slotNode of Object.values(node.slots)) collectRoutableLeaves(slotNode, seen, currentPath, true);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Validate that no route chain contains duplicate dynamic param names.
|
|
281
|
+
*
|
|
282
|
+
* Example violation:
|
|
283
|
+
* app/[id]/items/[id]/page.tsx — 'id' appears twice in the ancestor chain.
|
|
284
|
+
*
|
|
285
|
+
* Route groups are transparent — params accumulate through them.
|
|
286
|
+
* Slots are independent — duplicate detection does NOT cross slot boundaries.
|
|
287
|
+
*
|
|
288
|
+
* See design/07-routing.md §"Duplicate Param Name Detection"
|
|
289
|
+
*/
|
|
290
|
+
function validateDuplicateParamNames(root) {
|
|
291
|
+
walkForDuplicateParams(root, /* @__PURE__ */ new Map());
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Recursively walk the segment tree, tracking seen param names → segment paths.
|
|
295
|
+
* Throws on the first duplicate found.
|
|
296
|
+
*/
|
|
297
|
+
function walkForDuplicateParams(node, seen) {
|
|
298
|
+
if (node.paramName) {
|
|
299
|
+
const existing = seen.get(node.paramName);
|
|
300
|
+
if (existing) throw new Error(`[timber] Duplicate param name '${node.paramName}' in route chain.\n First defined at: ${existing}\n Duplicate at: ${node.urlPath || "/"}\n Rename one of the segments to avoid ambiguity.`);
|
|
301
|
+
seen = new Map(seen);
|
|
302
|
+
seen.set(node.paramName, node.urlPath || "/");
|
|
303
|
+
}
|
|
304
|
+
for (const child of node.children) walkForDuplicateParams(child, seen);
|
|
305
|
+
for (const slotNode of Object.values(node.slots)) walkForDuplicateParams(slotNode, new Map(seen));
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Validate that each param name uses a single bracket form across the entire route tree.
|
|
309
|
+
*
|
|
310
|
+
* Different bracket forms produce different types:
|
|
311
|
+
* [id] → string
|
|
312
|
+
* [...id] → string[]
|
|
313
|
+
* [[...id]] → string[] | undefined
|
|
314
|
+
*
|
|
315
|
+
* If the same param name appears with multiple forms, the no-argument
|
|
316
|
+
* getSegmentParams() / useSegmentParams() return type becomes ambiguous.
|
|
317
|
+
*
|
|
318
|
+
* Same name + same form across different routes is fine and expected.
|
|
319
|
+
*/
|
|
320
|
+
function validateUniqueBracketForms(root) {
|
|
321
|
+
collectBracketForms(root, /* @__PURE__ */ new Map());
|
|
322
|
+
}
|
|
323
|
+
function collectBracketForms(node, forms) {
|
|
324
|
+
if (node.paramName && node.segmentType !== "static" && node.segmentType !== "group") {
|
|
325
|
+
const existing = forms.get(node.paramName);
|
|
326
|
+
if (existing && existing.segmentType !== node.segmentType) {
|
|
327
|
+
const bracketExamples = {
|
|
328
|
+
"dynamic": `[${node.paramName}]`,
|
|
329
|
+
"catch-all": `[...${node.paramName}]`,
|
|
330
|
+
"optional-catch-all": `[[...${node.paramName}]]`
|
|
331
|
+
};
|
|
332
|
+
throw new Error(`[timber] Param name '${node.paramName}' uses multiple bracket forms.\n ${bracketExamples[existing.segmentType] ?? existing.segmentType} at: ${existing.urlPath}\n ${bracketExamples[node.segmentType] ?? node.segmentType} at: ${node.urlPath || "/"}\n Each param name must use a single bracket form across all routes.\n Rename one of the segments to fix this (e.g., [${node.paramName}] → [${node.paramName}Id]).`);
|
|
333
|
+
}
|
|
334
|
+
if (!existing) forms.set(node.paramName, {
|
|
335
|
+
segmentType: node.segmentType,
|
|
336
|
+
urlPath: node.urlPath || "/"
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
for (const child of node.children) collectBracketForms(child, forms);
|
|
340
|
+
for (const slotNode of Object.values(node.slots)) collectBracketForms(slotNode, forms);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Find a fixed-extension file (proxy.ts) in a directory.
|
|
344
|
+
*/
|
|
345
|
+
function findFixedFile(dirPath, name) {
|
|
346
|
+
for (const ext of ["ts", "tsx"]) {
|
|
347
|
+
const fullPath = join(dirPath, `${name}.${ext}`);
|
|
348
|
+
try {
|
|
349
|
+
if (statSync(fullPath).isFile()) return {
|
|
350
|
+
filePath: fullPath,
|
|
351
|
+
extension: ext
|
|
352
|
+
};
|
|
353
|
+
} catch {}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Find a file using the configured page extensions (tsx, ts, jsx, js, mdx, etc.).
|
|
358
|
+
* Used for app-root conventions like global-error that aren't per-segment.
|
|
359
|
+
*/
|
|
360
|
+
function findPageExtFile(dirPath, name, extSet) {
|
|
361
|
+
for (const ext of extSet) {
|
|
362
|
+
const fullPath = join(dirPath, `${name}.${ext}`);
|
|
363
|
+
try {
|
|
364
|
+
if (statSync(fullPath).isFile()) return {
|
|
365
|
+
filePath: fullPath,
|
|
366
|
+
extension: ext
|
|
367
|
+
};
|
|
368
|
+
} catch {}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
//#endregion
|
|
372
|
+
//#region src/utils/startup-timer.ts
|
|
373
|
+
/**
|
|
374
|
+
* Startup timer — records named phases with their durations.
|
|
375
|
+
*
|
|
376
|
+
* Used by the plugin system to instrument cold start and report a
|
|
377
|
+
* timing breakdown in dev mode. Zero overhead in production (disabled).
|
|
378
|
+
*
|
|
379
|
+
* See design/18-build-system.md, TIM-155.
|
|
380
|
+
*/
|
|
381
|
+
/**
|
|
382
|
+
* Create a startup timer that records phase durations.
|
|
383
|
+
*/
|
|
384
|
+
function createStartupTimer() {
|
|
385
|
+
const pending = /* @__PURE__ */ new Map();
|
|
386
|
+
const phases = [];
|
|
387
|
+
return {
|
|
388
|
+
start(phase) {
|
|
389
|
+
pending.set(phase, performance.now());
|
|
390
|
+
},
|
|
391
|
+
end(phase) {
|
|
392
|
+
const startMs = pending.get(phase);
|
|
393
|
+
if (startMs === void 0) return 0;
|
|
394
|
+
pending.delete(phase);
|
|
395
|
+
const durationMs = performance.now() - startMs;
|
|
396
|
+
phases.push({
|
|
397
|
+
name: phase,
|
|
398
|
+
startMs,
|
|
399
|
+
durationMs
|
|
400
|
+
});
|
|
401
|
+
return durationMs;
|
|
402
|
+
},
|
|
403
|
+
getPhases() {
|
|
404
|
+
return [...phases].sort((a, b) => a.startMs - b.startMs);
|
|
405
|
+
},
|
|
406
|
+
totalMs() {
|
|
407
|
+
if (phases.length === 0) return 0;
|
|
408
|
+
const sorted = this.getPhases();
|
|
409
|
+
const first = sorted[0];
|
|
410
|
+
const last = sorted[sorted.length - 1];
|
|
411
|
+
return last.startMs + last.durationMs - first.startMs;
|
|
412
|
+
},
|
|
413
|
+
formatSummary() {
|
|
414
|
+
const sorted = this.getPhases();
|
|
415
|
+
if (sorted.length === 0) return "No phases recorded.";
|
|
416
|
+
const lines = sorted.map((p) => {
|
|
417
|
+
const ms = p.durationMs.toFixed(1);
|
|
418
|
+
return ` ${p.name.padEnd(30)} ${ms.padStart(8)}ms`;
|
|
419
|
+
});
|
|
420
|
+
const total = this.totalMs().toFixed(1);
|
|
421
|
+
lines.push(` ${"total".padEnd(30)} ${total.padStart(8)}ms`);
|
|
422
|
+
return ["[timber] startup timing:", ...lines].join("\n");
|
|
423
|
+
}
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* No-op timer for production builds — all methods are empty.
|
|
428
|
+
*/
|
|
429
|
+
function createNoopTimer() {
|
|
430
|
+
return {
|
|
431
|
+
start() {},
|
|
432
|
+
end() {
|
|
433
|
+
return 0;
|
|
434
|
+
},
|
|
435
|
+
getPhases() {
|
|
436
|
+
return [];
|
|
437
|
+
},
|
|
438
|
+
totalMs() {
|
|
439
|
+
return 0;
|
|
440
|
+
},
|
|
441
|
+
formatSummary() {
|
|
442
|
+
return "";
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
//#endregion
|
|
447
|
+
//#region src/plugin-context.ts
|
|
448
|
+
/**
|
|
449
|
+
* Plugin context — internal types and helpers for timber sub-plugins.
|
|
450
|
+
*
|
|
451
|
+
* These are NOT part of the user-facing API. They are consumed by
|
|
452
|
+
* sub-plugins (routing, entries, shims, etc.) via relative imports.
|
|
453
|
+
* The root entry point (index.ts) does not re-export them.
|
|
454
|
+
*
|
|
455
|
+
* Design doc: 18-build-system.md §"Shared Plugin Context"
|
|
456
|
+
*/
|
|
457
|
+
/**
|
|
458
|
+
* Resolve `clientJavascript` into a fully resolved config.
|
|
459
|
+
*/
|
|
460
|
+
function resolveClientJavascript(config) {
|
|
461
|
+
if (config.clientJavascript !== void 0) {
|
|
462
|
+
if (typeof config.clientJavascript === "boolean") return {
|
|
463
|
+
disabled: !config.clientJavascript,
|
|
464
|
+
enableHMRInDev: !config.clientJavascript
|
|
465
|
+
};
|
|
466
|
+
return {
|
|
467
|
+
disabled: config.clientJavascript.disabled,
|
|
468
|
+
enableHMRInDev: config.clientJavascript.enableHMRInDev ?? config.clientJavascript.disabled
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
return {
|
|
472
|
+
disabled: false,
|
|
473
|
+
enableHMRInDev: false
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Resolve the app directory. Checks (in order):
|
|
478
|
+
* 1. Explicit `configAppDir` from timber.config.ts
|
|
479
|
+
* 2. `<root>/app`
|
|
480
|
+
* 3. `<root>/src/app`
|
|
481
|
+
*
|
|
482
|
+
* Throws if none exist.
|
|
483
|
+
*/
|
|
484
|
+
function resolveAppDir(root, configAppDir) {
|
|
485
|
+
if (configAppDir) {
|
|
486
|
+
const explicit = join(root, configAppDir);
|
|
487
|
+
if (!existsSync(explicit)) throw new Error(`[timber] Configured appDir "${configAppDir}" does not exist at ${explicit}`);
|
|
488
|
+
return explicit;
|
|
489
|
+
}
|
|
490
|
+
const rootApp = join(root, "app");
|
|
491
|
+
if (existsSync(rootApp)) return rootApp;
|
|
492
|
+
const srcApp = join(root, "src", "app");
|
|
493
|
+
if (existsSync(srcApp)) return srcApp;
|
|
494
|
+
throw new Error(`[timber] Could not find app directory. Expected "app/" or "src/app/" in ${root}. You can set appDir in timber.config.ts to specify a custom location.`);
|
|
495
|
+
}
|
|
496
|
+
function createPluginContext(config, root) {
|
|
497
|
+
const projectRoot = root ?? process.cwd();
|
|
498
|
+
const resolvedConfig = { ...config };
|
|
499
|
+
return {
|
|
500
|
+
config: resolvedConfig,
|
|
501
|
+
clientJavascript: resolveClientJavascript(resolvedConfig),
|
|
502
|
+
routeTree: null,
|
|
503
|
+
appDir: join(projectRoot, "app"),
|
|
504
|
+
root: projectRoot,
|
|
505
|
+
dev: false,
|
|
506
|
+
buildManifest: null,
|
|
507
|
+
deploymentId: null,
|
|
508
|
+
timer: createStartupTimer(),
|
|
509
|
+
holdingServer: null,
|
|
510
|
+
buildDir: resolveBuildDir(projectRoot, resolvedConfig.buildDir)
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
/** Default build output directory (relative to root). */
|
|
514
|
+
var DEFAULT_BUILD_DIR = join(".timber", "dist");
|
|
515
|
+
/**
|
|
516
|
+
* Resolve the build output directory.
|
|
517
|
+
*
|
|
518
|
+
* Priority:
|
|
519
|
+
* 1. Explicit `timberBuildDir` from timber.config.ts
|
|
520
|
+
* 2. Explicit `viteBuildOutDir` from Vite's build.outDir (if not the default 'dist')
|
|
521
|
+
* 3. Default: `.timber/dist`
|
|
522
|
+
*
|
|
523
|
+
* Returns an absolute path.
|
|
524
|
+
*/
|
|
525
|
+
function resolveBuildDir(root, timberBuildDir, viteBuildOutDir) {
|
|
526
|
+
if (timberBuildDir) return join(root, timberBuildDir);
|
|
527
|
+
if (viteBuildOutDir && viteBuildOutDir !== "dist") return join(root, viteBuildOutDir);
|
|
528
|
+
return join(root, DEFAULT_BUILD_DIR);
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Load timber.config.ts (or .js, .mjs) from the project root.
|
|
532
|
+
* Returns the config object or null if no config file is found.
|
|
533
|
+
*
|
|
534
|
+
* Uses require() which works for ESM modules on Node 22.12+.
|
|
535
|
+
* This keeps timber() synchronous — no async config loading needed.
|
|
536
|
+
*/
|
|
537
|
+
function loadTimberConfigFile(root) {
|
|
538
|
+
const configNames = [
|
|
539
|
+
"timber.config.ts",
|
|
540
|
+
"timber.config.js",
|
|
541
|
+
"timber.config.mjs"
|
|
542
|
+
];
|
|
543
|
+
const req = createRequire(join(root, "package.json"));
|
|
544
|
+
for (const name of configNames) {
|
|
545
|
+
const configPath = join(root, name);
|
|
546
|
+
if (existsSync(configPath)) {
|
|
547
|
+
const mod = req(configPath);
|
|
548
|
+
return mod.default ?? mod;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
return null;
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Detect config keys set in both inline (vite.config.ts) and file (timber.config.ts)
|
|
555
|
+
* and warn the user. The `output` key is excluded because it defaults to 'server'
|
|
556
|
+
* in createPluginContext and would always appear as an inline key.
|
|
557
|
+
*
|
|
558
|
+
* Returns the list of conflicting key names (for testing).
|
|
559
|
+
*/
|
|
560
|
+
function warnConfigConflicts(inline, fileConfig) {
|
|
561
|
+
const conflicts = [];
|
|
562
|
+
for (const key of Object.keys(fileConfig)) if (key in inline && inline[key] !== void 0) conflicts.push(key);
|
|
563
|
+
if (conflicts.length > 0) console.warn(`[timber] Config conflict: ${conflicts.map((k) => `"${k}"`).join(", ")} set in both vite.config.ts (inline) and timber.config.ts. Move all config to timber.config.ts to avoid confusion. The inline value from vite.config.ts will be used.`);
|
|
564
|
+
return conflicts;
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Merge file-based config into ctx.config. Inline config (already in ctx.config)
|
|
568
|
+
* takes precedence — file config only fills in missing fields.
|
|
569
|
+
*/
|
|
570
|
+
function mergeFileConfig(ctx, fileConfig) {
|
|
571
|
+
const inline = ctx.config;
|
|
572
|
+
warnConfigConflicts(inline, fileConfig);
|
|
573
|
+
ctx.config = {
|
|
574
|
+
...fileConfig,
|
|
575
|
+
...inline,
|
|
576
|
+
...fileConfig.limits && inline.limits ? { limits: {
|
|
577
|
+
...fileConfig.limits,
|
|
578
|
+
...inline.limits
|
|
579
|
+
} } : {},
|
|
580
|
+
...fileConfig.dev && inline.dev ? { dev: {
|
|
581
|
+
...fileConfig.dev,
|
|
582
|
+
...inline.dev
|
|
583
|
+
} } : {},
|
|
584
|
+
...fileConfig.mdx && inline.mdx ? { mdx: {
|
|
585
|
+
...fileConfig.mdx,
|
|
586
|
+
...inline.mdx
|
|
587
|
+
} } : {}
|
|
588
|
+
};
|
|
589
|
+
}
|
|
590
|
+
//#endregion
|
|
591
|
+
//#region src/cli-schema-sync.ts
|
|
592
|
+
/**
|
|
593
|
+
* `timber schema sync` — scan filesystem for dynamic segments, append
|
|
594
|
+
* missing entries with `codec.string` defaults, and remove stale entries
|
|
595
|
+
* whose segments no longer exist in the filesystem.
|
|
596
|
+
*
|
|
597
|
+
* Design doc: design/41-global-params.md §Auto-Scaffolding
|
|
598
|
+
*/
|
|
599
|
+
/**
|
|
600
|
+
* Collect all unique bracket-keyed dynamic segment names from the route tree.
|
|
601
|
+
* Returns entries like '[artistSlug]', '[...slug]', '[[...topic]]'.
|
|
602
|
+
*/
|
|
603
|
+
function collectDynamicSegments(appDir) {
|
|
604
|
+
const tree = scanRoutes(appDir);
|
|
605
|
+
const segments = /* @__PURE__ */ new Set();
|
|
606
|
+
walkSegments(tree.root, segments);
|
|
607
|
+
return [...segments].sort();
|
|
608
|
+
}
|
|
609
|
+
function walkSegments(node, segments) {
|
|
610
|
+
if (node.paramName) segments.add(node.segmentName);
|
|
611
|
+
for (const child of node.children) walkSegments(child, segments);
|
|
612
|
+
for (const slot of Object.values(node.slots)) walkSegments(slot, segments);
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Parse existing bracket keys from an app/schema.ts file.
|
|
616
|
+
* Uses regex to find keys in segmentParams: { '[key]': ... } blocks.
|
|
617
|
+
*/
|
|
618
|
+
function parseExistingSchemaKeys(content) {
|
|
619
|
+
const keys = [];
|
|
620
|
+
const re = /['"](\[{1,2}(?:\.{3})?\w+\]{1,2})['"]\s*:/g;
|
|
621
|
+
let m;
|
|
622
|
+
while ((m = re.exec(content)) !== null) keys.push(m[1]);
|
|
623
|
+
return keys;
|
|
624
|
+
}
|
|
625
|
+
/** Schema file extensions to check. */
|
|
626
|
+
var SCHEMA_EXTENSIONS = [
|
|
627
|
+
".ts",
|
|
628
|
+
".tsx",
|
|
629
|
+
".js",
|
|
630
|
+
".jsx"
|
|
631
|
+
];
|
|
632
|
+
/**
|
|
633
|
+
* Find the schema file path if it exists.
|
|
634
|
+
*/
|
|
635
|
+
function findSchemaFile(appDir) {
|
|
636
|
+
for (const ext of SCHEMA_EXTENSIONS) {
|
|
637
|
+
const p = join(appDir, `schema${ext}`);
|
|
638
|
+
if (existsSync(p)) return p;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
function defaultCodecForSegment(seg) {
|
|
642
|
+
if (seg.startsWith("[[...")) return "codec.optionalCatchAll(codec.string)";
|
|
643
|
+
if (seg.startsWith("[...")) return "codec.stringArray";
|
|
644
|
+
return "codec.string";
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Generate the content for a new app/schema.ts with the given segment keys.
|
|
648
|
+
*/
|
|
649
|
+
function generateNewSchema(segments) {
|
|
650
|
+
const lines = [];
|
|
651
|
+
lines.push("import { defineSchema } from '@timber-js/app/params';");
|
|
652
|
+
lines.push("import { codec } from '@timber-js/app/codec';");
|
|
653
|
+
lines.push("");
|
|
654
|
+
lines.push("export default defineSchema({");
|
|
655
|
+
lines.push(" segmentParams: {");
|
|
656
|
+
for (const seg of segments) lines.push(` '${seg}': ${defaultCodecForSegment(seg)},`);
|
|
657
|
+
lines.push(" },");
|
|
658
|
+
lines.push("});");
|
|
659
|
+
lines.push("");
|
|
660
|
+
return lines.join("\n");
|
|
661
|
+
}
|
|
662
|
+
/**
|
|
663
|
+
* Append missing segment entries to an existing schema file.
|
|
664
|
+
* Inserts new entries before the closing `}` of segmentParams.
|
|
665
|
+
*/
|
|
666
|
+
var CODEC_IMPORT = "import { codec } from '@timber-js/app/codec';";
|
|
667
|
+
function hasCodecImport(content) {
|
|
668
|
+
return /import\s+\{[^}]*\bcodec\b[^}]*\}\s+from\s+['"]@timber-js\/app\/codec['"]/.test(content);
|
|
669
|
+
}
|
|
670
|
+
function ensureCodecImport(content) {
|
|
671
|
+
if (hasCodecImport(content)) return content;
|
|
672
|
+
const lines = content.split("\n");
|
|
673
|
+
let lastImportIndex = -1;
|
|
674
|
+
for (let i = 0; i < lines.length; i++) if (/^\s*import\s/.test(lines[i])) lastImportIndex = i;
|
|
675
|
+
if (lastImportIndex === -1) return "import { codec } from '@timber-js/app/codec';\n" + content;
|
|
676
|
+
lines.splice(lastImportIndex + 1, 0, CODEC_IMPORT);
|
|
677
|
+
return lines.join("\n");
|
|
678
|
+
}
|
|
679
|
+
function appendToSchema(content, newSegments) {
|
|
680
|
+
content = ensureCodecImport(content);
|
|
681
|
+
const spIndex = content.indexOf("segmentParams");
|
|
682
|
+
if (spIndex === -1) throw new Error("[timber] Could not find segmentParams in schema file. Expected a defineSchema({ segmentParams: { ... } }) call.");
|
|
683
|
+
const openBrace = content.indexOf("{", spIndex + 13);
|
|
684
|
+
if (openBrace === -1) throw new Error("[timber] Could not find opening brace for segmentParams.");
|
|
685
|
+
let depth = 1;
|
|
686
|
+
let i = openBrace + 1;
|
|
687
|
+
while (i < content.length && depth > 0) {
|
|
688
|
+
if (content[i] === "{") depth++;
|
|
689
|
+
else if (content[i] === "}") depth--;
|
|
690
|
+
i++;
|
|
691
|
+
}
|
|
692
|
+
const closeBrace = i - 1;
|
|
693
|
+
const existingLine = content.slice(openBrace, closeBrace).match(/^(\s+)['"]\[/m);
|
|
694
|
+
const indent = existingLine ? existingLine[1] : " ";
|
|
695
|
+
const insertion = newSegments.map((seg) => `${indent}'${seg}': ${defaultCodecForSegment(seg)},`).join("\n");
|
|
696
|
+
const before = content.slice(0, closeBrace);
|
|
697
|
+
const after = content.slice(closeBrace);
|
|
698
|
+
return before + (before.trimEnd().endsWith(",") ? "\n" : "\n") + insertion + "\n" + after;
|
|
699
|
+
}
|
|
700
|
+
/**
|
|
701
|
+
* Remove entries from the segmentParams block whose keys match `staleSegments`.
|
|
702
|
+
* Removes the entire line including trailing comma/whitespace.
|
|
703
|
+
*/
|
|
704
|
+
function removeFromSchema(content, staleSegments) {
|
|
705
|
+
for (const seg of staleSegments) {
|
|
706
|
+
const escaped = seg.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
707
|
+
const keyRe = new RegExp(`^[ \t]*['"]${escaped}['"][ \t]*:`, "gm");
|
|
708
|
+
let m;
|
|
709
|
+
while ((m = keyRe.exec(content)) !== null) {
|
|
710
|
+
const start = m.index;
|
|
711
|
+
let i = m.index + m[0].length;
|
|
712
|
+
let depth = 0;
|
|
713
|
+
let inString = null;
|
|
714
|
+
while (i < content.length) {
|
|
715
|
+
const ch = content[i];
|
|
716
|
+
if (inString) {
|
|
717
|
+
if (ch === "\\") i++;
|
|
718
|
+
else if (ch === inString) inString = null;
|
|
719
|
+
} else if (ch === "\"" || ch === "'" || ch === "`") inString = ch;
|
|
720
|
+
else if (ch === "(" || ch === "{" || ch === "[") depth++;
|
|
721
|
+
else if (ch === ")" || ch === "}" || ch === "]") depth--;
|
|
722
|
+
else if (depth === 0 && ch === ",") {
|
|
723
|
+
i++;
|
|
724
|
+
break;
|
|
725
|
+
} else if (depth === 0 && (ch === "\n" || ch === "}")) break;
|
|
726
|
+
i++;
|
|
727
|
+
}
|
|
728
|
+
if (i < content.length && content[i] === "\n") i++;
|
|
729
|
+
content = content.slice(0, start) + content.slice(i);
|
|
730
|
+
keyRe.lastIndex = start;
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
return content;
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
736
|
+
* Run the schema sync: scan filesystem, diff against schema, append missing.
|
|
737
|
+
*/
|
|
738
|
+
function runSchemaSync(projectRoot) {
|
|
739
|
+
const appDir = resolveAppDir(projectRoot);
|
|
740
|
+
const filesystemSegments = collectDynamicSegments(appDir);
|
|
741
|
+
const schemaPath = findSchemaFile(appDir);
|
|
742
|
+
if (filesystemSegments.length === 0 && !schemaPath) return {
|
|
743
|
+
filesystemSegments: [],
|
|
744
|
+
existingSegments: [],
|
|
745
|
+
addedSegments: [],
|
|
746
|
+
removedSegments: [],
|
|
747
|
+
created: false
|
|
748
|
+
};
|
|
749
|
+
if (!schemaPath) {
|
|
750
|
+
writeFileSync(join(appDir, "schema.ts"), generateNewSchema(filesystemSegments), "utf-8");
|
|
751
|
+
return {
|
|
752
|
+
filesystemSegments,
|
|
753
|
+
existingSegments: [],
|
|
754
|
+
addedSegments: filesystemSegments,
|
|
755
|
+
removedSegments: [],
|
|
756
|
+
created: true
|
|
757
|
+
};
|
|
758
|
+
}
|
|
759
|
+
const content = readFileSync(schemaPath, "utf-8");
|
|
760
|
+
const existingSegments = parseExistingSchemaKeys(content);
|
|
761
|
+
const missing = filesystemSegments.filter((seg) => !existingSegments.includes(seg));
|
|
762
|
+
const stale = existingSegments.filter((seg) => !filesystemSegments.includes(seg));
|
|
763
|
+
if (missing.length === 0 && stale.length === 0) return {
|
|
764
|
+
filesystemSegments,
|
|
765
|
+
existingSegments,
|
|
766
|
+
addedSegments: [],
|
|
767
|
+
removedSegments: [],
|
|
768
|
+
created: false
|
|
769
|
+
};
|
|
770
|
+
let updated = content;
|
|
771
|
+
if (stale.length > 0) updated = removeFromSchema(updated, stale);
|
|
772
|
+
if (missing.length > 0) updated = appendToSchema(updated, missing);
|
|
773
|
+
writeFileSync(schemaPath, updated, "utf-8");
|
|
774
|
+
return {
|
|
775
|
+
filesystemSegments,
|
|
776
|
+
existingSegments,
|
|
777
|
+
addedSegments: missing,
|
|
778
|
+
removedSegments: stale,
|
|
779
|
+
created: false
|
|
780
|
+
};
|
|
781
|
+
}
|
|
782
|
+
//#endregion
|
|
783
|
+
export { runSchemaSync as a, loadTimberConfigFile as c, resolveBuildDir as d, resolveClientJavascript as f, parseExistingSchemaKeys as i, mergeFileConfig as l, scanRoutes as m, defaultCodecForSegment as n, DEFAULT_BUILD_DIR as o, createNoopTimer as p, findSchemaFile as r, createPluginContext as s, collectDynamicSegments as t, resolveAppDir as u };
|
|
784
|
+
|
|
785
|
+
//# sourceMappingURL=cli-schema-sync-D2IpXicg.js.map
|