@timber-js/app 0.2.0-alpha.191 → 0.2.0-alpha.194
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/agent-skill.md +2 -0
- package/dist/_chunks/{actions-BjbbNRFN.js → actions-CWYtq6ii.js} +3 -3
- package/dist/_chunks/actions-CWYtq6ii.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -1
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -1
- package/dist/_chunks/{build-output-helper-C3DrfzZR.js → build-output-helper-9dqCv1pZ.js} +3 -2
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/{cache-api-DllJ-Lyw.js → cache-api-CQeYzA5g.js} +6 -8
- package/dist/_chunks/cache-api-CQeYzA5g.js.map +1 -0
- package/dist/_chunks/chains-h7EO-u3n.js +412 -0
- package/dist/_chunks/chains-h7EO-u3n.js.map +1 -0
- package/dist/_chunks/{cli-check-DJZDc22E.js → cli-check-BVthpfLS.js} +43 -6
- package/dist/_chunks/cli-check-BVthpfLS.js.map +1 -0
- package/dist/_chunks/{cli-schema-sync-D4_AZVUb.js → cli-schema-sync-ZwM9u_ob.js} +6 -5
- package/dist/_chunks/{cli-schema-sync-D4_AZVUb.js.map → cli-schema-sync-ZwM9u_ob.js.map} +1 -1
- package/dist/_chunks/{cloudflare-CGP6BZKO.js → cloudflare-BKJC3SC_.js} +28 -22
- package/dist/_chunks/{cloudflare-CGP6BZKO.js.map → cloudflare-BKJC3SC_.js.map} +1 -1
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -1
- package/dist/_chunks/{convention-lint-CpteIpTm.js → convention-lint-DO10_pVl.js} +93 -7
- package/dist/_chunks/convention-lint-DO10_pVl.js.map +1 -0
- package/dist/_chunks/dist-DtrJyBbw.js +386 -0
- package/dist/_chunks/dist-DtrJyBbw.js.map +1 -0
- package/dist/_chunks/error-boundary-D-ODYX41.js.map +1 -1
- package/dist/_chunks/{file-cache-DmX7OqZP.js → file-cache-Dw6BJPG7.js} +5 -1
- package/dist/_chunks/{file-cache-DmX7OqZP.js.map → file-cache-Dw6BJPG7.js.map} +1 -1
- package/dist/_chunks/{format-CfwjgPz9.js → format-BKclgVbk.js} +3 -3
- package/dist/_chunks/{format-CfwjgPz9.js.map → format-BKclgVbk.js.map} +1 -1
- package/dist/_chunks/graph-cache-CP4GEmf9.js +304 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -1
- package/dist/_chunks/live-graph-Bx4HodF1.js +150 -0
- package/dist/_chunks/live-graph-Bx4HodF1.js.map +1 -0
- package/dist/_chunks/{logger-CH7IcMmg.js → logger-pumCm3Il.js} +25 -7
- package/dist/_chunks/{logger-CH7IcMmg.js.map → logger-pumCm3Il.js.map} +1 -1
- package/dist/_chunks/{mdx-file-C005ay-P.js → mdx-file-CXyHGUpS.js} +3 -3
- package/dist/_chunks/mdx-file-CXyHGUpS.js.map +1 -0
- package/dist/_chunks/{plugin-context-rCinWLiE.js → plugin-context-8idfR3UZ.js} +2 -2
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +1 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
- package/dist/_chunks/poison-scan-BAxfTT5L.js +101 -0
- package/dist/_chunks/poison-scan-BAxfTT5L.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -1
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -1
- package/dist/_chunks/{rsc-media-type-DRqE_lD_.js → rsc-media-type-DDc7duTD.js} +17 -2
- package/dist/_chunks/{rsc-media-type-DRqE_lD_.js.map → rsc-media-type-DDc7duTD.js.map} +1 -1
- package/dist/_chunks/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/{scanner-CAietmj4.js → scanner-BRIOmHE2.js} +43 -4
- package/dist/_chunks/scanner-BRIOmHE2.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -1
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -1
- package/dist/_chunks/{segment-keys-BawYuNFO.js → segment-keys-BhqoHiLc.js} +14 -2
- package/dist/_chunks/{segment-keys-BawYuNFO.js.map → segment-keys-BhqoHiLc.js.map} +1 -1
- package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -1
- package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -1
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -1
- package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +1 -1
- package/dist/_chunks/{walkers-BsVLmD1S.js → walkers-uCu3WW6_.js} +9 -6
- package/dist/_chunks/{walkers-BsVLmD1S.js.map → walkers-uCu3WW6_.js.map} +1 -1
- package/dist/adapters/build-output-helper.d.ts +1 -1
- package/dist/adapters/build-output-helper.d.ts.map +1 -1
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -1
- package/dist/adapters/cloudflare-dev.js +2 -1
- package/dist/adapters/cloudflare-dev.js.map +1 -1
- package/dist/adapters/cloudflare-kv-cache.d.ts +1 -1
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -1
- package/dist/adapters/cloudflare-kv-cache.js +7 -8
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -1
- package/dist/adapters/cloudflare.d.ts +1 -1
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +1 -1
- package/dist/adapters/nitro-presets.d.ts +37 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +32 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +28 -51
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +224 -171
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/analyze/chains.d.ts +124 -0
- package/dist/analyze/chains.d.ts.map +1 -0
- package/dist/analyze/classify.d.ts +150 -0
- package/dist/analyze/classify.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.d.ts +17 -0
- package/dist/analyze/crawl-entry.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.js +313 -0
- package/dist/analyze/crawl-entry.js.map +1 -0
- package/dist/analyze/crawl.d.ts +134 -0
- package/dist/analyze/crawl.d.ts.map +1 -0
- package/dist/analyze/graph-cache.d.ts +104 -0
- package/dist/analyze/graph-cache.d.ts.map +1 -0
- package/dist/analyze/graph-command.d.ts +43 -0
- package/dist/analyze/graph-command.d.ts.map +1 -0
- package/dist/analyze/graph-command.js +472 -0
- package/dist/analyze/graph-command.js.map +1 -0
- package/dist/analyze/live-graph.d.ts +81 -0
- package/dist/analyze/live-graph.d.ts.map +1 -0
- package/dist/analyze/poison-rules.d.ts +72 -0
- package/dist/analyze/poison-rules.d.ts.map +1 -0
- package/dist/analyze/poison-scan.d.ts +48 -0
- package/dist/analyze/poison-scan.d.ts.map +1 -0
- package/dist/analyze/scan.d.ts +73 -0
- package/dist/analyze/scan.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +2 -2
- package/dist/cache/cache-api.d.ts.map +1 -1
- package/dist/cache/index.d.ts +8 -8
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/cache/redis-handler.d.ts +1 -1
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/stores/cloudflare-kv.d.ts +1 -1
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -1
- package/dist/cache/stores/cloudflare-kv.js.map +1 -1
- package/dist/cache/stores/memory.d.ts +1 -1
- package/dist/cache/stores/memory.d.ts.map +1 -1
- package/dist/cache/stores/memory.js.map +1 -1
- package/dist/cache/stores/redis.d.ts +1 -1
- package/dist/cache/stores/redis.d.ts.map +1 -1
- package/dist/cache/stores/redis.js.map +1 -1
- package/dist/cache/stores/vercel.d.ts +1 -1
- package/dist/cache/stores/vercel.d.ts.map +1 -1
- package/dist/cache/stores/vercel.js.map +1 -1
- package/dist/cache/tag-aware-handler.d.ts +2 -2
- package/dist/cache/tag-aware-handler.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/cdn/cloudflare-purge.d.ts +1 -1
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.js.map +1 -1
- package/dist/cdn/fastly-purge.d.ts +1 -1
- package/dist/cdn/fastly-purge.d.ts.map +1 -1
- package/dist/cdn/fastly-purge.js.map +1 -1
- package/dist/cdn/index.d.ts +4 -4
- package/dist/cdn/index.d.ts.map +1 -1
- package/dist/cdn/workers-cache-purge.d.ts +5 -1
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -1
- package/dist/cdn/workers-cache-purge.js.map +1 -1
- package/dist/cli-check.d.ts +10 -0
- package/dist/cli-check.d.ts.map +1 -1
- package/dist/cli.d.ts +12 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +30 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-entry/hydrate.d.ts +2 -2
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
- package/dist/client/browser-entry/post-hydration.d.ts +2 -2
- package/dist/client/browser-entry/router-init.d.ts +2 -2
- package/dist/client/browser-entry/rsc-stream.d.ts +1 -1
- package/dist/client/form.d.ts +2 -2
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +2 -2
- package/dist/client/index.d.ts +18 -18
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -19
- package/dist/client/internal.d.ts.map +1 -1
- package/dist/client/internal.js +11 -15
- package/dist/client/internal.js.map +1 -1
- package/dist/client/link.d.ts +3 -3
- package/dist/client/navigation-commit.d.ts +5 -5
- package/dist/client/navigation-root.d.ts +1 -1
- package/dist/client/navigation-root.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +3 -3
- package/dist/client/router-pipeline.d.ts +7 -7
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router-types.d.ts +6 -6
- package/dist/client/router-types.d.ts.map +1 -1
- package/dist/client/router.d.ts +1 -1
- package/dist/client/rsc-fetch.d.ts +4 -4
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +2 -2
- package/dist/client/slot-provider.d.ts +1 -1
- package/dist/client/ssr-data.d.ts +2 -2
- package/dist/client/state.d.ts +4 -4
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-segment-params.d.ts +3 -3
- package/dist/codec.d.ts +2 -2
- package/dist/codec.js.map +1 -1
- package/dist/config-types.d.ts +24 -6
- package/dist/config-types.d.ts.map +1 -1
- package/dist/config-validation.d.ts +1 -1
- package/dist/cookies/define-cookie.d.ts +3 -3
- package/dist/cookies/index.d.ts +3 -3
- package/dist/cookies/index.js +3 -4
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +1 -1
- package/dist/dev-tools/404-page.d.ts +2 -2
- package/dist/dev-tools/error-page.d.ts +2 -2
- package/dist/dev-tools/index.d.ts +12 -12
- package/dist/dev-tools/instrumentation.d.ts +1 -1
- package/dist/dev-tools/logs.d.ts +1 -1
- package/dist/dev-tools/overlay.d.ts +2 -2
- package/dist/dev-tools/terminal.d.ts +1 -1
- package/dist/fonts/ast.d.ts +4 -4
- package/dist/fonts/bundle.d.ts +3 -3
- package/dist/fonts/css.d.ts +1 -1
- package/dist/fonts/dev-middleware.d.ts +1 -1
- package/dist/fonts/google.d.ts +1 -1
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +3 -3
- package/dist/fonts/transform.d.ts +2 -2
- package/dist/fonts/types.d.ts +1 -1
- package/dist/fonts/virtual-modules.d.ts +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +816 -310
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +1 -1
- package/dist/params/define-schema.d.ts +2 -2
- package/dist/params/index.d.ts +4 -4
- package/dist/params/index.js.map +1 -1
- package/dist/params/resolve-schema.d.ts +1 -1
- package/dist/plugin-context.d.ts +9 -9
- package/dist/plugin-context.d.ts.map +1 -1
- package/dist/plugins/adapter-build.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-report.d.ts +5 -5
- package/dist/plugins/cache.d.ts +1 -1
- package/dist/plugins/callsite-jsx.d.ts +2 -2
- package/dist/plugins/chunks.d.ts +1 -1
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/cloudflare-wasm.d.ts +1 -1
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-discovery.d.ts +123 -0
- package/dist/plugins/dev-discovery.d.ts.map +1 -0
- 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/fonts.d.ts +3 -3
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/graph-endpoint.d.ts +112 -0
- package/dist/plugins/graph-endpoint.d.ts.map +1 -0
- package/dist/plugins/mdx.d.ts +18 -5
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +2 -2
- package/dist/plugins/prebuilt-options-analysis.d.ts +1 -1
- package/dist/plugins/prebuilt.d.ts +1 -1
- package/dist/plugins/prerender-sugar.d.ts +11 -14
- package/dist/plugins/prerender-sugar.d.ts.map +1 -1
- package/dist/plugins/request-dep/analysis.d.ts +1 -1
- package/dist/plugins/request-dep/index.d.ts +5 -5
- package/dist/plugins/request-dep/origin.d.ts +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 +1 -1
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -5
- package/dist/routing/codegen-shared.d.ts +1 -1
- package/dist/routing/codegen-write.d.ts +1 -1
- package/dist/routing/codegen.d.ts +1 -1
- package/dist/routing/collision-probe.d.ts +1 -1
- package/dist/routing/collision-spaces.d.ts +1 -1
- package/dist/routing/convention-lint.d.ts +1 -1
- package/dist/routing/convention-lint.d.ts.map +1 -1
- package/dist/routing/index.d.ts +13 -13
- package/dist/routing/index.js +3 -3
- package/dist/routing/interception.d.ts +1 -1
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +1 -1
- package/dist/routing/manifest-codegen.d.ts +1 -1
- package/dist/routing/scanner.d.ts +14 -1
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +1 -1
- package/dist/routing/segment-classify.d.ts +1 -1
- package/dist/routing/segment-codegen.d.ts +1 -1
- package/dist/routing/segment-keys.d.ts +1 -1
- package/dist/routing/slot-placement.d.ts +1 -1
- package/dist/routing/walkers.d.ts +1 -1
- package/dist/rsc-runtime/transforms.d.ts +13 -0
- package/dist/rsc-runtime/transforms.d.ts.map +1 -0
- package/dist/schema-bridge.d.ts +1 -1
- package/dist/search-params/define.d.ts +3 -3
- package/dist/search-params/index.d.ts +3 -3
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/wrappers.d.ts +1 -1
- package/dist/server/access-gate.d.ts +1 -1
- package/dist/server/action-client.d.ts +1 -1
- package/dist/server/action-handler.d.ts +5 -5
- package/dist/server/actions.d.ts +2 -2
- package/dist/server/als-registry.d.ts +8 -8
- package/dist/server/asset-headers.d.ts +1 -1
- package/dist/server/chain-url-parts.d.ts +3 -3
- package/dist/server/children-interception.d.ts +2 -2
- package/dist/server/cookie-context.d.ts +1 -1
- package/dist/server/cookie-parsing.d.ts +2 -2
- package/dist/server/default-logger.d.ts +1 -1
- package/dist/server/deny-boundary.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts +5 -5
- package/dist/server/early-hints.d.ts +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +2 -4
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +5 -5
- package/dist/server/flight-injection-state.d.ts +1 -1
- package/dist/server/form-flash.d.ts +1 -1
- package/dist/server/html-injector-core.d.ts +2 -2
- package/dist/server/html-injectors.d.ts +1 -1
- package/dist/server/index.d.ts +18 -18
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +33 -32
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -50
- package/dist/server/internal.d.ts.map +1 -1
- package/dist/server/internal.js +1023 -1025
- package/dist/server/internal.js.map +1 -1
- package/dist/server/metadata-collector.d.ts +2 -2
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-routes.d.ts +3 -3
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +2 -2
- package/dist/server/middleware-runner.d.ts +1 -1
- package/dist/server/node-stream-transforms.d.ts +1 -1
- package/dist/server/param-coercion.d.ts +4 -4
- package/dist/server/pipeline-helpers.d.ts +3 -3
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-metadata.d.ts +1 -1
- package/dist/server/pipeline-outcome.d.ts +2 -2
- package/dist/server/pipeline-phases.d.ts +3 -3
- package/dist/server/pipeline-phases.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +9 -9
- package/dist/server/prebuilt/cache-key.d.ts +1 -1
- package/dist/server/prebuilt/capture-state.d.ts +1 -1
- package/dist/server/prebuilt/key-discipline.d.ts +1 -1
- package/dist/server/prebuilt/manifest-tag-index.d.ts +1 -1
- package/dist/server/prebuilt/overlay.d.ts +2 -2
- package/dist/server/prebuilt/payload-source.d.ts +1 -1
- package/dist/server/prebuilt/slots.d.ts +1 -1
- package/dist/server/prebuilt/synthetic-store.d.ts +2 -2
- package/dist/server/prebuilt-builder.d.ts +2 -2
- package/dist/server/primitives.d.ts +2 -2
- package/dist/server/publish-params.d.ts +1 -1
- package/dist/server/request-context.d.ts +3 -3
- package/dist/server/route-element-builder.d.ts +16 -6
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-matcher.d.ts +4 -4
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts +1 -1
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +3 -3
- package/dist/server/rsc-entry/error-renderer.d.ts +4 -4
- package/dist/server/rsc-entry/helpers.d.ts +6 -6
- package/dist/server/rsc-entry/index.d.ts +7 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +4 -4
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +4 -4
- package/dist/server/rsc-entry/rsc-payload.d.ts +4 -4
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +3 -3
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +7 -7
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +5 -5
- package/dist/server/sitemap-generator.d.ts +2 -2
- package/dist/server/sitemap-handler.d.ts +1 -1
- package/dist/server/skippable-prefix.d.ts +3 -3
- package/dist/server/slot-interception.d.ts +2 -2
- package/dist/server/slot-resolver.d.ts +3 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +2 -2
- package/dist/server/ssr-entry.d.ts +1 -1
- package/dist/server/static-generator.d.ts +1 -1
- package/dist/server/static-not-found.d.ts +1 -1
- package/dist/server/status-code-resolver.d.ts +1 -1
- package/dist/server/tracing.d.ts +3 -3
- package/dist/server/tree-builder.d.ts +3 -3
- package/dist/server/tree-match.d.ts +1 -1
- package/dist/server/types.d.ts +2 -2
- package/dist/server/utils/mdx-file.d.ts +2 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -1
- package/dist/server/workers-cache-bridge.d.ts +1 -1
- package/dist/shared/als-slots.d.ts +1 -1
- package/dist/shared/payload-root.d.ts +2 -2
- package/dist/shared/rsc-media-type.d.ts +12 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -1
- package/dist/shared/slot-params.d.ts +1 -1
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.js.map +1 -1
- package/dist/shims/font-local.d.ts +1 -1
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/navigation-client.d.ts +4 -4
- package/dist/shims/navigation.d.ts +2 -2
- package/docs/api/34-api-config.mdx +9 -8
- package/docs/api/36-cli.mdx +23 -3
- package/docs/learn/11-error-handling.mdx +11 -0
- package/docs/more/01-advanced-routing.mdx +1 -0
- package/docs/more/04b-mdx.mdx +38 -18
- package/package.json +23 -18
- package/src/adapters/build-output-helper.ts +4 -4
- package/src/adapters/cloudflare-dev.ts +7 -1
- package/src/adapters/cloudflare-kv-cache.ts +11 -8
- package/src/adapters/cloudflare.ts +21 -15
- package/src/adapters/compress-module.ts +2 -2
- package/src/adapters/nitro-presets.ts +139 -0
- package/src/adapters/nitro-preview.ts +340 -0
- package/src/adapters/nitro.ts +100 -465
- package/src/adapters/shared.ts +1 -1
- package/src/analyze/chains.ts +411 -0
- package/src/analyze/classify.ts +258 -0
- package/src/analyze/crawl-entry.ts +68 -0
- package/src/analyze/crawl.ts +500 -0
- package/src/analyze/graph-cache.ts +332 -0
- package/src/analyze/graph-command.ts +762 -0
- package/src/analyze/live-graph.ts +232 -0
- package/src/analyze/poison-rules.ts +165 -0
- package/src/analyze/poison-scan.ts +162 -0
- package/src/analyze/scan.ts +149 -0
- package/src/cache/cache-api.ts +7 -7
- package/src/cache/index.ts +9 -9
- package/src/cache/redis-handler.ts +2 -2
- package/src/cache/stores/cloudflare-kv.ts +1 -1
- package/src/cache/stores/memory.ts +2 -2
- package/src/cache/stores/redis.ts +1 -1
- package/src/cache/stores/vercel.ts +1 -1
- package/src/cache/tag-aware-handler.ts +2 -2
- package/src/cache/timber-cache.ts +8 -8
- package/src/cdn/cloudflare-purge.ts +1 -1
- package/src/cdn/fastly-purge.ts +1 -1
- package/src/cdn/index.ts +10 -4
- package/src/cdn/workers-cache-purge.ts +6 -2
- package/src/cli-check.ts +53 -4
- package/src/cli-schema-sync.ts +3 -3
- package/src/cli.ts +50 -11
- package/src/client/browser-dev.ts +1 -1
- package/src/client/browser-entry/action-dispatch.ts +5 -5
- package/src/client/browser-entry/hmr.ts +1 -1
- package/src/client/browser-entry/hydrate.ts +9 -9
- package/src/client/browser-entry/index.ts +10 -10
- package/src/client/browser-entry/post-hydration.ts +5 -5
- package/src/client/browser-entry/router-init.ts +9 -9
- package/src/client/browser-entry/rsc-stream.ts +3 -3
- package/src/client/error-boundary.tsx +4 -4
- package/src/client/form.tsx +7 -2
- package/src/client/history.ts +2 -2
- package/src/client/index.ts +21 -18
- package/src/client/internal.ts +19 -19
- package/src/client/link.tsx +9 -9
- package/src/client/navigation-api.ts +1 -1
- package/src/client/navigation-commit.ts +5 -5
- package/src/client/navigation-context.ts +1 -1
- package/src/client/navigation-root.tsx +1 -1
- package/src/client/nuqs-adapter.tsx +2 -2
- package/src/client/params-context.ts +4 -4
- package/src/client/router-effects.ts +3 -3
- package/src/client/router-lifecycle.ts +2 -2
- package/src/client/router-pipeline.ts +10 -10
- package/src/client/router-ref.ts +2 -2
- package/src/client/router-skew.ts +2 -2
- package/src/client/router-types.ts +6 -6
- package/src/client/router.ts +13 -13
- package/src/client/rsc-fetch.ts +11 -16
- package/src/client/segment-cache.ts +2 -2
- package/src/client/segment-outlet.tsx +1 -1
- package/src/client/shallow-url.ts +1 -1
- package/src/client/slot-outlet.tsx +1 -1
- package/src/client/slot-provider.tsx +1 -1
- package/src/client/ssr-data.ts +3 -3
- package/src/client/stale-client.ts +1 -1
- package/src/client/state.ts +4 -4
- package/src/client/top-loader.tsx +1 -1
- package/src/client/unload-guard.ts +1 -1
- package/src/client/use-cookie.ts +2 -2
- package/src/client/use-pathname.ts +2 -2
- package/src/client/use-pending-navigation.ts +1 -1
- package/src/client/use-query-states.ts +3 -3
- package/src/client/use-router.ts +2 -2
- package/src/client/use-search-params.ts +3 -3
- package/src/client/use-segment-params.ts +6 -6
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +2 -2
- package/src/config-types.ts +27 -7
- package/src/config-validation.ts +1 -1
- package/src/cookies/define-cookie.ts +6 -6
- package/src/cookies/index.ts +3 -3
- package/src/cookies/json-cookie.ts +1 -1
- package/src/dev-tools/404-page.ts +4 -4
- package/src/dev-tools/dev-page-shell.ts +1 -1
- package/src/dev-tools/error-page.ts +4 -4
- package/src/dev-tools/index.ts +12 -12
- package/src/dev-tools/instrumentation.ts +1 -1
- package/src/dev-tools/logs.ts +1 -1
- package/src/dev-tools/overlay.ts +3 -3
- package/src/dev-tools/terminal.ts +2 -2
- package/src/fonts/ast.ts +5 -5
- package/src/fonts/bundle.ts +5 -5
- package/src/fonts/css.ts +1 -1
- package/src/fonts/dev-middleware.ts +2 -2
- package/src/fonts/google.ts +2 -2
- package/src/fonts/local.ts +4 -4
- package/src/fonts/pipeline.ts +8 -8
- package/src/fonts/transform.ts +5 -5
- package/src/fonts/types.ts +1 -1
- package/src/fonts/virtual-modules.ts +1 -1
- package/src/index.ts +46 -37
- package/src/params/codec-registry.ts +1 -1
- package/src/params/define-schema.ts +2 -2
- package/src/params/index.ts +4 -4
- package/src/params/resolve-schema.ts +2 -2
- package/src/plugin-context.ts +10 -10
- package/src/plugins/adapter-build.ts +5 -5
- package/src/plugins/build-manifest.ts +4 -4
- package/src/plugins/build-report.ts +6 -6
- package/src/plugins/cache.ts +3 -3
- package/src/plugins/callsite-ast.ts +1 -1
- package/src/plugins/callsite-jsx.ts +2 -2
- package/src/plugins/chunks.ts +1 -1
- package/src/plugins/cloudflare-wasm.ts +1 -1
- package/src/plugins/content.ts +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +97 -12
- package/src/plugins/entries.ts +1 -1
- package/src/plugins/fonts.ts +17 -10
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +73 -38
- package/src/plugins/prebuilt-capture.ts +3 -3
- package/src/plugins/prebuilt-options-analysis.ts +1 -1
- package/src/plugins/prebuilt.ts +7 -7
- package/src/plugins/prerender-sugar.ts +11 -19
- package/src/plugins/request-dep/analysis.ts +1 -1
- package/src/plugins/request-dep/index.ts +8 -8
- package/src/plugins/request-dep/origin.ts +1 -1
- package/src/plugins/routing.ts +12 -7
- package/src/plugins/server-bundle.ts +11 -3
- package/src/plugins/shims.ts +16 -31
- package/src/plugins/static-build.ts +10 -10
- package/src/routing/codegen-shared.ts +1 -1
- package/src/routing/codegen-write.ts +3 -3
- package/src/routing/codegen.ts +14 -5
- package/src/routing/collision-probe.ts +3 -3
- package/src/routing/collision-spaces.ts +3 -3
- package/src/routing/convention-lint.ts +136 -6
- package/src/routing/export-detect.ts +1 -1
- package/src/routing/index.ts +13 -13
- package/src/routing/interception.ts +41 -4
- package/src/routing/link-codegen.ts +3 -3
- package/src/routing/manifest-codegen.ts +2 -2
- package/src/routing/scanner.ts +33 -9
- package/src/routing/schema-validation.ts +4 -4
- package/src/routing/segment-classify.ts +2 -2
- package/src/routing/segment-codegen.ts +1 -1
- package/src/routing/segment-keys.ts +1 -1
- package/src/routing/slot-placement.ts +1 -1
- package/src/routing/walkers.ts +1 -1
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +12 -0
- package/src/schema-bridge.ts +1 -1
- package/src/search-params/define.ts +8 -8
- package/src/search-params/index.ts +3 -3
- package/src/search-params/wrappers.ts +3 -3
- package/src/server/access-gate.tsx +6 -6
- package/src/server/action-client.ts +5 -5
- package/src/server/action-handler.ts +16 -16
- package/src/server/actions.ts +5 -5
- package/src/server/als-registry.ts +8 -8
- package/src/server/asset-headers.ts +2 -2
- package/src/server/chain-url-parts.ts +5 -5
- package/src/server/children-interception.ts +4 -4
- package/src/server/compress.ts +1 -1
- package/src/server/cookie-context.ts +4 -4
- package/src/server/cookie-parsing.ts +2 -2
- package/src/server/default-logger.ts +3 -3
- package/src/server/deny-boundary.ts +10 -10
- package/src/server/deny-renderer.ts +38 -25
- package/src/server/early-hints-sender.ts +2 -2
- package/src/server/early-hints.ts +2 -2
- package/src/server/error-boundary-wrapper.ts +4 -12
- package/src/server/fallback-error.ts +13 -13
- package/src/server/flight-injection-state.ts +1 -1
- package/src/server/form-flash.ts +2 -2
- package/src/server/html-injector-core.ts +4 -4
- package/src/server/html-injectors.ts +5 -5
- package/src/server/index.ts +18 -18
- package/src/server/instrumentation.ts +1 -1
- package/src/server/internal.ts +50 -50
- package/src/server/logger.ts +4 -4
- package/src/server/metadata-collector.ts +7 -7
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +4 -4
- package/src/server/metadata-routes.ts +3 -3
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +2 -2
- package/src/server/middleware-runner.ts +1 -1
- package/src/server/node-stream-transforms.ts +4 -4
- package/src/server/param-coercion.ts +8 -8
- package/src/server/pipeline-helpers.ts +7 -7
- package/src/server/pipeline-interception.ts +2 -2
- package/src/server/pipeline-metadata.ts +1 -1
- package/src/server/pipeline-outcome.ts +8 -8
- package/src/server/pipeline-phases.ts +24 -28
- package/src/server/pipeline.ts +22 -22
- package/src/server/prebuilt/cache-key.ts +1 -1
- package/src/server/prebuilt/capture-state.ts +1 -1
- package/src/server/prebuilt/key-discipline.ts +1 -1
- package/src/server/prebuilt/manifest-tag-index.ts +1 -1
- package/src/server/prebuilt/overlay.ts +6 -6
- package/src/server/prebuilt/payload-source.ts +2 -2
- package/src/server/prebuilt/slots.ts +5 -5
- package/src/server/prebuilt/synthetic-store.ts +2 -2
- package/src/server/prebuilt-builder.ts +16 -16
- package/src/server/prebuilt-runtime.ts +12 -12
- package/src/server/primitives.ts +7 -7
- package/src/server/publish-params.ts +3 -3
- package/src/server/request-context.ts +7 -7
- package/src/server/route-element-builder.ts +108 -50
- package/src/server/route-handler.ts +4 -4
- package/src/server/route-matcher.ts +5 -5
- package/src/server/rsc-cache-key-guard.ts +3 -5
- package/src/server/rsc-entry/action-middleware-runner.ts +7 -7
- package/src/server/rsc-entry/api-handler.ts +18 -9
- package/src/server/rsc-entry/deny-fallback.ts +10 -10
- package/src/server/rsc-entry/error-renderer.ts +27 -27
- package/src/server/rsc-entry/helpers.ts +10 -10
- package/src/server/rsc-entry/index.ts +51 -47
- package/src/server/rsc-entry/render-route.ts +20 -20
- package/src/server/rsc-entry/revalidate-renderer.ts +12 -12
- package/src/server/rsc-entry/rsc-payload.ts +19 -15
- package/src/server/rsc-entry/rsc-stream.ts +8 -8
- package/src/server/rsc-entry/ssr-bridge.ts +3 -3
- package/src/server/rsc-entry/ssr-renderer.ts +23 -23
- package/src/server/rsc-entry/wrap-action-dispatch.ts +9 -9
- package/src/server/rsc-prop-warnings.ts +1 -1
- package/src/server/sensitive-fields.ts +1 -1
- package/src/server/server-timing.ts +1 -1
- package/src/server/sitemap-generator.ts +3 -3
- package/src/server/sitemap-handler.ts +3 -3
- package/src/server/skippable-prefix.ts +7 -7
- package/src/server/slot-interception.ts +5 -5
- package/src/server/slot-resolver.ts +20 -28
- package/src/server/ssr-bridge-types.ts +2 -2
- package/src/server/ssr-entry.ts +18 -18
- package/src/server/ssr-render.ts +4 -4
- package/src/server/ssr-wrappers.tsx +1 -1
- package/src/server/state-tree-diff.ts +1 -1
- package/src/server/static-generator.ts +6 -6
- package/src/server/static-not-found.ts +3 -3
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/tracing.ts +5 -5
- package/src/server/tree-builder.ts +4 -4
- package/src/server/tree-match.ts +1 -1
- package/src/server/types.ts +2 -2
- package/src/server/utils/mdx-file.ts +2 -2
- package/src/server/waituntil-bridge.ts +1 -1
- package/src/server/workers-cache-bridge.ts +2 -2
- package/src/shared/als-slots.ts +1 -1
- package/src/shared/payload-root.ts +2 -2
- package/src/shared/rsc-media-type.ts +16 -0
- package/src/shared/slot-params.ts +1 -1
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +1 -1
- package/src/shims/navigation-client.ts +5 -5
- package/src/shims/navigation.ts +2 -2
- package/LICENSE +0 -8
- package/dist/_chunks/actions-BjbbNRFN.js.map +0 -1
- package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +0 -1
- package/dist/_chunks/cache-api-DllJ-Lyw.js.map +0 -1
- package/dist/_chunks/cli-check-DJZDc22E.js.map +0 -1
- package/dist/_chunks/convention-lint-CpteIpTm.js.map +0 -1
- package/dist/_chunks/dist-BA3u1z3W.js +0 -423
- package/dist/_chunks/dist-BA3u1z3W.js.map +0 -1
- package/dist/_chunks/mdx-file-C005ay-P.js.map +0 -1
- package/dist/_chunks/plugin-context-rCinWLiE.js.map +0 -1
- package/dist/_chunks/scanner-CAietmj4.js.map +0 -1
- package/dist/content/index.d.ts +0 -2
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -0
- package/src/content/index.ts +0 -5
- package/src/shims/server-only-noop.js +0 -6
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-server discovery records — `.timber/dev/<pid>-<port>-<token>.json`.
|
|
3
|
+
*
|
|
4
|
+
* On startup each dev server writes `{ port, pid, host, protocol }` to its own record
|
|
5
|
+
* file under the app's `.timber/dev/` so the `timber graph` CLI and the
|
|
6
|
+
* VS Code extension can discover a running dev server for the
|
|
7
|
+
* live-graph fast path.
|
|
8
|
+
*
|
|
9
|
+
* One record file per server, one writer per file. This is what makes
|
|
10
|
+
* multi-server roots (Vite auto-increments the port across processes;
|
|
11
|
+
* programmatic embeddings run several servers in one process) safe
|
|
12
|
+
* without any coordination: there is no shared file to displace, no
|
|
13
|
+
* ownership to arbitrate, and no shutdown-order dependency — each
|
|
14
|
+
* server removes exactly its own record.
|
|
15
|
+
*
|
|
16
|
+
* Consumers must list the directory and trust a record only if its pid
|
|
17
|
+
* is alive AND a probe request to the endpoint succeeds; anything else
|
|
18
|
+
* is treated as absent (silent fallback), never an error. Stale records
|
|
19
|
+
* (crashed servers) are therefore the normal case — startup sweeps
|
|
20
|
+
* dead-pid records best-effort, and consumers validate the rest away.
|
|
21
|
+
*
|
|
22
|
+
* The directory layout and file format are implementation details, not
|
|
23
|
+
* a public contract.
|
|
24
|
+
*
|
|
25
|
+
* Design doc: 47-module-environment-tooling.md §5, 21-dev-server.md.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import type { Server } from 'node:net';
|
|
29
|
+
import { Server as TlsServer } from 'node:tls';
|
|
30
|
+
import { randomUUID } from 'node:crypto';
|
|
31
|
+
import { mkdirSync, writeFileSync, rmSync, readFileSync, readdirSync } from 'node:fs';
|
|
32
|
+
import { join } from 'node:path';
|
|
33
|
+
|
|
34
|
+
/** Relative path of the discovery directory within the project root. */
|
|
35
|
+
export const DEV_DISCOVERY_DIR = join('.timber', 'dev');
|
|
36
|
+
|
|
37
|
+
export interface DevRecord {
|
|
38
|
+
port: number;
|
|
39
|
+
pid: number;
|
|
40
|
+
/**
|
|
41
|
+
* The bound address, as reported by the socket. Consumers probing the
|
|
42
|
+
* endpoint need it for servers bound to non-default interfaces;
|
|
43
|
+
* wildcard addresses (`0.0.0.0`, `::`) should be probed via loopback.
|
|
44
|
+
*/
|
|
45
|
+
host: string;
|
|
46
|
+
/**
|
|
47
|
+
* Probe scheme. `server.https` dev servers (including HTTP/2) answer
|
|
48
|
+
* only TLS — an http:// probe of one would fail and wrongly trigger
|
|
49
|
+
* the cold-crawl fallback.
|
|
50
|
+
*/
|
|
51
|
+
protocol: 'http' | 'https';
|
|
52
|
+
/**
|
|
53
|
+
* Vite `base` path. When non-root (e.g. `/my-app/`), the WebSocket
|
|
54
|
+
* upgrade path is `base + hmrPath`.
|
|
55
|
+
*/
|
|
56
|
+
base?: string;
|
|
57
|
+
/**
|
|
58
|
+
* HMR WebSocket path (from `server.ws.path` or deprecated
|
|
59
|
+
* `server.hmr.path`). Absent when no path is configured (default `/`).
|
|
60
|
+
*/
|
|
61
|
+
hmrPath?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Custom WebSocket host override (from `server.ws.host` or deprecated
|
|
64
|
+
* `server.hmr.host`). When set, the WS connection targets this host
|
|
65
|
+
* instead of the HTTP server's bound address.
|
|
66
|
+
*/
|
|
67
|
+
hmrHost?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Custom WebSocket port override (from `server.ws.clientPort` ??
|
|
70
|
+
* `server.ws.port`, or deprecated `server.hmr.clientPort` ??
|
|
71
|
+
* `server.hmr.port`). When set, the WS connection targets this port
|
|
72
|
+
* instead of the HTTP server's bound port.
|
|
73
|
+
*/
|
|
74
|
+
hmrPort?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Custom WebSocket protocol override (from `server.ws.protocol` or
|
|
77
|
+
* deprecated `server.hmr.protocol`). When set (e.g. `'wss'`), the
|
|
78
|
+
* upgrade request uses the corresponding HTTP scheme.
|
|
79
|
+
*/
|
|
80
|
+
hmrProtocol?: string;
|
|
81
|
+
/**
|
|
82
|
+
* Vite 8 WebSocket token (from `config.webSocketToken`). Required for
|
|
83
|
+
* browser WS upgrades; the extension passes it as `?token=` on the
|
|
84
|
+
* WebSocket URL.
|
|
85
|
+
*/
|
|
86
|
+
webSocketToken?: string;
|
|
87
|
+
/**
|
|
88
|
+
* Absolute path to the Vite config file this server was started with.
|
|
89
|
+
* When multiple dev servers share a project root but use different
|
|
90
|
+
* configs, the fast path must only accept the record matching the
|
|
91
|
+
* config the CLI resolved (TIM-1393).
|
|
92
|
+
*/
|
|
93
|
+
configFile?: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Best-effort "is this pid alive" — signal 0 probes without killing. */
|
|
97
|
+
export function isPidAlive(pid: number): boolean {
|
|
98
|
+
try {
|
|
99
|
+
process.kill(pid, 0);
|
|
100
|
+
return true;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
// EPERM means the process exists but is owned by someone else.
|
|
103
|
+
return (error as NodeJS.ErrnoException).code === 'EPERM';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Remove sibling records whose pid is no longer alive. Purely a
|
|
109
|
+
* tidiness sweep — consumers already ignore records that fail the
|
|
110
|
+
* pid + probe validation, so missing a stale record here is harmless.
|
|
111
|
+
*/
|
|
112
|
+
function sweepDeadRecords(dir: string): void {
|
|
113
|
+
let entries: string[];
|
|
114
|
+
try {
|
|
115
|
+
entries = readdirSync(dir);
|
|
116
|
+
} catch {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
if (!entry.endsWith('.json')) continue;
|
|
121
|
+
const filePath = join(dir, entry);
|
|
122
|
+
try {
|
|
123
|
+
const record = JSON.parse(readFileSync(filePath, 'utf8')) as Partial<DevRecord>;
|
|
124
|
+
// Remove only records that parse AND name a dead pid. An
|
|
125
|
+
// unreadable file may be a sibling's record mid-write — leave it;
|
|
126
|
+
// consumers ignore records that fail validation anyway.
|
|
127
|
+
if (typeof record.pid === 'number' && !isPidAlive(record.pid)) {
|
|
128
|
+
rmSync(filePath, { force: true });
|
|
129
|
+
}
|
|
130
|
+
} catch {
|
|
131
|
+
// Unreadable — skip, never delete another writer's in-flight file.
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Register discovery-record lifecycle handlers on the dev server's HTTP
|
|
138
|
+
* server. Writes `.timber/dev/<pid>-<port>-<token>.json` once the server is
|
|
139
|
+
* listening (the bound port is only known then) and removes exactly
|
|
140
|
+
* that record on clean shutdown.
|
|
141
|
+
*
|
|
142
|
+
* All filesystem work is best-effort: a failure to write or remove a
|
|
143
|
+
* record must never break the dev server. `httpServer` is null in
|
|
144
|
+
* middleware mode — no port exists, so there is nothing to advertise.
|
|
145
|
+
* Typed as `net.Server` — the common base of Vite's `http.Server` and
|
|
146
|
+
* `Http2SecureServer` variants, which carries the events and `address()`.
|
|
147
|
+
*/
|
|
148
|
+
export function registerDevDiscovery(
|
|
149
|
+
httpServer: Server | null,
|
|
150
|
+
root: string,
|
|
151
|
+
config?: {
|
|
152
|
+
configFile?: string | false;
|
|
153
|
+
base?: string;
|
|
154
|
+
server?: {
|
|
155
|
+
hmr?:
|
|
156
|
+
| { path?: string; host?: string; port?: number; clientPort?: number; protocol?: string }
|
|
157
|
+
| boolean;
|
|
158
|
+
ws?:
|
|
159
|
+
| { path?: string; host?: string; port?: number; clientPort?: number; protocol?: string }
|
|
160
|
+
| false;
|
|
161
|
+
};
|
|
162
|
+
webSocketToken?: string;
|
|
163
|
+
}
|
|
164
|
+
): void {
|
|
165
|
+
if (!httpServer) return;
|
|
166
|
+
|
|
167
|
+
const dir = join(root, DEV_DISCOVERY_DIR);
|
|
168
|
+
let recordPath: string | null = null;
|
|
169
|
+
|
|
170
|
+
httpServer.on('listening', () => {
|
|
171
|
+
const address = httpServer.address();
|
|
172
|
+
// Unix-socket listeners have a string address — no port to advertise.
|
|
173
|
+
if (address === null || typeof address === 'string') return;
|
|
174
|
+
const hmrOpts = typeof config?.server?.hmr === 'object' ? config.server.hmr : undefined;
|
|
175
|
+
const wsOpts = typeof config?.server?.ws === 'object' ? config.server.ws : undefined;
|
|
176
|
+
const record: DevRecord = {
|
|
177
|
+
port: address.port,
|
|
178
|
+
pid: process.pid,
|
|
179
|
+
host: address.address,
|
|
180
|
+
// Vite's https/h2 servers are tls.Server subclasses; plain HTTP
|
|
181
|
+
// and h2c are not.
|
|
182
|
+
protocol: httpServer instanceof TlsServer ? 'https' : 'http',
|
|
183
|
+
base: config?.base && config.base !== '/' ? config.base : undefined,
|
|
184
|
+
hmrPath: wsOpts?.path ?? hmrOpts?.path,
|
|
185
|
+
hmrHost: wsOpts?.host ?? hmrOpts?.host,
|
|
186
|
+
hmrPort:
|
|
187
|
+
wsOpts?.clientPort || wsOpts?.port || hmrOpts?.clientPort || hmrOpts?.port || undefined,
|
|
188
|
+
hmrProtocol: wsOpts?.protocol ?? hmrOpts?.protocol,
|
|
189
|
+
webSocketToken: config?.webSocketToken,
|
|
190
|
+
configFile: typeof config?.configFile === 'string' ? config.configFile : undefined,
|
|
191
|
+
};
|
|
192
|
+
// pid+port alone is not a unique server identity (same port on two
|
|
193
|
+
// interfaces; worker threads and duplicate module copies share a
|
|
194
|
+
// pid but not module state, so a counter cannot disambiguate
|
|
195
|
+
// either). A random token makes the filename unique regardless of
|
|
196
|
+
// process/isolate topology; pid and port stay in the name only for
|
|
197
|
+
// human debuggability.
|
|
198
|
+
recordPath = join(dir, `${record.pid}-${record.port}-${randomUUID()}.json`);
|
|
199
|
+
try {
|
|
200
|
+
mkdirSync(dir, { recursive: true });
|
|
201
|
+
writeFileSync(recordPath, JSON.stringify(record));
|
|
202
|
+
sweepDeadRecords(dir);
|
|
203
|
+
} catch {
|
|
204
|
+
// Best-effort — consumers fall back to the cold crawl.
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
httpServer.on('close', () => {
|
|
209
|
+
if (!recordPath) return;
|
|
210
|
+
try {
|
|
211
|
+
// Only ever this server's own record — sibling servers' records
|
|
212
|
+
// are separate files and survive any shutdown order untouched.
|
|
213
|
+
rmSync(recordPath, { force: true });
|
|
214
|
+
} catch {
|
|
215
|
+
// Best-effort — a stale record is validated away by consumers.
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
@@ -15,25 +15,31 @@
|
|
|
15
15
|
import type { Plugin, ViteDevServer, DevEnvironment } from 'vite';
|
|
16
16
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
17
17
|
import type { TLSSocket } from 'node:tls';
|
|
18
|
-
import { existsSync, statSync } from 'node:fs';
|
|
19
|
-
import { join } from 'node:path';
|
|
18
|
+
import { existsSync, realpathSync, statSync } from 'node:fs';
|
|
19
|
+
import { basename, dirname, join } from 'node:path';
|
|
20
20
|
import { sendNodeResponse } from 'srvx/node';
|
|
21
|
-
import type { PluginContext } from '../plugin-context.
|
|
21
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
22
22
|
import {
|
|
23
23
|
sendErrorToOverlay,
|
|
24
24
|
classifyErrorPhase,
|
|
25
25
|
fixErrorStacktrace,
|
|
26
26
|
parseFirstAppFrame,
|
|
27
27
|
type ErrorPhase,
|
|
28
|
-
} from '../dev-tools/overlay.
|
|
29
|
-
import { generateDevErrorPage } from '../dev-tools/error-page.
|
|
30
|
-
import { extractHmrOptions, type DevErrorHmrOptions } from '../dev-tools/dev-page-shell.
|
|
31
|
-
import { addVirtualModuleContext } from '../config-validation.
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
} from '../dev-tools/overlay.ts';
|
|
29
|
+
import { generateDevErrorPage } from '../dev-tools/error-page.ts';
|
|
30
|
+
import { extractHmrOptions, type DevErrorHmrOptions } from '../dev-tools/dev-page-shell.ts';
|
|
31
|
+
import { addVirtualModuleContext } from '../config-validation.ts';
|
|
32
|
+
import { registerDevDiscovery } from './dev-discovery.ts';
|
|
33
|
+
import {
|
|
34
|
+
createGraphEndpointMiddleware,
|
|
35
|
+
makeGraphUpdateChannel,
|
|
36
|
+
type GraphUpdateChannel,
|
|
37
|
+
} from './graph-endpoint.ts';
|
|
38
|
+
import { compressResponse } from '../server/compress.ts';
|
|
39
|
+
import { isMetadataRouteServePath } from '../server/metadata-routes.ts';
|
|
40
|
+
import { canonicalize } from '../server/canonicalize.ts';
|
|
41
|
+
import { matchUrlParts } from '../server/tree-match.ts';
|
|
42
|
+
import type { RouteTree } from '../routing/types.ts';
|
|
37
43
|
|
|
38
44
|
// ─── Constants ────────────────────────────────────────────────────────────
|
|
39
45
|
|
|
@@ -70,6 +76,10 @@ const ASSET_EXTENSIONS =
|
|
|
70
76
|
* Hook: configureServer (returns post-hook to register after Vite's middleware)
|
|
71
77
|
*/
|
|
72
78
|
export function timberDevServer(ctx: PluginContext): Plugin {
|
|
79
|
+
// Set in configureServer, consumed by hotUpdate/transform — the
|
|
80
|
+
// graph push channel emits through the server's HMR transport.
|
|
81
|
+
let graphChannel: GraphUpdateChannel | null = null;
|
|
82
|
+
|
|
73
83
|
return {
|
|
74
84
|
name: 'timber-dev-server',
|
|
75
85
|
|
|
@@ -77,6 +87,28 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
77
87
|
// See 21-dev-server.md §Plugin Registration.
|
|
78
88
|
apply: 'serve',
|
|
79
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Push channel for the graph endpoint, phase 1: `invalidated`, one
|
|
92
|
+
* per (file, environment). Emitted from hotUpdate — which runs
|
|
93
|
+
* AFTER Vite invalidates the environment module graphs — never
|
|
94
|
+
* from a raw watcher listener, which would race consumers into
|
|
95
|
+
* querying pre-invalidation memberships (design/47 §"Dev-server
|
|
96
|
+
* endpoint").
|
|
97
|
+
*/
|
|
98
|
+
hotUpdate({ file, type }) {
|
|
99
|
+
graphChannel?.onHotUpdate({ file, type, environment: this.environment.name });
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Push channel phase 2: `transformed`, when a pending-invalidated
|
|
104
|
+
* module's import edges are actually rebuilt. A Set lookup for
|
|
105
|
+
* everything without a pending invalidation — free on the hot
|
|
106
|
+
* path. Returning nothing leaves the code untouched.
|
|
107
|
+
*/
|
|
108
|
+
transform(_code, id) {
|
|
109
|
+
graphChannel?.onTransform(id, this.environment.name);
|
|
110
|
+
},
|
|
111
|
+
|
|
80
112
|
/**
|
|
81
113
|
* Register the dev server middleware and config file watcher.
|
|
82
114
|
*
|
|
@@ -103,9 +135,62 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
103
135
|
// as Vite's '{ type: "error" }' payload to trigger the overlay.
|
|
104
136
|
listenForClientErrors(server, ctx.root);
|
|
105
137
|
|
|
138
|
+
// GET /__timber/graph — module-environment classification from the
|
|
139
|
+
// live env graphs, plus the timber:graph-update HMR push channel.
|
|
140
|
+
// Registered before the timber middleware so /__timber/* requests
|
|
141
|
+
// never reach the app pipeline. Dev-only by construction (this
|
|
142
|
+
// plugin is apply: 'serve'). See design/47 §"Dev-server endpoint".
|
|
143
|
+
server.middlewares.use(createGraphEndpointMiddleware(server, ctx));
|
|
144
|
+
graphChannel = makeGraphUpdateChannel(
|
|
145
|
+
ctx,
|
|
146
|
+
(payload) => server.hot.send(payload),
|
|
147
|
+
// "Edges rebuilt" signal: Vite sets a node's transformResult at
|
|
148
|
+
// the END of the transform request, after vite:import-analysis
|
|
149
|
+
// has updated the importer edges. Virtual ids (the route
|
|
150
|
+
// manifest's structural updates) have no file index — resolve
|
|
151
|
+
// them by id.
|
|
152
|
+
(file, environment) => {
|
|
153
|
+
const graph = server.environments[environment]?.moduleGraph;
|
|
154
|
+
if (!graph) return false;
|
|
155
|
+
const nodes = graph.getModulesByFile(file);
|
|
156
|
+
if (nodes) {
|
|
157
|
+
for (const node of nodes) {
|
|
158
|
+
if (node.transformResult != null) return true;
|
|
159
|
+
}
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
return graph.getModuleById(file)?.transformResult != null;
|
|
163
|
+
},
|
|
164
|
+
// Canonicalize watcher/hook paths into the module graphs' path
|
|
165
|
+
// space: under the default preserveSymlinks:false the graphs
|
|
166
|
+
// carry realpaths while watcher events can carry symlink paths
|
|
167
|
+
// — unkeyed by one canonical form, a pending entry would never
|
|
168
|
+
// match its own transform. Deleted files realpath their parent
|
|
169
|
+
// directory instead; virtual ids pass through untouched.
|
|
170
|
+
(file) => {
|
|
171
|
+
// Optional-chained: mock servers in unit tests carry a bare
|
|
172
|
+
// config object without resolve options.
|
|
173
|
+
if (server.config?.resolve?.preserveSymlinks || file.includes('virtual:')) return file;
|
|
174
|
+
try {
|
|
175
|
+
return realpathSync(file);
|
|
176
|
+
} catch {
|
|
177
|
+
try {
|
|
178
|
+
return join(realpathSync(dirname(file)), basename(file));
|
|
179
|
+
} catch {
|
|
180
|
+
return file;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
|
|
106
186
|
// Pre-hook — registers middleware before Vite's internals
|
|
107
187
|
server.middlewares.use(createTimberMiddleware(server, ctx));
|
|
108
188
|
|
|
189
|
+
// Write this server's .timber/dev/<pid>-<port>-<token>.json record once
|
|
190
|
+
// the server is listening so the graph CLI / VS Code extension can
|
|
191
|
+
// discover it. See design/47-module-environment-tooling.md §5.
|
|
192
|
+
registerDevDiscovery(server.httpServer, ctx.root, server.config);
|
|
193
|
+
|
|
109
194
|
// Wrap server.listen() to close the holding server immediately
|
|
110
195
|
// before Vite binds the port — no gap where nothing is listening.
|
|
111
196
|
// The holding server was started in rootSync's config() hook to
|
package/src/plugins/entries.ts
CHANGED
|
@@ -15,7 +15,7 @@ import type { Plugin } from 'vite';
|
|
|
15
15
|
import { resolve, dirname } from 'node:path';
|
|
16
16
|
import { fileURLToPath } from 'node:url';
|
|
17
17
|
import { existsSync } from 'node:fs';
|
|
18
|
-
import type { PluginContext } from '../plugin-context.
|
|
18
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
19
19
|
|
|
20
20
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
21
|
|
package/src/plugins/fonts.ts
CHANGED
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
|
|
21
21
|
import { parseAst } from 'vite';
|
|
22
22
|
import type { Plugin, ResolvedConfig, ViteDevServer } from 'vite';
|
|
23
|
-
import type { PluginContext } from '../plugin-context.
|
|
23
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
24
24
|
import {
|
|
25
25
|
downloadAndCacheFonts,
|
|
26
26
|
generateProductionFontFaces,
|
|
27
27
|
resolveDevFontFaces,
|
|
28
|
-
} from '../fonts/google.
|
|
29
|
-
import { fontUrlPrefix } from '../fonts/paths.
|
|
30
|
-
import { FontPipeline } from '../fonts/pipeline.
|
|
31
|
-
import { runFontsTransform } from '../fonts/transform.
|
|
32
|
-
import { installFontDevMiddleware } from '../fonts/dev-middleware.
|
|
33
|
-
import { emitFontAssets, writeFontManifest, groupCachedFontsByFamily } from '../fonts/bundle.
|
|
28
|
+
} from '../fonts/google.ts';
|
|
29
|
+
import { fontUrlPrefix } from '../fonts/paths.ts';
|
|
30
|
+
import { FontPipeline } from '../fonts/pipeline.ts';
|
|
31
|
+
import { runFontsTransform } from '../fonts/transform.ts';
|
|
32
|
+
import { installFontDevMiddleware } from '../fonts/dev-middleware.ts';
|
|
33
|
+
import { emitFontAssets, writeFontManifest, groupCachedFontsByFamily } from '../fonts/bundle.ts';
|
|
34
34
|
import {
|
|
35
35
|
RESOLVED_GOOGLE,
|
|
36
36
|
RESOLVED_LOCAL,
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
VIRTUAL_LOCAL,
|
|
39
39
|
generateGoogleVirtualModule,
|
|
40
40
|
generateLocalVirtualModule,
|
|
41
|
-
} from '../fonts/virtual-modules.
|
|
41
|
+
} from '../fonts/virtual-modules.ts';
|
|
42
42
|
|
|
43
43
|
// ── Public re-exports ────────────────────────────────────────────────────
|
|
44
44
|
//
|
|
@@ -47,7 +47,7 @@ import {
|
|
|
47
47
|
// updating every caller. New helpers should be added to the per-concern
|
|
48
48
|
// module first and re-exported here only if external code needs them.
|
|
49
49
|
|
|
50
|
-
export { FontPipeline } from '../fonts/pipeline.
|
|
50
|
+
export { FontPipeline } from '../fonts/pipeline.ts';
|
|
51
51
|
export {
|
|
52
52
|
generateFontId,
|
|
53
53
|
extractFontConfig,
|
|
@@ -55,7 +55,7 @@ export {
|
|
|
55
55
|
parseGoogleFontImports,
|
|
56
56
|
parseGoogleFontFamilies,
|
|
57
57
|
parseLocalFontImportName,
|
|
58
|
-
} from '../fonts/transform.
|
|
58
|
+
} from '../fonts/transform.ts';
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
61
|
* Create the timber-fonts Vite plugin.
|
|
@@ -171,6 +171,13 @@ export function timberFonts(ctx: PluginContext): Plugin {
|
|
|
171
171
|
return '';
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
+
// The analyze crawl only needs import edges, not actual font
|
|
175
|
+
// CSS. Return an empty stylesheet so transforms resolve
|
|
176
|
+
// without triggering network fetches or cache writes.
|
|
177
|
+
if (process.env.TIMBER_ANALYZE === '1') {
|
|
178
|
+
return '';
|
|
179
|
+
}
|
|
180
|
+
|
|
174
181
|
const skipFonts = process.env.TIMBER_SKIP_FONTS === '1';
|
|
175
182
|
|
|
176
183
|
for (const font of pipeline.googleFonts()) {
|