@vibesdotdev/config 0.0.1

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 (620) hide show
  1. package/README.md +85 -0
  2. package/SPEC.md +71 -0
  3. package/dist/adapters/cli/flags.d.ts +75 -0
  4. package/dist/adapters/cli/flags.d.ts.map +1 -0
  5. package/dist/adapters/cli/flags.js +221 -0
  6. package/dist/adapters/cli/flags.js.map +1 -0
  7. package/dist/adapters/cli/index.d.ts +12 -0
  8. package/dist/adapters/cli/index.d.ts.map +1 -0
  9. package/dist/adapters/cli/index.js +9 -0
  10. package/dist/adapters/cli/index.js.map +1 -0
  11. package/dist/adapters/cli/mappings.d.ts +17 -0
  12. package/dist/adapters/cli/mappings.d.ts.map +1 -0
  13. package/dist/adapters/cli/mappings.js +32 -0
  14. package/dist/adapters/cli/mappings.js.map +1 -0
  15. package/dist/adapters/cli/prompts.d.ts +28 -0
  16. package/dist/adapters/cli/prompts.d.ts.map +1 -0
  17. package/dist/adapters/cli/prompts.js +55 -0
  18. package/dist/adapters/cli/prompts.js.map +1 -0
  19. package/dist/adapters/cli/schemas/flags.schema.d.ts +8 -0
  20. package/dist/adapters/cli/schemas/flags.schema.d.ts.map +1 -0
  21. package/dist/adapters/cli/schemas/flags.schema.js +2 -0
  22. package/dist/adapters/cli/schemas/flags.schema.js.map +1 -0
  23. package/dist/adapters/cli/schemas/mappings.schema.d.ts +2 -0
  24. package/dist/adapters/cli/schemas/mappings.schema.d.ts.map +1 -0
  25. package/dist/adapters/cli/schemas/mappings.schema.js +2 -0
  26. package/dist/adapters/cli/schemas/mappings.schema.js.map +1 -0
  27. package/dist/adapters/cli/schemas/prompts.schema.d.ts +5 -0
  28. package/dist/adapters/cli/schemas/prompts.schema.d.ts.map +1 -0
  29. package/dist/adapters/cli/schemas/prompts.schema.js +2 -0
  30. package/dist/adapters/cli/schemas/prompts.schema.js.map +1 -0
  31. package/dist/adapters/cli/schemas/wizard.schema.d.ts +19 -0
  32. package/dist/adapters/cli/schemas/wizard.schema.d.ts.map +1 -0
  33. package/dist/adapters/cli/schemas/wizard.schema.js +2 -0
  34. package/dist/adapters/cli/schemas/wizard.schema.js.map +1 -0
  35. package/dist/adapters/cli/wizard.d.ts +33 -0
  36. package/dist/adapters/cli/wizard.d.ts.map +1 -0
  37. package/dist/adapters/cli/wizard.js +77 -0
  38. package/dist/adapters/cli/wizard.js.map +1 -0
  39. package/dist/browser/index.d.ts +7 -0
  40. package/dist/browser/index.d.ts.map +1 -0
  41. package/dist/browser/index.js +4 -0
  42. package/dist/browser/index.js.map +1 -0
  43. package/dist/cli/settings.descriptor.d.ts +9 -0
  44. package/dist/cli/settings.descriptor.d.ts.map +1 -0
  45. package/dist/cli/settings.descriptor.js +18 -0
  46. package/dist/cli/settings.descriptor.js.map +1 -0
  47. package/dist/cli/types.d.ts +57 -0
  48. package/dist/cli/types.d.ts.map +1 -0
  49. package/dist/cli/types.js +9 -0
  50. package/dist/cli/types.js.map +1 -0
  51. package/dist/client/index.d.ts +19 -0
  52. package/dist/client/index.d.ts.map +1 -0
  53. package/dist/client/index.js +145 -0
  54. package/dist/client/index.js.map +1 -0
  55. package/dist/client/storage.d.ts +48 -0
  56. package/dist/client/storage.d.ts.map +1 -0
  57. package/dist/client/storage.js +46 -0
  58. package/dist/client/storage.js.map +1 -0
  59. package/dist/collection/collection.d.ts +46 -0
  60. package/dist/collection/collection.d.ts.map +1 -0
  61. package/dist/collection/collection.js +93 -0
  62. package/dist/collection/collection.js.map +1 -0
  63. package/dist/collection/index.d.ts +6 -0
  64. package/dist/collection/index.d.ts.map +1 -0
  65. package/dist/collection/index.js +5 -0
  66. package/dist/collection/index.js.map +1 -0
  67. package/dist/common/index.d.ts +7 -0
  68. package/dist/common/index.d.ts.map +1 -0
  69. package/dist/common/index.js +4 -0
  70. package/dist/common/index.js.map +1 -0
  71. package/dist/config.context.descriptor.d.ts +21 -0
  72. package/dist/config.context.descriptor.d.ts.map +1 -0
  73. package/dist/config.context.descriptor.js +11 -0
  74. package/dist/config.context.descriptor.js.map +1 -0
  75. package/dist/config.plugin.d.ts +15 -0
  76. package/dist/config.plugin.d.ts.map +1 -0
  77. package/dist/config.plugin.js +166 -0
  78. package/dist/config.plugin.js.map +1 -0
  79. package/dist/crud/base-types.d.ts +10 -0
  80. package/dist/crud/base-types.d.ts.map +1 -0
  81. package/dist/crud/base-types.js +10 -0
  82. package/dist/crud/base-types.js.map +1 -0
  83. package/dist/crud/index.d.ts +4 -0
  84. package/dist/crud/index.d.ts.map +1 -0
  85. package/dist/crud/index.js +2 -0
  86. package/dist/crud/index.js.map +1 -0
  87. package/dist/crud/schemas/base-types.schema.d.ts +19 -0
  88. package/dist/crud/schemas/base-types.schema.d.ts.map +1 -0
  89. package/dist/crud/schemas/base-types.schema.js +2 -0
  90. package/dist/crud/schemas/base-types.schema.js.map +1 -0
  91. package/dist/crud/schemas/shared.schema.d.ts +13 -0
  92. package/dist/crud/schemas/shared.schema.d.ts.map +1 -0
  93. package/dist/crud/schemas/shared.schema.js +2 -0
  94. package/dist/crud/schemas/shared.schema.js.map +1 -0
  95. package/dist/crud/shared.d.ts +8 -0
  96. package/dist/crud/shared.d.ts.map +1 -0
  97. package/dist/crud/shared.js +8 -0
  98. package/dist/crud/shared.js.map +1 -0
  99. package/dist/crud/types.d.ts +250 -0
  100. package/dist/crud/types.d.ts.map +1 -0
  101. package/dist/crud/types.js +22 -0
  102. package/dist/crud/types.js.map +1 -0
  103. package/dist/docs/environment.docs.descriptor.d.ts +4 -0
  104. package/dist/docs/environment.docs.descriptor.d.ts.map +1 -0
  105. package/dist/docs/environment.docs.descriptor.js +383 -0
  106. package/dist/docs/environment.docs.descriptor.js.map +1 -0
  107. package/dist/docs/manifests.docs.descriptor.d.ts +4 -0
  108. package/dist/docs/manifests.docs.descriptor.d.ts.map +1 -0
  109. package/dist/docs/manifests.docs.descriptor.js +503 -0
  110. package/dist/docs/manifests.docs.descriptor.js.map +1 -0
  111. package/dist/docs/validation.docs.descriptor.d.ts +4 -0
  112. package/dist/docs/validation.docs.descriptor.d.ts.map +1 -0
  113. package/dist/docs/validation.docs.descriptor.js +441 -0
  114. package/dist/docs/validation.docs.descriptor.js.map +1 -0
  115. package/dist/doctor.d.ts +42 -0
  116. package/dist/doctor.d.ts.map +1 -0
  117. package/dist/doctor.js +119 -0
  118. package/dist/doctor.js.map +1 -0
  119. package/dist/env.d.ts +28 -0
  120. package/dist/env.d.ts.map +1 -0
  121. package/dist/env.js +75 -0
  122. package/dist/env.js.map +1 -0
  123. package/dist/env.runtime.d.ts +19 -0
  124. package/dist/env.runtime.d.ts.map +1 -0
  125. package/dist/env.runtime.js +37 -0
  126. package/dist/env.runtime.js.map +1 -0
  127. package/dist/environment/current.d.ts +32 -0
  128. package/dist/environment/current.d.ts.map +1 -0
  129. package/dist/environment/current.js +91 -0
  130. package/dist/environment/current.js.map +1 -0
  131. package/dist/environment/environment.config.descriptor.d.ts +11 -0
  132. package/dist/environment/environment.config.descriptor.d.ts.map +1 -0
  133. package/dist/environment/environment.config.descriptor.js +51 -0
  134. package/dist/environment/environment.config.descriptor.js.map +1 -0
  135. package/dist/environment/environment.config.schema.d.ts +47 -0
  136. package/dist/environment/environment.config.schema.d.ts.map +1 -0
  137. package/dist/environment/environment.config.schema.js +19 -0
  138. package/dist/environment/environment.config.schema.js.map +1 -0
  139. package/dist/environment/environment.local.descriptor.d.ts +11 -0
  140. package/dist/environment/environment.local.descriptor.d.ts.map +1 -0
  141. package/dist/environment/environment.local.descriptor.js +42 -0
  142. package/dist/environment/environment.local.descriptor.js.map +1 -0
  143. package/dist/environment/environment.plugin.d.ts +9 -0
  144. package/dist/environment/environment.plugin.d.ts.map +1 -0
  145. package/dist/environment/environment.plugin.js +27 -0
  146. package/dist/environment/environment.plugin.js.map +1 -0
  147. package/dist/environment/environment.production.descriptor.d.ts +10 -0
  148. package/dist/environment/environment.production.descriptor.d.ts.map +1 -0
  149. package/dist/environment/environment.production.descriptor.js +37 -0
  150. package/dist/environment/environment.production.descriptor.js.map +1 -0
  151. package/dist/environment/environment.staging.descriptor.d.ts +11 -0
  152. package/dist/environment/environment.staging.descriptor.d.ts.map +1 -0
  153. package/dist/environment/environment.staging.descriptor.js +22 -0
  154. package/dist/environment/environment.staging.descriptor.js.map +1 -0
  155. package/dist/environment/index.d.ts +8 -0
  156. package/dist/environment/index.d.ts.map +1 -0
  157. package/dist/environment/index.js +9 -0
  158. package/dist/environment/index.js.map +1 -0
  159. package/dist/environment/kinds/environment.default.d.ts +23 -0
  160. package/dist/environment/kinds/environment.default.d.ts.map +1 -0
  161. package/dist/environment/kinds/environment.default.js +49 -0
  162. package/dist/environment/kinds/environment.default.js.map +1 -0
  163. package/dist/environment/kinds/environment.interface.d.ts +7 -0
  164. package/dist/environment/kinds/environment.interface.d.ts.map +1 -0
  165. package/dist/environment/kinds/environment.interface.js +7 -0
  166. package/dist/environment/kinds/environment.interface.js.map +1 -0
  167. package/dist/environment/kinds/environment.kind.d.ts +10 -0
  168. package/dist/environment/kinds/environment.kind.d.ts.map +1 -0
  169. package/dist/environment/kinds/environment.kind.js +57 -0
  170. package/dist/environment/kinds/environment.kind.js.map +1 -0
  171. package/dist/environment/kinds/environment.schema.d.ts +34 -0
  172. package/dist/environment/kinds/environment.schema.d.ts.map +1 -0
  173. package/dist/environment/kinds/environment.schema.js +46 -0
  174. package/dist/environment/kinds/environment.schema.js.map +1 -0
  175. package/dist/environment/kinds/index.d.ts +8 -0
  176. package/dist/environment/kinds/index.d.ts.map +1 -0
  177. package/dist/environment/kinds/index.js +7 -0
  178. package/dist/environment/kinds/index.js.map +1 -0
  179. package/dist/environment/kinds/schemas/environment.interface.schema.d.ts +11 -0
  180. package/dist/environment/kinds/schemas/environment.interface.schema.d.ts.map +1 -0
  181. package/dist/environment/kinds/schemas/environment.interface.schema.js +2 -0
  182. package/dist/environment/kinds/schemas/environment.interface.schema.js.map +1 -0
  183. package/dist/environment/kinds/schemas/environment.schema.d.ts +30 -0
  184. package/dist/environment/kinds/schemas/environment.schema.d.ts.map +1 -0
  185. package/dist/environment/kinds/schemas/environment.schema.js +2 -0
  186. package/dist/environment/kinds/schemas/environment.schema.js.map +1 -0
  187. package/dist/environment/schemas/current.schema.d.ts +20 -0
  188. package/dist/environment/schemas/current.schema.d.ts.map +1 -0
  189. package/dist/environment/schemas/current.schema.js +2 -0
  190. package/dist/environment/schemas/current.schema.js.map +1 -0
  191. package/dist/environment/schemas/environment.config.schema.d.ts +4 -0
  192. package/dist/environment/schemas/environment.config.schema.d.ts.map +1 -0
  193. package/dist/environment/schemas/environment.config.schema.js +2 -0
  194. package/dist/environment/schemas/environment.config.schema.js.map +1 -0
  195. package/dist/extensions/index.d.ts +8 -0
  196. package/dist/extensions/index.d.ts.map +1 -0
  197. package/dist/extensions/index.js +8 -0
  198. package/dist/extensions/index.js.map +1 -0
  199. package/dist/extensions/registry.d.ts +41 -0
  200. package/dist/extensions/registry.d.ts.map +1 -0
  201. package/dist/extensions/registry.js +142 -0
  202. package/dist/extensions/registry.js.map +1 -0
  203. package/dist/extensions/types.d.ts +101 -0
  204. package/dist/extensions/types.d.ts.map +1 -0
  205. package/dist/extensions/types.js +8 -0
  206. package/dist/extensions/types.js.map +1 -0
  207. package/dist/form/core/field-resolver.d.ts +42 -0
  208. package/dist/form/core/field-resolver.d.ts.map +1 -0
  209. package/dist/form/core/field-resolver.js +293 -0
  210. package/dist/form/core/field-resolver.js.map +1 -0
  211. package/dist/form/core/groups.d.ts +20 -0
  212. package/dist/form/core/groups.d.ts.map +1 -0
  213. package/dist/form/core/groups.js +69 -0
  214. package/dist/form/core/groups.js.map +1 -0
  215. package/dist/form/core/index.d.ts +8 -0
  216. package/dist/form/core/index.d.ts.map +1 -0
  217. package/dist/form/core/index.js +6 -0
  218. package/dist/form/core/index.js.map +1 -0
  219. package/dist/form/core/nested-utils.d.ts +40 -0
  220. package/dist/form/core/nested-utils.d.ts.map +1 -0
  221. package/dist/form/core/nested-utils.js +98 -0
  222. package/dist/form/core/nested-utils.js.map +1 -0
  223. package/dist/form/core/schemas/validation.schema.d.ts +9 -0
  224. package/dist/form/core/schemas/validation.schema.d.ts.map +1 -0
  225. package/dist/form/core/schemas/validation.schema.js +2 -0
  226. package/dist/form/core/schemas/validation.schema.js.map +1 -0
  227. package/dist/form/core/types.d.ts +103 -0
  228. package/dist/form/core/types.d.ts.map +1 -0
  229. package/dist/form/core/types.js +2 -0
  230. package/dist/form/core/types.js.map +1 -0
  231. package/dist/form/core/validation.d.ts +23 -0
  232. package/dist/form/core/validation.d.ts.map +1 -0
  233. package/dist/form/core/validation.js +103 -0
  234. package/dist/form/core/validation.js.map +1 -0
  235. package/dist/form/core/visibility.d.ts +37 -0
  236. package/dist/form/core/visibility.d.ts.map +1 -0
  237. package/dist/form/core/visibility.js +128 -0
  238. package/dist/form/core/visibility.js.map +1 -0
  239. package/dist/form/index.d.ts +8 -0
  240. package/dist/form/index.d.ts.map +1 -0
  241. package/dist/form/index.js +2 -0
  242. package/dist/form/index.js.map +1 -0
  243. package/dist/index.d.ts +18 -0
  244. package/dist/index.d.ts.map +1 -0
  245. package/dist/index.js +18 -0
  246. package/dist/index.js.map +1 -0
  247. package/dist/loader/cli/index.d.ts +61 -0
  248. package/dist/loader/cli/index.d.ts.map +1 -0
  249. package/dist/loader/cli/index.js +263 -0
  250. package/dist/loader/cli/index.js.map +1 -0
  251. package/dist/loader/cli/loaders.d.ts +13 -0
  252. package/dist/loader/cli/loaders.d.ts.map +1 -0
  253. package/dist/loader/cli/loaders.js +132 -0
  254. package/dist/loader/cli/loaders.js.map +1 -0
  255. package/dist/loader/cli/types.d.ts +152 -0
  256. package/dist/loader/cli/types.d.ts.map +1 -0
  257. package/dist/loader/cli/types.js +5 -0
  258. package/dist/loader/cli/types.js.map +1 -0
  259. package/dist/loader/cli/utils.d.ts +53 -0
  260. package/dist/loader/cli/utils.d.ts.map +1 -0
  261. package/dist/loader/cli/utils.js +198 -0
  262. package/dist/loader/cli/utils.js.map +1 -0
  263. package/dist/loader/client.d.ts +18 -0
  264. package/dist/loader/client.d.ts.map +1 -0
  265. package/dist/loader/client.js +109 -0
  266. package/dist/loader/client.js.map +1 -0
  267. package/dist/loader/discovery.d.ts +48 -0
  268. package/dist/loader/discovery.d.ts.map +1 -0
  269. package/dist/loader/discovery.js +253 -0
  270. package/dist/loader/discovery.js.map +1 -0
  271. package/dist/loader/file-loader.d.ts +17 -0
  272. package/dist/loader/file-loader.d.ts.map +1 -0
  273. package/dist/loader/file-loader.js +237 -0
  274. package/dist/loader/file-loader.js.map +1 -0
  275. package/dist/loader/index.d.ts +9 -0
  276. package/dist/loader/index.d.ts.map +1 -0
  277. package/dist/loader/index.js +8 -0
  278. package/dist/loader/index.js.map +1 -0
  279. package/dist/loader/index.server.d.ts +66 -0
  280. package/dist/loader/index.server.d.ts.map +1 -0
  281. package/dist/loader/index.server.js +256 -0
  282. package/dist/loader/index.server.js.map +1 -0
  283. package/dist/loader/merge.d.ts +88 -0
  284. package/dist/loader/merge.d.ts.map +1 -0
  285. package/dist/loader/merge.js +301 -0
  286. package/dist/loader/merge.js.map +1 -0
  287. package/dist/loader/schemas/merge.schema.d.ts +8 -0
  288. package/dist/loader/schemas/merge.schema.d.ts.map +1 -0
  289. package/dist/loader/schemas/merge.schema.js +2 -0
  290. package/dist/loader/schemas/merge.schema.js.map +1 -0
  291. package/dist/loader/schemas/validation.schema.d.ts +17 -0
  292. package/dist/loader/schemas/validation.schema.d.ts.map +1 -0
  293. package/dist/loader/schemas/validation.schema.js +2 -0
  294. package/dist/loader/schemas/validation.schema.js.map +1 -0
  295. package/dist/loader/server.d.ts +3 -0
  296. package/dist/loader/server.d.ts.map +1 -0
  297. package/dist/loader/server.js +2 -0
  298. package/dist/loader/server.js.map +1 -0
  299. package/dist/loader/types.d.ts +136 -0
  300. package/dist/loader/types.d.ts.map +1 -0
  301. package/dist/loader/types.js +24 -0
  302. package/dist/loader/types.js.map +1 -0
  303. package/dist/loader/validation.d.ts +59 -0
  304. package/dist/loader/validation.d.ts.map +1 -0
  305. package/dist/loader/validation.js +218 -0
  306. package/dist/loader/validation.js.map +1 -0
  307. package/dist/manifest/builder.d.ts +172 -0
  308. package/dist/manifest/builder.d.ts.map +1 -0
  309. package/dist/manifest/builder.js +336 -0
  310. package/dist/manifest/builder.js.map +1 -0
  311. package/dist/manifest/config-manifest.d.ts +199 -0
  312. package/dist/manifest/config-manifest.d.ts.map +1 -0
  313. package/dist/manifest/config-manifest.js +388 -0
  314. package/dist/manifest/config-manifest.js.map +1 -0
  315. package/dist/manifest/index.d.ts +10 -0
  316. package/dist/manifest/index.d.ts.map +1 -0
  317. package/dist/manifest/index.js +20 -0
  318. package/dist/manifest/index.js.map +1 -0
  319. package/dist/manifest/schema.d.ts +460 -0
  320. package/dist/manifest/schema.d.ts.map +1 -0
  321. package/dist/manifest/schema.js +187 -0
  322. package/dist/manifest/schema.js.map +1 -0
  323. package/dist/manifest/schemas/builder.schema.d.ts +20 -0
  324. package/dist/manifest/schemas/builder.schema.d.ts.map +1 -0
  325. package/dist/manifest/schemas/builder.schema.js +2 -0
  326. package/dist/manifest/schemas/builder.schema.js.map +1 -0
  327. package/dist/manifest/schemas/config-manifest.schema.d.ts +2 -0
  328. package/dist/manifest/schemas/config-manifest.schema.d.ts.map +1 -0
  329. package/dist/manifest/schemas/config-manifest.schema.js +2 -0
  330. package/dist/manifest/schemas/config-manifest.schema.js.map +1 -0
  331. package/dist/manifest/schemas/schema.schema.d.ts +83 -0
  332. package/dist/manifest/schemas/schema.schema.d.ts.map +1 -0
  333. package/dist/manifest/schemas/schema.schema.js +2 -0
  334. package/dist/manifest/schemas/schema.schema.js.map +1 -0
  335. package/dist/manifest/types.d.ts +563 -0
  336. package/dist/manifest/types.d.ts.map +1 -0
  337. package/dist/manifest/types.js +9 -0
  338. package/dist/manifest/types.js.map +1 -0
  339. package/dist/routing/index.d.ts +29 -0
  340. package/dist/routing/index.d.ts.map +1 -0
  341. package/dist/routing/index.js +35 -0
  342. package/dist/routing/index.js.map +1 -0
  343. package/dist/routing/merge.d.ts +164 -0
  344. package/dist/routing/merge.d.ts.map +1 -0
  345. package/dist/routing/merge.js +460 -0
  346. package/dist/routing/merge.js.map +1 -0
  347. package/dist/routing/registry.d.ts +145 -0
  348. package/dist/routing/registry.d.ts.map +1 -0
  349. package/dist/routing/registry.js +459 -0
  350. package/dist/routing/registry.js.map +1 -0
  351. package/dist/routing/schemas/merge.schema.d.ts +5 -0
  352. package/dist/routing/schemas/merge.schema.d.ts.map +1 -0
  353. package/dist/routing/schemas/merge.schema.js +2 -0
  354. package/dist/routing/schemas/merge.schema.js.map +1 -0
  355. package/dist/routing/types.d.ts +358 -0
  356. package/dist/routing/types.d.ts.map +1 -0
  357. package/dist/routing/types.js +89 -0
  358. package/dist/routing/types.js.map +1 -0
  359. package/dist/schema/extend-zod.d.ts +137 -0
  360. package/dist/schema/extend-zod.d.ts.map +1 -0
  361. package/dist/schema/extend-zod.js +243 -0
  362. package/dist/schema/extend-zod.js.map +1 -0
  363. package/dist/schema/index.d.ts +9 -0
  364. package/dist/schema/index.d.ts.map +1 -0
  365. package/dist/schema/index.js +10 -0
  366. package/dist/schema/index.js.map +1 -0
  367. package/dist/schema/references.d.ts +9 -0
  368. package/dist/schema/references.d.ts.map +1 -0
  369. package/dist/schema/references.js +9 -0
  370. package/dist/schema/references.js.map +1 -0
  371. package/dist/schema/resolver.d.ts +45 -0
  372. package/dist/schema/resolver.d.ts.map +1 -0
  373. package/dist/schema/resolver.js +267 -0
  374. package/dist/schema/resolver.js.map +1 -0
  375. package/dist/schema/schemas/extend-zod.schema.d.ts +16 -0
  376. package/dist/schema/schemas/extend-zod.schema.d.ts.map +1 -0
  377. package/dist/schema/schemas/extend-zod.schema.js +2 -0
  378. package/dist/schema/schemas/extend-zod.schema.js.map +1 -0
  379. package/dist/schema/schemas/references.schema.d.ts +70 -0
  380. package/dist/schema/schemas/references.schema.d.ts.map +1 -0
  381. package/dist/schema/schemas/references.schema.js +2 -0
  382. package/dist/schema/schemas/references.schema.js.map +1 -0
  383. package/dist/schemas/collection.d.ts +31 -0
  384. package/dist/schemas/collection.d.ts.map +1 -0
  385. package/dist/schemas/collection.js +22 -0
  386. package/dist/schemas/collection.js.map +1 -0
  387. package/dist/schemas/config-manifest-descriptor.d.ts +495 -0
  388. package/dist/schemas/config-manifest-descriptor.d.ts.map +1 -0
  389. package/dist/schemas/config-manifest-descriptor.js +210 -0
  390. package/dist/schemas/config-manifest-descriptor.js.map +1 -0
  391. package/dist/schemas/config-registry-state.d.ts +8 -0
  392. package/dist/schemas/config-registry-state.d.ts.map +1 -0
  393. package/dist/schemas/config-registry-state.js +6 -0
  394. package/dist/schemas/config-registry-state.js.map +1 -0
  395. package/dist/schemas/doctor.schema.d.ts +25 -0
  396. package/dist/schemas/doctor.schema.d.ts.map +1 -0
  397. package/dist/schemas/doctor.schema.js +2 -0
  398. package/dist/schemas/doctor.schema.js.map +1 -0
  399. package/dist/schemas/index.d.ts +8 -0
  400. package/dist/schemas/index.d.ts.map +1 -0
  401. package/dist/schemas/index.js +21 -0
  402. package/dist/schemas/index.js.map +1 -0
  403. package/dist/server/index.d.ts +5 -0
  404. package/dist/server/index.d.ts.map +1 -0
  405. package/dist/server/index.js +4 -0
  406. package/dist/server/index.js.map +1 -0
  407. package/dist/services/config-accessor.d.ts +40 -0
  408. package/dist/services/config-accessor.d.ts.map +1 -0
  409. package/dist/services/config-accessor.js +180 -0
  410. package/dist/services/config-accessor.js.map +1 -0
  411. package/dist/services/config-storage/index.d.ts +8 -0
  412. package/dist/services/config-storage/index.d.ts.map +1 -0
  413. package/dist/services/config-storage/index.js +7 -0
  414. package/dist/services/config-storage/index.js.map +1 -0
  415. package/dist/services/config-storage/service.d.ts +63 -0
  416. package/dist/services/config-storage/service.d.ts.map +1 -0
  417. package/dist/services/config-storage/service.js +234 -0
  418. package/dist/services/config-storage/service.js.map +1 -0
  419. package/dist/services/config.d.ts +3 -0
  420. package/dist/services/config.d.ts.map +1 -0
  421. package/dist/services/config.js +30 -0
  422. package/dist/services/config.js.map +1 -0
  423. package/dist/services/encryption.d.ts +114 -0
  424. package/dist/services/encryption.d.ts.map +1 -0
  425. package/dist/services/encryption.js +232 -0
  426. package/dist/services/encryption.js.map +1 -0
  427. package/dist/services/index.d.ts +12 -0
  428. package/dist/services/index.d.ts.map +1 -0
  429. package/dist/services/index.js +16 -0
  430. package/dist/services/index.js.map +1 -0
  431. package/dist/services/loader/loader.descriptor.d.ts +103 -0
  432. package/dist/services/loader/loader.descriptor.d.ts.map +1 -0
  433. package/dist/services/loader/loader.descriptor.js +60 -0
  434. package/dist/services/loader/loader.descriptor.js.map +1 -0
  435. package/dist/services/loader/loader.impl.cloud.d.ts +55 -0
  436. package/dist/services/loader/loader.impl.cloud.d.ts.map +1 -0
  437. package/dist/services/loader/loader.impl.cloud.js +182 -0
  438. package/dist/services/loader/loader.impl.cloud.js.map +1 -0
  439. package/dist/services/loader/loader.impl.consumer.d.ts +48 -0
  440. package/dist/services/loader/loader.impl.consumer.d.ts.map +1 -0
  441. package/dist/services/loader/loader.impl.consumer.js +175 -0
  442. package/dist/services/loader/loader.impl.consumer.js.map +1 -0
  443. package/dist/services/loader/loader.impl.consumer.local-first.d.ts +59 -0
  444. package/dist/services/loader/loader.impl.consumer.local-first.d.ts.map +1 -0
  445. package/dist/services/loader/loader.impl.consumer.local-first.js +347 -0
  446. package/dist/services/loader/loader.impl.consumer.local-first.js.map +1 -0
  447. package/dist/services/manifest-utils.d.ts +47 -0
  448. package/dist/services/manifest-utils.d.ts.map +1 -0
  449. package/dist/services/manifest-utils.js +105 -0
  450. package/dist/services/manifest-utils.js.map +1 -0
  451. package/dist/services/schemas/config-accessor.schema.d.ts +10 -0
  452. package/dist/services/schemas/config-accessor.schema.d.ts.map +1 -0
  453. package/dist/services/schemas/config-accessor.schema.js +2 -0
  454. package/dist/services/schemas/config-accessor.schema.js.map +1 -0
  455. package/dist/services/schemas/encryption.schema.d.ts +22 -0
  456. package/dist/services/schemas/encryption.schema.d.ts.map +1 -0
  457. package/dist/services/schemas/encryption.schema.js +2 -0
  458. package/dist/services/schemas/encryption.schema.js.map +1 -0
  459. package/dist/services/schemas/manifest-utils.schema.d.ts +4 -0
  460. package/dist/services/schemas/manifest-utils.schema.d.ts.map +1 -0
  461. package/dist/services/schemas/manifest-utils.schema.js +2 -0
  462. package/dist/services/schemas/manifest-utils.schema.js.map +1 -0
  463. package/dist/settings/assemble.d.ts +28 -0
  464. package/dist/settings/assemble.d.ts.map +1 -0
  465. package/dist/settings/assemble.js +30 -0
  466. package/dist/settings/assemble.js.map +1 -0
  467. package/dist/settings/index.d.ts +10 -0
  468. package/dist/settings/index.d.ts.map +1 -0
  469. package/dist/settings/index.js +10 -0
  470. package/dist/settings/index.js.map +1 -0
  471. package/dist/settings/settings-section.schema.d.ts +49 -0
  472. package/dist/settings/settings-section.schema.d.ts.map +1 -0
  473. package/dist/settings/settings-section.schema.js +70 -0
  474. package/dist/settings/settings-section.schema.js.map +1 -0
  475. package/dist/storage/adapter.d.ts +11 -0
  476. package/dist/storage/adapter.d.ts.map +1 -0
  477. package/dist/storage/adapter.js +8 -0
  478. package/dist/storage/adapter.js.map +1 -0
  479. package/dist/storage/index.d.ts +8 -0
  480. package/dist/storage/index.d.ts.map +1 -0
  481. package/dist/storage/index.js +8 -0
  482. package/dist/storage/index.js.map +1 -0
  483. package/dist/storage/schemas.d.ts +257 -0
  484. package/dist/storage/schemas.d.ts.map +1 -0
  485. package/dist/storage/schemas.js +179 -0
  486. package/dist/storage/schemas.js.map +1 -0
  487. package/dist/storage/types.d.ts +74 -0
  488. package/dist/storage/types.d.ts.map +1 -0
  489. package/dist/storage/types.js +7 -0
  490. package/dist/storage/types.js.map +1 -0
  491. package/dist/system-constants.d.ts +95 -0
  492. package/dist/system-constants.d.ts.map +1 -0
  493. package/dist/system-constants.js +110 -0
  494. package/dist/system-constants.js.map +1 -0
  495. package/package.json +417 -0
  496. package/src/adapters/cli/flags.ts +260 -0
  497. package/src/adapters/cli/index.ts +24 -0
  498. package/src/adapters/cli/mappings.ts +43 -0
  499. package/src/adapters/cli/prompts.ts +70 -0
  500. package/src/adapters/cli/schemas/flags.schema.ts +8 -0
  501. package/src/adapters/cli/schemas/mappings.schema.ts +3 -0
  502. package/src/adapters/cli/schemas/prompts.schema.ts +4 -0
  503. package/src/adapters/cli/schemas/wizard.schema.ts +21 -0
  504. package/src/adapters/cli/wizard.ts +106 -0
  505. package/src/adapters/web/components/ManifestForm.svelte +817 -0
  506. package/src/browser/index.ts +86 -0
  507. package/src/cli/settings.descriptor.ts +23 -0
  508. package/src/cli/types.ts +59 -0
  509. package/src/client/index.ts +169 -0
  510. package/src/client/storage.ts +76 -0
  511. package/src/collection/collection.ts +121 -0
  512. package/src/collection/index.ts +6 -0
  513. package/src/common/index.ts +86 -0
  514. package/src/config.context.descriptor.ts +12 -0
  515. package/src/config.plugin.ts +214 -0
  516. package/src/crud/base-types.ts +10 -0
  517. package/src/crud/index.ts +15 -0
  518. package/src/crud/schemas/base-types.schema.ts +20 -0
  519. package/src/crud/schemas/shared.schema.ts +14 -0
  520. package/src/crud/shared.ts +8 -0
  521. package/src/crud/types.ts +299 -0
  522. package/src/docs/environment.docs.descriptor.ts +385 -0
  523. package/src/docs/manifests.docs.descriptor.ts +505 -0
  524. package/src/docs/validation.docs.descriptor.ts +443 -0
  525. package/src/doctor.ts +143 -0
  526. package/src/env.runtime.ts +49 -0
  527. package/src/env.ts +91 -0
  528. package/src/environment/current.ts +108 -0
  529. package/src/environment/environment.config.descriptor.ts +60 -0
  530. package/src/environment/environment.config.schema.ts +24 -0
  531. package/src/environment/environment.local.descriptor.ts +45 -0
  532. package/src/environment/environment.plugin.ts +31 -0
  533. package/src/environment/environment.production.descriptor.ts +40 -0
  534. package/src/environment/environment.staging.descriptor.ts +25 -0
  535. package/src/environment/index.ts +22 -0
  536. package/src/environment/kinds/environment.default.ts +57 -0
  537. package/src/environment/kinds/environment.interface.ts +10 -0
  538. package/src/environment/kinds/environment.kind.ts +69 -0
  539. package/src/environment/kinds/environment.schema.ts +57 -0
  540. package/src/environment/kinds/index.ts +8 -0
  541. package/src/environment/kinds/schemas/environment.interface.schema.ts +11 -0
  542. package/src/environment/kinds/schemas/environment.schema.ts +24 -0
  543. package/src/environment/schemas/current.schema.ts +21 -0
  544. package/src/environment/schemas/environment.config.schema.ts +3 -0
  545. package/src/extensions/index.ts +26 -0
  546. package/src/extensions/registry.ts +179 -0
  547. package/src/extensions/types.ts +123 -0
  548. package/src/form/core/field-resolver.ts +380 -0
  549. package/src/form/core/groups.ts +96 -0
  550. package/src/form/core/index.ts +41 -0
  551. package/src/form/core/nested-utils.ts +115 -0
  552. package/src/form/core/schemas/validation.schema.ts +9 -0
  553. package/src/form/core/types.ts +115 -0
  554. package/src/form/core/validation.ts +137 -0
  555. package/src/form/core/visibility.ts +172 -0
  556. package/src/form/index.ts +36 -0
  557. package/src/index.ts +69 -0
  558. package/src/js-yaml.d.ts +4 -0
  559. package/src/loader/cli/index.ts +386 -0
  560. package/src/loader/cli/loaders.ts +153 -0
  561. package/src/loader/cli/types.ts +181 -0
  562. package/src/loader/cli/utils.ts +236 -0
  563. package/src/loader/client.ts +140 -0
  564. package/src/loader/discovery.ts +291 -0
  565. package/src/loader/file-loader.ts +262 -0
  566. package/src/loader/index.server.ts +389 -0
  567. package/src/loader/index.ts +18 -0
  568. package/src/loader/merge.ts +366 -0
  569. package/src/loader/schemas/merge.schema.ts +8 -0
  570. package/src/loader/schemas/validation.schema.ts +18 -0
  571. package/src/loader/server.ts +15 -0
  572. package/src/loader/types.ts +142 -0
  573. package/src/loader/validation.ts +261 -0
  574. package/src/manifest/builder.ts +452 -0
  575. package/src/manifest/config-manifest.ts +482 -0
  576. package/src/manifest/index.ts +92 -0
  577. package/src/manifest/schema.ts +249 -0
  578. package/src/manifest/schemas/builder.schema.ts +33 -0
  579. package/src/manifest/schemas/config-manifest.schema.ts +1 -0
  580. package/src/manifest/schemas/schema.schema.ts +99 -0
  581. package/src/manifest/types.ts +726 -0
  582. package/src/routing/index.ts +105 -0
  583. package/src/routing/merge.ts +589 -0
  584. package/src/routing/registry.ts +595 -0
  585. package/src/routing/schemas/merge.schema.ts +6 -0
  586. package/src/routing/types.ts +470 -0
  587. package/src/schema/extend-zod.ts +289 -0
  588. package/src/schema/index.ts +44 -0
  589. package/src/schema/references.ts +21 -0
  590. package/src/schema/resolver.ts +343 -0
  591. package/src/schema/schemas/extend-zod.schema.ts +16 -0
  592. package/src/schema/schemas/references.schema.ts +86 -0
  593. package/src/schemas/collection.ts +38 -0
  594. package/src/schemas/config-manifest-descriptor.ts +259 -0
  595. package/src/schemas/config-registry-state.ts +13 -0
  596. package/src/schemas/doctor.schema.ts +27 -0
  597. package/src/schemas/index.ts +53 -0
  598. package/src/server/index.ts +4 -0
  599. package/src/services/config-accessor.ts +218 -0
  600. package/src/services/config-storage/index.ts +8 -0
  601. package/src/services/config-storage/service.ts +355 -0
  602. package/src/services/config.ts +37 -0
  603. package/src/services/encryption.ts +260 -0
  604. package/src/services/index.ts +34 -0
  605. package/src/services/loader/loader.descriptor.ts +96 -0
  606. package/src/services/loader/loader.impl.cloud.ts +214 -0
  607. package/src/services/loader/loader.impl.consumer.local-first.ts +417 -0
  608. package/src/services/loader/loader.impl.consumer.ts +213 -0
  609. package/src/services/manifest-utils.ts +119 -0
  610. package/src/services/schemas/config-accessor.schema.ts +11 -0
  611. package/src/services/schemas/encryption.schema.ts +23 -0
  612. package/src/services/schemas/manifest-utils.schema.ts +4 -0
  613. package/src/settings/assemble.ts +46 -0
  614. package/src/settings/index.ts +19 -0
  615. package/src/settings/settings-section.schema.ts +84 -0
  616. package/src/storage/adapter.ts +12 -0
  617. package/src/storage/index.ts +48 -0
  618. package/src/storage/schemas.ts +215 -0
  619. package/src/storage/types.ts +88 -0
  620. package/src/system-constants.ts +121 -0
