@timber-js/app 0.2.0-alpha.12 → 0.2.0-alpha.120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/actions-Cw-7NfJJ.js +1101 -0
- package/dist/_chunks/actions-Cw-7NfJJ.js.map +1 -0
- package/dist/_chunks/build-output-helper-DhxiT18k.js +61 -0
- package/dist/_chunks/build-output-helper-DhxiT18k.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-XV0I47Gj.js +2 -0
- package/dist/_chunks/cli-schema-sync-q2wB0DyJ.js +358 -0
- package/dist/_chunks/cli-schema-sync-q2wB0DyJ.js.map +1 -0
- package/dist/_chunks/codec-registry-V7ARyeLN.js +21 -0
- package/dist/_chunks/codec-registry-V7ARyeLN.js.map +1 -0
- package/dist/_chunks/define-8zQ8Vm7x.js +195 -0
- package/dist/_chunks/define-8zQ8Vm7x.js.map +1 -0
- package/dist/_chunks/define-zQX6e1tN.js +124 -0
- package/dist/_chunks/define-zQX6e1tN.js.map +1 -0
- package/dist/_chunks/format-CR6v1pWE.js +14 -0
- package/dist/_chunks/format-CR6v1pWE.js.map +1 -0
- package/dist/_chunks/handler-store-iqnt2ghN.js +54 -0
- package/dist/_chunks/handler-store-iqnt2ghN.js.map +1 -0
- package/dist/_chunks/logger-DDmK5skc.js +291 -0
- package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
- package/dist/_chunks/merge-search-params-CwxJzBLS.js +41 -0
- package/dist/_chunks/merge-search-params-CwxJzBLS.js.map +1 -0
- package/dist/_chunks/navigation-root-DKsJ5Di7.js +96 -0
- package/dist/_chunks/navigation-root-DKsJ5Di7.js.map +1 -0
- package/dist/_chunks/registry-Dp_hJL4s.js +20 -0
- package/dist/_chunks/registry-Dp_hJL4s.js.map +1 -0
- package/dist/_chunks/resolve-schema-23Mc8aLi.js +65 -0
- package/dist/_chunks/resolve-schema-23Mc8aLi.js.map +1 -0
- package/dist/_chunks/router-ref-sektkr-t.js +28 -0
- package/dist/_chunks/router-ref-sektkr-t.js.map +1 -0
- package/dist/_chunks/scanner-DmfoB7iK.js +336 -0
- package/dist/_chunks/scanner-DmfoB7iK.js.map +1 -0
- package/dist/_chunks/schema-bridge-eL5vQDSA.js +86 -0
- package/dist/_chunks/schema-bridge-eL5vQDSA.js.map +1 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
- package/dist/_chunks/segment-context-Bg0pFbLT.js +34 -0
- package/dist/_chunks/segment-context-Bg0pFbLT.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BO5OvEvg.js} +1 -1
- package/dist/_chunks/ssr-data-BO5OvEvg.js.map +1 -0
- package/dist/_chunks/stale-reload-BCPRG0Cv.js +64 -0
- package/dist/_chunks/stale-reload-BCPRG0Cv.js.map +1 -0
- package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
- package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-D9SBlAfp.js} +7 -20
- package/dist/_chunks/use-query-states-D9SBlAfp.js.map +1 -0
- package/dist/_chunks/use-segment-params-CskiK-59.js +185 -0
- package/dist/_chunks/use-segment-params-CskiK-59.js.map +1 -0
- package/dist/_chunks/validation-Bm3Je-09.js +84 -0
- package/dist/_chunks/validation-Bm3Je-09.js.map +1 -0
- package/dist/_chunks/walkers-DgOXkTts.js +609 -0
- package/dist/_chunks/walkers-DgOXkTts.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
- package/dist/_chunks/warnings-B30wpfaS.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -45
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +151 -81
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +37 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +42 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +23 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +29 -6
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +9 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +172 -1100
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +964 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +63 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +62 -55
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +13 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +51 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +46 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +251 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +46 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +167 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +45 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4799 -12730
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +53 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +63 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +60 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +5 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +95 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +53 -5
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +2 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/debug.d.ts +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -5
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +155 -2905
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2947 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +52 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +118 -23
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +69 -18
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +27 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +21 -34
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +49 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +30 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +5 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +41 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +49 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +56 -16
- package/src/adapters/build-output-helper.ts +77 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +142 -59
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/timber-cache.ts +25 -20
- package/src/cli-schema-sync.ts +207 -0
- package/src/cli.ts +65 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +126 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +149 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +69 -44
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +366 -113
- package/src/client/nav-link-store.ts +47 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +31 -6
- package/src/client/navigation-root.tsx +342 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +300 -73
- package/src/client/rsc-fetch.ts +112 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +18 -6
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
- package/src/codec.ts +97 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +134 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +506 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +1 -1
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +233 -0
- package/src/index.ts +409 -357
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +73 -0
- package/src/params/index.ts +11 -0
- package/src/params/resolve-schema.ts +88 -0
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +175 -35
- package/src/plugins/entries.ts +111 -9
- package/src/plugins/fonts.ts +157 -654
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +374 -45
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +109 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +269 -179
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +5 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +308 -0
- package/src/routing/scanner.ts +107 -110
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +336 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +55 -7
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +10 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +468 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +31 -50
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +76 -0
- package/src/server/html-injector-core.ts +417 -0
- package/src/server/html-injectors.ts +235 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +176 -0
- package/src/server/logger.ts +67 -36
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +176 -0
- package/src/server/pipeline-phases.ts +460 -0
- package/src/server/pipeline.ts +154 -394
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -333
- package/src/server/route-element-builder.ts +309 -195
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +50 -231
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +16 -17
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +137 -12
- package/src/server/rsc-entry/index.ts +316 -352
- package/src/server/rsc-entry/render-route.ts +307 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +187 -38
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +228 -246
- package/src/server/ssr-entry.ts +229 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +4 -1
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +202 -90
- package/src/server/tree-match.ts +198 -0
- package/src/server/types.ts +55 -6
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js +0 -108
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
- package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -166
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
package/src/cookies/index.ts
CHANGED
|
@@ -2,4 +2,15 @@
|
|
|
2
2
|
// See design/29-cookies.md §"Typed Cookies with Schema Validation"
|
|
3
3
|
|
|
4
4
|
export { defineCookie } from './define-cookie.js';
|
|
5
|
-
export type {
|
|
5
|
+
export type {
|
|
6
|
+
CookieDefinition,
|
|
7
|
+
ServerOnlyCookieDefinition,
|
|
8
|
+
CookieCodec,
|
|
9
|
+
DefineCookieOptions,
|
|
10
|
+
} from './define-cookie.js';
|
|
11
|
+
|
|
12
|
+
// JSON-in-cookie helper. Wraps any JSON-serializable value with URL-encoding
|
|
13
|
+
// so the stored form satisfies RFC 6265 §4.1.1 cookie-octet (the rule that
|
|
14
|
+
// the framework now enforces in `getCookieJar().set()` to close TIM-868).
|
|
15
|
+
// See ONGOING_SECURITY.md H-3 and design/29-cookies.md.
|
|
16
|
+
export { jsonCookieCodec } from './json-cookie.js';
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jsonCookieCodec — Codec helper for storing JSON-serializable values in
|
|
3
|
+
* cookies.
|
|
4
|
+
*
|
|
5
|
+
* The codec is intentionally minimal: `JSON.stringify` on serialize,
|
|
6
|
+
* `JSON.parse` on parse. The framework handles the URL encoding /
|
|
7
|
+
* decoding around it (see design/29-cookies.md §"Encoding Contract"):
|
|
8
|
+
*
|
|
9
|
+
* defineCookie.setCookie(value)
|
|
10
|
+
* → codec.serialize: JSON.stringify → '{"a":1}'
|
|
11
|
+
* → cookies().set: encodeURIComponent → '%7B%22a%22%3A1%7D'
|
|
12
|
+
* → wire: Set-Cookie: prefs=%7B%22a%22%3A1%7D
|
|
13
|
+
*
|
|
14
|
+
* defineCookie.getCookie()
|
|
15
|
+
* → wire: Cookie: prefs=%7B%22a%22%3A1%7D
|
|
16
|
+
* → parseCookieHeader: decodeURIComponent → '{"a":1}'
|
|
17
|
+
* → codec.parse: JSON.parse → { a: 1 }
|
|
18
|
+
*
|
|
19
|
+
* The same chain works on the client: `useCookie` auto-encodes on writes
|
|
20
|
+
* and auto-decodes on reads, so `jsonCookieCodec` composes with both the
|
|
21
|
+
* server `defineCookie` methods and the client `useCookie` hook with no
|
|
22
|
+
* environment-specific branches.
|
|
23
|
+
*
|
|
24
|
+
* Parsing is total: any non-JSON value (or `undefined`) returns the
|
|
25
|
+
* supplied default. This matches the "never crash on user-controlled
|
|
26
|
+
* cookie input" semantics that `fromSchema` uses for typed search params.
|
|
27
|
+
*
|
|
28
|
+
* ```ts
|
|
29
|
+
* import { defineCookie, jsonCookieCodec } from '@timber-js/app/cookies';
|
|
30
|
+
*
|
|
31
|
+
* interface Prefs { lang: string; fontSize: number }
|
|
32
|
+
*
|
|
33
|
+
* export const prefsCookie = defineCookie('prefs', {
|
|
34
|
+
* codec: jsonCookieCodec<Prefs>({ lang: 'en', fontSize: 16 }),
|
|
35
|
+
* httpOnly: false,
|
|
36
|
+
* maxAge: 60 * 60 * 24 * 365,
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* await prefsCookie.setCookie({ lang: 'fr', fontSize: 18 });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import type { Codec } from '../codec.js';
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Build a CookieCodec that JSON-encodes the value. The framework's
|
|
47
|
+
* cookie write path then URL-encodes the JSON string into a valid
|
|
48
|
+
* `cookie-octet` form, and the read path reverses both transforms.
|
|
49
|
+
*
|
|
50
|
+
* @param defaultValue - Returned by `parse` when the cookie is missing
|
|
51
|
+
* or the stored value cannot be JSON-parsed. Optional — if omitted,
|
|
52
|
+
* `parse` returns `undefined` on missing/malformed input.
|
|
53
|
+
*
|
|
54
|
+
* The default is **deep-cloned** on every fallback return via
|
|
55
|
+
* `structuredClone`, so mutating the parsed result in one request
|
|
56
|
+
* cannot leak into later requests that fall back to the same
|
|
57
|
+
* default. This matters for long-lived server processes where a
|
|
58
|
+
* codec is defined once at module load and shared across all
|
|
59
|
+
* requests — without the clone, a user doing
|
|
60
|
+
* `const prefs = prefsCookie.get(); prefs.lang = 'fr'` on a missing
|
|
61
|
+
* cookie would mutate the module-level default and poison every
|
|
62
|
+
* later fallback. See the "shared mutable default" regression test
|
|
63
|
+
* in `tests/define-cookie.test.ts`.
|
|
64
|
+
*/
|
|
65
|
+
export function jsonCookieCodec<T>(defaultValue?: T): Codec<T> {
|
|
66
|
+
// Resolve the fallback at call time, not capture time, so every
|
|
67
|
+
// fallback return produces a fresh deep copy. structuredClone handles
|
|
68
|
+
// nested objects, arrays, dates, maps, sets — everything
|
|
69
|
+
// JSON-serializable plus more. For primitives and undefined,
|
|
70
|
+
// structuredClone is effectively a no-op.
|
|
71
|
+
const cloneDefault = (): T => {
|
|
72
|
+
if (defaultValue === undefined || defaultValue === null) {
|
|
73
|
+
return defaultValue as T;
|
|
74
|
+
}
|
|
75
|
+
// structuredClone is a Node built-in since Node 17, available in
|
|
76
|
+
// all supported runtimes.
|
|
77
|
+
return structuredClone(defaultValue);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
parse(value: string | string[] | undefined): T {
|
|
82
|
+
if (value === undefined || value === '') {
|
|
83
|
+
return cloneDefault();
|
|
84
|
+
}
|
|
85
|
+
// Cookies are single-valued by name; defensively pick the last
|
|
86
|
+
// entry if a Codec consumer somehow passes an array.
|
|
87
|
+
const raw = Array.isArray(value) ? value[value.length - 1] : value;
|
|
88
|
+
if (raw === undefined || raw === '') {
|
|
89
|
+
return cloneDefault();
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
return JSON.parse(raw) as T;
|
|
93
|
+
} catch {
|
|
94
|
+
return cloneDefault();
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
serialize(value: T): string | null {
|
|
99
|
+
if (value === null || value === undefined) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
return JSON.stringify(value);
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie name and value validation per RFC 6265 §4.1.1.
|
|
3
|
+
*
|
|
4
|
+
* This module is pure — no server or client imports — so it can be loaded
|
|
5
|
+
* by both `server/request-context.ts` (which guards `getCookies().set()`)
|
|
6
|
+
* and `client/use-cookie.ts` (which guards `useCookie()`'s setter). The
|
|
7
|
+
* shared validator gives both sides identical encoding contracts:
|
|
8
|
+
* **the framework never silently encodes — callers emit `cookie-octet`
|
|
9
|
+
* bytes or get a developer-facing error.**
|
|
10
|
+
*
|
|
11
|
+
* Why this matters: see ONGOING_SECURITY.md H-3 (TIM-868) and
|
|
12
|
+
* design/29-cookies.md §"Cookie Name and Value Validation".
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// ─── RFC 6265 cookie-octet ────────────────────────────────────────────────
|
|
16
|
+
//
|
|
17
|
+
// cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
|
|
18
|
+
//
|
|
19
|
+
// Equivalently: US-ASCII printable bytes excluding whitespace, `"` (0x22),
|
|
20
|
+
// `,` (0x2C), `;` (0x3B), `\` (0x5C), and DEL (0x7F).
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* RFC 7230 §3.2.6 token characters used as the cookie-name production in
|
|
24
|
+
* RFC 6265 §4.1.1. Anchored, non-empty match.
|
|
25
|
+
*
|
|
26
|
+
* Allowed: US-ASCII letters, digits, and `!#$%&'*+-.^_` `` ` `` `|~`.
|
|
27
|
+
* Disallowed: whitespace, controls, delimiters
|
|
28
|
+
* (`(` `)` `<` `>` `@` `,` `;` `:` `\` `"` `/` `[` `]` `?` `=` `{` `}`).
|
|
29
|
+
*/
|
|
30
|
+
const COOKIE_NAME_RE = /^[!#$%&'*+\-.0-9A-Z^_`a-z|~]+$/;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Format a single byte for a clear error message — escape control bytes
|
|
34
|
+
* and non-ASCII as `0x..` and quote printables.
|
|
35
|
+
*/
|
|
36
|
+
function describeChar(value: string, index: number): string {
|
|
37
|
+
const code = value.charCodeAt(index);
|
|
38
|
+
if (code < 0x20 || code === 0x7f || code > 0x7e) {
|
|
39
|
+
return `0x${code.toString(16).padStart(2, '0')}`;
|
|
40
|
+
}
|
|
41
|
+
return JSON.stringify(value[index]);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Validate a cookie name against RFC 6265 §4.1.1 / RFC 7230 token rules.
|
|
46
|
+
* Throws a developer-facing error naming the offending byte and its index.
|
|
47
|
+
*/
|
|
48
|
+
export function assertValidCookieName(name: string): void {
|
|
49
|
+
if (typeof name !== 'string' || name.length === 0) {
|
|
50
|
+
throw new Error('[timber] cookie name must be a non-empty string.');
|
|
51
|
+
}
|
|
52
|
+
if (!COOKIE_NAME_RE.test(name)) {
|
|
53
|
+
for (let i = 0; i < name.length; i++) {
|
|
54
|
+
if (!COOKIE_NAME_RE.test(name[i])) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`[timber] invalid cookie name ${JSON.stringify(name)} — ` +
|
|
57
|
+
`disallowed character ${describeChar(name, i)} at index ${i}. ` +
|
|
58
|
+
`Cookie names must match the RFC 6265 §4.1.1 token grammar (US-ASCII letters, digits, ` +
|
|
59
|
+
`and \`!#$%&'*+-.^_\`|~\`; no whitespace, controls, or delimiters).`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
throw new Error(
|
|
64
|
+
`[timber] invalid cookie name ${JSON.stringify(name)} — ` +
|
|
65
|
+
`must match RFC 6265 §4.1.1 token grammar.`
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Single-byte test for RFC 6265 §4.1.1 cookie-octet. */
|
|
71
|
+
function isCookieOctet(code: number): boolean {
|
|
72
|
+
return (
|
|
73
|
+
code === 0x21 ||
|
|
74
|
+
(code >= 0x23 && code <= 0x2b) ||
|
|
75
|
+
(code >= 0x2d && code <= 0x3a) ||
|
|
76
|
+
(code >= 0x3c && code <= 0x5b) ||
|
|
77
|
+
(code >= 0x5d && code <= 0x7e)
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Validate a cookie value against the RFC 6265 §4.1.1 `cookie-value`
|
|
83
|
+
* production:
|
|
84
|
+
*
|
|
85
|
+
* cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
|
|
86
|
+
* cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
|
|
87
|
+
*
|
|
88
|
+
* Both the bare `*cookie-octet` form and the DQUOTE-wrapped form are
|
|
89
|
+
* valid. The wrapped form is common in upstream `Set-Cookie` headers
|
|
90
|
+
* (e.g. `sid="abc"; Path=/`) and must be forwardable through
|
|
91
|
+
* `setFromHeaders` verbatim — stripping or rejecting the surrounding
|
|
92
|
+
* quotes would corrupt the on-the-wire bytes and break value semantics
|
|
93
|
+
* for the upstream service.
|
|
94
|
+
*
|
|
95
|
+
* Excluded bytes (in either form): CTL, whitespace (CR/LF/TAB/SP),
|
|
96
|
+
* interior DQUOTE, comma, semicolon, backslash, DEL, and anything
|
|
97
|
+
* non-ASCII. The smuggling primitive (`;`) is rejected regardless of
|
|
98
|
+
* wrapping.
|
|
99
|
+
*
|
|
100
|
+
* Throws a developer-facing error naming the offending byte and its
|
|
101
|
+
* index. Callers passing user-controlled data through the default
|
|
102
|
+
* `set()` path don't need to call this — `set()` auto-encodes via
|
|
103
|
+
* `encodeURIComponent`, whose output is always valid cookie-octet.
|
|
104
|
+
* This validator is for the `{ raw: true }` opt-out and for
|
|
105
|
+
* `setFromHeaders` forwarding.
|
|
106
|
+
*/
|
|
107
|
+
export function assertValidCookieValue(name: string, value: string): void {
|
|
108
|
+
if (typeof value !== 'string') {
|
|
109
|
+
throw new Error(`[timber] cookie ${JSON.stringify(name)}: cookie value must be a string.`);
|
|
110
|
+
}
|
|
111
|
+
// Detect the DQUOTE-wrapped form: at least two characters and both
|
|
112
|
+
// endpoints are `"`. The interior must be pure cookie-octet (no
|
|
113
|
+
// interior DQUOTEs allowed — the grammar says *cookie-octet, and
|
|
114
|
+
// cookie-octet excludes 0x22).
|
|
115
|
+
const wrapped =
|
|
116
|
+
value.length >= 2 &&
|
|
117
|
+
value.charCodeAt(0) === 0x22 &&
|
|
118
|
+
value.charCodeAt(value.length - 1) === 0x22;
|
|
119
|
+
const start = wrapped ? 1 : 0;
|
|
120
|
+
const end = wrapped ? value.length - 1 : value.length;
|
|
121
|
+
for (let i = start; i < end; i++) {
|
|
122
|
+
const code = value.charCodeAt(i);
|
|
123
|
+
if (!isCookieOctet(code)) {
|
|
124
|
+
throw new Error(
|
|
125
|
+
`[timber] cookie ${JSON.stringify(name)}: invalid cookie value — ` +
|
|
126
|
+
`disallowed character ${describeChar(value, i)} at index ${i}. ` +
|
|
127
|
+
`Cookie values must contain only RFC 6265 §4.1.1 cookie-octet bytes ` +
|
|
128
|
+
`(US-ASCII printable, excluding whitespace, \`"\`, \`,\`, \`;\`, and \`\\\`), ` +
|
|
129
|
+
`optionally enclosed in a single DQUOTE pair. ` +
|
|
130
|
+
`Encode the value (e.g. encodeURIComponent or jsonCookieCodec) before storing it.`
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev 404 page — self-contained HTML page for dev-mode route misses.
|
|
3
|
+
*
|
|
4
|
+
* When no route matches and the user has no 404.tsx, this page shows:
|
|
5
|
+
* - The requested path
|
|
6
|
+
* - All registered routes in the app
|
|
7
|
+
* - "Did you mean?" suggestions based on string similarity
|
|
8
|
+
* - Setup instructions for new projects with no routes
|
|
9
|
+
*
|
|
10
|
+
* Dev-only: this module is only imported in dev mode. It is never
|
|
11
|
+
* included in production builds.
|
|
12
|
+
*
|
|
13
|
+
* Design doc: 21-dev-server.md, 07-routing.md
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { SegmentNode } from '../routing/types.js';
|
|
17
|
+
import { collectLeafRoutes } from '../routing/walkers.js';
|
|
18
|
+
import { escapeHtml } from '../server/utils/escape-html.js';
|
|
19
|
+
|
|
20
|
+
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
interface RouteInfo {
|
|
23
|
+
/** URL path pattern (e.g., "/dashboard/[id]") */
|
|
24
|
+
path: string;
|
|
25
|
+
/** Whether this is a page route or API route handler */
|
|
26
|
+
type: 'page' | 'route';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ─── Route Collection ───────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Collect all routable paths from a route tree (build-time scanner output
|
|
33
|
+
* or runtime route manifest).
|
|
34
|
+
*
|
|
35
|
+
* Wraps the shared `collectLeafRoutes` walker (TIM-848). Includes parallel
|
|
36
|
+
* slots so the dev 404 page can list slot pages too — they aren't
|
|
37
|
+
* separately addressable, but they're still useful to know about when
|
|
38
|
+
* debugging a missing route.
|
|
39
|
+
*/
|
|
40
|
+
export function collectRoutes<TFile>(root: SegmentNode<TFile>): RouteInfo[] {
|
|
41
|
+
const leaves = collectLeafRoutes(root, { includeSlots: true });
|
|
42
|
+
const routes: RouteInfo[] = [];
|
|
43
|
+
for (const leaf of leaves) {
|
|
44
|
+
if (leaf.page) routes.push({ path: leaf.urlPath, type: 'page' });
|
|
45
|
+
if (leaf.route) routes.push({ path: leaf.urlPath, type: 'route' });
|
|
46
|
+
}
|
|
47
|
+
return routes;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ─── String Similarity ──────────────────────────────────────────────────────
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Compute Levenshtein distance between two strings.
|
|
54
|
+
*
|
|
55
|
+
* Used for "did you mean?" suggestions. Simple O(n*m) implementation
|
|
56
|
+
* — fine for short URL paths.
|
|
57
|
+
*/
|
|
58
|
+
function levenshtein(a: string, b: string): number {
|
|
59
|
+
const m = a.length;
|
|
60
|
+
const n = b.length;
|
|
61
|
+
|
|
62
|
+
// Optimization: use single-row DP
|
|
63
|
+
const row = Array.from({ length: n + 1 }, (_, i) => i);
|
|
64
|
+
|
|
65
|
+
for (let i = 1; i <= m; i++) {
|
|
66
|
+
let prev = i;
|
|
67
|
+
for (let j = 1; j <= n; j++) {
|
|
68
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
69
|
+
const val = Math.min(
|
|
70
|
+
row[j]! + 1, // deletion
|
|
71
|
+
prev + 1, // insertion
|
|
72
|
+
row[j - 1]! + cost // substitution
|
|
73
|
+
);
|
|
74
|
+
row[j - 1] = prev;
|
|
75
|
+
prev = val;
|
|
76
|
+
}
|
|
77
|
+
row[n] = prev;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return row[n]!;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Find routes similar to the requested path.
|
|
85
|
+
*
|
|
86
|
+
* Returns up to 3 suggestions, sorted by similarity.
|
|
87
|
+
* Only includes routes with distance ≤ 40% of the longer string.
|
|
88
|
+
*/
|
|
89
|
+
export function findSimilarRoutes(requestedPath: string, routes: RouteInfo[]): RouteInfo[] {
|
|
90
|
+
if (routes.length === 0) return [];
|
|
91
|
+
|
|
92
|
+
const scored = routes
|
|
93
|
+
.map((route) => ({
|
|
94
|
+
route,
|
|
95
|
+
distance: levenshtein(requestedPath.toLowerCase(), route.path.toLowerCase()),
|
|
96
|
+
}))
|
|
97
|
+
.filter((s) => {
|
|
98
|
+
const maxLen = Math.max(requestedPath.length, s.route.path.length);
|
|
99
|
+
return s.distance <= maxLen * 0.4;
|
|
100
|
+
})
|
|
101
|
+
.sort((a, b) => a.distance - b.distance);
|
|
102
|
+
|
|
103
|
+
return scored.slice(0, 3).map((s) => s.route);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ─── HTML Escaping ──────────────────────────────────────────────────────────
|
|
107
|
+
|
|
108
|
+
const esc = escapeHtml;
|
|
109
|
+
|
|
110
|
+
// ─── HTML Generation ────────────────────────────────────────────────────────
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Generate a dev-mode 404 page with route listing and suggestions.
|
|
114
|
+
*
|
|
115
|
+
* Returns an HTML string for a self-contained error page.
|
|
116
|
+
*/
|
|
117
|
+
export function generateDev404Page(requestedPath: string, routes: RouteInfo[]): string {
|
|
118
|
+
const suggestions = findSimilarRoutes(requestedPath, routes);
|
|
119
|
+
const isEmpty = routes.length === 0;
|
|
120
|
+
|
|
121
|
+
return `<!DOCTYPE html>
|
|
122
|
+
<html lang="en">
|
|
123
|
+
<head>
|
|
124
|
+
<meta charset="utf-8">
|
|
125
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
126
|
+
<title>404 — ${esc(requestedPath)} | timber.js</title>
|
|
127
|
+
<style>${CSS}</style>
|
|
128
|
+
</head>
|
|
129
|
+
<body>
|
|
130
|
+
<div class="container">
|
|
131
|
+
<header class="header">
|
|
132
|
+
<div class="badge">404 Not Found</div>
|
|
133
|
+
<h1 class="message">No route matches <code>${esc(requestedPath)}</code></h1>
|
|
134
|
+
</header>
|
|
135
|
+
|
|
136
|
+
${
|
|
137
|
+
isEmpty
|
|
138
|
+
? `<div class="welcome">
|
|
139
|
+
<h2>Welcome to timber.js</h2>
|
|
140
|
+
<p>Your app has no pages yet. Create your first page to get started:</p>
|
|
141
|
+
<div class="code-block">
|
|
142
|
+
<div class="code-header">app/page.tsx</div>
|
|
143
|
+
<pre><code>export default function Home() {
|
|
144
|
+
return <h1>Hello, timber.js!</h1>;
|
|
145
|
+
}</code></pre>
|
|
146
|
+
</div>
|
|
147
|
+
<p class="hint">Save the file and this page will reload automatically.</p>
|
|
148
|
+
</div>`
|
|
149
|
+
: ''
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
${
|
|
153
|
+
suggestions.length > 0
|
|
154
|
+
? `<div class="section">
|
|
155
|
+
<div class="section-header">Did you mean?</div>
|
|
156
|
+
<ul class="route-list suggestions">
|
|
157
|
+
${suggestions.map((r) => `<li><a href="${esc(r.path)}">${esc(r.path)}</a> <span class="route-type">${r.type}</span></li>`).join('\n ')}
|
|
158
|
+
</ul>
|
|
159
|
+
</div>`
|
|
160
|
+
: ''
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
${
|
|
164
|
+
routes.length > 0
|
|
165
|
+
? `<div class="section">
|
|
166
|
+
<div class="section-header">Available Routes (${routes.length})</div>
|
|
167
|
+
<ul class="route-list">
|
|
168
|
+
${routes.map((r) => `<li><a href="${esc(r.path)}">${esc(r.path)}</a> <span class="route-type">${r.type}</span></li>`).join('\n ')}
|
|
169
|
+
</ul>
|
|
170
|
+
</div>`
|
|
171
|
+
: ''
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
<footer class="footer">
|
|
175
|
+
<span class="timber-logo">🪵 timber.js</span>
|
|
176
|
+
<span class="footer-hint">Add or edit routes and this page will reload automatically.</span>
|
|
177
|
+
</footer>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<script>
|
|
181
|
+
// Auto-reload when Vite HMR fires (route added, file changed, etc.)
|
|
182
|
+
(function() {
|
|
183
|
+
try {
|
|
184
|
+
const ws = new WebSocket('ws://' + location.host, 'vite-hmr');
|
|
185
|
+
ws.addEventListener('message', function(e) {
|
|
186
|
+
try {
|
|
187
|
+
const data = JSON.parse(e.data);
|
|
188
|
+
if (data.type === 'full-reload' || data.type === 'update') {
|
|
189
|
+
location.reload();
|
|
190
|
+
}
|
|
191
|
+
} catch {}
|
|
192
|
+
});
|
|
193
|
+
} catch {}
|
|
194
|
+
})();
|
|
195
|
+
</script>
|
|
196
|
+
</body>
|
|
197
|
+
</html>`;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// ─── CSS ────────────────────────────────────────────────────────────────────
|
|
201
|
+
|
|
202
|
+
const CSS = `
|
|
203
|
+
:root {
|
|
204
|
+
--bg: #fff;
|
|
205
|
+
--fg: #1a1a1a;
|
|
206
|
+
--fg-dim: #6b7280;
|
|
207
|
+
--border: #e5e7eb;
|
|
208
|
+
--badge-bg: #fefce8;
|
|
209
|
+
--badge-fg: #854d0e;
|
|
210
|
+
--badge-border: #fde68a;
|
|
211
|
+
--source-bg: #fafafa;
|
|
212
|
+
--link: #2563eb;
|
|
213
|
+
--code-bg: #f3f4f6;
|
|
214
|
+
--btn-bg: #f3f4f6;
|
|
215
|
+
--route-type-bg: #e0f2fe;
|
|
216
|
+
--route-type-fg: #0369a1;
|
|
217
|
+
--code-font: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
@media (prefers-color-scheme: dark) {
|
|
221
|
+
:root {
|
|
222
|
+
--bg: #0a0a0a;
|
|
223
|
+
--fg: #f5f5f5;
|
|
224
|
+
--fg-dim: #9ca3af;
|
|
225
|
+
--border: #27272a;
|
|
226
|
+
--badge-bg: #422006;
|
|
227
|
+
--badge-fg: #fde68a;
|
|
228
|
+
--badge-border: #854d0e;
|
|
229
|
+
--source-bg: #18181b;
|
|
230
|
+
--link: #60a5fa;
|
|
231
|
+
--code-bg: #27272a;
|
|
232
|
+
--btn-bg: #27272a;
|
|
233
|
+
--route-type-bg: #0c4a6e;
|
|
234
|
+
--route-type-fg: #bae6fd;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
239
|
+
|
|
240
|
+
body {
|
|
241
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
242
|
+
background: var(--bg);
|
|
243
|
+
color: var(--fg);
|
|
244
|
+
line-height: 1.6;
|
|
245
|
+
padding: 2rem;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.container { max-width: 56rem; margin: 0 auto; }
|
|
249
|
+
.header { margin-bottom: 1.5rem; }
|
|
250
|
+
|
|
251
|
+
.badge {
|
|
252
|
+
display: inline-block;
|
|
253
|
+
font-size: 0.75rem;
|
|
254
|
+
font-weight: 600;
|
|
255
|
+
text-transform: uppercase;
|
|
256
|
+
letter-spacing: 0.05em;
|
|
257
|
+
padding: 0.25rem 0.625rem;
|
|
258
|
+
border-radius: 0.375rem;
|
|
259
|
+
background: var(--badge-bg);
|
|
260
|
+
color: var(--badge-fg);
|
|
261
|
+
border: 1px solid var(--badge-border);
|
|
262
|
+
margin-bottom: 0.75rem;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.message {
|
|
266
|
+
font-size: 1.375rem;
|
|
267
|
+
font-weight: 600;
|
|
268
|
+
line-height: 1.3;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.message code {
|
|
272
|
+
font-family: var(--code-font);
|
|
273
|
+
background: var(--code-bg);
|
|
274
|
+
padding: 0.125rem 0.375rem;
|
|
275
|
+
border-radius: 0.25rem;
|
|
276
|
+
font-size: 1.125rem;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.welcome {
|
|
280
|
+
margin-bottom: 1.5rem;
|
|
281
|
+
padding: 1.5rem;
|
|
282
|
+
border: 1px solid var(--border);
|
|
283
|
+
border-radius: 0.5rem;
|
|
284
|
+
background: var(--source-bg);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.welcome h2 {
|
|
288
|
+
font-size: 1.125rem;
|
|
289
|
+
margin-bottom: 0.5rem;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.welcome p { color: var(--fg-dim); margin-bottom: 1rem; }
|
|
293
|
+
|
|
294
|
+
.code-block {
|
|
295
|
+
border: 1px solid var(--border);
|
|
296
|
+
border-radius: 0.5rem;
|
|
297
|
+
overflow: hidden;
|
|
298
|
+
margin-bottom: 1rem;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.code-header {
|
|
302
|
+
font-size: 0.75rem;
|
|
303
|
+
font-weight: 600;
|
|
304
|
+
padding: 0.5rem 0.75rem;
|
|
305
|
+
background: var(--code-bg);
|
|
306
|
+
border-bottom: 1px solid var(--border);
|
|
307
|
+
color: var(--fg-dim);
|
|
308
|
+
font-family: var(--code-font);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.code-block pre {
|
|
312
|
+
padding: 0.75rem;
|
|
313
|
+
font-family: var(--code-font);
|
|
314
|
+
font-size: 0.8125rem;
|
|
315
|
+
line-height: 1.7;
|
|
316
|
+
overflow-x: auto;
|
|
317
|
+
margin: 0;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.section {
|
|
321
|
+
margin-bottom: 1rem;
|
|
322
|
+
border: 1px solid var(--border);
|
|
323
|
+
border-radius: 0.5rem;
|
|
324
|
+
overflow: hidden;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.section-header {
|
|
328
|
+
font-size: 0.75rem;
|
|
329
|
+
font-weight: 600;
|
|
330
|
+
text-transform: uppercase;
|
|
331
|
+
letter-spacing: 0.05em;
|
|
332
|
+
padding: 0.5rem 0.75rem;
|
|
333
|
+
background: var(--source-bg);
|
|
334
|
+
border-bottom: 1px solid var(--border);
|
|
335
|
+
color: var(--fg-dim);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.route-list {
|
|
339
|
+
list-style: none;
|
|
340
|
+
padding: 0.5rem 0;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.route-list li {
|
|
344
|
+
padding: 0.375rem 0.75rem;
|
|
345
|
+
font-family: var(--code-font);
|
|
346
|
+
font-size: 0.8125rem;
|
|
347
|
+
display: flex;
|
|
348
|
+
align-items: center;
|
|
349
|
+
gap: 0.5rem;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.route-list li:hover { background: var(--source-bg); }
|
|
353
|
+
|
|
354
|
+
.route-list a {
|
|
355
|
+
color: var(--link);
|
|
356
|
+
text-decoration: none;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.route-list a:hover { text-decoration: underline; }
|
|
360
|
+
|
|
361
|
+
.route-type {
|
|
362
|
+
font-size: 0.625rem;
|
|
363
|
+
font-weight: 600;
|
|
364
|
+
text-transform: uppercase;
|
|
365
|
+
letter-spacing: 0.05em;
|
|
366
|
+
padding: 0.125rem 0.375rem;
|
|
367
|
+
border-radius: 0.25rem;
|
|
368
|
+
background: var(--route-type-bg);
|
|
369
|
+
color: var(--route-type-fg);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
.suggestions { background: var(--source-bg); }
|
|
373
|
+
|
|
374
|
+
.hint { font-size: 0.875rem; color: var(--fg-dim); }
|
|
375
|
+
|
|
376
|
+
.footer {
|
|
377
|
+
display: flex;
|
|
378
|
+
align-items: center;
|
|
379
|
+
gap: 0.75rem;
|
|
380
|
+
padding-top: 1rem;
|
|
381
|
+
border-top: 1px solid var(--border);
|
|
382
|
+
font-size: 0.75rem;
|
|
383
|
+
color: var(--fg-dim);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
.timber-logo { font-weight: 600; white-space: nowrap; }
|
|
387
|
+
`;
|