zard-cli 1.0.0-beta.9 → 1.1.0-alpha.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 (237) hide show
  1. package/README.md +60 -188
  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 +1 -1
  15. package/commands/add/dependency-resolver.d.ts.map +1 -1
  16. package/commands/add/dependency-resolver.js +5 -6
  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 +127 -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 +59 -56
  26. package/commands/init/config-prompter.d.ts.map +1 -1
  27. package/commands/init/config-prompter.js +76 -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 +36 -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 +132 -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 +151 -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/registry/registry-data.d.ts.map +1 -1
  67. package/core/registry/registry-data.js +359 -61
  68. package/core/registry/registry-data.js.map +1 -1
  69. package/core/themes/theme-definitions.d.ts +5 -5
  70. package/core/themes/theme-definitions.d.ts.map +1 -1
  71. package/core/themes/theme-definitions.js +15 -11
  72. package/core/themes/theme-definitions.js.map +1 -1
  73. package/index.js +40 -4
  74. package/index.js.map +1 -1
  75. package/package.json +58 -61
  76. package/ui/blocks.d.ts +70 -0
  77. package/ui/blocks.d.ts.map +1 -0
  78. package/ui/blocks.js +116 -0
  79. package/ui/blocks.js.map +1 -0
  80. package/ui/brand.d.ts +14 -0
  81. package/ui/brand.d.ts.map +1 -0
  82. package/ui/brand.js +35 -0
  83. package/ui/brand.js.map +1 -0
  84. package/ui/engine/animation/index.d.ts +39 -0
  85. package/ui/engine/animation/index.d.ts.map +1 -0
  86. package/ui/engine/animation/index.js +103 -0
  87. package/ui/engine/animation/index.js.map +1 -0
  88. package/ui/engine/ansi/index.d.ts +52 -0
  89. package/ui/engine/ansi/index.d.ts.map +1 -0
  90. package/ui/engine/ansi/index.js +117 -0
  91. package/ui/engine/ansi/index.js.map +1 -0
  92. package/ui/engine/components/index.d.ts +211 -0
  93. package/ui/engine/components/index.d.ts.map +1 -0
  94. package/ui/engine/components/index.js +109 -0
  95. package/ui/engine/components/index.js.map +1 -0
  96. package/ui/engine/cursor/index.d.ts +17 -0
  97. package/ui/engine/cursor/index.d.ts.map +1 -0
  98. package/ui/engine/cursor/index.js +41 -0
  99. package/ui/engine/cursor/index.js.map +1 -0
  100. package/ui/engine/diff/index.d.ts +27 -0
  101. package/ui/engine/diff/index.d.ts.map +1 -0
  102. package/ui/engine/diff/index.js +57 -0
  103. package/ui/engine/diff/index.js.map +1 -0
  104. package/ui/engine/events/index.d.ts +24 -0
  105. package/ui/engine/events/index.d.ts.map +1 -0
  106. package/ui/engine/events/index.js +60 -0
  107. package/ui/engine/events/index.js.map +1 -0
  108. package/ui/engine/focus/index.d.ts +25 -0
  109. package/ui/engine/focus/index.d.ts.map +1 -0
  110. package/ui/engine/focus/index.js +77 -0
  111. package/ui/engine/focus/index.js.map +1 -0
  112. package/ui/engine/frame/index.d.ts +48 -0
  113. package/ui/engine/frame/index.d.ts.map +1 -0
  114. package/ui/engine/frame/index.js +0 -0
  115. package/ui/engine/frame/index.js.map +1 -0
  116. package/ui/engine/index.d.ts +28 -0
  117. package/ui/engine/index.d.ts.map +1 -0
  118. package/ui/engine/index.js +28 -0
  119. package/ui/engine/index.js.map +1 -0
  120. package/ui/engine/input/index.d.ts +36 -0
  121. package/ui/engine/input/index.d.ts.map +1 -0
  122. package/ui/engine/input/index.js +224 -0
  123. package/ui/engine/input/index.js.map +1 -0
  124. package/ui/engine/layout/index.d.ts +42 -0
  125. package/ui/engine/layout/index.d.ts.map +1 -0
  126. package/ui/engine/layout/index.js +241 -0
  127. package/ui/engine/layout/index.js.map +1 -0
  128. package/ui/engine/renderer/index.d.ts +43 -0
  129. package/ui/engine/renderer/index.d.ts.map +1 -0
  130. package/ui/engine/renderer/index.js +619 -0
  131. package/ui/engine/renderer/index.js.map +1 -0
  132. package/ui/engine/scheduler/index.d.ts +22 -0
  133. package/ui/engine/scheduler/index.d.ts.map +1 -0
  134. package/ui/engine/scheduler/index.js +77 -0
  135. package/ui/engine/scheduler/index.js.map +1 -0
  136. package/ui/engine/screen/index.d.ts +39 -0
  137. package/ui/engine/screen/index.d.ts.map +1 -0
  138. package/ui/engine/screen/index.js +255 -0
  139. package/ui/engine/screen/index.js.map +1 -0
  140. package/ui/engine/terminal/index.d.ts +38 -0
  141. package/ui/engine/terminal/index.d.ts.map +1 -0
  142. package/ui/engine/terminal/index.js +104 -0
  143. package/ui/engine/terminal/index.js.map +1 -0
  144. package/ui/engine/testing/index.d.ts +27 -0
  145. package/ui/engine/testing/index.d.ts.map +1 -0
  146. package/ui/engine/testing/index.js +63 -0
  147. package/ui/engine/testing/index.js.map +1 -0
  148. package/ui/engine/theme/index.d.ts +27 -0
  149. package/ui/engine/theme/index.d.ts.map +1 -0
  150. package/ui/engine/theme/index.js +129 -0
  151. package/ui/engine/theme/index.js.map +1 -0
  152. package/ui/engine/utils/index.d.ts +12 -0
  153. package/ui/engine/utils/index.d.ts.map +1 -0
  154. package/ui/engine/utils/index.js +143 -0
  155. package/ui/engine/utils/index.js.map +1 -0
  156. package/ui/gate.d.ts +19 -0
  157. package/ui/gate.d.ts.map +1 -0
  158. package/ui/gate.js +36 -0
  159. package/ui/gate.js.map +1 -0
  160. package/ui/index.d.ts +18 -0
  161. package/ui/index.d.ts.map +1 -0
  162. package/ui/index.js +18 -0
  163. package/ui/index.js.map +1 -0
  164. package/ui/log-sink.d.ts +24 -0
  165. package/ui/log-sink.d.ts.map +1 -0
  166. package/ui/log-sink.js +35 -0
  167. package/ui/log-sink.js.map +1 -0
  168. package/ui/output.d.ts +14 -0
  169. package/ui/output.d.ts.map +1 -0
  170. package/ui/output.js +28 -0
  171. package/ui/output.js.map +1 -0
  172. package/ui/report.d.ts +30 -0
  173. package/ui/report.d.ts.map +1 -0
  174. package/ui/report.js +45 -0
  175. package/ui/report.js.map +1 -0
  176. package/ui/runner.d.ts +57 -0
  177. package/ui/runner.d.ts.map +1 -0
  178. package/ui/runner.js +119 -0
  179. package/ui/runner.js.map +1 -0
  180. package/ui/style.d.ts +24 -0
  181. package/ui/style.d.ts.map +1 -0
  182. package/ui/style.js +44 -0
  183. package/ui/style.js.map +1 -0
  184. package/ui/testing/fake-tty.d.ts +26 -0
  185. package/ui/testing/fake-tty.d.ts.map +1 -0
  186. package/ui/testing/fake-tty.js +61 -0
  187. package/ui/testing/fake-tty.js.map +1 -0
  188. package/ui/text-input.d.ts +30 -0
  189. package/ui/text-input.d.ts.map +1 -0
  190. package/ui/text-input.js +87 -0
  191. package/ui/text-input.js.map +1 -0
  192. package/ui/theme.d.ts +10 -0
  193. package/ui/theme.d.ts.map +1 -0
  194. package/ui/theme.js +20 -0
  195. package/ui/theme.js.map +1 -0
  196. package/utils/config.d.ts +48 -69
  197. package/utils/config.d.ts.map +1 -1
  198. package/utils/config.js +43 -7
  199. package/utils/config.js.map +1 -1
  200. package/utils/errors.d.ts +16 -0
  201. package/utils/errors.d.ts.map +1 -0
  202. package/utils/errors.js +31 -0
  203. package/utils/errors.js.map +1 -0
  204. package/utils/get-package-info.js +4 -4
  205. package/utils/get-package-info.js.map +1 -1
  206. package/utils/get-project-info.d.ts +30 -0
  207. package/utils/get-project-info.d.ts.map +1 -1
  208. package/utils/get-project-info.js +195 -6
  209. package/utils/get-project-info.js.map +1 -1
  210. package/utils/http-client.d.ts +8 -0
  211. package/utils/http-client.d.ts.map +1 -0
  212. package/utils/http-client.js +68 -0
  213. package/utils/http-client.js.map +1 -0
  214. package/utils/logger.d.ts +16 -1
  215. package/utils/logger.d.ts.map +1 -1
  216. package/utils/logger.js +104 -12
  217. package/utils/logger.js.map +1 -1
  218. package/utils/package-manager.d.ts +44 -1
  219. package/utils/package-manager.d.ts.map +1 -1
  220. package/utils/package-manager.js +210 -14
  221. package/utils/package-manager.js.map +1 -1
  222. package/utils/registry.d.ts +14 -2
  223. package/utils/registry.d.ts.map +1 -1
  224. package/utils/registry.js +52 -24
  225. package/utils/registry.js.map +1 -1
  226. package/utils/source-file.d.ts +40 -0
  227. package/utils/source-file.d.ts.map +1 -0
  228. package/utils/source-file.js +104 -0
  229. package/utils/source-file.js.map +1 -0
  230. package/utils/theme-selector.d.ts +1 -1
  231. package/utils/theme-selector.d.ts.map +1 -1
  232. package/utils/theme-selector.js +6 -6
  233. package/utils/theme-selector.js.map +1 -1
  234. package/utils/fetch-component.d.ts +0 -3
  235. package/utils/fetch-component.d.ts.map +0 -1
  236. package/utils/fetch-component.js +0 -75
  237. package/utils/fetch-component.js.map +0 -1
