zard-cli 1.0.0-beta.12 → 1.0.0-beta.120

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 (265) hide show
  1. package/README.md +39 -167
  2. package/commands/add/component-installer.d.ts +4 -1
  3. package/commands/add/component-installer.d.ts.map +1 -1
  4. package/commands/add/component-installer.js +33 -5
  5. package/commands/add/component-installer.js.map +1 -1
  6. package/commands/add/component-selector.d.ts +6 -0
  7. package/commands/add/component-selector.d.ts.map +1 -1
  8. package/commands/add/component-selector.js +9 -27
  9. package/commands/add/component-selector.js.map +1 -1
  10. package/commands/add/dark-mode-setup.d.ts +2 -0
  11. package/commands/add/dark-mode-setup.d.ts.map +1 -1
  12. package/commands/add/dark-mode-setup.js +5 -11
  13. package/commands/add/dark-mode-setup.js.map +1 -1
  14. package/commands/add/dependency-resolver.d.ts +5 -2
  15. package/commands/add/dependency-resolver.d.ts.map +1 -1
  16. package/commands/add/dependency-resolver.js +54 -20
  17. package/commands/add/dependency-resolver.js.map +1 -1
  18. package/commands/add/index.d.ts.map +1 -1
  19. package/commands/add/index.js +135 -86
  20. package/commands/add/index.js.map +1 -1
  21. package/commands/add/typeset-setup.d.ts +12 -0
  22. package/commands/add/typeset-setup.d.ts.map +1 -0
  23. package/commands/add/typeset-setup.js +68 -0
  24. package/commands/add/typeset-setup.js.map +1 -0
  25. package/commands/add/wizard.d.ts +34 -0
  26. package/commands/add/wizard.d.ts.map +1 -0
  27. package/commands/add/wizard.js +295 -0
  28. package/commands/add/wizard.js.map +1 -0
  29. package/commands/init/config-prompter.d.ts +66 -56
  30. package/commands/init/config-prompter.d.ts.map +1 -1
  31. package/commands/init/config-prompter.js +90 -74
  32. package/commands/init/config-prompter.js.map +1 -1
  33. package/commands/init/dependencies.d.ts +1 -8
  34. package/commands/init/dependencies.d.ts.map +1 -1
  35. package/commands/init/dependencies.js +51 -23
  36. package/commands/init/dependencies.js.map +1 -1
  37. package/commands/init/index.d.ts.map +1 -1
  38. package/commands/init/index.js +150 -86
  39. package/commands/init/index.js.map +1 -1
  40. package/commands/init/project-kind.d.ts +82 -0
  41. package/commands/init/project-kind.d.ts.map +1 -0
  42. package/commands/init/project-kind.js +166 -0
  43. package/commands/init/project-kind.js.map +1 -0
  44. package/commands/init/steps.d.ts +15 -0
  45. package/commands/init/steps.d.ts.map +1 -0
  46. package/commands/init/steps.js +154 -0
  47. package/commands/init/steps.js.map +1 -0
  48. package/commands/init/tailwind-setup.d.ts +9 -2
  49. package/commands/init/tailwind-setup.d.ts.map +1 -1
  50. package/commands/init/tailwind-setup.js +33 -9
  51. package/commands/init/tailwind-setup.js.map +1 -1
  52. package/commands/init/theme-loader.d.ts.map +1 -1
  53. package/commands/init/theme-loader.js +1 -3
  54. package/commands/init/theme-loader.js.map +1 -1
  55. package/commands/init/tsconfig-updater.d.ts +8 -1
  56. package/commands/init/tsconfig-updater.d.ts.map +1 -1
  57. package/commands/init/tsconfig-updater.js +30 -11
  58. package/commands/init/tsconfig-updater.js.map +1 -1
  59. package/commands/init/update-angular-config.d.ts.map +1 -1
  60. package/commands/init/update-angular-config.js +28 -47
  61. package/commands/init/update-angular-config.js.map +1 -1
  62. package/commands/init/vite-setup.d.ts +11 -0
  63. package/commands/init/vite-setup.d.ts.map +1 -0
  64. package/commands/init/vite-setup.js +61 -0
  65. package/commands/init/vite-setup.js.map +1 -0
  66. package/commands/init/wizard.d.ts +30 -0
  67. package/commands/init/wizard.d.ts.map +1 -0
  68. package/commands/init/wizard.js +560 -0
  69. package/commands/init/wizard.js.map +1 -0
  70. package/core/icons/families.d.ts +38 -0
  71. package/core/icons/families.d.ts.map +1 -0
  72. package/core/icons/families.js +26 -0
  73. package/core/icons/families.js.map +1 -0
  74. package/core/icons/icon-map.d.ts +24 -0
  75. package/core/icons/icon-map.d.ts.map +1 -0
  76. package/core/icons/icon-map.js +135 -0
  77. package/core/icons/icon-map.js.map +1 -0
  78. package/core/icons/index.d.ts +107 -0
  79. package/core/icons/index.d.ts.map +1 -0
  80. package/core/icons/index.js +183 -0
  81. package/core/icons/index.js.map +1 -0
  82. package/core/registry/registry-data.d.ts.map +1 -1
  83. package/core/registry/registry-data.js +752 -126
  84. package/core/registry/registry-data.js.map +1 -1
  85. package/core/themes/theme-definitions.d.ts +5 -5
  86. package/core/themes/theme-definitions.d.ts.map +1 -1
  87. package/core/themes/theme-definitions.js +75 -61
  88. package/core/themes/theme-definitions.js.map +1 -1
  89. package/index.js +41 -4
  90. package/index.js.map +1 -1
  91. package/package.json +9 -14
  92. package/ui/blocks.d.ts +71 -0
  93. package/ui/blocks.d.ts.map +1 -0
  94. package/ui/blocks.js +116 -0
  95. package/ui/blocks.js.map +1 -0
  96. package/ui/brand.d.ts +14 -0
  97. package/ui/brand.d.ts.map +1 -0
  98. package/ui/brand.js +35 -0
  99. package/ui/brand.js.map +1 -0
  100. package/ui/engine/animation/index.d.ts +38 -0
  101. package/ui/engine/animation/index.d.ts.map +1 -0
  102. package/ui/engine/animation/index.js +102 -0
  103. package/ui/engine/animation/index.js.map +1 -0
  104. package/ui/engine/ansi/index.d.ts +51 -0
  105. package/ui/engine/ansi/index.d.ts.map +1 -0
  106. package/ui/engine/ansi/index.js +116 -0
  107. package/ui/engine/ansi/index.js.map +1 -0
  108. package/ui/engine/components/index.d.ts +211 -0
  109. package/ui/engine/components/index.d.ts.map +1 -0
  110. package/ui/engine/components/index.js +109 -0
  111. package/ui/engine/components/index.js.map +1 -0
  112. package/ui/engine/cursor/index.d.ts +16 -0
  113. package/ui/engine/cursor/index.d.ts.map +1 -0
  114. package/ui/engine/cursor/index.js +40 -0
  115. package/ui/engine/cursor/index.js.map +1 -0
  116. package/ui/engine/diff/index.d.ts +26 -0
  117. package/ui/engine/diff/index.d.ts.map +1 -0
  118. package/ui/engine/diff/index.js +56 -0
  119. package/ui/engine/diff/index.js.map +1 -0
  120. package/ui/engine/events/index.d.ts +24 -0
  121. package/ui/engine/events/index.d.ts.map +1 -0
  122. package/ui/engine/events/index.js +60 -0
  123. package/ui/engine/events/index.js.map +1 -0
  124. package/ui/engine/focus/index.d.ts +25 -0
  125. package/ui/engine/focus/index.d.ts.map +1 -0
  126. package/ui/engine/focus/index.js +77 -0
  127. package/ui/engine/focus/index.js.map +1 -0
  128. package/ui/engine/frame/index.d.ts +48 -0
  129. package/ui/engine/frame/index.d.ts.map +1 -0
  130. package/ui/engine/frame/index.js +0 -0
  131. package/ui/engine/frame/index.js.map +1 -0
  132. package/ui/engine/index.d.ts +28 -0
  133. package/ui/engine/index.d.ts.map +1 -0
  134. package/ui/engine/index.js +28 -0
  135. package/ui/engine/index.js.map +1 -0
  136. package/ui/engine/input/index.d.ts +36 -0
  137. package/ui/engine/input/index.d.ts.map +1 -0
  138. package/ui/engine/input/index.js +224 -0
  139. package/ui/engine/input/index.js.map +1 -0
  140. package/ui/engine/layout/index.d.ts +42 -0
  141. package/ui/engine/layout/index.d.ts.map +1 -0
  142. package/ui/engine/layout/index.js +241 -0
  143. package/ui/engine/layout/index.js.map +1 -0
  144. package/ui/engine/renderer/index.d.ts +43 -0
  145. package/ui/engine/renderer/index.d.ts.map +1 -0
  146. package/ui/engine/renderer/index.js +619 -0
  147. package/ui/engine/renderer/index.js.map +1 -0
  148. package/ui/engine/scheduler/index.d.ts +22 -0
  149. package/ui/engine/scheduler/index.d.ts.map +1 -0
  150. package/ui/engine/scheduler/index.js +77 -0
  151. package/ui/engine/scheduler/index.js.map +1 -0
  152. package/ui/engine/screen/index.d.ts +39 -0
  153. package/ui/engine/screen/index.d.ts.map +1 -0
  154. package/ui/engine/screen/index.js +255 -0
  155. package/ui/engine/screen/index.js.map +1 -0
  156. package/ui/engine/terminal/index.d.ts +84 -0
  157. package/ui/engine/terminal/index.d.ts.map +1 -0
  158. package/ui/engine/terminal/index.js +235 -0
  159. package/ui/engine/terminal/index.js.map +1 -0
  160. package/ui/engine/testing/index.d.ts +27 -0
  161. package/ui/engine/testing/index.d.ts.map +1 -0
  162. package/ui/engine/testing/index.js +63 -0
  163. package/ui/engine/testing/index.js.map +1 -0
  164. package/ui/engine/theme/index.d.ts +26 -0
  165. package/ui/engine/theme/index.d.ts.map +1 -0
  166. package/ui/engine/theme/index.js +128 -0
  167. package/ui/engine/theme/index.js.map +1 -0
  168. package/ui/engine/utils/index.d.ts +12 -0
  169. package/ui/engine/utils/index.d.ts.map +1 -0
  170. package/ui/engine/utils/index.js +143 -0
  171. package/ui/engine/utils/index.js.map +1 -0
  172. package/ui/gate.d.ts +19 -0
  173. package/ui/gate.d.ts.map +1 -0
  174. package/ui/gate.js +36 -0
  175. package/ui/gate.js.map +1 -0
  176. package/ui/index.d.ts +18 -0
  177. package/ui/index.d.ts.map +1 -0
  178. package/ui/index.js +18 -0
  179. package/ui/index.js.map +1 -0
  180. package/ui/log-sink.d.ts +24 -0
  181. package/ui/log-sink.d.ts.map +1 -0
  182. package/ui/log-sink.js +35 -0
  183. package/ui/log-sink.js.map +1 -0
  184. package/ui/output.d.ts +14 -0
  185. package/ui/output.d.ts.map +1 -0
  186. package/ui/output.js +28 -0
  187. package/ui/output.js.map +1 -0
  188. package/ui/report.d.ts +30 -0
  189. package/ui/report.d.ts.map +1 -0
  190. package/ui/report.js +45 -0
  191. package/ui/report.js.map +1 -0
  192. package/ui/runner.d.ts +66 -0
  193. package/ui/runner.d.ts.map +1 -0
  194. package/ui/runner.js +135 -0
  195. package/ui/runner.js.map +1 -0
  196. package/ui/style.d.ts +24 -0
  197. package/ui/style.d.ts.map +1 -0
  198. package/ui/style.js +44 -0
  199. package/ui/style.js.map +1 -0
  200. package/ui/testing/fake-tty.d.ts +26 -0
  201. package/ui/testing/fake-tty.d.ts.map +1 -0
  202. package/ui/testing/fake-tty.js +61 -0
  203. package/ui/testing/fake-tty.js.map +1 -0
  204. package/ui/text-input.d.ts +31 -0
  205. package/ui/text-input.d.ts.map +1 -0
  206. package/ui/text-input.js +89 -0
  207. package/ui/text-input.js.map +1 -0
  208. package/ui/theme.d.ts +10 -0
  209. package/ui/theme.d.ts.map +1 -0
  210. package/ui/theme.js +20 -0
  211. package/ui/theme.js.map +1 -0
  212. package/utils/angular-compat.d.ts +21 -0
  213. package/utils/angular-compat.d.ts.map +1 -0
  214. package/utils/angular-compat.js +52 -0
  215. package/utils/angular-compat.js.map +1 -0
  216. package/utils/config.d.ts +52 -69
  217. package/utils/config.d.ts.map +1 -1
  218. package/utils/config.js +60 -9
  219. package/utils/config.js.map +1 -1
  220. package/utils/errors.d.ts +27 -0
  221. package/utils/errors.d.ts.map +1 -0
  222. package/utils/errors.js +45 -0
  223. package/utils/errors.js.map +1 -0
  224. package/utils/get-package-info.js +4 -4
  225. package/utils/get-package-info.js.map +1 -1
  226. package/utils/get-project-info.d.ts +30 -0
  227. package/utils/get-project-info.d.ts.map +1 -1
  228. package/utils/get-project-info.js +195 -6
  229. package/utils/get-project-info.js.map +1 -1
  230. package/utils/http-client.d.ts +8 -0
  231. package/utils/http-client.d.ts.map +1 -0
  232. package/utils/http-client.js +83 -0
  233. package/utils/http-client.js.map +1 -0
  234. package/utils/icon-catalog.d.ts +34 -0
  235. package/utils/icon-catalog.d.ts.map +1 -0
  236. package/utils/icon-catalog.js +63 -0
  237. package/utils/icon-catalog.js.map +1 -0
  238. package/utils/logger.d.ts +16 -1
  239. package/utils/logger.d.ts.map +1 -1
  240. package/utils/logger.js +104 -12
  241. package/utils/logger.js.map +1 -1
  242. package/utils/package-manager.d.ts +44 -1
  243. package/utils/package-manager.d.ts.map +1 -1
  244. package/utils/package-manager.js +210 -14
  245. package/utils/package-manager.js.map +1 -1
  246. package/utils/registry.d.ts +44 -2
  247. package/utils/registry.d.ts.map +1 -1
  248. package/utils/registry.js +89 -30
  249. package/utils/registry.js.map +1 -1
  250. package/utils/schema-version.d.ts +21 -0
  251. package/utils/schema-version.d.ts.map +1 -0
  252. package/utils/schema-version.js +28 -0
  253. package/utils/schema-version.js.map +1 -0
  254. package/utils/source-file.d.ts +40 -0
  255. package/utils/source-file.d.ts.map +1 -0
  256. package/utils/source-file.js +104 -0
  257. package/utils/source-file.js.map +1 -0
  258. package/utils/theme-selector.d.ts +1 -1
  259. package/utils/theme-selector.d.ts.map +1 -1
  260. package/utils/theme-selector.js +6 -6
  261. package/utils/theme-selector.js.map +1 -1
  262. package/utils/fetch-component.d.ts +0 -3
  263. package/utils/fetch-component.d.ts.map +0 -1
  264. package/utils/fetch-component.js +0 -75
  265. package/utils/fetch-component.js.map +0 -1
