@blotch/dolan 0.0.0-stage → 22.2.0

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 (273) hide show
  1. package/dist/commands/add.d.ts +22 -0
  2. package/dist/commands/add.js +132 -0
  3. package/dist/commands/add.js.map +1 -0
  4. package/dist/commands/add.test.d.ts +1 -0
  5. package/dist/commands/add.test.js +209 -0
  6. package/dist/commands/add.test.js.map +1 -0
  7. package/dist/commands/diff.d.ts +13 -0
  8. package/dist/commands/diff.js +155 -0
  9. package/dist/commands/diff.js.map +1 -0
  10. package/dist/commands/diff.test.d.ts +1 -0
  11. package/dist/commands/diff.test.js +327 -0
  12. package/dist/commands/diff.test.js.map +1 -0
  13. package/dist/commands/doctor.d.ts +15 -0
  14. package/dist/commands/doctor.js +248 -0
  15. package/dist/commands/doctor.js.map +1 -0
  16. package/dist/commands/doctor.test.d.ts +1 -0
  17. package/dist/commands/doctor.test.js +301 -0
  18. package/dist/commands/doctor.test.js.map +1 -0
  19. package/dist/commands/eject.d.ts +11 -0
  20. package/dist/commands/eject.js +55 -0
  21. package/dist/commands/eject.js.map +1 -0
  22. package/dist/commands/eject.test.d.ts +1 -0
  23. package/dist/commands/eject.test.js +151 -0
  24. package/dist/commands/eject.test.js.map +1 -0
  25. package/dist/commands/info.d.ts +1 -0
  26. package/dist/commands/info.js +73 -0
  27. package/dist/commands/info.js.map +1 -0
  28. package/dist/commands/info.test.d.ts +1 -0
  29. package/dist/commands/info.test.js +143 -0
  30. package/dist/commands/info.test.js.map +1 -0
  31. package/dist/commands/init.d.ts +1 -0
  32. package/dist/commands/init.js +98 -0
  33. package/dist/commands/init.js.map +1 -0
  34. package/dist/commands/init.test.d.ts +1 -0
  35. package/dist/commands/init.test.js +154 -0
  36. package/dist/commands/init.test.js.map +1 -0
  37. package/dist/commands/list.d.ts +16 -0
  38. package/dist/commands/list.js +124 -0
  39. package/dist/commands/list.js.map +1 -0
  40. package/dist/commands/list.test.d.ts +1 -0
  41. package/dist/commands/list.test.js +285 -0
  42. package/dist/commands/list.test.js.map +1 -0
  43. package/dist/commands/outdated.d.ts +13 -0
  44. package/dist/commands/outdated.js +116 -0
  45. package/dist/commands/outdated.js.map +1 -0
  46. package/dist/commands/outdated.test.d.ts +1 -0
  47. package/dist/commands/outdated.test.js +208 -0
  48. package/dist/commands/outdated.test.js.map +1 -0
  49. package/dist/commands/remove.d.ts +18 -0
  50. package/dist/commands/remove.js +161 -0
  51. package/dist/commands/remove.js.map +1 -0
  52. package/dist/commands/remove.test.d.ts +1 -0
  53. package/dist/commands/remove.test.js +361 -0
  54. package/dist/commands/remove.test.js.map +1 -0
  55. package/dist/commands/theme.d.ts +1 -0
  56. package/dist/commands/theme.js +66 -0
  57. package/dist/commands/theme.js.map +1 -0
  58. package/dist/commands/theme.test.d.ts +1 -0
  59. package/dist/commands/theme.test.js +133 -0
  60. package/dist/commands/theme.test.js.map +1 -0
  61. package/dist/commands/update.d.ts +31 -0
  62. package/dist/commands/update.js +601 -0
  63. package/dist/commands/update.js.map +1 -0
  64. package/dist/commands/update.test.d.ts +1 -0
  65. package/dist/commands/update.test.js +1233 -0
  66. package/dist/commands/update.test.js.map +1 -0
  67. package/dist/config.d.ts +11 -0
  68. package/dist/config.js +19 -0
  69. package/dist/config.js.map +1 -0
  70. package/dist/config.test.d.ts +1 -0
  71. package/dist/config.test.js +48 -0
  72. package/dist/config.test.js.map +1 -0
  73. package/dist/index.d.ts +2 -0
  74. package/dist/index.js +89 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/lockfile.d.ts +21 -0
  77. package/dist/lockfile.js +39 -0
  78. package/dist/lockfile.js.map +1 -0
  79. package/dist/registry.d.ts +14 -0
  80. package/dist/registry.js +85 -0
  81. package/dist/registry.js.map +1 -0
  82. package/dist/registry.test.d.ts +1 -0
  83. package/dist/registry.test.js +95 -0
  84. package/dist/registry.test.js.map +1 -0
  85. package/dist/test-utils.d.ts +16 -0
  86. package/dist/test-utils.js +65 -0
  87. package/dist/test-utils.js.map +1 -0
  88. package/dist/ui/components/accordion/accordion.test.ts +194 -0
  89. package/dist/ui/components/accordion/accordion.ts +173 -0
  90. package/dist/ui/components/accordion/index.ts +6 -0
  91. package/dist/ui/components/action-sheet/action-sheet.test.ts +211 -0
  92. package/dist/ui/components/action-sheet/action-sheet.ts +353 -0
  93. package/dist/ui/components/action-sheet/index.ts +6 -0
  94. package/dist/ui/components/alert/alert.test.ts +48 -0
  95. package/dist/ui/components/alert/alert.ts +104 -0
  96. package/dist/ui/components/alert/index.ts +1 -0
  97. package/dist/ui/components/alert-dialog/alert-dialog.test.ts +141 -0
  98. package/dist/ui/components/alert-dialog/alert-dialog.ts +243 -0
  99. package/dist/ui/components/alert-dialog/index.ts +7 -0
  100. package/dist/ui/components/area-chart/area-chart-render.test.ts +121 -0
  101. package/dist/ui/components/area-chart/area-chart.test.ts +158 -0
  102. package/dist/ui/components/area-chart/area-chart.ts +349 -0
  103. package/dist/ui/components/area-chart/index.ts +6 -0
  104. package/dist/ui/components/aspect-ratio/aspect-ratio.test.ts +10 -0
  105. package/dist/ui/components/aspect-ratio/aspect-ratio.ts +28 -0
  106. package/dist/ui/components/aspect-ratio/index.ts +1 -0
  107. package/dist/ui/components/avatar/avatar.test.ts +69 -0
  108. package/dist/ui/components/avatar/avatar.ts +131 -0
  109. package/dist/ui/components/avatar/index.ts +1 -0
  110. package/dist/ui/components/badge/badge.test.ts +49 -0
  111. package/dist/ui/components/badge/badge.ts +97 -0
  112. package/dist/ui/components/badge/index.ts +1 -0
  113. package/dist/ui/components/bar-chart/bar-chart-render.test.ts +174 -0
  114. package/dist/ui/components/bar-chart/bar-chart.test.ts +73 -0
  115. package/dist/ui/components/bar-chart/bar-chart.ts +327 -0
  116. package/dist/ui/components/bar-chart/index.ts +6 -0
  117. package/dist/ui/components/bottom-sheet/bottom-sheet.test.ts +163 -0
  118. package/dist/ui/components/bottom-sheet/bottom-sheet.ts +339 -0
  119. package/dist/ui/components/bottom-sheet/index.ts +1 -0
  120. package/dist/ui/components/button/button-render.test.ts +113 -0
  121. package/dist/ui/components/button/button.test.ts +70 -0
  122. package/dist/ui/components/button/button.ts +170 -0
  123. package/dist/ui/components/button/index.ts +6 -0
  124. package/dist/ui/components/button-group/button-group-render.test.ts +146 -0
  125. package/dist/ui/components/button-group/button-group.test.ts +54 -0
  126. package/dist/ui/components/button-group/button-group.ts +209 -0
  127. package/dist/ui/components/button-group/index.ts +8 -0
  128. package/dist/ui/components/candlestick-chart/candlestick-chart-render.test.ts +174 -0
  129. package/dist/ui/components/candlestick-chart/candlestick-chart.test.ts +96 -0
  130. package/dist/ui/components/candlestick-chart/candlestick-chart.ts +355 -0
  131. package/dist/ui/components/candlestick-chart/index.ts +7 -0
  132. package/dist/ui/components/card/card.test.ts +110 -0
  133. package/dist/ui/components/card/card.ts +162 -0
  134. package/dist/ui/components/card/index.ts +8 -0
  135. package/dist/ui/components/cartesian-chart/cartesian-chart-render.test.ts +188 -0
  136. package/dist/ui/components/cartesian-chart/cartesian-chart.test.ts +549 -0
  137. package/dist/ui/components/cartesian-chart/cartesian-chart.ts +1140 -0
  138. package/dist/ui/components/cartesian-chart/index.ts +18 -0
  139. package/dist/ui/components/checkbox/checkbox.test.ts +59 -0
  140. package/dist/ui/components/checkbox/checkbox.ts +96 -0
  141. package/dist/ui/components/checkbox/index.ts +1 -0
  142. package/dist/ui/components/collapsible/collapsible.test.ts +112 -0
  143. package/dist/ui/components/collapsible/collapsible.ts +122 -0
  144. package/dist/ui/components/collapsible/index.ts +5 -0
  145. package/dist/ui/components/dialog/dialog.test.ts +157 -0
  146. package/dist/ui/components/dialog/dialog.ts +248 -0
  147. package/dist/ui/components/dialog/index.ts +7 -0
  148. package/dist/ui/components/empty-state/empty-state.test.ts +60 -0
  149. package/dist/ui/components/empty-state/empty-state.ts +46 -0
  150. package/dist/ui/components/empty-state/index.ts +1 -0
  151. package/dist/ui/components/icon/icon.test.ts +52 -0
  152. package/dist/ui/components/icon/icon.ts +54 -0
  153. package/dist/ui/components/icon/icons.ts +569 -0
  154. package/dist/ui/components/icon/index.ts +2 -0
  155. package/dist/ui/components/input/index.ts +1 -0
  156. package/dist/ui/components/input/input.test.ts +134 -0
  157. package/dist/ui/components/input/input.ts +189 -0
  158. package/dist/ui/components/label/index.ts +1 -0
  159. package/dist/ui/components/label/label.test.ts +38 -0
  160. package/dist/ui/components/label/label.ts +24 -0
  161. package/dist/ui/components/line-chart/index.ts +6 -0
  162. package/dist/ui/components/line-chart/line-chart-render.test.ts +121 -0
  163. package/dist/ui/components/line-chart/line-chart.test.ts +81 -0
  164. package/dist/ui/components/line-chart/line-chart.ts +273 -0
  165. package/dist/ui/components/list/index.ts +1 -0
  166. package/dist/ui/components/list/list.test.ts +35 -0
  167. package/dist/ui/components/list/list.ts +71 -0
  168. package/dist/ui/components/nav-drawer/index.ts +8 -0
  169. package/dist/ui/components/nav-drawer/nav-drawer.test.ts +267 -0
  170. package/dist/ui/components/nav-drawer/nav-drawer.ts +504 -0
  171. package/dist/ui/components/pagination/index.ts +1 -0
  172. package/dist/ui/components/pagination/pagination.test.ts +96 -0
  173. package/dist/ui/components/pagination/pagination.ts +147 -0
  174. package/dist/ui/components/progress/index.ts +1 -0
  175. package/dist/ui/components/progress/progress.test.ts +71 -0
  176. package/dist/ui/components/progress/progress.ts +118 -0
  177. package/dist/ui/components/radio-group/index.ts +1 -0
  178. package/dist/ui/components/radio-group/radio-group.test.ts +115 -0
  179. package/dist/ui/components/radio-group/radio-group.ts +129 -0
  180. package/dist/ui/components/scatter-chart/index.ts +6 -0
  181. package/dist/ui/components/scatter-chart/scatter-chart-render.test.ts +157 -0
  182. package/dist/ui/components/scatter-chart/scatter-chart.test.ts +57 -0
  183. package/dist/ui/components/scatter-chart/scatter-chart.ts +277 -0
  184. package/dist/ui/components/scroll-area/index.ts +1 -0
  185. package/dist/ui/components/scroll-area/scroll-area.test.ts +40 -0
  186. package/dist/ui/components/scroll-area/scroll-area.ts +73 -0
  187. package/dist/ui/components/select/index.ts +1 -0
  188. package/dist/ui/components/select/select.test.ts +107 -0
  189. package/dist/ui/components/select/select.ts +146 -0
  190. package/dist/ui/components/separator/index.ts +1 -0
  191. package/dist/ui/components/separator/separator.test.ts +26 -0
  192. package/dist/ui/components/separator/separator.ts +45 -0
  193. package/dist/ui/components/sheet/index.ts +7 -0
  194. package/dist/ui/components/sheet/sheet.test.ts +44 -0
  195. package/dist/ui/components/sheet/sheet.ts +114 -0
  196. package/dist/ui/components/skeleton/index.ts +1 -0
  197. package/dist/ui/components/skeleton/skeleton.test.ts +13 -0
  198. package/dist/ui/components/skeleton/skeleton.ts +45 -0
  199. package/dist/ui/components/spinner/index.ts +1 -0
  200. package/dist/ui/components/spinner/spinner.test.ts +39 -0
  201. package/dist/ui/components/spinner/spinner.ts +83 -0
  202. package/dist/ui/components/switch/index.ts +1 -0
  203. package/dist/ui/components/switch/switch.test.ts +63 -0
  204. package/dist/ui/components/switch/switch.ts +98 -0
  205. package/dist/ui/components/tabs/index.ts +1 -0
  206. package/dist/ui/components/tabs/tabs.test.ts +199 -0
  207. package/dist/ui/components/tabs/tabs.ts +317 -0
  208. package/dist/ui/components/textarea/index.ts +1 -0
  209. package/dist/ui/components/textarea/textarea.test.ts +138 -0
  210. package/dist/ui/components/textarea/textarea.ts +221 -0
  211. package/dist/ui/components/toast/index.ts +9 -0
  212. package/dist/ui/components/toast/toast-state.test.ts +54 -0
  213. package/dist/ui/components/toast/toast-state.ts +46 -0
  214. package/dist/ui/components/toast/toast.test.ts +342 -0
  215. package/dist/ui/components/toast/toast.ts +527 -0
  216. package/dist/ui/components/toggle/index.ts +7 -0
  217. package/dist/ui/components/toggle/toggle.test.ts +186 -0
  218. package/dist/ui/components/toggle/toggle.ts +218 -0
  219. package/dist/ui/components/typography/index.ts +5 -0
  220. package/dist/ui/components/typography/typography.test.ts +55 -0
  221. package/dist/ui/components/typography/typography.ts +44 -0
  222. package/dist/ui/theme/dark.css +41 -0
  223. package/dist/ui/theme/default.css +56 -0
  224. package/dist/ui/theme/tailwind-plugin.test.ts +124 -0
  225. package/dist/ui/theme/tailwind-plugin.ts +151 -0
  226. package/dist/ui/utils/animate.test.ts +324 -0
  227. package/dist/ui/utils/animate.ts +544 -0
  228. package/dist/ui/utils/cn.test.ts +27 -0
  229. package/dist/ui/utils/cn.ts +6 -0
  230. package/dist/utils/analyze.d.ts +32 -0
  231. package/dist/utils/analyze.js +109 -0
  232. package/dist/utils/analyze.js.map +1 -0
  233. package/dist/utils/analyze.test.d.ts +1 -0
  234. package/dist/utils/analyze.test.js +146 -0
  235. package/dist/utils/analyze.test.js.map +1 -0
  236. package/dist/utils/animate.d.ts +210 -0
  237. package/dist/utils/animate.js +423 -0
  238. package/dist/utils/animate.js.map +1 -0
  239. package/dist/utils/animate.test.d.ts +1 -0
  240. package/dist/utils/animate.test.js +365 -0
  241. package/dist/utils/animate.test.js.map +1 -0
  242. package/dist/utils/banner.d.ts +1 -0
  243. package/dist/utils/banner.js +15 -0
  244. package/dist/utils/banner.js.map +1 -0
  245. package/dist/utils/banner.test.d.ts +1 -0
  246. package/dist/utils/banner.test.js +29 -0
  247. package/dist/utils/banner.test.js.map +1 -0
  248. package/dist/utils/cn.d.ts +2 -0
  249. package/dist/utils/cn.js +6 -0
  250. package/dist/utils/cn.js.map +1 -0
  251. package/dist/utils/cn.test.d.ts +1 -0
  252. package/dist/utils/cn.test.js +21 -0
  253. package/dist/utils/cn.test.js.map +1 -0
  254. package/dist/utils/format.d.ts +31 -0
  255. package/dist/utils/format.js +95 -0
  256. package/dist/utils/format.js.map +1 -0
  257. package/dist/utils/format.test.d.ts +1 -0
  258. package/dist/utils/format.test.js +71 -0
  259. package/dist/utils/format.test.js.map +1 -0
  260. package/dist/utils/logger.d.ts +6 -0
  261. package/dist/utils/logger.js +16 -0
  262. package/dist/utils/logger.js.map +1 -0
  263. package/dist/utils/logger.test.d.ts +1 -0
  264. package/dist/utils/logger.test.js +36 -0
  265. package/dist/utils/logger.test.js.map +1 -0
  266. package/dist/utils/resolve-paths.d.ts +12 -0
  267. package/dist/utils/resolve-paths.js +29 -0
  268. package/dist/utils/resolve-paths.js.map +1 -0
  269. package/dist/utils/resolve-paths.test.d.ts +1 -0
  270. package/dist/utils/resolve-paths.test.js +52 -0
  271. package/dist/utils/resolve-paths.test.js.map +1 -0
  272. package/package.json +56 -4
  273. package/README.md +0 -3
