@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.
Files changed (156) hide show
  1. package/dist/_chunks/{actions-D6gyxlGQ.js → actions-ILhDUzES.js} +46 -10
  2. package/dist/_chunks/actions-ILhDUzES.js.map +1 -0
  3. package/dist/_chunks/{build-output-helper-5TK2Emwp.js → build-output-helper-DhxiT18k.js} +1 -1
  4. package/dist/_chunks/{build-output-helper-5TK2Emwp.js.map → build-output-helper-DhxiT18k.js.map} +1 -1
  5. package/dist/_chunks/cli-schema-sync-BhXdbmgS.js +2 -0
  6. package/dist/_chunks/cli-schema-sync-DFZmnmqG.js +357 -0
  7. package/dist/_chunks/cli-schema-sync-DFZmnmqG.js.map +1 -0
  8. package/dist/_chunks/codec-registry-V7ARyeLN.js +21 -0
  9. package/dist/_chunks/codec-registry-V7ARyeLN.js.map +1 -0
  10. package/dist/_chunks/{define-Dn98bPbb.js → define-8zQ8Vm7x.js} +3 -3
  11. package/dist/_chunks/{define-Dn98bPbb.js.map → define-8zQ8Vm7x.js.map} +1 -1
  12. package/dist/_chunks/{define-BflNsrwD.js → define-a0CCE6Nx.js} +3 -3
  13. package/dist/_chunks/{define-BflNsrwD.js.map → define-a0CCE6Nx.js.map} +1 -1
  14. package/dist/_chunks/{format-CYBGxKtc.js → format-CR6v1pWE.js} +1 -1
  15. package/dist/_chunks/{format-CYBGxKtc.js.map → format-CR6v1pWE.js.map} +1 -1
  16. package/dist/_chunks/{handler-store-B_df5Npe.js → handler-store-iqnt2ghN.js} +1 -1
  17. package/dist/_chunks/{handler-store-B_df5Npe.js.map → handler-store-iqnt2ghN.js.map} +1 -1
  18. package/dist/_chunks/{merge-search-params-Cm_KIWDX.js → merge-search-params-CwxJzBLS.js} +1 -1
  19. package/dist/_chunks/{merge-search-params-Cm_KIWDX.js.map → merge-search-params-CwxJzBLS.js.map} +1 -1
  20. package/dist/_chunks/{navigation-root-2ypaZQDx.js → navigation-root-CY3pRMxF.js} +2 -2
  21. package/dist/_chunks/{navigation-root-2ypaZQDx.js.map → navigation-root-CY3pRMxF.js.map} +1 -1
  22. package/dist/_chunks/{registry-DB93kT5c.js → registry-Dp_hJL4s.js} +1 -1
  23. package/dist/_chunks/{registry-DB93kT5c.js.map → registry-Dp_hJL4s.js.map} +1 -1
  24. package/dist/_chunks/resolve-schema-DO8B0mO9.js +65 -0
  25. package/dist/_chunks/resolve-schema-DO8B0mO9.js.map +1 -0
  26. package/dist/_chunks/{router-ref-TkUdmqtM.js → router-ref-sektkr-t.js} +2 -2
  27. package/dist/_chunks/{router-ref-TkUdmqtM.js.map → router-ref-sektkr-t.js.map} +1 -1
  28. package/dist/_chunks/scanner-DmfoB7iK.js +336 -0
  29. package/dist/_chunks/scanner-DmfoB7iK.js.map +1 -0
  30. package/dist/_chunks/{schema-bridge-C3xl_vfb.js → schema-bridge-eL5vQDSA.js} +1 -1
  31. package/dist/_chunks/{schema-bridge-C3xl_vfb.js.map → schema-bridge-eL5vQDSA.js.map} +1 -1
  32. package/dist/_chunks/{segment-context-Dc-GbSTe.js → segment-context-EsfQpS--.js} +1 -1
  33. package/dist/_chunks/{segment-context-Dc-GbSTe.js.map → segment-context-EsfQpS--.js.map} +1 -1
  34. package/dist/_chunks/{ssr-data-DzuI0bIV.js → ssr-data-BO5OvEvg.js} +1 -1
  35. package/dist/_chunks/{ssr-data-DzuI0bIV.js.map → ssr-data-BO5OvEvg.js.map} +1 -1
  36. package/dist/_chunks/{stale-reload-D6FlD3xn.js → stale-reload-BCPRG0Cv.js} +1 -1
  37. package/dist/_chunks/{stale-reload-D6FlD3xn.js.map → stale-reload-BCPRG0Cv.js.map} +1 -1
  38. package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -1
  39. package/dist/_chunks/{use-query-states-B-cLl8mx.js → use-query-states-D9SBlAfp.js} +2 -2
  40. package/dist/_chunks/{use-query-states-B-cLl8mx.js.map → use-query-states-D9SBlAfp.js.map} +1 -1
  41. package/dist/_chunks/{use-segment-params-07V1TIxL.js → use-segment-params-BSt_O2cb.js} +2 -2
  42. package/dist/_chunks/{use-segment-params-07V1TIxL.js.map → use-segment-params-BSt_O2cb.js.map} +1 -1
  43. package/dist/_chunks/{validation-DfyuMoK2.js → validation-Bm3Je-09.js} +1 -1
  44. package/dist/_chunks/{validation-DfyuMoK2.js.map → validation-Bm3Je-09.js.map} +1 -1
  45. package/dist/_chunks/{walkers-DQn5NNrf.js → walkers-DGTmJT0f.js} +109 -353
  46. package/dist/_chunks/walkers-DGTmJT0f.js.map +1 -0
  47. package/dist/adapters/cloudflare.js +1 -1
  48. package/dist/adapters/nitro.js +1 -1
  49. package/dist/cache/index.js +3 -2
  50. package/dist/cache/index.js.map +1 -1
  51. package/dist/cache/sizeof.d.ts.map +1 -1
  52. package/dist/cli-schema-sync.d.ts +37 -0
  53. package/dist/cli-schema-sync.d.ts.map +1 -0
  54. package/dist/cli.d.ts +8 -1
  55. package/dist/cli.d.ts.map +1 -1
  56. package/dist/cli.js +34 -3
  57. package/dist/cli.js.map +1 -1
  58. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
  59. package/dist/client/error-boundary.js +5 -3
  60. package/dist/client/error-boundary.js.map +1 -1
  61. package/dist/client/index.js +27 -9
  62. package/dist/client/index.js.map +1 -1
  63. package/dist/client/internal.js +7 -7
  64. package/dist/client/link.d.ts.map +1 -1
  65. package/dist/codec.js +1 -1
  66. package/dist/cookies/index.js +3 -3
  67. package/dist/dev-tools/browser-logs.d.ts.map +1 -1
  68. package/dist/dev-tools/error-page.d.ts.map +1 -1
  69. package/dist/dev-tools/logs.d.ts.map +1 -1
  70. package/dist/dev-tools/overlay.d.ts +1 -1
  71. package/dist/dev-tools/overlay.d.ts.map +1 -1
  72. package/dist/index.d.ts +1 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +98 -236
  75. package/dist/index.js.map +1 -1
  76. package/dist/params/codec-registry.d.ts +26 -0
  77. package/dist/params/codec-registry.d.ts.map +1 -0
  78. package/dist/params/define-schema.d.ts +52 -0
  79. package/dist/params/define-schema.d.ts.map +1 -0
  80. package/dist/params/index.d.ts +5 -0
  81. package/dist/params/index.d.ts.map +1 -0
  82. package/dist/params/index.js +33 -0
  83. package/dist/params/index.js.map +1 -0
  84. package/dist/params/resolve-schema.d.ts +34 -0
  85. package/dist/params/resolve-schema.d.ts.map +1 -0
  86. package/dist/plugins/mdx.d.ts.map +1 -1
  87. package/dist/plugins/routing.d.ts.map +1 -1
  88. package/dist/routing/codegen-shared.d.ts +8 -0
  89. package/dist/routing/codegen-shared.d.ts.map +1 -1
  90. package/dist/routing/codegen-types.d.ts +5 -0
  91. package/dist/routing/codegen-types.d.ts.map +1 -1
  92. package/dist/routing/codegen.d.ts +5 -0
  93. package/dist/routing/codegen.d.ts.map +1 -1
  94. package/dist/routing/index.js +2 -1
  95. package/dist/routing/link-codegen.d.ts +2 -2
  96. package/dist/routing/link-codegen.d.ts.map +1 -1
  97. package/dist/search-params/index.js +3 -3
  98. package/dist/segment-params/index.js +1 -1
  99. package/dist/server/als-registry.d.ts +7 -0
  100. package/dist/server/als-registry.d.ts.map +1 -1
  101. package/dist/server/coalesce-tick.d.ts +40 -0
  102. package/dist/server/coalesce-tick.d.ts.map +1 -0
  103. package/dist/server/fallback-error.d.ts.map +1 -1
  104. package/dist/server/html-injectors.d.ts.map +1 -1
  105. package/dist/server/index.js +2 -2
  106. package/dist/server/internal.js +30 -4
  107. package/dist/server/internal.js.map +1 -1
  108. package/dist/server/node-stream-transforms.d.ts.map +1 -1
  109. package/dist/server/param-coercion.d.ts +12 -2
  110. package/dist/server/param-coercion.d.ts.map +1 -1
  111. package/dist/server/pipeline-phases.d.ts.map +1 -1
  112. package/dist/server/pipeline.d.ts +18 -0
  113. package/dist/server/pipeline.d.ts.map +1 -1
  114. package/dist/server/request-context.d.ts +17 -3
  115. package/dist/server/request-context.d.ts.map +1 -1
  116. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  117. package/dist/server/rsc-entry/index.d.ts +8 -14
  118. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  119. package/package.json +11 -6
  120. package/src/cache/sizeof.ts +3 -1
  121. package/src/cli-schema-sync.ts +206 -0
  122. package/src/cli.ts +49 -2
  123. package/src/client/browser-entry/action-dispatch.ts +15 -5
  124. package/src/client/browser-entry/index.ts +6 -0
  125. package/src/client/error-boundary.tsx +2 -2
  126. package/src/client/link.tsx +25 -1
  127. package/src/dev-tools/browser-logs.ts +5 -2
  128. package/src/dev-tools/error-page.ts +3 -6
  129. package/src/dev-tools/logs.ts +6 -2
  130. package/src/dev-tools/overlay.ts +18 -5
  131. package/src/index.ts +5 -0
  132. package/src/params/codec-registry.ts +34 -0
  133. package/src/params/define-schema.ts +72 -0
  134. package/src/params/index.ts +11 -0
  135. package/src/params/resolve-schema.ts +88 -0
  136. package/src/plugins/dev-server.ts +24 -16
  137. package/src/plugins/mdx.ts +5 -1
  138. package/src/plugins/routing.ts +107 -2
  139. package/src/routing/codegen-shared.ts +11 -0
  140. package/src/routing/codegen-types.ts +5 -0
  141. package/src/routing/codegen.ts +129 -21
  142. package/src/routing/link-codegen.ts +19 -5
  143. package/src/server/als-registry.ts +7 -0
  144. package/src/server/coalesce-tick.ts +75 -0
  145. package/src/server/fallback-error.ts +3 -3
  146. package/src/server/html-injectors.ts +11 -22
  147. package/src/server/node-stream-transforms.ts +6 -16
  148. package/src/server/param-coercion.ts +55 -2
  149. package/src/server/pipeline-phases.ts +8 -0
  150. package/src/server/pipeline.ts +19 -0
  151. package/src/server/request-context.ts +58 -3
  152. package/src/server/rsc-entry/helpers.ts +3 -2
  153. package/src/server/rsc-entry/index.ts +28 -35
  154. package/LICENSE +0 -8
  155. package/dist/_chunks/actions-D6gyxlGQ.js.map +0 -1
  156. 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;AAoDD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAiBzD"}
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,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI3G;;;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,CAyBpD;AAmHD;;;;;;;;;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"}
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.
@@ -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;AAQ1D,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"}
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 { i as scanRoutes, n as collectInterceptionRewrites, r as generateRouteMap, t as collectLeafRoutes } from "./_chunks/walkers-DQn5NNrf.js";
4
- import { t as formatSize } from "./_chunks/format-CYBGxKtc.js";
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 setHandler = rscModule.setDevPipelineErrorHandler;
1421
- if (typeof setHandler === "function") setHandler((error, _phase, debugComponents) => {
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 [RESOLVED_VIRTUAL_ID$1, RESOLVED_SEARCH_PARAMS_REGISTRY_ID]) {
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.