zard-cli 1.0.0-beta.13 → 1.0.0-beta.131

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 (269) hide show
  1. package/README.md +39 -167
  2. package/commands/add/component-installer.d.ts +5 -1
  3. package/commands/add/component-installer.d.ts.map +1 -1
  4. package/commands/add/component-installer.js +34 -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 +9 -2
  15. package/commands/add/dependency-resolver.d.ts.map +1 -1
  16. package/commands/add/dependency-resolver.js +91 -21
  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 +140 -86
  20. package/commands/add/index.js.map +1 -1
  21. package/commands/add/stylesheet-setup.d.ts +3 -0
  22. package/commands/add/stylesheet-setup.d.ts.map +1 -0
  23. package/commands/add/stylesheet-setup.js +92 -0
  24. package/commands/add/stylesheet-setup.js.map +1 -0
  25. package/commands/add/wizard.d.ts +35 -0
  26. package/commands/add/wizard.d.ts.map +1 -0
  27. package/commands/add/wizard.js +299 -0
  28. package/commands/add/wizard.js.map +1 -0
  29. package/commands/init/config-prompter.d.ts +67 -56
  30. package/commands/init/config-prompter.d.ts.map +1 -1
  31. package/commands/init/config-prompter.js +92 -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/constants/app.constants.d.ts +17 -0
  71. package/constants/app.constants.d.ts.map +1 -1
  72. package/constants/app.constants.js +39 -16
  73. package/constants/app.constants.js.map +1 -1
  74. package/core/icons/families.d.ts +38 -0
  75. package/core/icons/families.d.ts.map +1 -0
  76. package/core/icons/families.js +26 -0
  77. package/core/icons/families.js.map +1 -0
  78. package/core/icons/icon-map.d.ts +24 -0
  79. package/core/icons/icon-map.d.ts.map +1 -0
  80. package/core/icons/icon-map.js +141 -0
  81. package/core/icons/icon-map.js.map +1 -0
  82. package/core/icons/index.d.ts +107 -0
  83. package/core/icons/index.d.ts.map +1 -0
  84. package/core/icons/index.js +183 -0
  85. package/core/icons/index.js.map +1 -0
  86. package/core/registry/registry-data.d.ts.map +1 -1
  87. package/core/registry/registry-data.js +869 -106
  88. package/core/registry/registry-data.js.map +1 -1
  89. package/core/themes/theme-definitions.d.ts +5 -5
  90. package/core/themes/theme-definitions.d.ts.map +1 -1
  91. package/core/themes/theme-definitions.js +75 -82
  92. package/core/themes/theme-definitions.js.map +1 -1
  93. package/index.js +41 -4
  94. package/index.js.map +1 -1
  95. package/package.json +9 -14
  96. package/ui/blocks.d.ts +71 -0
  97. package/ui/blocks.d.ts.map +1 -0
  98. package/ui/blocks.js +116 -0
  99. package/ui/blocks.js.map +1 -0
  100. package/ui/brand.d.ts +14 -0
  101. package/ui/brand.d.ts.map +1 -0
  102. package/ui/brand.js +35 -0
  103. package/ui/brand.js.map +1 -0
  104. package/ui/engine/animation/index.d.ts +38 -0
  105. package/ui/engine/animation/index.d.ts.map +1 -0
  106. package/ui/engine/animation/index.js +102 -0
  107. package/ui/engine/animation/index.js.map +1 -0
  108. package/ui/engine/ansi/index.d.ts +51 -0
  109. package/ui/engine/ansi/index.d.ts.map +1 -0
  110. package/ui/engine/ansi/index.js +116 -0
  111. package/ui/engine/ansi/index.js.map +1 -0
  112. package/ui/engine/components/index.d.ts +211 -0
  113. package/ui/engine/components/index.d.ts.map +1 -0
  114. package/ui/engine/components/index.js +109 -0
  115. package/ui/engine/components/index.js.map +1 -0
  116. package/ui/engine/cursor/index.d.ts +16 -0
  117. package/ui/engine/cursor/index.d.ts.map +1 -0
  118. package/ui/engine/cursor/index.js +40 -0
  119. package/ui/engine/cursor/index.js.map +1 -0
  120. package/ui/engine/diff/index.d.ts +26 -0
  121. package/ui/engine/diff/index.d.ts.map +1 -0
  122. package/ui/engine/diff/index.js +56 -0
  123. package/ui/engine/diff/index.js.map +1 -0
  124. package/ui/engine/events/index.d.ts +24 -0
  125. package/ui/engine/events/index.d.ts.map +1 -0
  126. package/ui/engine/events/index.js +60 -0
  127. package/ui/engine/events/index.js.map +1 -0
  128. package/ui/engine/focus/index.d.ts +25 -0
  129. package/ui/engine/focus/index.d.ts.map +1 -0
  130. package/ui/engine/focus/index.js +77 -0
  131. package/ui/engine/focus/index.js.map +1 -0
  132. package/ui/engine/frame/index.d.ts +48 -0
  133. package/ui/engine/frame/index.d.ts.map +1 -0
  134. package/ui/engine/frame/index.js +0 -0
  135. package/ui/engine/frame/index.js.map +1 -0
  136. package/ui/engine/index.d.ts +28 -0
  137. package/ui/engine/index.d.ts.map +1 -0
  138. package/ui/engine/index.js +28 -0
  139. package/ui/engine/index.js.map +1 -0
  140. package/ui/engine/input/index.d.ts +36 -0
  141. package/ui/engine/input/index.d.ts.map +1 -0
  142. package/ui/engine/input/index.js +224 -0
  143. package/ui/engine/input/index.js.map +1 -0
  144. package/ui/engine/layout/index.d.ts +42 -0
  145. package/ui/engine/layout/index.d.ts.map +1 -0
  146. package/ui/engine/layout/index.js +241 -0
  147. package/ui/engine/layout/index.js.map +1 -0
  148. package/ui/engine/renderer/index.d.ts +43 -0
  149. package/ui/engine/renderer/index.d.ts.map +1 -0
  150. package/ui/engine/renderer/index.js +619 -0
  151. package/ui/engine/renderer/index.js.map +1 -0
  152. package/ui/engine/scheduler/index.d.ts +22 -0
  153. package/ui/engine/scheduler/index.d.ts.map +1 -0
  154. package/ui/engine/scheduler/index.js +77 -0
  155. package/ui/engine/scheduler/index.js.map +1 -0
  156. package/ui/engine/screen/index.d.ts +39 -0
  157. package/ui/engine/screen/index.d.ts.map +1 -0
  158. package/ui/engine/screen/index.js +255 -0
  159. package/ui/engine/screen/index.js.map +1 -0
  160. package/ui/engine/terminal/index.d.ts +84 -0
  161. package/ui/engine/terminal/index.d.ts.map +1 -0
  162. package/ui/engine/terminal/index.js +235 -0
  163. package/ui/engine/terminal/index.js.map +1 -0
  164. package/ui/engine/testing/index.d.ts +27 -0
  165. package/ui/engine/testing/index.d.ts.map +1 -0
  166. package/ui/engine/testing/index.js +63 -0
  167. package/ui/engine/testing/index.js.map +1 -0
  168. package/ui/engine/theme/index.d.ts +26 -0
  169. package/ui/engine/theme/index.d.ts.map +1 -0
  170. package/ui/engine/theme/index.js +128 -0
  171. package/ui/engine/theme/index.js.map +1 -0
  172. package/ui/engine/utils/index.d.ts +12 -0
  173. package/ui/engine/utils/index.d.ts.map +1 -0
  174. package/ui/engine/utils/index.js +143 -0
  175. package/ui/engine/utils/index.js.map +1 -0
  176. package/ui/gate.d.ts +19 -0
  177. package/ui/gate.d.ts.map +1 -0
  178. package/ui/gate.js +36 -0
  179. package/ui/gate.js.map +1 -0
  180. package/ui/index.d.ts +18 -0
  181. package/ui/index.d.ts.map +1 -0
  182. package/ui/index.js +18 -0
  183. package/ui/index.js.map +1 -0
  184. package/ui/log-sink.d.ts +24 -0
  185. package/ui/log-sink.d.ts.map +1 -0
  186. package/ui/log-sink.js +35 -0
  187. package/ui/log-sink.js.map +1 -0
  188. package/ui/output.d.ts +14 -0
  189. package/ui/output.d.ts.map +1 -0
  190. package/ui/output.js +28 -0
  191. package/ui/output.js.map +1 -0
  192. package/ui/report.d.ts +30 -0
  193. package/ui/report.d.ts.map +1 -0
  194. package/ui/report.js +45 -0
  195. package/ui/report.js.map +1 -0
  196. package/ui/runner.d.ts +66 -0
  197. package/ui/runner.d.ts.map +1 -0
  198. package/ui/runner.js +135 -0
  199. package/ui/runner.js.map +1 -0
  200. package/ui/style.d.ts +24 -0
  201. package/ui/style.d.ts.map +1 -0
  202. package/ui/style.js +44 -0
  203. package/ui/style.js.map +1 -0
  204. package/ui/testing/fake-tty.d.ts +26 -0
  205. package/ui/testing/fake-tty.d.ts.map +1 -0
  206. package/ui/testing/fake-tty.js +61 -0
  207. package/ui/testing/fake-tty.js.map +1 -0
  208. package/ui/text-input.d.ts +31 -0
  209. package/ui/text-input.d.ts.map +1 -0
  210. package/ui/text-input.js +89 -0
  211. package/ui/text-input.js.map +1 -0
  212. package/ui/theme.d.ts +10 -0
  213. package/ui/theme.d.ts.map +1 -0
  214. package/ui/theme.js +20 -0
  215. package/ui/theme.js.map +1 -0
  216. package/utils/angular-compat.d.ts +21 -0
  217. package/utils/angular-compat.d.ts.map +1 -0
  218. package/utils/angular-compat.js +52 -0
  219. package/utils/angular-compat.js.map +1 -0
  220. package/utils/config.d.ts +55 -69
  221. package/utils/config.d.ts.map +1 -1
  222. package/utils/config.js +66 -9
  223. package/utils/config.js.map +1 -1
  224. package/utils/errors.d.ts +27 -0
  225. package/utils/errors.d.ts.map +1 -0
  226. package/utils/errors.js +45 -0
  227. package/utils/errors.js.map +1 -0
  228. package/utils/get-package-info.js +4 -4
  229. package/utils/get-package-info.js.map +1 -1
  230. package/utils/get-project-info.d.ts +30 -0
  231. package/utils/get-project-info.d.ts.map +1 -1
  232. package/utils/get-project-info.js +195 -6
  233. package/utils/get-project-info.js.map +1 -1
  234. package/utils/http-client.d.ts +8 -0
  235. package/utils/http-client.d.ts.map +1 -0
  236. package/utils/http-client.js +83 -0
  237. package/utils/http-client.js.map +1 -0
  238. package/utils/icon-catalog.d.ts +34 -0
  239. package/utils/icon-catalog.d.ts.map +1 -0
  240. package/utils/icon-catalog.js +63 -0
  241. package/utils/icon-catalog.js.map +1 -0
  242. package/utils/logger.d.ts +16 -1
  243. package/utils/logger.d.ts.map +1 -1
  244. package/utils/logger.js +104 -12
  245. package/utils/logger.js.map +1 -1
  246. package/utils/package-manager.d.ts +44 -1
  247. package/utils/package-manager.d.ts.map +1 -1
  248. package/utils/package-manager.js +210 -14
  249. package/utils/package-manager.js.map +1 -1
  250. package/utils/registry.d.ts +86 -2
  251. package/utils/registry.d.ts.map +1 -1
  252. package/utils/registry.js +147 -31
  253. package/utils/registry.js.map +1 -1
  254. package/utils/schema-version.d.ts +21 -0
  255. package/utils/schema-version.d.ts.map +1 -0
  256. package/utils/schema-version.js +28 -0
  257. package/utils/schema-version.js.map +1 -0
  258. package/utils/source-file.d.ts +40 -0
  259. package/utils/source-file.d.ts.map +1 -0
  260. package/utils/source-file.js +104 -0
  261. package/utils/source-file.js.map +1 -0
  262. package/utils/theme-selector.d.ts +1 -1
  263. package/utils/theme-selector.d.ts.map +1 -1
  264. package/utils/theme-selector.js +6 -6
  265. package/utils/theme-selector.js.map +1 -1
  266. package/utils/fetch-component.d.ts +0 -3
  267. package/utils/fetch-component.d.ts.map +0 -1
  268. package/utils/fetch-component.js +0 -75
  269. package/utils/fetch-component.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { access, readFile } from 'node:fs/promises';
