@timber-js/app 0.2.0-alpha.110 → 0.2.0-alpha.112
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/dist/_chunks/{actions-D6gyxlGQ.js → actions-ILhDUzES.js} +46 -10
- package/dist/_chunks/actions-ILhDUzES.js.map +1 -0
- package/dist/_chunks/{build-output-helper-5TK2Emwp.js → build-output-helper-DhxiT18k.js} +1 -1
- package/dist/_chunks/{build-output-helper-5TK2Emwp.js.map → build-output-helper-DhxiT18k.js.map} +1 -1
- package/dist/_chunks/cli-schema-sync-BhXdbmgS.js +2 -0
- package/dist/_chunks/cli-schema-sync-DFZmnmqG.js +357 -0
- package/dist/_chunks/cli-schema-sync-DFZmnmqG.js.map +1 -0
- package/dist/_chunks/codec-registry-V7ARyeLN.js +21 -0
- package/dist/_chunks/codec-registry-V7ARyeLN.js.map +1 -0
- package/dist/_chunks/{define-Dn98bPbb.js → define-8zQ8Vm7x.js} +3 -3
- package/dist/_chunks/{define-Dn98bPbb.js.map → define-8zQ8Vm7x.js.map} +1 -1
- package/dist/_chunks/{define-BflNsrwD.js → define-a0CCE6Nx.js} +3 -3
- package/dist/_chunks/{define-BflNsrwD.js.map → define-a0CCE6Nx.js.map} +1 -1
- package/dist/_chunks/{format-CYBGxKtc.js → format-CR6v1pWE.js} +1 -1
- package/dist/_chunks/{format-CYBGxKtc.js.map → format-CR6v1pWE.js.map} +1 -1
- package/dist/_chunks/{handler-store-B_df5Npe.js → handler-store-iqnt2ghN.js} +1 -1
- package/dist/_chunks/{handler-store-B_df5Npe.js.map → handler-store-iqnt2ghN.js.map} +1 -1
- package/dist/_chunks/{merge-search-params-Cm_KIWDX.js → merge-search-params-CwxJzBLS.js} +1 -1
- package/dist/_chunks/{merge-search-params-Cm_KIWDX.js.map → merge-search-params-CwxJzBLS.js.map} +1 -1
- package/dist/_chunks/{navigation-root-2ypaZQDx.js → navigation-root-CY3pRMxF.js} +2 -2
- package/dist/_chunks/{navigation-root-2ypaZQDx.js.map → navigation-root-CY3pRMxF.js.map} +1 -1
- package/dist/_chunks/{registry-DB93kT5c.js → registry-Dp_hJL4s.js} +1 -1
- package/dist/_chunks/{registry-DB93kT5c.js.map → registry-Dp_hJL4s.js.map} +1 -1
- package/dist/_chunks/resolve-schema-DO8B0mO9.js +65 -0
- package/dist/_chunks/resolve-schema-DO8B0mO9.js.map +1 -0
- package/dist/_chunks/{router-ref-TkUdmqtM.js → router-ref-sektkr-t.js} +2 -2
- package/dist/_chunks/{router-ref-TkUdmqtM.js.map → router-ref-sektkr-t.js.map} +1 -1
- package/dist/_chunks/scanner-DmfoB7iK.js +336 -0
- package/dist/_chunks/scanner-DmfoB7iK.js.map +1 -0
- package/dist/_chunks/{schema-bridge-C3xl_vfb.js → schema-bridge-eL5vQDSA.js} +1 -1
- package/dist/_chunks/{schema-bridge-C3xl_vfb.js.map → schema-bridge-eL5vQDSA.js.map} +1 -1
- package/dist/_chunks/{segment-context-Dc-GbSTe.js → segment-context-EsfQpS--.js} +1 -1
- package/dist/_chunks/{segment-context-Dc-GbSTe.js.map → segment-context-EsfQpS--.js.map} +1 -1
- package/dist/_chunks/{ssr-data-DzuI0bIV.js → ssr-data-BO5OvEvg.js} +1 -1
- package/dist/_chunks/{ssr-data-DzuI0bIV.js.map → ssr-data-BO5OvEvg.js.map} +1 -1
- package/dist/_chunks/{stale-reload-D6FlD3xn.js → stale-reload-BCPRG0Cv.js} +1 -1
- package/dist/_chunks/{stale-reload-D6FlD3xn.js.map → stale-reload-BCPRG0Cv.js.map} +1 -1
- package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -1
- package/dist/_chunks/{use-query-states-B-cLl8mx.js → use-query-states-D9SBlAfp.js} +2 -2
- package/dist/_chunks/{use-query-states-B-cLl8mx.js.map → use-query-states-D9SBlAfp.js.map} +1 -1
- package/dist/_chunks/{use-segment-params-07V1TIxL.js → use-segment-params-BSt_O2cb.js} +2 -2
- package/dist/_chunks/{use-segment-params-07V1TIxL.js.map → use-segment-params-BSt_O2cb.js.map} +1 -1
- package/dist/_chunks/{validation-DfyuMoK2.js → validation-Bm3Je-09.js} +1 -1
- package/dist/_chunks/{validation-DfyuMoK2.js.map → validation-Bm3Je-09.js.map} +1 -1
- package/dist/_chunks/{walkers-DQn5NNrf.js → walkers-DGTmJT0f.js} +109 -353
- package/dist/_chunks/walkers-DGTmJT0f.js.map +1 -0
- package/dist/adapters/cloudflare.js +1 -1
- package/dist/adapters/nitro.js +1 -1
- package/dist/cache/index.js +3 -2
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/sizeof.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +37 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +8 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +34 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
- package/dist/client/error-boundary.js +5 -3
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/index.js +27 -9
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.js +7 -7
- package/dist/client/link.d.ts.map +1 -1
- package/dist/codec.js +1 -1
- package/dist/cookies/index.js +3 -3
- package/dist/dev-tools/browser-logs.d.ts.map +1 -1
- package/dist/dev-tools/error-page.d.ts.map +1 -1
- package/dist/dev-tools/logs.d.ts.map +1 -1
- package/dist/dev-tools/overlay.d.ts +1 -1
- package/dist/dev-tools/overlay.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -236
- 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 +52 -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 +33 -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/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +8 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -1
- package/dist/routing/codegen-types.d.ts +5 -0
- package/dist/routing/codegen-types.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts +5 -0
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/index.js +2 -1
- package/dist/routing/link-codegen.d.ts +2 -2
- package/dist/routing/link-codegen.d.ts.map +1 -1
- package/dist/search-params/index.js +3 -3
- package/dist/segment-params/index.js +1 -1
- package/dist/server/als-registry.d.ts +7 -0
- package/dist/server/als-registry.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/fallback-error.d.ts.map +1 -1
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/internal.js +30 -4
- package/dist/server/internal.js.map +1 -1
- package/dist/server/node-stream-transforms.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +12 -2
- package/dist/server/param-coercion.d.ts.map +1 -1
- package/dist/server/pipeline-phases.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +18 -0
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/request-context.d.ts +17 -3
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +8 -14
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/package.json +11 -6
- package/src/cache/sizeof.ts +3 -1
- package/src/cli-schema-sync.ts +206 -0
- package/src/cli.ts +49 -2
- package/src/client/browser-entry/action-dispatch.ts +15 -5
- package/src/client/browser-entry/index.ts +6 -0
- package/src/client/error-boundary.tsx +2 -2
- package/src/client/link.tsx +25 -1
- package/src/dev-tools/browser-logs.ts +5 -2
- package/src/dev-tools/error-page.ts +3 -6
- package/src/dev-tools/logs.ts +6 -2
- package/src/dev-tools/overlay.ts +18 -5
- package/src/index.ts +5 -0
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +72 -0
- package/src/params/index.ts +11 -0
- package/src/params/resolve-schema.ts +88 -0
- package/src/plugins/dev-server.ts +24 -16
- package/src/plugins/mdx.ts +5 -1
- package/src/plugins/routing.ts +107 -2
- package/src/routing/codegen-shared.ts +11 -0
- package/src/routing/codegen-types.ts +5 -0
- package/src/routing/codegen.ts +129 -21
- package/src/routing/link-codegen.ts +19 -5
- package/src/server/als-registry.ts +7 -0
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/fallback-error.ts +3 -3
- package/src/server/html-injectors.ts +11 -22
- package/src/server/node-stream-transforms.ts +6 -16
- package/src/server/param-coercion.ts +55 -2
- package/src/server/pipeline-phases.ts +8 -0
- package/src/server/pipeline.ts +19 -0
- package/src/server/request-context.ts +58 -3
- package/src/server/rsc-entry/helpers.ts +3 -2
- package/src/server/rsc-entry/index.ts +28 -35
- package/LICENSE +0 -8
- package/dist/_chunks/actions-D6gyxlGQ.js.map +0 -1
- package/dist/_chunks/walkers-DQn5NNrf.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/dev-tools/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,iDAAiD;AACjD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAIzE,8CAA8C;AAC9C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AA2ID;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAsBnD;
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/dev-tools/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,iDAAiD;AACjD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAIzE,8CAA8C;AAC9C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AA2ID;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAsBnD;AAwDD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAiBzD"}
|
|
@@ -19,7 +19,7 @@ import type { ViteDevServer } from 'vite';
|
|
|
19
19
|
export type ErrorPhase = 'module-transform' | 'proxy' | 'middleware' | 'access' | 'render' | 'handler';
|
|
20
20
|
/** Labels for terminal output. */
|
|
21
21
|
export declare const PHASE_LABELS: Record<ErrorPhase, string>;
|
|
22
|
-
export { classifyFrame, classifyStack, type FrameType, type ClassifiedFrame } from './stack-classifier.js';
|
|
22
|
+
export { classifyFrame, classifyStack, type FrameType, type ClassifiedFrame, } from './stack-classifier.js';
|
|
23
23
|
/**
|
|
24
24
|
* Extract the React component stack from an error, if present.
|
|
25
25
|
* React attaches this as `componentStack` during renderToReadableStream errors.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/dev-tools/overlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,MAAM,CAAC;AAqC1D,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAClB,kBAAkB,GAClB,OAAO,GACP,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,SAAS,CAAC;AAEd,kCAAkC;AAClC,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAOnD,CAAC;AAIF,OAAO,
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/dev-tools/overlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,MAAM,CAAC;AAqC1D,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAClB,kBAAkB,GAClB,OAAO,GACP,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,SAAS,CAAC;AAEd,kCAAkC;AAClC,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAOnD,CAAC;AAIF,OAAO,EACL,aAAa,EACb,aAAa,EACb,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAC;AAI/B;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAUnE;AAID,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAqB5F;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,CAehF;AAOD,OAAO,EAAE,mBAAmB,IAAI,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC5E,eAAO,MAAM,mBAAmB,6BAAuB,CAAC;AAIxD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAiCjF;AAkBD,wBAAgB,2BAA2B,IAAI,MAAM,CA6BpD;AAuHD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,CAMhG;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,EACnB,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,GAC3C,IAAI,CA0CN"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import type { PluginOption } from 'vite';
|
|
13
13
|
import type { TimberUserConfig } from './config-types.js';
|
|
14
14
|
export type { TimberUserConfig } from './config-types.js';
|
|
15
|
+
export type { InferCodecType, SchemaConfig } from './params/define-schema.js';
|
|
15
16
|
export type { Metadata, MetadataRoute, MetadataHandler, MetadataResult } from './server/types.js';
|
|
16
17
|
/**
|
|
17
18
|
* Route map interface — augmented by the generated timber-routes.d.ts.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,MAAM,CAAC;AAyBjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAc1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,MAAM,CAAC;AAyBjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAc1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK1D,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAQ9E,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElG;;;;;;;;;GASG;AAEH,MAAM,WAAW,MAAM;CAAG;AAE1B;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAEvE;AAgGD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,YAAY,EAAE,CA+UhE;AAED,eAAe,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { n as setViteServer } from "./_chunks/warnings-B30wpfaS.js";
|
|
2
2
|
import { h as swallow } from "./_chunks/logger-DDmK5skc.js";
|
|
3
|
-
import {
|
|
4
|
-
import { t as
|
|
3
|
+
import { t as scanRoutes } from "./_chunks/scanner-DmfoB7iK.js";
|
|
4
|
+
import { n as collectInterceptionRewrites, r as generateRouteMap, t as collectLeafRoutes } from "./_chunks/walkers-DGTmJT0f.js";
|
|
5
|
+
import { a as DEFAULT_BUILD_DIR, c as mergeFileConfig, d as resolveClientJavascript, f as createNoopTimer, l as resolveAppDir, n as findSchemaFile, o as createPluginContext, r as parseExistingSchemaKeys, s as loadTimberConfigFile, t as collectDynamicSegments, u as resolveBuildDir } from "./_chunks/cli-schema-sync-DFZmnmqG.js";
|
|
6
|
+
import { t as formatSize } from "./_chunks/format-CR6v1pWE.js";
|
|
5
7
|
import { dirname, extname, join, normalize, resolve } from "node:path";
|
|
6
8
|
import { createRequire } from "node:module";
|
|
7
9
|
import react, { reactCompilerPreset } from "@vitejs/plugin-react";
|
|
@@ -12,7 +14,6 @@ import { Readable } from "node:stream";
|
|
|
12
14
|
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
13
15
|
import { createHash, randomUUID } from "node:crypto";
|
|
14
16
|
import { parseAst } from "vite";
|
|
15
|
-
import { performance as performance$1 } from "node:perf_hooks";
|
|
16
17
|
import http from "node:http";
|
|
17
18
|
//#region \0rolldown/runtime.js
|
|
18
19
|
var __defProp = Object.defineProperty;
|
|
@@ -425,7 +426,8 @@ function calculateModuleRunnerOffset() {
|
|
|
425
426
|
return _cachedOffset;
|
|
426
427
|
}
|
|
427
428
|
_cachedOffset = (src.slice(0, bodyIndex).match(/\n/g) || []).length;
|
|
428
|
-
} catch {
|
|
429
|
+
} catch (e) {
|
|
430
|
+
console.debug("[timber] overlay offset calculation failed:", e instanceof Error ? e.message : e);
|
|
429
431
|
_cachedOffset = 2;
|
|
430
432
|
}
|
|
431
433
|
return _cachedOffset;
|
|
@@ -501,7 +503,8 @@ function rewriteStacktrace(stack, moduleGraph) {
|
|
|
501
503
|
line: origLine,
|
|
502
504
|
column: origCol
|
|
503
505
|
});
|
|
504
|
-
} catch {
|
|
506
|
+
} catch (e) {
|
|
507
|
+
console.debug("[timber] source map tracing failed:", e instanceof Error ? e.message : e);
|
|
505
508
|
return input;
|
|
506
509
|
}
|
|
507
510
|
if (!pos.source || pos.line == null) return input;
|
|
@@ -566,7 +569,9 @@ function sendErrorToOverlay(server, error, phase, projectRoot, rscDebugComponent
|
|
|
566
569
|
} : void 0
|
|
567
570
|
}
|
|
568
571
|
});
|
|
569
|
-
} catch {
|
|
572
|
+
} catch (e) {
|
|
573
|
+
console.debug("[timber] overlay error send failed:", e instanceof Error ? e.message : e);
|
|
574
|
+
}
|
|
570
575
|
}
|
|
571
576
|
//#endregion
|
|
572
577
|
//#region src/server/utils/escape-html.ts
|
|
@@ -636,7 +641,8 @@ function readSourceContext(filePath, line, contextLines = 3) {
|
|
|
636
641
|
highlight: start + 1 + i === line
|
|
637
642
|
}))
|
|
638
643
|
};
|
|
639
|
-
} catch {
|
|
644
|
+
} catch (e) {
|
|
645
|
+
console.debug("[timber] source context extraction failed:", e instanceof Error ? e.message : e);
|
|
640
646
|
return null;
|
|
641
647
|
}
|
|
642
648
|
}
|
|
@@ -1417,10 +1423,10 @@ function createTimberMiddleware(server, projectRoot) {
|
|
|
1417
1423
|
if (!rscEnv?.runner?.import) throw new Error("[timber] RSC environment is not runnable");
|
|
1418
1424
|
const rscModule = await rscEnv.runner.import(RSC_ENTRY_ID);
|
|
1419
1425
|
handler = rscModule.default;
|
|
1420
|
-
const
|
|
1421
|
-
if (
|
|
1426
|
+
const config = rscModule.pipelineConfig;
|
|
1427
|
+
if (config) config.devPipelineErrorHandler = (error, _phase, debugComponents) => {
|
|
1422
1428
|
sendErrorToOverlay(server, error, classifyErrorPhase(error, projectRoot), projectRoot, debugComponents);
|
|
1423
|
-
}
|
|
1429
|
+
};
|
|
1424
1430
|
const setSourceMap = rscModule.setDevSourceMapHandler;
|
|
1425
1431
|
if (typeof setSourceMap === "function") setSourceMap((error) => {
|
|
1426
1432
|
fixErrorStacktrace(server, error);
|
|
@@ -1470,7 +1476,9 @@ function respond500(res, error, phase, projectRoot, hmrOptions) {
|
|
|
1470
1476
|
res.setHeader("content-type", "text/html; charset=utf-8");
|
|
1471
1477
|
res.end(html);
|
|
1472
1478
|
return;
|
|
1473
|
-
} catch {
|
|
1479
|
+
} catch (e) {
|
|
1480
|
+
console.debug("[timber] dev error page generation failed, falling back to text/plain:", e instanceof Error ? e.message : e);
|
|
1481
|
+
}
|
|
1474
1482
|
res.statusCode = 500;
|
|
1475
1483
|
res.setHeader("content-type", "text/plain");
|
|
1476
1484
|
res.end(`[timber] Internal server error\n\n${error instanceof Error ? error.stack ?? error.message : String(error)}`);
|
|
@@ -1604,7 +1612,9 @@ function listenForClientErrors(server, projectRoot) {
|
|
|
1604
1612
|
} : void 0
|
|
1605
1613
|
}
|
|
1606
1614
|
});
|
|
1607
|
-
} catch {
|
|
1615
|
+
} catch (e) {
|
|
1616
|
+
console.debug("[timber] overlay send failed:", e instanceof Error ? e.message : e);
|
|
1617
|
+
}
|
|
1608
1618
|
});
|
|
1609
1619
|
}
|
|
1610
1620
|
//#endregion
|
|
@@ -1891,7 +1901,8 @@ async function tryImport(name, projectRoot) {
|
|
|
1891
1901
|
try {
|
|
1892
1902
|
const mod = await import(name);
|
|
1893
1903
|
return mod.default ?? mod;
|
|
1894
|
-
} catch {
|
|
1904
|
+
} catch (e) {
|
|
1905
|
+
console.debug(`[timber] optional MDX dependency '${name}' not available:`, e instanceof Error ? e.message : e);
|
|
1895
1906
|
return;
|
|
1896
1907
|
}
|
|
1897
1908
|
}
|
|
@@ -2204,10 +2215,12 @@ var VIRTUAL_MODULE_ID$1 = "virtual:timber-route-manifest";
|
|
|
2204
2215
|
var RESOLVED_VIRTUAL_ID$1 = `\0${VIRTUAL_MODULE_ID$1}`;
|
|
2205
2216
|
var SEARCH_PARAMS_REGISTRY_ID = "virtual:timber-search-params-registry";
|
|
2206
2217
|
var RESOLVED_SEARCH_PARAMS_REGISTRY_ID = `\0${SEARCH_PARAMS_REGISTRY_ID}`;
|
|
2218
|
+
var SCHEMA_ID = "virtual:timber-schema";
|
|
2219
|
+
var RESOLVED_SCHEMA_ID = `\0${SCHEMA_ID}`;
|
|
2207
2220
|
/**
|
|
2208
2221
|
* File convention names we track for changes that require manifest regeneration.
|
|
2209
2222
|
*/
|
|
2210
|
-
var ROUTE_FILE_PATTERNS = /\/(page|layout|middleware|access|route|error|global-error|default|denied|params|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|twitter-image|apple-icon)\./;
|
|
2223
|
+
var ROUTE_FILE_PATTERNS = /\/(page|layout|middleware|access|route|error|global-error|default|denied|params|schema|\d{3}|[45]xx|not-found|forbidden|unauthorized|sitemap|robots|manifest|favicon|icon|opengraph-image|twitter-image|apple-icon)\./;
|
|
2211
2224
|
/**
|
|
2212
2225
|
* Create the timber-routing Vite plugin.
|
|
2213
2226
|
*
|
|
@@ -2269,6 +2282,7 @@ function timberRouting(ctx) {
|
|
|
2269
2282
|
ctx.routeTree = scanRoutes(ctx.appDir, { pageExtensions: ctx.config.pageExtensions });
|
|
2270
2283
|
ctx.timer.end("route-scan");
|
|
2271
2284
|
writeCodegen(ctx);
|
|
2285
|
+
warnUnregisteredSegments(ctx);
|
|
2272
2286
|
const newConventionWarnings = lintConventions(ctx.routeTree, ctx.appDir).filter((w) => !warnedFiles.has(w.id));
|
|
2273
2287
|
if (newConventionWarnings.length > 0) {
|
|
2274
2288
|
for (const w of newConventionWarnings) warnedFiles.add(w.id);
|
|
@@ -2283,6 +2297,7 @@ function timberRouting(ctx) {
|
|
|
2283
2297
|
if (cleanId === VIRTUAL_MODULE_ID$1) return RESOLVED_VIRTUAL_ID$1;
|
|
2284
2298
|
if (cleanId.endsWith(`/${VIRTUAL_MODULE_ID$1}`)) return RESOLVED_VIRTUAL_ID$1;
|
|
2285
2299
|
if (cleanId === SEARCH_PARAMS_REGISTRY_ID || cleanId.endsWith(`/${SEARCH_PARAMS_REGISTRY_ID}`)) return RESOLVED_SEARCH_PARAMS_REGISTRY_ID;
|
|
2300
|
+
if (cleanId === SCHEMA_ID || cleanId.endsWith(`/${SCHEMA_ID}`)) return RESOLVED_SCHEMA_ID;
|
|
2286
2301
|
return null;
|
|
2287
2302
|
},
|
|
2288
2303
|
load(id) {
|
|
@@ -2294,6 +2309,7 @@ function timberRouting(ctx) {
|
|
|
2294
2309
|
if (!ctx.routeTree) rescan();
|
|
2295
2310
|
return generateSearchParamsRegistryModule(ctx.routeTree);
|
|
2296
2311
|
}
|
|
2312
|
+
if (id === RESOLVED_SCHEMA_ID) return generateSchemaModule(ctx.appDir);
|
|
2297
2313
|
return null;
|
|
2298
2314
|
},
|
|
2299
2315
|
buildStart() {
|
|
@@ -2346,11 +2362,32 @@ function timberRouting(ctx) {
|
|
|
2346
2362
|
* When the route tree changes, any environment that has imported the manifest
|
|
2347
2363
|
* needs to be invalidated so the next request/transform picks up the new tree.
|
|
2348
2364
|
*/
|
|
2365
|
+
/** Set of segments we've already warned about — avoid repeating on every rescan. */
|
|
2366
|
+
var _warnedSegments = /* @__PURE__ */ new Set();
|
|
2367
|
+
/**
|
|
2368
|
+
* Warn about dynamic segments not registered in app/schema.ts.
|
|
2369
|
+
* Only fires when a schema file exists. Logs once per segment per session.
|
|
2370
|
+
*/
|
|
2371
|
+
function warnUnregisteredSegments(ctx) {
|
|
2372
|
+
const schemaPath = findSchemaFile(ctx.appDir);
|
|
2373
|
+
if (!schemaPath) return;
|
|
2374
|
+
const filesystemSegments = collectDynamicSegments(ctx.appDir);
|
|
2375
|
+
if (filesystemSegments.length === 0) return;
|
|
2376
|
+
const existingKeys = parseExistingSchemaKeys(readFileSync(schemaPath, "utf-8"));
|
|
2377
|
+
const missing = filesystemSegments.filter((seg) => !existingKeys.includes(seg) && !_warnedSegments.has(seg));
|
|
2378
|
+
if (missing.length === 0) return;
|
|
2379
|
+
for (const seg of missing) _warnedSegments.add(seg);
|
|
2380
|
+
console.warn(`[timber] New segment${missing.length > 1 ? "s" : ""} not in schema: ${missing.join(", ")}\n Run: timber schema sync`);
|
|
2381
|
+
}
|
|
2349
2382
|
function invalidateManifest(server) {
|
|
2350
2383
|
for (const envName of Object.keys(server.environments)) {
|
|
2351
2384
|
const env = server.environments[envName];
|
|
2352
2385
|
if (!env?.moduleGraph) continue;
|
|
2353
|
-
for (const virtualId of [
|
|
2386
|
+
for (const virtualId of [
|
|
2387
|
+
RESOLVED_VIRTUAL_ID$1,
|
|
2388
|
+
RESOLVED_SEARCH_PARAMS_REGISTRY_ID,
|
|
2389
|
+
RESOLVED_SCHEMA_ID
|
|
2390
|
+
]) {
|
|
2354
2391
|
const mod = env.moduleGraph.getModuleById(virtualId);
|
|
2355
2392
|
if (mod) env.moduleGraph.invalidateModule(mod);
|
|
2356
2393
|
}
|
|
@@ -2366,6 +2403,46 @@ function invalidateManifest(server) {
|
|
|
2366
2403
|
* <Link> can look up the definition from the original `href` prop before
|
|
2367
2404
|
* segmentParams are interpolated.
|
|
2368
2405
|
*/
|
|
2406
|
+
/** Schema file extensions to check, in priority order. */
|
|
2407
|
+
var SCHEMA_EXTENSIONS = [
|
|
2408
|
+
".ts",
|
|
2409
|
+
".tsx",
|
|
2410
|
+
".js",
|
|
2411
|
+
".jsx"
|
|
2412
|
+
];
|
|
2413
|
+
/**
|
|
2414
|
+
* TIM-931: Generate the virtual:timber-schema module.
|
|
2415
|
+
*
|
|
2416
|
+
* When app/schema.{ts,tsx,js,jsx} exists, generates a module that
|
|
2417
|
+
* imports the schema and resolves its segmentParams codecs into a
|
|
2418
|
+
* bare-name codec map for runtime coercion.
|
|
2419
|
+
*
|
|
2420
|
+
* When no schema exists, exports null.
|
|
2421
|
+
*/
|
|
2422
|
+
function generateSchemaModule(appDir) {
|
|
2423
|
+
let schemaPath = null;
|
|
2424
|
+
for (const ext of SCHEMA_EXTENSIONS) {
|
|
2425
|
+
const candidate = join(appDir, `schema${ext}`);
|
|
2426
|
+
if (existsSync(candidate)) {
|
|
2427
|
+
schemaPath = candidate;
|
|
2428
|
+
break;
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
if (!schemaPath) return ["// Auto-generated schema loader — no app/schema.ts found.", "export default null;"].join("\n");
|
|
2432
|
+
return [
|
|
2433
|
+
"// Auto-generated schema loader — do not edit.",
|
|
2434
|
+
"// Generated by timber-routing plugin (TIM-931).",
|
|
2435
|
+
"",
|
|
2436
|
+
`import schema from ${JSON.stringify(schemaPath)};`,
|
|
2437
|
+
`import { resolveSchemaCodecs } from '@timber-js/app/params';`,
|
|
2438
|
+
"",
|
|
2439
|
+
"const globalCodecs = schema?.segmentParams",
|
|
2440
|
+
" ? resolveSchemaCodecs(schema.segmentParams)",
|
|
2441
|
+
" : null;",
|
|
2442
|
+
"",
|
|
2443
|
+
"export default globalCodecs;"
|
|
2444
|
+
].join("\n");
|
|
2445
|
+
}
|
|
2369
2446
|
function generateSearchParamsRegistryModule(tree) {
|
|
2370
2447
|
const entries = [];
|
|
2371
2448
|
function walk(node) {
|
|
@@ -5739,7 +5816,9 @@ function patchConsole(server, projectRoot) {
|
|
|
5739
5816
|
timestamp: Date.now()
|
|
5740
5817
|
};
|
|
5741
5818
|
server.hot.send("timber:server-log", payload);
|
|
5742
|
-
} catch {
|
|
5819
|
+
} catch (e) {
|
|
5820
|
+
originals.get("debug")("[timber] server log forwarding failed:", e instanceof Error ? e.message : e);
|
|
5821
|
+
}
|
|
5743
5822
|
};
|
|
5744
5823
|
}
|
|
5745
5824
|
return () => {
|
|
@@ -5927,7 +6006,9 @@ function timberDevBrowserLogs(ctx) {
|
|
|
5927
6006
|
const formatted = formatBrowserLog(payload);
|
|
5928
6007
|
if (payload.level === "error") process.stderr.write(formatted + "\n");
|
|
5929
6008
|
else process.stdout.write(formatted + "\n");
|
|
5930
|
-
} catch {
|
|
6009
|
+
} catch (e) {
|
|
6010
|
+
process.stderr.write(`[timber] log forwarding failed: ${e instanceof Error ? e.message : e}\n`);
|
|
6011
|
+
}
|
|
5931
6012
|
});
|
|
5932
6013
|
},
|
|
5933
6014
|
transformIndexHtml() {
|
|
@@ -6411,81 +6492,6 @@ function timberBuildReport(ctx) {
|
|
|
6411
6492
|
};
|
|
6412
6493
|
}
|
|
6413
6494
|
//#endregion
|
|
6414
|
-
//#region src/utils/startup-timer.ts
|
|
6415
|
-
/**
|
|
6416
|
-
* Startup timer — records named phases with their durations.
|
|
6417
|
-
*
|
|
6418
|
-
* Used by the plugin system to instrument cold start and report a
|
|
6419
|
-
* timing breakdown in dev mode. Zero overhead in production (disabled).
|
|
6420
|
-
*
|
|
6421
|
-
* See design/18-build-system.md, TIM-155.
|
|
6422
|
-
*/
|
|
6423
|
-
/**
|
|
6424
|
-
* Create a startup timer that records phase durations.
|
|
6425
|
-
*/
|
|
6426
|
-
function createStartupTimer() {
|
|
6427
|
-
const pending = /* @__PURE__ */ new Map();
|
|
6428
|
-
const phases = [];
|
|
6429
|
-
return {
|
|
6430
|
-
start(phase) {
|
|
6431
|
-
pending.set(phase, performance$1.now());
|
|
6432
|
-
},
|
|
6433
|
-
end(phase) {
|
|
6434
|
-
const startMs = pending.get(phase);
|
|
6435
|
-
if (startMs === void 0) return 0;
|
|
6436
|
-
pending.delete(phase);
|
|
6437
|
-
const durationMs = performance$1.now() - startMs;
|
|
6438
|
-
phases.push({
|
|
6439
|
-
name: phase,
|
|
6440
|
-
startMs,
|
|
6441
|
-
durationMs
|
|
6442
|
-
});
|
|
6443
|
-
return durationMs;
|
|
6444
|
-
},
|
|
6445
|
-
getPhases() {
|
|
6446
|
-
return [...phases].sort((a, b) => a.startMs - b.startMs);
|
|
6447
|
-
},
|
|
6448
|
-
totalMs() {
|
|
6449
|
-
if (phases.length === 0) return 0;
|
|
6450
|
-
const sorted = this.getPhases();
|
|
6451
|
-
const first = sorted[0];
|
|
6452
|
-
const last = sorted[sorted.length - 1];
|
|
6453
|
-
return last.startMs + last.durationMs - first.startMs;
|
|
6454
|
-
},
|
|
6455
|
-
formatSummary() {
|
|
6456
|
-
const sorted = this.getPhases();
|
|
6457
|
-
if (sorted.length === 0) return "No phases recorded.";
|
|
6458
|
-
const lines = sorted.map((p) => {
|
|
6459
|
-
const ms = p.durationMs.toFixed(1);
|
|
6460
|
-
return ` ${p.name.padEnd(30)} ${ms.padStart(8)}ms`;
|
|
6461
|
-
});
|
|
6462
|
-
const total = this.totalMs().toFixed(1);
|
|
6463
|
-
lines.push(` ${"total".padEnd(30)} ${total.padStart(8)}ms`);
|
|
6464
|
-
return ["[timber] startup timing:", ...lines].join("\n");
|
|
6465
|
-
}
|
|
6466
|
-
};
|
|
6467
|
-
}
|
|
6468
|
-
/**
|
|
6469
|
-
* No-op timer for production builds — all methods are empty.
|
|
6470
|
-
*/
|
|
6471
|
-
function createNoopTimer() {
|
|
6472
|
-
return {
|
|
6473
|
-
start() {},
|
|
6474
|
-
end() {
|
|
6475
|
-
return 0;
|
|
6476
|
-
},
|
|
6477
|
-
getPhases() {
|
|
6478
|
-
return [];
|
|
6479
|
-
},
|
|
6480
|
-
totalMs() {
|
|
6481
|
-
return 0;
|
|
6482
|
-
},
|
|
6483
|
-
formatSummary() {
|
|
6484
|
-
return "";
|
|
6485
|
-
}
|
|
6486
|
-
};
|
|
6487
|
-
}
|
|
6488
|
-
//#endregion
|
|
6489
6495
|
//#region src/server/action-encryption.ts
|
|
6490
6496
|
/**
|
|
6491
6497
|
* Regex for safe `defineEncryptionKey` expressions.
|
|
@@ -6820,150 +6826,6 @@ async function startDevServerPort(input) {
|
|
|
6820
6826
|
}
|
|
6821
6827
|
}
|
|
6822
6828
|
//#endregion
|
|
6823
|
-
//#region src/plugin-context.ts
|
|
6824
|
-
/**
|
|
6825
|
-
* Plugin context — internal types and helpers for timber sub-plugins.
|
|
6826
|
-
*
|
|
6827
|
-
* These are NOT part of the user-facing API. They are consumed by
|
|
6828
|
-
* sub-plugins (routing, entries, shims, etc.) via relative imports.
|
|
6829
|
-
* The root entry point (index.ts) does not re-export them.
|
|
6830
|
-
*
|
|
6831
|
-
* Design doc: 18-build-system.md §"Shared Plugin Context"
|
|
6832
|
-
*/
|
|
6833
|
-
/**
|
|
6834
|
-
* Resolve `clientJavascript` into a fully resolved config.
|
|
6835
|
-
*/
|
|
6836
|
-
function resolveClientJavascript(config) {
|
|
6837
|
-
if (config.clientJavascript !== void 0) {
|
|
6838
|
-
if (typeof config.clientJavascript === "boolean") return {
|
|
6839
|
-
disabled: !config.clientJavascript,
|
|
6840
|
-
enableHMRInDev: !config.clientJavascript
|
|
6841
|
-
};
|
|
6842
|
-
return {
|
|
6843
|
-
disabled: config.clientJavascript.disabled,
|
|
6844
|
-
enableHMRInDev: config.clientJavascript.enableHMRInDev ?? config.clientJavascript.disabled
|
|
6845
|
-
};
|
|
6846
|
-
}
|
|
6847
|
-
return {
|
|
6848
|
-
disabled: false,
|
|
6849
|
-
enableHMRInDev: false
|
|
6850
|
-
};
|
|
6851
|
-
}
|
|
6852
|
-
/**
|
|
6853
|
-
* Resolve the app directory. Checks (in order):
|
|
6854
|
-
* 1. Explicit `configAppDir` from timber.config.ts
|
|
6855
|
-
* 2. `<root>/app`
|
|
6856
|
-
* 3. `<root>/src/app`
|
|
6857
|
-
*
|
|
6858
|
-
* Throws if none exist.
|
|
6859
|
-
*/
|
|
6860
|
-
function resolveAppDir(root, configAppDir) {
|
|
6861
|
-
if (configAppDir) {
|
|
6862
|
-
const explicit = join(root, configAppDir);
|
|
6863
|
-
if (!existsSync(explicit)) throw new Error(`[timber] Configured appDir "${configAppDir}" does not exist at ${explicit}`);
|
|
6864
|
-
return explicit;
|
|
6865
|
-
}
|
|
6866
|
-
const rootApp = join(root, "app");
|
|
6867
|
-
if (existsSync(rootApp)) return rootApp;
|
|
6868
|
-
const srcApp = join(root, "src", "app");
|
|
6869
|
-
if (existsSync(srcApp)) return srcApp;
|
|
6870
|
-
throw new Error(`[timber] Could not find app directory. Expected "app/" or "src/app/" in ${root}. You can set appDir in timber.config.ts to specify a custom location.`);
|
|
6871
|
-
}
|
|
6872
|
-
function createPluginContext(config, root) {
|
|
6873
|
-
const projectRoot = root ?? process.cwd();
|
|
6874
|
-
const resolvedConfig = { ...config };
|
|
6875
|
-
return {
|
|
6876
|
-
config: resolvedConfig,
|
|
6877
|
-
clientJavascript: resolveClientJavascript(resolvedConfig),
|
|
6878
|
-
routeTree: null,
|
|
6879
|
-
appDir: join(projectRoot, "app"),
|
|
6880
|
-
root: projectRoot,
|
|
6881
|
-
dev: false,
|
|
6882
|
-
buildManifest: null,
|
|
6883
|
-
deploymentId: null,
|
|
6884
|
-
timer: createStartupTimer(),
|
|
6885
|
-
holdingServer: null,
|
|
6886
|
-
buildDir: resolveBuildDir(projectRoot, resolvedConfig.buildDir)
|
|
6887
|
-
};
|
|
6888
|
-
}
|
|
6889
|
-
/** Default build output directory (relative to root). */
|
|
6890
|
-
var DEFAULT_BUILD_DIR = join(".timber", "dist");
|
|
6891
|
-
/**
|
|
6892
|
-
* Resolve the build output directory.
|
|
6893
|
-
*
|
|
6894
|
-
* Priority:
|
|
6895
|
-
* 1. Explicit `timberBuildDir` from timber.config.ts
|
|
6896
|
-
* 2. Explicit `viteBuildOutDir` from Vite's build.outDir (if not the default 'dist')
|
|
6897
|
-
* 3. Default: `.timber/dist`
|
|
6898
|
-
*
|
|
6899
|
-
* Returns an absolute path.
|
|
6900
|
-
*/
|
|
6901
|
-
function resolveBuildDir(root, timberBuildDir, viteBuildOutDir) {
|
|
6902
|
-
if (timberBuildDir) return join(root, timberBuildDir);
|
|
6903
|
-
if (viteBuildOutDir && viteBuildOutDir !== "dist") return join(root, viteBuildOutDir);
|
|
6904
|
-
return join(root, DEFAULT_BUILD_DIR);
|
|
6905
|
-
}
|
|
6906
|
-
/**
|
|
6907
|
-
* Load timber.config.ts (or .js, .mjs) from the project root.
|
|
6908
|
-
* Returns the config object or null if no config file is found.
|
|
6909
|
-
*
|
|
6910
|
-
* Uses require() which works for ESM modules on Node 22.12+.
|
|
6911
|
-
* This keeps timber() synchronous — no async config loading needed.
|
|
6912
|
-
*/
|
|
6913
|
-
function loadTimberConfigFile(root) {
|
|
6914
|
-
const configNames = [
|
|
6915
|
-
"timber.config.ts",
|
|
6916
|
-
"timber.config.js",
|
|
6917
|
-
"timber.config.mjs"
|
|
6918
|
-
];
|
|
6919
|
-
const req = createRequire(join(root, "package.json"));
|
|
6920
|
-
for (const name of configNames) {
|
|
6921
|
-
const configPath = join(root, name);
|
|
6922
|
-
if (existsSync(configPath)) {
|
|
6923
|
-
const mod = req(configPath);
|
|
6924
|
-
return mod.default ?? mod;
|
|
6925
|
-
}
|
|
6926
|
-
}
|
|
6927
|
-
return null;
|
|
6928
|
-
}
|
|
6929
|
-
/**
|
|
6930
|
-
* Detect config keys set in both inline (vite.config.ts) and file (timber.config.ts)
|
|
6931
|
-
* and warn the user. The `output` key is excluded because it defaults to 'server'
|
|
6932
|
-
* in createPluginContext and would always appear as an inline key.
|
|
6933
|
-
*
|
|
6934
|
-
* Returns the list of conflicting key names (for testing).
|
|
6935
|
-
*/
|
|
6936
|
-
function warnConfigConflicts(inline, fileConfig) {
|
|
6937
|
-
const conflicts = [];
|
|
6938
|
-
for (const key of Object.keys(fileConfig)) if (key in inline && inline[key] !== void 0) conflicts.push(key);
|
|
6939
|
-
if (conflicts.length > 0) console.warn(`[timber] Config conflict: ${conflicts.map((k) => `"${k}"`).join(", ")} set in both vite.config.ts (inline) and timber.config.ts. Move all config to timber.config.ts to avoid confusion. The inline value from vite.config.ts will be used.`);
|
|
6940
|
-
return conflicts;
|
|
6941
|
-
}
|
|
6942
|
-
/**
|
|
6943
|
-
* Merge file-based config into ctx.config. Inline config (already in ctx.config)
|
|
6944
|
-
* takes precedence — file config only fills in missing fields.
|
|
6945
|
-
*/
|
|
6946
|
-
function mergeFileConfig(ctx, fileConfig) {
|
|
6947
|
-
const inline = ctx.config;
|
|
6948
|
-
warnConfigConflicts(inline, fileConfig);
|
|
6949
|
-
ctx.config = {
|
|
6950
|
-
...fileConfig,
|
|
6951
|
-
...inline,
|
|
6952
|
-
...fileConfig.limits && inline.limits ? { limits: {
|
|
6953
|
-
...fileConfig.limits,
|
|
6954
|
-
...inline.limits
|
|
6955
|
-
} } : {},
|
|
6956
|
-
...fileConfig.dev && inline.dev ? { dev: {
|
|
6957
|
-
...fileConfig.dev,
|
|
6958
|
-
...inline.dev
|
|
6959
|
-
} } : {},
|
|
6960
|
-
...fileConfig.mdx && inline.mdx ? { mdx: {
|
|
6961
|
-
...fileConfig.mdx,
|
|
6962
|
-
...inline.mdx
|
|
6963
|
-
} } : {}
|
|
6964
|
-
};
|
|
6965
|
-
}
|
|
6966
|
-
//#endregion
|
|
6967
6829
|
//#region src/index.ts
|
|
6968
6830
|
/**
|
|
6969
6831
|
* Type-safe helper for timber.config.ts files.
|