@timber-js/app 0.2.0-alpha.18 → 0.2.0-alpha.180
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/agent-skill.md +344 -0
- package/dist/_chunks/actions-O_LsyCE4.js +317 -0
- package/dist/_chunks/actions-O_LsyCE4.js.map +1 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js +1202 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js.map +1 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js +248 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js +688 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js.map +1 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js +1188 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-COtkxMRT.js +191 -0
- package/dist/_chunks/define-COtkxMRT.js.map +1 -0
- package/dist/_chunks/define-c4au4I9R.js +82 -0
- package/dist/_chunks/define-c4au4I9R.js.map +1 -0
- package/dist/_chunks/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/logger-AWfuX-KJ.js +1468 -0
- package/dist/_chunks/logger-AWfuX-KJ.js.map +1 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
- package/dist/_chunks/plugin-context---kTF5v8.js +315 -0
- package/dist/_chunks/plugin-context---kTF5v8.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.js +50 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +119 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +1 -0
- package/dist/_chunks/segment-classify-Byy425ng.js +176 -0
- package/dist/_chunks/segment-classify-Byy425ng.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-DFvWd-EA.js} +71 -26
- package/dist/_chunks/use-query-states-DFvWd-EA.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/walkers-BtTlKviE.js +1002 -0
- package/dist/_chunks/walkers-BtTlKviE.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +29 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +124 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +189 -21
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +5 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +41 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +224 -172
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +6 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +2 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/cache-api.d.ts +48 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +31 -8
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +140 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +19 -2
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +52 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +16 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +35 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +113 -34
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +29 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +27 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +47 -10
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +21 -6
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +185 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +887 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +3 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +119 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +99 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +48 -15
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +26 -7
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +57 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +12 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +284 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +257 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +110 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +4 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +177 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9243 -14093
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +217 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +43 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +28 -4
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +42 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep.d.ts +21 -0
- package/dist/plugins/request-dep.d.ts.map +1 -0
- 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 +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +64 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +56 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/interception.d.ts +0 -5
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +32 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +81 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +81 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +91 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +188 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +42 -7
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +93 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +12 -29
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +117 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +242 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +82 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +11 -47
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +182 -2906
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +49 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3892 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata.d.ts +8 -0
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +119 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +59 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +140 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +62 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +23 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +78 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +120 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +88 -43
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +25 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +53 -25
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +69 -37
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +28 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +6 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +25 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +36 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +66 -5
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +72 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +22 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +44 -9
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +69 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +15 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +35 -11
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +233 -0
- package/docs/api/31-api-client.mdx +161 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +154 -0
- package/docs/api/34-api-config.mdx +325 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/03b-access-control.mdx +130 -0
- package/docs/learn/04-loading-states.mdx +67 -0
- package/docs/learn/04b-the-flush-point.mdx +115 -0
- package/docs/learn/05-typed-params.mdx +275 -0
- package/docs/learn/06-forms-and-actions.mdx +146 -0
- package/docs/learn/07-typed-routes.mdx +127 -0
- package/docs/learn/08-streaming.mdx +146 -0
- package/docs/learn/09-caching.mdx +252 -0
- package/docs/learn/10-middleware.mdx +157 -0
- package/docs/learn/11-error-handling.mdx +156 -0
- package/docs/learn/12-client-navigation.mdx +176 -0
- package/docs/learn/13-configuration.mdx +162 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +173 -0
- package/docs/more/02-advanced-forms.mdx +137 -0
- package/docs/more/03-coming-from-nextjs.mdx +186 -0
- package/docs/more/04-metadata-and-fonts.mdx +193 -0
- package/docs/more/04b-mdx.mdx +209 -0
- package/docs/more/05-content-collections.mdx +90 -0
- package/docs/more/06-instrumentation.mdx +214 -0
- package/docs/more/07-security.mdx +129 -0
- package/docs/more/08-developer-experience.mdx +134 -0
- package/docs/more/40-why-timber.mdx +50 -0
- package/docs/more/41-timber-vs-nextjs.mdx +81 -0
- package/docs/more/42-timber-vs-others.mdx +68 -0
- package/docs/more/50-ai-agent-instructions.mdx +169 -0
- package/llms.txt +55 -0
- package/package.json +105 -26
- package/src/adapters/build-output-helper.ts +199 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +204 -0
- package/src/adapters/cloudflare.ts +620 -129
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +266 -122
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/types.ts +2 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +114 -21
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +197 -19
- package/src/cache/singleflight.ts +64 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +237 -0
- package/src/cache/timber-cache.ts +161 -36
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +17 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +30 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +167 -34
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +124 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +187 -0
- package/src/client/browser-entry/index.ts +113 -0
- package/src/client/browser-entry/post-hydration.ts +110 -0
- package/src/client/browser-entry/router-init.ts +286 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +127 -22
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +21 -6
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +349 -150
- package/src/client/navigation-api.ts +345 -0
- package/src/client/navigation-context.ts +15 -7
- package/src/client/navigation-root.tsx +355 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +565 -212
- package/src/client/rsc-fetch.ts +215 -34
- package/src/client/segment-cache.ts +91 -17
- package/src/client/segment-outlet.tsx +141 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +60 -15
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +108 -10
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +31 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +149 -0
- package/src/config-types.ts +282 -0
- package/src/config-validation.ts +330 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +217 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +477 -126
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +100 -18
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +446 -352
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +432 -0
- package/src/plugins/adapter-build.ts +220 -7
- package/src/plugins/build-manifest.ts +177 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +284 -94
- package/src/plugins/entries.ts +134 -16
- package/src/plugins/fonts.ts +225 -660
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +328 -0
- package/src/plugins/request-dep.ts +458 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +89 -12
- package/src/plugins/shims.ts +241 -64
- package/src/plugins/static-build.ts +15 -90
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +372 -178
- package/src/routing/convention-lint.ts +394 -0
- package/src/routing/export-detect.ts +304 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +3 -22
- package/src/routing/link-codegen.ts +313 -0
- package/src/routing/manifest-codegen.ts +287 -0
- package/src/routing/scanner.ts +338 -189
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +223 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +82 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/schema-bridge.ts +253 -0
- package/src/search-params/define.ts +576 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +101 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +111 -34
- package/src/server/action-client.ts +120 -29
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +48 -54
- package/src/server/als-registry.ts +137 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +19 -56
- package/src/server/canonicalize.ts +6 -3
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +34 -7
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +314 -0
- package/src/server/deny-renderer.ts +85 -77
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +37 -27
- package/src/server/error-boundary-wrapper.ts +61 -22
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/html-injector-core.ts +495 -0
- package/src/server/html-injectors.ts +271 -254
- package/src/server/index.ts +31 -185
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata.ts +21 -0
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +336 -0
- package/src/server/param-coercion.ts +207 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +45 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +545 -0
- package/src/server/pipeline.ts +274 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +298 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +53 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +201 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +809 -0
- package/src/server/prebuilt-runtime.ts +815 -0
- package/src/server/primitives.ts +160 -83
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +170 -337
- package/src/server/request-dep.ts +37 -0
- package/src/server/route-element-builder.ts +699 -295
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +158 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/deny-fallback.ts +92 -0
- package/src/server/rsc-entry/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +210 -85
- package/src/server/rsc-entry/index.ts +332 -332
- package/src/server/rsc-entry/render-route.ts +300 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +102 -42
- package/src/server/rsc-entry/rsc-stream.ts +93 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +275 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/sitemap-generator.ts +345 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +574 -250
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -86
- package/src/server/ssr-render.ts +345 -86
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +177 -30
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +288 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +214 -90
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +51 -29
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js +0 -153
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `timber schema sync` — scan filesystem for dynamic segments, append
|
|
3
|
+
* missing entries with `codec.string` defaults, and remove stale entries
|
|
4
|
+
* whose segments no longer exist in the filesystem.
|
|
5
|
+
*
|
|
6
|
+
* Design doc: design/41-global-params.md §Auto-Scaffolding
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { scanRoutes } from './routing/scanner.js';
|
|
12
|
+
import type { SegmentNode } from './routing/types.js';
|
|
13
|
+
import { resolveAppDir } from './plugin-context.js';
|
|
14
|
+
|
|
15
|
+
function toBracketKey(node: SegmentNode): string {
|
|
16
|
+
if (node.paramPrefix || node.paramSuffix) return `[${node.paramName}]`;
|
|
17
|
+
switch (node.segmentType) {
|
|
18
|
+
case 'catch-all':
|
|
19
|
+
return `[...${node.paramName}]`;
|
|
20
|
+
case 'optional-catch-all':
|
|
21
|
+
return `[[...${node.paramName}]]`;
|
|
22
|
+
default:
|
|
23
|
+
return `[${node.paramName}]`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Collect all unique bracket-keyed dynamic segment names from the route tree.
|
|
29
|
+
* Returns entries like '[artistSlug]', '[...slug]', '[[...topic]]'.
|
|
30
|
+
*/
|
|
31
|
+
export function collectDynamicSegments(appDir: string): string[] {
|
|
32
|
+
const tree = scanRoutes(appDir);
|
|
33
|
+
const segments = new Set<string>();
|
|
34
|
+
walkSegments(tree.root, segments);
|
|
35
|
+
return [...segments].sort();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function walkSegments(node: SegmentNode, segments: Set<string>): void {
|
|
39
|
+
if (node.paramName) {
|
|
40
|
+
// Use bare bracket form for schema keys — affixed segments like
|
|
41
|
+
// `img-[id].png` register as `[id]`, matching runtime codec lookup.
|
|
42
|
+
segments.add(toBracketKey(node));
|
|
43
|
+
}
|
|
44
|
+
for (const child of node.children) {
|
|
45
|
+
walkSegments(child, segments);
|
|
46
|
+
}
|
|
47
|
+
for (const slot of Object.values(node.slots)) {
|
|
48
|
+
walkSegments(slot, segments);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Replace comment bodies (and optionally string contents) with spaces,
|
|
54
|
+
* preserving length and newlines so every index maps 1:1 to the original.
|
|
55
|
+
* Lets the structural scanning below ignore `segmentParams` mentions and
|
|
56
|
+
* braces inside comments/strings without a TS parser (fine pre-alpha,
|
|
57
|
+
* see TIM-1066).
|
|
58
|
+
*
|
|
59
|
+
* With `maskStrings`, string contents are blanked too — except literal
|
|
60
|
+
* 'segmentParams' strings, kept so a quoted property key stays findable.
|
|
61
|
+
*/
|
|
62
|
+
function maskSource(content: string, maskStrings: boolean): string {
|
|
63
|
+
const out = content.split('');
|
|
64
|
+
const n = content.length;
|
|
65
|
+
let i = 0;
|
|
66
|
+
|
|
67
|
+
const blank = (from: number, to: number): void => {
|
|
68
|
+
for (let j = from; j < to; j++) {
|
|
69
|
+
if (content[j] !== '\n') out[j] = ' ';
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
while (i < n) {
|
|
74
|
+
const ch = content[i];
|
|
75
|
+
const next = content[i + 1];
|
|
76
|
+
if (ch === '/' && next === '/') {
|
|
77
|
+
const start = i;
|
|
78
|
+
while (i < n && content[i] !== '\n') i++;
|
|
79
|
+
blank(start, i);
|
|
80
|
+
} else if (ch === '/' && next === '*') {
|
|
81
|
+
const start = i;
|
|
82
|
+
i += 2;
|
|
83
|
+
while (i < n && !(content[i] === '*' && content[i + 1] === '/')) i++;
|
|
84
|
+
i = Math.min(i + 2, n);
|
|
85
|
+
blank(start, i);
|
|
86
|
+
} else if (ch === '"' || ch === "'" || ch === '`') {
|
|
87
|
+
const start = i;
|
|
88
|
+
i++;
|
|
89
|
+
while (i < n && content[i] !== ch) {
|
|
90
|
+
if (content[i] === '\\') i++;
|
|
91
|
+
i++;
|
|
92
|
+
}
|
|
93
|
+
const end = i; // at closing quote (or n if unterminated)
|
|
94
|
+
if (maskStrings && content.slice(start + 1, end) !== 'segmentParams') {
|
|
95
|
+
blank(start + 1, end);
|
|
96
|
+
}
|
|
97
|
+
i++;
|
|
98
|
+
} else {
|
|
99
|
+
i++;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return out.join('');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Locate the `segmentParams: { ... }` block in a schema file.
|
|
107
|
+
* Returns the indices of the opening and matching closing brace, or null
|
|
108
|
+
* if no segmentParams property is found. Comments and strings are masked
|
|
109
|
+
* first, so a JSDoc example mentioning `segmentParams: { ... }` above the
|
|
110
|
+
* real defineSchema call is not mistaken for the block, and braces inside
|
|
111
|
+
* comments/strings don't skew the depth count. The search is anchored to
|
|
112
|
+
* the `defineSchema(` call when present, so helper objects with their own
|
|
113
|
+
* segmentParams property earlier in the file are skipped.
|
|
114
|
+
*/
|
|
115
|
+
export function findSegmentParamsBlock(
|
|
116
|
+
content: string
|
|
117
|
+
): { openBrace: number; closeBrace: number } | null {
|
|
118
|
+
const masked = maskSource(content, true);
|
|
119
|
+
|
|
120
|
+
const defineCall = /\bdefineSchema\s*\(/.exec(masked);
|
|
121
|
+
const keyRe = /(['"]?)segmentParams\1\s*:\s*\{/g;
|
|
122
|
+
keyRe.lastIndex = defineCall ? defineCall.index + defineCall[0].length : 0;
|
|
123
|
+
const keyMatch = keyRe.exec(masked);
|
|
124
|
+
if (!keyMatch) return null;
|
|
125
|
+
|
|
126
|
+
const openBrace = keyMatch.index + keyMatch[0].length - 1;
|
|
127
|
+
let depth = 1;
|
|
128
|
+
let i = openBrace + 1;
|
|
129
|
+
while (i < masked.length && depth > 0) {
|
|
130
|
+
if (masked[i] === '{') depth++;
|
|
131
|
+
else if (masked[i] === '}') depth--;
|
|
132
|
+
i++;
|
|
133
|
+
}
|
|
134
|
+
if (depth > 0) return null;
|
|
135
|
+
// i now points to just after the closing brace
|
|
136
|
+
return { openBrace, closeBrace: i - 1 };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Parse existing bracket keys from an app/schema.ts file.
|
|
141
|
+
* Scoped to the segmentParams: { ... } block — bracket keys elsewhere in
|
|
142
|
+
* the file (unrelated objects, comments above defineSchema) are ignored.
|
|
143
|
+
* Comments inside the block are masked, so a commented-out entry does not
|
|
144
|
+
* count as registered.
|
|
145
|
+
*
|
|
146
|
+
* The key charset matches the route classifier (segment-classify.ts):
|
|
147
|
+
* any character except `]`, so hyphenated params like '[my-param]' parse.
|
|
148
|
+
*/
|
|
149
|
+
export function parseExistingSchemaKeys(content: string): string[] {
|
|
150
|
+
const block = findSegmentParamsBlock(content);
|
|
151
|
+
if (!block) return [];
|
|
152
|
+
|
|
153
|
+
const blockContent = maskSource(content, false).slice(block.openBrace, block.closeBrace);
|
|
154
|
+
const keys: string[] = [];
|
|
155
|
+
// Match quoted bracket keys like '[artistSlug]', '[...slug]', '[[...topic]]'
|
|
156
|
+
const re = /['"](\[{1,2}(?:\.{3})?[^\]]+\]{1,2})['"]\s*:/g;
|
|
157
|
+
let m: RegExpExecArray | null;
|
|
158
|
+
while ((m = re.exec(blockContent)) !== null) {
|
|
159
|
+
keys.push(m[1]);
|
|
160
|
+
}
|
|
161
|
+
return keys;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Schema file extensions to check. */
|
|
165
|
+
const SCHEMA_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Find the schema file path if it exists.
|
|
169
|
+
*/
|
|
170
|
+
export function findSchemaFile(appDir: string): string | undefined {
|
|
171
|
+
for (const ext of SCHEMA_EXTENSIONS) {
|
|
172
|
+
const p = join(appDir, `schema${ext}`);
|
|
173
|
+
if (existsSync(p)) return p;
|
|
174
|
+
}
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function defaultCodecForSegment(seg: string): string {
|
|
179
|
+
if (seg.startsWith('[[...')) return 'codec.optionalCatchAll(codec.string)';
|
|
180
|
+
if (seg.startsWith('[...')) return 'codec.stringArray';
|
|
181
|
+
return 'codec.string';
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Generate the content for a new app/schema.ts with the given segment keys.
|
|
186
|
+
*/
|
|
187
|
+
function generateNewSchema(segments: string[]): string {
|
|
188
|
+
const lines: string[] = [];
|
|
189
|
+
lines.push("import { defineSchema } from '@timber-js/app/params';");
|
|
190
|
+
lines.push("import { codec } from '@timber-js/app/codec';");
|
|
191
|
+
lines.push('');
|
|
192
|
+
lines.push('export default defineSchema({');
|
|
193
|
+
lines.push(' segmentParams: {');
|
|
194
|
+
for (const seg of segments) {
|
|
195
|
+
lines.push(` '${seg}': ${defaultCodecForSegment(seg)},`);
|
|
196
|
+
}
|
|
197
|
+
lines.push(' },');
|
|
198
|
+
lines.push('});');
|
|
199
|
+
lines.push('');
|
|
200
|
+
return lines.join('\n');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Append missing segment entries to an existing schema file.
|
|
205
|
+
* Inserts new entries before the closing `}` of segmentParams.
|
|
206
|
+
*/
|
|
207
|
+
const CODEC_IMPORT = "import { codec } from '@timber-js/app/codec';";
|
|
208
|
+
|
|
209
|
+
function hasCodecImport(content: string): boolean {
|
|
210
|
+
return /import\s+\{[^}]*\bcodec\b[^}]*\}\s+from\s+['"]@timber-js\/app\/codec['"]/.test(content);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function ensureCodecImport(content: string): string {
|
|
214
|
+
if (hasCodecImport(content)) return content;
|
|
215
|
+
|
|
216
|
+
// Insert after the last existing import statement
|
|
217
|
+
const lines = content.split('\n');
|
|
218
|
+
let lastImportIndex = -1;
|
|
219
|
+
for (let i = 0; i < lines.length; i++) {
|
|
220
|
+
if (/^\s*import\s/.test(lines[i])) lastImportIndex = i;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (lastImportIndex === -1) {
|
|
224
|
+
return CODEC_IMPORT + '\n' + content;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
lines.splice(lastImportIndex + 1, 0, CODEC_IMPORT);
|
|
228
|
+
return lines.join('\n');
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function appendToSchema(content: string, newSegments: string[]): string {
|
|
232
|
+
content = ensureCodecImport(content);
|
|
233
|
+
|
|
234
|
+
const block = findSegmentParamsBlock(content);
|
|
235
|
+
if (!block) {
|
|
236
|
+
throw new Error(
|
|
237
|
+
'[timber] Could not find segmentParams in schema file. ' +
|
|
238
|
+
'Expected a defineSchema({ segmentParams: { ... } }) call.'
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
const { openBrace, closeBrace } = block;
|
|
242
|
+
|
|
243
|
+
// Detect indentation from existing entries
|
|
244
|
+
const existingLine = content.slice(openBrace, closeBrace).match(/^(\s+)['"]\[/m);
|
|
245
|
+
const indent = existingLine ? existingLine[1] : ' ';
|
|
246
|
+
|
|
247
|
+
// Build insertion text
|
|
248
|
+
const insertion = newSegments
|
|
249
|
+
.map((seg) => `${indent}'${seg}': ${defaultCodecForSegment(seg)},`)
|
|
250
|
+
.join('\n');
|
|
251
|
+
|
|
252
|
+
// Insert before the closing brace
|
|
253
|
+
const before = content.slice(0, closeBrace);
|
|
254
|
+
const after = content.slice(closeBrace);
|
|
255
|
+
|
|
256
|
+
// Add newline if the content before doesn't end with one
|
|
257
|
+
const separator = before.trimEnd().endsWith(',') ? '\n' : '\n';
|
|
258
|
+
|
|
259
|
+
return before + separator + insertion + '\n' + after;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Remove entries from the segmentParams block whose keys match `staleSegments`.
|
|
264
|
+
* Removes the entire entry including trailing comma/whitespace. Scoped to
|
|
265
|
+
* the segmentParams block — identical keys in unrelated objects elsewhere
|
|
266
|
+
* in the file are left untouched.
|
|
267
|
+
*/
|
|
268
|
+
function removeFromSchema(content: string, staleSegments: string[]): string {
|
|
269
|
+
const block = findSegmentParamsBlock(content);
|
|
270
|
+
if (!block) return content;
|
|
271
|
+
|
|
272
|
+
let blockContent = content.slice(block.openBrace, block.closeBrace);
|
|
273
|
+
// Key matching and the entry walk run on a comment-masked copy (same
|
|
274
|
+
// length, indices align) so commented-out entries are never removed.
|
|
275
|
+
// Both copies are spliced in sync to keep indices valid.
|
|
276
|
+
let blockMasked = maskSource(blockContent, false);
|
|
277
|
+
|
|
278
|
+
for (const seg of staleSegments) {
|
|
279
|
+
const escaped = seg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
280
|
+
const keyRe = new RegExp(`^[ \t]*['"]${escaped}['"][ \t]*:`, 'gm');
|
|
281
|
+
let m: RegExpExecArray | null;
|
|
282
|
+
while ((m = keyRe.exec(blockMasked)) !== null) {
|
|
283
|
+
const start = m.index;
|
|
284
|
+
let i = m.index + m[0].length;
|
|
285
|
+
let depth = 0;
|
|
286
|
+
let inString: string | null = null;
|
|
287
|
+
|
|
288
|
+
while (i < blockMasked.length) {
|
|
289
|
+
const ch = blockMasked[i];
|
|
290
|
+
if (inString) {
|
|
291
|
+
if (ch === '\\') {
|
|
292
|
+
i++;
|
|
293
|
+
} else if (ch === inString) {
|
|
294
|
+
inString = null;
|
|
295
|
+
}
|
|
296
|
+
} else if (ch === '"' || ch === "'" || ch === '`') {
|
|
297
|
+
inString = ch;
|
|
298
|
+
} else if (ch === '(' || ch === '{' || ch === '[') {
|
|
299
|
+
depth++;
|
|
300
|
+
} else if (ch === ')' || ch === '}' || ch === ']') {
|
|
301
|
+
depth--;
|
|
302
|
+
} else if (depth === 0 && ch === ',') {
|
|
303
|
+
i++;
|
|
304
|
+
break;
|
|
305
|
+
} else if (depth === 0 && (ch === '\n' || ch === '}')) {
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
i++;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Consume trailing newline
|
|
312
|
+
if (i < blockMasked.length && blockMasked[i] === '\n') i++;
|
|
313
|
+
|
|
314
|
+
blockContent = blockContent.slice(0, start) + blockContent.slice(i);
|
|
315
|
+
blockMasked = blockMasked.slice(0, start) + blockMasked.slice(i);
|
|
316
|
+
keyRe.lastIndex = start;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
return content.slice(0, block.openBrace) + blockContent + content.slice(block.closeBrace);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export interface SchemaSyncResult {
|
|
324
|
+
/** Segments found in the filesystem. */
|
|
325
|
+
filesystemSegments: string[];
|
|
326
|
+
/** Segments already defined in app/schema.ts. */
|
|
327
|
+
existingSegments: string[];
|
|
328
|
+
/** Segments that were added. */
|
|
329
|
+
addedSegments: string[];
|
|
330
|
+
/** Segments that were removed (no longer in filesystem). */
|
|
331
|
+
removedSegments: string[];
|
|
332
|
+
/** Whether a new schema file was created. */
|
|
333
|
+
created: boolean;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Run the schema sync: scan filesystem, diff against schema, append missing.
|
|
338
|
+
*/
|
|
339
|
+
export function runSchemaSync(projectRoot: string): SchemaSyncResult {
|
|
340
|
+
const appDir = resolveAppDir(projectRoot);
|
|
341
|
+
|
|
342
|
+
const filesystemSegments = collectDynamicSegments(appDir);
|
|
343
|
+
|
|
344
|
+
const schemaPath = findSchemaFile(appDir);
|
|
345
|
+
|
|
346
|
+
if (filesystemSegments.length === 0 && !schemaPath) {
|
|
347
|
+
return {
|
|
348
|
+
filesystemSegments: [],
|
|
349
|
+
existingSegments: [],
|
|
350
|
+
addedSegments: [],
|
|
351
|
+
removedSegments: [],
|
|
352
|
+
created: false,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (!schemaPath) {
|
|
357
|
+
// Create new schema file
|
|
358
|
+
const newPath = join(appDir, 'schema.ts');
|
|
359
|
+
writeFileSync(newPath, generateNewSchema(filesystemSegments), 'utf-8');
|
|
360
|
+
return {
|
|
361
|
+
filesystemSegments,
|
|
362
|
+
existingSegments: [],
|
|
363
|
+
addedSegments: filesystemSegments,
|
|
364
|
+
removedSegments: [],
|
|
365
|
+
created: true,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Read existing schema and diff
|
|
370
|
+
const content = readFileSync(schemaPath, 'utf-8');
|
|
371
|
+
const existingSegments = parseExistingSchemaKeys(content);
|
|
372
|
+
const missing = filesystemSegments.filter((seg) => !existingSegments.includes(seg));
|
|
373
|
+
const stale = existingSegments.filter((seg) => !filesystemSegments.includes(seg));
|
|
374
|
+
|
|
375
|
+
if (missing.length === 0 && stale.length === 0) {
|
|
376
|
+
return {
|
|
377
|
+
filesystemSegments,
|
|
378
|
+
existingSegments,
|
|
379
|
+
addedSegments: [],
|
|
380
|
+
removedSegments: [],
|
|
381
|
+
created: false,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
let updated = content;
|
|
386
|
+
if (stale.length > 0) {
|
|
387
|
+
updated = removeFromSchema(updated, stale);
|
|
388
|
+
}
|
|
389
|
+
if (missing.length > 0) {
|
|
390
|
+
updated = appendToSchema(updated, missing);
|
|
391
|
+
}
|
|
392
|
+
writeFileSync(schemaPath, updated, 'utf-8');
|
|
393
|
+
|
|
394
|
+
return {
|
|
395
|
+
filesystemSegments,
|
|
396
|
+
existingSegments,
|
|
397
|
+
addedSegments: missing,
|
|
398
|
+
removedSegments: stale,
|
|
399
|
+
created: false,
|
|
400
|
+
};
|
|
401
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -11,12 +11,14 @@
|
|
|
11
11
|
// timber preview — Serve the production build
|
|
12
12
|
// timber check — Validate types + routes without building
|
|
13
13
|
|
|
14
|
-
const COMMANDS = ['dev', 'build', 'preview', 'check'] as const;
|
|
14
|
+
const COMMANDS = ['dev', 'build', 'preview', 'check', 'schema', 'init'] as const;
|
|
15
15
|
type Command = (typeof COMMANDS)[number];
|
|
16
16
|
|
|
17
17
|
export interface ParsedArgs {
|
|
18
18
|
command: Command;
|
|
19
19
|
config: string | undefined;
|
|
20
|
+
/** Positional arguments after the command (used by `timber schema sync`). */
|
|
21
|
+
rest: string[];
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
export interface CommandOptions {
|
|
@@ -26,11 +28,16 @@ export interface CommandOptions {
|
|
|
26
28
|
/**
|
|
27
29
|
* Parse CLI arguments into a structured command + options.
|
|
28
30
|
* Accepts: timber <command> [--config|-c <path>]
|
|
31
|
+
*
|
|
32
|
+
* Unknown flags are an error, not silently ignored — `timber dev --port 4000`
|
|
33
|
+
* starting on the default port would contradict fail-loudly. The CLI surface
|
|
34
|
+
* is intentionally --config-only (design/11-platform.md §CLI); port selection
|
|
35
|
+
* goes through the PORT env var or server.port in vite.config.ts.
|
|
29
36
|
*/
|
|
30
37
|
export function parseArgs(args: string[]): ParsedArgs {
|
|
31
38
|
if (args.length === 0) {
|
|
32
39
|
throw new Error(
|
|
33
|
-
'No command provided. Usage: timber <dev|build|preview|check> [--config <path>]'
|
|
40
|
+
'No command provided. Usage: timber <dev|build|preview|check|schema|init> [--config <path>]'
|
|
34
41
|
);
|
|
35
42
|
}
|
|
36
43
|
|
|
@@ -40,16 +47,31 @@ export function parseArgs(args: string[]): ParsedArgs {
|
|
|
40
47
|
}
|
|
41
48
|
|
|
42
49
|
let config: string | undefined;
|
|
50
|
+
const rest: string[] = [];
|
|
43
51
|
for (let i = 1; i < args.length; i++) {
|
|
44
|
-
|
|
52
|
+
const arg = args[i];
|
|
53
|
+
if (arg === '--config' || arg === '-c') {
|
|
45
54
|
config = args[++i];
|
|
46
55
|
if (!config) {
|
|
47
56
|
throw new Error('--config requires a path argument');
|
|
48
57
|
}
|
|
58
|
+
} else if (arg.startsWith('-')) {
|
|
59
|
+
const portHint =
|
|
60
|
+
arg === '--port' || arg === '-p'
|
|
61
|
+
? ' To change the port, set the PORT environment variable (PORT=4000 timber dev) ' +
|
|
62
|
+
'or server.port in vite.config.ts.'
|
|
63
|
+
: '';
|
|
64
|
+
throw new Error(
|
|
65
|
+
`Unknown option: ${arg}. The timber CLI only accepts --config <path>.${portHint}`
|
|
66
|
+
);
|
|
67
|
+
} else if (command === 'schema' || command === 'init') {
|
|
68
|
+
rest.push(arg);
|
|
69
|
+
} else {
|
|
70
|
+
throw new Error(`Unexpected argument: ${arg}. Usage: timber ${command} [--config <path>]`);
|
|
49
71
|
}
|
|
50
72
|
}
|
|
51
73
|
|
|
52
|
-
return { command: command as Command, config };
|
|
74
|
+
return { command: command as Command, config, rest };
|
|
53
75
|
}
|
|
54
76
|
|
|
55
77
|
// ─── Command Implementations ─────────────────────────────────────────────────
|
|
@@ -63,7 +85,12 @@ export interface ViteDeps {
|
|
|
63
85
|
|
|
64
86
|
/**
|
|
65
87
|
* Start the Vite dev server.
|
|
66
|
-
*
|
|
88
|
+
*
|
|
89
|
+
* The timber plugin binds the port immediately with a holding page
|
|
90
|
+
* (in rootSync's config hook) so browsers see a "starting..." page
|
|
91
|
+
* instead of ERR_CONNECTION_REFUSED during initialization.
|
|
92
|
+
*
|
|
93
|
+
* See design/21-dev-server.md, TIM-665.
|
|
67
94
|
*/
|
|
68
95
|
export async function runDev(options: CommandOptions, _deps?: ViteDeps): Promise<void> {
|
|
69
96
|
const createServer = _deps?.createServer ?? (await import('vite')).createServer;
|
|
@@ -100,46 +127,25 @@ export function resolvePreviewStrategy(
|
|
|
100
127
|
return 'vite';
|
|
101
128
|
}
|
|
102
129
|
|
|
103
|
-
/**
|
|
104
|
-
* Load timber.config.ts from the project root.
|
|
105
|
-
* Returns the config object with adapter, output, etc.
|
|
106
|
-
* Returns null if no config file is found.
|
|
107
|
-
*/
|
|
108
|
-
async function loadTimberConfig(
|
|
109
|
-
root: string
|
|
110
|
-
): Promise<{ adapter?: import('./adapters/types').TimberPlatformAdapter; output?: string } | null> {
|
|
111
|
-
const { existsSync } = await import('node:fs');
|
|
112
|
-
const { join } = await import('node:path');
|
|
113
|
-
const { pathToFileURL } = await import('node:url');
|
|
114
|
-
|
|
115
|
-
const configNames = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
|
|
116
|
-
|
|
117
|
-
for (const name of configNames) {
|
|
118
|
-
const configPath = join(root, name);
|
|
119
|
-
if (existsSync(configPath)) {
|
|
120
|
-
// Use Vite's built-in config loading to handle TypeScript
|
|
121
|
-
const mod = await import(pathToFileURL(configPath).href);
|
|
122
|
-
return mod.default ?? mod;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
130
|
/**
|
|
129
131
|
* Serve the production build for local testing.
|
|
130
132
|
* If the adapter provides a preview() method, it takes priority.
|
|
131
133
|
* Otherwise falls back to Vite's built-in preview server.
|
|
134
|
+
*
|
|
135
|
+
* Uses the same loadTimberConfigFile loader as dev/build — one loader,
|
|
136
|
+
* one set of module semantics. A config file that exists but fails to
|
|
137
|
+
* load throws (naming the file) instead of silently degrading to plain
|
|
138
|
+
* Vite preview. See TIM-1066.
|
|
132
139
|
*/
|
|
133
140
|
export async function runPreview(options: CommandOptions, _deps?: ViteDeps): Promise<void> {
|
|
134
|
-
const {
|
|
141
|
+
const { loadTimberConfigFile, resolveBuildDir } = await import('./plugin-context.js');
|
|
135
142
|
|
|
136
|
-
// Try to load timber config for adapter-specific preview
|
|
137
143
|
const root = process.cwd();
|
|
138
|
-
const config =
|
|
144
|
+
const config = loadTimberConfigFile(root);
|
|
139
145
|
const adapter = config?.adapter as import('./adapters/types').TimberPlatformAdapter | undefined;
|
|
140
146
|
|
|
141
147
|
if (resolvePreviewStrategy(adapter) === 'adapter') {
|
|
142
|
-
const buildDir =
|
|
148
|
+
const buildDir = resolveBuildDir(root, config?.buildDir);
|
|
143
149
|
const timberConfig = { output: (config?.output ?? 'server') as 'server' | 'static' };
|
|
144
150
|
await adapter!.preview!(timberConfig, buildDir);
|
|
145
151
|
return;
|
|
@@ -174,6 +180,127 @@ export async function runCheck(options: CommandOptions): Promise<void> {
|
|
|
174
180
|
});
|
|
175
181
|
}
|
|
176
182
|
|
|
183
|
+
// ─── Schema Subcommand ───────────────────────────────────────────────────────
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* `timber schema sync` — scan filesystem for dynamic segments, diff against
|
|
187
|
+
* app/schema.ts, and append missing entries with type-appropriate codec defaults.
|
|
188
|
+
*
|
|
189
|
+
* See design/41-global-params.md §Auto-Scaffolding
|
|
190
|
+
*/
|
|
191
|
+
export async function runSchema(args: string[]): Promise<void> {
|
|
192
|
+
const subcommand = args[0];
|
|
193
|
+
|
|
194
|
+
if (subcommand !== 'sync') {
|
|
195
|
+
throw new Error(
|
|
196
|
+
`Unknown schema subcommand: ${subcommand ?? '(none)'}. Usage: timber schema sync`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const { runSchemaSync, defaultCodecForSegment } = await import('./cli-schema-sync.js');
|
|
201
|
+
const result = runSchemaSync(process.cwd());
|
|
202
|
+
|
|
203
|
+
if (result.filesystemSegments.length === 0) {
|
|
204
|
+
console.log('[timber] No dynamic segments found in app/.');
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (result.created) {
|
|
209
|
+
console.log(`[timber] Created app/schema.ts with ${result.addedSegments.length} segment(s):`);
|
|
210
|
+
for (const seg of result.addedSegments) {
|
|
211
|
+
console.log(` + ${seg}: ${defaultCodecForSegment(seg)}`);
|
|
212
|
+
}
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (result.addedSegments.length === 0 && result.removedSegments.length === 0) {
|
|
217
|
+
console.log('[timber] Schema is up to date — all segments are registered.');
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (result.addedSegments.length > 0) {
|
|
222
|
+
console.log(`[timber] Added ${result.addedSegments.length} segment(s) to app/schema.ts:`);
|
|
223
|
+
for (const seg of result.addedSegments) {
|
|
224
|
+
console.log(` + ${seg}: ${defaultCodecForSegment(seg)}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (result.removedSegments.length > 0) {
|
|
229
|
+
console.log(
|
|
230
|
+
`[timber] Removed ${result.removedSegments.length} stale segment(s) from app/schema.ts:`
|
|
231
|
+
);
|
|
232
|
+
for (const seg of result.removedSegments) {
|
|
233
|
+
console.log(` - ${seg}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ─── Init Subcommand ─────────────────────────────────────────────────────────
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* `timber init` — write AGENTS.md (and a CLAUDE.md symlink to it) to the
|
|
242
|
+
* project root so AI coding agents can discover timber.js documentation and
|
|
243
|
+
* conventions.
|
|
244
|
+
*
|
|
245
|
+
* The content is read from the installed @timber-js/app package itself, so it
|
|
246
|
+
* stays in sync with the installed version.
|
|
247
|
+
*/
|
|
248
|
+
export async function runInit(): Promise<void> {
|
|
249
|
+
const { readFileSync, writeFileSync, existsSync, symlinkSync } = await import('node:fs');
|
|
250
|
+
const { resolve, dirname } = await import('node:path');
|
|
251
|
+
const { fileURLToPath } = await import('node:url');
|
|
252
|
+
|
|
253
|
+
const root = process.cwd();
|
|
254
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
255
|
+
|
|
256
|
+
const agentSkillPath = resolve(packageRoot, 'agent-skill.md');
|
|
257
|
+
if (!existsSync(agentSkillPath)) {
|
|
258
|
+
throw new Error(
|
|
259
|
+
'agent-skill.md not found in @timber-js/app package. ' +
|
|
260
|
+
'This may be a development install — try reinstalling.'
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const agentSkill = readFileSync(agentSkillPath, 'utf-8');
|
|
265
|
+
|
|
266
|
+
const agentsPath = resolve(root, 'AGENTS.md');
|
|
267
|
+
const claudePath = resolve(root, 'CLAUDE.md');
|
|
268
|
+
|
|
269
|
+
const wrote: string[] = [];
|
|
270
|
+
|
|
271
|
+
if (existsSync(agentsPath)) {
|
|
272
|
+
console.log('[timber] AGENTS.md already exists — skipping (delete it first to regenerate)');
|
|
273
|
+
} else {
|
|
274
|
+
writeFileSync(agentsPath, agentSkill);
|
|
275
|
+
wrote.push('AGENTS.md');
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (existsSync(claudePath)) {
|
|
279
|
+
console.log('[timber] CLAUDE.md already exists — skipping (delete it first to regenerate)');
|
|
280
|
+
} else {
|
|
281
|
+
try {
|
|
282
|
+
// Relative target so the link survives the project directory moving.
|
|
283
|
+
// The 'file' type argument is required for Windows (ignored elsewhere).
|
|
284
|
+
symlinkSync('AGENTS.md', claudePath, 'file');
|
|
285
|
+
wrote.push('CLAUDE.md (symlink)');
|
|
286
|
+
} catch {
|
|
287
|
+
// Windows without Developer Mode or admin rights can't create symlinks
|
|
288
|
+
// (EPERM) — fall back to a plain pointer file.
|
|
289
|
+
writeFileSync(claudePath, 'Read AGENTS.md for project context and conventions.\n');
|
|
290
|
+
wrote.push('CLAUDE.md');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (wrote.length > 0) {
|
|
295
|
+
console.log(
|
|
296
|
+
`[timber] Created ${wrote.join(' and ')} — AI agents can now discover timber.js docs.`
|
|
297
|
+
);
|
|
298
|
+
console.log('[timber] Full documentation: node_modules/@timber-js/app/docs/');
|
|
299
|
+
} else {
|
|
300
|
+
console.log('[timber] Nothing to do — both files already exist.');
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
177
304
|
// ─── Main Entry Point ────────────────────────────────────────────────────────
|
|
178
305
|
|
|
179
306
|
async function main(): Promise<void> {
|
|
@@ -193,6 +320,12 @@ async function main(): Promise<void> {
|
|
|
193
320
|
case 'check':
|
|
194
321
|
await runCheck(options);
|
|
195
322
|
break;
|
|
323
|
+
case 'schema':
|
|
324
|
+
await runSchema(parsed.rest);
|
|
325
|
+
break;
|
|
326
|
+
case 'init':
|
|
327
|
+
await runInit();
|
|
328
|
+
break;
|
|
196
329
|
}
|
|
197
330
|
}
|
|
198
331
|
|