@timber-js/app 0.2.0-alpha.192 → 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-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 +785 -282
- 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 +1 -1
- 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/36-cli.mdx +23 -3
- package/docs/learn/11-error-handling.mdx +11 -0
- package/docs/more/01-advanced-routing.mdx +1 -0
- package/package.json +17 -16
- 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-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 +4 -3
- 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 +9 -2
- 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
package/src/fonts/pipeline.ts
CHANGED
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
|
|
29
29
|
import { readFileSync, existsSync } from 'node:fs';
|
|
30
30
|
import { resolve, normalize } from 'node:path';
|
|
31
|
-
import type { ExtractedFont, FontEntry, FontFaceDescriptor } from './types.
|
|
32
|
-
import type { CachedFont } from './google.
|
|
33
|
-
import { contentHash } from './google.
|
|
34
|
-
import { generateVariableClass, generateFontFamilyClass, generateFontFaces } from './css.
|
|
35
|
-
import { generateFallbackCss } from './fallbacks.
|
|
36
|
-
import { generateLocalFontFaces } from './local.
|
|
37
|
-
import { hashedFontBasename, fontUrlPrefix } from './paths.
|
|
38
|
-
import { VirtualFontCssIdMap } from './virtual-modules.
|
|
31
|
+
import type { ExtractedFont, FontEntry, FontFaceDescriptor } from './types.ts';
|
|
32
|
+
import type { CachedFont } from './google.ts';
|
|
33
|
+
import { contentHash } from './google.ts';
|
|
34
|
+
import { generateVariableClass, generateFontFamilyClass, generateFontFaces } from './css.ts';
|
|
35
|
+
import { generateFallbackCss } from './fallbacks.ts';
|
|
36
|
+
import { generateLocalFontFaces } from './local.ts';
|
|
37
|
+
import { hashedFontBasename, fontUrlPrefix } from './paths.ts';
|
|
38
|
+
import { VirtualFontCssIdMap } from './virtual-modules.ts';
|
|
39
39
|
|
|
40
40
|
export class FontPipeline {
|
|
41
41
|
/**
|
package/src/fonts/transform.ts
CHANGED
|
@@ -14,17 +14,17 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import MagicString from 'magic-string';
|
|
17
|
-
import type { ExtractedFont, GoogleFontConfig } from './types.
|
|
18
|
-
import { buildFontStack } from './fallbacks.
|
|
19
|
-
import { processLocalFont } from './local.
|
|
17
|
+
import type { ExtractedFont, GoogleFontConfig } from './types.ts';
|
|
18
|
+
import { buildFontStack } from './fallbacks.ts';
|
|
19
|
+
import { processLocalFont } from './local.ts';
|
|
20
20
|
import {
|
|
21
21
|
extractFontConfigAst,
|
|
22
22
|
detectDynamicFontCallAst,
|
|
23
23
|
findFontCallSites,
|
|
24
24
|
extractGoogleFontConfigFromNode,
|
|
25
25
|
extractLocalFontConfigFromNode,
|
|
26
|
-
} from './ast.
|
|
27
|
-
import type { FontPipeline } from './pipeline.
|
|
26
|
+
} from './ast.ts';
|
|
27
|
+
import type { FontPipeline } from './pipeline.ts';
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* Convert a font family name to a scoped class name.
|
package/src/fonts/types.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
// `CachedFont` lives in `google.ts`. Importing it here is type-only so
|
|
11
11
|
// there is no runtime dependency cycle — TypeScript erases the import.
|
|
12
|
-
import type { CachedFont } from './google.
|
|
12
|
+
import type { CachedFont } from './google.ts';
|
|
13
13
|
|
|
14
14
|
/** Configuration passed to a Google font function (e.g. `Inter({ ... })`). */
|
|
15
15
|
export interface GoogleFontConfig {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
32
|
import { createHash } from 'node:crypto';
|
|
33
|
-
import type { ExtractedFont } from './types.
|
|
33
|
+
import type { ExtractedFont } from './types.ts';
|
|
34
34
|
|
|
35
35
|
export const VIRTUAL_GOOGLE = '@timber/fonts/google';
|
|
36
36
|
export const VIRTUAL_LOCAL = '@timber/fonts/local';
|
package/src/index.ts
CHANGED
|
@@ -15,34 +15,43 @@ import { createLogger } from 'vite';
|
|
|
15
15
|
import { join, relative, resolve } from 'node:path';
|
|
16
16
|
import { createRequire } from 'node:module';
|
|
17
17
|
import react, { reactCompilerPreset } from '@vitejs/plugin-react';
|
|
18
|
-
import { timberContent } from './plugins/content';
|
|
19
|
-
import { timberDevServer } from './plugins/dev-server';
|
|
20
|
-
import { timberEntries } from './plugins/entries';
|
|
21
|
-
import { timberMdx } from './plugins/mdx';
|
|
22
|
-
import { timberRouting } from './plugins/routing';
|
|
23
|
-
import { timberShims } from './plugins/shims';
|
|
24
|
-
import { timberFonts } from './plugins/fonts';
|
|
25
|
-
import { timberStaticBuild } from './plugins/static-build';
|
|
26
|
-
import { timberBuildManifest } from './plugins/build-manifest';
|
|
27
|
-
import { timberDevLogs, originalConsole, wrapLoggerWithOriginalConsole } from './dev-tools/logs';
|
|
28
|
-
import { resolveForwardConsole } from './dev-tools/browser-logs';
|
|
29
|
-
import { timberReactProd } from './plugins/react-prod';
|
|
30
|
-
import { timberChunks } from './plugins/chunks';
|
|
31
|
-
import { clientChunkGroup } from './plugins/client-chunks';
|
|
32
|
-
import { timberServerBundle } from './plugins/server-bundle';
|
|
33
|
-
import { timberCacheTransform } from './plugins/cache';
|
|
34
|
-
import { timberRequestDep } from './plugins/request-dep/index.
|
|
35
|
-
import { timberPrebuilt } from './plugins/prebuilt';
|
|
36
|
-
import { timberPrerenderSugar } from './plugins/prerender-sugar';
|
|
37
|
-
import { timberCloudflareWasm } from './plugins/cloudflare-wasm';
|
|
38
|
-
import { timberAdapterBuild } from './plugins/adapter-build';
|
|
39
|
-
import { timberBuildReport } from './plugins/build-report';
|
|
40
|
-
import { createNoopTimer } from './utils/startup-timer';
|
|
41
|
-
import {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
18
|
+
import { timberContent } from './plugins/content.ts';
|
|
19
|
+
import { timberDevServer } from './plugins/dev-server.ts';
|
|
20
|
+
import { timberEntries } from './plugins/entries.ts';
|
|
21
|
+
import { timberMdx } from './plugins/mdx.ts';
|
|
22
|
+
import { timberRouting } from './plugins/routing.ts';
|
|
23
|
+
import { timberShims } from './plugins/shims.ts';
|
|
24
|
+
import { timberFonts } from './plugins/fonts.ts';
|
|
25
|
+
import { timberStaticBuild } from './plugins/static-build.ts';
|
|
26
|
+
import { timberBuildManifest } from './plugins/build-manifest.ts';
|
|
27
|
+
import { timberDevLogs, originalConsole, wrapLoggerWithOriginalConsole } from './dev-tools/logs.ts';
|
|
28
|
+
import { resolveForwardConsole } from './dev-tools/browser-logs.ts';
|
|
29
|
+
import { timberReactProd } from './plugins/react-prod.ts';
|
|
30
|
+
import { timberChunks } from './plugins/chunks.ts';
|
|
31
|
+
import { clientChunkGroup } from './plugins/client-chunks.ts';
|
|
32
|
+
import { timberServerBundle } from './plugins/server-bundle.ts';
|
|
33
|
+
import { timberCacheTransform } from './plugins/cache.ts';
|
|
34
|
+
import { timberRequestDep } from './plugins/request-dep/index.ts';
|
|
35
|
+
import { timberPrebuilt } from './plugins/prebuilt.ts';
|
|
36
|
+
import { timberPrerenderSugar } from './plugins/prerender-sugar.ts';
|
|
37
|
+
import { timberCloudflareWasm } from './plugins/cloudflare-wasm.ts';
|
|
38
|
+
import { timberAdapterBuild } from './plugins/adapter-build.ts';
|
|
39
|
+
import { timberBuildReport } from './plugins/build-report.ts';
|
|
40
|
+
import { createNoopTimer } from './utils/startup-timer.ts';
|
|
41
|
+
import {
|
|
42
|
+
validateConfig,
|
|
43
|
+
formatConfigErrors,
|
|
44
|
+
checkPeerDependencies,
|
|
45
|
+
formatMissingPeers,
|
|
46
|
+
} from './config-validation.ts';
|
|
47
|
+
import {
|
|
48
|
+
resolveEncryptionKeyExpression,
|
|
49
|
+
shouldEnableEncryption,
|
|
50
|
+
} from './server/action-encryption.ts';
|
|
51
|
+
import { createHoldingServer } from './dev-tools/holding-server.ts';
|
|
52
|
+
import { resolveStartPort, startDevServerPort } from './server/port-resolution.ts';
|
|
53
|
+
import type { TimberUserConfig } from './config-types.ts';
|
|
54
|
+
import type { PluginContext, TimberPluginApi } from './plugin-context.ts';
|
|
46
55
|
import {
|
|
47
56
|
createPluginContext,
|
|
48
57
|
loadTimberConfigFile,
|
|
@@ -50,11 +59,11 @@ import {
|
|
|
50
59
|
resolveAppDir,
|
|
51
60
|
resolveClientJavascript,
|
|
52
61
|
resolveBuildDir,
|
|
53
|
-
} from './plugin-context.
|
|
62
|
+
} from './plugin-context.ts';
|
|
54
63
|
|
|
55
64
|
// ── Public API ────────────────────────────────────────────────────────────
|
|
56
65
|
|
|
57
|
-
export type { TimberUserConfig } from './config-types.
|
|
66
|
+
export type { TimberUserConfig } from './config-types.ts';
|
|
58
67
|
|
|
59
68
|
// Metadata route handler types — re-exported so user-authored metadata
|
|
60
69
|
// route files (sitemap.ts, robots.ts, manifest.ts, icon.tsx, etc.) can
|
|
@@ -62,7 +71,7 @@ export type { TimberUserConfig } from './config-types.js';
|
|
|
62
71
|
// The canonical location for these types is '@timber-js/app/server'; this
|
|
63
72
|
// root re-export is a convenience for typed metadata route handlers.
|
|
64
73
|
// See design/16-metadata.md §"Metadata Routes".
|
|
65
|
-
export type { Metadata, MetadataRoute, MetadataHandler, MetadataResult } from './server/types.
|
|
74
|
+
export type { Metadata, MetadataRoute, MetadataHandler, MetadataResult } from './server/types.ts';
|
|
66
75
|
|
|
67
76
|
/**
|
|
68
77
|
* Route map interface — augmented by the generated timber-routes.d.ts.
|
|
@@ -338,7 +347,12 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
338
347
|
// See design/21-dev-server.md §"Default Port and Auto-Bump".
|
|
339
348
|
let resolvedDevPort: number | null = null;
|
|
340
349
|
let resolvedDevPortExplicit = false;
|
|
341
|
-
|
|
350
|
+
// Middleware-mode embeddings (the analyze crawl, custom servers)
|
|
351
|
+
// never bind a port, and the dev-server plugin's listen() handoff
|
|
352
|
+
// that closes the holding server never runs — starting it would
|
|
353
|
+
// occupy the default port for the embedding's lifetime.
|
|
354
|
+
const isMiddlewareMode = Boolean(userConfig.server?.middlewareMode);
|
|
355
|
+
if (command === 'serve' && !isPreview && !isMiddlewareMode) {
|
|
342
356
|
ctx.holdingServer = createHoldingServer();
|
|
343
357
|
const holdingRef = ctx.holdingServer;
|
|
344
358
|
const result = await startDevServerPort({
|
|
@@ -513,11 +527,6 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
|
|
|
513
527
|
// Validate config and check peer dependencies at startup.
|
|
514
528
|
// Errors are logged to stderr but don't block startup — Vite may
|
|
515
529
|
// still work partially, and the errors guide the user to fix things.
|
|
516
|
-
/* eslint-disable no-var-requires -- sync require for startup validation */
|
|
517
|
-
const { validateConfig, formatConfigErrors, checkPeerDependencies, formatMissingPeers } =
|
|
518
|
-
require('./config-validation.js') as typeof import('./config-validation.js');
|
|
519
|
-
/* eslint-enable no-var-requires */
|
|
520
|
-
|
|
521
530
|
const configErrors = validateConfig(ctx.config);
|
|
522
531
|
if (configErrors.length > 0) {
|
|
523
532
|
process.stderr.write(`${formatConfigErrors(configErrors)}\n\n`);
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
* Design doc: design/41-global-params.md
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import type { Codec, CatchAllCodec, OptionalCatchAllCodec } from '../codec.
|
|
12
|
-
import type { StandardSchemaV1 } from '../schema-bridge.
|
|
11
|
+
import type { Codec, CatchAllCodec, OptionalCatchAllCodec } from '../codec.ts';
|
|
12
|
+
import type { StandardSchemaV1 } from '../schema-bridge.ts';
|
|
13
13
|
|
|
14
14
|
// ---------------------------------------------------------------------------
|
|
15
15
|
// Types
|
package/src/params/index.ts
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
//
|
|
6
6
|
// See design/41-global-params.md
|
|
7
7
|
|
|
8
|
-
export { defineSchema } from './define-schema.
|
|
8
|
+
export { defineSchema } from './define-schema.ts';
|
|
9
9
|
export type {
|
|
10
10
|
InferCodecType,
|
|
11
11
|
SchemaConfig,
|
|
12
12
|
SegmentParamCodec,
|
|
13
13
|
ValidDynamicSegmentKeys,
|
|
14
14
|
ValidDynamicSegmentKeysRegistry,
|
|
15
|
-
} from './define-schema.
|
|
16
|
-
export { resolveSchemaCodecs, toBracketKey } from './resolve-schema.
|
|
17
|
-
export { setLinkCodecs, getLinkCodec } from './codec-registry.
|
|
15
|
+
} from './define-schema.ts';
|
|
16
|
+
export { resolveSchemaCodecs, toBracketKey } from './resolve-schema.ts';
|
|
17
|
+
export { setLinkCodecs, getLinkCodec } from './codec-registry.ts';
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
* Design doc: design/41-global-params.md §Pipeline Integration
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import type { Codec } from '../codec.
|
|
13
|
-
import { isCodec, resolveCodecOrSchema } from '../schema-bridge.
|
|
12
|
+
import type { Codec } from '../codec.ts';
|
|
13
|
+
import { isCodec, resolveCodecOrSchema } from '../schema-bridge.ts';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Reconstruct the bracket key for a segment from its type and param name.
|
package/src/plugin-context.ts
CHANGED
|
@@ -12,18 +12,18 @@ import { existsSync } from 'node:fs';
|
|
|
12
12
|
import { join, resolve } from 'node:path';
|
|
13
13
|
import { createRequire } from 'node:module';
|
|
14
14
|
import { parseAst } from 'vite';
|
|
15
|
-
import type { RouteTree } from './routing/types';
|
|
16
|
-
import type { BuildManifest } from './server/build-manifest';
|
|
17
|
-
import type { CaptureSummary } from './server/prebuilt-builder';
|
|
18
|
-
import type { StartupTimer } from './utils/startup-timer';
|
|
19
|
-
import { createStartupTimer } from './utils/startup-timer';
|
|
20
|
-
import type { TimberUserConfig, ClientJavascriptConfig } from './config-types.
|
|
21
|
-
import type { RscManifest } from './plugins/static-build.
|
|
22
|
-
import type { HoldingServer } from './dev-tools/holding-server.
|
|
23
|
-
import type { ProgramNode } from './plugins/callsite-ast.
|
|
15
|
+
import type { RouteTree } from './routing/types.ts';
|
|
16
|
+
import type { BuildManifest } from './server/build-manifest.ts';
|
|
17
|
+
import type { CaptureSummary } from './server/prebuilt-builder.ts';
|
|
18
|
+
import type { StartupTimer } from './utils/startup-timer.ts';
|
|
19
|
+
import { createStartupTimer } from './utils/startup-timer.ts';
|
|
20
|
+
import type { TimberUserConfig, ClientJavascriptConfig } from './config-types.ts';
|
|
21
|
+
import type { RscManifest } from './plugins/static-build.ts';
|
|
22
|
+
import type { HoldingServer } from './dev-tools/holding-server.ts';
|
|
23
|
+
import type { ProgramNode } from './plugins/callsite-ast.ts';
|
|
24
24
|
|
|
25
25
|
// Re-export for sub-plugin convenience — they import from plugin-context.ts
|
|
26
|
-
export type { TimberUserConfig, ClientJavascriptConfig } from './config-types.
|
|
26
|
+
export type { TimberUserConfig, ClientJavascriptConfig } from './config-types.ts';
|
|
27
27
|
|
|
28
28
|
// ── Client JavaScript config ─────────────────────────────────────────────
|
|
29
29
|
|
|
@@ -17,11 +17,11 @@ import type { Plugin } from 'vite';
|
|
|
17
17
|
import { join } from 'node:path';
|
|
18
18
|
import { pathToFileURL } from 'node:url';
|
|
19
19
|
import { readFile, writeFile } from 'node:fs/promises';
|
|
20
|
-
import type { PluginContext } from '../plugin-context.
|
|
21
|
-
import type { TimberPlatformAdapter, TimberConfig } from '../adapters/types.
|
|
22
|
-
import type { BuildManifest } from '../server/build-manifest.
|
|
23
|
-
import { swallow } from '../server/logger.
|
|
24
|
-
import { normalizeBasePath } from '../shared/base-path.
|
|
20
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
21
|
+
import type { TimberPlatformAdapter, TimberConfig } from '../adapters/types.ts';
|
|
22
|
+
import type { BuildManifest } from '../server/build-manifest.ts';
|
|
23
|
+
import { swallow } from '../server/logger.ts';
|
|
24
|
+
import { normalizeBasePath } from '../shared/base-path.ts';
|
|
25
25
|
|
|
26
26
|
export function timberAdapterBuild(ctx: PluginContext): Plugin {
|
|
27
27
|
return {
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
import { randomUUID, createHash } from 'node:crypto';
|
|
20
20
|
import { readFileSync } from 'node:fs';
|
|
21
21
|
import type { Plugin, ResolvedConfig } from 'vite';
|
|
22
|
-
import type { PluginContext } from '../plugin-context.
|
|
23
|
-
import { EMPTY_BUILD_MANIFEST, type BuildManifest } from '../server/build-manifest.
|
|
24
|
-
import type { SegmentNode, RouteFile } from '../routing/types.
|
|
25
|
-
import { isDynamicMetadataExtension } from '../server/metadata-routes.
|
|
22
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
23
|
+
import { EMPTY_BUILD_MANIFEST, type BuildManifest } from '../server/build-manifest.ts';
|
|
24
|
+
import type { SegmentNode, RouteFile } from '../routing/types.ts';
|
|
25
|
+
import { isDynamicMetadataExtension } from '../server/metadata-routes.ts';
|
|
26
26
|
|
|
27
27
|
// Rollup types used by generateBundle hook — imported from vite which re-exports them.
|
|
28
28
|
// We define minimal interfaces here to avoid a direct 'rollup' dependency.
|
|
@@ -17,12 +17,12 @@ import { readFileSync } from 'node:fs';
|
|
|
17
17
|
import { join, relative } from 'node:path';
|
|
18
18
|
import { gzipSync } from 'node:zlib';
|
|
19
19
|
import type { Plugin, Logger } from 'vite';
|
|
20
|
-
import type { PluginContext } from '../plugin-context.
|
|
21
|
-
import type { SegmentNode, RouteTree } from '../routing/types.
|
|
22
|
-
import type { CaptureSummary } from '../server/prebuilt-builder.
|
|
23
|
-
import type { PrebuiltManifest } from '../server/prebuilt/payload-source.
|
|
24
|
-
import { collectLeafRoutes } from '../routing/walkers.
|
|
25
|
-
import { formatSize } from '../utils/format.
|
|
20
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
21
|
+
import type { SegmentNode, RouteTree } from '../routing/types.ts';
|
|
22
|
+
import type { CaptureSummary } from '../server/prebuilt-builder.ts';
|
|
23
|
+
import type { PrebuiltManifest } from '../server/prebuilt/payload-source.ts';
|
|
24
|
+
import { collectLeafRoutes } from '../routing/walkers.ts';
|
|
25
|
+
import { formatSize } from '../utils/format.ts';
|
|
26
26
|
|
|
27
27
|
// ─── Public types ─────────────────────────────────────────────────────────
|
|
28
28
|
|
package/src/plugins/cache.ts
CHANGED
|
@@ -56,14 +56,14 @@
|
|
|
56
56
|
import { relative } from 'node:path';
|
|
57
57
|
import MagicString from 'magic-string';
|
|
58
58
|
import type { Plugin } from 'vite';
|
|
59
|
-
import type { PluginContext } from '../plugin-context.
|
|
59
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
60
60
|
import {
|
|
61
61
|
CACHE_MODULE_SOURCES,
|
|
62
62
|
collectShadowRanges,
|
|
63
63
|
findCallSites,
|
|
64
64
|
findImportBindings,
|
|
65
65
|
generateStableCallsiteId,
|
|
66
|
-
} from './callsite-ast.
|
|
66
|
+
} from './callsite-ast.ts';
|
|
67
67
|
import type {
|
|
68
68
|
CallExpressionNode,
|
|
69
69
|
IdentifierNode,
|
|
@@ -72,7 +72,7 @@ import type {
|
|
|
72
72
|
PositionedNode,
|
|
73
73
|
ProgramNode,
|
|
74
74
|
ShadowRange,
|
|
75
|
-
} from './callsite-ast.
|
|
75
|
+
} from './callsite-ast.ts';
|
|
76
76
|
|
|
77
77
|
/**
|
|
78
78
|
* Is this callee a `cache.data(...)` call? Matches two forms:
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* See TIM-997, TIM-1053, design/06-caching.md §"Cache Key Security".
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { fnv1aHash } from '../cache/fast-hash.
|
|
13
|
+
import { fnv1aHash } from '../cache/fast-hash.ts';
|
|
14
14
|
|
|
15
15
|
/** Module specifiers whose bindings the transforms track. */
|
|
16
16
|
export const CACHE_MODULE_SOURCES = new Set(['@timber-js/app/cache', 'timber/cache']);
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* See design/44-render-at-build-time.md §Props Derivation at Build Time.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import type { PluginContext } from '../plugin-context.
|
|
15
|
-
import type { IdentifierNode, PositionedNode, ProgramNode } from './callsite-ast.
|
|
14
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
15
|
+
import type { IdentifierNode, PositionedNode, ProgramNode } from './callsite-ast.ts';
|
|
16
16
|
|
|
17
17
|
interface JSXElementNode extends PositionedNode {
|
|
18
18
|
type: 'JSXElement';
|
package/src/plugins/chunks.ts
CHANGED
|
@@ -20,7 +20,7 @@ import { basename, resolve, dirname } from 'node:path';
|
|
|
20
20
|
import { createHash } from 'node:crypto';
|
|
21
21
|
import { copyFile, mkdir, readFile } from 'node:fs/promises';
|
|
22
22
|
import type { Plugin, ResolvedConfig } from 'vite';
|
|
23
|
-
import type { PluginContext } from '../plugin-context.
|
|
23
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
24
24
|
|
|
25
25
|
function isCloudflareAdapter(ctx: PluginContext): boolean {
|
|
26
26
|
const adapter = ctx.config.adapter as { name?: string } | undefined;
|
package/src/plugins/content.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import type { Plugin } from 'vite';
|
|
12
12
|
import { existsSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
|
-
import type { PluginContext } from '../plugin-context.
|
|
14
|
+
import type { PluginContext } from '../plugin-context.ts';
|
|
15
15
|
|
|
16
16
|
const CONFIG_FILE_NAMES = [
|
|
17
17
|
'content-collections.ts',
|
|
@@ -127,6 +127,10 @@ export function timberContent(ctx: PluginContext): Plugin {
|
|
|
127
127
|
},
|
|
128
128
|
|
|
129
129
|
async configureServer(server) {
|
|
130
|
+
// The analyze crawl child must not start content-collections'
|
|
131
|
+
// file watcher — it outlives server.close() and holds the
|
|
132
|
+
// process open (the child relies on process.exit to clean up).
|
|
133
|
+
if (process.env.TIMBER_ANALYZE === '1') return;
|
|
130
134
|
if (!innerPlugin) return;
|
|
131
135
|
if (typeof innerPlugin.configureServer === 'function') {
|
|
132
136
|
await (innerPlugin.configureServer as (...args: unknown[]) => unknown).call(this, server);
|
|
@@ -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
|
+
}
|