zard-cli 1.0.0-beta.98 → 1.0.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 (253) hide show
  1. package/README.md +92 -36
  2. package/commands/add/component-installer.d.ts +3 -0
  3. package/commands/add/component-installer.d.ts.map +1 -1
  4. package/commands/add/component-installer.js +10 -4
  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.map +1 -1
  11. package/commands/add/dark-mode-setup.js +2 -11
  12. package/commands/add/dark-mode-setup.js.map +1 -1
  13. package/commands/add/dependency-resolver.d.ts +8 -1
  14. package/commands/add/dependency-resolver.d.ts.map +1 -1
  15. package/commands/add/dependency-resolver.js +87 -16
  16. package/commands/add/dependency-resolver.js.map +1 -1
  17. package/commands/add/index.d.ts.map +1 -1
  18. package/commands/add/index.js +128 -96
  19. package/commands/add/index.js.map +1 -1
  20. package/commands/add/stylesheet-setup.d.ts +3 -0
  21. package/commands/add/stylesheet-setup.d.ts.map +1 -0
  22. package/commands/add/stylesheet-setup.js +92 -0
  23. package/commands/add/stylesheet-setup.js.map +1 -0
  24. package/commands/add/wizard.d.ts +35 -0
  25. package/commands/add/wizard.d.ts.map +1 -0
  26. package/commands/add/wizard.js +299 -0
  27. package/commands/add/wizard.js.map +1 -0
  28. package/commands/init/config-prompter.d.ts +55 -3
  29. package/commands/init/config-prompter.d.ts.map +1 -1
  30. package/commands/init/config-prompter.js +92 -74
  31. package/commands/init/config-prompter.js.map +1 -1
  32. package/commands/init/dependencies.d.ts +1 -8
  33. package/commands/init/dependencies.d.ts.map +1 -1
  34. package/commands/init/dependencies.js +51 -25
  35. package/commands/init/dependencies.js.map +1 -1
  36. package/commands/init/index.d.ts.map +1 -1
  37. package/commands/init/index.js +147 -81
  38. package/commands/init/index.js.map +1 -1
  39. package/commands/init/project-kind.d.ts +82 -0
  40. package/commands/init/project-kind.d.ts.map +1 -0
  41. package/commands/init/project-kind.js +166 -0
  42. package/commands/init/project-kind.js.map +1 -0
  43. package/commands/init/steps.d.ts +15 -0
  44. package/commands/init/steps.d.ts.map +1 -0
  45. package/commands/init/steps.js +154 -0
  46. package/commands/init/steps.js.map +1 -0
  47. package/commands/init/tailwind-setup.d.ts +9 -2
  48. package/commands/init/tailwind-setup.d.ts.map +1 -1
  49. package/commands/init/tailwind-setup.js +33 -12
  50. package/commands/init/tailwind-setup.js.map +1 -1
  51. package/commands/init/tsconfig-updater.d.ts +8 -1
  52. package/commands/init/tsconfig-updater.d.ts.map +1 -1
  53. package/commands/init/tsconfig-updater.js +30 -11
  54. package/commands/init/tsconfig-updater.js.map +1 -1
  55. package/commands/init/update-angular-config.d.ts.map +1 -1
  56. package/commands/init/update-angular-config.js +28 -50
  57. package/commands/init/update-angular-config.js.map +1 -1
  58. package/commands/init/vite-setup.d.ts +11 -0
  59. package/commands/init/vite-setup.d.ts.map +1 -0
  60. package/commands/init/vite-setup.js +61 -0
  61. package/commands/init/vite-setup.js.map +1 -0
  62. package/commands/init/wizard.d.ts +30 -0
  63. package/commands/init/wizard.d.ts.map +1 -0
  64. package/commands/init/wizard.js +560 -0
  65. package/commands/init/wizard.js.map +1 -0
  66. package/constants/app.constants.d.ts +17 -0
  67. package/constants/app.constants.d.ts.map +1 -1
  68. package/constants/app.constants.js +39 -16
  69. package/constants/app.constants.js.map +1 -1
  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 +141 -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 +482 -37
  84. package/core/registry/registry-data.js.map +1 -1
  85. package/core/themes/theme-definitions.d.ts.map +1 -1
  86. package/core/themes/theme-definitions.js +61 -72
  87. package/core/themes/theme-definitions.js.map +1 -1
  88. package/index.js +6 -3
  89. package/index.js.map +1 -1
  90. package/package.json +6 -11
  91. package/ui/blocks.d.ts +71 -0
  92. package/ui/blocks.d.ts.map +1 -0
  93. package/ui/blocks.js +116 -0
  94. package/ui/blocks.js.map +1 -0
  95. package/ui/brand.d.ts +14 -0
  96. package/ui/brand.d.ts.map +1 -0
  97. package/ui/brand.js +35 -0
  98. package/ui/brand.js.map +1 -0
  99. package/ui/engine/animation/index.d.ts +38 -0
  100. package/ui/engine/animation/index.d.ts.map +1 -0
  101. package/ui/engine/animation/index.js +102 -0
  102. package/ui/engine/animation/index.js.map +1 -0
  103. package/ui/engine/ansi/index.d.ts +51 -0
  104. package/ui/engine/ansi/index.d.ts.map +1 -0
  105. package/ui/engine/ansi/index.js +116 -0
  106. package/ui/engine/ansi/index.js.map +1 -0
  107. package/ui/engine/components/index.d.ts +211 -0
  108. package/ui/engine/components/index.d.ts.map +1 -0
  109. package/ui/engine/components/index.js +109 -0
  110. package/ui/engine/components/index.js.map +1 -0
  111. package/ui/engine/cursor/index.d.ts +16 -0
  112. package/ui/engine/cursor/index.d.ts.map +1 -0
  113. package/ui/engine/cursor/index.js +40 -0
  114. package/ui/engine/cursor/index.js.map +1 -0
  115. package/ui/engine/diff/index.d.ts +26 -0
  116. package/ui/engine/diff/index.d.ts.map +1 -0
  117. package/ui/engine/diff/index.js +56 -0
  118. package/ui/engine/diff/index.js.map +1 -0
  119. package/ui/engine/events/index.d.ts +24 -0
  120. package/ui/engine/events/index.d.ts.map +1 -0
  121. package/ui/engine/events/index.js +60 -0
  122. package/ui/engine/events/index.js.map +1 -0
  123. package/ui/engine/focus/index.d.ts +25 -0
  124. package/ui/engine/focus/index.d.ts.map +1 -0
  125. package/ui/engine/focus/index.js +77 -0
  126. package/ui/engine/focus/index.js.map +1 -0
  127. package/ui/engine/frame/index.d.ts +48 -0
  128. package/ui/engine/frame/index.d.ts.map +1 -0
  129. package/ui/engine/frame/index.js +0 -0
  130. package/ui/engine/frame/index.js.map +1 -0
  131. package/ui/engine/index.d.ts +28 -0
  132. package/ui/engine/index.d.ts.map +1 -0
  133. package/ui/engine/index.js +28 -0
  134. package/ui/engine/index.js.map +1 -0
  135. package/ui/engine/input/index.d.ts +36 -0
  136. package/ui/engine/input/index.d.ts.map +1 -0
  137. package/ui/engine/input/index.js +224 -0
  138. package/ui/engine/input/index.js.map +1 -0
  139. package/ui/engine/layout/index.d.ts +42 -0
  140. package/ui/engine/layout/index.d.ts.map +1 -0
  141. package/ui/engine/layout/index.js +241 -0
  142. package/ui/engine/layout/index.js.map +1 -0
  143. package/ui/engine/renderer/index.d.ts +43 -0
  144. package/ui/engine/renderer/index.d.ts.map +1 -0
  145. package/ui/engine/renderer/index.js +619 -0
  146. package/ui/engine/renderer/index.js.map +1 -0
  147. package/ui/engine/scheduler/index.d.ts +22 -0
  148. package/ui/engine/scheduler/index.d.ts.map +1 -0
  149. package/ui/engine/scheduler/index.js +77 -0
  150. package/ui/engine/scheduler/index.js.map +1 -0
  151. package/ui/engine/screen/index.d.ts +39 -0
  152. package/ui/engine/screen/index.d.ts.map +1 -0
  153. package/ui/engine/screen/index.js +255 -0
  154. package/ui/engine/screen/index.js.map +1 -0
  155. package/ui/engine/terminal/index.d.ts +84 -0
  156. package/ui/engine/terminal/index.d.ts.map +1 -0
  157. package/ui/engine/terminal/index.js +235 -0
  158. package/ui/engine/terminal/index.js.map +1 -0
  159. package/ui/engine/testing/index.d.ts +27 -0
  160. package/ui/engine/testing/index.d.ts.map +1 -0
  161. package/ui/engine/testing/index.js +63 -0
  162. package/ui/engine/testing/index.js.map +1 -0
  163. package/ui/engine/theme/index.d.ts +26 -0
  164. package/ui/engine/theme/index.d.ts.map +1 -0
  165. package/ui/engine/theme/index.js +128 -0
  166. package/ui/engine/theme/index.js.map +1 -0
  167. package/ui/engine/utils/index.d.ts +12 -0
  168. package/ui/engine/utils/index.d.ts.map +1 -0
  169. package/ui/engine/utils/index.js +143 -0
  170. package/ui/engine/utils/index.js.map +1 -0
  171. package/ui/gate.d.ts +19 -0
  172. package/ui/gate.d.ts.map +1 -0
  173. package/ui/gate.js +36 -0
  174. package/ui/gate.js.map +1 -0
  175. package/ui/index.d.ts +18 -0
  176. package/ui/index.d.ts.map +1 -0
  177. package/ui/index.js +18 -0
  178. package/ui/index.js.map +1 -0
  179. package/ui/log-sink.d.ts +24 -0
  180. package/ui/log-sink.d.ts.map +1 -0
  181. package/ui/log-sink.js +35 -0
  182. package/ui/log-sink.js.map +1 -0
  183. package/ui/output.d.ts +14 -0
  184. package/ui/output.d.ts.map +1 -0
  185. package/ui/output.js +28 -0
  186. package/ui/output.js.map +1 -0
  187. package/ui/report.d.ts +30 -0
  188. package/ui/report.d.ts.map +1 -0
  189. package/ui/report.js +45 -0
  190. package/ui/report.js.map +1 -0
  191. package/ui/runner.d.ts +66 -0
  192. package/ui/runner.d.ts.map +1 -0
  193. package/ui/runner.js +135 -0
  194. package/ui/runner.js.map +1 -0
  195. package/ui/style.d.ts +24 -0
  196. package/ui/style.d.ts.map +1 -0
  197. package/ui/style.js +44 -0
  198. package/ui/style.js.map +1 -0
  199. package/ui/testing/fake-tty.d.ts +26 -0
  200. package/ui/testing/fake-tty.d.ts.map +1 -0
  201. package/ui/testing/fake-tty.js +61 -0
  202. package/ui/testing/fake-tty.js.map +1 -0
  203. package/ui/text-input.d.ts +31 -0
  204. package/ui/text-input.d.ts.map +1 -0
  205. package/ui/text-input.js +89 -0
  206. package/ui/text-input.js.map +1 -0
  207. package/ui/theme.d.ts +10 -0
  208. package/ui/theme.d.ts.map +1 -0
  209. package/ui/theme.js +20 -0
  210. package/ui/theme.js.map +1 -0
  211. package/utils/angular-compat.d.ts +21 -0
  212. package/utils/angular-compat.d.ts.map +1 -0
  213. package/utils/angular-compat.js +52 -0
  214. package/utils/angular-compat.js.map +1 -0
  215. package/utils/config.d.ts +29 -0
  216. package/utils/config.d.ts.map +1 -1
  217. package/utils/config.js +50 -4
  218. package/utils/config.js.map +1 -1
  219. package/utils/errors.d.ts +11 -0
  220. package/utils/errors.d.ts.map +1 -1
  221. package/utils/errors.js +14 -0
  222. package/utils/errors.js.map +1 -1
  223. package/utils/get-project-info.d.ts +29 -0
  224. package/utils/get-project-info.d.ts.map +1 -1
  225. package/utils/get-project-info.js +176 -1
  226. package/utils/get-project-info.js.map +1 -1
  227. package/utils/http-client.d.ts.map +1 -1
  228. package/utils/http-client.js +18 -3
  229. package/utils/http-client.js.map +1 -1
  230. package/utils/icon-catalog.d.ts +34 -0
  231. package/utils/icon-catalog.d.ts.map +1 -0
  232. package/utils/icon-catalog.js +63 -0
  233. package/utils/icon-catalog.js.map +1 -0
  234. package/utils/logger.d.ts +13 -1
  235. package/utils/logger.d.ts.map +1 -1
  236. package/utils/logger.js +95 -15
  237. package/utils/logger.js.map +1 -1
  238. package/utils/package-manager.d.ts +42 -1
  239. package/utils/package-manager.d.ts.map +1 -1
  240. package/utils/package-manager.js +204 -11
  241. package/utils/package-manager.js.map +1 -1
  242. package/utils/registry.d.ts +84 -2
  243. package/utils/registry.d.ts.map +1 -1
  244. package/utils/registry.js +121 -18
  245. package/utils/registry.js.map +1 -1
  246. package/utils/schema-version.d.ts +21 -0
  247. package/utils/schema-version.d.ts.map +1 -0
  248. package/utils/schema-version.js +28 -0
  249. package/utils/schema-version.js.map +1 -0
  250. package/utils/source-file.d.ts +40 -0
  251. package/utils/source-file.d.ts.map +1 -0
  252. package/utils/source-file.js +104 -0
  253. package/utils/source-file.js.map +1 -0
