@timber-js/app 0.2.0-alpha.7 → 0.2.0-alpha.71
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/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-BJARkOcu.js} +1 -1
- package/dist/_chunks/als-registry-BJARkOcu.js.map +1 -0
- package/dist/_chunks/chunk-DYhsFzuS.js +33 -0
- package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
- package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
- package/dist/_chunks/define-CGuYoRHU.js +199 -0
- package/dist/_chunks/define-CGuYoRHU.js.map +1 -0
- package/dist/_chunks/define-Dz1bqwaS.js +106 -0
- package/dist/_chunks/define-Dz1bqwaS.js.map +1 -0
- package/dist/_chunks/define-cookie-B5mewxwM.js +93 -0
- package/dist/_chunks/define-cookie-B5mewxwM.js.map +1 -0
- package/dist/_chunks/error-boundary-D9hzsveV.js +216 -0
- package/dist/_chunks/error-boundary-D9hzsveV.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → format-Rn922VH2.js} +3 -20
- package/dist/_chunks/format-Rn922VH2.js.map +1 -0
- package/dist/_chunks/{tracing-Cwn7697K.js → handler-store-BVePM7hp.js} +68 -3
- package/dist/_chunks/handler-store-BVePM7hp.js.map +1 -0
- package/dist/_chunks/{interception-BOoWmLUA.js → interception-CEdHHviP.js} +171 -97
- package/dist/_chunks/interception-CEdHHviP.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
- package/dist/_chunks/{request-context-DIkVh_jG.js → request-context-CywiO4jV.js} +181 -69
- package/dist/_chunks/request-context-CywiO4jV.js.map +1 -0
- package/dist/_chunks/schema-bridge-C4SwjCQD.js +86 -0
- package/dist/_chunks/schema-bridge-C4SwjCQD.js.map +1 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
- package/dist/_chunks/segment-context-hzuJ048X.js +72 -0
- package/dist/_chunks/segment-context-hzuJ048X.js.map +1 -0
- package/dist/_chunks/stale-reload-BLUC_Pl_.js +64 -0
- package/dist/_chunks/stale-reload-BLUC_Pl_.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-DAhgj8Gx.js} +1 -1
- package/dist/_chunks/use-query-states-DAhgj8Gx.js.map +1 -0
- package/dist/_chunks/wrappers-LZbghvn0.js +63 -0
- package/dist/_chunks/wrappers-LZbghvn0.js.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.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +135 -11
- 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 +56 -13
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/fast-hash.d.ts +22 -0
- package/dist/cache/fast-hash.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 +7 -5
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +111 -73
- 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/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- 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 +1 -125
- 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 +2 -2
- 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 +6 -5
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +537 -166
- package/dist/client/index.js.map +1 -1
- package/dist/client/link-pending-store.d.ts +78 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +90 -32
- 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.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-context.d.ts +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-merger.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/top-loader.d.ts +3 -3
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-params.d.ts +6 -4
- package/dist/client/use-params.d.ts.map +1 -1
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/codec.d.ts +23 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +2 -0
- package/dist/cookies/define-cookie.d.ts +35 -14
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -0
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +3 -84
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/index.d.ts +154 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12092 -11916
- package/dist/index.js.map +1 -1
- 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 +3 -3
- 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-browser-logs.d.ts +84 -0
- package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
- package/dist/plugins/dev-error-overlay.d.ts +26 -1
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- package/dist/plugins/dev-logs.d.ts +1 -1
- package/dist/plugins/dev-logs.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 +19 -5
- 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 +1 -1
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts +2 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/index.d.ts +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -2
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +46 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/status-file-lint.d.ts +2 -1
- package/dist/routing/status-file-lint.d.ts.map +1 -1
- package/dist/routing/types.d.ts +16 -4
- package/dist/routing/types.d.ts.map +1 -1
- 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 +139 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -6
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +4 -474
- package/dist/search-params/registry.d.ts +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 +78 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +7 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +4 -0
- package/dist/server/access-gate.d.ts +4 -0
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +12 -1
- 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.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 +32 -4
- package/dist/server/als-registry.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/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-page-resolver.d.ts +52 -0
- package/dist/server/deny-page-resolver.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-warnings.d.ts +0 -14
- package/dist/server/dev-warnings.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 +4 -3
- 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-injectors.d.ts +51 -11
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +5 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2176 -1663
- package/dist/server/index.js.map +1 -1
- package/dist/server/logger.d.ts +25 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +113 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/page-deny-boundary.d.ts +31 -0
- package/dist/server/page-deny-boundary.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.d.ts +32 -10
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/primitives.d.ts +30 -3
- 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 +76 -37
- 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 +9 -2
- package/dist/server/route-matcher.d.ts.map +1 -1
- 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 +48 -5
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +8 -3
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- 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 +10 -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/safe-load.d.ts +46 -0
- package/dist/server/safe-load.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 +22 -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/status-code-resolver.d.ts +1 -1
- 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 +10 -0
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +22 -19
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/types.d.ts +1 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/waituntil-bridge.d.ts.map +1 -1
- 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/navigation-client.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +1 -1
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/directive-parser.d.ts +5 -2
- package/dist/utils/directive-parser.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 +37 -17
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare.ts +342 -28
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +58 -9
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/fast-hash.ts +34 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +9 -5
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/timber-cache.ts +40 -29
- package/src/cli.ts +0 -0
- package/src/client/browser-entry.ts +314 -142
- package/src/client/error-boundary.tsx +48 -16
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +2 -2
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +13 -4
- package/src/client/link-pending-store.ts +136 -0
- package/src/client/link.tsx +346 -105
- 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 +27 -6
- package/src/client/navigation-root.tsx +346 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router.ts +302 -77
- package/src/client/rsc-fetch.ts +93 -5
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-context.ts +6 -1
- package/src/client/segment-merger.ts +2 -8
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +73 -6
- package/src/client/top-loader.tsx +22 -13
- package/src/client/use-navigation-pending.ts +1 -1
- package/src/client/use-params.ts +7 -5
- package/src/client/use-query-states.ts +2 -2
- package/src/codec.ts +34 -0
- package/src/cookies/define-cookie.ts +72 -21
- package/src/cookies/index.ts +7 -0
- package/src/fonts/css.ts +2 -1
- package/src/index.ts +328 -92
- package/src/plugins/adapter-build.ts +8 -2
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +3 -3
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-browser-logs.ts +288 -0
- package/src/plugins/dev-error-overlay.ts +70 -1
- package/src/plugins/dev-logs.ts +1 -1
- package/src/plugins/dev-server.ts +55 -9
- package/src/plugins/entries.ts +70 -9
- package/src/plugins/fonts.ts +167 -61
- package/src/plugins/mdx.ts +1 -1
- package/src/plugins/routing.ts +57 -17
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +76 -33
- package/src/plugins/static-build.ts +10 -6
- package/src/routing/codegen.ts +165 -105
- package/src/routing/index.ts +2 -0
- package/src/routing/scanner.ts +93 -23
- package/src/routing/segment-classify.ts +89 -0
- package/src/routing/status-file-lint.ts +3 -2
- package/src/routing/types.ts +17 -4
- 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 +482 -0
- package/src/search-params/index.ts +13 -19
- package/src/search-params/registry.ts +1 -1
- package/src/search-params/wrappers.ts +85 -0
- package/src/segment-params/define.ts +279 -0
- package/src/segment-params/index.ts +28 -0
- package/src/server/access-gate.tsx +70 -29
- package/src/server/action-client.ts +28 -3
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +20 -3
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +32 -4
- package/src/server/build-manifest.ts +10 -4
- package/src/server/compress.ts +25 -7
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-page-resolver.ts +154 -0
- package/src/server/deny-renderer.ts +24 -38
- package/src/server/dev-warnings.ts +2 -28
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +31 -15
- 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-injectors.ts +277 -117
- package/src/server/index.ts +9 -5
- package/src/server/logger.ts +44 -36
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +509 -0
- package/src/server/page-deny-boundary.tsx +56 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline.ts +195 -51
- package/src/server/primitives.ts +47 -5
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +240 -117
- package/src/server/route-element-builder.ts +284 -197
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +24 -20
- package/src/server/rsc-entry/api-handler.ts +15 -16
- package/src/server/rsc-entry/error-renderer.ts +300 -89
- package/src/server/rsc-entry/helpers.ts +134 -5
- package/src/server/rsc-entry/index.ts +202 -113
- package/src/server/rsc-entry/rsc-payload.ts +100 -21
- package/src/server/rsc-entry/rsc-stream.ts +74 -18
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +173 -40
- package/src/server/safe-load.ts +60 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +243 -228
- package/src/server/ssr-entry.ts +211 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +37 -3
- package/src/server/tree-builder.ts +92 -58
- package/src/server/types.ts +3 -6
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +4 -1
- 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/navigation-client.ts +1 -1
- package/src/shims/navigation.ts +2 -1
- package/src/utils/directive-parser.ts +5 -2
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js +0 -88
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-Cwn7697K.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/error-boundary.js.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/cookies/index.js.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/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.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/search-params/index.js.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 -53
- package/dist/server/response-cache.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -99
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -160
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dynamic-transform.ts +0 -161
- 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/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -277
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared URL segment classifier.
|
|
3
|
+
*
|
|
4
|
+
* Single-pass character parser that classifies a route segment token
|
|
5
|
+
* (e.g. "dashboard", "[id]", "[...slug]", "[[...path]]") into a typed
|
|
6
|
+
* discriminated union. Used by both server-side routing and client-side
|
|
7
|
+
* Link interpolation.
|
|
8
|
+
*
|
|
9
|
+
* NO regex. NO Node.js-only APIs. Safe to import from browser code.
|
|
10
|
+
*
|
|
11
|
+
* Malformed input (unclosed brackets, empty names, etc.) falls through
|
|
12
|
+
* to { kind: 'static' } — the safe default.
|
|
13
|
+
*
|
|
14
|
+
* If you change the bracket syntax, update ONLY this file. Every
|
|
15
|
+
* consumer imports from here.
|
|
16
|
+
*
|
|
17
|
+
* See design/07-routing.md §"Route Segments"
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export type UrlSegment =
|
|
21
|
+
| { kind: 'static'; value: string }
|
|
22
|
+
| { kind: 'dynamic'; name: string }
|
|
23
|
+
| { kind: 'catch-all'; name: string }
|
|
24
|
+
| { kind: 'optional-catch-all'; name: string };
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Classify a URL path segment token.
|
|
28
|
+
*
|
|
29
|
+
* Walks the string left-to-right in one pass:
|
|
30
|
+
* 1. If it doesn't start with '[', it's static.
|
|
31
|
+
* 2. Count opening brackets (1 or 2) to detect optional.
|
|
32
|
+
* 3. Check for '...' to detect catch-all.
|
|
33
|
+
* 4. Read the param name up to the closing bracket.
|
|
34
|
+
* 5. Validate the expected closing sequence (']' or ']]').
|
|
35
|
+
* 6. Reject if there are leftover characters after the close.
|
|
36
|
+
*
|
|
37
|
+
* Any structural violation → static (safe default).
|
|
38
|
+
*/
|
|
39
|
+
export function classifyUrlSegment(token: string): UrlSegment {
|
|
40
|
+
const len = token.length;
|
|
41
|
+
|
|
42
|
+
// Must start with '[' to be dynamic
|
|
43
|
+
if (len === 0 || token[0] !== '[') {
|
|
44
|
+
return { kind: 'static', value: token };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let i = 1;
|
|
48
|
+
|
|
49
|
+
// Check for optional: '[[...'
|
|
50
|
+
const optional = token[i] === '[';
|
|
51
|
+
if (optional) i++;
|
|
52
|
+
|
|
53
|
+
// Check for catch-all: '...'
|
|
54
|
+
const catchAll = i + 2 < len && token[i] === '.' && token[i + 1] === '.' && token[i + 2] === '.';
|
|
55
|
+
if (catchAll) i += 3;
|
|
56
|
+
|
|
57
|
+
// Read param name — everything up to ']'
|
|
58
|
+
const nameStart = i;
|
|
59
|
+
while (i < len && token[i] !== ']') i++;
|
|
60
|
+
|
|
61
|
+
// Must have found a ']' and name must be non-empty
|
|
62
|
+
if (i >= len || i === nameStart) {
|
|
63
|
+
return { kind: 'static', value: token };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const name = token.slice(nameStart, i);
|
|
67
|
+
i++; // skip first ']'
|
|
68
|
+
|
|
69
|
+
// Optional requires a second ']'
|
|
70
|
+
if (optional) {
|
|
71
|
+
if (i >= len || token[i] !== ']') {
|
|
72
|
+
return { kind: 'static', value: token };
|
|
73
|
+
}
|
|
74
|
+
i++;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Must be at end of string — no trailing characters
|
|
78
|
+
if (i !== len) {
|
|
79
|
+
return { kind: 'static', value: token };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (optional && catchAll) return { kind: 'optional-catch-all', name };
|
|
83
|
+
if (catchAll) return { kind: 'catch-all', name };
|
|
84
|
+
if (optional) {
|
|
85
|
+
// '[[name]]' without '...' is malformed — not a valid segment syntax
|
|
86
|
+
return { kind: 'static', value: token };
|
|
87
|
+
}
|
|
88
|
+
return { kind: 'dynamic', name };
|
|
89
|
+
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import { readFileSync } from 'node:fs';
|
|
17
17
|
import type { RouteTree, SegmentNode } from './types.js';
|
|
18
|
-
import { detectFileDirective } from '
|
|
18
|
+
import { detectFileDirective } from '../utils/directive-parser.js';
|
|
19
19
|
|
|
20
20
|
/** Extensions that require 'use client' (component files, not MDX/JSON). */
|
|
21
21
|
const CLIENT_REQUIRED_EXTENSIONS = new Set(['tsx', 'jsx', 'ts', 'js']);
|
|
@@ -31,7 +31,8 @@ export interface StatusFileLintWarning {
|
|
|
31
31
|
* that are missing it.
|
|
32
32
|
*
|
|
33
33
|
* MDX and JSON status files are excluded — MDX files are server components
|
|
34
|
-
* by design
|
|
34
|
+
* by design (pre-rendered as elements via fallbackElement, see TIM-503),
|
|
35
|
+
* and JSON files are data, not components.
|
|
35
36
|
*/
|
|
36
37
|
export function lintStatusFileDirectives(tree: RouteTree): StatusFileLintWarning[] {
|
|
37
38
|
const warnings: StatusFileLintWarning[] = [];
|
package/src/routing/types.ts
CHANGED
|
@@ -59,6 +59,12 @@ export interface SegmentNode {
|
|
|
59
59
|
middleware?: RouteFile;
|
|
60
60
|
access?: RouteFile;
|
|
61
61
|
route?: RouteFile;
|
|
62
|
+
/**
|
|
63
|
+
* params.ts — isomorphic convention file exporting segmentParams and/or searchParams.
|
|
64
|
+
* Discovered by the scanner like middleware.ts and access.ts.
|
|
65
|
+
* See design/07-routing.md §"params.ts Convention File"
|
|
66
|
+
*/
|
|
67
|
+
params?: RouteFile;
|
|
62
68
|
error?: RouteFile;
|
|
63
69
|
default?: RouteFile;
|
|
64
70
|
/** Status-code files: 4xx.tsx, 5xx.tsx, {status}.tsx (component format) */
|
|
@@ -69,10 +75,7 @@ export interface SegmentNode {
|
|
|
69
75
|
denied?: RouteFile;
|
|
70
76
|
/** Legacy compat: not-found.tsx (maps to 404), forbidden.tsx (403), unauthorized.tsx (401) */
|
|
71
77
|
legacyStatusFiles?: Map<string, RouteFile>;
|
|
72
|
-
|
|
73
|
-
prerender?: RouteFile;
|
|
74
|
-
/** search-params.ts — typed search params definition for this route */
|
|
75
|
-
searchParams?: RouteFile;
|
|
78
|
+
|
|
76
79
|
/** Metadata route files (sitemap.ts, robots.ts, icon.tsx, etc.) keyed by base name */
|
|
77
80
|
metadataRoutes?: Map<string, RouteFile>;
|
|
78
81
|
|
|
@@ -88,6 +91,16 @@ export interface RouteTree {
|
|
|
88
91
|
root: SegmentNode;
|
|
89
92
|
/** All discovered proxy.ts files (should be at most one, in app/) */
|
|
90
93
|
proxy?: RouteFile;
|
|
94
|
+
/**
|
|
95
|
+
* Global error page: app/global-error.{tsx,ts,jsx,js}
|
|
96
|
+
*
|
|
97
|
+
* Rendered as a standalone full-page replacement (no layout wrapping)
|
|
98
|
+
* when no segment-level error file is found. SSR-only render path.
|
|
99
|
+
* Must provide its own <html> and <body>.
|
|
100
|
+
*
|
|
101
|
+
* See design/10-error-handling.md §"Tier 2 — Global Error Page"
|
|
102
|
+
*/
|
|
103
|
+
globalError?: RouteFile;
|
|
91
104
|
}
|
|
92
105
|
|
|
93
106
|
/** Configuration passed to the scanner */
|
package/src/rsc-runtime/rsc.ts
CHANGED
package/src/rsc-runtime/ssr.ts
CHANGED
|
@@ -11,3 +11,53 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
export { createFromReadableStream } from '@vitejs/plugin-rsc/ssr';
|
|
14
|
+
|
|
15
|
+
// ─── Node.js Stream Path ─────────────────────────────────────────────────────
|
|
16
|
+
//
|
|
17
|
+
// On Node.js, createFromNodeStream reads RSC Flight data from a Node.js
|
|
18
|
+
// Readable (C++ backed) instead of a Web ReadableStream (JS reimplementation).
|
|
19
|
+
// Eliminates Promise-per-chunk overhead on the SSR decode path.
|
|
20
|
+
//
|
|
21
|
+
// The plugin only exports createFromReadableStream (via client.edge.js).
|
|
22
|
+
// createFromNodeStream lives in the vendored client.node.js. We import it
|
|
23
|
+
// directly and wire up the same serverConsumerManifest the plugin uses.
|
|
24
|
+
|
|
25
|
+
import { createServerConsumerManifest } from '@vitejs/plugin-rsc/ssr';
|
|
26
|
+
|
|
27
|
+
type CreateFromNodeStreamFn = (
|
|
28
|
+
stream: import('node:stream').Readable,
|
|
29
|
+
manifest: ReturnType<typeof createServerConsumerManifest>,
|
|
30
|
+
options?: Record<string, unknown>
|
|
31
|
+
) => React.ReactNode;
|
|
32
|
+
|
|
33
|
+
let _createFromNodeStream: CreateFromNodeStreamFn | null = null;
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
if (typeof process !== 'undefined' && process.release?.name === 'node') {
|
|
37
|
+
const clientNode = await import('@vitejs/plugin-rsc/vendor/react-server-dom/client.node');
|
|
38
|
+
if (typeof clientNode.createFromNodeStream === 'function') {
|
|
39
|
+
_createFromNodeStream = clientNode.createFromNodeStream;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
} catch {
|
|
43
|
+
// Not available — fall back to createFromReadableStream
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Decode an RSC Flight stream from a Node.js Readable.
|
|
48
|
+
*
|
|
49
|
+
* Uses the vendored createFromNodeStream which reads via Node.js native
|
|
50
|
+
* streams (C++ libuv) instead of Web ReadableStream (JS Promise per chunk).
|
|
51
|
+
*
|
|
52
|
+
* Returns null if createFromNodeStream isn't available (CF Workers, etc),
|
|
53
|
+
* signaling the caller to use createFromReadableStream instead.
|
|
54
|
+
*/
|
|
55
|
+
export function createFromNodeStream(
|
|
56
|
+
stream: import('node:stream').Readable
|
|
57
|
+
): React.ReactNode | null {
|
|
58
|
+
if (!_createFromNodeStream) return null;
|
|
59
|
+
return _createFromNodeStream(stream, createServerConsumerManifest());
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Whether the Node.js stream RSC decode path is available. */
|
|
63
|
+
export const hasNodeStreamDecode = _createFromNodeStream !== null;
|
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* validation libraries (Zod, Valibot, ArkType).
|
|
2
|
+
* Standard Schema bridge — shared helpers for bridging Standard Schema-compatible
|
|
3
|
+
* validation libraries (Zod, Valibot, ArkType) to the Codec<T> protocol.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* This module is the single source of truth for:
|
|
6
|
+
* - StandardSchemaV1 interface (subset of the Standard Schema spec)
|
|
7
|
+
* - validateSync() helper
|
|
8
|
+
* - fromSchema() — bridge from Standard Schema to Codec<T>
|
|
9
|
+
* - fromArraySchema() — bridge for array-valued codecs
|
|
10
|
+
*
|
|
11
|
+
* These are re-exported from @timber-js/app/search-params, @timber-js/app/segment-params,
|
|
12
|
+
* and @timber-js/app/cookies for convenience. The canonical import is
|
|
13
|
+
* @timber-js/app/codec.
|
|
14
|
+
*
|
|
15
|
+
* Design doc: design/23a-search-params-triage.md §"Unify Codec<T> type"
|
|
6
16
|
*/
|
|
7
17
|
|
|
8
|
-
import type {
|
|
18
|
+
import type { Codec } from './codec.js';
|
|
9
19
|
|
|
10
20
|
// ---------------------------------------------------------------------------
|
|
11
21
|
// Standard Schema interface (subset)
|
|
@@ -15,13 +25,14 @@ import type { SearchParamCodec } from './create.js';
|
|
|
15
25
|
// We depend only on `~standard.validate` to avoid coupling to any specific lib.
|
|
16
26
|
// ---------------------------------------------------------------------------
|
|
17
27
|
|
|
18
|
-
interface
|
|
28
|
+
/** Minimal Standard Schema interface for auto-detection. */
|
|
29
|
+
export interface StandardSchemaV1<Output = unknown> {
|
|
19
30
|
'~standard': {
|
|
20
31
|
validate(value: unknown): StandardSchemaResult<Output> | Promise<StandardSchemaResult<Output>>;
|
|
21
32
|
};
|
|
22
33
|
}
|
|
23
34
|
|
|
24
|
-
type StandardSchemaResult<Output> =
|
|
35
|
+
export type StandardSchemaResult<Output> =
|
|
25
36
|
| { value: Output; issues?: undefined }
|
|
26
37
|
| { value?: undefined; issues: ReadonlyArray<{ message: string }> };
|
|
27
38
|
|
|
@@ -30,46 +41,72 @@ type StandardSchemaResult<Output> =
|
|
|
30
41
|
// ---------------------------------------------------------------------------
|
|
31
42
|
|
|
32
43
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
44
|
+
* Run a Standard Schema's `~standard.validate()` synchronously.
|
|
45
|
+
*
|
|
46
|
+
* Zod v4's signature includes `Promise` in the return union to satisfy the
|
|
47
|
+
* Standard Schema spec, but in practice Zod always validates synchronously
|
|
48
|
+
* for the schema types we use. We assert the result is sync and throw if
|
|
49
|
+
* it isn't — codec parsing must be synchronous.
|
|
37
50
|
*/
|
|
38
|
-
function validateSync<Output>(
|
|
51
|
+
export function validateSync<Output>(
|
|
39
52
|
schema: StandardSchemaV1<Output>,
|
|
40
53
|
value: unknown
|
|
41
54
|
): StandardSchemaResult<Output> {
|
|
42
55
|
const result = schema['~standard'].validate(value);
|
|
43
56
|
if (result instanceof Promise) {
|
|
44
57
|
throw new Error(
|
|
45
|
-
'[timber] fromSchema: schema returned a Promise — only sync schemas are supported
|
|
58
|
+
'[timber] fromSchema: schema returned a Promise — only sync schemas are supported.'
|
|
46
59
|
);
|
|
47
60
|
}
|
|
48
61
|
return result;
|
|
49
62
|
}
|
|
50
63
|
|
|
51
64
|
// ---------------------------------------------------------------------------
|
|
52
|
-
//
|
|
65
|
+
// Type guards
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
|
|
68
|
+
/** Check if a value is a Standard Schema object. */
|
|
69
|
+
export function isStandardSchema(value: unknown): value is StandardSchemaV1 {
|
|
70
|
+
return (
|
|
71
|
+
typeof value === 'object' &&
|
|
72
|
+
value !== null &&
|
|
73
|
+
'~standard' in value &&
|
|
74
|
+
typeof (value as StandardSchemaV1)['~standard']?.validate === 'function'
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Check if a value is a Codec (has parse + serialize methods). */
|
|
79
|
+
export function isCodec(value: unknown): value is Codec<unknown> {
|
|
80
|
+
return (
|
|
81
|
+
typeof value === 'object' &&
|
|
82
|
+
value !== null &&
|
|
83
|
+
typeof (value as Codec<unknown>).parse === 'function' &&
|
|
84
|
+
typeof (value as Codec<unknown>).serialize === 'function'
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// fromSchema — bridge from Standard Schema to Codec<T>
|
|
53
90
|
// ---------------------------------------------------------------------------
|
|
54
91
|
|
|
55
92
|
/**
|
|
56
93
|
* Bridge a Standard Schema-compatible schema (Zod, Valibot, ArkType) to a
|
|
57
|
-
*
|
|
94
|
+
* Codec<T>.
|
|
58
95
|
*
|
|
59
|
-
* Parse: coerces the raw
|
|
96
|
+
* Parse: coerces the raw string through the schema. On validation failure,
|
|
60
97
|
* parses `undefined` to get the schema's default value (the schema should have
|
|
61
98
|
* a `.default()` call). If that also fails, returns `undefined`.
|
|
62
99
|
*
|
|
63
100
|
* Serialize: uses `String()` for primitives, `null` for null/undefined.
|
|
64
101
|
*
|
|
65
102
|
* ```ts
|
|
66
|
-
* import { fromSchema } from '@timber-js/app/
|
|
103
|
+
* import { fromSchema } from '@timber-js/app/codec'
|
|
67
104
|
* import { z } from 'zod/v4'
|
|
68
105
|
*
|
|
69
106
|
* const pageCodec = fromSchema(z.coerce.number().int().min(1).default(1))
|
|
70
107
|
* ```
|
|
71
108
|
*/
|
|
72
|
-
export function fromSchema<T>(schema: StandardSchemaV1<T>):
|
|
109
|
+
export function fromSchema<T>(schema: StandardSchemaV1<T>): Codec<T> {
|
|
73
110
|
return {
|
|
74
111
|
parse(value: string | string[] | undefined): T {
|
|
75
112
|
// For array inputs, take the last value (consistent with URLSearchParams.get())
|
|
@@ -101,7 +138,7 @@ export function fromSchema<T>(schema: StandardSchemaV1<T>): SearchParamCodec<T>
|
|
|
101
138
|
}
|
|
102
139
|
|
|
103
140
|
// ---------------------------------------------------------------------------
|
|
104
|
-
// fromArraySchema — bridge for array-valued
|
|
141
|
+
// fromArraySchema — bridge for array-valued codecs
|
|
105
142
|
// ---------------------------------------------------------------------------
|
|
106
143
|
|
|
107
144
|
/**
|
|
@@ -109,13 +146,13 @@ export function fromSchema<T>(schema: StandardSchemaV1<T>): SearchParamCodec<T>
|
|
|
109
146
|
* and repeated query keys (`?tag=a&tag=b`).
|
|
110
147
|
*
|
|
111
148
|
* ```ts
|
|
112
|
-
* import { fromArraySchema } from '@timber-js/app/
|
|
149
|
+
* import { fromArraySchema } from '@timber-js/app/codec'
|
|
113
150
|
* import { z } from 'zod/v4'
|
|
114
151
|
*
|
|
115
152
|
* const tagsCodec = fromArraySchema(z.array(z.string()).default([]))
|
|
116
153
|
* ```
|
|
117
154
|
*/
|
|
118
|
-
export function fromArraySchema<T>(schema: StandardSchemaV1<T>):
|
|
155
|
+
export function fromArraySchema<T>(schema: StandardSchemaV1<T>): Codec<T> {
|
|
119
156
|
return {
|
|
120
157
|
parse(value: string | string[] | undefined): T {
|
|
121
158
|
// Coerce single string to array for array schemas
|