@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,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link Pending Store — module-level singleton for per-link pending state.
|
|
3
|
+
*
|
|
4
|
+
* Tracks which link instance is currently navigating so that only the
|
|
5
|
+
* clicked link shows pending. All other links remain unaffected — zero
|
|
6
|
+
* wasted re-renders.
|
|
7
|
+
*
|
|
8
|
+
* The store holds:
|
|
9
|
+
* - A reference to the currently navigating link's state setter
|
|
10
|
+
* - A navigation counter to guard against stale clears (race condition
|
|
11
|
+
* when the user clicks Link B before Link A's navigation completes)
|
|
12
|
+
*
|
|
13
|
+
* Flow:
|
|
14
|
+
* 1. Link click handler: setLinkForCurrentNavigation(instance) →
|
|
15
|
+
* resets previous link (urgent), sets new link pending (urgent),
|
|
16
|
+
* stores setter + increments navId
|
|
17
|
+
* 2. NavigationRoot startTransition: captures navId, does async work
|
|
18
|
+
* 3. NavigationRoot commit: resetLinkPending(capturedNavId) →
|
|
19
|
+
* calls setter(IDLE) inside the transition (batched, atomic with tree)
|
|
20
|
+
* Only clears if navId matches (prevents stale T1 from clearing T2's link)
|
|
21
|
+
*
|
|
22
|
+
* SINGLETON GUARANTEE: Uses `globalThis` via `Symbol.for` keys (same
|
|
23
|
+
* pattern as NavigationContext) because the RSC client bundler can
|
|
24
|
+
* duplicate this module across chunks. Module-level variables would
|
|
25
|
+
* create separate instances per chunk.
|
|
26
|
+
*
|
|
27
|
+
* See design/19-client-navigation.md §"Per-Link Pending State"
|
|
28
|
+
*/
|
|
29
|
+
import type { LinkStatus } from './use-link-status.js';
|
|
30
|
+
export interface LinkPendingInstance {
|
|
31
|
+
setLinkStatus: (status: LinkStatus) => void;
|
|
32
|
+
}
|
|
33
|
+
/** Status object indicating link is pending — shared reference */
|
|
34
|
+
export declare const PENDING_LINK_STATUS: LinkStatus;
|
|
35
|
+
/** Status object indicating link is idle — shared reference */
|
|
36
|
+
export declare const IDLE_LINK_STATUS: LinkStatus;
|
|
37
|
+
/**
|
|
38
|
+
* Register the link instance that initiated the current navigation.
|
|
39
|
+
*
|
|
40
|
+
* Called from <Link>'s click handler before router.navigate().
|
|
41
|
+
* - Resets the previous pending link to IDLE (urgent update, immediate)
|
|
42
|
+
* - Does NOT set the new link to PENDING here — the Link's click handler
|
|
43
|
+
* calls setLinkStatus(PENDING) directly for the eager show
|
|
44
|
+
* - Increments the navId counter for stale-clear protection
|
|
45
|
+
*
|
|
46
|
+
* Pass `null` to clear (e.g., for programmatic navigations).
|
|
47
|
+
*/
|
|
48
|
+
export declare function setLinkForCurrentNavigation(link: LinkPendingInstance | null): void;
|
|
49
|
+
/**
|
|
50
|
+
* Get the current navigation ID. Called at the start of the transition
|
|
51
|
+
* to capture the ID before async work begins.
|
|
52
|
+
*/
|
|
53
|
+
export declare function getCurrentNavId(): number;
|
|
54
|
+
/**
|
|
55
|
+
* Reset the current link's pending state to IDLE, but only if the navId
|
|
56
|
+
* matches. Called inside NavigationRoot's startTransition after the async
|
|
57
|
+
* work completes — the setter call is a transition update, so it commits
|
|
58
|
+
* atomically with the new tree.
|
|
59
|
+
*
|
|
60
|
+
* The navId guard prevents stale transitions from clearing a newer
|
|
61
|
+
* navigation's pending state. Scenario:
|
|
62
|
+
* Click A → navId=1, T1 starts
|
|
63
|
+
* Click B → navId=2, A reset to IDLE, T2 starts
|
|
64
|
+
* T1 completes → resetLinkPending(1) → navId is 2, skip ✓
|
|
65
|
+
* T2 completes → resetLinkPending(2) → navId is 2, clear ✓
|
|
66
|
+
*/
|
|
67
|
+
export declare function resetLinkPending(forNavId: number): void;
|
|
68
|
+
/**
|
|
69
|
+
* Clean up the link pending store entirely. Safety net for error paths.
|
|
70
|
+
*/
|
|
71
|
+
export declare function clearLinkPendingSetter(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Unmount a link instance from navigation tracking. Called when a Link
|
|
74
|
+
* component unmounts while it is the current navigation link. Prevents
|
|
75
|
+
* calling setState on an unmounted component.
|
|
76
|
+
*/
|
|
77
|
+
export declare function unmountLinkForCurrentNavigation(link: LinkPendingInstance): void;
|
|
78
|
+
//# sourceMappingURL=link-pending-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-pending-store.d.ts","sourceRoot":"","sources":["../../src/client/link-pending-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CAC7C;AAMD,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,EAAE,UAA8B,CAAC;AAEjE,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,EAAE,UAA+B,CAAC;AAmB/D;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAWlF;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAG7C;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAK/E"}
|
package/dist/client/link.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import type { SearchParamsDefinition } from '
|
|
1
|
+
import { type AnchorHTMLAttributes, type JSX, type ReactNode } from 'react';
|
|
2
|
+
import type { SearchParamsDefinition } from '../search-params/define.js';
|
|
3
|
+
import { type UrlSegment } from '../routing/segment-classify.js';
|
|
3
4
|
export type OnNavigateEvent = {
|
|
4
5
|
preventDefault: () => void;
|
|
5
6
|
};
|
|
@@ -15,6 +16,20 @@ interface LinkBaseProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'h
|
|
|
15
16
|
* Set to false for tabbed interfaces where content changes within a fixed layout.
|
|
16
17
|
*/
|
|
17
18
|
scroll?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Preserve search params from the current URL across navigation.
|
|
21
|
+
*
|
|
22
|
+
* - `true` — preserve ALL current search params (target params take precedence)
|
|
23
|
+
* - `string[]` — preserve only the named params (e.g. `['private', 'token']`)
|
|
24
|
+
*
|
|
25
|
+
* Useful for route-group gating where a search param (e.g. `?private=access`)
|
|
26
|
+
* must persist across internal navigations. The target href's own search params
|
|
27
|
+
* always take precedence over preserved ones.
|
|
28
|
+
*
|
|
29
|
+
* During SSR, reads search params from the request context. On the client,
|
|
30
|
+
* reads from the current URL and updates reactively when the URL changes.
|
|
31
|
+
*/
|
|
32
|
+
preserveSearchParams?: true | string[];
|
|
18
33
|
/**
|
|
19
34
|
* Called before client-side navigation commits. Call `e.preventDefault()`
|
|
20
35
|
* to cancel the default navigation — the caller is then responsible for
|
|
@@ -27,45 +42,78 @@ interface LinkBaseProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'h
|
|
|
27
42
|
children?: ReactNode;
|
|
28
43
|
}
|
|
29
44
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
|
|
45
|
+
* Widen server-side string params to string | number for Link convenience.
|
|
46
|
+
* Exported for use by codegen-generated overloads.
|
|
47
|
+
*/
|
|
48
|
+
export type LinkSegmentParams<T> = {
|
|
49
|
+
[K in keyof T]: [string] extends [T[K]] ? string | number : T[K];
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Href types accepted by the catch-all (non-route) call signature.
|
|
53
|
+
*
|
|
54
|
+
* - External protocols: https://, http://, mailto:, tel:, ftp://
|
|
55
|
+
* - Hash-only and query-only links: #section, ?param=value
|
|
56
|
+
* - Computed `string` variables (non-literal)
|
|
57
|
+
*
|
|
58
|
+
* Internal path literals like "/typo-route" do NOT match — they must
|
|
59
|
+
* be a known route (from codegen) or stored in a `string` variable.
|
|
60
|
+
* This catches wrong hrefs at the type level. See TIM-624.
|
|
61
|
+
*/
|
|
62
|
+
type ExternalHref = `http://${string}` | `https://${string}` | `mailto:${string}` | `tel:${string}` | `ftp://${string}` | `//${string}` | `#${string}` | `?${string}`;
|
|
63
|
+
/**
|
|
64
|
+
* Callable interface for the Link component.
|
|
65
|
+
*
|
|
66
|
+
* Two kinds of call signatures:
|
|
67
|
+
* 1. Per-route (added by codegen via interface merging): DIRECT types
|
|
68
|
+
* for segmentParams — preserves TypeScript excess property checking.
|
|
69
|
+
* 2. Catch-all (below): accepts external hrefs and computed `string`
|
|
70
|
+
* variables. Does NOT accept internal path literals — those must
|
|
71
|
+
* match a known route from the codegen.
|
|
72
|
+
*
|
|
73
|
+
* See TIM-624.
|
|
33
74
|
*/
|
|
34
|
-
export interface
|
|
75
|
+
export interface LinkFunction {
|
|
76
|
+
(props: LinkBaseProps & {
|
|
77
|
+
href: ExternalHref;
|
|
78
|
+
segmentParams?: never;
|
|
79
|
+
searchParams?: {
|
|
80
|
+
definition: SearchParamsDefinition<Record<string, unknown>>;
|
|
81
|
+
values: Record<string, unknown>;
|
|
82
|
+
};
|
|
83
|
+
}): JSX.Element;
|
|
84
|
+
<H extends string>(props: string extends H ? LinkBaseProps & {
|
|
85
|
+
href: H;
|
|
86
|
+
segmentParams?: Record<string, string | number | string[]>;
|
|
87
|
+
searchParams?: {
|
|
88
|
+
definition: SearchParamsDefinition<Record<string, unknown>>;
|
|
89
|
+
values: Record<string, unknown>;
|
|
90
|
+
};
|
|
91
|
+
} : never): JSX.Element;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Runtime-only loose props used internally by the Link implementation.
|
|
95
|
+
* Not exposed to callers — the public API uses LinkFunction.
|
|
96
|
+
*/
|
|
97
|
+
interface LinkRuntimeProps extends LinkBaseProps {
|
|
35
98
|
href: string;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Typed search params — serialized via the route's SearchParamsDefinition.
|
|
39
|
-
* Mutually exclusive with an inline query string in href.
|
|
40
|
-
*/
|
|
99
|
+
segmentParams?: Record<string, string | number | string[]>;
|
|
41
100
|
searchParams?: {
|
|
42
101
|
definition: SearchParamsDefinition<Record<string, unknown>>;
|
|
43
102
|
values: Record<string, unknown>;
|
|
44
103
|
};
|
|
45
104
|
}
|
|
46
|
-
|
|
47
|
-
* Link with a route pattern + params for interpolation.
|
|
48
|
-
* e.g. <Link href="/products/[id]" params={{ id: "123" }}>
|
|
49
|
-
* <Link href="/products/[id]" params={{ id: 123 }}>
|
|
50
|
-
*/
|
|
51
|
-
export interface LinkPropsWithParams extends LinkBaseProps {
|
|
52
|
-
/** Route pattern with dynamic segments (e.g. "/products/[id]") */
|
|
105
|
+
export type LinkPropsWithHref = LinkBaseProps & {
|
|
53
106
|
href: string;
|
|
54
|
-
|
|
55
|
-
* Dynamic segment values to interpolate into the href.
|
|
56
|
-
* Single dynamic segments accept string | number (numbers are stringified).
|
|
57
|
-
* Catch-all segments accept string[].
|
|
58
|
-
*/
|
|
59
|
-
params: Record<string, string | number | string[]>;
|
|
60
|
-
/**
|
|
61
|
-
* Typed search params — serialized via the route's SearchParamsDefinition.
|
|
62
|
-
*/
|
|
107
|
+
segmentParams?: never;
|
|
63
108
|
searchParams?: {
|
|
64
109
|
definition: SearchParamsDefinition<Record<string, unknown>>;
|
|
65
110
|
values: Record<string, unknown>;
|
|
66
111
|
};
|
|
67
|
-
}
|
|
68
|
-
export type
|
|
112
|
+
};
|
|
113
|
+
export type LinkPropsWithParams = LinkRuntimeProps & {
|
|
114
|
+
segmentParams: Record<string, string | number | string[]>;
|
|
115
|
+
};
|
|
116
|
+
export type LinkProps = LinkRuntimeProps;
|
|
69
117
|
export declare function validateLinkHref(href: string): void;
|
|
70
118
|
/** Returns true if the href is an internal path (not an external URL) */
|
|
71
119
|
export declare function isInternalHref(href: string): boolean;
|
|
@@ -78,6 +126,11 @@ export declare function isInternalHref(href: string): boolean;
|
|
|
78
126
|
* - [...param] → catch-all (joined with /)
|
|
79
127
|
* - [[...param]] → optional catch-all (omitted if undefined/empty)
|
|
80
128
|
*/
|
|
129
|
+
/**
|
|
130
|
+
* Parse a route pattern's path portion into classified segments.
|
|
131
|
+
* Exported for testing. Uses the shared character-based classifier.
|
|
132
|
+
*/
|
|
133
|
+
export declare function parseSegments(pattern: string): UrlSegment[];
|
|
81
134
|
export declare function interpolateParams(pattern: string, params: Record<string, string | number | string[]>): string;
|
|
82
135
|
/**
|
|
83
136
|
* Resolve the final href string from Link props.
|
|
@@ -113,10 +166,15 @@ export declare function buildLinkProps(props: Pick<LinkPropsWithHref, 'href'> &
|
|
|
113
166
|
* navigation via the router. No global event delegation — each Link owns
|
|
114
167
|
* its own click handling.
|
|
115
168
|
*
|
|
116
|
-
* Supports typed routes via
|
|
117
|
-
*
|
|
169
|
+
* Supports typed routes via the Routes interface (populated by codegen).
|
|
170
|
+
* At runtime:
|
|
171
|
+
* - `segmentParams` prop interpolates dynamic segments in the href pattern
|
|
118
172
|
* - `searchParams` prop serializes query parameters via a SearchParamsDefinition
|
|
173
|
+
*
|
|
174
|
+
* Typed via the LinkFunction callable interface. The base call signature
|
|
175
|
+
* forbids segmentParams; per-route signatures are added by codegen via
|
|
176
|
+
* interface merging. See TIM-624.
|
|
119
177
|
*/
|
|
120
|
-
export declare
|
|
178
|
+
export declare const Link: LinkFunction;
|
|
121
179
|
export {};
|
|
122
180
|
//# sourceMappingURL=link.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/client/link.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/client/link.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navigation Link Store — passes per-link metadata from Link's onClick
|
|
3
|
+
* to the Navigation API's navigate event handler.
|
|
4
|
+
*
|
|
5
|
+
* When the Navigation API is active, Link does NOT call event.preventDefault()
|
|
6
|
+
* or router.navigate(). Instead it stores metadata (scroll option, link
|
|
7
|
+
* pending instance) here, and lets the <a> click propagate naturally.
|
|
8
|
+
* The navigate event handler reads this metadata to configure the RSC
|
|
9
|
+
* navigation with the correct options.
|
|
10
|
+
*
|
|
11
|
+
* This store is consumed once per navigation — after reading, the metadata
|
|
12
|
+
* is cleared. If no metadata is present (e.g., a plain <a> tag without
|
|
13
|
+
* our Link component), the navigate handler uses default options.
|
|
14
|
+
*
|
|
15
|
+
* See design/19-client-navigation.md §"Navigation API Integration"
|
|
16
|
+
*/
|
|
17
|
+
import type { LinkPendingInstance } from './link-pending-store.js';
|
|
18
|
+
export interface NavLinkMetadata {
|
|
19
|
+
/** Whether to scroll to top after navigation. Default: true. */
|
|
20
|
+
scroll: boolean;
|
|
21
|
+
/** The Link's pending state instance for per-link status tracking. */
|
|
22
|
+
linkInstance: LinkPendingInstance | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Store metadata from Link's onClick for the next navigate event.
|
|
26
|
+
* Called synchronously in the click handler — the navigate event
|
|
27
|
+
* fires synchronously after onClick returns.
|
|
28
|
+
*/
|
|
29
|
+
export declare function setNavLinkMetadata(metadata: NavLinkMetadata): void;
|
|
30
|
+
/**
|
|
31
|
+
* Consume the stored metadata. Returns null if no Link onClick
|
|
32
|
+
* preceded this navigation (e.g., plain <a> tag, programmatic nav).
|
|
33
|
+
* Clears the store after reading.
|
|
34
|
+
*/
|
|
35
|
+
export declare function consumeNavLinkMetadata(): NavLinkMetadata | null;
|
|
36
|
+
//# sourceMappingURL=nav-link-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-link-store.d.ts","sourceRoot":"","sources":["../../src/client/nav-link-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,MAAM,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC1C;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAElE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,eAAe,GAAG,IAAI,CAI/D"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ambient type declarations for the Navigation API.
|
|
3
|
+
*
|
|
4
|
+
* The Navigation API is not yet in TypeScript's standard lib. These types
|
|
5
|
+
* are used internally via type assertions — we never import Navigation API
|
|
6
|
+
* types unconditionally. Progressive enhancement only: the API is feature-
|
|
7
|
+
* detected at runtime.
|
|
8
|
+
*
|
|
9
|
+
* See https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API
|
|
10
|
+
*/
|
|
11
|
+
export interface NavigationHistoryEntry {
|
|
12
|
+
readonly key: string;
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly url: string | null;
|
|
15
|
+
readonly index: number;
|
|
16
|
+
readonly sameDocument: boolean;
|
|
17
|
+
getState(): unknown;
|
|
18
|
+
addEventListener(type: string, listener: EventListener): void;
|
|
19
|
+
removeEventListener(type: string, listener: EventListener): void;
|
|
20
|
+
}
|
|
21
|
+
export interface NavigationDestination {
|
|
22
|
+
readonly url: string;
|
|
23
|
+
readonly key: string | null;
|
|
24
|
+
readonly id: string | null;
|
|
25
|
+
readonly index: number;
|
|
26
|
+
readonly sameDocument: boolean;
|
|
27
|
+
getState(): unknown;
|
|
28
|
+
}
|
|
29
|
+
export interface NavigateEvent extends Event {
|
|
30
|
+
readonly navigationType: 'push' | 'replace' | 'reload' | 'traverse';
|
|
31
|
+
readonly destination: NavigationDestination;
|
|
32
|
+
readonly canIntercept: boolean;
|
|
33
|
+
readonly userInitiated: boolean;
|
|
34
|
+
readonly hashChange: boolean;
|
|
35
|
+
readonly signal: AbortSignal;
|
|
36
|
+
readonly formData: FormData | null;
|
|
37
|
+
readonly downloadRequest: string | null;
|
|
38
|
+
readonly info: unknown;
|
|
39
|
+
intercept(options?: NavigateInterceptOptions): void;
|
|
40
|
+
scroll(): void;
|
|
41
|
+
}
|
|
42
|
+
export interface NavigateInterceptOptions {
|
|
43
|
+
handler?: () => Promise<void>;
|
|
44
|
+
focusReset?: 'after-transition' | 'manual';
|
|
45
|
+
scroll?: 'after-transition' | 'manual';
|
|
46
|
+
}
|
|
47
|
+
export interface NavigationTransition {
|
|
48
|
+
readonly navigationType: 'push' | 'replace' | 'reload' | 'traverse';
|
|
49
|
+
readonly from: NavigationHistoryEntry;
|
|
50
|
+
readonly finished: Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
export interface NavigationResult {
|
|
53
|
+
committed: Promise<NavigationHistoryEntry>;
|
|
54
|
+
finished: Promise<NavigationHistoryEntry>;
|
|
55
|
+
}
|
|
56
|
+
export interface NavigationApi {
|
|
57
|
+
readonly currentEntry: NavigationHistoryEntry | null;
|
|
58
|
+
readonly transition: NavigationTransition | null;
|
|
59
|
+
readonly canGoBack: boolean;
|
|
60
|
+
readonly canGoForward: boolean;
|
|
61
|
+
entries(): NavigationHistoryEntry[];
|
|
62
|
+
navigate(url: string, options?: NavigationNavigateOptions): NavigationResult;
|
|
63
|
+
reload(options?: NavigationReloadOptions): NavigationResult;
|
|
64
|
+
traverseTo(key: string, options?: NavigationOptions): NavigationResult;
|
|
65
|
+
back(options?: NavigationOptions): NavigationResult;
|
|
66
|
+
forward(options?: NavigationOptions): NavigationResult;
|
|
67
|
+
updateCurrentEntry(options: NavigationUpdateCurrentEntryOptions): void;
|
|
68
|
+
addEventListener(type: 'navigate', listener: (event: NavigateEvent) => void): void;
|
|
69
|
+
addEventListener(type: 'navigatesuccess', listener: (event: Event) => void): void;
|
|
70
|
+
addEventListener(type: 'navigateerror', listener: (event: Event) => void): void;
|
|
71
|
+
addEventListener(type: 'currententrychange', listener: (event: Event) => void): void;
|
|
72
|
+
addEventListener(type: string, listener: EventListener): void;
|
|
73
|
+
removeEventListener(type: string, listener: EventListener): void;
|
|
74
|
+
}
|
|
75
|
+
export interface NavigationNavigateOptions {
|
|
76
|
+
state?: unknown;
|
|
77
|
+
history?: 'auto' | 'push' | 'replace';
|
|
78
|
+
info?: unknown;
|
|
79
|
+
}
|
|
80
|
+
export interface NavigationReloadOptions {
|
|
81
|
+
state?: unknown;
|
|
82
|
+
info?: unknown;
|
|
83
|
+
}
|
|
84
|
+
export interface NavigationOptions {
|
|
85
|
+
info?: unknown;
|
|
86
|
+
}
|
|
87
|
+
export interface NavigationUpdateCurrentEntryOptions {
|
|
88
|
+
state: unknown;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=navigation-api-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation-api-types.d.ts","sourceRoot":"","sources":["../../src/client/navigation-api-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navigation API integration — progressive enhancement for client navigation.
|
|
3
|
+
*
|
|
4
|
+
* When the Navigation API (`window.navigation`) is available, this module
|
|
5
|
+
* provides an intercept-based navigation model that replaces the separate
|
|
6
|
+
* popstate + click handler approach with a single navigate event listener.
|
|
7
|
+
*
|
|
8
|
+
* Key benefits:
|
|
9
|
+
* - Intercepts ALL navigations (link clicks, form submissions, back/forward)
|
|
10
|
+
* - Built-in AbortSignal per navigation (auto-aborts in-flight fetches)
|
|
11
|
+
* - Per-entry state via NavigationHistoryEntry.getState()
|
|
12
|
+
* - navigation.transition for progress tracking
|
|
13
|
+
*
|
|
14
|
+
* When unavailable, all functions are no-ops and the History API fallback
|
|
15
|
+
* in browser-entry.ts handles navigation.
|
|
16
|
+
*
|
|
17
|
+
* See design/19-client-navigation.md
|
|
18
|
+
*/
|
|
19
|
+
import type { NavigationApi } from './navigation-api-types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Returns true if the Navigation API is available in the current environment.
|
|
22
|
+
* Feature-detected at runtime — no polyfill.
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasNavigationApi(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get the Navigation API instance. Returns null if unavailable.
|
|
27
|
+
* Uses type assertion — we never import Navigation API types unconditionally.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getNavigationApi(): NavigationApi | null;
|
|
30
|
+
/**
|
|
31
|
+
* Callbacks for the Navigation API event handler.
|
|
32
|
+
*
|
|
33
|
+
* When the Navigation API intercepts a navigation, it delegates to these
|
|
34
|
+
* callbacks which run the RSC fetch + render pipeline.
|
|
35
|
+
*/
|
|
36
|
+
export interface NavigationApiCallbacks {
|
|
37
|
+
/**
|
|
38
|
+
* Handle a push/replace navigation intercepted by the Navigation API.
|
|
39
|
+
* This covers both Link <a> clicks (user-initiated, with metadata from
|
|
40
|
+
* nav-link-store) and external navigations (plain <a> tags, programmatic).
|
|
41
|
+
* The Navigation API handles the URL update via event.intercept().
|
|
42
|
+
*/
|
|
43
|
+
onExternalNavigate: (url: string, options: {
|
|
44
|
+
replace: boolean;
|
|
45
|
+
signal: AbortSignal;
|
|
46
|
+
scroll?: boolean;
|
|
47
|
+
}) => Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Handle a traversal (back/forward button). The Navigation API intercepts
|
|
50
|
+
* the traversal and delegates to us for RSC replay/fetch.
|
|
51
|
+
*/
|
|
52
|
+
onTraverse: (url: string, scrollY: number, signal: AbortSignal) => Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Controller returned by setupNavigationApi. Provides methods to
|
|
56
|
+
* coordinate between the router and the navigate event listener.
|
|
57
|
+
*/
|
|
58
|
+
export interface NavigationApiController {
|
|
59
|
+
/**
|
|
60
|
+
* Set the router-navigating flag. When `true`, the next navigate event
|
|
61
|
+
* (from pushState/replaceState) is recognized as router-initiated. The
|
|
62
|
+
* handler still intercepts it — but ties the browser's native loading
|
|
63
|
+
* state to a deferred promise instead of running the RSC pipeline again.
|
|
64
|
+
*
|
|
65
|
+
* This means `navigation.transition` is active for the full duration of
|
|
66
|
+
* every router-initiated navigation, giving the browser a native loading
|
|
67
|
+
* indicator (tab spinner, address bar) aligned with the TopLoader.
|
|
68
|
+
*
|
|
69
|
+
* Must be called synchronously around pushState/replaceState:
|
|
70
|
+
* controller.setRouterNavigating(true);
|
|
71
|
+
* history.pushState(...); // navigate event fires, intercepted
|
|
72
|
+
* controller.setRouterNavigating(false); // flag off, deferred stays open
|
|
73
|
+
*/
|
|
74
|
+
setRouterNavigating: (value: boolean) => void;
|
|
75
|
+
/**
|
|
76
|
+
* Resolve the deferred promise created by setRouterNavigating(true),
|
|
77
|
+
* clearing the browser's native loading state. Call this when the
|
|
78
|
+
* navigation fully completes — aligned with when the TopLoader's
|
|
79
|
+
* pendingUrl clears (same finally block in router.navigate).
|
|
80
|
+
*/
|
|
81
|
+
completeRouterNavigation: () => void;
|
|
82
|
+
/**
|
|
83
|
+
* Initiate a navigation via the Navigation API (`navigation.navigate()`).
|
|
84
|
+
* Unlike `history.pushState()`, this fires the navigate event BEFORE
|
|
85
|
+
* committing the URL — allowing Chrome to show its native loading
|
|
86
|
+
* indicator while the intercept handler runs.
|
|
87
|
+
*
|
|
88
|
+
* Must be called with setRouterNavigating(true) active so the handler
|
|
89
|
+
* recognizes it as router-initiated and uses the deferred promise.
|
|
90
|
+
*/
|
|
91
|
+
navigate: (url: string, replace: boolean) => void;
|
|
92
|
+
/**
|
|
93
|
+
* Save scroll position into the current navigation entry's state.
|
|
94
|
+
* Uses navigation.updateCurrentEntry() for per-entry scroll storage.
|
|
95
|
+
*/
|
|
96
|
+
saveScrollPosition: (scrollY: number) => void;
|
|
97
|
+
/**
|
|
98
|
+
* Check if the Navigation API has an active transition.
|
|
99
|
+
* Returns the transition object if available, null otherwise.
|
|
100
|
+
*/
|
|
101
|
+
hasActiveTransition: () => boolean;
|
|
102
|
+
/** Remove the navigate event listener. */
|
|
103
|
+
cleanup: () => void;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Set up the Navigation API navigate event listener.
|
|
107
|
+
*
|
|
108
|
+
* Intercepts same-origin navigations and delegates to the provided callbacks.
|
|
109
|
+
* Router-initiated navigations (pushState from router.navigate) are detected
|
|
110
|
+
* via a synchronous flag and NOT intercepted — the router already handles them.
|
|
111
|
+
*
|
|
112
|
+
* Returns a controller for coordinating with the router.
|
|
113
|
+
*/
|
|
114
|
+
export declare function setupNavigationApi(callbacks: NavigationApiCallbacks): NavigationApiController;
|
|
115
|
+
//# sourceMappingURL=navigation-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation-api.d.ts","sourceRoot":"","sources":["../../src/client/navigation-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,2BAA2B,CAAC;AAM9E;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAM1C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAGvD;AAID;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,kBAAkB,EAAE,CAClB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KACjE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;;OAGG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClF;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAE9C;;;;;OAKG;IACH,wBAAwB,EAAE,MAAM,IAAI,CAAC;IAErC;;;;;;;;OAQG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAElD;;;OAGG;IACH,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9C;;;OAGG;IACH,mBAAmB,EAAE,MAAM,OAAO,CAAC;IAEnC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,sBAAsB,GAAG,uBAAuB,CAgM7F"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Holds the current route params and pathname, updated atomically
|
|
5
5
|
* with the RSC tree on each navigation. This replaces the previous
|
|
6
|
-
* useSyncExternalStore approach for
|
|
6
|
+
* useSyncExternalStore approach for useSegmentParams() and usePathname(),
|
|
7
7
|
* which suffered from a timing gap: the new tree could commit before
|
|
8
8
|
* the external store re-renders fired, causing a frame where both
|
|
9
9
|
* old and new active states were visible simultaneously.
|
|
@@ -44,7 +44,7 @@ export interface NavigationState {
|
|
|
44
44
|
/**
|
|
45
45
|
* Read the navigation context. Returns null during SSR (no provider)
|
|
46
46
|
* or in the RSC environment (no context available).
|
|
47
|
-
* Internal — used by
|
|
47
|
+
* Internal — used by useSegmentParams() and usePathname().
|
|
48
48
|
*/
|
|
49
49
|
export declare function useNavigationContext(): NavigationState | null;
|
|
50
50
|
export interface NavigationProviderProps {
|
|
@@ -73,4 +73,15 @@ export declare function PendingNavigationProvider({ value, children, }: {
|
|
|
73
73
|
value: string | null;
|
|
74
74
|
children?: ReactNode;
|
|
75
75
|
}): React.ReactElement;
|
|
76
|
+
/**
|
|
77
|
+
* Check if the browser's Navigation API has an active transition.
|
|
78
|
+
*
|
|
79
|
+
* When the Navigation API is available and a navigation has been intercepted
|
|
80
|
+
* via event.intercept(), `navigation.transition` is non-null until the
|
|
81
|
+
* handler resolves. This provides browser-native progress tracking that
|
|
82
|
+
* can be used alongside the existing pendingUrl mechanism.
|
|
83
|
+
*
|
|
84
|
+
* Returns false when Navigation API is unavailable or no transition is active.
|
|
85
|
+
*/
|
|
86
|
+
export declare function hasNativeNavigationTransition(): boolean;
|
|
76
87
|
//# sourceMappingURL=navigation-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-context.d.ts","sourceRoot":"","sources":["../../src/client/navigation-context.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAM7D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuCD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,eAAe,GAAG,IAAI,CAM7D;AAMD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,GACT,EAAE,uBAAuB,GAAG,KAAK,CAAC,YAAY,CAO9C;AA6BD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE/D;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD;
|
|
1
|
+
{"version":3,"file":"navigation-context.d.ts","sourceRoot":"","sources":["../../src/client/navigation-context.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAM7D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuCD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,eAAe,GAAG,IAAI,CAM7D;AAMD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,GACT,EAAE,uBAAuB,GAAG,KAAK,CAAC,YAAY,CAO9C;AA6BD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE/D;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD;AA8BD;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,IAAI,CAKvD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,KAAK,CAAC,YAAY,CAMrB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAIvD"}
|