@@ -1,18 +1,23 @@
1
1
  import { installComponent, validateTargetPath } from '../../commands/add/component-installer.js';
2
2
  import { selectComponents } from '../../commands/add/component-selector.js';
3
3
  import { updateProvideZardWithDarkMode } from '../../commands/add/dark-mode-setup.js';
4
- import { resolveDependencies, getTargetDir } from '../../commands/add/dependency-resolver.js';
4
+ import { getAllInstallableNames, getTargetDir, resolveDependencies, } from '../../commands/add/dependency-resolver.js';
5
+ import { setupTypeset, setupUtilities } from '../../commands/add/stylesheet-setup.js';
6
+ import { runAddWizard } from '../../commands/add/wizard.js';
7
+ import { indexHtmlFor } from '../../commands/init/project-kind.js';
5
8
  import { injectThemeScript } from '../../commands/init/theme-loader.js';
9
+ import { isInteractive, printReport, WizardCancelledError } from '../../ui/index.js';
10
+ import { pinAllForAngular } from '../../utils/angular-compat.js';
6
11
  import { getConfig, resolveConfigPaths } from '../../utils/config.js';
7
12
  import { CliError } from '../../utils/errors.js';
8
13
  import { getProjectInfo } from '../../utils/get-project-info.js';
14
+ import { assertIconFamily, loadIconCatalog } from '../../utils/icon-catalog.js';
9
15
  import { logger, spinner } from '../../utils/logger.js';