@@ -0,0 +1,295 @@
1
+ import { answeredLine, checkList, commandHeader, confirmField, controls, createGate, editInput, hint, page, progress, question, resultPanel, runWizard, screen, spacer, startInput, taskHeader, taskList, text, textField, } from '../../ui/index.js';
2
+ const DARK_MODE = 'dark-mode';
3
+ const TYPESET = 'typeset';
4
+ export async function runAddWizard(options) {
5
+ const state = {
6
+ phase: options.preselected.length ? 'resolving' : 'selecting',
7
+ names: [],
8
+ filter: '',
9
+ visible: [],
10
+ cursor: 0,
11
+ selected: new Set(),
12
+ componentCount: 0,
13
+ dependencyCount: 0,
14
+ confirmValue: true,
15
+ tasks: [],
16
+ tasksDone: 0,
17
+ taskStartedAt: 0,
18
+ indexHtml: startInput(options.defaultIndexHtml),
19
+ transcript: [],
20
+ failure: null,
21
+ installed: [],
22
+ };
23
+ const selection = createGate();
24
+ const confirmation = createGate();
25
+ const darkMode = createGate();
26
+ const finish = createGate();
27
+ const applyFilter = () => {
28
+ const term = state.filter.trim().toLowerCase();
29
+ state.visible = state.names
30
+ .map((_, index) => index)
31
+ .filter(index => !term || state.names[index].toLowerCase().includes(term));
32
+ state.cursor = Math.min(state.cursor, Math.max(0, state.visible.length - 1));
33
+ };
34
+ const onKey = (event, ctx) => {
35
+ if (state.phase === 'selecting') {
36
+ handleSelectionKey(event, state, applyFilter, selection);
37
+ return;
38
+ }
39
+ if (state.phase === 'confirming') {
40
+ if (event.key === 'left' || event.key === 'right')
41
+ state.confirmValue = !state.confirmValue;
42
+ else if (event.key === 'y' || event.key === 'Y')
43
+ confirmation.settle(true);
44
+ else if (event.key === 'n' || event.key === 'N' || event.key === 'escape')
45
+ confirmation.settle(false);
46
+ else if (event.key === 'enter')
47
+ confirmation.settle(state.confirmValue);
48
+ return;
49
+ }
50
+ if (state.phase === 'darkMode') {
51
+ if (event.key === 'enter') {
52
+ darkMode.settle(state.indexHtml.value.trim() || options.defaultIndexHtml);
53
+ return;
54
+ }
55
+ if (event.key === 'escape') {
56
+ darkMode.settle(null);
57
+ return;
58
+ }
59
+ const edited = editInput(state.indexHtml, event);
60
+ if (edited)
61
+ state.indexHtml = edited;
62
+ return;
63
+ }
64
+ if (state.phase === 'done' || state.phase === 'failed') {
65
+ if (event.key === 'enter')
66
+ finish.settle(undefined);
67
+ return;
68
+ }
69
+ void ctx;
70
+ };
71
+ const run = async (ctx) => {
72
+ let names;
73
+ if (options.preselected.length) {
74
+ names = [...options.preselected];
75
+ }
76
+ else {
77
+ state.names = await options.loadNames();
78
+ applyFilter();
79
+ ctx.refresh();
80
+ names = await selection.wait();
81
+ if (!names.length) {
82
+ ctx.cancel('No components selected.');
83
+ return;
84
+ }
85
+ state.transcript.push(['components', names.join(', ')]);
86
+ }
87
+ state.phase = 'resolving';
88
+ ctx.refresh();
89
+ const { components, dependencies } = await options.resolve(names);
90
+ if (components.length === 0) {
91
+ state.phase = 'done';
92
+ state.installed = [];
93
+ ctx.refresh();
94
+ await finish.wait();
95
+ ctx.done([]);
96
+ return;
97
+ }
98
+ state.componentCount = components.length;
99
+ state.dependencyCount = dependencies.length;
100
+ if (!options.skipConfirmation) {
101
+ state.phase = 'confirming';
102
+ ctx.refresh();
103
+ if (!(await confirmation.wait())) {
104
+ ctx.cancel();
105
+ return;
106
+ }
107
+ state.transcript.push(['install', `${components.length} component(s), ${dependencies.length} dependencies`]);
108
+ }
109
+ state.phase = 'installing';
110
+ state.tasks = [
111
+ ...(dependencies.length ? [{ label: 'dependencies', note: dependencies.join(', ') }] : []),
112
+ ...components.map(component => ({ label: component.name, note: 'component source' })),
113
+ ];
114
+ state.tasksDone = 0;
115
+ state.taskStartedAt = Date.now();
116
+ ctx.refresh();
117
+ if (dependencies.length) {
118
+ await options.installDependencies(dependencies);
119
+ state.tasksDone++;
120
+ state.taskStartedAt = Date.now();
121
+ ctx.refresh();
122
+ }
123
+ const failed = [];
124
+ for (const component of components) {
125
+ try {
126
+ await options.installComponent(component);
127
+ state.installed.push(component.name);
128
+ }
129
+ catch (error) {
130
+ failed.push(component.name);
131
+ state.failure = `${component.name}: ${error instanceof Error ? error.message : String(error)}`;
132
+ }
133
+ state.tasksDone++;
134
+ state.taskStartedAt = Date.now();
135
+ ctx.refresh();
136
+ }
137
+ // After the loop, and against what was actually written: injecting the
138
+ // import for a file whose install failed would point the CSS at nothing.
139
+ if (state.installed.includes(TYPESET)) {
140
+ await options.setupTypeset();
141
+ }
142
+ if (components.some(component => component.name === DARK_MODE)) {
143
+ state.phase = 'darkMode';
144
+ ctx.refresh();
145
+ const indexHtml = await darkMode.wait();
146
+ if (indexHtml) {
147
+ state.transcript.push(['index.html', indexHtml]);
148
+ await options.setupDarkMode(indexHtml);
149
+ }
150
+ }
151
+ state.phase = failed.length ? 'failed' : 'done';
152
+ ctx.refresh();
153
+ await finish.wait();
154
+ ctx.done(state.installed);
155
+ };
156
+ const result = await runWizard({
157
+ view: () => buildView(state),
158
+ onKey,
159
+ run,
160
+ });
161
+ return { installed: result.value, logs: result.logs };
162
+ }
163
+ function handleSelectionKey(event, state, applyFilter, selection) {
164
+ const total = state.visible.length;
165
+ if (event.key === 'up') {
166
+ state.cursor = total ? (state.cursor - 1 + total) % total : 0;
167
+ return;
168
+ }
169
+ if (event.key === 'down') {
170
+ state.cursor = total ? (state.cursor + 1) % total : 0;
171
+ return;
172
+ }
173
+ if (event.key === ' ' || event.key === 'space') {
174
+ const index = state.visible[state.cursor];
175
+ if (index !== undefined) {
176
+ if (state.selected.has(index))
177
+ state.selected.delete(index);
178
+ else
179
+ state.selected.add(index);
180
+ }
181
+ return;
182
+ }
183
+ if (event.ctrl && event.key === 'a') {
184
+ // Toggles everything visible, honouring the current filter.
185
+ const allSelected = state.visible.every(index => state.selected.has(index));
186
+ for (const index of state.visible) {
187
+ if (allSelected)
188
+ state.selected.delete(index);
189
+ else
190
+ state.selected.add(index);
191
+ }
192
+ return;
193
+ }
194
+ if (event.key === 'enter') {
195
+ selection.settle([...state.selected].sort((a, b) => a - b).map(index => state.names[index]));
196
+ return;
197
+ }
198
+ if (event.key === 'backspace') {
199
+ state.filter = [...state.filter].slice(0, -1).join('');
200
+ applyFilter();
201
+ return;
202
+ }
203
+ if (event.key.length === 1 && !event.ctrl && !event.alt) {
204
+ state.filter += event.key;
205
+ applyFilter();
206
+ }
207
+ }
208
+ /** Sliding window over the list: keeps the cursor visible at all times. */
209
+ const VISIBLE_ROWS = 10;
210
+ function windowOf(state) {
211
+ if (state.visible.length <= VISIBLE_ROWS)
212
+ return { slice: state.visible, offset: 0 };
213
+ const half = Math.floor(VISIBLE_ROWS / 2);
214
+ const max = state.visible.length - VISIBLE_ROWS;
215
+ const offset = Math.max(0, Math.min(state.cursor - half, max));
216
+ return { slice: state.visible.slice(offset, offset + VISIBLE_ROWS), offset };
217
+ }
218
+ function buildView(state) {
219
+ const body = [commandHeader('add', 'Add components to your project'), text('')];
220
+ for (const [label, value] of state.transcript)
221
+ body.push(answeredLine(label, value));
222
+ if (state.transcript.length)
223
+ body.push(text(''));
224
+ if (state.phase === 'selecting') {
225
+ const { slice, offset } = windowOf(state);
226
+ const choices = slice.map(index => ({ label: state.names[index] }));
227
+ const localCursor = state.cursor - offset;
228
+ const localSelected = new Set(slice.map((index, position) => (state.selected.has(index) ? position : -1)).filter(position => position >= 0));
229
+ body.push(question('Which components would you like to add?'));
230
+ body.push(textField(state.filter));
231
+ if (choices.length) {
232
+ body.push(...checkList(choices, localCursor, localSelected));
233
+ }
234
+ else {
235
+ body.push(hint('No component matches this filter.'));
236
+ }
237
+ body.push(text(''));
238
+ body.push(hint(`${state.selected.size} selected · ${state.visible.length} of ${state.names.length} shown`));
239
+ body.push(spacer());
240
+ body.push(controls([
241
+ ['↑/↓', 'move'],
242
+ ['space', 'select'],
243
+ ['ctrl+a', 'toggle all'],
244
+ ['enter', 'confirm'],
245
+ ]));
246
+ }
247
+ else if (state.phase === 'resolving') {
248
+ body.push(taskHeader('Resolving components and dependencies…', false));
249
+ body.push(spacer());
250
+ }
251
+ else if (state.phase === 'confirming') {
252
+ body.push(question(`Ready to install ${state.componentCount} component(s) and ${state.dependencyCount} dependencies. Proceed?`));
253
+ body.push(confirmField(state.confirmValue));
254
+ body.push(hint('Existing files are kept unless you passed --overwrite.'));
255
+ body.push(spacer());
256
+ body.push(controls([
257
+ ['y/n · ←/→', 'toggle'],
258
+ ['enter', 'confirm'],
259
+ ]));
260
+ }
261
+ else if (state.phase === 'darkMode') {
262
+ body.push(question('Where is your index.html file?'));
263
+ body.push(textField(state.indexHtml.value, state.indexHtml.caret));
264
+ body.push(hint('Dark mode injects a small script there to apply the theme before first paint.'));
265
+ body.push(spacer());
266
+ body.push(controls([
267
+ ['enter', 'confirm'],
268
+ ['esc', 'skip'],
269
+ ]));
270
+ }
271
+ else {
272
+ body.push(...installBlock(state));
273
+ body.push(spacer());
274
+ body.push(controls([['enter', state.phase === 'failed' ? 'exit' : 'finish']]));
275
+ }
276
+ return screen(page(...body));
277
+ }
278
+ function installBlock(state) {
279
+ const allDone = state.tasksDone >= state.tasks.length;
280
+ const nodes = [];
281
+ if (state.tasks.length) {
282
+ nodes.push(taskHeader(state.phase === 'failed' ? 'Finished with errors' : 'Installing…', allDone), text(''), ...taskList(state.tasks, state.tasksDone, state.phase === 'installing' ? Date.now() - state.taskStartedAt : undefined), text(''), progress(state.tasksDone, state.tasks.length), text(''));
283
+ }
284
+ if (state.phase === 'failed') {
285
+ nodes.push(resultPanel('danger', state.failure ?? 'Some components could not be installed.'));
286
+ }
287
+ else if (state.installed.length) {
288
+ nodes.push(resultPanel('success', `Installed ${state.installed.length} component${state.installed.length > 1 ? 's' : ''}.`));
289
+ }
290
+ else {
291
+ nodes.push(resultPanel('success', 'All components are already installed.'));
292
+ }
293
+ return nodes;
294
+ }
295
+ //# sourceMappingURL=wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../../src/commands/add/wizard.ts"],"names":[],"mappings":"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"}
@@ -1,71 +1,81 @@
1
- import { Config } from '../../utils/config.js';
2
- import { ProjectInfo } from '../../utils/get-project-info';
1
+ import { type ProjectKind } from '../../commands/init/project-kind.js';
2
+ import { type Config } from '../../utils/config.js';
3
+ import { type ProjectInfo } from '../../utils/get-project-info.js';
3
4
  import { z } from 'zod';
