@timber-js/app 0.2.0-alpha.18 → 0.2.0-alpha.180
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/agent-skill.md +344 -0
- package/dist/_chunks/actions-O_LsyCE4.js +317 -0
- package/dist/_chunks/actions-O_LsyCE4.js.map +1 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js +1202 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js.map +1 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js +248 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js +688 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js.map +1 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js +1188 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-COtkxMRT.js +191 -0
- package/dist/_chunks/define-COtkxMRT.js.map +1 -0
- package/dist/_chunks/define-c4au4I9R.js +82 -0
- package/dist/_chunks/define-c4au4I9R.js.map +1 -0
- package/dist/_chunks/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.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/href-validation-CMc5JRls.js +141 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/logger-AWfuX-KJ.js +1468 -0
- package/dist/_chunks/logger-AWfuX-KJ.js.map +1 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
- package/dist/_chunks/plugin-context---kTF5v8.js +315 -0
- package/dist/_chunks/plugin-context---kTF5v8.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-Dz3fcFUo.js +50 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.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-DT_Tn0Xf.js +119 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +1 -0
- package/dist/_chunks/segment-classify-Byy425ng.js +176 -0
- package/dist/_chunks/segment-classify-Byy425ng.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/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.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/{use-query-states-D5KaffOK.js → use-query-states-DFvWd-EA.js} +71 -26
- package/dist/_chunks/use-query-states-DFvWd-EA.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/walkers-BtTlKviE.js +1002 -0
- package/dist/_chunks/walkers-BtTlKviE.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +29 -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 +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +124 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +189 -21
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +5 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +41 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +224 -172
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +6 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +2 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/cache-api.d.ts +48 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +31 -8
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +140 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +19 -2
- 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/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +52 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +16 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +35 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +113 -34
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -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 +29 -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 +27 -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 +28 -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 +47 -10
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +61 -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 +21 -6
- 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 +185 -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 +887 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +3 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +119 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- 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 +99 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +48 -15
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +26 -7
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +57 -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/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.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/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 +12 -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 +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +284 -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 +257 -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 +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -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/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.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/dev-tools/instrumentation.d.ts +59 -0
- 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} +17 -3
- 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/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +110 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -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/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +4 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +177 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -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 +77 -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 +9243 -14093
- 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 +217 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -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 +43 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -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 +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +28 -4
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -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/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +42 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep.d.ts +21 -0
- package/dist/plugins/request-dep.d.ts.map +1 -0
- 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 +29 -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 +64 -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/export-detect.d.ts +56 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.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/interception.d.ts +0 -5
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +32 -0
- package/dist/routing/manifest-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 +81 -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 +81 -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 +91 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +188 -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 +42 -7
- 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 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +93 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- 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 +12 -29
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.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 +65 -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 +117 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +2 -2
- 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/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +242 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +82 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +11 -47
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +182 -2906
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +49 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3892 -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 +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata.d.ts +8 -0
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +119 -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 +59 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +140 -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/prebuilt/cache-key.d.ts +62 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +23 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +78 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +120 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +88 -43
- 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/render-utils.d.ts +25 -0
- package/dist/server/render-utils.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/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +53 -25
- 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/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- 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 +69 -37
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +28 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -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 +6 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +25 -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 +36 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -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 +66 -5
- 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 +72 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +22 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +44 -9
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +69 -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/utils/mdx-file.d.ts +15 -0
- package/dist/server/utils/mdx-file.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/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -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/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.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 +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +35 -11
- 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/docs/api/30-api-server.mdx +233 -0
- package/docs/api/31-api-client.mdx +161 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +154 -0
- package/docs/api/34-api-config.mdx +325 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/03b-access-control.mdx +130 -0
- package/docs/learn/04-loading-states.mdx +67 -0
- package/docs/learn/04b-the-flush-point.mdx +115 -0
- package/docs/learn/05-typed-params.mdx +275 -0
- package/docs/learn/06-forms-and-actions.mdx +146 -0
- package/docs/learn/07-typed-routes.mdx +127 -0
- package/docs/learn/08-streaming.mdx +146 -0
- package/docs/learn/09-caching.mdx +252 -0
- package/docs/learn/10-middleware.mdx +157 -0
- package/docs/learn/11-error-handling.mdx +156 -0
- package/docs/learn/12-client-navigation.mdx +176 -0
- package/docs/learn/13-configuration.mdx +162 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +173 -0
- package/docs/more/02-advanced-forms.mdx +137 -0
- package/docs/more/03-coming-from-nextjs.mdx +186 -0
- package/docs/more/04-metadata-and-fonts.mdx +193 -0
- package/docs/more/04b-mdx.mdx +209 -0
- package/docs/more/05-content-collections.mdx +90 -0
- package/docs/more/06-instrumentation.mdx +214 -0
- package/docs/more/07-security.mdx +129 -0
- package/docs/more/08-developer-experience.mdx +134 -0
- package/docs/more/40-why-timber.mdx +50 -0
- package/docs/more/41-timber-vs-nextjs.mdx +81 -0
- package/docs/more/42-timber-vs-others.mdx +68 -0
- package/docs/more/50-ai-agent-instructions.mdx +169 -0
- package/llms.txt +55 -0
- package/package.json +105 -26
- package/src/adapters/build-output-helper.ts +199 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +204 -0
- package/src/adapters/cloudflare.ts +620 -129
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +266 -122
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/types.ts +2 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +114 -21
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +197 -19
- package/src/cache/singleflight.ts +64 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +237 -0
- package/src/cache/timber-cache.ts +161 -36
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +17 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +30 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +167 -34
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +124 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +187 -0
- package/src/client/browser-entry/index.ts +113 -0
- package/src/client/browser-entry/post-hydration.ts +110 -0
- package/src/client/browser-entry/router-init.ts +286 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +127 -22
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +21 -6
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +349 -150
- package/src/client/navigation-api.ts +345 -0
- package/src/client/navigation-context.ts +15 -7
- package/src/client/navigation-root.tsx +355 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +565 -212
- package/src/client/rsc-fetch.ts +215 -34
- package/src/client/segment-cache.ts +91 -17
- package/src/client/segment-outlet.tsx +141 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +60 -15
- 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 +108 -10
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +31 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +149 -0
- package/src/config-types.ts +282 -0
- package/src/config-validation.ts +330 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +217 -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 +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +477 -126
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +100 -18
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +446 -352
- 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 +84 -0
- package/src/plugin-context.ts +432 -0
- package/src/plugins/adapter-build.ts +220 -7
- package/src/plugins/build-manifest.ts +177 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +284 -94
- package/src/plugins/entries.ts +134 -16
- package/src/plugins/fonts.ts +225 -660
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +328 -0
- package/src/plugins/request-dep.ts +458 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +89 -12
- package/src/plugins/shims.ts +241 -64
- package/src/plugins/static-build.ts +15 -90
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +372 -178
- package/src/routing/convention-lint.ts +394 -0
- package/src/routing/export-detect.ts +304 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +3 -22
- package/src/routing/link-codegen.ts +313 -0
- package/src/routing/manifest-codegen.ts +287 -0
- package/src/routing/scanner.ts +338 -189
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +223 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +82 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/schema-bridge.ts +253 -0
- package/src/search-params/define.ts +576 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +101 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +111 -34
- package/src/server/action-client.ts +120 -29
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +48 -54
- package/src/server/als-registry.ts +137 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +19 -56
- package/src/server/canonicalize.ts +6 -3
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +34 -7
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +314 -0
- package/src/server/deny-renderer.ts +85 -77
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +37 -27
- package/src/server/error-boundary-wrapper.ts +61 -22
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/html-injector-core.ts +495 -0
- package/src/server/html-injectors.ts +271 -254
- package/src/server/index.ts +31 -185
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata.ts +21 -0
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +336 -0
- package/src/server/param-coercion.ts +207 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +45 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +545 -0
- package/src/server/pipeline.ts +274 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +298 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +53 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +201 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +809 -0
- package/src/server/prebuilt-runtime.ts +815 -0
- package/src/server/primitives.ts +160 -83
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +170 -337
- package/src/server/request-dep.ts +37 -0
- package/src/server/route-element-builder.ts +699 -295
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +158 -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/deny-fallback.ts +92 -0
- package/src/server/rsc-entry/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +210 -85
- package/src/server/rsc-entry/index.ts +332 -332
- package/src/server/rsc-entry/render-route.ts +300 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +102 -42
- package/src/server/rsc-entry/rsc-stream.ts +93 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +275 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/sitemap-generator.ts +345 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +574 -250
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -86
- package/src/server/ssr-render.ts +345 -86
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +177 -30
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +288 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +214 -90
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +51 -29
- 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-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- 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 +0 -153
- 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/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.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/head.d.ts +0 -16
- package/dist/client/head.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/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- 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/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.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 +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.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/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- 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/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
|
@@ -13,11 +13,16 @@
|
|
|
13
13
|
* Task: TIM-287
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
import { join, relative } from 'node:path';
|
|
16
18
|
import { gzipSync } from 'node:zlib';
|
|
17
19
|
import type { Plugin, Logger } from 'vite';
|
|
18
|
-
import type { PluginContext } from '
|
|
19
|
-
import type { SegmentNode, RouteTree } from '
|
|
20
|
-
import {
|
|
20
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
21
|
+
import type { SegmentNode, RouteTree } from '../routing/types.js';
|
|
22
|
+
import type { CaptureSummary } from '../server/prebuilt-builder.js';
|
|
23
|
+
import type { PrebuiltManifest } from '../server/prebuilt/payload-source.js';
|
|
24
|
+
import { collectLeafRoutes } from '../routing/walkers.js';
|
|
25
|
+
import { formatSize } from '../utils/format.js';
|
|
21
26
|
|
|
22
27
|
// ─── Public types ─────────────────────────────────────────────────────────
|
|
23
28
|
|
|
@@ -83,33 +88,23 @@ interface RouteInfo {
|
|
|
83
88
|
/**
|
|
84
89
|
* Walk the route tree and collect all leaf routes (pages + API endpoints).
|
|
85
90
|
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
91
|
+
* Wraps the shared `collectLeafRoutes` walker (TIM-848). Parallel slots
|
|
92
|
+
* (`@artists`, `@shows`, etc.) are intentionally skipped — they render
|
|
93
|
+
* alongside the parent page at the same URL and are not separately
|
|
94
|
+
* URL-addressable. Their JS is captured in shared/layout chunks.
|
|
89
95
|
*
|
|
90
96
|
* After collection, entries are deduplicated by URL path so that overlapping
|
|
91
97
|
* route groups (e.g. `(browse)` and `(marketing)` both producing `/`) only
|
|
92
|
-
* appear once. The entry with the
|
|
98
|
+
* appear once. The entry with the longest segment chain (most specific
|
|
99
|
+
* match) wins.
|
|
93
100
|
*/
|
|
94
101
|
export function collectRoutes(tree: RouteTree): RouteInfo[] {
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (node.page) {
|
|
102
|
-
routes.push({ path, segments: currentChain, entryFilePath: node.page.filePath });
|
|
103
|
-
}
|
|
104
|
-
if (node.route) {
|
|
105
|
-
routes.push({ path, segments: currentChain, entryFilePath: node.route.filePath });
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Recurse into child segments only — skip parallel slots (node.slots)
|
|
109
|
-
for (const child of node.children) walk(child, currentChain);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
walk(tree.root, []);
|
|
102
|
+
const leaves = collectLeafRoutes(tree.root);
|
|
103
|
+
const routes: RouteInfo[] = leaves.map((leaf) => ({
|
|
104
|
+
path: leaf.urlPath,
|
|
105
|
+
segments: leaf.segments,
|
|
106
|
+
entryFilePath: leaf.page?.filePath ?? leaf.route?.filePath ?? null,
|
|
107
|
+
}));
|
|
113
108
|
|
|
114
109
|
// Deduplicate entries with the same URL path (e.g. from overlapping route groups).
|
|
115
110
|
// Keep the entry with the longest segment chain (most specific match).
|
|
@@ -169,6 +164,21 @@ export function buildRouteReport(entries: RouteEntry[], sharedSize: number): str
|
|
|
169
164
|
return lines;
|
|
170
165
|
}
|
|
171
166
|
|
|
167
|
+
/** Check route entries against a First-Load-JS budget and return warning lines. */
|
|
168
|
+
export function buildWarnings(entries: RouteEntry[], budget?: { firstLoadJs?: number }): string[] {
|
|
169
|
+
if (!budget?.firstLoadJs) return [];
|
|
170
|
+
const limit = budget.firstLoadJs;
|
|
171
|
+
const warnings: string[] = [];
|
|
172
|
+
for (const entry of entries) {
|
|
173
|
+
if (entry.firstLoadSize > limit) {
|
|
174
|
+
warnings.push(
|
|
175
|
+
`⚠ ${entry.path} first-load JS (${formatSize(entry.firstLoadSize)}) exceeds budget (${formatSize(limit)})`
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return warnings;
|
|
180
|
+
}
|
|
181
|
+
|
|
172
182
|
function pad(str: string, width: number, align: 'left' | 'right' = 'right'): string {
|
|
173
183
|
const gap = Math.max(0, width - stripAnsi(str).length);
|
|
174
184
|
return align === 'left' ? ' '.repeat(gap) + str : str + ' '.repeat(gap);
|
|
@@ -179,6 +189,120 @@ function stripAnsi(str: string): string {
|
|
|
179
189
|
return str.replace(/\u001b\[\d+m/g, '');
|
|
180
190
|
}
|
|
181
191
|
|
|
192
|
+
// ─── Prebuilt component stats ────────────────────────────────────────────
|
|
193
|
+
|
|
194
|
+
export interface PrebuiltComponentStats {
|
|
195
|
+
componentId: string;
|
|
196
|
+
entryCount: number;
|
|
197
|
+
totalBytes: number;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export interface PrebuiltReportData {
|
|
201
|
+
components: PrebuiltComponentStats[];
|
|
202
|
+
totalEntries: number;
|
|
203
|
+
totalBytes: number;
|
|
204
|
+
skippedCount: number;
|
|
205
|
+
skippedReasons: Array<{ componentId: string; route: string; message: string }>;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export function loadPrebuiltManifest(buildDir: string): PrebuiltManifest | null {
|
|
209
|
+
try {
|
|
210
|
+
const raw = readFileSync(join(buildDir, 'prebuilt', 'manifest.json'), 'utf-8');
|
|
211
|
+
return JSON.parse(raw) as PrebuiltManifest;
|
|
212
|
+
} catch {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export function buildPrebuiltReportData(
|
|
218
|
+
manifest: PrebuiltManifest | null,
|
|
219
|
+
summary: CaptureSummary | undefined
|
|
220
|
+
): PrebuiltReportData | null {
|
|
221
|
+
const hasCaptures = summary && (summary.captured > 0 || summary.skipped.length > 0);
|
|
222
|
+
if (!manifest && !hasCaptures) return null;
|
|
223
|
+
|
|
224
|
+
const components: PrebuiltComponentStats[] = [];
|
|
225
|
+
let totalEntries = 0;
|
|
226
|
+
let totalBytes = 0;
|
|
227
|
+
|
|
228
|
+
if (manifest) {
|
|
229
|
+
for (const [componentId, component] of Object.entries(manifest)) {
|
|
230
|
+
let entryCount = 0;
|
|
231
|
+
let componentBytes = 0;
|
|
232
|
+
for (const entry of Object.values(component.entries)) {
|
|
233
|
+
entryCount++;
|
|
234
|
+
componentBytes += entry.bytes ?? 0;
|
|
235
|
+
}
|
|
236
|
+
components.push({ componentId, entryCount, totalBytes: componentBytes });
|
|
237
|
+
totalEntries += entryCount;
|
|
238
|
+
totalBytes += componentBytes;
|
|
239
|
+
}
|
|
240
|
+
components.sort((a, b) => a.componentId.localeCompare(b.componentId));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const skippedCount = summary?.skipped.length ?? 0;
|
|
244
|
+
const skippedReasons = (summary?.skipped ?? []).map((s) => ({
|
|
245
|
+
componentId: s.componentId,
|
|
246
|
+
route: s.routeUrlPath,
|
|
247
|
+
message: s.message,
|
|
248
|
+
}));
|
|
249
|
+
|
|
250
|
+
return { components, totalEntries, totalBytes, skippedCount, skippedReasons };
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export function buildPrebuiltReport(data: PrebuiltReportData): string[] {
|
|
254
|
+
const lines: string[] = [];
|
|
255
|
+
|
|
256
|
+
const total = data.totalEntries + data.skippedCount;
|
|
257
|
+
lines.push(
|
|
258
|
+
`Prebuilt ${data.totalEntries}/${total} entries across ` +
|
|
259
|
+
`${data.components.length} component${data.components.length !== 1 ? 's' : ''}` +
|
|
260
|
+
(data.totalBytes > 0 ? ` (${formatSize(data.totalBytes)} total)` : '') +
|
|
261
|
+
'.' +
|
|
262
|
+
(data.skippedCount > 0 ? ` ${data.skippedCount} skipped due to errors.` : '')
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
if (data.components.length > 0) {
|
|
266
|
+
lines.push('');
|
|
267
|
+
const nameHeader = 'Component';
|
|
268
|
+
const entriesHeader = 'Entries';
|
|
269
|
+
const sizeHeader = 'Size';
|
|
270
|
+
|
|
271
|
+
const nameW = Math.max(
|
|
272
|
+
nameHeader.length + 2,
|
|
273
|
+
...data.components.map((c) => c.componentId.length + 4)
|
|
274
|
+
);
|
|
275
|
+
const entriesW = Math.max(entriesHeader.length, 8);
|
|
276
|
+
const sizeW = Math.max(sizeHeader.length, 10);
|
|
277
|
+
const totalW = nameW + entriesW + sizeW + 4;
|
|
278
|
+
const sep = '─'.repeat(totalW);
|
|
279
|
+
|
|
280
|
+
lines.push(
|
|
281
|
+
`${pad(nameHeader, nameW)} ${pad(entriesHeader, entriesW, 'left')} ${pad(sizeHeader, sizeW, 'left')}`
|
|
282
|
+
);
|
|
283
|
+
lines.push(sep);
|
|
284
|
+
|
|
285
|
+
for (const comp of data.components) {
|
|
286
|
+
const nameStr = ` ◆ ${comp.componentId}`;
|
|
287
|
+
const entriesStr = String(comp.entryCount);
|
|
288
|
+
const sizeStr = formatSize(comp.totalBytes);
|
|
289
|
+
lines.push(
|
|
290
|
+
`${pad(nameStr, nameW)} ${pad(entriesStr, entriesW, 'left')} ${pad(sizeStr, sizeW, 'left')}`
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (data.skippedReasons.length > 0) {
|
|
296
|
+
lines.push('');
|
|
297
|
+
lines.push('Skipped entries:');
|
|
298
|
+
for (const s of data.skippedReasons) {
|
|
299
|
+
lines.push(` ⚠ ${s.componentId} (${s.route}) — ${s.message}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return lines;
|
|
304
|
+
}
|
|
305
|
+
|
|
182
306
|
// ─── Bundle analysis ──────────────────────────────────────────────────────
|
|
183
307
|
|
|
184
308
|
interface ChunkSize {
|
|
@@ -189,6 +313,7 @@ interface ChunkSize {
|
|
|
189
313
|
interface OutputChunkLike {
|
|
190
314
|
type: 'chunk' | 'asset';
|
|
191
315
|
fileName: string;
|
|
316
|
+
name?: string;
|
|
192
317
|
code?: string;
|
|
193
318
|
source?: string | Uint8Array;
|
|
194
319
|
modules?: Record<string, unknown>;
|
|
@@ -228,13 +353,62 @@ export function findChunkForFile(
|
|
|
228
353
|
return null;
|
|
229
354
|
}
|
|
230
355
|
|
|
356
|
+
// ─── Route → chunk group matching ────────────────────────────────────────
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Derive the expected client chunk group prefix for a route.
|
|
360
|
+
*
|
|
361
|
+
* Mirrors the `clientChunkGroup` logic: extract the first non-group segment
|
|
362
|
+
* from the route's file path under appDir. Routes at the root level or
|
|
363
|
+
* without a matching segment return null (their JS is in client-shared).
|
|
364
|
+
*/
|
|
365
|
+
function routeChunkGroupPrefix(entryFilePath: string, appDir: string, root: string): string | null {
|
|
366
|
+
const appPrefix = relative(root, appDir).replace(/\\/g, '/') + '/';
|
|
367
|
+
const relPath = relative(root, entryFilePath).replace(/\\/g, '/');
|
|
368
|
+
if (!relPath.startsWith(appPrefix)) return null;
|
|
369
|
+
|
|
370
|
+
const withinApp = relPath.slice(appPrefix.length);
|
|
371
|
+
const segments = withinApp.split('/');
|
|
372
|
+
for (const seg of segments) {
|
|
373
|
+
if (seg.includes('.')) break;
|
|
374
|
+
if (seg.startsWith('(') && seg.endsWith(')')) continue;
|
|
375
|
+
return `client-${seg}`;
|
|
376
|
+
}
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Find all client bundle chunks belonging to a chunk group.
|
|
382
|
+
*
|
|
383
|
+
* Uses the chunk's `name` property (set by Rolldown from the `clientChunks`
|
|
384
|
+
* callback's return value) for exact matching. The `name` is the group name
|
|
385
|
+
* itself (e.g. `client-docs`), not the hashed filename.
|
|
386
|
+
*/
|
|
387
|
+
export function findChunksForGroup(
|
|
388
|
+
groupName: string,
|
|
389
|
+
chunkSizes: Map<string, ChunkSize>,
|
|
390
|
+
bundle?: Record<string, OutputChunkLike>
|
|
391
|
+
): string[] {
|
|
392
|
+
if (!bundle) return [];
|
|
393
|
+
const matched: string[] = [];
|
|
394
|
+
for (const [fileName, item] of Object.entries(bundle)) {
|
|
395
|
+
if (item.type !== 'chunk') continue;
|
|
396
|
+
if (item.name === groupName && chunkSizes.has(fileName)) {
|
|
397
|
+
matched.push(fileName);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return matched;
|
|
401
|
+
}
|
|
402
|
+
|
|
231
403
|
// ─── Build route entries from collected data ──────────────────────────────
|
|
232
404
|
|
|
233
405
|
function buildEntries(
|
|
234
406
|
routeTree: RouteTree,
|
|
235
407
|
chunkSizes: Map<string, ChunkSize>,
|
|
236
408
|
bundle: Record<string, OutputChunkLike>,
|
|
237
|
-
outputMode: 'server' | 'static'
|
|
409
|
+
outputMode: 'server' | 'static',
|
|
410
|
+
appDir?: string,
|
|
411
|
+
root?: string
|
|
238
412
|
): { entries: RouteEntry[]; sharedGzip: number } {
|
|
239
413
|
const routeInfos = collectRoutes(routeTree);
|
|
240
414
|
|
|
@@ -242,7 +416,7 @@ function buildEntries(
|
|
|
242
416
|
let totalGzip = 0;
|
|
243
417
|
for (const s of chunkSizes.values()) totalGzip += s.gzip;
|
|
244
418
|
|
|
245
|
-
// Per-route sizes
|
|
419
|
+
// Per-route sizes. Track route-specific chunks to compute shared size.
|
|
246
420
|
const routeChunkFiles = new Set<string>();
|
|
247
421
|
const entries: RouteEntry[] = [];
|
|
248
422
|
|
|
@@ -251,14 +425,36 @@ function buildEntries(
|
|
|
251
425
|
let gzip = 0;
|
|
252
426
|
|
|
253
427
|
if (info.entryFilePath) {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
428
|
+
// Try chunk group matching first (works for server component routes
|
|
429
|
+
// whose client JS is in client-<segment> chunks, not in the route's
|
|
430
|
+
// own page.tsx chunk). Falls back to direct chunk lookup.
|
|
431
|
+
let matched = false;
|
|
432
|
+
if (appDir && root) {
|
|
433
|
+
const groupPrefix = routeChunkGroupPrefix(info.entryFilePath, appDir, root);
|
|
434
|
+
if (groupPrefix) {
|
|
435
|
+
const chunks = findChunksForGroup(groupPrefix, chunkSizes, bundle);
|
|
436
|
+
for (const chunk of chunks) {
|
|
437
|
+
const s = chunkSizes.get(chunk);
|
|
438
|
+
if (s) {
|
|
439
|
+
raw += s.raw;
|
|
440
|
+
gzip += s.gzip;
|
|
441
|
+
}
|
|
442
|
+
routeChunkFiles.add(chunk);
|
|
443
|
+
}
|
|
444
|
+
if (chunks.length > 0) matched = true;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
if (!matched) {
|
|
449
|
+
const chunk = findChunkForFile(info.entryFilePath, bundle);
|
|
450
|
+
if (chunk) {
|
|
451
|
+
const s = chunkSizes.get(chunk);
|
|
452
|
+
if (s) {
|
|
453
|
+
raw = s.raw;
|
|
454
|
+
gzip = s.gzip;
|
|
455
|
+
}
|
|
456
|
+
routeChunkFiles.add(chunk);
|
|
260
457
|
}
|
|
261
|
-
routeChunkFiles.add(chunk);
|
|
262
458
|
}
|
|
263
459
|
}
|
|
264
460
|
|
|
@@ -357,17 +553,39 @@ export function timberBuildReport(ctx: PluginContext): Plugin {
|
|
|
357
553
|
})),
|
|
358
554
|
sharedGzip: 0,
|
|
359
555
|
}
|
|
360
|
-
: buildEntries(ctx.routeTree, chunkSizes, clientBundle, outputMode);
|
|
556
|
+
: buildEntries(ctx.routeTree, chunkSizes, clientBundle, outputMode, ctx.appDir, ctx.root);
|
|
361
557
|
const elapsed = ((performance.now() - buildStart) / 1000).toFixed(2);
|
|
362
558
|
const lines = buildRouteReport(entries, sharedGzip);
|
|
363
559
|
|
|
364
560
|
logger.info('');
|
|
365
561
|
for (const line of lines) logger.info(line);
|
|
562
|
+
|
|
563
|
+
const warnings = buildWarnings(entries, ctx.config.budget);
|
|
564
|
+
if (warnings.length > 0) {
|
|
565
|
+
logger.info('');
|
|
566
|
+
for (const w of warnings) logger.warn(w);
|
|
567
|
+
}
|
|
568
|
+
|
|
366
569
|
logger.info('');
|
|
367
570
|
logger.info(
|
|
368
571
|
`✓ built ${entries.length} routes for all three environments (rsc, ssr, client) in ${elapsed}s`
|
|
369
572
|
);
|
|
370
573
|
logger.info('');
|
|
371
574
|
},
|
|
575
|
+
|
|
576
|
+
buildApp: {
|
|
577
|
+
order: 'post' as const,
|
|
578
|
+
async handler() {
|
|
579
|
+
if (ctx.dev || !logger) return;
|
|
580
|
+
const manifest = loadPrebuiltManifest(ctx.buildDir);
|
|
581
|
+
const prebuiltData = buildPrebuiltReportData(manifest, ctx.captureSummary);
|
|
582
|
+
if (!prebuiltData) return;
|
|
583
|
+
|
|
584
|
+
logger.info('');
|
|
585
|
+
const prebuiltLines = buildPrebuiltReport(prebuiltData);
|
|
586
|
+
for (const line of prebuiltLines) logger.info(line);
|
|
587
|
+
logger.info('');
|
|
588
|
+
},
|
|
589
|
+
},
|
|
372
590
|
};
|
|
373
591
|
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* timber-cache-transform — Vite plugin that injects stable callsite IDs
|
|
3
|
+
* into `cache.data()` calls imported from `@timber-js/app/cache`.
|
|
4
|
+
*
|
|
5
|
+
* Detected callsite forms (TIM-1054):
|
|
6
|
+
* - named imports, including aliases: `import { cache as c }` + `c.data(fn, opts)`
|
|
7
|
+
* - namespace imports: `import * as ns` + `ns.cache.data(fn, opts)`
|
|
8
|
+
* Forms a per-module transform cannot trace — local variable aliases
|
|
9
|
+
* (`const c = cache`), user re-export wrapper modules, computed access
|
|
10
|
+
* (`cache['data']`) — fall back to the runtime fnId derived from
|
|
11
|
+
* fnv1a(fn.toString()) (see cache/timber-cache.ts), which is deterministic
|
|
12
|
+
* across instances and cold starts of the same build. Without either
|
|
13
|
+
* mechanism, an ordinal counter would collide across instances with a shared
|
|
14
|
+
* CacheHandler (Redis/KV) — cache key poisoning, serving one route's cached
|
|
15
|
+
* data to another.
|
|
16
|
+
*
|
|
17
|
+
* The plugin transforms:
|
|
18
|
+
* cache.data(fn, opts) → cache.data(fn, opts, "stable-id")
|
|
19
|
+
* ns.cache.data(fn, opts) → ns.cache.data(fn, opts, "stable-id")
|
|
20
|
+
*
|
|
21
|
+
* where stable-id =
|
|
22
|
+
* fnv1a(relPath + ":cache:" + fnv1a(stmtText) + ":" + fnv1a(callSpanText) + ":" + occurrence)
|
|
23
|
+
*
|
|
24
|
+
* stmtText is the source text of the enclosing *top-level statement* and
|
|
25
|
+
* callSpanText is the source text of the cache(...) call expression itself.
|
|
26
|
+
*
|
|
27
|
+
* The ID is derived from the *content* of the call, not its ordinal position
|
|
28
|
+
* in the file. A position-based index (the original TIM-997 scheme) was stable
|
|
29
|
+
* within one build but shifted across builds: inserting, deleting, or
|
|
30
|
+
* reordering a cache() call changed the index of every call below it, so with
|
|
31
|
+
* a persistent shared CacheHandler (Redis/KV) a new function could inherit
|
|
32
|
+
* another function's old ID and serve its persisted data — cross-deploy cache
|
|
33
|
+
* poisoning (TIM-1053). Content hashing makes IDs immune to reordering and
|
|
34
|
+
* unrelated edits, while a changed call gets a fresh ID — which is exactly
|
|
35
|
+
* when invalidation is wanted.
|
|
36
|
+
*
|
|
37
|
+
* The enclosing-statement text is included so that byte-identical cache.data()
|
|
38
|
+
* calls in different scopes — e.g. two factory helpers that each `return
|
|
39
|
+
* cache.data(fn, { ttl: 60 })` — get distinct, insertion-stable IDs: their
|
|
40
|
+
* enclosing declarations differ by name/body even when the call spans are
|
|
41
|
+
* identical. Without it, a source-order occurrence counter alone would shift
|
|
42
|
+
* when an identical span is inserted above, reassigning IDs across deploys.
|
|
43
|
+
* Calls that are byte-identical INCLUDING their enclosing top-level statement
|
|
44
|
+
* are disambiguated by a source-order occurrence index. That residue is safe:
|
|
45
|
+
* identical top-level declarations are a redeclaration error, so fully
|
|
46
|
+
* identical (statement, call) pairs can only be expression statements
|
|
47
|
+
* referencing the same bindings — the same function, where an ID swap is
|
|
48
|
+
* harmless.
|
|
49
|
+
*
|
|
50
|
+
* AST helpers and the ID derivation are shared with timber-prebuilt
|
|
51
|
+
* (plugins/prebuilt.ts) via plugins/callsite-ast.ts.
|
|
52
|
+
*
|
|
53
|
+
* See TIM-997, TIM-1053, design/06-caching.md §"Cache Key Security".
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
import { relative } from 'node:path';
|
|
57
|
+
import MagicString from 'magic-string';
|
|
58
|
+
import type { Plugin } from 'vite';
|
|
59
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
60
|
+
import {
|
|
61
|
+
CACHE_MODULE_SOURCES,
|
|
62
|
+
collectShadowRanges,
|
|
63
|
+
findCallSites,
|
|
64
|
+
findImportBindings,
|
|
65
|
+
generateStableCallsiteId,
|
|
66
|
+
} from './callsite-ast.js';
|
|
67
|
+
import type {
|
|
68
|
+
CallExpressionNode,
|
|
69
|
+
IdentifierNode,
|
|
70
|
+
ImportBindings,
|
|
71
|
+
MemberExpressionNode,
|
|
72
|
+
PositionedNode,
|
|
73
|
+
ProgramNode,
|
|
74
|
+
ShadowRange,
|
|
75
|
+
} from './callsite-ast.js';
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Is this callee a `cache.data(...)` call? Matches two forms:
|
|
79
|
+
* - Named import: `cache.data(fn, opts)` where `cache` is the imported binding
|
|
80
|
+
* - Namespace import: `ns.cache.data(fn, opts)` where `ns` is the namespace
|
|
81
|
+
* Computed access (`cache['data']`) is deliberately not matched; it falls back
|
|
82
|
+
* to the runtime fnId derivation.
|
|
83
|
+
*/
|
|
84
|
+
function isCacheDataCallee(callee: PositionedNode, bindings: ImportBindings): boolean {
|
|
85
|
+
if (callee.type !== 'MemberExpression') return false;
|
|
86
|
+
const member = callee as unknown as MemberExpressionNode;
|
|
87
|
+
if (member.computed) return false;
|
|
88
|
+
if (member.property.type !== 'Identifier' || (member.property as IdentifierNode).name !== 'data')
|
|
89
|
+
return false;
|
|
90
|
+
|
|
91
|
+
const obj = member.object;
|
|
92
|
+
// Named import: `cache.data(...)` — obj is the imported `cache` identifier
|
|
93
|
+
if (obj.type === 'Identifier') {
|
|
94
|
+
return bindings.named.has((obj as IdentifierNode).name);
|
|
95
|
+
}
|
|
96
|
+
// Namespace import: `ns.cache.data(...)` — obj is `ns.cache`
|
|
97
|
+
if (obj.type === 'MemberExpression') {
|
|
98
|
+
const outer = obj as unknown as MemberExpressionNode;
|
|
99
|
+
return (
|
|
100
|
+
!outer.computed &&
|
|
101
|
+
outer.object.type === 'Identifier' &&
|
|
102
|
+
bindings.namespaces.has((outer.object as IdentifierNode).name) &&
|
|
103
|
+
outer.property.type === 'Identifier' &&
|
|
104
|
+
(outer.property as IdentifierNode).name === 'cache'
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Extract the local binding name that a cache.data callee resolves to — the
|
|
112
|
+
* `cache` identifier for named imports, or the namespace object for `ns.cache.data()`.
|
|
113
|
+
*/
|
|
114
|
+
function calleeBindingName(callee: PositionedNode, bindings: ImportBindings): string | null {
|
|
115
|
+
if (callee.type !== 'MemberExpression') return null;
|
|
116
|
+
const member = callee as unknown as MemberExpressionNode;
|
|
117
|
+
const obj = member.object;
|
|
118
|
+
// Named import: `cache.data(...)` — binding is `cache`
|
|
119
|
+
if (obj.type === 'Identifier') {
|
|
120
|
+
const name = (obj as IdentifierNode).name;
|
|
121
|
+
return bindings.named.has(name) ? name : null;
|
|
122
|
+
}
|
|
123
|
+
// Namespace import: `ns.cache.data(...)` — binding is `ns`
|
|
124
|
+
if (obj.type === 'MemberExpression') {
|
|
125
|
+
const outer = obj as unknown as MemberExpressionNode;
|
|
126
|
+
if (outer.object.type === 'Identifier') {
|
|
127
|
+
const name = (outer.object as IdentifierNode).name;
|
|
128
|
+
return bindings.namespaces.has(name) ? name : null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Generate a stable callsite ID for a cache() call. See callsite-ast.ts for
|
|
136
|
+
* the derivation properties.
|
|
137
|
+
*/
|
|
138
|
+
function generateStableId(
|
|
139
|
+
relativeModulePath: string,
|
|
140
|
+
statementText: string,
|
|
141
|
+
callSpanText: string,
|
|
142
|
+
occurrence: number
|
|
143
|
+
): string {
|
|
144
|
+
return generateStableCallsiteId(
|
|
145
|
+
relativeModulePath,
|
|
146
|
+
'cache',
|
|
147
|
+
statementText,
|
|
148
|
+
callSpanText,
|
|
149
|
+
occurrence
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function timberCacheTransform(ctx: PluginContext): Plugin {
|
|
154
|
+
return {
|
|
155
|
+
name: 'timber-cache-transform',
|
|
156
|
+
|
|
157
|
+
transform(code, id) {
|
|
158
|
+
if (!code.includes('@timber-js/app/cache') && !code.includes('timber/cache')) return;
|
|
159
|
+
// Skip node_modules (don't transform third-party code)
|
|
160
|
+
if (id.includes('node_modules')) return;
|
|
161
|
+
|
|
162
|
+
let program: ProgramNode;
|
|
163
|
+
try {
|
|
164
|
+
program = ctx.parseCached!.parse(code);
|
|
165
|
+
} catch {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const cacheBindings = findImportBindings(program, CACHE_MODULE_SOURCES, 'cache');
|
|
170
|
+
if (cacheBindings.named.size === 0 && cacheBindings.namespaces.size === 0) return;
|
|
171
|
+
|
|
172
|
+
// Collect byte ranges where tracked binding names are shadowed by
|
|
173
|
+
// function/arrow parameters or catch bindings (TIM-1141). Calls inside
|
|
174
|
+
// these ranges are NOT rewritten — they fall back to the runtime fnId.
|
|
175
|
+
const trackedNames = new Set([...cacheBindings.named, ...cacheBindings.namespaces]);
|
|
176
|
+
const shadowRanges: ShadowRange[] = [];
|
|
177
|
+
collectShadowRanges(program, trackedNames, shadowRanges);
|
|
178
|
+
|
|
179
|
+
// Check whether the specific binding name a callee resolves to is
|
|
180
|
+
// shadowed at the call position. Only that name is blocked — other
|
|
181
|
+
// tracked imports from the same module remain valid (codex review
|
|
182
|
+
// on PR #876).
|
|
183
|
+
const isCalleeShadowed = (call: CallExpressionNode): boolean => {
|
|
184
|
+
const name = calleeBindingName(call.callee, cacheBindings);
|
|
185
|
+
if (!name) return false;
|
|
186
|
+
return shadowRanges.some(
|
|
187
|
+
(r) => call.start >= r.start && call.start < r.end && r.names.has(name)
|
|
188
|
+
);
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
// Collect call sites per top-level statement so each call carries its
|
|
192
|
+
// enclosing statement's source text into the ID hash.
|
|
193
|
+
const callSites: Array<{ call: CallExpressionNode; stmt: PositionedNode }> = [];
|
|
194
|
+
for (const stmt of program.body) {
|
|
195
|
+
const calls: CallExpressionNode[] = [];
|
|
196
|
+
findCallSites(
|
|
197
|
+
stmt,
|
|
198
|
+
(call) =>
|
|
199
|
+
call.arguments.length === 2 &&
|
|
200
|
+
isCacheDataCallee(call.callee, cacheBindings) &&
|
|
201
|
+
!isCalleeShadowed(call),
|
|
202
|
+
calls
|
|
203
|
+
);
|
|
204
|
+
for (const call of calls) callSites.push({ call, stmt });
|
|
205
|
+
}
|
|
206
|
+
if (callSites.length === 0) return;
|
|
207
|
+
|
|
208
|
+
// Sort by position in file so occurrence indices among byte-identical
|
|
209
|
+
// (statement, call) pairs are assigned in deterministic source order
|
|
210
|
+
callSites.sort((a, b) => a.call.start - b.call.start);
|
|
211
|
+
|
|
212
|
+
const root = ctx.root || process.cwd();
|
|
213
|
+
const relPath = relative(root, id);
|
|
214
|
+
const s = new MagicString(code);
|
|
215
|
+
const occurrences = new Map<string, number>();
|
|
216
|
+
|
|
217
|
+
for (const { call, stmt } of callSites) {
|
|
218
|
+
const stmtText = code.slice(stmt.start, stmt.end);
|
|
219
|
+
const spanText = code.slice(call.start, call.end);
|
|
220
|
+
const dupKey = stmtText + String.fromCharCode(0) + spanText;
|
|
221
|
+
const occurrence = occurrences.get(dupKey) ?? 0;
|
|
222
|
+
occurrences.set(dupKey, occurrence + 1);
|
|
223
|
+
const stableId = generateStableId(relPath, stmtText, spanText, occurrence);
|
|
224
|
+
// Insert the stable ID as the 3rd argument directly after the last
|
|
225
|
+
// argument — NOT before the closing ')'. The call may already have a
|
|
226
|
+
// trailing comma after the options argument (Prettier v3 default for
|
|
227
|
+
// multiline calls); inserting before ')' would emit `,, "id"`, a
|
|
228
|
+
// parse error (TIM-1021). A trailing comma after the inserted
|
|
229
|
+
// argument remains valid JS.
|
|
230
|
+
const lastArg = call.arguments[call.arguments.length - 1];
|
|
231
|
+
s.appendLeft(lastArg.end, `, "${stableId}"`);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return {
|
|
235
|
+
code: s.toString(),
|
|
236
|
+
map: s.generateMap({ hires: 'boundary' }),
|
|
237
|
+
};
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Exported for testing
|
|
243
|
+
export { generateStableId };
|