10
- import { installPackages } from '../../utils/package-manager.js';
11
- import chalk from 'chalk';
16
+ import { filterInstalledPackages, installPackagesWithRetry } from '../../utils/package-manager.js';
17
+ import { getRegistryUrl } from '../../utils/registry.js';
12
18
  import { Command } from 'commander';
13
19
  import { existsSync } from 'node:fs';
14
20
  import * as path from 'node:path';
15
- import prompts from 'prompts';
16
21
  export const add = new Command()
17
22
  .name('add')
18
23
  .description('add a component to your project')
@@ -31,33 +36,122 @@ export const add = new Command()
31
36
  const config = await loadConfiguration(cwd);
32
37
  const projectInfo = await validateProject(cwd);
33
38
  const resolvedConfig = await resolveConfigPaths(cwd, config);
34
- const selectedComponents = await selectComponents(components, options.all);
35
- const addSpinner = spinner('Resolving components...').start();
36
- const { componentsToInstall, dependenciesToInstall } = await resolveDependencies(selectedComponents, resolvedConfig, cwd, options);
37
- addSpinner.stop();
38
- if (componentsToInstall.length === 0) {
39
- logger.info('All components already installed.');
39
+ // The catalog decides whether `icons` is a valid value and how to translate
40
+ // the symbols on install, so it comes before resolving any component.
41
+ await loadIconCatalog(getRegistryUrl(config));
42
+ assertIconFamily(config.icons);
43
+ const preselected = await selectComponents(components, options.all);
44
+ warnOnPrereleaseAngular(projectInfo.angularVersionRaw);
45
+ const actions = {
46
+ loadNames: () => getAllInstallableNames(),
47
+ resolve: async (names) => {
48
+ const { componentsToInstall, dependenciesToInstall } = await resolveDependencies(names, resolvedConfig, cwd, options);
49
+ return {
50
+ components: componentsToInstall,
51
+ dependencies: pinAllForAngular(dependenciesToInstall, projectInfo.angularVersion),
52
+ };
53
+ },
54
+ installDependencies: (packages) => installDependencies(packages, cwd, config.packageManager),
55
+ installComponent: (component) => installComponent(component.name, getTargetDir(component, resolvedConfig, cwd, options.path), resolvedConfig, {
56
+ customPath: Boolean(options.path),
57
+ isBlock: component.isBlock,
58
+ }),
59
+ setupDarkMode: async (indexHtml) => {
60
+ await injectThemeScript(cwd, indexHtml);
61
+ await updateProvideZardWithDarkMode(cwd, resolvedConfig);
62
+ },
63
+ setupTypeset: () => setupTypeset(resolvedConfig.resolvedPaths.tailwindCss),
64
+ setupUtilities: () => setupUtilities(resolvedConfig.resolvedPaths.tailwindCss),
65
+ defaultIndexHtml: indexHtmlFor(config.projectType, config.baseUrl),
66
+ };
67
+ if (!isInteractive()) {
68
+ // See the note in `init`: without this, falling back to text mode is
69
+ // indistinguishable from the interface not existing.
70
+ logger.debug(`No terminal to draw on (stdin TTY: ${Boolean(process.stdin.isTTY)}, ` +
71
+ `stdout TTY: ${Boolean(process.stdout.isTTY)}, controlling terminal: unreachable) — running headless.`);
72
+ await runHeadless(preselected, options, actions);
40
73
  return;
41
74
  }
42
- const resolvedDeps = resolveCompatibleVersions(dependenciesToInstall, projectInfo.angularVersion);
43
- if (projectInfo.angularVersionRaw && /-(rc|next|canary)/.test(projectInfo.angularVersionRaw)) {
44
- logger.warn(`You are using a pre-release version of Angular (${projectInfo.angularVersionRaw}). Some dependencies may have compatibility issues.`);
75
+ try {
76
+ const { installed, logs } = await runAddWizard({
77
+ preselected,
78
+ skipConfirmation: options.yes,
79
+ ...actions,
80
+ });
81
+ reportSuccess(installed, logs);
45
82
  }
46
- if (!options.yes) {
47
- const shouldProceed = await confirmInstallation(componentsToInstall.length, resolvedDeps.length);
48
- if (!shouldProceed) {
83
+ catch (error) {
84
+ if (error instanceof WizardCancelledError) {
85
+ printReport({ status: 'cancelled', headline: error.message, notes: ['No files were written.'] });
49
86
  process.exit(0);
50
87
  }
88
+ throw error;
51
89
  }
52
- await installDependencies(resolvedDeps, cwd, config.packageManager);
53
- await installComponents(componentsToInstall, cwd, resolvedConfig, options);
54
- const isDarkModeBeingInstalled = componentsToInstall.some(c => c.name === 'dark-mode');
55
- if (isDarkModeBeingInstalled) {
56
- await setupDarkMode(cwd, resolvedConfig);
57
- }
58
- logger.break();
59
- logger.success('Done!');
60
90
  });
91
+ /**
92
+ * The path without a UI — CI, pipes and non-interactive terminals.
93
+ *
94
+ * With nobody to pick from the list, the components have to arrive as arguments
95
+ * or through `--all`; the confirmation is skipped because there is no way to
96
+ * answer it.
97
+ */
98
+ async function runHeadless(preselected, options, actions) {
99
+ if (!preselected.length) {
100
+ throw new CliError('No components specified. Pass the component names or --all when running without an interactive terminal.', 'NO_COMPONENTS');
101
+ }
102
+ const resolveSpinner = spinner('Resolving components...').start();
103
+ const { components, dependencies } = await actions.resolve(preselected);
104
+ resolveSpinner.stop();
105
+ if (components.length === 0) {
106
+ logger.info('All components already installed.');
107
+ return;
108
+ }
109
+ if (dependencies.length) {
110
+ const depsSpinner = spinner('Installing dependencies...').start();
111
+ await actions.installDependencies(dependencies);
112
+ depsSpinner.succeed('Dependencies installed');
113
+ }
114
+ const installed = [];
115
+ const failed = [];
116
+ for (const component of components) {
117
+ const componentSpinner = spinner(`Installing ${component.name}...`).start();
118
+ try {
119
+ await actions.installComponent(component);
120
+ installed.push(component.name);
121
+ componentSpinner.succeed(component.name);
122
+ }
123
+ catch (error) {
124
+ failed.push(component.name);
125
+ componentSpinner.fail(component.name);
126
+ logger.debug(`Failed to install ${component.name}: ${error instanceof Error ? error.message : error}`);
127
+ }
128
+ }
129
+ if (installed.includes('typeset')) {
130
+ await actions.setupTypeset();
131
+ }
132
+ if (installed.includes('utilities')) {
133
+ await actions.setupUtilities();
134
+ }
135
+ if (components.some(component => component.name === 'dark-mode')) {
136
+ logger.warn('Dark mode needs an index.html path; run `zard-cli add dark-mode` interactively to configure it.');
137
+ }
138
+ if (failed.length) {
139
+ throw new CliError(`Failed to install: ${failed.join(', ')}`, 'INSTALL_FAILED');
140
+ }
141
+ reportSuccess(installed, []);
142
+ }
143
+ function reportSuccess(installed, logs) {
144
+ if (!installed.length) {
145
+ printReport({ status: 'success', headline: 'All components are already installed.', logs });
146
+ return;
147
+ }
148
+ printReport({
149
+ status: 'success',
150
+ headline: `Installed ${installed.length} component${installed.length > 1 ? 's' : ''}.`,
151
+ items: [...installed],
152
+ logs,
153
+ });
154
+ }
61
155
  function validateWorkingDirectory(cwd) {
62
156
  if (!existsSync(cwd)) {
63
157
  throw new CliError(`The path ${cwd} does not exist. Please try again.`, 'INVALID_CWD');
@@ -77,83 +171,21 @@ async function validateProject(cwd) {
77
171
  }
78
172
  return projectInfo;
79
173
  }
80
- async function confirmInstallation(componentsCount, depsCount) {
81
- const { proceed } = await prompts({
82
- type: 'confirm',
83
- name: 'proceed',
84
- message: `Ready to install ${componentsCount} component(s) and ${depsCount} dependencies. Proceed?`,
85
- initial: true,
86
- });
87
- return proceed;
88
- }
89
- const ANGULAR_VERSION_PACKAGES = ['embla-carousel-angular'];
90
- function resolveCompatibleVersions(dependencies, angularVersion) {
91
- const angularMajor = angularVersion ? parseInt(angularVersion.split('.')[0], 10) : null;
92
- return Array.from(dependencies).map(dep => {
93
- if (angularMajor && ANGULAR_VERSION_PACKAGES.includes(dep)) {
94
- return `${dep}@^${angularMajor}.0.0`;
95
- }
96
- return dep;
97
- });
174
+ function warnOnPrereleaseAngular(angularVersionRaw) {
175
+ if (angularVersionRaw && /-(rc|next|canary)/.test(angularVersionRaw)) {
176
+ logger.warn(`You are using a pre-release version of Angular (${angularVersionRaw}). Some dependencies may have compatibility issues.`);
177
+ }
98
178
  }
99
179
  async function installDependencies(packages, cwd, packageManager) {
100
180
  if (packages.length === 0)
101
181
  return;
102
- const depsSpinner = spinner('Installing dependencies...').start();
103
- try {
104
- await installPackages(packages, cwd, packageManager, false);
105
- }
106
- catch {
107
- depsSpinner.text = 'Retrying with --legacy-peer-deps...';
108
- await installPackages(packages, cwd, packageManager, false, true);
109
- }
110
- depsSpinner.succeed('Dependencies installed');
111
- }
112
- async function installComponents(componentsToInstall, cwd, resolvedConfig, options) {
113
- const installSpinner = spinner('Installing components...').start();
114
- const installed = [];
115
- const failed = [];
116
- for (const component of componentsToInstall) {
117
- try {
118
- installSpinner.text = `Installing ${component.name}...`;
119
- const targetDir = getTargetDir(component, resolvedConfig, cwd, options.path);
120
- await installComponent(component.name, targetDir, resolvedConfig);
121
- installed.push(component.name);
122
- }
123
- catch (error) {
124
- failed.push(component.name);
125
- logger.debug(`Failed to install ${component.name}: ${error instanceof Error ? error.message : error}`);
126
- }
127
- }
128
- if (failed.length > 0) {
129
- installSpinner.fail(`Failed to install: ${failed.join(', ')}`);
130
- }
131
- else {
132
- installSpinner.succeed(`Installed ${installed.length} component${installed.length > 1 ? 's' : ''}`);
133
- }
134
- }
135
- async function setupDarkMode(cwd, resolvedConfig) {
136
- logger.break();
137
- logger.info('Dark mode requires additional configuration.');
138
- const { indexFile } = await prompts({
139
- type: 'text',
140
- name: 'indexFile',
141
- message: `Where is your ${chalk.cyan('index.html')} file?`,
142
- initial: 'src/index.html',
143
- });
144
- if (!indexFile) {
145
- logger.warn('Skipping dark mode script injection.');
182
+ // An already-initialized project usually has all of them: without the filter,
183
+ // every `add` would pay for a full tree revalidation to install nothing.
184
+ const missing = await filterInstalledPackages(packages, cwd);
185
+ if (missing.length === 0) {
186
+ logger.debug(`Dependencies already installed: ${packages.join(', ')}`);
146
187
  return;
147
188
  }
148
- const darkModeSpinner = spinner('Configuring dark mode...').start();
149
- try {
150
- await injectThemeScript(cwd, indexFile);
151
- await updateProvideZardWithDarkMode(cwd, resolvedConfig);
152
- darkModeSpinner.succeed('Dark mode configured');
153
- }
154
- catch (error) {
155
- darkModeSpinner.fail('Failed to configure dark mode');
156
- logger.debug(`Dark mode error: ${error instanceof Error ? error.message : error}`);
157
- }
189
+ await installPackagesWithRetry(missing, cwd, packageManager, false);
158
190
  }
159
191
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function setupTypeset(tailwindCssPath: string): Promise<void>;
2
+ export declare function setupUtilities(tailwindCssPath: string): Promise<void>;
3
+ //# sourceMappingURL=stylesheet-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylesheet-setup.d.ts","sourceRoot":"","sources":["../../../src/commands/add/stylesheet-setup.ts"],"names":[],"mappings":"AAqGA,wBAAgB,YAAY,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE"}
@@ -0,0 +1,92 @@
1
+ import { logger } from '../../utils/logger.js';
2
+ import { lineEndingOf } from '../../utils/source-file.js';
3
+ import { existsSync } from 'fs';
4
+ import * as fsPromises from 'fs/promises';
5
+ /**
6
+ * The same text with every CSS comment blanked out.
7
+ *
8
+ * Spaces replace the comment rather than removing it, so every offset into the
9
+ * result still points at the same character of the original. A commented-out
10
+ * `@import` is a note, not a rule, and CSS ignores it — so must we, or we
11
+ * anchor the new import to a line the browser never reads.
12
+ */
13
+ function withoutComments(content) {
14
+ return content.replace(/\/\*[\s\S]*?\*\//g, comment => ' '.repeat(comment.length));
15
+ }
16
+ /**
17
+ * Whether the stylesheet already imports `fileName` for real.
18
+ *
19
+ * It asks the same scan that decides where to anchor, so the two cannot
20
+ * disagree: whatever counts as an import here counts as one there.
21
+ *
22
+ * The target has to name the file the CLI wrote next to the stylesheet, not
23
+ * merely end with it: `tailwindcss/utilities.css` or `./legacy-utilities.css`
24
+ * are other files, and taking them for ours would leave ours unimported.
25
+ */
26
+ function alreadyImports(content, fileName) {
27
+ return cssImports(withoutComments(content)).some(match => {
28
+ const target = importTarget(match[0]);
29
+ return target === fileName || target === `./${fileName}`;
30
+ });
31
+ }
32
+ /** The path an `@import` rule points at, whether quoted or wrapped in `url(...)`. */
33
+ function importTarget(rule) {
34
+ const target = /@import\s+(?:url\(\s*)?(['"]?)([^'"()\s;]+)\1/.exec(rule);
35
+ return target ? target[2] : null;
36
+ }
37
+ /** Every CSS `@import` in the file, in the order they appear. */
38
+ function cssImports(content) {
39
+ // `url(...)` and the media query list are optional and run to the `;`, so the
40
+ // pattern closes on the semicolon rather than on the quote: an
41
+ // `@import 'x' layer(base);` has to be recognised as the last one too.
42
+ const importRegex = /^[ \t]*@import\s[^;]*;/gm;
43
+ const matches = [];
44
+ let match;
45
+ while ((match = importRegex.exec(content)) !== null)
46
+ matches.push(match);
47
+ return matches;
48
+ }
49
+ /**
50
+ * Wires an installed stylesheet up by importing it into the project's global CSS.
51
+ *
52
+ * The file was written next to that CSS, but a file nobody imports styles
53
+ * nothing — and the order matters: coming after the other `@import`s lets the
54
+ * stylesheet see the theme tokens, which is where it takes colour and radius
55
+ * from.
56
+ *
57
+ * Calling this twice is the same as calling it once; a repeated `add` must not
58
+ * duplicate the line.
59
+ */
60
+ async function importIntoGlobalCss(tailwindCssPath, fileName, label) {
61
+ const importLine = `@import './${fileName}';`;
62
+ if (!existsSync(tailwindCssPath)) {
63
+ logger.warn(`${tailwindCssPath} not found. Import ${fileName} in your global stylesheet manually.`);
64
+ return;
65
+ }
66
+ const content = await fsPromises.readFile(tailwindCssPath, 'utf8');
67
+ if (alreadyImports(content, fileName)) {
68
+ logger.info(`${label} already imported in your global stylesheet.`);
69
+ return;
70
+ }
71
+ const imports = cssImports(withoutComments(content));
72
+ const last = imports[imports.length - 1];
73
+ // With no `@import` to anchor to there is no safe position: before a `@layer`
74
+ // or a `@charset` the import is invalid, and guessing would corrupt the CSS
75
+ // of whoever installed it. Better one line to copy than a broken file.
76
+ if (!last) {
77
+ logger.warn(`No @import found in ${tailwindCssPath}. Add \`${importLine}\` to it manually.`);
78
+ return;
79
+ }
80
+ const eol = lineEndingOf(content);
81
+ const end = last.index + last[0].length;
82
+ const updated = content.slice(0, end) + eol + importLine + content.slice(end);
83
+ await fsPromises.writeFile(tailwindCssPath, updated, 'utf8');
84
+ logger.info(`${label} imported in your global stylesheet.`);
85
+ }
86
+ export function setupTypeset(tailwindCssPath) {
87
+ return importIntoGlobalCss(tailwindCssPath, 'typeset.css', 'Typeset');
88
+ }
89
+ export function setupUtilities(tailwindCssPath) {
90
+ return importIntoGlobalCss(tailwindCssPath, 'utilities.css', 'Utilities');
91
+ }
92
+ //# sourceMappingURL=stylesheet-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylesheet-setup.js","sourceRoot":"","sources":["../../../src/commands/add/stylesheet-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type ComponentMeta } from '../../commands/add/dependency-resolver.js';
2
+ import { type LogRecord } from '../../ui/index.js';
3
+ export interface AddWizardOptions {
4
+ /** Components already given on the command line — they skip selection. */
5
+ readonly preselected: readonly string[];
6
+ /** Loads the available names; only called when there is a selection to make. */
7
+ loadNames(): Promise<string[]>;
8
+ resolve(names: string[]): Promise<{
9
+ components: ComponentMeta[];
10
+ dependencies: string[];
11
+ }>;
12
+ /** Skips the confirmation (`--yes`). */
13
+ readonly skipConfirmation: boolean;
14
+ installDependencies(packages: string[]): Promise<void>;
15
+ installComponent(component: ComponentMeta): Promise<void>;
16
+ /** Only called when dark-mode is part of the install. */
17
+ setupDarkMode(indexHtml: string): Promise<void>;
18
+ /** Only called when typeset is part of the install. */
19
+ setupTypeset(): Promise<void>;
20
+ setupUtilities(): Promise<void>;
21
+ /**
22
+ * Where index.html should be, according to the configured project type.
23
+ *
24
+ * A fixed `src/index.html` only exists in a single Angular app: in a workspace
25
+ * it sits under `apps/<app>/`, and in Analog it is Vite's entry page, at the
26
+ * project root.
27
+ */
28
+ readonly defaultIndexHtml: string;
29
+ }
30
+ export interface AddWizardResult {
31
+ readonly installed: readonly string[];
32
+ readonly logs: readonly LogRecord[];
33
+ }
34
+ export declare function runAddWizard(options: AddWizardOptions): Promise<AddWizardResult>;
35
+ //# sourceMappingURL=wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../../src/commands/add/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAuBL,KAAK,SAAS,EAKf,MAAM,kBAAkB,CAAC;AA6B1B,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,gFAAgF;IAChF,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,aAAa,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC3F,wCAAwC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,gBAAgB,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,yDAAyD;IACzD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,uDAAuD;IACvD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC;;;;;;OAMG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;CACrC;AAMD,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkLtF"}