4
5
  export declare const SCHEMA_URL = "https://zardui.com/schema.json";
5
6
  export declare const configSchema: z.ZodObject<{
6
7
  $schema: z.ZodString;
7
- style: z.ZodEnum<["css"]>;
8
+ style: z.ZodEnum<{
9
+ css: "css";
10
+ }>;
11
+ icons: z.ZodString;
12
+ rtl: z.ZodBoolean;
13
+ projectType: z.ZodEnum<{
14
+ angular: "angular";
15
+ "angular-library": "angular-library";
16
+ nx: "nx";
17
+ "nx-library": "nx-library";
18
+ analog: "analog";
19
+ }>;
8
20
  appConfigFile: z.ZodString;
9
- packageManager: z.ZodEnum<["npm", "yarn", "pnpm", "bun"]>;
21
+ packageManager: z.ZodEnum<{
22
+ npm: "npm";
23
+ yarn: "yarn";
24
+ pnpm: "pnpm";
25
+ bun: "bun";
26
+ }>;
10
27
  tailwind: z.ZodObject<{
11
28
  css: z.ZodString;
12
29
  baseColor: z.ZodString;
13
- }, "strip", z.ZodTypeAny, {
14
- css?: string;
15
- baseColor?: string;
16
- }, {
17
- css?: string;
18
- baseColor?: string;
19
- }>;
30
+ }, z.core.$strip>;
20
31
  baseUrl: z.ZodString;
