zard-cli 1.0.0-beta.11 → 1.0.0-beta.110

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 (257) 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 +3 -2
  15. package/commands/add/dependency-resolver.d.ts.map +1 -1
  16. package/commands/add/dependency-resolver.js +23 -9
  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 +137 -85
  20. package/commands/add/index.js.map +1 -1
  21. package/commands/add/wizard.d.ts +31 -0
  22. package/commands/add/wizard.d.ts.map +1 -0
  23. package/commands/add/wizard.js +289 -0
  24. package/commands/add/wizard.js.map +1 -0
  25. package/commands/init/config-prompter.d.ts +61 -56
  26. package/commands/init/config-prompter.d.ts.map +1 -1
  27. package/commands/init/config-prompter.js +84 -74
  28. package/commands/init/config-prompter.js.map +1 -1
  29. package/commands/init/dependencies.d.ts +1 -8
  30. package/commands/init/dependencies.d.ts.map +1 -1
  31. package/commands/init/dependencies.js +47 -16
  32. package/commands/init/dependencies.js.map +1 -1
  33. package/commands/init/index.d.ts.map +1 -1
  34. package/commands/init/index.js +150 -86
  35. package/commands/init/index.js.map +1 -1
  36. package/commands/init/project-kind.d.ts +82 -0
  37. package/commands/init/project-kind.d.ts.map +1 -0
  38. package/commands/init/project-kind.js +166 -0
  39. package/commands/init/project-kind.js.map +1 -0
  40. package/commands/init/steps.d.ts +16 -0
  41. package/commands/init/steps.d.ts.map +1 -0
  42. package/commands/init/steps.js +153 -0
  43. package/commands/init/steps.js.map +1 -0
  44. package/commands/init/tailwind-setup.d.ts +9 -2
  45. package/commands/init/tailwind-setup.d.ts.map +1 -1
  46. package/commands/init/tailwind-setup.js +33 -9
  47. package/commands/init/tailwind-setup.js.map +1 -1
  48. package/commands/init/theme-loader.d.ts.map +1 -1
  49. package/commands/init/theme-loader.js +1 -3
  50. package/commands/init/theme-loader.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 -47
  57. package/commands/init/update-angular-config.js.map +1 -1
  58. package/commands/init/vite-setup.d.ts +10 -0
  59. package/commands/init/vite-setup.d.ts.map +1 -0
  60. package/commands/init/vite-setup.js +60 -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/core/icons/families.d.ts +38 -0
  67. package/core/icons/families.d.ts.map +1 -0
  68. package/core/icons/families.js +26 -0
  69. package/core/icons/families.js.map +1 -0
  70. package/core/icons/icon-map.d.ts +24 -0
  71. package/core/icons/icon-map.d.ts.map +1 -0
  72. package/core/icons/icon-map.js +130 -0
  73. package/core/icons/icon-map.js.map +1 -0
  74. package/core/icons/index.d.ts +107 -0
  75. package/core/icons/index.d.ts.map +1 -0
  76. package/core/icons/index.js +183 -0
  77. package/core/icons/index.js.map +1 -0
  78. package/core/registry/registry-data.d.ts.map +1 -1
  79. package/core/registry/registry-data.js +571 -84
  80. package/core/registry/registry-data.js.map +1 -1
  81. package/core/themes/theme-definitions.d.ts +5 -5
  82. package/core/themes/theme-definitions.d.ts.map +1 -1
  83. package/core/themes/theme-definitions.js +65 -61
  84. package/core/themes/theme-definitions.js.map +1 -1
  85. package/index.js +40 -4
  86. package/index.js.map +1 -1
  87. package/package.json +4 -7
  88. package/ui/blocks.d.ts +70 -0
  89. package/ui/blocks.d.ts.map +1 -0
  90. package/ui/blocks.js +116 -0
  91. package/ui/blocks.js.map +1 -0
  92. package/ui/brand.d.ts +14 -0
  93. package/ui/brand.d.ts.map +1 -0
  94. package/ui/brand.js +35 -0
  95. package/ui/brand.js.map +1 -0
  96. package/ui/engine/animation/index.d.ts +39 -0
  97. package/ui/engine/animation/index.d.ts.map +1 -0
  98. package/ui/engine/animation/index.js +103 -0
  99. package/ui/engine/animation/index.js.map +1 -0
  100. package/ui/engine/ansi/index.d.ts +52 -0
  101. package/ui/engine/ansi/index.d.ts.map +1 -0
  102. package/ui/engine/ansi/index.js +117 -0
  103. package/ui/engine/ansi/index.js.map +1 -0
  104. package/ui/engine/components/index.d.ts +211 -0
  105. package/ui/engine/components/index.d.ts.map +1 -0
  106. package/ui/engine/components/index.js +109 -0
  107. package/ui/engine/components/index.js.map +1 -0
  108. package/ui/engine/cursor/index.d.ts +17 -0
  109. package/ui/engine/cursor/index.d.ts.map +1 -0
  110. package/ui/engine/cursor/index.js +41 -0
  111. package/ui/engine/cursor/index.js.map +1 -0
  112. package/ui/engine/diff/index.d.ts +27 -0
  113. package/ui/engine/diff/index.d.ts.map +1 -0
  114. package/ui/engine/diff/index.js +57 -0
  115. package/ui/engine/diff/index.js.map +1 -0
  116. package/ui/engine/events/index.d.ts +24 -0
  117. package/ui/engine/events/index.d.ts.map +1 -0
  118. package/ui/engine/events/index.js +60 -0
  119. package/ui/engine/events/index.js.map +1 -0
  120. package/ui/engine/focus/index.d.ts +25 -0
  121. package/ui/engine/focus/index.d.ts.map +1 -0
  122. package/ui/engine/focus/index.js +77 -0
  123. package/ui/engine/focus/index.js.map +1 -0
  124. package/ui/engine/frame/index.d.ts +48 -0
  125. package/ui/engine/frame/index.d.ts.map +1 -0
  126. package/ui/engine/frame/index.js +0 -0
  127. package/ui/engine/frame/index.js.map +1 -0
  128. package/ui/engine/index.d.ts +28 -0
  129. package/ui/engine/index.d.ts.map +1 -0
  130. package/ui/engine/index.js +28 -0
  131. package/ui/engine/index.js.map +1 -0
  132. package/ui/engine/input/index.d.ts +36 -0
  133. package/ui/engine/input/index.d.ts.map +1 -0
  134. package/ui/engine/input/index.js +224 -0
  135. package/ui/engine/input/index.js.map +1 -0
  136. package/ui/engine/layout/index.d.ts +42 -0
  137. package/ui/engine/layout/index.d.ts.map +1 -0
  138. package/ui/engine/layout/index.js +241 -0
  139. package/ui/engine/layout/index.js.map +1 -0
  140. package/ui/engine/renderer/index.d.ts +43 -0
  141. package/ui/engine/renderer/index.d.ts.map +1 -0
  142. package/ui/engine/renderer/index.js +619 -0
  143. package/ui/engine/renderer/index.js.map +1 -0
  144. package/ui/engine/scheduler/index.d.ts +22 -0
  145. package/ui/engine/scheduler/index.d.ts.map +1 -0
  146. package/ui/engine/scheduler/index.js +77 -0
  147. package/ui/engine/scheduler/index.js.map +1 -0
  148. package/ui/engine/screen/index.d.ts +39 -0
  149. package/ui/engine/screen/index.d.ts.map +1 -0
  150. package/ui/engine/screen/index.js +255 -0
  151. package/ui/engine/screen/index.js.map +1 -0
  152. package/ui/engine/terminal/index.d.ts +84 -0
  153. package/ui/engine/terminal/index.d.ts.map +1 -0
  154. package/ui/engine/terminal/index.js +235 -0
  155. package/ui/engine/terminal/index.js.map +1 -0
  156. package/ui/engine/testing/index.d.ts +27 -0
  157. package/ui/engine/testing/index.d.ts.map +1 -0
  158. package/ui/engine/testing/index.js +63 -0
  159. package/ui/engine/testing/index.js.map +1 -0
  160. package/ui/engine/theme/index.d.ts +27 -0
  161. package/ui/engine/theme/index.d.ts.map +1 -0
  162. package/ui/engine/theme/index.js +129 -0
  163. package/ui/engine/theme/index.js.map +1 -0
  164. package/ui/engine/utils/index.d.ts +12 -0
  165. package/ui/engine/utils/index.d.ts.map +1 -0
  166. package/ui/engine/utils/index.js +143 -0
  167. package/ui/engine/utils/index.js.map +1 -0
  168. package/ui/gate.d.ts +19 -0
  169. package/ui/gate.d.ts.map +1 -0
  170. package/ui/gate.js +36 -0
  171. package/ui/gate.js.map +1 -0
  172. package/ui/index.d.ts +18 -0
  173. package/ui/index.d.ts.map +1 -0
  174. package/ui/index.js +18 -0
  175. package/ui/index.js.map +1 -0
  176. package/ui/log-sink.d.ts +24 -0
  177. package/ui/log-sink.d.ts.map +1 -0
  178. package/ui/log-sink.js +35 -0
  179. package/ui/log-sink.js.map +1 -0
  180. package/ui/output.d.ts +14 -0
  181. package/ui/output.d.ts.map +1 -0
  182. package/ui/output.js +28 -0
  183. package/ui/output.js.map +1 -0
  184. package/ui/report.d.ts +30 -0
  185. package/ui/report.d.ts.map +1 -0
  186. package/ui/report.js +45 -0
  187. package/ui/report.js.map +1 -0
  188. package/ui/runner.d.ts +66 -0
  189. package/ui/runner.d.ts.map +1 -0
  190. package/ui/runner.js +135 -0
  191. package/ui/runner.js.map +1 -0
  192. package/ui/style.d.ts +24 -0
  193. package/ui/style.d.ts.map +1 -0
  194. package/ui/style.js +44 -0
  195. package/ui/style.js.map +1 -0
  196. package/ui/testing/fake-tty.d.ts +26 -0
  197. package/ui/testing/fake-tty.d.ts.map +1 -0
  198. package/ui/testing/fake-tty.js +61 -0
  199. package/ui/testing/fake-tty.js.map +1 -0
  200. package/ui/text-input.d.ts +30 -0
  201. package/ui/text-input.d.ts.map +1 -0
  202. package/ui/text-input.js +87 -0
  203. package/ui/text-input.js.map +1 -0
  204. package/ui/theme.d.ts +10 -0
  205. package/ui/theme.d.ts.map +1 -0
  206. package/ui/theme.js +20 -0
  207. package/ui/theme.js.map +1 -0
  208. package/utils/config.d.ts +52 -69
  209. package/utils/config.d.ts.map +1 -1
  210. package/utils/config.js +58 -7
  211. package/utils/config.js.map +1 -1
  212. package/utils/errors.d.ts +27 -0
  213. package/utils/errors.d.ts.map +1 -0
  214. package/utils/errors.js +45 -0
  215. package/utils/errors.js.map +1 -0
  216. package/utils/get-package-info.js +4 -4
  217. package/utils/get-package-info.js.map +1 -1
  218. package/utils/get-project-info.d.ts +30 -0
  219. package/utils/get-project-info.d.ts.map +1 -1
  220. package/utils/get-project-info.js +195 -6
  221. package/utils/get-project-info.js.map +1 -1
  222. package/utils/http-client.d.ts +8 -0
  223. package/utils/http-client.d.ts.map +1 -0
  224. package/utils/http-client.js +68 -0
  225. package/utils/http-client.js.map +1 -0
  226. package/utils/icon-catalog.d.ts +33 -0
  227. package/utils/icon-catalog.d.ts.map +1 -0
  228. package/utils/icon-catalog.js +62 -0
  229. package/utils/icon-catalog.js.map +1 -0
  230. package/utils/logger.d.ts +16 -1
  231. package/utils/logger.d.ts.map +1 -1
  232. package/utils/logger.js +104 -12
  233. package/utils/logger.js.map +1 -1
  234. package/utils/package-manager.d.ts +44 -1
  235. package/utils/package-manager.d.ts.map +1 -1
  236. package/utils/package-manager.js +210 -14
  237. package/utils/package-manager.js.map +1 -1
  238. package/utils/registry.d.ts +44 -2
  239. package/utils/registry.d.ts.map +1 -1
  240. package/utils/registry.js +82 -27
  241. package/utils/registry.js.map +1 -1
  242. package/utils/schema-version.d.ts +20 -0
  243. package/utils/schema-version.d.ts.map +1 -0
  244. package/utils/schema-version.js +27 -0
  245. package/utils/schema-version.js.map +1 -0
  246. package/utils/source-file.d.ts +40 -0
  247. package/utils/source-file.d.ts.map +1 -0
  248. package/utils/source-file.js +104 -0
  249. package/utils/source-file.js.map +1 -0
  250. package/utils/theme-selector.d.ts +1 -1
  251. package/utils/theme-selector.d.ts.map +1 -1
  252. package/utils/theme-selector.js +6 -6
  253. package/utils/theme-selector.js.map +1 -1
  254. package/utils/fetch-component.d.ts +0 -3
  255. package/utils/fetch-component.d.ts.map +0 -1
  256. package/utils/fetch-component.js +0 -75
  257. package/utils/fetch-component.js.map +0 -1