@@ -0,0 +1,443 @@
1
+ import type { DocsTopicDescriptor } from '@vibesdotdev/docs';
2
+
3
+ const descriptor: DocsTopicDescriptor = {
4
+ kind: 'docs/topic',
5
+ id: 'config.validation',
6
+ title: 'Configuration Validation',
7
+ summary: 'Schema validation, error handling, and defaults',
8
+ body: {
9
+ type: 'markdown',
10
+ sourceType: 'raw',
11
+ source: `---
12
+ title: Configuration Validation
13
+ summary: Schema validation, error handling, and defaults
14
+ tags: [config, validation, schema, errors, defaults]
15
+ parent: config
16
+ order: 3
17
+ surfaces: [cli, web, in-app]
18
+ hardware: [consumer, cloud]
19
+ ---
20
+
21
+ # Configuration Validation
22
+
23
+ Configuration validation ensures config data meets schema requirements, provides helpful error messages, and applies sensible defaults. The config system uses Zod schemas for type-safe validation.
24
+
25
+ ## Schema Validation
26
+
27
+ ### Zod Schema Basics
28
+
29
+ \`\`\`ts
30
+ import { z } from 'zod';
31
+
32
+ const configSchema = z.object({
33
+ // Required string
34
+ apiKey: z.string().min(1),
35
+
36
+ // Number with range
37
+ port: z.number().min(1).max(65535),
38
+
39
+ // Enum type
40
+ environment: z.enum(['development', 'production']),
41
+
42
+ // Optional with default
43
+ timeout: z.number().default(5000),
44
+
45
+ // Array of strings
46
+ allowedOrigins: z.array(z.string().url()),
47
+
48
+ // Nested object
49
+ database: z.object({
50
+ host: z.string(),
51
+ port: z.number(),
52
+ name: z.string()
53
+ })
54
+ });
55
+ \`\`\`
56
+
57
+ ### Parsing Configuration
58
+
59
+ \`\`\`ts
60
+ import { z } from 'zod';
61
+
62
+ const configSchema = z.object({
63
+ apiKey: z.string().min(1),
64
+ port: z.number().default(3000)
65
+ });
66
+
67
+ const rawConfig = {
68
+ apiKey: '<api-key>',
69
+ port: '3000' // string, will be coerced
70
+ };
71
+
72
+ try {
73
+ const config = configSchema.parse(rawConfig);
74
+ console.log(config); // { apiKey: '<api-key>', port: 3000 }
75
+ } catch (error) {
76
+ if (error instanceof z.ZodError) {
77
+ console.error(error.errors);
78
+ // [
79
+ // {
80
+ // path: ['apiKey'],
81
+ // message: 'Required',
82
+ // code: 'invalid_type'
83
+ // }
84
+ // ]
85
+ }
86
+ }
87
+ \`\`\`
88
+
89
+ ### Type Coercion
90
+
91
+ \`\`\`ts
92
+ const configSchema = z.object({
93
+ // Coerce string to number
94
+ port: z.coerce.number().default(3000),
95
+
96
+ // Coerce string to boolean
97
+ debug: z.coerce.boolean().default(false),
98
+
99
+ // Coerce string to date
100
+ createdAt: z.coerce.date()
101
+ });
102
+
103
+ const rawConfig = {
104
+ port: '3000',
105
+ debug: 'true',
106
+ createdAt: '2024-01-01'
107
+ };
108
+
109
+ const config = configSchema.parse(rawConfig);
110
+ // { port: 3000, debug: true, createdAt: Date }
111
+ \`\`\`
112
+
113
+ ## Validation Errors
114
+
115
+ ### Error Format
116
+
117
+ \`\`\`ts
118
+ interface ValidationError {
119
+ code: string; // 'invalid_type', 'too_small', etc.
120
+ path: string[]; // ['database', 'host']
121
+ message: string; // 'Required'
122
+ expected?: string; // 'string'
123
+ received?: string; // 'undefined'
124
+ }
125
+ \`\`\`
126
+
127
+ ### Error Handling
128
+
129
+ \`\`\`ts
130
+ import { validateConfig } from '@vibesdotdev/config';
131
+
132
+ const result = validateConfig(configSchema, rawData);
133
+
134
+ if (!result.success) {
135
+ console.error('Validation failed:');
136
+ for (const error of result.errors) {
137
+ console.error(\` \${error.path.join('.')}: \${error.message}\`);
138
+ }
139
+ } else {
140
+ console.log('Config valid:', result.data);
141
+ }
142
+ \`\`\`
143
+
144
+ ### Custom Error Messages
145
+
146
+ \`\`\`ts
147
+ const configSchema = z.object({
148
+ email: z.string().email('Must be a valid email address'),
149
+ password: z
150
+ .string()
151
+ .min(8, 'Password must be at least 8 characters')
152
+ .regex(/[A-Z]/, 'Password must contain uppercase letter')
153
+ .regex(/[0-9]/, 'Password must contain number'),
154
+ age: z.number().min(18, 'Must be 18 or older')
155
+ });
156
+ \`\`\`
157
+
158
+ ### Error Formatting
159
+
160
+ \`\`\`ts
161
+ import { formatValidationErrors } from '@vibesdotdev/config';
162
+
163
+ try {
164
+ configSchema.parse(rawData);
165
+ } catch (error) {
166
+ if (error instanceof z.ZodError) {
167
+ const formatted = formatValidationErrors(error);
168
+ console.log(formatted);
169
+ // {
170
+ // fieldErrors: {
171
+ // email: ['Must be a valid email address'],
172
+ // password: ['Password must be at least 8 characters']
173
+ // },
174
+ // rootErrors: []
175
+ // }
176
+ }
177
+ }
178
+ \`\`\`
179
+
180
+ ## Default Values
181
+
182
+ ### Schema Defaults
183
+
184
+ \`\`\`ts
185
+ const configSchema = z.object({
186
+ // Simple default
187
+ debug: z.boolean().default(false),
188
+
189
+ // Default with transform
190
+ tags: z.string().transform((s) => s.split(',')).default(''),
191
+
192
+ // Default object
193
+ settings: z.object({
194
+ theme: z.enum(['light', 'dark']).default('system'),
195
+ notifications: z.boolean().default(true)
196
+ }).default({})
197
+ });
198
+ \`\`\`
199
+
200
+ ### Context-Aware Defaults
201
+
202
+ \`\`\`ts
203
+ import { applyDefaults } from '@vibesdotdev/config';
204
+
205
+ const configSchema = z.object({
206
+ apiUrl: z.string(),
207
+ timeout: z.number()
208
+ });
209
+
210
+ const defaults = {
211
+ apiUrl: {
212
+ type: 'context',
213
+ rules: [
214
+ {
215
+ when: { environment: 'development' },
216
+ value: 'http://localhost:3000'
217
+ },
218
+ {
219
+ when: { environment: 'production' },
220
+ value: 'https://api.vibes.dev'
221
+ }
222
+ ]
223
+ },
224
+ timeout: {
225
+ type: 'context',
226
+ rules: [
227
+ {
228
+ when: { hardware: 'consumer' },
229
+ value: 30000
230
+ },
231
+ {
232
+ when: { hardware: 'cloud' },
233
+ value: 10000
234
+ }
235
+ ]
236
+ }
237
+ };
238
+
239
+ const config = applyDefaults(configSchema, rawData, {
240
+ environment: 'production',
241
+ hardware: 'cloud'
242
+ });
243
+ \`\`\`
244
+
245
+ ### Lazy Defaults
246
+
247
+ \`\`\`ts
248
+ const configSchema = z.object({
249
+ // Default from environment variable
250
+ apiKey: z.string().default(() => process.env.API_KEY),
251
+
252
+ // Default from function
253
+ timestamp: z.number().default(() => Date.now()),
254
+
255
+ // Default from async function
256
+ version: z.string().default(async () => {
257
+ const pkg = await import('../package.json');
258
+ return pkg.version;
259
+ })
260
+ });
261
+ \`\`\`
262
+
263
+ ## Custom Validation
264
+
265
+ ### Refine Validation
266
+
267
+ \`\`\`ts
268
+ const configSchema = z.object({
269
+ password: z.string(),
270
+ confirmPassword: z.string()
271
+ }).refine(
272
+ (data) => data.password === data.confirmPassword,
273
+ {
274
+ message: 'Passwords do not match',
275
+ path: ['confirmPassword']
276
+ }
277
+ );
278
+ \`\`\`
279
+
280
+ ### Async Validation
281
+
282
+ \`\`\`ts
283
+ const configSchema = z.object({
284
+ apiKey: z.string()
285
+ }).refineAsync(
286
+ async (data) => {
287
+ // Validate API key with remote service
288
+ const response = await fetch('https://api.example.com/validate', {
289
+ headers: { Authorization: \`Bearer \${data.apiKey}\` }
290
+ });
291
+ return response.ok;
292
+ },
293
+ {
294
+ message: 'Invalid API key',
295
+ path: ['apiKey']
296
+ }
297
+ );
298
+ \`\`\`
299
+
300
+ ### Transform Validation
301
+
302
+ \`\`\`ts
303
+ const configSchema = z.object({
304
+ // Trim and lowercase email
305
+ email: z.string().transform((s) => s.trim().toLowerCase()),
306
+
307
+ // Parse JSON string
308
+ metadata: z.string().transform((s) => JSON.parse(s)),
309
+
310
+ // Validate and transform
311
+ port: z.string().transform((s) => {
312
+ const port = parseInt(s, 10);
313
+ if (port < 1 || port > 65535) {
314
+ throw new Error('Invalid port number');
315
+ }
316
+ return port;
317
+ })
318
+ });
319
+ \`\`\`
320
+
321
+ ## Validation Strategies
322
+
323
+ ### Strict Validation
324
+
325
+ \`\`\`ts
326
+ const configSchema = z.object({
327
+ apiKey: z.string()
328
+ }).strict(); // Reject unknown keys
329
+
330
+ try {
331
+ configSchema.parse({ apiKey: '<api-key>', unknown: 'value' });
332
+ } catch (error) {
333
+ console.error(error); // Unrecognized key 'unknown'
334
+ }
335
+ \`\`\`
336
+
337
+ ### Passthrough Validation
338
+
339
+ \`\`\`ts
340
+ const configSchema = z.object({
341
+ apiKey: z.string()
342
+ }).passthrough(); // Allow unknown keys
343
+
344
+ const config = configSchema.parse({
345
+ apiKey: '<api-key>',
346
+ unknown: 'value' // preserved
347
+ });
348
+ \`\`\`
349
+
350
+ ### Partial Validation
351
+
352
+ \`\`\`ts
353
+ const configSchema = z.object({
354
+ apiKey: z.string(),
355
+ port: z.number()
356
+ }).partial(); // All fields optional
357
+
358
+ const config = configSchema.parse({});
359
+ // {}
360
+ \`\`\`
361
+
362
+ ## Validation Utilities
363
+
364
+ ### Deep Merge
365
+
366
+ \`\`\`ts
367
+ import { deepMerge } from '@vibesdotdev/config';
368
+
369
+ const defaults = {
370
+ database: {
371
+ host: 'localhost',
372
+ port: 5432
373
+ }
374
+ };
375
+
376
+ const overrides = {
377
+ database: {
378
+ host: 'db.example.com'
379
+ }
380
+ };
381
+
382
+ const merged = deepMerge(defaults, overrides);
383
+ // { database: { host: 'db.example.com', port: 5432 } }
384
+ \`\`\`
385
+
386
+ ### Flatten Errors
387
+
388
+ \`\`\`ts
389
+ import { flattenErrors } from '@vibesdotdev/config';
390
+
391
+ const zodError = new z.ZodError([...]);
392
+ const flat = flattenErrors(zodError);
393
+
394
+ console.log(flat);
395
+ // {
396
+ // 'database.host': ['Required'],
397
+ // 'database.port': ['Must be a number']
398
+ // }
399
+ \`\`\`
400
+
401
+ ### Validate Against Schema
402
+
403
+ \`\`\`ts
404
+ import { validateAgainstSchema } from '@vibesdotdev/config';
405
+
406
+ const result = validateAgainstSchema(configSchema, rawData, {
407
+ strict: true,
408
+ applyDefaults: true,
409
+ context: { environment: 'production' }
410
+ });
411
+
412
+ if (result.success) {
413
+ console.log(result.data); // Validated config with defaults
414
+ } else {
415
+ console.error(result.errors);
416
+ }
417
+ \`\`\`
418
+
419
+ ## Best Practices
420
+
421
+ 1. **Use specific schemas** — Avoid \`z.any()\` or \`z.unknown()\`
422
+ 2. **Provide helpful error messages** — Guide users to fix issues
423
+ 3. **Apply sensible defaults** — Reduce required configuration
424
+ 4. **Validate early** — Fail fast on invalid config
425
+ 5. **Use context-aware defaults** — Different values per environment
426
+ 6. **Document required fields** — Clear what must be provided
427
+
428
+ :::card{title="See also"}
429
+ - [\`config.manifests\`](config.manifests) — Configuration manifests
430
+ - [\`config.environment\`](config.environment) — Environment variables
431
+ - [\`storage.manifests\`](storage.manifests) — Storage manifests
432
+ :::
433
+ `
434
+ },
435
+ parent: 'config',
436
+ order: 3,
437
+ tags: ['config', 'validation', 'schema', 'errors', 'defaults'],
438
+ surfaces: ['cli', 'web', 'in-app'],
439
+ hardware: ['consumer', 'cloud'],
440
+ enabled: true
441
+ };
442
+
443
+ export default descriptor;
package/src/doctor.ts ADDED
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Config Doctor
3
+ *
4
+ * Generic diagnostic functions for validating configuration state.
5
+ */
6
+
7
+ import type { ConfigManifest } from './manifest/types';
8
+ import type { ConfigCollection } from './collection/collection';
9
+
10
+ import type { DiagnosticIssue, DetailedDiagnostic, DiagnoseConfigOptions } from './schemas/doctor.schema.ts';
11
+
12
+ export type { DiagnosticSeverity, DiagnosticIssue, DetailedDiagnostic, DiagnoseConfigOptions } from './schemas/doctor.schema.ts';
13
+
14
+ /**
15
+ * Generic diagnostic function for any ConfigManifest.
16
+ *
17
+ * Validates:
18
+ * - Required fields are present
19
+ * - Values match schema constraints
20
+ * - No deprecated settings (optional)
21
+ * - Custom validation rules
22
+ *
23
+ * @param manifest - The ConfigManifest to diagnose
24
+ * @param values - The current configuration values
25
+ * @param options - Diagnostic options
26
+ * @returns Detailed diagnostic result
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const result = diagnoseConfig(myManifest, currentValues);
31
+ * if (!result.ready) {
32
+ * console.error('Config errors:', result.issues.filter(i => i.severity === 'error'));
33
+ * }
34
+ * ```
35
+ */
36
+ export function diagnoseConfig<T extends ConfigManifest>(
37
+ manifest: T,
38
+ values: Record<string, unknown>,
39
+ options: DiagnoseConfigOptions = {}
40
+ ): DetailedDiagnostic {
41
+ const issues: DiagnosticIssue[] = [];
42
+ const { checkDeprecated = false } = options;
43
+
44
+ // Check all fields from manifest
45
+ for (const [fieldKey, fieldMeta] of Object.entries(manifest.fields)) {
46
+ const value = getValueAtPath(values, fieldKey);
47
+
48
+ // Check required fields (fields without defaults)
49
+ // Empty string and null count as missing
50
+ const hasValue = value !== undefined && value !== null && value !== '';
51
+ if (fieldMeta.defaults?.base === undefined && !hasValue) {
52
+ issues.push({
53
+ path: fieldKey,
54
+ message: `Required field '${fieldMeta.ui.label || fieldKey}' is missing`,
55
+ severity: 'error',
56
+ code: 'required_field_missing'
57
+ });
58
+ }
59
+
60
+ // Check deprecated fields
61
+ if (checkDeprecated && fieldMeta.tags?.includes('deprecated')) {
62
+ if (value !== undefined && value !== null) {
63
+ issues.push({
64
+ path: fieldKey,
65
+ message: `Field '${fieldMeta.ui.label || fieldKey}' is deprecated and should be removed`,
66
+ severity: 'warning',
67
+ code: 'deprecated_field_used'
68
+ });
69
+ }
70
+ }
71
+ }
72
+
73
+ // Run custom validators
74
+ if (options.customValidators) {
75
+ for (const { path, fn } of options.customValidators) {
76
+ const value = getValueAtPath(values, path);
77
+ const error = fn(value);
78
+ if (error) {
79
+ issues.push({
80
+ path,
81
+ message: error,
82
+ severity: 'error',
83
+ code: 'custom_validation_failed'
84
+ });
85
+ }
86
+ }
87
+ }
88
+
89
+ const errors = issues.filter((i) => i.severity === 'error').length;
90
+ const warnings = issues.filter((i) => i.severity === 'warning').length;
91
+ const info = issues.filter((i) => i.severity === 'info').length;
92
+
93
+ return {
94
+ ready: errors === 0,
95
+ issues,
96
+ summary: { errors, warnings, info }
97
+ };
98
+ }
99
+
100
+ /**
101
+ * Diagnose a ConfigCollection (group of related configs).
102
+ *
103
+ * Validates that all manifests in the collection are properly configured.
104
+ *
105
+ * @param collection - The ConfigCollection to diagnose
106
+ * @returns Diagnostic results for each manifest in the collection
107
+ */
108
+ export async function diagnoseCollection(
109
+ collection: ConfigCollection
110
+ ): Promise<Record<string, DetailedDiagnostic>> {
111
+ const results: Record<string, DetailedDiagnostic> = {};
112
+
113
+ for (const manifestId of collection.manifestIds) {
114
+ // Load current values for this manifest
115
+ // Note: This assumes manifests are registered and loadable
116
+ results[manifestId] = {
117
+ ready: true,
118
+ issues: [],
119
+ summary: { errors: 0, warnings: 0, info: 0 }
120
+ };
121
+ }
122
+
123
+ return results;
124
+ }
125
+
126
+ /**
127
+ * Helper: Get value at a dot-notation path from an object
128
+ */
129
+ function getValueAtPath(obj: Record<string, unknown>, path: string): unknown {
130
+ if (path in obj) {
131
+ return obj[path];
132
+ }
133
+
134
+ const parts = path.split('.');
135
+ let current: unknown = obj;
136
+ for (const part of parts) {
137
+ if (current == null || typeof current !== 'object') {
138
+ return undefined;
139
+ }
140
+ current = (current as Record<string, unknown>)[part];
141
+ }
142
+ return current;
143
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Runtime environment access for storage policy and other runtime-dependent modules.
3
+ *
4
+ * Provides settable env overrides so tests can inject values without mutating process.env.
5
+ */
6
+
7
+ declare const window: Record<string, unknown> | undefined;
8
+
9
+ type WindowWithEnv = { __env?: Record<string, string | undefined>; [key: string]: unknown };
10
+
11
+ /** Internal mutable env override map (used by tests) */
12
+ const envOverrides = new Map<string, string>();
13
+
14
+ /**
15
+ * Read an environment variable at runtime.
16
+ * Priority: envOverrides → process.env → browser window.__env
17
+ */
18
+ export function readRuntimeEnv(key: string): string | undefined {
19
+ if (envOverrides.has(key)) return envOverrides.get(key);
20
+
21
+ const publicKey = `PUBLIC_${key}`;
22
+
23
+ if (typeof window !== 'undefined') {
24
+ return (window as WindowWithEnv).__env?.[publicKey];
25
+ }
26
+
27
+ if (typeof process !== 'undefined') {
28
+ return (
29
+ process.env?.[key] ??
30
+ process.env?.[publicKey]
31
+ );
32
+ }
33
+
34
+ return undefined;
35
+ }
36
+
37
+ /**
38
+ * Set an environment variable override (primarily for testing).
39
+ */
40
+ export function setRuntimeEnv(key: string, value: string): void {
41
+ envOverrides.set(key, value);
42
+ }
43
+
44
+ /**
45
+ * Clear all environment overrides (primarily for testing).
46
+ */
47
+ export function clearRuntimeEnvOverrides(): void {
48
+ envOverrides.clear();
49
+ }
package/src/env.ts ADDED
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Generic environment-variable helpers.
3
+ *
4
+ * This module is the canonical home for *generic* env access: read a key,
5
+ * parse a number, parse a boolean, validate required keys at startup. It is
6
+ * isomorphic — works in Node/server and browser (`window.__env`).
7
+ *
8
+ * Domain-specific env (AI provider keys, OAuth callback URLs, SMTP, Linear
9
+ * status IDs, scheduler crons, …) lives with the owning module. Do not
10
+ * re-introduce a monorepo-wide `env` aggregate here.
11
+ *
12
+ * See `packages/config/SPEC.md` ("Does not own").
13
+ */
14
+
15
+ // Declare browser globals for isomorphic compatibility (this file runs in both Node and browser)
16
+ declare const window: Record<string, unknown> | undefined;
17
+
18
+ type WindowWithEnv = { __env?: Record<string, string | undefined>; [key: string]: unknown };
19
+
20
+ function readBrowserEnv(key: string): string | undefined {
21
+ if (typeof window === 'undefined') return undefined;
22
+ return (window as WindowWithEnv).__env?.[key];
23
+ }
24
+
25
+ function readProcessEnv(key: string): string | undefined {
26
+ if (typeof process === 'undefined') return undefined;
27
+ return process.env?.[key];
28
+ }
29
+
30
+ function readRuntimeEnv(key: string): string | undefined {
31
+ const publicKey = `PUBLIC_${key}`;
32
+ if (typeof window !== 'undefined') {
33
+ return readBrowserEnv(publicKey);
34
+ }
35
+ return (
36
+ readProcessEnv(key) ??
37
+ readProcessEnv(publicKey) ??
38
+ readBrowserEnv(key) ??
39
+ readBrowserEnv(publicKey)
40
+ );
41
+ }
42
+
43
+ function isServerRuntime(): boolean {
44
+ return typeof window === 'undefined' && typeof process !== 'undefined';
45
+ }
46
+
47
+ /** Read an env var (or the `PUBLIC_`-prefixed variant) with a fallback. */
48
+ export function getEnv(key: string, defaultValue?: string): string {
49
+ return readRuntimeEnv(key) || defaultValue || '';
50
+ }
51
+
52
+ /** Read an env var as a number, falling back when missing or unparseable. */
53
+ export function getEnvNumber(key: string, defaultValue: number): number {
54
+ const value = getEnv(key);
55
+ const parsed = parseInt(value, 10);
56
+ return isNaN(parsed) ? defaultValue : parsed;
57
+ }
58
+
59
+ /** Read an env var as a boolean (`"true"` is true; anything else is the default). */
60
+ export function getEnvBoolean(key: string, defaultValue: boolean): boolean {
61
+ const value = getEnv(key);
62
+ if (!value) return defaultValue;
63
+ return value.toLowerCase() === 'true';
64
+ }
65
+
66
+ /**
67
+ * Assert that the given env vars are set. No-op in browser runtimes.
68
+ * Throws with a formatted message listing every missing key.
69
+ */
70
+ export function validateRequiredEnv(required: Array<{ key: string; description: string }>): void {
71
+ if (!isServerRuntime()) {
72
+ return;
73
+ }
74
+
75
+ const missing: Array<{ key: string; description: string }> = [];
76
+
77
+ for (const { key, description } of required) {
78
+ if (!readRuntimeEnv(key)) {
79
+ missing.push({ key, description });
80
+ }
81
+ }
82
+
83
+ if (missing.length > 0) {
84
+ const errorList = missing
85
+ .map(({ key, description }) => ` - ${key}: ${description}`)
86
+ .join('\n');
87
+ throw new Error(
88
+ `Missing required environment variables:\n${errorList}\n\nPlease set these variables in your environment or .env file.`
89
+ );
90
+ }
91
+ }