21
32
  aliases: z.ZodObject<{
22
33
  components: z.ZodString;
23
34
  utils: z.ZodString;
24
35
  core: z.ZodString;
25
36
  services: z.ZodString;
26
- }, "strip", z.ZodTypeAny, {
27
- components?: string;
28
- utils?: string;
29
- core?: string;
30
- services?: string;
31
- }, {
32
- components?: string;
33
- utils?: string;
34
- core?: string;
35
- services?: string;
36
- }>;
37
- }, "strip", z.ZodTypeAny, {
38
- $schema?: string;
39
- appConfigFile?: string;
40
- style?: "css";
41
- packageManager?: "npm" | "yarn" | "pnpm" | "bun";
42
- tailwind?: {
43
- css?: string;
44
- baseColor?: string;
45
- };
46
- baseUrl?: string;
47
- aliases?: {
48
- components?: string;
49
- utils?: string;
50
- core?: string;
51
- services?: string;
52
- };
53
- }, {
54
- $schema?: string;
55
- appConfigFile?: string;
56
- style?: "css";
57
- packageManager?: "npm" | "yarn" | "pnpm" | "bun";
58
- tailwind?: {
59
- css?: string;
60
- baseColor?: string;
61
- };
62
- baseUrl?: string;
63
- aliases?: {
64
- components?: string;
65
- utils?: string;
66
- core?: string;
67
- services?: string;
68
- };
69
- }>;
70
- export declare function promptForConfig(cwd: string, projectInfo: ProjectInfo, packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun'): Promise<Config>;
37
+ }, z.core.$strip>;
38
+ }, z.core.$strip>;
39
+ /** As respostas do wizard, antes de virarem um `components.json`. */
40
+ export interface InitAnswers {
41
+ kind: ProjectKind;
42
+ /** Root of the chosen project, relative to the workspace; empty for a single app. */
43
+ projectRoot: string;
44
+ appConfig: string;
45
+ theme: string;
46
+ globalCss: string;
47
+ componentsAlias: string;
48
+ utilsAlias: string;
49
+ }
50
+ /**
51
+ * The paths suggested for the type the user chose.
52
+ *
53
+ * They come from the project declared in the workspace whenever there is one —
54
+ * the build target's `styles` is where the global CSS actually lives, and
55
+ * guessing it was what made init suggest paths that did not exist in monorepo
56
+ * layouts.
57
+ */
58
+ export declare function defaultAnswers(projectInfo: ProjectInfo, kind?: ProjectKind, projectRoot?: string): InitAnswers;
59
+ /**
60
+ * Where the components are written, derived from `app.config.ts`.
61
+ *
62
+ * Hardcoding `src/app` broke every layout that was not a single app at the root:
63
+ * in a workspace the app.config lives in `apps/<app>/src/app`, and the components
64
+ * ended up in a root `src/app` that belongs to no project. The directory holding
65
+ * app.config is exactly the root of the app's code.
66
+ *
67
+ * Separators are normalized before `dirname`, not after: on POSIX `path.dirname`
68
+ * does not treat `\` as a separator, so a Windows-style path collapsed to `.`
69
+ * and silently fell back to `src/app`.
70
+ */
71
+ export declare function deriveBaseUrl(appConfigFile: string): string;
72
+ export declare function buildConfig(answers: InitAnswers, packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun'): Config;
73
+ /**
74
+ * State of the global CSS file the user pointed at.
75
+ *
76
+ * init overwrites that file with the theme tokens, so the wizard has to know,
77
+ * before going on, whether it exists and whether there is content to lose.
78
+ */
79
+ export type CssFileState = 'missing' | 'empty' | 'has-content';
80
+ export declare function inspectCssFile(cwd: string, relativePath: string): Promise<CssFileState>;
71
81
  //# sourceMappingURL=config-prompter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-prompter.d.ts","sourceRoot":"","sources":["../../../src/commands/init/config-prompter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAQ1D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU,mCAAmC,CAAC;AAE3D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBvB,CAAC;AAEH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAC9C,OAAO,CAAC,MAAM,CAAC,CAiEjB"}
1
+ {"version":3,"file":"config-prompter.d.ts","sourceRoot":"","sources":["../../../src/commands/init/config-prompter.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,KAAK,WAAW,EAAyB,MAAM,gCAAgC,CAAC;AAIzF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU,mCAAmC,CAAC;AAE3D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBvB,CAAC;AAEH,qEAAqE;AACrE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,qFAAqF;IACrF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,WAAW,EACxB,IAAI,cAAiC,EACrC,WAAW,CAAC,EAAE,MAAM,GACnB,WAAW,CA4Bb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAG3D;AAOD,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CA0BzG;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;AAE/D,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAO7F"}
@@ -1,15 +1,16 @@
1
- import { logger } from '../../utils/logger.js';
2
- import { getAvailableThemes, getThemeDisplayName } from '../../utils/theme-selector.js';
3
- import chalk from 'chalk';
1
+ import { candidateProjects, detectProjectKind, fallbackRootFor, isLibraryKind, libraryBaseUrl, libraryStylesPath, } from '../../commands/init/project-kind.js';
2
+ import { SOURCE_ICON_FAMILY } from '../../core/icons/index.js';
4
3
  import { existsSync } from 'node:fs';
5
4
  import { readFile } from 'node:fs/promises';
6
5
  import * as path from 'node:path';
7
- import prompts from 'prompts';
8
6
  import { z } from 'zod';
9
7
  export const SCHEMA_URL = 'https://zardui.com/schema.json';
10
8
  export const configSchema = z.object({
11
9
  $schema: z.string(),
12
10
  style: z.enum(['css']),
11
+ icons: z.string(),
12
+ rtl: z.boolean(),
13
+ projectType: z.enum(['angular', 'angular-library', 'nx', 'nx-library', 'analog']),
13
14
  appConfigFile: z.string(),
14
15
  packageManager: z.enum(['npm', 'yarn', 'pnpm', 'bun']),
15
16
  tailwind: z.object({
@@ -24,86 +25,101 @@ export const configSchema = z.object({
24
25
  services: z.string(),
25
26
  }),
26
27
  });
27
- export async function promptForConfig(cwd, projectInfo, packageManager) {
28
- const highlight = (text) => chalk.cyan(text);
29
- const options = await prompts([
30
- {
31
- type: 'text',
32
- name: 'app.config',
33
- message: `Where is your ${highlight('app.config.ts')} file?`,
34
- initial: projectInfo.hasNx ? 'apps/[app]/src/app/app.config.ts' : 'src/app/app.config.ts',
35
- },
36
- {
37
- type: 'select',
38
- name: 'theme',
39
- message: `Choose a ${highlight('theme')} for your components:`,
40
- choices: getAvailableThemes().map(theme => ({
41
- title: getThemeDisplayName(theme),
42
- value: theme,
43
- })),
44
- initial: 0,
45
- },
46
- {
47
- type: 'text',
48
- name: 'tailwindCss',
49
- message: `Where is your ${highlight('global CSS')} file?`,
50
- initial: projectInfo.hasNx ? 'apps/[app]/src/styles.css' : 'src/styles.css',
51
- },
52
- {
53
- type: 'text',
54
- name: 'components',
55
- message: `Configure the import alias for ${highlight('components')}:`,
56
- initial: '@/shared/components',
57
- },
58
- {
59
- type: 'text',
60
- name: 'utils',
61
- message: `Configure the import alias for ${highlight('utils')}:`,
62
- initial: '@/shared/utils',
63
- },
64
- ]);
65
- await validateCssFile(cwd, options.tailwindCss);
66
- const componentsAlias = options.components;
67
- const utilsAlias = options.utils;
68
- const sharedBase = path.dirname(componentsAlias);
69
- const config = configSchema.parse({
28
+ /**
29
+ * The project the chosen type suggests as the target.
30
+ *
31
+ * When more than one is compatible the wizard asks — but something has to be
32
+ * preselected when the list opens, and the first declared project is the least
33
+ * surprising answer.
34
+ */
35
+ function targetProject(projectInfo, kind, projectRoot) {
36
+ const candidates = candidateProjects(kind, projectInfo);
37
+ return candidates.find(project => project.root === projectRoot) ?? candidates[0];
38
+ }
39
+ /**
40
+ * The paths suggested for the type the user chose.
41
+ *
42
+ * They come from the project declared in the workspace whenever there is one —
43
+ * the build target's `styles` is where the global CSS actually lives, and
44
+ * guessing it was what made init suggest paths that did not exist in monorepo
45
+ * layouts.
46
+ */
47
+ export function defaultAnswers(projectInfo, kind = detectProjectKind(projectInfo), projectRoot) {
48
+ const project = targetProject(projectInfo, kind, projectRoot);
49
+ const root = project?.root ?? fallbackRootFor(kind);
50
+ const shared = {
51
+ kind,
52
+ projectRoot: root,
53
+ theme: 'neutral',
54
+ componentsAlias: '@/shared/components',
55
+ utilsAlias: '@/shared/utils',
56
+ };
57
+ if (isLibraryKind(kind)) {
58
+ return {
59
+ ...shared,
60
+ // A library has no app.config; the field stays empty in components.json.
61
+ appConfig: '',
62
+ globalCss: libraryStylesPath(root),
63
+ };
64
+ }
65
+ const sourceRoot = project?.sourceRoot ?? (root ? `${root}/src` : 'src');
66
+ return {
67
+ ...shared,
68
+ appConfig: `${sourceRoot}/app/app.config.ts`,
69
+ globalCss: project?.styles[0] ?? `${sourceRoot}/styles.css`,
70
+ };
71
+ }
72
+ /**
73
+ * Where the components are written, derived from `app.config.ts`.
74
+ *
75
+ * Hardcoding `src/app` broke every layout that was not a single app at the root:
76
+ * in a workspace the app.config lives in `apps/<app>/src/app`, and the components
77
+ * ended up in a root `src/app` that belongs to no project. The directory holding
78
+ * app.config is exactly the root of the app's code.
79
+ *
80
+ * Separators are normalized before `dirname`, not after: on POSIX `path.dirname`
81
+ * does not treat `\` as a separator, so a Windows-style path collapsed to `.`
82
+ * and silently fell back to `src/app`.
83
+ */
84
+ export function deriveBaseUrl(appConfigFile) {
85
+ const dir = path.posix.dirname(appConfigFile.replace(/\\/g, '/'));
86
+ return dir === '.' ? 'src/app' : dir;
87
+ }
88
+ /** In a library there is no app.config, so the library root decides. */
89
+ function baseUrlFor(answers) {
90
+ return isLibraryKind(answers.kind) ? libraryBaseUrl(answers.projectRoot) : deriveBaseUrl(answers.appConfig);
91
+ }
92
+ export function buildConfig(answers, packageManager) {
93
+ const sharedBase = path.posix.dirname(answers.componentsAlias.replace(/\\/g, '/'));
94
+ return configSchema.parse({
70
95
  $schema: SCHEMA_URL,
71
96
  style: 'css',
72
- appConfigFile: options['app.config'],
97
+ // Neither is asked in the wizard: today there is only one icon family, and
98
+ // RTL does not change what init writes. They go into the file with their
99
+ // default so they can be edited later, which is what makes them configurable.
100
+ icons: SOURCE_ICON_FAMILY,
101
+ rtl: false,
102
+ projectType: answers.kind,
103
+ appConfigFile: answers.appConfig,
73
104
  packageManager,
74
105
  tailwind: {
75
- css: options.tailwindCss,
76
- baseColor: options.theme,
106
+ css: answers.globalCss,
107
+ baseColor: answers.theme,
77
108
  },
78
- baseUrl: 'src/app',
109
+ baseUrl: baseUrlFor(answers),
79
110
  aliases: {
80
- components: componentsAlias,
81
- utils: utilsAlias,
111
+ components: answers.componentsAlias,
112
+ utils: answers.utilsAlias,
82
113
  core: `${sharedBase}/core`,
83
114
  services: `${sharedBase}/services`,
84
115
  },
85
116
  });
86
- return config;
87
117
  }
88
- async function validateCssFile(cwd, tailwindCss) {
89
- const cssPath = path.join(cwd, tailwindCss);
90
- if (!existsSync(cssPath)) {
91
- logger.error(`CSS file not found at: ${tailwindCss}`);
92
- logger.error('Please ensure your CSS file exists before continuing.');
93
- process.exit(1);
94
- }
95
- const existingContent = await readFile(cssPath, 'utf8');
96
- if (existingContent.trim().length > 0) {
97
- const { overwrite } = await prompts({
98
- type: 'confirm',
99
- name: 'overwrite',
100
- message: `Your CSS file already has content. This will overwrite everything with ZardUI theme configuration. Continue?`,
101
- initial: true,
102
- });
103
- if (!overwrite) {
104
- logger.info('Installation cancelled.');
105
- process.exit(0);
106
- }
107
- }
118
+ export async function inspectCssFile(cwd, relativePath) {
119
+ const cssPath = path.join(cwd, relativePath);
120
+ if (!existsSync(cssPath))
121
+ return 'missing';
122
+ const content = await readFile(cssPath, 'utf8');
123
+ return content.trim().length > 0 ? 'has-content' : 'empty';
108
124
  }
109
125
  //# sourceMappingURL=config-prompter.js.map