@@ -0,0 +1,73 @@
1
+ import * as p from '@clack/prompts';
2
+ import { existsSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ import pc from 'picocolors';
5
+ import { configExists, readConfig } from '../config.js';
6
+ import { getEntry, getComponentNames, registry } from '../registry.js';
7
+ import { getComponentFiles } from '../utils/resolve-paths.js';
8
+ export const infoCommand = async (component) => {
9
+ p.intro(pc.bold('dolan info'));
10
+ const entry = getEntry(component);
11
+ if (!entry) {
12
+ p.log.error(`Unknown component ${pc.bold(component)}. Available: ${getComponentNames().join(', ')}`);
13
+ process.exit(1);
14
+ }
15
+ const cwd = process.cwd();
16
+ const hasConfig = configExists(cwd);
17
+ let isInstalled = false;
18
+ let installPath = '';
19
+ if (hasConfig) {
20
+ const config = readConfig(cwd);
21
+ const componentsDir = resolve(cwd, config.aliases.components);
22
+ const componentDir = resolve(componentsDir, component);
23
+ isInstalled = existsSync(componentDir);
24
+ if (isInstalled) {
25
+ installPath = config.aliases.components + '/' + component;
26
+ }
27
+ }
28
+ // Component name + install status
29
+ const installLabel = isInstalled
30
+ ? `${pc.green('✓')} installed at ${pc.dim(installPath)}`
31
+ : pc.dim('not installed');
32
+ p.log.message(` ${pc.bold('Name:')} ${component}`);
33
+ p.log.message(` ${pc.bold('Installed:')} ${installLabel}`);
34
+ // Files
35
+ const files = getComponentFiles(component);
36
+ p.log.message(` ${pc.bold('Files:')} ${files.join(', ')}`);
37
+ // Dependencies
38
+ const componentsDir = hasConfig
39
+ ? resolve(cwd, readConfig(cwd).aliases.components)
40
+ : '';
41
+ if (entry.dependencies.length > 0) {
42
+ const depLabels = entry.dependencies.map((dep) => {
43
+ if (!hasConfig)
44
+ return dep;
45
+ const depInstalled = existsSync(resolve(componentsDir, dep));
46
+ return depInstalled ? `${dep} ${pc.green('✓')}` : `${dep} ${pc.red('✗')}`;
47
+ });
48
+ p.log.message(` ${pc.bold('Dependencies:')} ${depLabels.join(', ')}`);
49
+ }
50
+ else {
51
+ p.log.message(` ${pc.bold('Dependencies:')} ${pc.dim('none')}`);
52
+ }
53
+ // Reverse dependencies (who depends on this component)
54
+ const dependents = registry
55
+ .filter((r) => r.dependencies.includes(component))
56
+ .map((r) => r.name);
57
+ if (dependents.length > 0) {
58
+ const depLabels = dependents.map((dep) => {
59
+ if (!hasConfig)
60
+ return dep;
61
+ const depInstalled = existsSync(resolve(componentsDir, dep));
62
+ return depInstalled
63
+ ? `${dep} ${pc.green('✓')}`
64
+ : `${dep} ${pc.dim('(not installed)')}`;
65
+ });
66
+ p.log.message(` ${pc.bold('Used by:')} ${depLabels.join(', ')}`);
67
+ }
68
+ else {
69
+ p.log.message(` ${pc.bold('Used by:')} ${pc.dim('none')}`);
70
+ }
71
+ p.outro('');
72
+ };
73
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,SAAiB,EAAE,EAAE;IACrD,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAElC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,CAAC,CAAC,GAAG,CAAC,KAAK,CACT,qBAAqB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACvD,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,SAAS,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAG,WAAW;QAC9B,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;QACxD,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAE5B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,YAAY,EAAE,CAAC,CAAC;IAE/D,QAAQ;IACR,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEnE,eAAe;IACf,MAAM,aAAa,GAAG,SAAS;QAC7B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAClD,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/C,IAAI,CAAC,SAAS;gBAAE,OAAO,GAAG,CAAC;YAC3B,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7D,OAAO,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5E,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,uDAAuD;IACvD,MAAM,UAAU,GAAG,QAAQ;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEtB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,CAAC,SAAS;gBAAE,OAAO,GAAG,CAAC;YAC3B,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7D,OAAO,YAAY;gBACjB,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC3B,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,143 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { createFixture, DEFAULT_CONFIG } from '../test-utils';
3
+ vi.mock('@clack/prompts', () => ({
4
+ intro: vi.fn(),
5
+ outro: vi.fn(),
6
+ log: {
7
+ message: vi.fn(),
8
+ error: vi.fn(),
9
+ warn: vi.fn(),
10
+ success: vi.fn(),
11
+ info: vi.fn(),
12
+ },
13
+ }));
14
+ vi.mock('../utils/resolve-paths.js', () => ({
15
+ getComponentFiles: () => ['button.ts', 'index.ts'],
16
+ }));
17
+ let fixture;
18
+ beforeEach(() => {
19
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
20
+ throw new Error(`process.exit(${code})`);
21
+ });
22
+ });
23
+ afterEach(() => {
24
+ fixture?.cleanup();
25
+ vi.restoreAllMocks();
26
+ });
27
+ describe('infoCommand', () => {
28
+ it('displays component info when installed', async () => {
29
+ fixture = createFixture({
30
+ config: DEFAULT_CONFIG,
31
+ components: { button: { 'button.ts': 'content' } },
32
+ });
33
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
34
+ const p = await import('@clack/prompts');
35
+ const { infoCommand } = await import('./info');
36
+ await infoCommand('button');
37
+ const messages = p.log.message.mock.calls
38
+ .map((c) => c[0])
39
+ .join('\n');
40
+ expect(messages).toContain('button');
41
+ expect(messages).toContain('installed');
42
+ expect(messages).toContain('spinner');
43
+ });
44
+ it('shows not installed when component dir missing', async () => {
45
+ fixture = createFixture({ config: DEFAULT_CONFIG });
46
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
47
+ const p = await import('@clack/prompts');
48
+ const { infoCommand } = await import('./info');
49
+ await infoCommand('card');
50
+ const messages = p.log.message.mock.calls
51
+ .map((c) => c[0])
52
+ .join('\n');
53
+ expect(messages).toContain('not installed');
54
+ });
55
+ it('exits with error for unknown component', async () => {
56
+ fixture = createFixture({ config: DEFAULT_CONFIG });
57
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
58
+ const { infoCommand } = await import('./info');
59
+ await expect(infoCommand('nonexistent')).rejects.toThrow('process.exit(1)');
60
+ });
61
+ it('shows reverse dependencies, marking an installed dependent with a checkmark', async () => {
62
+ fixture = createFixture({
63
+ config: DEFAULT_CONFIG,
64
+ components: { button: { 'button.ts': '' } },
65
+ });
66
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
67
+ const p = await import('@clack/prompts');
68
+ const { infoCommand } = await import('./info');
69
+ await infoCommand('spinner');
70
+ const messages = p.log.message.mock.calls
71
+ .map((c) => c[0])
72
+ .join('\n');
73
+ // button depends on spinner, and button IS installed here.
74
+ expect(messages).toContain('button');
75
+ });
76
+ it('marks a not-installed dependent with "(not installed)"', async () => {
77
+ // Config exists, but nothing is installed yet — spinner's dependent
78
+ // (button) resolves to the "not installed" ternary branch rather than
79
+ // the checkmark one covered by the test above.
80
+ fixture = createFixture({ config: DEFAULT_CONFIG });
81
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
82
+ const p = await import('@clack/prompts');
83
+ const { infoCommand } = await import('./info');
84
+ await infoCommand('spinner');
85
+ const messages = p.log.message.mock.calls
86
+ .map((c) => c[0])
87
+ .join('\n');
88
+ expect(messages).toContain('button');
89
+ expect(messages).toContain('not installed');
90
+ });
91
+ it('marks an installed dependency with a checkmark', async () => {
92
+ // button depends on spinner (registry.ts) — install both so the
93
+ // "dependency is installed" ternary branch is exercised, not just the
94
+ // "missing" one covered by the "displays component info" test above.
95
+ fixture = createFixture({
96
+ config: DEFAULT_CONFIG,
97
+ components: {
98
+ button: { 'button.ts': '' },
99
+ spinner: { 'spinner.ts': '' },
100
+ },
101
+ });
102
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
103
+ const p = await import('@clack/prompts');
104
+ const { infoCommand } = await import('./info');
105
+ await infoCommand('button');
106
+ const messages = p.log.message.mock.calls
107
+ .map((c) => c[0])
108
+ .join('\n');
109
+ expect(messages).toContain('Dependencies:');
110
+ expect(messages).toContain('spinner');
111
+ });
112
+ it('shows dependencies and reverse dependencies as plain names when no config exists', async () => {
113
+ // With no dolan.config.json at all, `hasConfig` is false throughout —
114
+ // the componentsDir-relative installed checks short-circuit to bare
115
+ // names instead of resolving install status.
116
+ fixture = createFixture({});
117
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
118
+ const p = await import('@clack/prompts');
119
+ const { infoCommand } = await import('./info');
120
+ // button has a dependency (spinner) AND is itself a dependency of nothing.
121
+ await infoCommand('button');
122
+ const messages = p.log.message.mock.calls
123
+ .map((c) => c[0])
124
+ .join('\n');
125
+ expect(messages).toContain('not installed');
126
+ expect(messages).toContain('spinner');
127
+ });
128
+ it('shows reverse dependencies as plain names when no config exists', async () => {
129
+ fixture = createFixture({});
130
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
131
+ const { infoCommand } = await import('./info');
132
+ // spinner is depended on by button, and has no dependencies of its own —
133
+ // exercises the "Used by" plain-name branch with no config.
134
+ await infoCommand('spinner');
135
+ const p = await import('@clack/prompts');
136
+ const messages = p.log.message.mock.calls
137
+ .map((c) => c[0])
138
+ .join('\n');
139
+ expect(messages).toContain('button');
140
+ expect(messages).toContain('none');
141
+ });
142
+ });
143
+ //# sourceMappingURL=info.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.test.js","sourceRoot":"","sources":["../../src/commands/info.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const initCommand: () => Promise<void>;
@@ -0,0 +1,98 @@
1
+ import * as p from '@clack/prompts';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { resolve, join } from 'node:path';
4
+ import pc from 'picocolors';
5
+ import { configExists, writeConfig } from '../config.js';
6
+ import { getUiSourceDir } from '../utils/resolve-paths.js';
7
+ import { formatContent } from '../utils/format.js';
8
+ import { printBanner } from '../utils/banner.js';
9
+ export const initCommand = async () => {
10
+ const cwd = process.cwd();
11
+ printBanner();
12
+ p.intro(pc.bold('dolan init'));
13
+ if (configExists(cwd)) {
14
+ const overwrite = await p.confirm({
15
+ message: 'dolan.config.json already exists. Overwrite?',
16
+ initialValue: false,
17
+ });
18
+ if (p.isCancel(overwrite) || !overwrite) {
19
+ p.cancel('Init canceled.');
20
+ process.exit(0);
21
+ }
22
+ }
23
+ const config = await p.group({
24
+ components: () => p.text({
25
+ message: 'Where should components be installed?',
26
+ placeholder: 'src/components/ui',
27
+ defaultValue: 'src/components/ui',
28
+ }),
29
+ theme: () => p.text({
30
+ message: 'Where should theme files be installed?',
31
+ placeholder: 'src/styles',
32
+ defaultValue: 'src/styles',
33
+ }),
34
+ }, {
35
+ onCancel: () => {
36
+ p.cancel('Init canceled.');
37
+ process.exit(0);
38
+ },
39
+ });
40
+ const s = p.spinner();
41
+ s.start('Setting up dolan...');
42
+ writeConfig(cwd, {
43
+ aliases: {
44
+ components: config.components,
45
+ theme: config.theme,
46
+ },
47
+ });
48
+ // Theme files are physically copied from the bundled @blotch/ui package
49
+ // into the user's project rather than imported as package exports.
50
+ // This makes them user-owned source files that can be customized freely
51
+ // and that `dolan update` can track with the three-way merge algorithm —
52
+ // just like component files.
53
+ const uiSrc = getUiSourceDir();
54
+ const themeDir = resolve(cwd, config.theme);
55
+ mkdirSync(themeDir, { recursive: true });
56
+ /**
57
+ * Write theme files through formatContent so they match EXACTLY what
58
+ * `dolan update` recomputes for them. `update` normalizes upstream content to
59
+ * the consumer's oxfmt config; if init copied verbatim instead, the one JS/TS
60
+ * theme file (`tailwind-plugin.ts`) would land unformatted here but come back
61
+ * formatted from the next update in an oxfmt project — surfacing a spurious
62
+ * "conflict" on a file the user never touched. `.css` files pass through
63
+ * formatContent unchanged, and non-oxfmt projects get verbatim content, so
64
+ * this is a no-op copy everywhere except the case it fixes.
65
+ */
66
+ const installThemeFile = (file) => {
67
+ const src = join(uiSrc, 'theme', file);
68
+ if (!existsSync(src))
69
+ return;
70
+ const destPath = join(themeDir, file);
71
+ writeFileSync(destPath, formatContent(readFileSync(src, 'utf-8'), destPath));
72
+ };
73
+ for (const file of ['default.css', 'dark.css']) {
74
+ installThemeFile(file);
75
+ }
76
+ installThemeFile('tailwind-plugin.ts');
77
+ s.stop('Setup complete!');
78
+ const componentsDir = resolve(cwd, config.components);
79
+ mkdirSync(componentsDir, { recursive: true });
80
+ p.note([
81
+ `${pc.bold('1.')} Add ${pc.cyan('@blotch/dolan')} as a dependency in your ${pc.cyan('package.json')}`,
82
+ '',
83
+ `${pc.bold('2.')} Add the Tailwind plugin to your ${pc.cyan('tailwind.config.ts')}:`,
84
+ '',
85
+ ` ${pc.dim("import { blotchPlugin } from './")}${pc.dim(config.theme)}${pc.dim("/tailwind-plugin';")}`,
86
+ ` ${pc.dim('plugins: [blotchPlugin]')}`,
87
+ '',
88
+ `${pc.bold('3.')} Import a theme in your global styles:`,
89
+ '',
90
+ ` ${pc.dim("@import './")}${pc.dim(config.theme)}${pc.dim("/default.css';")}`,
91
+ '',
92
+ `${pc.bold('4.')} Add components:`,
93
+ '',
94
+ ` ${pc.dim('npx dolan add button card')}`,
95
+ ].join('\n'), 'Next steps');
96
+ p.outro('Ready to go!');
97
+ };
98
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,154 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { createFixture } from '../test-utils';
5
+ const spinnerMock = { start: vi.fn(), stop: vi.fn() };
6
+ vi.mock('@clack/prompts', () => ({
7
+ intro: vi.fn(),
8
+ outro: vi.fn(),
9
+ note: vi.fn(),
10
+ log: {
11
+ message: vi.fn(),
12
+ error: vi.fn(),
13
+ warn: vi.fn(),
14
+ success: vi.fn(),
15
+ info: vi.fn(),
16
+ },
17
+ spinner: vi.fn(() => spinnerMock),
18
+ confirm: vi.fn(),
19
+ group: vi.fn(),
20
+ text: vi.fn(),
21
+ cancel: vi.fn(),
22
+ isCancel: vi.fn().mockReturnValue(false),
23
+ }));
24
+ // `printBanner` shells out to cfonts, which is noisy in test output and
25
+ // unrelated to init's own logic (it has its own dedicated test file).
26
+ vi.mock('../utils/banner.js', () => ({ printBanner: vi.fn() }));
27
+ let fixture;
28
+ // Point the "copy theme files from @blotch/ui" step at the fixture's
29
+ // __ui_source tree instead of the real dist/ui, same pattern as other command
30
+ // tests that need controlled theme file content.
31
+ vi.mock('../utils/resolve-paths.js', () => ({
32
+ getUiSourceDir: () => fixture.uiDir,
33
+ }));
34
+ beforeEach(() => {
35
+ vi.clearAllMocks();
36
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
37
+ throw new Error(`process.exit(${code})`);
38
+ });
39
+ });
40
+ afterEach(() => {
41
+ fixture?.cleanup();
42
+ vi.restoreAllMocks();
43
+ });
44
+ const THEME_CSS = 'page { --background: rgba(255, 255, 255, 1); }';
45
+ const TAILWIND_PLUGIN = 'export const blotchPlugin = () => {};';
46
+ /**
47
+ * Configures the `p.group`/`p.text` mocks to behave like the real
48
+ * @clack/prompts group: invoke each field's builder function and resolve
49
+ * `p.text` to its `defaultValue`. This exercises init.ts's `components: () =>
50
+ * p.text(...)` and `theme: () => p.text(...)` field closures directly,
51
+ * instead of skipping past them with a hardcoded resolved object.
52
+ */
53
+ const useDefaultGroupAnswers = async () => {
54
+ const p = await import('@clack/prompts');
55
+ p.text.mockImplementation((opts) => Promise.resolve(opts.defaultValue));
56
+ p.group.mockImplementation(async (fields) => {
57
+ const result = {};
58
+ for (const key of Object.keys(fields)) {
59
+ result[key] = await fields[key]();
60
+ }
61
+ return result;
62
+ });
63
+ };
64
+ describe('initCommand', () => {
65
+ it('writes config and copies theme files on a clean project', async () => {
66
+ fixture = createFixture({
67
+ themeFiles: {
68
+ 'default.css': THEME_CSS,
69
+ 'dark.css': THEME_CSS,
70
+ 'tailwind-plugin.ts': TAILWIND_PLUGIN,
71
+ },
72
+ });
73
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
74
+ await useDefaultGroupAnswers();
75
+ const p = await import('@clack/prompts');
76
+ const { initCommand } = await import('./init');
77
+ await initCommand();
78
+ const config = JSON.parse(readFileSync(join(fixture.dir, 'dolan.config.json'), 'utf-8'));
79
+ expect(config).toEqual({
80
+ aliases: { components: 'src/components/ui', theme: 'src/styles' },
81
+ });
82
+ expect(readFileSync(join(fixture.dir, 'src/styles/default.css'), 'utf-8')).toBe(THEME_CSS);
83
+ expect(readFileSync(join(fixture.dir, 'src/styles/dark.css'), 'utf-8')).toBe(THEME_CSS);
84
+ expect(readFileSync(join(fixture.dir, 'src/styles/tailwind-plugin.ts'), 'utf-8')).toBe(TAILWIND_PLUGIN);
85
+ expect(existsSync(join(fixture.dir, 'src/components/ui'))).toBe(true);
86
+ expect(p.note).toHaveBeenCalled();
87
+ });
88
+ it('skips a theme file that does not exist upstream', async () => {
89
+ // Only default.css is provided upstream — dark.css and tailwind-plugin.ts
90
+ // should simply be skipped (the `if (!existsSync(src)) return;` guard),
91
+ // not throw.
92
+ fixture = createFixture({
93
+ themeFiles: { 'default.css': THEME_CSS },
94
+ });
95
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
96
+ await useDefaultGroupAnswers();
97
+ const { initCommand } = await import('./init');
98
+ await initCommand();
99
+ expect(existsSync(join(fixture.dir, 'src/styles/default.css'))).toBe(true);
100
+ expect(existsSync(join(fixture.dir, 'src/styles/dark.css'))).toBe(false);
101
+ expect(existsSync(join(fixture.dir, 'src/styles/tailwind-plugin.ts'))).toBe(false);
102
+ });
103
+ it('prompts to overwrite an existing config and proceeds when confirmed', async () => {
104
+ fixture = createFixture({
105
+ themeFiles: { 'default.css': THEME_CSS },
106
+ });
107
+ // Pre-seed an existing config so `configExists` is true.
108
+ writeFileSync(join(fixture.dir, 'dolan.config.json'), JSON.stringify({ aliases: { components: 'old', theme: 'old' } }));
109
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
110
+ await useDefaultGroupAnswers();
111
+ const p = await import('@clack/prompts');
112
+ p.confirm.mockResolvedValue(true);
113
+ const { initCommand } = await import('./init');
114
+ await initCommand();
115
+ expect(p.confirm).toHaveBeenCalled();
116
+ const config = JSON.parse(readFileSync(join(fixture.dir, 'dolan.config.json'), 'utf-8'));
117
+ expect(config.aliases.components).toBe('src/components/ui');
118
+ });
119
+ it('cancels when overwrite is declined', async () => {
120
+ fixture = createFixture({ themeFiles: { 'default.css': THEME_CSS } });
121
+ writeFileSync(join(fixture.dir, 'dolan.config.json'), JSON.stringify({ aliases: { components: 'old', theme: 'old' } }));
122
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
123
+ const p = await import('@clack/prompts');
124
+ p.confirm.mockResolvedValue(false);
125
+ const { initCommand } = await import('./init');
126
+ await expect(initCommand()).rejects.toThrow('process.exit(0)');
127
+ expect(p.cancel).toHaveBeenCalledWith('Init canceled.');
128
+ });
129
+ it('cancels when the overwrite confirm prompt itself is canceled', async () => {
130
+ fixture = createFixture({ themeFiles: { 'default.css': THEME_CSS } });
131
+ writeFileSync(join(fixture.dir, 'dolan.config.json'), JSON.stringify({ aliases: { components: 'old', theme: 'old' } }));
132
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
133
+ const p = await import('@clack/prompts');
134
+ p.confirm.mockResolvedValue(Symbol('cancel'));
135
+ p.isCancel.mockReturnValueOnce(true);
136
+ const { initCommand } = await import('./init');
137
+ await expect(initCommand()).rejects.toThrow('process.exit(0)');
138
+ });
139
+ it('cancels via the group onCancel handler when a prompt in the group is canceled', async () => {
140
+ fixture = createFixture({ themeFiles: { 'default.css': THEME_CSS } });
141
+ vi.spyOn(process, 'cwd').mockReturnValue(fixture.dir);
142
+ const p = await import('@clack/prompts');
143
+ // Simulate @clack/prompts invoking the onCancel callback passed to
144
+ // p.group when one of the grouped prompts is canceled.
145
+ p.group.mockImplementation(async (_fields, config) => {
146
+ config.onCancel();
147
+ return {};
148
+ });
149
+ const { initCommand } = await import('./init');
150
+ await expect(initCommand()).rejects.toThrow('process.exit(0)');
151
+ expect(p.cancel).toHaveBeenCalledWith('Init canceled.');
152
+ });
153
+ });
154
+ //# sourceMappingURL=init.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAgB,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AAEtD,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,GAAG,EAAE;QACH,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;QAChB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;QAChB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;KACd;IACD,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC;IACjC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;CACzC,CAAC,CAAC,CAAC;AAEJ,wEAAwE;AACxE,sEAAsE;AACtE,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAEhE,IAAI,OAAgB,CAAC;AAErB,qEAAqE;AACrE,8EAA8E;AAC9E,iDAAiD;AACjD,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK;CACpC,CAAC,CAAC,CAAC;AAEJ,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;QACpD,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,gDAAgD,CAAC;AACnE,MAAM,eAAe,GAAG,uCAAuC,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,sBAAsB,GAAG,KAAK,IAAI,EAAE;IACxC,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACxC,CAAC,CAAC,IAAiC,CAAC,kBAAkB,CACrD,CAAC,IAA+B,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CACxE,CAAC;IACD,CAAC,CAAC,KAAkC,CAAC,kBAAkB,CACtD,KAAK,EAAE,MAA8C,EAAE,EAAE;QACvD,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,OAAO,GAAG,aAAa,CAAC;YACtB,UAAU,EAAE;gBACV,aAAa,EAAE,SAAS;gBACxB,UAAU,EAAE,SAAS;gBACrB,oBAAoB,EAAE,eAAe;aACtC;SACF,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,sBAAsB,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAEzC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,WAAW,EAAE,CAAC;QAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAC9D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,EAAE,YAAY,EAAE;SAClE,CAAC,CAAC;QAEH,MAAM,CACJ,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,wBAAwB,CAAC,EAAE,OAAO,CAAC,CACnE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClB,MAAM,CACJ,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,qBAAqB,CAAC,EAAE,OAAO,CAAC,CAChE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClB,MAAM,CACJ,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,+BAA+B,CAAC,EAAE,OAAO,CAAC,CAC1E,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAExB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,0EAA0E;QAC1E,wEAAwE;QACxE,aAAa;QACb,OAAO,GAAG,aAAa,CAAC;YACtB,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE;SACzC,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,sBAAsB,EAAE,CAAC;QAE/B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,WAAW,EAAE,CAAC;QAEpB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAC,CAAC,CAAC,IAAI,CACzE,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,OAAO,GAAG,aAAa,CAAC;YACtB,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE;SACzC,CAAC,CAAC;QACH,yDAAyD;QACzD,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CACjE,CAAC;QACF,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,sBAAsB,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACxC,CAAC,CAAC,OAAoC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEhE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,WAAW,EAAE,CAAC;QAEpB,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAC9D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,OAAO,GAAG,aAAa,CAAC,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACtE,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CACjE,CAAC;QACF,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEtD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACxC,CAAC,CAAC,OAAoC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEjE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC/D,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,OAAO,GAAG,aAAa,CAAC,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACtE,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CACjE,CAAC;QACF,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEtD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACxC,CAAC,CAAC,OAAoC,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,QAAgD,CAAC,mBAAmB,CACrE,IAAI,CACL,CAAC;QAEF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,OAAO,GAAG,aAAa,CAAC,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACtE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEtD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACzC,mEAAmE;QACnE,uDAAuD;QACtD,CAAC,CAAC,KAAkC,CAAC,kBAAkB,CACtD,KAAK,EAAE,OAAO,EAAE,MAAgC,EAAE,EAAE;YAClD,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACZ,CAAC,CACF,CAAC;QAEF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC/D,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Lists every installed component along with its overall update status.
3
+ *
4
+ * For each component, every file is analyzed via the same three-way merge
5
+ * function used by `dolan update` (lockfile-base / current / upstream), then
6
+ * `summarizeComponent` rolls the per-file statuses up into a single component-
7
+ * level status using a priority order (conflict > user-modified > outdated >
8
+ * up-to-date) — so a component is flagged "modified" even if only one of its
9
+ * files has user edits.
10
+ *
11
+ * Supports --json for machine-readable output (used by CI/scripts), which
12
+ * short-circuits the interactive prompts entirely.
13
+ */
14
+ export declare const listCommand: (options: {
15
+ json?: boolean;
16
+ }) => Promise<void>;