1
+ import { access, readdir, readFile } from 'node:fs/promises';
2
2
  import * as path from 'path';
3
3
  import { z } from 'zod';
4
4
  async function pathExists(filePath) {
@@ -17,27 +17,216 @@ async function readJson(filePath) {
17
17
  const packageJsonSchema = z.object({
18
18
  name: z.string(),
19
19
  version: z.string().optional(),
20
- dependencies: z.record(z.string()).optional(),
21
- devDependencies: z.record(z.string()).optional(),
20
+ dependencies: z.record(z.string(), z.string()).optional(),
21
+ devDependencies: z.record(z.string(), z.string()).optional(),
22
22
  });
23
+ async function findPackageJson(startDir) {
24
+ let dir = path.resolve(startDir);
25
+ const root = path.parse(dir).root;
26
+ while (dir !== root) {
27
+ const candidate = path.join(dir, 'package.json');
28
+ if (await pathExists(candidate)) {
29
+ return candidate;
30
+ }
31
+ dir = path.dirname(dir);
32
+ }
33
+ return null;
34
+ }
35
+ /** Normalizes separators to the form the configuration files use. */
36
+ function toPosix(value) {
37
+ return value.split(path.sep).join('/');
38
+ }
39
+ /**
40
+ * What the build target says about the project.
41
+ *
42
+ * `angular.json` calls it `architect`/`builder` and Nx calls it
43
+ * `targets`/`executor`, but the option shape is the same — so one read serves both.
44
+ */
45
+ function readBuildTarget(targets) {
46
+ const build = targets?.build ?? {};
47
+ const options = build.options ?? {};
48
+ const index = options.index;
49
+ return {
50
+ tool: String(build.builder ?? build.executor ?? ''),
51
+ styles: Array.isArray(options.styles) ? options.styles.filter((style) => typeof style === 'string') : [],
52
+ index: typeof index === 'string' ? index : typeof index?.input === 'string' ? index.input : null,
53
+ };
54
+ }
55
+ /** Analog replaces Angular's builder with its own; that is how it announces itself. */
56
+ function flavorOf(tool) {
57
+ return tool.startsWith('@analogjs/') ? 'analog' : 'angular';
58
+ }
59
+ /**
60
+ * Reads the projects out of `angular.json`.
61
+ *
62
+ * It is what tells an application from a library — package.json does not say. A
63
+ * workspace with no `angular.json` (or an unreadable one) returns an empty list,
64
+ * and the caller decides what to do with that.
65
+ */
66
+ async function readAngularProjects(workspaceRoot) {
67
+ try {
68
+ const workspace = await readJson(path.join(workspaceRoot, 'angular.json'));
69
+ return Object.entries(workspace.projects ?? {}).map(([name, project]) => {
70
+ const config = project;
71
+ const root = config.root === '.' ? '' : (config.root ?? '');
72
+ const build = readBuildTarget(config.architect);
73
+ return {
74
+ name,
75
+ projectType: config.projectType === 'library' ? 'library' : 'application',
76
+ root,
77
+ sourceRoot: config.sourceRoot ?? (root ? `${root}/src` : 'src'),
78
+ flavor: flavorOf(build.tool),
79
+ styles: build.styles,
80
+ index: build.index,
81
+ };
82
+ });
83
+ }
84
+ catch {
85
+ return [];
86
+ }
87
+ }
88
+ /**
89
+ * Where to look for `project.json`.
90
+ *
91
+ * Nx does not mandate a layout, but it generates into `apps/` and `libs/` (or
92
+ * wherever `workspaceLayout` says), and package monorepos use `packages/`.
93
+ * Looking only in those places avoids scanning the whole repository for config.
94
+ */
95
+ async function nxSearchRoots(workspaceRoot) {
96
+ try {
97
+ const nxConfig = await readJson(path.join(workspaceRoot, 'nx.json'));
98
+ const layout = nxConfig.workspaceLayout ?? {};
99
+ return [...new Set([layout.appsDir ?? 'apps', layout.libsDir ?? 'libs', 'packages'])];
100
+ }
101
+ catch {
102
+ return ['apps', 'libs', 'packages'];
103
+ }
104
+ }
105
+ /**
106
+ * Directories holding a `project.json`, up to two levels below the search root.
107
+ *
108
+ * A project does not contain another, so finding the config ends the descent —
109
+ * which also keeps a project's `node_modules` from becoming a second project.
110
+ */
111
+ async function findProjectDirs(baseDir, depth) {
112
+ if (await pathExists(path.join(baseDir, 'project.json'))) {
113
+ return [baseDir];
114
+ }
115
+ if (depth === 0)
116
+ return [];
117
+ let entries;
118
+ try {
119
+ entries = await readdir(baseDir, { withFileTypes: true });
120
+ }
121
+ catch {
122
+ return [];
123
+ }
124
+ const found = await Promise.all(entries
125
+ .filter(entry => entry.isDirectory() && entry.name !== 'node_modules' && !entry.name.startsWith('.'))
126
+ .map(entry => findProjectDirs(path.join(baseDir, entry.name), depth - 1)));
127
+ return found.flat();
128
+ }
129
+ /**
130
+ * Reads the projects of an Nx workspace.
131
+ *
132
+ * Nx has no `angular.json`: each project describes itself in its own
133
+ * `project.json`, and the project root is the directory that file sits in.
134
+ */
135
+ async function readNxProjects(workspaceRoot) {
136
+ const searchRoots = await nxSearchRoots(workspaceRoot);
137
+ const dirs = (await Promise.all(searchRoots.map(dir => findProjectDirs(path.join(workspaceRoot, dir), 2)))).flat();
138
+ const projects = await Promise.all(dirs.map(async (dir) => {
139
+ try {
140
+ const config = await readJson(path.join(dir, 'project.json'));
141
+ const root = toPosix(path.relative(workspaceRoot, dir));
142
+ const name = config.name ?? path.basename(dir);
143
+ if (await isE2eProject(dir, name))
144
+ return null;
145
+ const build = readBuildTarget(config.targets);
146
+ return {
147
+ name,
148
+ projectType: nxProjectType(config),
149
+ root,
150
+ sourceRoot: config.sourceRoot ?? `${root}/src`,
151
+ flavor: flavorOf(build.tool),
152
+ styles: build.styles,
153
+ index: build.index,
154
+ };
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ }));
160
+ // Filesystem order is arbitrary; sorting gives the menu a list that is stable
161
+ // between runs.
162
+ return projects
163
+ .filter((project) => project !== null)
164
+ .sort((a, b) => a.root.localeCompare(b.root));
165
+ }
166
+ /**
167
+ * Application or library, when `project.json` does not say.
168
+ *
169
+ * A `serve` target only exists for something that is served; no library has one.
170
+ * That is the distinction left when the explicit field is missing.
171
+ */
172
+ function nxProjectType(config) {
173
+ if (config.projectType === 'library' || config.projectType === 'application') {
174
+ return config.projectType;
175
+ }
176
+ return config.targets?.serve ? 'application' : 'library';
177
+ }
178
+ /** Configuration files that only exist in an end-to-end test project. */
179
+ const E2E_CONFIGS = ['playwright.config.ts', 'playwright.config.js', 'cypress.config.ts', 'cypress.config.js'];
180
+ /**
181
+ * Whether the project exists only to run end-to-end tests.
182
+ *
183
+ * The Nx generator creates `<app>-e2e` declaring `projectType: "application"`,
184
+ * and with that it showed up in the list of apps that can receive components —
185
+ * but there is no `app.config.ts`, no global CSS and no build to configure in
186
+ * there. The suffix is Nx's convention; the runner's config file confirms the
187
+ * cases where the project was renamed.
188
+ */
189
+ async function isE2eProject(projectDir, name) {
190
+ if (name.endsWith('-e2e') || name.endsWith('-e2e-ct'))
191
+ return true;
192
+ const configs = await Promise.all(E2E_CONFIGS.map(file => pathExists(path.join(projectDir, file))));
193
+ return configs.some(Boolean);
194
+ }
23
195
  export async function getProjectInfo(cwd) {
24
- const packageJsonPath = path.join(cwd, 'package.json');
25
- if (!(await pathExists(packageJsonPath))) {
196
+ const packageJsonPath = await findPackageJson(cwd);
197
+ if (!packageJsonPath) {
26
198
  throw new Error('No package.json found. Please run this command in your project root.');
27
199
  }
200
+ const workspaceRoot = path.dirname(packageJsonPath);
28
201
  const packageJson = packageJsonSchema.parse(await readJson(packageJsonPath));
29
202
  const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
30
203
  const hasAngular = !!deps['@angular/core'];
31
204
  const hasTypeScript = !!deps['typescript'];
32
205
  const hasTailwind = !!deps['tailwindcss'];
33
206
  const hasNx = !!deps['nx'] || !!deps['@nx/workspace'];
34
- const angularVersion = deps['@angular/core']?.replace(/[^0-9.]/g, '') || null;
207
+ const hasAnalog = !!deps['@analogjs/platform'] || !!deps['@analogjs/router'] || !!deps['@analogjs/vite-plugin-angular'];
208
+ // An Nx workspace can have both files; `angular.json` only describes projects
209
+ // that existed before the migration, so Nx has the final word.
210
+ const projects = hasNx ? await readNxProjects(workspaceRoot) : await readAngularProjects(workspaceRoot);
211
+ const angularVersionRaw = deps['@angular/core'] || null;
212
+ const angularVersion = angularVersionRaw?.replace(/[^0-9.]/g, '') || null;
213
+ // Nx keeps the paths in a tsconfig.base.json the projects extend; writing into
214
+ // the root tsconfig.json would reach none of them.
215
+ const tsconfigFile = (await pathExists(path.join(workspaceRoot, 'tsconfig.base.json')))
216
+ ? 'tsconfig.base.json'
217
+ : 'tsconfig.json';
35
218
  return {
36
219
  framework: hasAngular ? 'angular' : 'unknown',
220
+ root: workspaceRoot,
221
+ workspace: hasNx ? 'nx' : 'angular',
37
222
  hasTypeScript,
38
223
  hasTailwind,
39
224
  hasNx,
225
+ hasAnalog,
226
+ tsconfigFile,
40
227
  angularVersion,
228
+ angularVersionRaw,
229
+ projects,
41
230
  };
42
231
  }
43
232
  //# sourceMappingURL=get-project-info.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-project-info.js","sourceRoot":"","sources":["../../src/utils/get-project-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAgB;IACtC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC7C,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACjD,CAAC,CAAC;AAUH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAEvD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,EAAE,GAAG,WAAW,CAAC,YAAY,EAAE,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;IAE7E,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAEtD,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;IAE9E,OAAO;QACL,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC7C,aAAa;QACb,WAAW;QACX,KAAK;QACL,cAAc;KACf,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"get-project-info.js","sourceRoot":"","sources":["../../src/utils/get-project-info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface FetchOptions {
2
+ timeout?: number;
3
+ retries?: number;
4
+ backoffBase?: number;
5
+ headers?: Record<string, string>;
6
+ }
7
+ export declare function fetchJson<T>(url: string, options?: FetchOptions): Promise<T>;
8
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAsBD,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAoElF"}
@@ -0,0 +1,83 @@
1
+ import { NetworkError } from '../utils/errors.js';
2
+ import { logger } from '../utils/logger.js';
3
+ const DEFAULT_TIMEOUT = 30_000;
4
+ const DEFAULT_RETRIES = 3;
5
+ const DEFAULT_BACKOFF_BASE = 1_000;
6
+ function sleep(ms) {
7
+ return new Promise(resolve => setTimeout(resolve, ms));
8
+ }
9
+ /**
10
+ * Whether a body is a web page rather than a payload.
11
+ *
12
+ * A server that answers a registry URL with its own site sends an HTML document,
13
+ * and a document always opens with one of these — so the test is on how the body
14
+ * starts, never on what it happens to contain.
15
+ */
16
+ function looksLikeHtml(text) {
17
+ const start = text.trimStart().slice(0, 100).toLowerCase();
18
+ return start.startsWith('<!doctype') || start.startsWith('<html');
19
+ }
20
+ export async function fetchJson(url, options) {
21
+ const { timeout = DEFAULT_TIMEOUT, retries = DEFAULT_RETRIES, backoffBase = DEFAULT_BACKOFF_BASE } = options ?? {};
22
+ const headers = {
23
+ 'User-Agent': 'zard-cli',
24
+ Accept: 'application/json',
25
+ ...options?.headers,
26
+ };
27
+ for (let attempt = 1; attempt <= retries; attempt++) {
28
+ try {
29
+ const response = await fetch(url, {
30
+ signal: AbortSignal.timeout(timeout),
31
+ headers,
32
+ });
33
+ if (response.status === 429) {
34
+ const retryAfter = parseInt(response.headers.get('Retry-After') ?? '5', 10);
35
+ logger.debug(`Rate limited by ${url}, retrying in ${retryAfter}s...`);
36
+ await sleep(retryAfter * 1000);
37
+ continue;
38
+ }
39
+ if (!response.ok) {
40
+ throw new NetworkError(`HTTP ${response.status}: ${response.statusText}`, url);
41
+ }
42
+ const text = await response.text();
43
+ if (!text) {
44
+ throw new NetworkError('Empty response from registry', url);
45
+ }
46
+ try {
47
+ return JSON.parse(text);
48
+ }
49
+ catch {
50
+ // The HTML check runs only once the parse has already failed. Looking for
51
+ // the markers anywhere in the body rejected any valid payload that merely
52
+ // mentioned them — a code comment containing `<html>` was enough to make a
53
+ // component permanently uninstallable.
54
+ throw new NetworkError(looksLikeHtml(text) ? 'Received HTML instead of JSON from registry' : 'Invalid JSON response from registry', url);
55
+ }
56
+ }
57
+ catch (error) {
58
+ if (error instanceof NetworkError) {
59
+ if (attempt === retries)
60
+ throw error;
61
+ }
62
+ else if (error instanceof DOMException && error.name === 'TimeoutError') {
63
+ if (attempt === retries) {
64
+ throw new NetworkError(`Request timed out after ${timeout}ms`, url);
65
+ }
66
+ }
67
+ else if (error instanceof TypeError) {
68
+ // fetch throws TypeError for DNS failures, connection refused, etc.
69
+ if (attempt === retries) {
70
+ throw new NetworkError(`Connection failed: ${error.message}`, url);
71
+ }
72
+ }
73
+ else {
74
+ throw error;
75
+ }
76
+ const delay = backoffBase * Math.pow(2, attempt - 1);
77
+ logger.debug(`Attempt ${attempt}/${retries} failed for ${url}, retrying in ${delay}ms...`);
78
+ await sleep(delay);
79
+ }
80
+ }
81
+ throw new NetworkError(`Failed after ${retries} attempts`, url);
82
+ }
83
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The icon catalog in use, fetched from the registry.
3
+ *
4
+ * The CLI carries a copy of the table, but the registry is what counts: that is
5
+ * how a new family reaches someone who already has the CLI installed, without
6
+ * waiting for a release of it. The local copy is the floor — it applies offline,
7
+ * against an old registry that does not publish the file, and on any network
8
+ * failure.
9
+ *
10
+ * It is loaded once per command and read synchronously after that. The
11
+ * alternative would be threading the catalog through the action's parameters
12
+ * down to the file installer, four layers below, with none of them having
13
+ * anything to decide about it.
14
+ */
15
+ import { type IconCatalog, type IconFamily } from '../core/icons/index.js';
16
+ /** O que `<registry>/icons.json` publica. */
17
+ export interface IconCatalogDocument extends IconCatalog {
18
+ $schema?: string;
19
+ schemaVersion?: number;
20
+ }
21
+ /** The loaded catalog, or the local copy while nobody has loaded one. */
22
+ export declare function iconCatalog(): IconCatalog;
23
+ /** Returns to the initial state. Exists so tests do not leak into one another. */
24
+ export declare function resetIconCatalog(): void;
25
+ export declare function loadIconCatalog(registryUrl: string): Promise<IconCatalog>;
26
+ /**
27
+ * Rejects a family the catalog does not know, naming the ones that exist.
28
+ *
29
+ * "Invalid configuration file: components.json" was all an `"icons": "materia"`
30
+ * produced — no field named, no accepted values, and the whole file under
31
+ * suspicion.
32
+ */
33
+ export declare function assertIconFamily(family: IconFamily, catalog?: IconCatalog): void;
34
+ //# sourceMappingURL=icon-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-catalog.d.ts","sourceRoot":"","sources":["../../src/utils/icon-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAsB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAMjG,6CAA6C;AAC7C,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,yEAAyE;AACzE,wBAAgB,WAAW,IAAI,WAAW,CAEzC;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAqB/E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,WAA2B,GAAG,IAAI,CAO/F"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The icon catalog in use, fetched from the registry.
3
+ *
4
+ * The CLI carries a copy of the table, but the registry is what counts: that is
5
+ * how a new family reaches someone who already has the CLI installed, without
6
+ * waiting for a release of it. The local copy is the floor — it applies offline,
7
+ * against an old registry that does not publish the file, and on any network
8
+ * failure.
9
+ *
10
+ * It is loaded once per command and read synchronously after that. The
11
+ * alternative would be threading the catalog through the action's parameters
12
+ * down to the file installer, four layers below, with none of them having
13
+ * anything to decide about it.
14
+ */
15
+ import { LOCAL_ICON_CATALOG } from '../core/icons/index.js';
16
+ import { CliError, SchemaVersionError } from '../utils/errors.js';
17
+ import { fetchJson } from '../utils/http-client.js';
18
+ import { logger } from '../utils/logger.js';
19
+ import { assertSupportedSchema } from '../utils/schema-version.js';
20
+ let current = LOCAL_ICON_CATALOG;
21
+ /** The loaded catalog, or the local copy while nobody has loaded one. */
22
+ export function iconCatalog() {
23
+ return current;
24
+ }
25
+ /** Returns to the initial state. Exists so tests do not leak into one another. */
26
+ export function resetIconCatalog() {
27
+ current = LOCAL_ICON_CATALOG;
28
+ }
29
+ export async function loadIconCatalog(registryUrl) {
30
+ try {
31
+ const document = await fetchJson(`${registryUrl}/icons.json`);
32
+ assertSupportedSchema(document.schemaVersion, 'icons.json');
33
+ if (!document.families || !document.icons)
34
+ throw new Error('missing families or icons');
35
+ current = { families: document.families, icons: document.icons };
36
+ logger.debug(`Icon catalog loaded: ${Object.keys(current.families).join(', ')}`);
37
+ }
38
+ catch (error) {
39
+ // Only a format incompatibility stops us. Everything else — a 404, the SPA's
40
+ // HTML instead of JSON, a timeout, broken JSON — is a registry without the
41
+ // catalog, which is the state of all of them until the first deploy with the
42
+ // file. Treating that as a failure would take `add` down worldwide over a
43
+ // file that only matters to someone who switched family.
44
+ if (error instanceof SchemaVersionError)
45
+ throw error;
46
+ logger.debug(`Falling back to the bundled icon catalog: ${error instanceof Error ? error.message : error}`);
47
+ current = LOCAL_ICON_CATALOG;
48
+ }
49
+ return current;
50
+ }
51
+ /**
52
+ * Rejects a family the catalog does not know, naming the ones that exist.
53
+ *
54
+ * "Invalid configuration file: components.json" was all an `"icons": "materia"`
55
+ * produced — no field named, no accepted values, and the whole file under
56
+ * suspicion.
57
+ */
58
+ export function assertIconFamily(family, catalog = iconCatalog()) {
59
+ if (Object.prototype.hasOwnProperty.call(catalog.families, family))
60
+ return;
61
+ throw new CliError(`Unknown icon set "${family}" in components.json. Available: ${Object.keys(catalog.families).sort().join(', ')}.`, 'UNKNOWN_ICON_FAMILY');
62
+ }
63
+ //# sourceMappingURL=icon-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-catalog.js","sourceRoot":"","sources":["../../src/utils/icon-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAqC,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAQrE,IAAI,OAAO,GAAgB,kBAAkB,CAAC;AAE9C,yEAAyE;AACzE,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,GAAG,kBAAkB,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAsB,GAAG,WAAW,aAAa,CAAC,CAAC;QACnF,qBAAqB,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAExF,OAAO,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6EAA6E;QAC7E,2EAA2E;QAC3E,6EAA6E;QAC7E,0EAA0E;QAC1E,yDAAyD;QACzD,IAAI,KAAK,YAAY,kBAAkB;YAAE,MAAM,KAAK,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,6CAA6C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5G,OAAO,GAAG,kBAAkB,CAAC;IAC/B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB,EAAE,UAAuB,WAAW,EAAE;IACvF,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAE,OAAO;IAE3E,MAAM,IAAI,QAAQ,CAChB,qBAAqB,MAAM,oCAAoC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACjH,qBAAqB,CACtB,CAAC;AACJ,CAAC"}
package/utils/logger.d.ts CHANGED
@@ -1,9 +1,24 @@
1
+ export declare function enableDebug(): void;
2
+ export declare function isDebugEnabled(): boolean;
1
3
  export declare const logger: {
2
4
  error(...args: unknown[]): void;
3
5
  warn(...args: unknown[]): void;
4
6
  info(...args: unknown[]): void;
5
7
  success(...args: unknown[]): void;
8
+ debug(...args: unknown[]): void;
6
9
  break(): void;
7
10
  };
8
- export declare function spinner(text: string): import("ora").Ora;
11
+ export interface Spinner {
12
+ text: string;
13
+ start(): Spinner;
14
+ stop(): Spinner;
15
+ succeed(text?: string): Spinner;
16
+ fail(text?: string): Spinner;
17
+ }
18
+ /**
19
+ * Progress indicator for the paths that run outside the interactive screen
20
+ * (headless, --yes, CI). Inside a wizard the engine does the animating, and here
21
+ * the transitions become nothing but records in the sink.
22
+ */
23
+ export declare function spinner(text: string): Spinner;
9
24
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM;mBACF,OAAO,EAAE;kBAGV,OAAO,EAAE;kBAGT,OAAO,EAAE;qBAGN,OAAO,EAAE;;CAM3B,CAAC;AAEF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,qBAMnC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAwBD,eAAO,MAAM,MAAM;mBACF,OAAO,EAAE;kBAGV,OAAO,EAAE;kBAGT,OAAO,EAAE;qBAGN,OAAO,EAAE;mBAGX,OAAO,EAAE;;CAQzB,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,IAAI,OAAO,CAAC;IACjB,IAAI,IAAI,OAAO,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAKD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAuD7C"}
package/utils/logger.js CHANGED
@@ -1,27 +1,119 @@
1
- import chalk from 'chalk';
2
- import ora from 'ora';
1
+ import { capture, isCapturing } from '../ui/log-sink.js';
2
+ import { formatRecord, writeLine } from '../ui/output.js';
3
+ import { style } from '../ui/style.js';
4
+ let debugEnabled = false;
5
+ export function enableDebug() {
6
+ debugEnabled = true;
7
+ }
8
+ export function isDebugEnabled() {
9
+ return debugEnabled;
10
+ }
11
+ function toMessage(args) {
12
+ return args
13
+ .map(arg => {
14
+ if (typeof arg === 'string')
15
+ return arg;
16
+ if (arg instanceof Error)
17
+ return arg.message;
18
+ return String(arg);
19
+ })
20
+ .join(' ');
21
+ }
22
+ /**
23
+ * Writes a message — or holds it, while the interactive screen is mounted.
24
+ *
25
+ * Without that diversion, a `logger.warn` fired mid-install would write over the
26
+ * frame the engine just painted.
27
+ */
28
+ function emit(level, args) {
29
+ const message = toMessage(args);
30
+ if (capture(level, message))
31
+ return;
32
+ writeLine(formatRecord({ level, message }));
33
+ }
3
34
  export const logger = {
4
35
  error(...args) {
5
- console.log(chalk.red(...args));
36
+ emit('error', args);
6
37
  },
7
38
  warn(...args) {
8
- console.log(chalk.yellow(...args));
39
+ emit('warn', args);
9
40
  },
10
41
  info(...args) {
11
- console.log(chalk.cyan(...args));
42
+ emit('info', args);
12
43
  },
13
44
  success(...args) {
14
- console.log(chalk.green(...args));
45
+ emit('success', args);
46
+ },
47
+ debug(...args) {
48
+ if (!debugEnabled)
49
+ return;
50
+ emit('debug', args);
15
51
  },
16
52
  break() {
17
- console.log('');
53
+ if (isCapturing())
54
+ return;
55
+ writeLine();
18
56
  },
19
57
  };
58
+ const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
59
+ const FRAME_MS = 80;
60
+ /**
61
+ * Progress indicator for the paths that run outside the interactive screen
62
+ * (headless, --yes, CI). Inside a wizard the engine does the animating, and here
63
+ * the transitions become nothing but records in the sink.
64
+ */
20
65
  export function spinner(text) {
21
- return ora({
22
- text: chalk.dim(text),
23
- spinner: 'dots',
24
- color: 'cyan',
25
- });
66
+ const animated = Boolean(process.stdout.isTTY) && !isCapturing();
67
+ let timer;
68
+ let frame = 0;
69
+ const clearLine = () => {
70
+ if (animated)
71
+ process.stdout.write('\r\x1b[2K');
72
+ };
73
+ const paint = () => {
74
+ // Capture can start after the spinner was already running; in that case the
75
+ // screen owns the terminal and nothing else may write to it directly.
76
+ if (isCapturing())
77
+ return;
78
+ clearLine();
79
+ process.stdout.write(`${style.primary(FRAMES[frame] ?? FRAMES[0] ?? '')} ${style.dim(instance.text)}`);
80
+ frame = (frame + 1) % FRAMES.length;
81
+ };
82
+ const finish = (level, message) => {
83
+ instance.stop();
84
+ emit(level, [message ?? instance.text]);
85
+ return instance;
86
+ };
87
+ const instance = {
88
+ text,
89
+ start() {
90
+ if (!animated) {
91
+ emit('info', [instance.text]);
92
+ return instance;
93
+ }
94
+ if (timer)
95
+ return instance;
96
+ paint();
97
+ timer = setInterval(paint, FRAME_MS);
98
+ // An active spinner must not keep the process alive on its own.
99
+ timer.unref?.();
100
+ return instance;
101
+ },
102
+ stop() {
103
+ if (timer) {
104
+ clearInterval(timer);
105
+ timer = undefined;
106
+ clearLine();
107
+ }
108
+ return instance;
109
+ },
110
+ succeed(message) {
111
+ return finish('success', message);
112
+ },
113
+ fail(message) {
114
+ return finish('error', message);
115
+ },
116
+ };
117
+ return instance;
26
118
  }
27
119
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,CAAC,GAAG,IAAe;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,GAAG,IAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,CAAC,GAAG,IAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,GAAG,IAAe;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,KAAK;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,GAAG,CAAC;QACT,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACrB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}