@@ -1,22 +1,80 @@
1
1
  import { detect } from '@antfu/ni';
2
+ import { isCapturing } from '../ui/log-sink.js';
2
3
  import { getConfig } from '../utils/config.js';
3
- export async function detectPackageManager() {
4
+ import { logger } from '../utils/logger.js';
5
+ import { existsSync } from 'node:fs';
6
+ import { readFile } from 'node:fs/promises';
7
+ import * as path from 'node:path';
8
+ let cachedPackageManager = null;
9
+ const SUPPORTED = ['npm', 'yarn', 'pnpm', 'bun'];
10
+ function asPackageManager(value) {
11
+ // `yarn@berry`, `pnpm@6`, `bun@1.3.14` — só a família interessa.
12
+ const name = value?.split('@')[0];
13
+ return SUPPORTED.includes(name) ? name : null;
14
+ }
15
+ /**
16
+ * Qual gerenciador o *projeto* usa.
17
+ *
18
+ * A ordem importa. `npm_config_user_agent` descreve como a CLI foi chamada
19
+ * (`npx` sempre diz npm), não o que o projeto usa — confiar nele primeiro fazia
20
+ * um projeto bun receber `packageManager: "npm"` no components.json e ganhar um
21
+ * package-lock.json ao lado do bun.lock. O projeto responde por si: primeiro o
22
+ * campo `packageManager` do package.json, depois os lockfiles.
23
+ */
24
+ export async function detectPackageManager(cwd = process.cwd()) {
25
+ if (cachedPackageManager)
26
+ return cachedPackageManager;
27
+ const declared = asPackageManager(await readPackageManagerField(cwd));
28
+ if (declared)
29
+ return (cachedPackageManager = declared);
30
+ const fromLockfile = asPackageManager(await detect({ programmatic: true, cwd }));
31
+ if (fromLockfile)
32
+ return (cachedPackageManager = fromLockfile);
4
33
  const userAgent = process.env.npm_config_user_agent || '';
5
34
  if (userAgent.includes('bun'))
6
- return 'bun';
35
+ return (cachedPackageManager = 'bun');
7
36
  if (userAgent.includes('pnpm'))
8
- return 'pnpm';
37
+ return (cachedPackageManager = 'pnpm');
9
38
  if (userAgent.includes('yarn'))
10
- return 'yarn';
11
- if (userAgent.includes('npm'))
12
- return 'npm';
13
- const agent = await detect({ programmatic: true });
14
- if (agent === 'yarn@berry')
15
- return 'yarn';
16
- if (agent && ['npm', 'yarn', 'pnpm', 'bun'].includes(agent)) {
17
- return agent;
39
+ return (cachedPackageManager = 'yarn');
40
+ return (cachedPackageManager = 'npm');
41
+ }
42
+ const RUNNER = {
43
+ npm: 'npx',
44
+ yarn: 'yarn dlx',
45
+ pnpm: 'pnpm dlx',
46
+ bun: 'bunx',
47
+ };
48
+ /**
49
+ * Como sugerir que o usuário rode a CLI de novo.
50
+ *
51
+ * Aqui a pergunta é outra: não é qual gerenciador o projeto usa para instalar
52
+ * dependências, e sim por onde a CLI acabou de ser executada. Quem chamou
53
+ * `npx zard-cli init` num projeto bun não espera terminar lendo `bunx` — e o
54
+ * `npx` que ele já usou funciona. Só quando não dá para saber é que o
55
+ * gerenciador do projeto responde.
56
+ */
57
+ export function suggestedRunner(packageManager) {
58
+ const userAgent = process.env.npm_config_user_agent || '';
59
+ if (userAgent.startsWith('bun'))
60
+ return RUNNER.bun;
61
+ if (userAgent.startsWith('pnpm'))
62
+ return RUNNER.pnpm;
63
+ if (userAgent.startsWith('yarn'))
64
+ return RUNNER.yarn;
65
+ if (userAgent.startsWith('npm'))
66
+ return RUNNER.npm;
67
+ return RUNNER[packageManager];
68
+ }
69
+ /** O campo `packageManager` do package.json — padrão do Corepack, é declaração explícita. */
70
+ async function readPackageManagerField(cwd) {
71
+ try {
72
+ const manifest = JSON.parse(await readFile(path.join(cwd, 'package.json'), 'utf8'));
73
+ return typeof manifest.packageManager === 'string' ? manifest.packageManager : null;
74
+ }
75
+ catch {
76
+ return null;
18
77
  }
19
- return 'npm';
20
78
  }
21
79
  export async function getPackageManager(cwd = process.cwd()) {
22
80
  const config = await getConfig(cwd);
@@ -35,13 +93,151 @@ export async function getInstallCommand(packageManager, isDev = false) {
35
93
  return isDev ? ['install', '-D'] : ['install'];
36
94
  }
37
95
  }
96
+ /**
97
+ * Trabalho que o gerenciador faz por hábito e que não serve à instalação em si.
98
+ *
99
+ * A auditoria de vulnerabilidades manda a árvore inteira para o registro e
100
+ * espera a resposta; em projeto Angular, com mais de mil pacotes, ela sozinha
101
+ * responde por vários segundos de uma chamada que instala meia dúzia deles.
102
+ */
103
+ function speedFlags(packageManager) {
104
+ return packageManager === 'npm' ? ['--no-audit', '--no-fund'] : [];
105
+ }
38
106
  export async function installPackages(packages, cwd, packageManager, isDev = false, legacyPeerDeps = false) {
39
107
  const { execa } = await import('execa');
40
108
  const installCmd = await getInstallCommand(packageManager, isDev);
41
- const args = [...installCmd, ...packages];
109
+ const args = [...installCmd, ...packages, ...speedFlags(packageManager)];
42
110
  if (legacyPeerDeps && packageManager === 'npm') {
43
111
  args.push('--legacy-peer-deps');
44
112
  }
45
- await execa(packageManager, args, { cwd, stdio: 'inherit' });
113
+ if (legacyPeerDeps && packageManager === 'pnpm') {
114
+ args.push('--no-strict-peer-dependencies');
115
+ }
116
+ // Com a tela interativa montada, herdar o stdio deixaria o gerenciador de
117
+ // pacotes escrever por cima do frame. Nesse caso a saída é capturada e só
118
+ // aparece em modo debug; fora dela, o comportamento continua sendo o de
119
+ // repassar a saída ao vivo.
120
+ if (isCapturing()) {
121
+ const command = `${packageManager} ${args.join(' ')}`;
122
+ try {
123
+ // stdin ignorado, não em pipe: um pipe de entrada aberto nunca recebe EOF
124
+ // e o gerenciador de pacotes fica esperando nele para sempre. Fechar o
125
+ // stdin também garante que ele nunca tente abrir um prompt, o que seria
126
+ // invisível atrás da tela cheia.
127
+ const result = await execa(packageManager, args, {
128
+ cwd,
129
+ stdin: 'ignore',
130
+ stdout: 'pipe',
131
+ stderr: 'pipe',
132
+ });
133
+ logger.debug(`${command}\n${result.stdout}`);
134
+ }
135
+ catch (error) {
136
+ // Sem isso a falha chega ao usuário como uma linha genérica: a saída real
137
+ // do gerenciador de pacotes fica no sink e é impressa junto do resumo.
138
+ logger.error(`${command} failed:\n${outputOf(error)}`);
139
+ throw error;
140
+ }
141
+ return;
142
+ }
143
+ // stdin ignorado aqui também. A instalação recebe os pacotes por argumento e
144
+ // nunca tem o que perguntar; herdar um stdin que não fecha (pipe, CI, job em
145
+ // background) prende o gerenciador esperando um EOF que não vem — a saída
146
+ // continua ao vivo porque stdout e stderr seguem herdados.
147
+ await execa(packageManager, args, { cwd, stdin: 'ignore', stdout: 'inherit', stderr: 'inherit' });
148
+ }
149
+ function outputOf(error) {
150
+ const { stderr, stdout, message } = (error ?? {});
151
+ return (stderr?.trim() || stdout?.trim() || message || String(error)).trim();
152
+ }
153
+ /** Só npm e pnpm têm como relaxar a checagem de peers; nos outros, repetir é repetir a mesma falha. */
154
+ function canRelaxPeers(packageManager) {
155
+ return packageManager === 'npm' || packageManager === 'pnpm';
156
+ }
157
+ let peerRelaxationEngaged = false;
158
+ /**
159
+ * Instala o lote e, se o gerenciador recusar a árvore por conflito de peers,
160
+ * repete com a checagem relaxada.
161
+ *
162
+ * A queda fica registrada para o resto da execução: quando o primeiro lote
163
+ * precisou do fallback, os seguintes vão precisar pelo mesmo motivo, e a
164
+ * tentativa que já se sabe condenada custa uma resolução inteira da árvore.
165
+ */
166
+ export async function installPackagesWithRetry(packages, cwd, packageManager, isDev = false) {
167
+ if (packages.length === 0)
168
+ return;
169
+ if (peerRelaxationEngaged) {
170
+ await installPackages(packages, cwd, packageManager, isDev, true);
171
+ return;
172
+ }
173
+ try {
174
+ await installPackages(packages, cwd, packageManager, isDev);
175
+ }
176
+ catch (error) {
177
+ if (!canRelaxPeers(packageManager))
178
+ throw error;
179
+ logger.warn('Installation failed, retrying with relaxed peer dependency resolution...');
180
+ await installPackages(packages, cwd, packageManager, isDev, true);
181
+ peerRelaxationEngaged = true;
182
+ }
183
+ }
184
+ /**
185
+ * Descarta do lote os pacotes que o projeto já declara e já resolve.
186
+ *
187
+ * O gerenciador cobra caro por invocação — revalida a árvore inteira mesmo
188
+ * quando não há nada a fazer —, então o ganho não está em acelerar a instalação
189
+ * e sim em não chamá-la. Um `add` em projeto já inicializado pede justamente as
190
+ * dependências que o `init` colocou lá.
191
+ *
192
+ * O filtro é deliberadamente conservador: na dúvida o pacote continua no lote e
193
+ * quem decide é o gerenciador. Comparar apenas a major basta porque as versões
194
+ * que a CLI pede são sempre da forma `^N`.
195
+ */
196
+ export async function filterInstalledPackages(packages, cwd) {
197
+ const declared = await readDeclaredDependencies(cwd);
198
+ if (!declared)
199
+ return packages;
200
+ return packages.filter(spec => {
201
+ const { name, range } = parseSpec(spec);
202
+ const declaredRange = declared[name];
203
+ if (!declaredRange)
204
+ return true;
205
+ if (!isResolvable(name, cwd))
206
+ return true;
207
+ if (range && majorOf(range) !== majorOf(declaredRange))
208
+ return true;
209
+ return false;
210
+ });
211
+ }
212
+ function parseSpec(spec) {
213
+ // O `@` de `@ng-icons/core` abre o escopo, não a versão — por isso o último.
214
+ const separator = spec.lastIndexOf('@');
215
+ if (separator <= 0)
216
+ return { name: spec, range: null };
217
+ return { name: spec.slice(0, separator), range: spec.slice(separator + 1) };
218
+ }
219
+ function majorOf(range) {
220
+ return /(\d+)/.exec(range)?.[1] ?? null;
221
+ }
222
+ async function readDeclaredDependencies(cwd) {
223
+ try {
224
+ const manifest = JSON.parse(await readFile(path.join(cwd, 'package.json'), 'utf8'));
225
+ return { ...manifest.dependencies, ...manifest.devDependencies };
226
+ }
227
+ catch {
228
+ return null;
229
+ }
230
+ }
231
+ /** node_modules pode estar acima do projeto — workspaces içam tudo para a raiz. */
232
+ function isResolvable(name, cwd) {
233
+ let dir = path.resolve(cwd);
234
+ for (;;) {
235
+ if (existsSync(path.join(dir, 'node_modules', name)))
236
+ return true;
237
+ const parent = path.dirname(dir);
238
+ if (parent === dir)
239
+ return false;
240
+ dir = parent;
241
+ }
46
242
  }
47
243
  //# sourceMappingURL=package-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAE1D,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE5C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,IAAI,KAAK,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,KAAwC,CAAC;IAClD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,MAAM,EAAE,cAAc,IAAI,KAAK,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,cAAsB,EAAE,KAAK,GAAG,KAAK;IAC3E,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,KAAK;YACR,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,KAAK,CAAC;QACX;YACE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE,GAAW,EAAE,cAA+C,EAAE,KAAK,GAAG,KAAK,EAAE,cAAc,GAAG,KAAK;IAC3J,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAElE,MAAM,IAAI,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,QAAQ,CAAC,CAAC;IAE1C,IAAI,cAAc,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"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"}
@@ -28,9 +28,21 @@ export interface RegistryIndex {
28
28
  }>;
29
29
  }
30
30
  export declare function getRegistryUrl(config?: Config): string;
31
+ export declare function validateRegistryUrl(url: string): void;
31
32
  export declare function fetchRegistryIndex(registryUrl?: string): Promise<RegistryIndex>;
33
+ export declare function invalidateRegistryCache(): void;
32
34
  export declare function fetchComponentFromRegistry(componentName: string, registryUrl?: string): Promise<RegistryItem>;
33
35
  export declare function getAvailableComponents(registryUrl?: string): Promise<string[]>;
34
- export declare function transformContent(content: string, config: Config): string;
35
- export declare function fetchComponent(componentName: string, config: Config, registryUrl?: string): Promise<RegistryItem>;
36
+ export interface TransformOptions {
37
+ /**
38
+ * O destino veio de `--path`, fora do alias configurado.
39
+ *
40
+ * Nesse caso os componentes do lote viram vizinhos no disco, e é o caminho
41
+ * relativo que resolve — o alias apontaria para a pasta onde eles não estão.
42
+ * `utils` e `core` continuam no alias, porque quem os instalou foi o `init`.
43
+ */
44
+ readonly siblingComponents?: boolean;
45
+ }
46
+ export declare function transformContent(content: string, config: Config, options?: TransformOptions): string;
47
+ export declare function fetchComponent(componentName: string, config: Config, registryUrl?: string, options?: TransformOptions): Promise<RegistryItem>;
36
48
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,eAAO,MAAM,oBAAoB,QAE0D,CAAC;AAE5F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD;AA4BD,wBAAsB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAIrF;AAED,wBAAsB,0BAA0B,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAInH;AAED,wBAAsB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGpF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA+BxE;AAED,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAYvB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAInD,eAAO,MAAM,oBAAoB,QAE0D,CAAC;AAE5F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAarD;AAKD,wBAAsB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAYrF;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAsB,0BAA0B,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAInH;AAED,wBAAsB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGpF;AAOD,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAoDxG;AAED,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
package/utils/registry.js CHANGED
@@ -1,38 +1,40 @@
1
1
  import { DEFAULT_REGISTRY_URL as BUILD_REGISTRY_URL } from '../config/registry-config.js';
2
- import { execa } from 'execa';
2
+ import { ConfigError } from '../utils/errors.js';
3
+ import { fetchJson } from '../utils/http-client.js';
3
4
  export const DEFAULT_REGISTRY_URL = process.env['ZARD_REGISTRY_URL'] ||
4
5
  (BUILD_REGISTRY_URL !== '__REGISTRY_URL__' ? BUILD_REGISTRY_URL : 'https://zardui.com/r');
5
6
  export function getRegistryUrl(config) {
6
7
  return config?.registryUrl || DEFAULT_REGISTRY_URL;
7
8
  }
8
- async function fetchJson(url) {
9
+ export function validateRegistryUrl(url) {
9
10
  try {
10
- const { stdout } = await execa('curl', [
11
- '-s',
12
- '-H',
13
- 'Accept: application/json',
14
- '-H',
15
- 'User-Agent: ngzard-cli',
16
- '--max-time',
17
- '30',
18
- url,
19
- ]);
20
- if (!stdout || stdout.includes('<!DOCTYPE') || stdout.includes('<html')) {
21
- throw new Error(`Invalid response from registry: ${url}`);
11
+ const parsed = new URL(url);
12
+ const isHttps = parsed.protocol === 'https:';
13
+ const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';
14
+ if (!isHttps && !isLocalhost) {
15
+ throw new ConfigError('Registry URL must use HTTPS (or localhost for development)');
22
16
  }
23
- return JSON.parse(stdout);
24
17
  }
25
18
  catch (error) {
26
- if (error instanceof SyntaxError) {
27
- throw new Error(`Invalid JSON response from registry: ${url}`);
28
- }
29
- throw new Error(`Failed to fetch from registry: ${url} - ${error}`);
19
+ if (error instanceof ConfigError)
20
+ throw error;
21
+ throw new ConfigError(`Invalid registry URL: ${url}`);
30
22
  }
31
23
  }
24
+ const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
25
+ let registryIndexCache = null;
32
26
  export async function fetchRegistryIndex(registryUrl) {
33
27
  const baseUrl = registryUrl || DEFAULT_REGISTRY_URL;
28
+ if (registryIndexCache && Date.now() - registryIndexCache.timestamp < CACHE_TTL) {
29
+ return registryIndexCache.data;
30
+ }
34
31
  const url = `${baseUrl}/registry.json`;
35
- return fetchJson(url);
32
+ const data = await fetchJson(url);
33
+ registryIndexCache = { data, timestamp: Date.now() };
34
+ return data;
35
+ }
36
+ export function invalidateRegistryCache() {
37
+ registryIndexCache = null;
36
38
  }
37
39
  export async function fetchComponentFromRegistry(componentName, registryUrl) {
38
40
  const baseUrl = registryUrl || DEFAULT_REGISTRY_URL;
@@ -43,9 +45,18 @@ export async function getAvailableComponents(registryUrl) {
43
45
  const index = await fetchRegistryIndex(registryUrl);
44
46
  return index.items.map(item => item.name);
45
47
  }
46
- export function transformContent(content, config) {
48
+ /** Sem isto, um alias digitado como `@/ui/components/` produz `@/ui/components//button`. */
49
+ function trimSlashes(alias) {
50
+ return alias.replace(/\/+$/, '');
51
+ }
52
+ export function transformContent(content, config, options = {}) {
47
53
  let transformed = content;
48
- const { aliases } = config;
54
+ const aliases = {
55
+ components: options.siblingComponents ? '..' : trimSlashes(config.aliases.components),
56
+ utils: trimSlashes(config.aliases.utils),
57
+ core: trimSlashes(config.aliases.core),
58
+ services: trimSlashes(config.aliases.services),
59
+ };
49
60
  // Replace utils imports
50
61
  transformed = transformed.replace(/from ['"]\.\.\/\.\.\/shared\/utils\/utils['"]/g, `from '${aliases.utils}/merge-classes'`);
51
62
  transformed = transformed.replace(/from ['"]\.\.\/\.\.\/shared\/utils\/number['"]/g, `from '${aliases.utils}/number'`);
@@ -55,13 +66,30 @@ export function transformContent(content, config) {
55
66
  // Replace ClassValue imports
56
67
  transformed = transformed.replace(/import \{ ClassValue \} from ['"]class-variance-authority\/dist\/types['"]/g, `import { ClassValue } from 'clsx'`);
57
68
  transformed = transformed.replace(/import \{ ClassValue \} from ['"]class-variance-authority['"]/g, `import { ClassValue } from 'clsx'`);
69
+ // Transform default @/shared/* to match aliases
70
+ for (const [key, value] of Object.entries(aliases)) {
71
+ if (!value) {
72
+ continue;
73
+ }
74
+ // O subpath é opcional: `card.component.ts` importa o barrel direto
75
+ // (`from '@/shared/core'`). Exigindo `/algo` depois da chave, esse import
76
+ // escapava da substituição e o componente instalado continuava apontando
77
+ // para `@/shared/core` — uma pasta que não existe com alias customizado.
78
+ const regex = new RegExp(`(['"])@\\/shared\\/${key}(\\/[\\w\\-\\/.]+)?\\1`, 'g');
79
+ transformed = transformed.replace(regex, (_match, quote, subpath) => {
80
+ return `${quote}${value}${subpath ?? ''}${quote}`;
81
+ });
82
+ }
58
83
  return transformed;
59
84
  }
60
- export async function fetchComponent(componentName, config, registryUrl) {
85
+ export async function fetchComponent(componentName, config, registryUrl, options = {}) {
61
86
  const item = await fetchComponentFromRegistry(componentName, registryUrl);
87
+ if (!item.files || !Array.isArray(item.files)) {
88
+ throw new ConfigError(`Component "${componentName}" has no files in the registry`);
89
+ }
62
90
  const transformedFiles = item.files.map(file => ({
63
91
  name: file.name,
64
- content: transformContent(file.content, config),
92
+ content: transformContent(file.content, config, options),
65
93
  }));
66
94
  return {
67
95
  ...item,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Edições de código-fonte que mais de um passo do init precisa fazer.
3
+ *
4
+ * Inserir um import parece trivial até o arquivo estar em CRLF: um `\n` cru
5
+ * gera terminações misturadas, faz o git marcar o arquivo inteiro como alterado
6
+ * e — quando a expressão que procura os imports esquece o `\r` — emenda a linha
7
+ * nova no fim da anterior.
8
+ */
9
+ /** A quebra de linha que o arquivo já usa. */
10
+ export declare function lineEndingOf(content: string): string;
11
+ /**
12
+ * Insere uma linha de import logo depois do último import do arquivo.
13
+ *
14
+ * Devolve o conteúdo intocado quando o import já está lá, para que chamar duas
15
+ * vezes seja o mesmo que chamar uma.
16
+ */
17
+ export declare function withImport(content: string, importLine: string): string;
18
+ /** Onde um literal de array começa e termina, em índices do conteúdo. */
19
+ export interface ArrayRange {
20
+ /** Índice do `[` que abre. */
21
+ readonly open: number;
22
+ /** Índice do `]` que fecha. */
23
+ readonly close: number;
24
+ /** O que está entre os dois, sem os colchetes. */
25
+ readonly body: string;
26
+ }
27
+ /**
28
+ * O intervalo do array atribuído a `key`, achado contando colchetes.
29
+ *
30
+ * Uma expressão regular para no primeiro `]` que aparece, e em código real esse
31
+ * `]` costuma ser o de um array aninhado — `withInterceptors([...])` num
32
+ * `providers`, um plugin com opções num `plugins`. O que fosse inserido ali
33
+ * caía dentro do array errado, e o build quebrava com um erro de tipo que não
34
+ * menciona ZardUI em lugar nenhum.
35
+ *
36
+ * Strings e comentários são pulados, para que um `]` escrito dentro deles não
37
+ * conte como fechamento.
38
+ */
39
+ export declare function arrayRange(content: string, key: string): ArrayRange | null;
40
+ //# sourceMappingURL=source-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-file.d.ts","sourceRoot":"","sources":["../../src/utils/source-file.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAgBD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAYtE;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAyB1E"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Edições de código-fonte que mais de um passo do init precisa fazer.
3
+ *
4
+ * Inserir um import parece trivial até o arquivo estar em CRLF: um `\n` cru
5
+ * gera terminações misturadas, faz o git marcar o arquivo inteiro como alterado
6
+ * e — quando a expressão que procura os imports esquece o `\r` — emenda a linha
7
+ * nova no fim da anterior.
8
+ */
9
+ /** A quebra de linha que o arquivo já usa. */
10
+ export function lineEndingOf(content) {
11
+ return content.includes('\r\n') ? '\r\n' : '\n';
12
+ }
13
+ /** O último `import ... from '...'` do arquivo, ou null se não houver nenhum. */
14
+ function lastImport(content) {
15
+ // `[\s\S]*?` em vez de `.*`: a lista de símbolos importados quebra em várias
16
+ // linhas com frequência, e um padrão preso a uma linha só não a alcançava —
17
+ // num arquivo assim o import novo era jogado para antes de todos os outros.
18
+ const importRegex = /^import\s[\s\S]*?from\s+'[^']*';\r?\n?/gm;
19
+ let last = null;
20
+ let match;
21
+ while ((match = importRegex.exec(content)) !== null)
22
+ last = match;
23
+ return last;
24
+ }
25
+ /**
26
+ * Insere uma linha de import logo depois do último import do arquivo.
27
+ *
28
+ * Devolve o conteúdo intocado quando o import já está lá, para que chamar duas
29
+ * vezes seja o mesmo que chamar uma.
30
+ */
31
+ export function withImport(content, importLine) {
32
+ if (content.includes(importLine))
33
+ return content;
34
+ const eol = lineEndingOf(content);
35
+ const last = lastImport(content);
36
+ if (!last)
37
+ return importLine + eol + content;
38
+ const end = last.index + last[0].length;
39
+ const alreadyBroken = /\r?\n$/.test(last[0]);
40
+ return content.slice(0, end) + (alreadyBroken ? '' : eol) + importLine + eol + content.slice(end);
41
+ }
42
+ /**
43
+ * O intervalo do array atribuído a `key`, achado contando colchetes.
44
+ *
45
+ * Uma expressão regular para no primeiro `]` que aparece, e em código real esse
46
+ * `]` costuma ser o de um array aninhado — `withInterceptors([...])` num
47
+ * `providers`, um plugin com opções num `plugins`. O que fosse inserido ali
48
+ * caía dentro do array errado, e o build quebrava com um erro de tipo que não
49
+ * menciona ZardUI em lugar nenhum.
50
+ *
51
+ * Strings e comentários são pulados, para que um `]` escrito dentro deles não
52
+ * conte como fechamento.
53
+ */
54
+ export function arrayRange(content, key) {
55
+ const opening = new RegExp(`\\b${key}\\s*:\\s*\\[`).exec(content);
56
+ if (!opening)
57
+ return null;
58
+ const open = opening.index + opening[0].length - 1;
59
+ let depth = 0;
60
+ for (let index = open; index < content.length; index++) {
61
+ const skipped = skipStringOrComment(content, index);
62
+ if (skipped !== index) {
63
+ index = skipped - 1;
64
+ continue;
65
+ }
66
+ const char = content[index];
67
+ if (char === '[')
68
+ depth++;
69
+ else if (char === ']' && --depth === 0) {
70
+ return { open, close: index, body: content.slice(open + 1, index) };
71
+ }
72
+ }
73
+ return null;
74
+ }
75
+ /**
76
+ * O índice logo após a string ou o comentário que começa em `index`.
77
+ *
78
+ * Devolve o próprio `index` quando não há nenhum ali — quem chama usa isso para
79
+ * saber que o caractere é código e deve ser considerado.
80
+ */
81
+ function skipStringOrComment(content, index) {
82
+ const char = content[index];
83
+ const next = content[index + 1];
84
+ if (char === '/' && next === '/') {
85
+ const end = content.indexOf('\n', index);
86
+ return end === -1 ? content.length : end;
87
+ }
88
+ if (char === '/' && next === '*') {
89
+ const end = content.indexOf('*/', index + 2);
90
+ return end === -1 ? content.length : end + 2;
91
+ }
92
+ if (char !== '"' && char !== "'" && char !== '`')
93
+ return index;
94
+ for (let cursor = index + 1; cursor < content.length; cursor++) {
95
+ if (content[cursor] === '\\') {
96
+ cursor++;
97
+ continue;
98
+ }
99
+ if (content[cursor] === char)
100
+ return cursor + 1;
101
+ }
102
+ return content.length;
103
+ }
104
+ //# sourceMappingURL=source-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-file.js","sourceRoot":"","sources":["../../src/utils/source-file.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  export declare function getAvailableThemes(): string[];
2
- export declare function getThemeContent(themeName: string): string;
2
+ export declare function getThemeContent(themeName: string, corePath: string): string;
3
3
  export declare function getThemeDisplayName(themeName: string): string;
4
4
  //# sourceMappingURL=theme-selector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-selector.d.ts","sourceRoot":"","sources":["../../src/utils/theme-selector.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAkBzD;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS7D"}
1
+ {"version":3,"file":"theme-selector.d.ts","sourceRoot":"","sources":["../../src/utils/theme-selector.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB3E;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAS7D"}
@@ -2,20 +2,20 @@ import * as themes from '../core/themes/theme-definitions.js';
2
2
  export function getAvailableThemes() {
3
3
  return themes.availableThemes;
4
4
  }
5
- export function getThemeContent(themeName) {
5
+ export function getThemeContent(themeName, corePath) {
6
6
  const content = (() => {
7
7
  switch (themeName) {
8
8
  case 'stone':
9
- return themes.stone;
9
+ return themes.stone(corePath);
10
10
  case 'zinc':
11
- return themes.zinc;
11
+ return themes.zinc(corePath);
12
12
  case 'gray':
13
- return themes.gray;
13
+ return themes.gray(corePath);
14
14
  case 'slate':
15
- return themes.slate;
15
+ return themes.slate(corePath);
16
16
  case 'neutral':
17
17
  default:
18
- return themes.neutral;
18
+ return themes.neutral(corePath);
19
19
  }
20
20
  })();
21
21
  return content.trim();