package/utils/config.js CHANGED
@@ -1,4 +1,5 @@
1
- import { logger } from '../utils/logger.js';
1
+ import { SOURCE_ICON_FAMILY } from '../core/icons/index.js';
2
+ import { ConfigError } from '../utils/errors.js';
2
3
  import { access, readFile } from 'node:fs/promises';
3
4
  import * as path from 'node:path';
4
5
  import { z } from 'zod';
@@ -19,6 +20,21 @@ const configSchema = z.object({
19
20
  $schema: z.string().optional(),
20
21
  appConfigFile: z.string().default('src/app/app.config.ts'),
21
22
  style: z.enum(['css']).default('css'),
23
+ // A família de ícones em que os componentes são gravados. Ausente nos
24
+ // arquivos escritos antes da propriedade — e lucide é o que eles usam.
25
+ //
26
+ // Não é um enum: as famílias válidas são as que o registry publica no momento
27
+ // da execução, e não as que existiam quando esta CLI foi compilada. Fechar a
28
+ // lista aqui faria uma família nova ser recusada por uma CLI velha, que é
29
+ // exatamente o que o catálogo remoto veio evitar. Quem valida o valor é
30
+ // `assertIconFamily`, contra o catálogo, e com uma mensagem que diz quais são.
31
+ icons: z.string().default(SOURCE_ICON_FAMILY),
32
+ // Direção do layout. Ainda não muda o que é instalado: existe para o projeto
33
+ // declarar a intenção, e para quem lê o arquivo saber que o campo é nosso.
34
+ rtl: z.boolean().default(false),
35
+ // Ausente nos components.json escritos antes do menu de tipo de projeto;
36
+ // aplicação Angular é o que eles descrevem.
37
+ projectType: z.enum(['angular', 'angular-library', 'nx', 'nx-library', 'analog']).default('angular'),
22
38
  packageManager: z.enum(['npm', 'yarn', 'pnpm', 'bun']).default('npm'),
23
39
  registryUrl: z.string().optional(),
24
40
  tailwind: z
@@ -26,7 +42,7 @@ const configSchema = z.object({
26
42
  css: z.string().default('src/styles.css'),
27
43
  baseColor: z.string().default('slate'),
28
44
  })
29
- .default({}),
45
+ .default({ css: 'src/styles.css', baseColor: 'slate' }),
30
46
  baseUrl: z.string().default('src/app'),
31
47
  aliases: z
32
48
  .object({
@@ -35,10 +51,18 @@ const configSchema = z.object({
35
51
  core: z.string().default('@/shared/core'),
36
52
  services: z.string().default('@/shared/services'),
37
53
  })
38
- .default({}),
54
+ .default({
55
+ components: '@/shared/components',
56
+ utils: '@/shared/utils',
57
+ core: '@/shared/core',
58
+ services: '@/shared/services',
59
+ }),
39
60
  });
40
61
  export const DEFAULT_CONFIG = {
41
62
  style: 'css',
63
+ icons: SOURCE_ICON_FAMILY,
64
+ rtl: false,
65
+ projectType: 'angular',
42
66
  appConfigFile: 'src/app/app.config.ts',
43
67
  packageManager: 'npm',
44
68
  tailwind: {
@@ -60,15 +84,42 @@ export async function getConfig(cwd) {
60
84
  }
61
85
  try {
62
86
  const configJson = await readJson(configPath);
63
- return configSchema.parse(configJson);
87
+ const config = configSchema.parse(configJson);
88
+ if (config.registryUrl) {
89
+ const { validateRegistryUrl } = await import('../utils/registry.js');
90
+ validateRegistryUrl(config.registryUrl);
91
+ }
92
+ return config;
64
93
  }
65
94
  catch (error) {
66
- logger.error('Invalid configuration file');
67
- throw error;
95
+ if (error instanceof ConfigError)
96
+ throw error;
97
+ throw new ConfigError('Invalid configuration file: components.json');
68
98
  }
69
99
  }
100
+ /**
101
+ * Separa o prefixo do alias do caminho que vem depois dele.
102
+ *
103
+ * `@`, `@app`, `~` — o nome não importa: o prefixo é um apelido para `baseUrl`,
104
+ * e o resto é o caminho dentro do projeto. Tratar só `@/` fazia um alias como
105
+ * `@app/components` escapar da substituição e virar uma pasta literal chamada
106
+ * `@app` na raiz, fora de qualquer coisa que o tsconfig mapeie.
107
+ */
108
+ export function splitAlias(alias) {
109
+ const clean = alias.replace(/\/+$/, '');
110
+ const separator = clean.indexOf('/');
111
+ if (separator === -1)
112
+ return { prefix: clean, rest: '' };
113
+ return { prefix: clean.slice(0, separator), rest: clean.slice(separator + 1) };
114
+ }
115
+ /** O prefixo do alias, com `/*` — a chave que o tsconfig precisa mapear. */
116
+ export function aliasPattern(alias) {
117
+ return `${splitAlias(alias).prefix}/*`;
118
+ }
70
119
  export function resolveAliasToPath(alias, baseUrl) {
71
- return alias.replace(/^@\//, `${baseUrl}/`);
120
+ const { rest } = splitAlias(alias);
121
+ const base = baseUrl.replace(/\/+$/, '');
122
+ return rest ? `${base}/${rest}` : base;
72
123
  }
73
124
  export async function resolveConfigPaths(cwd, config) {
74
125
  const { baseUrl, aliases } = config;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare class CliError extends Error {
2
+ readonly code: string;
3
+ constructor(message: string, code: string);
4
+ }
5
+ export declare class NetworkError extends CliError {
6
+ readonly url: string;
7
+ constructor(message: string, url: string);
8
+ }
9
+ export declare class ConfigError extends CliError {
10
+ constructor(message: string);
11
+ }
12
+ /**
13
+ * O registry publica um formato mais novo do que esta CLI sabe ler.
14
+ *
15
+ * Tem classe própria porque é o único erro de leitura do registry que NÃO pode
16
+ * virar fallback: um arquivo ausente ou uma resposta que não é JSON são motivo
17
+ * para seguir com a cópia local, mas um formato que não entendemos é motivo
18
+ * para parar — continuar seria ler o conteúdo errado achando que está certo.
19
+ */
20
+ export declare class SchemaVersionError extends CliError {
21
+ constructor(message: string);
22
+ }
23
+ export declare class InstallError extends CliError {
24
+ readonly component: string;
25
+ constructor(message: string, component: string);
26
+ }
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;aAGf,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;AAED,qBAAa,YAAa,SAAQ,QAAQ;aAGtB,GAAG,EAAE,MAAM;gBAD3B,OAAO,EAAE,MAAM,EACC,GAAG,EAAE,MAAM;CAK9B;AAED,qBAAa,WAAY,SAAQ,QAAQ;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,YAAa,SAAQ,QAAQ;aAGtB,SAAS,EAAE,MAAM;gBADjC,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,MAAM;CAKpC"}
@@ -0,0 +1,45 @@
1
+ export class CliError extends Error {
2
+ code;
3
+ constructor(message, code) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = 'CliError';
7
+ }
8
+ }
9
+ export class NetworkError extends CliError {
10
+ url;
11
+ constructor(message, url) {
12
+ super(message, 'NETWORK_ERROR');
13
+ this.url = url;
14
+ this.name = 'NetworkError';
15
+ }
16
+ }
17
+ export class ConfigError extends CliError {
18
+ constructor(message) {
19
+ super(message, 'CONFIG_ERROR');
20
+ this.name = 'ConfigError';
21
+ }
22
+ }
23
+ /**
24
+ * O registry publica um formato mais novo do que esta CLI sabe ler.
25
+ *
26
+ * Tem classe própria porque é o único erro de leitura do registry que NÃO pode
27
+ * virar fallback: um arquivo ausente ou uma resposta que não é JSON são motivo
28
+ * para seguir com a cópia local, mas um formato que não entendemos é motivo
29
+ * para parar — continuar seria ler o conteúdo errado achando que está certo.
30
+ */
31
+ export class SchemaVersionError extends CliError {
32
+ constructor(message) {
33
+ super(message, 'UNSUPPORTED_SCHEMA_VERSION');
34
+ this.name = 'SchemaVersionError';
35
+ }
36
+ }
37
+ export class InstallError extends CliError {
38
+ component;
39
+ constructor(message, component) {
40
+ super(message, 'INSTALL_ERROR');
41
+ this.component = component;
42
+ this.name = 'InstallError';
43
+ }
44
+ }
45
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IAFlB,YACE,OAAe,EACC,IAAY;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,SAAI,GAAJ,IAAI,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IAGtB;IAFlB,YACE,OAAe,EACC,GAAW;QAE3B,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAFhB,QAAG,GAAH,GAAG,CAAQ;QAG3B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IAGtB;IAFlB,YACE,OAAe,EACC,SAAiB;QAEjC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAFhB,cAAS,GAAT,SAAS,CAAQ;QAGjC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
@@ -1,7 +1,7 @@
1
1
  import { APP_VERSION } from '../constants/app.constants.js';
2
- import { fileURLToPath } from 'url';
3
2
  import { access, readFile } from 'node:fs/promises';
4
3
  import * as path from 'path';
4
+ import { fileURLToPath } from 'url';
5
5
  async function pathExists(filePath) {
6
6
  try {
7
7
  await access(filePath);
@@ -23,7 +23,7 @@ export async function getPackageInfo() {
23
23
  path.resolve(__dirname, '../../../package.json'),
24
24
  path.resolve(__dirname, '../../package.json'),
25
25
  path.resolve(__dirname, '../../../../package.json'),
26
- path.resolve(__dirname, '../node_modules/@ngzard/ui/package.json'),
26
+ path.resolve(__dirname, '../node_modules/zard-cli/package.json'),
27
27
  ];
28
28
  for (const packageJsonPath of possiblePaths) {
29
29
  try {
@@ -37,14 +37,14 @@ export async function getPackageInfo() {
37
37
  }
38
38
  // Fallback to hardcoded info if package.json is not found
39
39
  return {
40
- name: '@ngzard/ui',
40
+ name: 'zard-cli',
41
41
  version: APP_VERSION,
42
42
  };
43
43
  }
44
44
  catch (error) {
45
45
  // Ultimate fallback
46
46
  return {
47
- name: '@ngzard/ui',
47
+ name: 'zard-cli',
48
48
  version: APP_VERSION,
49
49
  };
50
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get-package-info.js","sourceRoot":"","sources":["../../src/utils/get-package-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,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;AASD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/D,MAAM,aAAa,GAAG;YACpB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC;YAChD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,0BAA0B,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,yCAAyC,CAAC;SACnE,CAAC;QAEF,KAAK,MAAM,eAAe,IAAI,aAAa,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,IAAI,MAAM,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;oBACtC,OAAO,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,WAAW;SACrB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oBAAoB;QACpB,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,WAAW;SACrB,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"get-package-info.js","sourceRoot":"","sources":["../../src/utils/get-package-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,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;AASD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/D,MAAM,aAAa,GAAG;YACpB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC;YAChD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,0BAA0B,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,uCAAuC,CAAC;SACjE,CAAC;QAEF,KAAK,MAAM,eAAe,IAAI,aAAa,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,IAAI,MAAM,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;oBACtC,OAAO,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,WAAW;SACrB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oBAAoB;QACpB,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,WAAW;SACrB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,9 +1,39 @@
1
+ /**
2
+ * Qual toolchain compila o projeto.
3
+ *
4
+ * Analog troca o build do Angular por Vite, e com isso troca também onde o
5
+ * Tailwind é configurado: plugin no `vite.config.ts` em vez de `.postcssrc.json`.
6
+ */
7
+ export type ProjectFlavor = 'angular' | 'analog';
8
+ /** Um projeto declarado no workspace — `angular.json` ou `project.json` do Nx. */
9
+ export type WorkspaceProject = {
10
+ name: string;
11
+ projectType: 'application' | 'library';
12
+ /** Raiz do projeto, relativa ao workspace (`apps/web`, ou `''` no app único). */
13
+ root: string;
14
+ sourceRoot: string;
15
+ flavor: ProjectFlavor;
16
+ /** Os `styles` do target de build, relativos ao workspace. */
17
+ styles: string[];
18
+ /** O `index` do target de build, quando declarado. */
19
+ index: string | null;
20
+ };
1
21
  export type ProjectInfo = {
2
22
  framework: 'angular' | 'unknown';
23
+ /** Onde o package.json foi encontrado — a raiz do workspace. */
24
+ root: string;
25
+ /** Quem gerencia o workspace: define onde os projetos e os paths do TS vivem. */
26
+ workspace: 'angular' | 'nx';
3
27
  hasTypeScript: boolean;
4
28
  hasTailwind: boolean;
5
29
  hasNx: boolean;
30
+ hasAnalog: boolean;
31
+ /** O tsconfig que guarda `compilerOptions.paths` — `tsconfig.base.json` no Nx. */
32
+ tsconfigFile: string;
6
33
  angularVersion: string | null;
34
+ angularVersionRaw: string | null;
35
+ /** O que o workspace declara, na ordem em que aparece. Vazio se não houver. */
36
+ projects: WorkspaceProject[];
7
37
  };
8
38
  export declare function getProjectInfo(cwd: string): Promise<ProjectInfo>;
9
39
  //# sourceMappingURL=get-project-info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-project-info.d.ts","sourceRoot":"","sources":["../../src/utils/get-project-info.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwBtE"}
1
+ {"version":3,"file":"get-project-info.d.ts","sourceRoot":"","sources":["../../src/utils/get-project-info.ts"],"names":[],"mappings":"AAyBA;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjD,kFAAkF;AAClF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IACvC,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sDAAsD;IACtD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,kFAAkF;IAClF,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B,CAAC;AAuMF,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA4CtE"}
@@ -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
+ /** Normaliza separadores para o formato que os arquivos de configuração usam. */
36
+ function toPosix(value) {
37
+ return value.split(path.sep).join('/');
38
+ }
39
+ /**
40
+ * O que o target de build diz sobre o projeto.
41
+ *
42
+ * `angular.json` chama de `architect`/`builder` e o Nx de `targets`/`executor`,
43
+ * mas o formato das opções é o mesmo — então uma leitura só serve aos dois.
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 substitui o builder do Angular pelo dele; é assim que se anuncia. */
56
+ function flavorOf(tool) {
57
+ return tool.startsWith('@analogjs/') ? 'analog' : 'angular';
58
+ }
59
+ /**
60
+ * Lê os projetos do `angular.json`.
61
+ *
62
+ * É o que distingue uma aplicação de uma biblioteca — o package.json não diz.
63
+ * Workspace sem `angular.json` (ou ilegível) devolve lista vazia, e quem chama
64
+ * decide o que fazer com isso.
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
+ * Onde procurar por `project.json`.
90
+ *
91
+ * O Nx não obriga um layout, mas gera em `apps/` e `libs/` (ou no que
92
+ * `workspaceLayout` disser), e monorepos de pacotes usam `packages/`. Procurar
93
+ * só nesses lugares evita varrer o repositório inteiro atrás de configuração.
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
+ * Diretórios que contêm um `project.json`, até dois níveis abaixo da busca.
107
+ *
108
+ * Um projeto não contém outro, então achar a configuração encerra a descida —
109
+ * o que também impede que `node_modules` de um projeto vire um segundo projeto.
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
+ * Lê os projetos de um workspace Nx.
131
+ *
132
+ * O Nx não tem `angular.json`: cada projeto se descreve no próprio
133
+ * `project.json`, e a raiz do projeto é o diretório onde esse arquivo está.
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
+ // A ordem do sistema de arquivos é arbitrária; ordenar dá ao menu uma lista
161
+ // estável entre execuções.
162
+ return projects
163
+ .filter((project) => project !== null)
164
+ .sort((a, b) => a.root.localeCompare(b.root));
165
+ }
166
+ /**
167
+ * Aplicação ou biblioteca, quando o `project.json` não declara.
168
+ *
169
+ * Um `serve` só existe para o que é servido; biblioteca nenhuma tem. É a
170
+ * distinção que sobra quando o campo explícito falta.
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
+ /** Configurações que só existem num projeto de testes de ponta a ponta. */
179
+ const E2E_CONFIGS = ['playwright.config.ts', 'playwright.config.js', 'cypress.config.ts', 'cypress.config.js'];
180
+ /**
181
+ * Se o projeto existe apenas para rodar testes de ponta a ponta.
182
+ *
183
+ * O gerador do Nx cria `<app>-e2e` declarando `projectType: "application"`, e
184
+ * com isso ele aparecia na lista de apps que podem receber os componentes — mas
185
+ * ali não há `app.config.ts`, CSS global nem build para configurar. O sufixo é
186
+ * a convenção do Nx; o arquivo de configuração do runner confirma os casos em
187
+ * que o projeto foi renomeado.
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
+ // Um workspace Nx pode ter os dois arquivos; o `angular.json` só descreve os
209
+ // projetos que já existiam antes da migração, então o Nx tem a palavra final.
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
+ // O Nx guarda os paths num tsconfig.base.json que os projetos estendem;
214
+ // escrever no tsconfig.json da raiz não chegaria a nenhum deles.
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;AAUD,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CA6DlF"}
@@ -0,0 +1,68 @@
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
+ export async function fetchJson(url, options) {
10
+ const { timeout = DEFAULT_TIMEOUT, retries = DEFAULT_RETRIES, backoffBase = DEFAULT_BACKOFF_BASE } = options ?? {};
11
+ const headers = {
12
+ 'User-Agent': 'zard-cli',
13
+ Accept: 'application/json',
14
+ ...options?.headers,
15
+ };
16
+ for (let attempt = 1; attempt <= retries; attempt++) {
17
+ try {
18
+ const response = await fetch(url, {
19
+ signal: AbortSignal.timeout(timeout),
20
+ headers,
21
+ });
22
+ if (response.status === 429) {
23
+ const retryAfter = parseInt(response.headers.get('Retry-After') ?? '5', 10);
24
+ logger.debug(`Rate limited by ${url}, retrying in ${retryAfter}s...`);
25
+ await sleep(retryAfter * 1000);
26
+ continue;
27
+ }
28
+ if (!response.ok) {
29
+ throw new NetworkError(`HTTP ${response.status}: ${response.statusText}`, url);
30
+ }
31
+ const text = await response.text();
32
+ if (!text || text.includes('<!DOCTYPE') || text.includes('<html')) {
33
+ throw new NetworkError('Received HTML instead of JSON from registry', url);
34
+ }
35
+ try {
36
+ return JSON.parse(text);
37
+ }
38
+ catch {
39
+ throw new NetworkError('Invalid JSON response from registry', url);
40
+ }
41
+ }
42
+ catch (error) {
43
+ if (error instanceof NetworkError) {
44
+ if (attempt === retries)
45
+ throw error;
46
+ }
47
+ else if (error instanceof DOMException && error.name === 'TimeoutError') {
48
+ if (attempt === retries) {
49
+ throw new NetworkError(`Request timed out after ${timeout}ms`, url);
50
+ }
51
+ }
52
+ else if (error instanceof TypeError) {
53
+ // fetch throws TypeError for DNS failures, connection refused, etc.
54
+ if (attempt === retries) {
55
+ throw new NetworkError(`Connection failed: ${error.message}`, url);
56
+ }
57
+ }
58
+ else {
59
+ throw error;
60
+ }
61
+ const delay = backoffBase * Math.pow(2, attempt - 1);
62
+ logger.debug(`Attempt ${attempt}/${retries} failed for ${url}, retrying in ${delay}ms...`);
63
+ await sleep(delay);
64
+ }
65
+ }
66
+ throw new NetworkError(`Failed after ${retries} attempts`, url);
67
+ }
68
+ //# 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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"}