@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
|
@@ -65,17 +65,24 @@ type ParsedDigest = DenyDigest | RenderErrorDigest | RedirectDigest;
|
|
|
65
65
|
|
|
66
66
|
export interface TimberErrorBoundaryProps {
|
|
67
67
|
/** The component to render when an error is caught. */
|
|
68
|
-
fallbackComponent
|
|
68
|
+
fallbackComponent?: (...args: unknown[]) => ReactNode;
|
|
69
|
+
/**
|
|
70
|
+
* Pre-rendered fallback element. Used for MDX status files which are server
|
|
71
|
+
* components and cannot be passed as function props across the RSC→client
|
|
72
|
+
* boundary. When set, rendered directly instead of calling fallbackComponent.
|
|
73
|
+
*
|
|
74
|
+
* See design/10-error-handling.md §"Status-Code File Variants" — MDX status
|
|
75
|
+
* files are server components by default (zero client JS).
|
|
76
|
+
*/
|
|
77
|
+
fallbackElement?: ReactNode;
|
|
69
78
|
/**
|
|
70
79
|
* Status code filter. If set, only catches errors matching this status.
|
|
71
80
|
* 400 = any 4xx, 500 = any 5xx, specific number = exact match.
|
|
72
81
|
*/
|
|
73
82
|
status?: number;
|
|
74
83
|
/**
|
|
75
|
-
* When true,
|
|
76
|
-
*
|
|
77
|
-
* boundaries should set this — segment boundaries (403.tsx, 4xx.tsx,
|
|
78
|
-
* error.tsx) must NOT, otherwise normal page denies get swallowed.
|
|
84
|
+
* When true, this boundary wraps a parallel slot. Slot denials are
|
|
85
|
+
* graceful degradation — they must NOT change the HTTP status code.
|
|
79
86
|
*/
|
|
80
87
|
isSlotBoundary?: boolean;
|
|
81
88
|
children: ReactNode;
|
|
@@ -148,20 +155,45 @@ export class TimberErrorBoundary extends Component<
|
|
|
148
155
|
}
|
|
149
156
|
}
|
|
150
157
|
|
|
151
|
-
// Report DenySignal handling
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
158
|
+
// Report DenySignal handling so the pipeline skips the redundant
|
|
159
|
+
// renderDenyPage() re-render — but ONLY when this boundary can fully
|
|
160
|
+
// handle the deny in-tree:
|
|
161
|
+
//
|
|
162
|
+
// ✅ TSX boundaries (fallbackComponent) — can receive runtime props
|
|
163
|
+
// (status, dangerouslyPassData) dynamically in render()
|
|
164
|
+
// ❌ MDX boundaries (fallbackElement) — pre-rendered at tree-build time,
|
|
165
|
+
// cannot receive runtime deny props. Must fall through to re-render.
|
|
166
|
+
//
|
|
167
|
+
// For qualifying segment boundaries: also set the HTTP status code from
|
|
168
|
+
// the DenySignal so the Response has the correct 4xx status. This runs
|
|
169
|
+
// synchronously during Fizz rendering, BEFORE onShellReady.
|
|
170
|
+
//
|
|
171
|
+
// For slot boundaries: set _denyHandledByBoundary but do NOT change
|
|
172
|
+
// statusCode — slot denials are graceful degradation.
|
|
173
|
+
//
|
|
174
|
+
// See TIM-664, LOCAL-298.
|
|
175
|
+
if (parsed?.type === 'deny') {
|
|
176
|
+
const canHandleInTree = this.props.fallbackElement == null;
|
|
177
|
+
|
|
178
|
+
if (canHandleInTree || this.props.isSlotBoundary) {
|
|
179
|
+
const ssrData = getSsrData();
|
|
180
|
+
if (ssrData?._navContext) {
|
|
181
|
+
ssrData._navContext._denyHandledByBoundary = true;
|
|
182
|
+
if (!this.props.isSlotBoundary) {
|
|
183
|
+
ssrData._navContext.statusCode = parsed.status;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
162
186
|
}
|
|
163
187
|
}
|
|
164
188
|
|
|
189
|
+
// Pre-rendered fallback element (MDX status files) — render directly.
|
|
190
|
+
// MDX components are server components that cannot be passed as function
|
|
191
|
+
// props across the RSC→client boundary. Instead, they are pre-rendered
|
|
192
|
+
// as elements in the RSC environment and passed here as fallbackElement.
|
|
193
|
+
if (this.props.fallbackElement != null) {
|
|
194
|
+
return this.props.fallbackElement;
|
|
195
|
+
}
|
|
196
|
+
|
|
165
197
|
// Render the fallback component with the right props shape.
|
|
166
198
|
if (parsed?.type === 'deny') {
|
|
167
199
|
return createElement(this.props.fallbackComponent as never, {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Reconstitutes a SerializableError into a real Error instance before
|
|
5
|
+
* passing to the user's error component.
|
|
6
|
+
*
|
|
7
|
+
* TSX error pages are 'use client' components that receive { error: Error, digest, reset }.
|
|
8
|
+
* Error objects are not RSC-serializable (React Flight throws "Only plain objects
|
|
9
|
+
* can be passed to Client Components"). This wrapper receives the error as a plain
|
|
10
|
+
* SerializableError object, reconstitutes a real Error instance, and passes it
|
|
11
|
+
* to the user's error component — ensuring error instanceof Error works correctly.
|
|
12
|
+
*
|
|
13
|
+
* See design/spike-TIM-565-unify-error-pages.md §"Edge Case B"
|
|
14
|
+
* See design/10-error-handling.md §"RSC → SSR for Error Pages via SerializableError"
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { createElement, type ReactNode, type ComponentType } from 'react';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Plain-object representation of an Error that can cross the RSC → client boundary.
|
|
21
|
+
* Stack is only included in dev mode (gated by isDevMode() on the server).
|
|
22
|
+
*/
|
|
23
|
+
export interface SerializableError {
|
|
24
|
+
message: string;
|
|
25
|
+
name: string;
|
|
26
|
+
stack?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Props for the ErrorReconstituter wrapper component.
|
|
31
|
+
* All props are RSC-serializable:
|
|
32
|
+
* - error: plain object (SerializableError)
|
|
33
|
+
* - digest: plain JSON or null
|
|
34
|
+
* - reset: undefined (only meaningful on client after boundary catch)
|
|
35
|
+
* - component: client module reference (RSC Flight serializes as opaque ref)
|
|
36
|
+
*/
|
|
37
|
+
interface ErrorReconstituterProps {
|
|
38
|
+
error: SerializableError;
|
|
39
|
+
digest: { code: string; data: unknown } | null;
|
|
40
|
+
reset: undefined;
|
|
41
|
+
component: ComponentType<{
|
|
42
|
+
error: Error;
|
|
43
|
+
digest: { code: string; data: unknown } | null;
|
|
44
|
+
reset: (() => void) | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Reconstitute a SerializableError into a real Error instance and render
|
|
50
|
+
* the user's error component with the proper props.
|
|
51
|
+
*/
|
|
52
|
+
export function ErrorReconstituter({
|
|
53
|
+
error: serialized,
|
|
54
|
+
digest,
|
|
55
|
+
reset,
|
|
56
|
+
component,
|
|
57
|
+
}: ErrorReconstituterProps): ReactNode {
|
|
58
|
+
// Reconstitute a real Error so instanceof checks work in user code
|
|
59
|
+
const error = Object.assign(new Error(serialized.message), {
|
|
60
|
+
name: serialized.name,
|
|
61
|
+
...(serialized.stack != null ? { stack: serialized.stack } : {}),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return createElement(component, { error, digest, reset });
|
|
65
|
+
}
|
package/src/client/form.tsx
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { useActionState as reactUseActionState, useTransition } from 'react';
|
|
15
|
-
import type { ActionResult, ValidationErrors } from '
|
|
16
|
-
import type { FormFlashData } from '
|
|
15
|
+
import type { ActionResult, ValidationErrors } from '../server/action-client';
|
|
16
|
+
import type { FormFlashData } from '../server/form-flash';
|
|
17
17
|
|
|
18
18
|
// ─── Types ───────────────────────────────────────────────────────────────
|
|
19
19
|
|
package/src/client/history.ts
CHANGED
|
@@ -23,20 +23,42 @@ export interface HistoryEntry {
|
|
|
23
23
|
* On forward navigation, the new page's payload is pushed onto the stack.
|
|
24
24
|
* On popstate, the cached payload is replayed instantly.
|
|
25
25
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* Supports two keying modes:
|
|
27
|
+
* - **URL-keyed** (default): entries keyed by pathname + search.
|
|
28
|
+
* Used with the History API fallback.
|
|
29
|
+
* - **Entry-key + URL**: when the Navigation API is available,
|
|
30
|
+
* entries can also be stored by Navigation entry key for
|
|
31
|
+
* disambiguation of duplicate URLs in the history stack.
|
|
32
|
+
* Falls back to URL lookup when entry key is not found.
|
|
33
|
+
*
|
|
34
|
+
* Scroll positions are stored in history.state or Navigation API entry
|
|
35
|
+
* state, not in this stack — see design/19-client-navigation.md §Scroll Restoration.
|
|
28
36
|
*
|
|
29
37
|
* Entries persist for the session duration (no expiry) and are cleared
|
|
30
38
|
* when the tab is closed — matching browser back-button behavior.
|
|
31
39
|
*/
|
|
32
40
|
export class HistoryStack {
|
|
33
41
|
private entries = new Map<string, HistoryEntry>();
|
|
42
|
+
/** Entries keyed by Navigation API entry key for duplicate URL disambiguation. */
|
|
43
|
+
private entryKeyMap = new Map<string, HistoryEntry>();
|
|
34
44
|
|
|
35
|
-
push(url: string, entry: HistoryEntry): void {
|
|
45
|
+
push(url: string, entry: HistoryEntry, entryKey?: string): void {
|
|
36
46
|
this.entries.set(url, entry);
|
|
47
|
+
if (entryKey) {
|
|
48
|
+
this.entryKeyMap.set(entryKey, entry);
|
|
49
|
+
}
|
|
37
50
|
}
|
|
38
51
|
|
|
39
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Get an entry. When an entry key is provided (Navigation API),
|
|
54
|
+
* tries the entry-key map first for accurate disambiguation of
|
|
55
|
+
* duplicate URLs, then falls back to URL lookup.
|
|
56
|
+
*/
|
|
57
|
+
get(url: string, entryKey?: string): HistoryEntry | undefined {
|
|
58
|
+
if (entryKey) {
|
|
59
|
+
const byKey = this.entryKeyMap.get(entryKey);
|
|
60
|
+
if (byKey) return byKey;
|
|
61
|
+
}
|
|
40
62
|
return this.entries.get(url);
|
|
41
63
|
}
|
|
42
64
|
|
package/src/client/index.ts
CHANGED
|
@@ -5,20 +5,22 @@ export type { JsonSerializable, RenderErrorDigest } from './types';
|
|
|
5
5
|
|
|
6
6
|
// Navigation
|
|
7
7
|
export { Link, interpolateParams, resolveHref, validateLinkHref, buildLinkProps } from './link';
|
|
8
|
-
export
|
|
9
|
-
export type {
|
|
8
|
+
export { mergePreservedSearchParams } from '../shared/merge-search-params.js';
|
|
9
|
+
export type { LinkFunction, LinkProps, LinkPropsWithHref, LinkPropsWithParams } from './link';
|
|
10
|
+
export type { LinkSegmentParams, OnNavigateHandler, OnNavigateEvent } from './link';
|
|
10
11
|
export { createRouter } from './router';
|
|
11
12
|
export type {
|
|
12
13
|
RouterInstance,
|
|
13
14
|
NavigationOptions,
|
|
14
15
|
RouterDeps,
|
|
16
|
+
RouterPhase,
|
|
15
17
|
RscDecoder,
|
|
16
18
|
RootRenderer,
|
|
17
19
|
} from './router';
|
|
18
20
|
export { useNavigationPending } from './use-navigation-pending';
|
|
19
21
|
export { useLinkStatus, LinkStatusContext } from './use-link-status';
|
|
20
22
|
export type { LinkStatus } from './use-link-status';
|
|
21
|
-
export { getRouter, setGlobalRouter } from './router-ref';
|
|
23
|
+
export { getRouter, getRouterOrNull, setGlobalRouter } from './router-ref';
|
|
22
24
|
export { useRouter } from './use-router';
|
|
23
25
|
export type { AppRouterInstance } from './use-router';
|
|
24
26
|
export { usePathname } from './use-pathname';
|
|
@@ -42,7 +44,7 @@ export { useActionState, useFormAction, useFormErrors } from './form';
|
|
|
42
44
|
export type { UseActionStateFn, UseActionStateReturn, FormErrorsResult } from './form';
|
|
43
45
|
|
|
44
46
|
// Params
|
|
45
|
-
export {
|
|
47
|
+
export { useSegmentParams, setCurrentParams } from './use-params';
|
|
46
48
|
|
|
47
49
|
// Navigation context (framework-internal, used by browser-entry for atomic updates)
|
|
48
50
|
export { NavigationProvider, getNavigationState, setNavigationState } from './navigation-context';
|
|
@@ -55,6 +57,13 @@ export { useQueryStates, bindUseQueryStates } from './use-query-states';
|
|
|
55
57
|
export { useCookie } from './use-cookie';
|
|
56
58
|
export type { ClientCookieOptions, CookieSetter } from './use-cookie';
|
|
57
59
|
|
|
60
|
+
// Register the client cookie module with defineCookie's lazy reference.
|
|
61
|
+
// This runs at module load time in the client/SSR environment, wiring up
|
|
62
|
+
// the useCookie hook without a top-level import in define-cookie.ts.
|
|
63
|
+
import * as _useCookieMod from './use-cookie.js';
|
|
64
|
+
import { _registerUseCookieModule } from '../cookies/define-cookie.js';
|
|
65
|
+
_registerUseCookieModule(_useCookieMod);
|
|
66
|
+
|
|
58
67
|
// SSR data (framework-internal, used by ssr-entry to provide request data to hooks)
|
|
59
68
|
export { setSsrData, clearSsrData, getSsrData } from './ssr-data';
|
|
60
69
|
export type { SsrData } from './ssr-data';
|
|
@@ -0,0 +1,136 @@
|
|
|
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
|
+
|
|
30
|
+
import type { LinkStatus } from './use-link-status.js';
|
|
31
|
+
|
|
32
|
+
// ─── Types ───────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
export interface LinkPendingInstance {
|
|
35
|
+
setLinkStatus: (status: LinkStatus) => void;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ─── Singleton Storage ───────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
const LINK_PENDING_KEY = Symbol.for('__timber_link_pending');
|
|
41
|
+
|
|
42
|
+
/** Status object indicating link is pending — shared reference */
|
|
43
|
+
export const PENDING_LINK_STATUS: LinkStatus = { pending: true };
|
|
44
|
+
|
|
45
|
+
/** Status object indicating link is idle — shared reference */
|
|
46
|
+
export const IDLE_LINK_STATUS: LinkStatus = { pending: false };
|
|
47
|
+
|
|
48
|
+
interface LinkPendingState {
|
|
49
|
+
/** The link instance that initiated the current navigation, or null */
|
|
50
|
+
current: LinkPendingInstance | null;
|
|
51
|
+
/** Monotonically increasing counter — guards against stale clears */
|
|
52
|
+
navId: number;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getStore(): LinkPendingState {
|
|
56
|
+
const g = globalThis as Record<symbol, unknown>;
|
|
57
|
+
if (!g[LINK_PENDING_KEY]) {
|
|
58
|
+
g[LINK_PENDING_KEY] = { current: null, navId: 0 };
|
|
59
|
+
}
|
|
60
|
+
return g[LINK_PENDING_KEY] as LinkPendingState;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ─── Public API ──────────────────────────────────────────────────
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Register the link instance that initiated the current navigation.
|
|
67
|
+
*
|
|
68
|
+
* Called from <Link>'s click handler before router.navigate().
|
|
69
|
+
* - Resets the previous pending link to IDLE (urgent update, immediate)
|
|
70
|
+
* - Does NOT set the new link to PENDING here — the Link's click handler
|
|
71
|
+
* calls setLinkStatus(PENDING) directly for the eager show
|
|
72
|
+
* - Increments the navId counter for stale-clear protection
|
|
73
|
+
*
|
|
74
|
+
* Pass `null` to clear (e.g., for programmatic navigations).
|
|
75
|
+
*/
|
|
76
|
+
export function setLinkForCurrentNavigation(link: LinkPendingInstance | null): void {
|
|
77
|
+
const store = getStore();
|
|
78
|
+
const prev = store.current;
|
|
79
|
+
|
|
80
|
+
// Reset previous pending link to idle (urgent update — shows immediately)
|
|
81
|
+
if (prev && prev !== link) {
|
|
82
|
+
prev.setLinkStatus(IDLE_LINK_STATUS);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
store.current = link;
|
|
86
|
+
store.navId++;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get the current navigation ID. Called at the start of the transition
|
|
91
|
+
* to capture the ID before async work begins.
|
|
92
|
+
*/
|
|
93
|
+
export function getCurrentNavId(): number {
|
|
94
|
+
return getStore().navId;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Reset the current link's pending state to IDLE, but only if the navId
|
|
99
|
+
* matches. Called inside NavigationRoot's startTransition after the async
|
|
100
|
+
* work completes — the setter call is a transition update, so it commits
|
|
101
|
+
* atomically with the new tree.
|
|
102
|
+
*
|
|
103
|
+
* The navId guard prevents stale transitions from clearing a newer
|
|
104
|
+
* navigation's pending state. Scenario:
|
|
105
|
+
* Click A → navId=1, T1 starts
|
|
106
|
+
* Click B → navId=2, A reset to IDLE, T2 starts
|
|
107
|
+
* T1 completes → resetLinkPending(1) → navId is 2, skip ✓
|
|
108
|
+
* T2 completes → resetLinkPending(2) → navId is 2, clear ✓
|
|
109
|
+
*/
|
|
110
|
+
export function resetLinkPending(forNavId: number): void {
|
|
111
|
+
const store = getStore();
|
|
112
|
+
if (store.navId === forNavId && store.current) {
|
|
113
|
+
store.current.setLinkStatus(IDLE_LINK_STATUS);
|
|
114
|
+
store.current = null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Clean up the link pending store entirely. Safety net for error paths.
|
|
120
|
+
*/
|
|
121
|
+
export function clearLinkPendingSetter(): void {
|
|
122
|
+
const store = getStore();
|
|
123
|
+
store.current = null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Unmount a link instance from navigation tracking. Called when a Link
|
|
128
|
+
* component unmounts while it is the current navigation link. Prevents
|
|
129
|
+
* calling setState on an unmounted component.
|
|
130
|
+
*/
|
|
131
|
+
export function unmountLinkForCurrentNavigation(link: LinkPendingInstance): void {
|
|
132
|
+
const store = getStore();
|
|
133
|
+
if (store.current === link) {
|
|
134
|
+
store.current = null;
|
|
135
|
+
}
|
|
136
|
+
}
|