@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.161
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-cjklt63G.js +317 -0
- package/dist/_chunks/actions-cjklt63G.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-CzYUlgXA.js +1125 -0
- package/dist/_chunks/cache-api-CzYUlgXA.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
- package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-NfLbLnDw.js +638 -0
- package/dist/_chunks/cli-schema-sync-NfLbLnDw.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-Bssfp6ot.js +82 -0
- package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
- package/dist/_chunks/define-CFmvb4Bt.js +203 -0
- package/dist/_chunks/define-CFmvb4Bt.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/logger-B_O6-mdJ.js +1485 -0
- package/dist/_chunks/logger-B_O6-mdJ.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-DeAxFRMq.js +280 -0
- package/dist/_chunks/plugin-context-DeAxFRMq.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-3iUvBV5T.js +50 -0
- package/dist/_chunks/resolve-schema-3iUvBV5T.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-BY3QLBL7.js +119 -0
- package/dist/_chunks/schema-bridge-BY3QLBL7.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/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/tree-match-D2l830j2.js +102 -0
- package/dist/_chunks/tree-match-D2l830j2.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/walkers-9mz9T7mb.js +988 -0
- package/dist/_chunks/walkers-9mz9T7mb.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 +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +117 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +177 -20
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +337 -64
- package/dist/adapters/cloudflare.js.map +1 -1
- 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 +1 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +144 -152
- 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 +0 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/cache-api.d.ts +26 -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 +27 -7
- 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/redis-handler.d.ts +97 -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 +51 -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 +34 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +107 -33
- 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 +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 +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/child-segment-context.d.ts +22 -0
- package/dist/client/child-segment-context.d.ts.map +1 -0
- package/dist/client/child-segment-outlet.d.ts +18 -0
- package/dist/client/child-segment-outlet.d.ts.map +1 -0
- package/dist/client/child-segment-provider.d.ts +21 -0
- package/dist/client/child-segment-provider.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 +11 -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 +182 -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 +825 -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 +120 -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 +87 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +47 -14
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +4 -4
- 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/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 +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +304 -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} +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/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 +158 -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 +8471 -14108
- 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 +190 -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 +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 +1 -1
- 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.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/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 +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 +91 -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 +37 -440
- 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 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +86 -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 +6 -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 +115 -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 +221 -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 +170 -2911
- 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 +3652 -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 +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 +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +122 -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 +58 -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/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/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 +101 -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/route-element-builder.d.ts +46 -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/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 +51 -28
- 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 +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 +5 -6
- 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 +7 -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 +12 -5
- 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 +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/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 +16 -16
- 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 +199 -0
- package/docs/api/33-api-search-params.mdx +141 -0
- package/docs/api/34-api-config.mdx +189 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +76 -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 +136 -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 +168 -0
- package/docs/learn/13-configuration.mdx +145 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +139 -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 +103 -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 +179 -0
- package/src/adapters/cloudflare.ts +571 -118
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +131 -107
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/types.ts +0 -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 +88 -18
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/redis-handler.ts +122 -15
- 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 +233 -0
- package/src/cache/timber-cache.ts +142 -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 +388 -0
- package/src/cli.ts +157 -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 +111 -0
- package/src/client/browser-entry/post-hydration.ts +103 -0
- package/src/client/browser-entry/router-init.ts +287 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/child-segment-context.ts +40 -0
- package/src/client/child-segment-outlet.tsx +25 -0
- package/src/client/child-segment-provider.tsx +27 -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 +11 -7
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +346 -150
- package/src/client/navigation-api.ts +341 -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 +482 -166
- package/src/client/rsc-fetch.ts +214 -33
- package/src/client/segment-cache.ts +7 -7
- 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/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 +9 -3
- 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 +147 -0
- package/src/config-types.ts +302 -0
- package/src/config-validation.ts +328 -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} +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 +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 +63 -8
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +316 -0
- package/src/fonts/transform.ts +305 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +431 -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 +378 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +229 -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 +144 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +293 -46
- package/src/plugins/entries.ts +129 -8
- package/src/plugins/fonts.ts +199 -664
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt.ts +700 -0
- package/src/plugins/prerender-sugar.ts +329 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +97 -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 +360 -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 +310 -0
- package/src/routing/manifest-codegen.ts +281 -0
- package/src/routing/scanner.ts +248 -188
- 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 +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 +252 -0
- package/src/search-params/define.ts +570 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +110 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +84 -34
- package/src/server/action-client.ts +119 -28
- 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 +130 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +13 -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 +311 -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 +437 -0
- package/src/server/html-injectors.ts +267 -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 +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +331 -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 +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +538 -0
- package/src/server/pipeline.ts +226 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +224 -0
- package/src/server/prebuilt/capture-state.ts +89 -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/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +774 -0
- package/src/server/prebuilt-runtime.ts +731 -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 +168 -337
- package/src/server/route-element-builder.ts +548 -233
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +144 -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 +306 -89
- package/src/server/rsc-entry/helpers.ts +160 -76
- package/src/server/rsc-entry/index.ts +394 -330
- package/src/server/rsc-entry/render-route.ts +288 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +74 -35
- 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 +273 -43
- 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/server-only-guard-noop.js +3 -0
- package/src/server/sitemap-generator.ts +344 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +258 -257
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -78
- package/src/server/ssr-render.ts +345 -82
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +286 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +220 -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.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/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
|
@@ -1,101 +1,36 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Compiles server/compress.ts into a standalone ESM module (_compress.mjs)
|
|
2
|
+
// for self-hosted deployments. The adapter writes this to the build output
|
|
3
|
+
// during buildOutput(). It's imported by the Nitro entry and preview server
|
|
4
|
+
// at runtime.
|
|
2
5
|
//
|
|
3
|
-
//
|
|
4
|
-
// written
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
|
|
6
|
+
// By compiling the actual TypeScript source rather than maintaining a
|
|
7
|
+
// hand-written string template, any fix to server/compress.ts automatically
|
|
8
|
+
// flows to the production module. See design/18-build-system.md ("entry
|
|
9
|
+
// modules are real TypeScript files, not codegen strings").
|
|
10
|
+
|
|
11
|
+
import { transformWithOxc } from 'vite';
|
|
12
|
+
// Vite's ?raw import embeds the file as a string at build time — works
|
|
13
|
+
// in both dev (Vite resolves the TS source) and the published package
|
|
14
|
+
// (the string is inlined into the compiled adapter entry).
|
|
15
|
+
import compressSource from '../server/compress.ts?raw';
|
|
13
16
|
|
|
14
17
|
/**
|
|
15
|
-
*
|
|
18
|
+
* Compile server/compress.ts into a standalone ESM module.
|
|
16
19
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
20
|
+
* Uses Vite's OXC transform to strip TypeScript types from the
|
|
21
|
+
* embedded source. The result is written to `_compress.mjs` during
|
|
22
|
+
* buildOutput.
|
|
19
23
|
*
|
|
20
24
|
* @internal Exported for testing.
|
|
21
25
|
*/
|
|
22
|
-
export function generateCompressModule(): string {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
// Uses CompressionStream (Web API) for gzip. Brotli is left to CDNs/reverse
|
|
26
|
-
// proxies — at streaming quality levels its ratio advantage is marginal and
|
|
27
|
-
// node:zlib buffers output internally, breaking streaming.
|
|
28
|
-
|
|
29
|
-
const COMPRESSIBLE_TYPES = new Set([
|
|
30
|
-
'text/html', 'text/css', 'text/plain', 'text/xml', 'text/javascript',
|
|
31
|
-
'text/x-component', 'application/json', 'application/javascript',
|
|
32
|
-
'application/xml', 'application/xhtml+xml', 'application/rss+xml',
|
|
33
|
-
'application/atom+xml', 'image/svg+xml',
|
|
34
|
-
]);
|
|
35
|
-
|
|
36
|
-
const NO_COMPRESS_STATUSES = new Set([204, 304]);
|
|
37
|
-
|
|
38
|
-
function negotiateEncoding(acceptEncoding) {
|
|
39
|
-
if (!acceptEncoding) return null;
|
|
40
|
-
// Parse tokens with quality values. Per RFC 9110 §12.5.3, q=0 means
|
|
41
|
-
// "not acceptable" — the client explicitly rejects that encoding.
|
|
42
|
-
// Brotli (br) is intentionally not handled at the application level.
|
|
43
|
-
const parts = acceptEncoding.split(',');
|
|
44
|
-
for (const part of parts) {
|
|
45
|
-
const [token, ...params] = part.split(';');
|
|
46
|
-
const name = token.trim().toLowerCase();
|
|
47
|
-
if (name !== 'gzip') continue;
|
|
48
|
-
let qValue = 1;
|
|
49
|
-
for (const param of params) {
|
|
50
|
-
const trimmed = param.trim().toLowerCase();
|
|
51
|
-
if (trimmed.startsWith('q=')) {
|
|
52
|
-
qValue = parseFloat(trimmed.slice(2));
|
|
53
|
-
if (Number.isNaN(qValue)) qValue = 1;
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (qValue > 0) return 'gzip';
|
|
58
|
-
}
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function shouldCompress(response) {
|
|
63
|
-
if (!response.body) return false;
|
|
64
|
-
if (NO_COMPRESS_STATUSES.has(response.status)) return false;
|
|
65
|
-
if (response.headers.has('Content-Encoding')) return false;
|
|
66
|
-
const contentType = response.headers.get('Content-Type');
|
|
67
|
-
if (!contentType) return false;
|
|
68
|
-
const mimeType = contentType.split(';')[0].trim().toLowerCase();
|
|
69
|
-
if (mimeType === 'text/event-stream') return false;
|
|
70
|
-
return COMPRESSIBLE_TYPES.has(mimeType);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function compressWithGzip(body) {
|
|
74
|
-
return body.pipeThrough(new CompressionStream('gzip'));
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export function compressResponse(request, response) {
|
|
78
|
-
if (!shouldCompress(response)) return response;
|
|
79
|
-
const acceptEncoding = request.headers.get('Accept-Encoding') || '';
|
|
80
|
-
const encoding = negotiateEncoding(acceptEncoding);
|
|
81
|
-
if (!encoding) return response;
|
|
82
|
-
const compressedBody = compressWithGzip(response.body);
|
|
83
|
-
const headers = new Headers(response.headers);
|
|
84
|
-
headers.set('Content-Encoding', encoding);
|
|
85
|
-
headers.delete('Content-Length');
|
|
86
|
-
const existingVary = headers.get('Vary');
|
|
87
|
-
if (existingVary) {
|
|
88
|
-
if (!existingVary.toLowerCase().includes('accept-encoding')) {
|
|
89
|
-
headers.set('Vary', existingVary + ', Accept-Encoding');
|
|
90
|
-
}
|
|
91
|
-
} else {
|
|
92
|
-
headers.set('Vary', 'Accept-Encoding');
|
|
93
|
-
}
|
|
94
|
-
return new Response(compressedBody, {
|
|
95
|
-
status: response.status,
|
|
96
|
-
statusText: response.statusText,
|
|
97
|
-
headers,
|
|
26
|
+
export async function generateCompressModule(): Promise<string> {
|
|
27
|
+
const result = await transformWithOxc(compressSource, 'compress.ts', {
|
|
28
|
+
lang: 'ts',
|
|
98
29
|
});
|
|
99
|
-
|
|
100
|
-
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
'// Generated by @timber-js/app — compiled from server/compress.ts.\n' +
|
|
33
|
+
'// Do not edit — this file is regenerated on each build.\n' +
|
|
34
|
+
result.code
|
|
35
|
+
);
|
|
101
36
|
}
|
package/src/adapters/nitro.ts
CHANGED
|
@@ -5,28 +5,13 @@
|
|
|
5
5
|
// compression, graceful shutdown, static file serving, and platform quirks.
|
|
6
6
|
// See design/11-platform.md and design/25-production-deployments.md.
|
|
7
7
|
|
|
8
|
-
import { writeFile, readFile
|
|
8
|
+
import { writeFile, readFile } from 'node:fs/promises';
|
|
9
9
|
import { execFile } from 'node:child_process';
|
|
10
10
|
import { join, relative } from 'node:path';
|
|
11
11
|
import type { TimberPlatformAdapter, TimberConfig } from './types';
|
|
12
12
|
import { generateCompressModule } from './compress-module.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// directory .ts imports don't resolve.
|
|
16
|
-
const IMMUTABLE_CACHE = 'public, max-age=31536000, immutable';
|
|
17
|
-
const STATIC_CACHE = 'public, max-age=3600, must-revalidate';
|
|
18
|
-
|
|
19
|
-
function generateHeadersFile(): string {
|
|
20
|
-
return `# Auto-generated by @timber-js/app — static asset cache headers.
|
|
21
|
-
# See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
22
|
-
|
|
23
|
-
/assets/*
|
|
24
|
-
Cache-Control: ${IMMUTABLE_CACHE}
|
|
25
|
-
|
|
26
|
-
/*
|
|
27
|
-
Cache-Control: ${STATIC_CACHE}
|
|
28
|
-
`;
|
|
29
|
-
}
|
|
13
|
+
import { IMMUTABLE_CACHE } from './shared.js';
|
|
14
|
+
import { runSharedBuildSteps } from './build-output-helper.js';
|
|
30
15
|
|
|
31
16
|
// ─── Presets ─────────────────────────────────────────────────────────────────
|
|
32
17
|
|
|
@@ -195,46 +180,25 @@ export function nitro(options: NitroAdapterOptions = {}): TimberPlatformAdapter
|
|
|
195
180
|
const preset = options.preset ?? 'node-server';
|
|
196
181
|
const compress = options.compress ?? true;
|
|
197
182
|
const presetConfig = PRESET_CONFIGS[preset];
|
|
198
|
-
const pendingPromises: Promise<unknown>[] = [];
|
|
199
|
-
|
|
200
183
|
return {
|
|
201
184
|
name: `nitro-${preset}`,
|
|
202
185
|
|
|
203
186
|
async buildOutput(config: TimberConfig, buildDir: string) {
|
|
204
187
|
const outDir = join(buildDir, 'nitro');
|
|
205
|
-
await mkdir(outDir, { recursive: true });
|
|
206
|
-
|
|
207
|
-
// Copy client assets to public directory.
|
|
208
|
-
// When client JavaScript is disabled, skip .js files — only CSS,
|
|
209
|
-
// fonts, images, and other static assets are needed.
|
|
210
|
-
const clientDir = join(buildDir, 'client');
|
|
211
|
-
const publicDir = join(outDir, 'public');
|
|
212
|
-
await mkdir(publicDir, { recursive: true });
|
|
213
|
-
await cp(clientDir, publicDir, {
|
|
214
|
-
recursive: true,
|
|
215
|
-
filter: config.clientJavascriptDisabled ? (src: string) => !src.endsWith('.js') : undefined,
|
|
216
|
-
}).catch(() => {
|
|
217
|
-
// Client dir may not exist when client JavaScript is disabled
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
// Write _headers file for platforms that support it (Netlify, etc.).
|
|
221
|
-
// See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
222
|
-
await writeFile(join(publicDir, '_headers'), generateHeadersFile());
|
|
223
188
|
|
|
224
|
-
//
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
189
|
+
// Steps 1–5: shared across all adapters (mkdir, copy client/rsc/ssr,
|
|
190
|
+
// write _headers, write manifest-init).
|
|
191
|
+
await runSharedBuildSteps({
|
|
192
|
+
config,
|
|
193
|
+
buildDir,
|
|
194
|
+
outDir,
|
|
195
|
+
publicDirName: 'public',
|
|
196
|
+
});
|
|
228
197
|
|
|
229
198
|
// Write the compression helper module for runtime use.
|
|
230
199
|
// See design/25-production-deployments.md — self-hosted deployments
|
|
231
200
|
// need application-level compression (Cloudflare handles it at the edge).
|
|
232
|
-
await writeFile(join(outDir, '_compress.mjs'), generateCompressModule());
|
|
233
|
-
|
|
234
|
-
// Copy rsc/ssr build output into the nitro dir so imports stay local
|
|
235
|
-
// during the Nitro bundling step (avoids broken relative paths in output).
|
|
236
|
-
await cp(join(buildDir, 'rsc'), join(outDir, 'rsc'), { recursive: true });
|
|
237
|
-
await cp(join(buildDir, 'ssr'), join(outDir, 'ssr'), { recursive: true }).catch(() => {});
|
|
201
|
+
await writeFile(join(outDir, '_compress.mjs'), await generateCompressModule());
|
|
238
202
|
|
|
239
203
|
// Prepend the manifest assignment directly into the RSC entry so
|
|
240
204
|
// globalThis.__TIMBER_BUILD_MANIFEST__ is set before any module reads it.
|
|
@@ -272,15 +236,6 @@ export function nitro(options: NitroAdapterOptions = {}): TimberPlatformAdapter
|
|
|
272
236
|
await spawnNitroPreview(command, [scriptPath], join(buildDir, 'nitro'));
|
|
273
237
|
}
|
|
274
238
|
: undefined,
|
|
275
|
-
|
|
276
|
-
waitUntil: presetConfig.supportsWaitUntil
|
|
277
|
-
? (promise: Promise<unknown>) => {
|
|
278
|
-
const tracked = promise.catch((err) => {
|
|
279
|
-
console.error('[timber] waitUntil promise rejected:', err);
|
|
280
|
-
});
|
|
281
|
-
pendingPromises.push(tracked);
|
|
282
|
-
}
|
|
283
|
-
: undefined,
|
|
284
239
|
};
|
|
285
240
|
}
|
|
286
241
|
|
|
@@ -291,8 +246,7 @@ export function generateNitroEntry(
|
|
|
291
246
|
buildDir: string,
|
|
292
247
|
outDir: string,
|
|
293
248
|
preset: NitroPreset,
|
|
294
|
-
compress = true
|
|
295
|
-
hasManifestInit = false
|
|
249
|
+
compress = true
|
|
296
250
|
): string {
|
|
297
251
|
// The RSC entry is the main request handler — it exports the fetch handler as default.
|
|
298
252
|
// rsc/ is copied into the nitro dir so the import is local.
|
|
@@ -349,11 +303,6 @@ export function generateNitroEntry(
|
|
|
349
303
|
handlerCall = ` const webResponse = await handler(webRequest)`;
|
|
350
304
|
}
|
|
351
305
|
|
|
352
|
-
// Build manifest init must be imported before the handler so that
|
|
353
|
-
// globalThis.__TIMBER_BUILD_MANIFEST__ is set when the virtual module evaluates.
|
|
354
|
-
// ESM guarantees imports are evaluated in order.
|
|
355
|
-
const manifestImport = hasManifestInit ? "import './_timber-manifest-init.js'\n" : '';
|
|
356
|
-
|
|
357
306
|
// Import runWithWaitUntil only when the preset supports it.
|
|
358
307
|
const waitUntilImport = supportsWaitUntil ? ', runWithWaitUntil' : '';
|
|
359
308
|
|
|
@@ -363,7 +312,7 @@ export function generateNitroEntry(
|
|
|
363
312
|
return `// Generated by @timber-js/app/adapters/nitro
|
|
364
313
|
// Do not edit — this file is regenerated on each build.
|
|
365
314
|
|
|
366
|
-
|
|
315
|
+
import handler, { runWithEarlyHintsSender${waitUntilImport} } from '${serverEntryRelative}'
|
|
367
316
|
${compressImport}
|
|
368
317
|
// Set TIMBER_RUNTIME for instrumentation.ts conditional SDK initialization.
|
|
369
318
|
// See design/25-production-deployments.md §"TIMBER_RUNTIME".
|
|
@@ -383,37 +332,6 @@ ${handlerCall}
|
|
|
383
332
|
`;
|
|
384
333
|
}
|
|
385
334
|
|
|
386
|
-
/** @internal Exported for testing. */
|
|
387
|
-
export function generateNitroConfig(
|
|
388
|
-
preset: NitroPreset,
|
|
389
|
-
userConfig?: Record<string, unknown>
|
|
390
|
-
): string {
|
|
391
|
-
const presetConfig = PRESET_CONFIGS[preset];
|
|
392
|
-
|
|
393
|
-
const config: Record<string, unknown> = {
|
|
394
|
-
preset: presetConfig.nitroPreset,
|
|
395
|
-
entry: './entry.ts',
|
|
396
|
-
output: { dir: presetConfig.outputDir },
|
|
397
|
-
// Static asset cache headers — hashed assets are immutable, others get 1h.
|
|
398
|
-
// See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
399
|
-
routeRules: {
|
|
400
|
-
'/assets/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
|
|
401
|
-
},
|
|
402
|
-
...presetConfig.extraConfig,
|
|
403
|
-
...userConfig,
|
|
404
|
-
};
|
|
405
|
-
|
|
406
|
-
const configJson = JSON.stringify(config, null, 2);
|
|
407
|
-
|
|
408
|
-
return `// Generated by @timber-js/app/adapters/nitro
|
|
409
|
-
// Do not edit — this file is regenerated on each build.
|
|
410
|
-
|
|
411
|
-
import { defineNitroConfig } from 'nitro/config'
|
|
412
|
-
|
|
413
|
-
export default defineNitroConfig(${configJson})
|
|
414
|
-
`;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
335
|
// ─── Preview ─────────────────────────────────────────────────────────────────
|
|
418
336
|
|
|
419
337
|
/** Presets that produce a locally-runnable server entry. */
|
|
@@ -486,11 +404,32 @@ const MIME_TYPES = {
|
|
|
486
404
|
};
|
|
487
405
|
|
|
488
406
|
const publicDir = join(__dirname, '${publicDir}');
|
|
489
|
-
|
|
407
|
+
|
|
408
|
+
// Port resolution (TIM-842):
|
|
409
|
+
// - Default to 3000
|
|
410
|
+
// - If PORT env var is set, honor it strictly (fail loudly on conflict)
|
|
411
|
+
// - Otherwise auto-bump from 3000 until a free port is found
|
|
412
|
+
// Mirrors the dev server behavior so timber dev/preview/production all
|
|
413
|
+
// behave the same way around port selection.
|
|
414
|
+
const envPort = process.env.PORT ? parseInt(process.env.PORT, 10) : null;
|
|
415
|
+
const portIsExplicit = envPort != null && Number.isFinite(envPort) && envPort > 0;
|
|
416
|
+
const startPort = portIsExplicit ? envPort : 3000;
|
|
490
417
|
const host = process.env.HOST || process.env.HOSTNAME || 'localhost';
|
|
491
418
|
|
|
419
|
+
// Set after listenWithBump() resolves so request handlers can build
|
|
420
|
+
// absolute URLs from the actual bound port (which may differ from
|
|
421
|
+
// startPort after an auto-bump).
|
|
422
|
+
let boundPort = startPort;
|
|
423
|
+
|
|
492
424
|
const server = createServer(async (req, res) => {
|
|
493
|
-
|
|
425
|
+
// Scheme from the socket's TLS state — a hardcoded http:// breaks CSRF
|
|
426
|
+
// origin comparison and absolute-URL construction when TLS is terminated
|
|
427
|
+
// at this server (TIM-1073; mirrors the dev-server fix in TIM-1067).
|
|
428
|
+
// X-Forwarded-Proto is intentionally not consulted here: on a direct
|
|
429
|
+
// connection it would be attacker-controlled. The CSRF layer honors it
|
|
430
|
+
// separately for reverse-proxy deployments.
|
|
431
|
+
const scheme = req.socket?.encrypted ? 'https' : 'http';
|
|
432
|
+
const url = new URL(req.url || '/', \`\${scheme}://\${host}:\${boundPort}\`);
|
|
494
433
|
|
|
495
434
|
// Try serving static files from the public directory first.
|
|
496
435
|
const filePath = join(publicDir, url.pathname);
|
|
@@ -503,7 +442,9 @@ const server = createServer(async (req, res) => {
|
|
|
503
442
|
const contentType = MIME_TYPES[ext] || 'application/octet-stream';
|
|
504
443
|
const body = await readFile(filePath);
|
|
505
444
|
// Hashed assets get immutable cache, others get short cache.
|
|
506
|
-
const
|
|
445
|
+
const isImmutable =
|
|
446
|
+
url.pathname.startsWith('/assets/') || url.pathname.startsWith('/_timber/fonts/');
|
|
447
|
+
const cacheControl = isImmutable
|
|
507
448
|
? 'public, max-age=31536000, immutable'
|
|
508
449
|
: 'public, max-age=3600, must-revalidate';
|
|
509
450
|
res.writeHead(200, {
|
|
@@ -561,18 +502,64 @@ const server = createServer(async (req, res) => {
|
|
|
561
502
|
const webResponse = compressResponse(webRequest, rawResponse);
|
|
562
503
|
|
|
563
504
|
// Write the response back to the Node response.
|
|
564
|
-
|
|
505
|
+
//
|
|
506
|
+
// Set-Cookie needs special handling: Headers.entries() joins multiple
|
|
507
|
+
// Set-Cookie values with ", " into a single entry, but each cookie must
|
|
508
|
+
// be its own header per RFC 6265 §4.1. Object.fromEntries() would then
|
|
509
|
+
// collapse them into one malformed Set-Cookie header that browsers reject
|
|
510
|
+
// (or only honor partially). Use getSetCookie() to preserve individual
|
|
511
|
+
// values, and pass them as an array — Node's writeHead accepts
|
|
512
|
+
// Record<string, string | string[]> and emits one header per array entry.
|
|
513
|
+
//
|
|
514
|
+
// Without this, EVERY cookie set by the framework on Node—/Nitro deployments
|
|
515
|
+
// is silently dropped: defineCookie().setCookie() in actions, middleware
|
|
516
|
+
// cookie writes, the framework's own session cookies, all of it. See
|
|
517
|
+
// LOCAL-741.
|
|
518
|
+
const responseHeaders = {};
|
|
519
|
+
webResponse.headers.forEach((value, key) => {
|
|
520
|
+
if (key.toLowerCase() !== 'set-cookie') {
|
|
521
|
+
responseHeaders[key] = value;
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
const setCookies = webResponse.headers.getSetCookie();
|
|
525
|
+
if (setCookies.length > 0) {
|
|
526
|
+
responseHeaders['set-cookie'] = setCookies;
|
|
527
|
+
}
|
|
528
|
+
res.writeHead(webResponse.status, responseHeaders);
|
|
565
529
|
|
|
566
530
|
if (webResponse.body) {
|
|
567
531
|
const reader = webResponse.body.getReader();
|
|
568
|
-
|
|
532
|
+
|
|
533
|
+
// Cancel the reader when the client disconnects. This causes any
|
|
534
|
+
// pending reader.read() to reject, breaking the pump loop. Critical
|
|
535
|
+
// for SSE and other infinite streams — without this, disconnected
|
|
536
|
+
// clients leak readers.
|
|
537
|
+
let clientDisconnected = false;
|
|
538
|
+
const onClose = () => {
|
|
539
|
+
clientDisconnected = true;
|
|
540
|
+
reader.cancel('Client disconnected').catch(() => {});
|
|
541
|
+
};
|
|
542
|
+
res.on('close', onClose);
|
|
543
|
+
|
|
544
|
+
try {
|
|
569
545
|
while (true) {
|
|
570
546
|
const { done, value } = await reader.read();
|
|
571
|
-
if (done)
|
|
547
|
+
if (done) break;
|
|
572
548
|
res.write(value);
|
|
573
549
|
}
|
|
574
|
-
}
|
|
575
|
-
|
|
550
|
+
} catch (err) {
|
|
551
|
+
// reader.cancel() from the close handler causes read() to reject.
|
|
552
|
+
// This is expected on client disconnect — not an error.
|
|
553
|
+
if (!clientDisconnected) {
|
|
554
|
+
throw err;
|
|
555
|
+
}
|
|
556
|
+
} finally {
|
|
557
|
+
res.off('close', onClose);
|
|
558
|
+
reader.releaseLock();
|
|
559
|
+
if (!res.writableEnded) {
|
|
560
|
+
res.end();
|
|
561
|
+
}
|
|
562
|
+
}
|
|
576
563
|
} else {
|
|
577
564
|
res.end();
|
|
578
565
|
}
|
|
@@ -585,13 +572,49 @@ const server = createServer(async (req, res) => {
|
|
|
585
572
|
}
|
|
586
573
|
});
|
|
587
574
|
|
|
588
|
-
|
|
575
|
+
function listenWithBump(port, attempt = 0) {
|
|
576
|
+
return new Promise((resolveListen, rejectListen) => {
|
|
577
|
+
const onError = (err) => {
|
|
578
|
+
server.removeListener('listening', onListening);
|
|
579
|
+
if (err && err.code === 'EADDRINUSE' && !portIsExplicit && attempt < 100) {
|
|
580
|
+
if (attempt === 0) {
|
|
581
|
+
console.log(\` [timber] Port \${port} in use, trying \${port + 1}...\`);
|
|
582
|
+
}
|
|
583
|
+
listenWithBump(port + 1, attempt + 1).then(resolveListen, rejectListen);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
rejectListen(err);
|
|
587
|
+
};
|
|
588
|
+
const onListening = () => {
|
|
589
|
+
server.removeListener('error', onError);
|
|
590
|
+
resolveListen(port);
|
|
591
|
+
};
|
|
592
|
+
server.once('error', onError);
|
|
593
|
+
server.once('listening', onListening);
|
|
594
|
+
server.listen(port, host);
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
try {
|
|
599
|
+
boundPort = await listenWithBump(startPort);
|
|
600
|
+
if (boundPort !== startPort) {
|
|
601
|
+
console.log();
|
|
602
|
+
console.log(\` [timber] Port \${startPort} in use, using \${boundPort}\`);
|
|
603
|
+
}
|
|
589
604
|
console.log();
|
|
590
605
|
console.log(' ⚡ timber preview server running at:');
|
|
591
606
|
console.log();
|
|
592
|
-
console.log(\` ➜ http://\${host}:\${
|
|
607
|
+
console.log(\` ➜ http://\${host}:\${boundPort}\`);
|
|
593
608
|
console.log();
|
|
594
|
-
})
|
|
609
|
+
} catch (err) {
|
|
610
|
+
if (err && err.code === 'EADDRINUSE') {
|
|
611
|
+
console.error(\`[timber] Port \${startPort} is already in use. \` +
|
|
612
|
+
'Set PORT to a free port, or unset PORT to auto-pick.');
|
|
613
|
+
} else {
|
|
614
|
+
console.error('[timber] Failed to start preview server:', err);
|
|
615
|
+
}
|
|
616
|
+
process.exit(1);
|
|
617
|
+
}
|
|
595
618
|
`;
|
|
596
619
|
}
|
|
597
620
|
|
|
@@ -649,6 +672,7 @@ async function runNitroBuild(
|
|
|
649
672
|
output: { dir: join(nitroDir, presetConfig.outputDir) },
|
|
650
673
|
routeRules: {
|
|
651
674
|
'/assets/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
|
|
675
|
+
'/_timber/fonts/**': { headers: { 'Cache-Control': IMMUTABLE_CACHE } },
|
|
652
676
|
},
|
|
653
677
|
// Don't bundle the timber RSC/SSR build output — it has its own
|
|
654
678
|
// internal file references that nitro's bundler can't follow.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Shared adapter utilities — leaf module with zero deps on server/, client/,
|
|
2
|
+
// or any Vite-dependent code.
|
|
3
|
+
//
|
|
4
|
+
// Adapters are loaded by Node at Vite startup time, before Vite's module
|
|
5
|
+
// resolver is available. This module uses only Node built-ins and can be
|
|
6
|
+
// imported by both adapters via a relative path.
|
|
7
|
+
//
|
|
8
|
+
// IMPORTANT: Do NOT add imports from ../server/, ../client/, ../plugins/,
|
|
9
|
+
// or any module that transitively depends on Vite. A test in
|
|
10
|
+
// tests/adapters/shared-no-forbidden-imports.test.ts enforces this.
|
|
11
|
+
|
|
12
|
+
// ─── Static asset cache headers ──────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
/** Cache-Control value for hashed (immutable) assets. */
|
|
15
|
+
export const IMMUTABLE_CACHE = 'public, max-age=31536000, immutable';
|
|
16
|
+
|
|
17
|
+
/** Cache-Control value for unhashed static assets. */
|
|
18
|
+
export const STATIC_CACHE = 'public, max-age=3600, must-revalidate';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Generate a `_headers` file for static asset cache control.
|
|
22
|
+
*
|
|
23
|
+
* The `_headers` file is a platform convention supported by Cloudflare Workers
|
|
24
|
+
* Static Assets, Cloudflare Pages, and Netlify. It maps URL patterns to
|
|
25
|
+
* HTTP response headers.
|
|
26
|
+
*
|
|
27
|
+
* Only hashed (immutable) asset paths are listed here by default. When
|
|
28
|
+
* `unhashedPaths` is provided, per-file rules are appended for unhashed
|
|
29
|
+
* static assets (favicon.ico, robots.txt, etc.) so they get Cache-Control
|
|
30
|
+
* on platforms like Cloudflare Workers Static Assets where the server
|
|
31
|
+
* handler never sees static file requests.
|
|
32
|
+
*
|
|
33
|
+
* A `/*` catch-all is NOT used — it would be additive on Cloudflare,
|
|
34
|
+
* producing duplicate Cache-Control directives on hashed assets
|
|
35
|
+
* (invalid per RFC 9111).
|
|
36
|
+
*/
|
|
37
|
+
// Cloudflare Workers Static Assets caps _headers at 100 rules.
|
|
38
|
+
// Reserve 2 for the wildcard hashed-asset rules.
|
|
39
|
+
const MAX_UNHASHED_RULES = 98;
|
|
40
|
+
|
|
41
|
+
export function generateHeadersFile(unhashedPaths?: string[]): string {
|
|
42
|
+
let content = `# Auto-generated by @timber-js/app — static asset cache headers.
|
|
43
|
+
# See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
44
|
+
|
|
45
|
+
/assets/*
|
|
46
|
+
Cache-Control: ${IMMUTABLE_CACHE}
|
|
47
|
+
|
|
48
|
+
/_timber/fonts/*
|
|
49
|
+
Cache-Control: ${IMMUTABLE_CACHE}
|
|
50
|
+
`;
|
|
51
|
+
|
|
52
|
+
if (unhashedPaths && unhashedPaths.length > 0) {
|
|
53
|
+
const capped = unhashedPaths.slice(0, MAX_UNHASHED_RULES);
|
|
54
|
+
if (unhashedPaths.length > MAX_UNHASHED_RULES) {
|
|
55
|
+
console.warn(
|
|
56
|
+
`[timber] _headers: ${unhashedPaths.length} unhashed static files found, ` +
|
|
57
|
+
`but Cloudflare limits _headers to 100 rules. Only the first ${MAX_UNHASHED_RULES} ` +
|
|
58
|
+
`unhashed files will get Cache-Control headers.`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
content += `\n# Unhashed static assets — short-lived cache with revalidation\n`;
|
|
62
|
+
for (const p of capped) {
|
|
63
|
+
content += `\n${p}\n Cache-Control: ${STATIC_CACHE}\n`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return content;
|
|
68
|
+
}
|
package/src/adapters/types.ts
CHANGED
|
@@ -42,13 +42,6 @@ export interface TimberPlatformAdapter {
|
|
|
42
42
|
*/
|
|
43
43
|
preview?(config: TimberConfig, buildDir: string): Promise<void>;
|
|
44
44
|
|
|
45
|
-
/**
|
|
46
|
-
* Register a promise to be kept alive after the response is sent.
|
|
47
|
-
* Maps to platform-specific lifecycle extension (e.g. ctx.waitUntil()
|
|
48
|
-
* on Cloudflare Workers). Undefined if the platform doesn't support it.
|
|
49
|
-
*/
|
|
50
|
-
waitUntil?(promise: Promise<unknown>): void;
|
|
51
|
-
|
|
52
45
|
/**
|
|
53
46
|
* Send 103 Early Hints to the client before the final response.
|
|
54
47
|
*
|