zard-cli 1.0.0-beta.103 → 1.0.0-beta.104

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 (234) hide show
  1. package/commands/add/component-installer.d.ts +2 -0
  2. package/commands/add/component-installer.d.ts.map +1 -1
  3. package/commands/add/component-installer.js +9 -4
  4. package/commands/add/component-installer.js.map +1 -1
  5. package/commands/add/component-selector.d.ts +6 -0
  6. package/commands/add/component-selector.d.ts.map +1 -1
  7. package/commands/add/component-selector.js +9 -27
  8. package/commands/add/component-selector.js.map +1 -1
  9. package/commands/add/dark-mode-setup.d.ts.map +1 -1
  10. package/commands/add/dark-mode-setup.js +2 -11
  11. package/commands/add/dark-mode-setup.js.map +1 -1
  12. package/commands/add/dependency-resolver.d.ts +2 -1
  13. package/commands/add/dependency-resolver.d.ts.map +1 -1
  14. package/commands/add/dependency-resolver.js +19 -4
  15. package/commands/add/dependency-resolver.js.map +1 -1
  16. package/commands/add/index.d.ts.map +1 -1
  17. package/commands/add/index.js +116 -86
  18. package/commands/add/index.js.map +1 -1
  19. package/commands/add/wizard.d.ts +31 -0
  20. package/commands/add/wizard.d.ts.map +1 -0
  21. package/commands/add/wizard.js +289 -0
  22. package/commands/add/wizard.js.map +1 -0
  23. package/commands/init/config-prompter.d.ts +49 -3
  24. package/commands/init/config-prompter.d.ts.map +1 -1
  25. package/commands/init/config-prompter.js +84 -74
  26. package/commands/init/config-prompter.js.map +1 -1
  27. package/commands/init/dependencies.d.ts +1 -8
  28. package/commands/init/dependencies.d.ts.map +1 -1
  29. package/commands/init/dependencies.js +47 -18
  30. package/commands/init/dependencies.js.map +1 -1
  31. package/commands/init/index.d.ts.map +1 -1
  32. package/commands/init/index.js +147 -81
  33. package/commands/init/index.js.map +1 -1
  34. package/commands/init/project-kind.d.ts +82 -0
  35. package/commands/init/project-kind.d.ts.map +1 -0
  36. package/commands/init/project-kind.js +166 -0
  37. package/commands/init/project-kind.js.map +1 -0
  38. package/commands/init/steps.d.ts +16 -0
  39. package/commands/init/steps.d.ts.map +1 -0
  40. package/commands/init/steps.js +153 -0
  41. package/commands/init/steps.js.map +1 -0
  42. package/commands/init/tailwind-setup.d.ts +9 -2
  43. package/commands/init/tailwind-setup.d.ts.map +1 -1
  44. package/commands/init/tailwind-setup.js +33 -12
  45. package/commands/init/tailwind-setup.js.map +1 -1
  46. package/commands/init/tsconfig-updater.d.ts +8 -1
  47. package/commands/init/tsconfig-updater.d.ts.map +1 -1
  48. package/commands/init/tsconfig-updater.js +30 -11
  49. package/commands/init/tsconfig-updater.js.map +1 -1
  50. package/commands/init/update-angular-config.d.ts.map +1 -1
  51. package/commands/init/update-angular-config.js +28 -50
  52. package/commands/init/update-angular-config.js.map +1 -1
  53. package/commands/init/vite-setup.d.ts +10 -0
  54. package/commands/init/vite-setup.d.ts.map +1 -0
  55. package/commands/init/vite-setup.js +60 -0
  56. package/commands/init/vite-setup.js.map +1 -0
  57. package/commands/init/wizard.d.ts +30 -0
  58. package/commands/init/wizard.d.ts.map +1 -0
  59. package/commands/init/wizard.js +560 -0
  60. package/commands/init/wizard.js.map +1 -0
  61. package/core/icons/families.d.ts +38 -0
  62. package/core/icons/families.d.ts.map +1 -0
  63. package/core/icons/families.js +26 -0
  64. package/core/icons/families.js.map +1 -0
  65. package/core/icons/icon-map.d.ts +22 -0
  66. package/core/icons/icon-map.d.ts.map +1 -0
  67. package/core/icons/icon-map.js +125 -0
  68. package/core/icons/icon-map.js.map +1 -0
  69. package/core/icons/index.d.ts +107 -0
  70. package/core/icons/index.d.ts.map +1 -0
  71. package/core/icons/index.js +183 -0
  72. package/core/icons/index.js.map +1 -0
  73. package/core/registry/registry-data.d.ts.map +1 -1
  74. package/core/registry/registry-data.js +8 -0
  75. package/core/registry/registry-data.js.map +1 -1
  76. package/index.js +5 -3
  77. package/index.js.map +1 -1
  78. package/package.json +1 -4
  79. package/ui/blocks.d.ts +70 -0
  80. package/ui/blocks.d.ts.map +1 -0
  81. package/ui/blocks.js +116 -0
  82. package/ui/blocks.js.map +1 -0
  83. package/ui/brand.d.ts +14 -0
  84. package/ui/brand.d.ts.map +1 -0
  85. package/ui/brand.js +35 -0
  86. package/ui/brand.js.map +1 -0
  87. package/ui/engine/animation/index.d.ts +39 -0
  88. package/ui/engine/animation/index.d.ts.map +1 -0
  89. package/ui/engine/animation/index.js +103 -0
  90. package/ui/engine/animation/index.js.map +1 -0
  91. package/ui/engine/ansi/index.d.ts +52 -0
  92. package/ui/engine/ansi/index.d.ts.map +1 -0
  93. package/ui/engine/ansi/index.js +117 -0
  94. package/ui/engine/ansi/index.js.map +1 -0
  95. package/ui/engine/components/index.d.ts +211 -0
  96. package/ui/engine/components/index.d.ts.map +1 -0
  97. package/ui/engine/components/index.js +109 -0
  98. package/ui/engine/components/index.js.map +1 -0
  99. package/ui/engine/cursor/index.d.ts +17 -0
  100. package/ui/engine/cursor/index.d.ts.map +1 -0
  101. package/ui/engine/cursor/index.js +41 -0
  102. package/ui/engine/cursor/index.js.map +1 -0
  103. package/ui/engine/diff/index.d.ts +27 -0
  104. package/ui/engine/diff/index.d.ts.map +1 -0
  105. package/ui/engine/diff/index.js +57 -0
  106. package/ui/engine/diff/index.js.map +1 -0
  107. package/ui/engine/events/index.d.ts +24 -0
  108. package/ui/engine/events/index.d.ts.map +1 -0
  109. package/ui/engine/events/index.js +60 -0
  110. package/ui/engine/events/index.js.map +1 -0
  111. package/ui/engine/focus/index.d.ts +25 -0
  112. package/ui/engine/focus/index.d.ts.map +1 -0
  113. package/ui/engine/focus/index.js +77 -0
  114. package/ui/engine/focus/index.js.map +1 -0
  115. package/ui/engine/frame/index.d.ts +48 -0
  116. package/ui/engine/frame/index.d.ts.map +1 -0
  117. package/ui/engine/frame/index.js +0 -0
  118. package/ui/engine/frame/index.js.map +1 -0
  119. package/ui/engine/index.d.ts +28 -0
  120. package/ui/engine/index.d.ts.map +1 -0
  121. package/ui/engine/index.js +28 -0
  122. package/ui/engine/index.js.map +1 -0
  123. package/ui/engine/input/index.d.ts +36 -0
  124. package/ui/engine/input/index.d.ts.map +1 -0
  125. package/ui/engine/input/index.js +224 -0
  126. package/ui/engine/input/index.js.map +1 -0
  127. package/ui/engine/layout/index.d.ts +42 -0
  128. package/ui/engine/layout/index.d.ts.map +1 -0
  129. package/ui/engine/layout/index.js +241 -0
  130. package/ui/engine/layout/index.js.map +1 -0
  131. package/ui/engine/renderer/index.d.ts +43 -0
  132. package/ui/engine/renderer/index.d.ts.map +1 -0
  133. package/ui/engine/renderer/index.js +619 -0
  134. package/ui/engine/renderer/index.js.map +1 -0
  135. package/ui/engine/scheduler/index.d.ts +22 -0
  136. package/ui/engine/scheduler/index.d.ts.map +1 -0
  137. package/ui/engine/scheduler/index.js +77 -0
  138. package/ui/engine/scheduler/index.js.map +1 -0
  139. package/ui/engine/screen/index.d.ts +39 -0
  140. package/ui/engine/screen/index.d.ts.map +1 -0
  141. package/ui/engine/screen/index.js +255 -0
  142. package/ui/engine/screen/index.js.map +1 -0
  143. package/ui/engine/terminal/index.d.ts +84 -0
  144. package/ui/engine/terminal/index.d.ts.map +1 -0
  145. package/ui/engine/terminal/index.js +235 -0
  146. package/ui/engine/terminal/index.js.map +1 -0
  147. package/ui/engine/testing/index.d.ts +27 -0
  148. package/ui/engine/testing/index.d.ts.map +1 -0
  149. package/ui/engine/testing/index.js +63 -0
  150. package/ui/engine/testing/index.js.map +1 -0
  151. package/ui/engine/theme/index.d.ts +27 -0
  152. package/ui/engine/theme/index.d.ts.map +1 -0
  153. package/ui/engine/theme/index.js +129 -0
  154. package/ui/engine/theme/index.js.map +1 -0
  155. package/ui/engine/utils/index.d.ts +12 -0
  156. package/ui/engine/utils/index.d.ts.map +1 -0
  157. package/ui/engine/utils/index.js +143 -0
  158. package/ui/engine/utils/index.js.map +1 -0
  159. package/ui/gate.d.ts +19 -0
  160. package/ui/gate.d.ts.map +1 -0
  161. package/ui/gate.js +36 -0
  162. package/ui/gate.js.map +1 -0
  163. package/ui/index.d.ts +18 -0
  164. package/ui/index.d.ts.map +1 -0
  165. package/ui/index.js +18 -0
  166. package/ui/index.js.map +1 -0
  167. package/ui/log-sink.d.ts +24 -0
  168. package/ui/log-sink.d.ts.map +1 -0
  169. package/ui/log-sink.js +35 -0
  170. package/ui/log-sink.js.map +1 -0
  171. package/ui/output.d.ts +14 -0
  172. package/ui/output.d.ts.map +1 -0
  173. package/ui/output.js +28 -0
  174. package/ui/output.js.map +1 -0
  175. package/ui/report.d.ts +30 -0
  176. package/ui/report.d.ts.map +1 -0
  177. package/ui/report.js +45 -0
  178. package/ui/report.js.map +1 -0
  179. package/ui/runner.d.ts +66 -0
  180. package/ui/runner.d.ts.map +1 -0
  181. package/ui/runner.js +135 -0
  182. package/ui/runner.js.map +1 -0
  183. package/ui/style.d.ts +24 -0
  184. package/ui/style.d.ts.map +1 -0
  185. package/ui/style.js +44 -0
  186. package/ui/style.js.map +1 -0
  187. package/ui/testing/fake-tty.d.ts +26 -0
  188. package/ui/testing/fake-tty.d.ts.map +1 -0
  189. package/ui/testing/fake-tty.js +61 -0
  190. package/ui/testing/fake-tty.js.map +1 -0
  191. package/ui/text-input.d.ts +30 -0
  192. package/ui/text-input.d.ts.map +1 -0
  193. package/ui/text-input.js +87 -0
  194. package/ui/text-input.js.map +1 -0
  195. package/ui/theme.d.ts +10 -0
  196. package/ui/theme.d.ts.map +1 -0
  197. package/ui/theme.js +20 -0
  198. package/ui/theme.js.map +1 -0
  199. package/utils/config.d.ts +26 -0
  200. package/utils/config.d.ts.map +1 -1
  201. package/utils/config.js +41 -1
  202. package/utils/config.js.map +1 -1
  203. package/utils/errors.d.ts +11 -0
  204. package/utils/errors.d.ts.map +1 -1
  205. package/utils/errors.js +14 -0
  206. package/utils/errors.js.map +1 -1
  207. package/utils/get-project-info.d.ts +29 -0
  208. package/utils/get-project-info.d.ts.map +1 -1
  209. package/utils/get-project-info.js +176 -1
  210. package/utils/get-project-info.js.map +1 -1
  211. package/utils/icon-catalog.d.ts +33 -0
  212. package/utils/icon-catalog.d.ts.map +1 -0
  213. package/utils/icon-catalog.js +62 -0
  214. package/utils/icon-catalog.js.map +1 -0
  215. package/utils/logger.d.ts +13 -1
  216. package/utils/logger.d.ts.map +1 -1
  217. package/utils/logger.js +95 -15
  218. package/utils/logger.js.map +1 -1
  219. package/utils/package-manager.d.ts +42 -1
  220. package/utils/package-manager.d.ts.map +1 -1
  221. package/utils/package-manager.js +204 -11
  222. package/utils/package-manager.js.map +1 -1
  223. package/utils/registry.d.ts +42 -2
  224. package/utils/registry.d.ts.map +1 -1
  225. package/utils/registry.js +51 -9
  226. package/utils/registry.js.map +1 -1
  227. package/utils/schema-version.d.ts +20 -0
  228. package/utils/schema-version.d.ts.map +1 -0
  229. package/utils/schema-version.js +27 -0
  230. package/utils/schema-version.js.map +1 -0
  231. package/utils/source-file.d.ts +40 -0
  232. package/utils/source-file.d.ts.map +1 -0
  233. package/utils/source-file.js +104 -0
  234. package/utils/source-file.js.map +1 -0
@@ -1,7 +1,48 @@
1
1
  type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';
2
- export declare function detectPackageManager(): Promise<PackageManager>;
2
+ /**
3
+ * Qual gerenciador o *projeto* usa.
4
+ *
5
+ * A ordem importa. `npm_config_user_agent` descreve como a CLI foi chamada
6
+ * (`npx` sempre diz npm), não o que o projeto usa — confiar nele primeiro fazia
7
+ * um projeto bun receber `packageManager: "npm"` no components.json e ganhar um
8
+ * package-lock.json ao lado do bun.lock. O projeto responde por si: primeiro o
9
+ * campo `packageManager` do package.json, depois os lockfiles.
10
+ */
11
+ export declare function detectPackageManager(cwd?: string): Promise<PackageManager>;
12
+ /**
13
+ * Como sugerir que o usuário rode a CLI de novo.
14
+ *
15
+ * Aqui a pergunta é outra: não é qual gerenciador o projeto usa para instalar
16
+ * dependências, e sim por onde a CLI acabou de ser executada. Quem chamou
17
+ * `npx zard-cli init` num projeto bun não espera terminar lendo `bunx` — e o
18
+ * `npx` que ele já usou funciona. Só quando não dá para saber é que o
19
+ * gerenciador do projeto responde.
20
+ */
21
+ export declare function suggestedRunner(packageManager: PackageManager): string;
3
22
  export declare function getPackageManager(cwd?: string): Promise<'npm' | 'yarn' | 'pnpm' | 'bun'>;
4
23
  export declare function getInstallCommand(packageManager: string, isDev?: boolean): Promise<string[]>;
5
24
  export declare function installPackages(packages: string[], cwd: string, packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun', isDev?: boolean, legacyPeerDeps?: boolean): Promise<void>;
25
+ /**
26
+ * Instala o lote e, se o gerenciador recusar a árvore por conflito de peers,
27
+ * repete com a checagem relaxada.
28
+ *
29
+ * A queda fica registrada para o resto da execução: quando o primeiro lote
30
+ * precisou do fallback, os seguintes vão precisar pelo mesmo motivo, e a
31
+ * tentativa que já se sabe condenada custa uma resolução inteira da árvore.
32
+ */
33
+ export declare function installPackagesWithRetry(packages: string[], cwd: string, packageManager: PackageManager, isDev?: boolean): Promise<void>;
34
+ /**
35
+ * Descarta do lote os pacotes que o projeto já declara e já resolve.
36
+ *
37
+ * O gerenciador cobra caro por invocação — revalida a árvore inteira mesmo
38
+ * quando não há nada a fazer —, então o ganho não está em acelerar a instalação
39
+ * e sim em não chamá-la. Um `add` em projeto já inicializado pede justamente as
40
+ * dependências que o `init` colocou lá.
41
+ *
42
+ * O filtro é deliberadamente conservador: na dúvida o pacote continua no lote e
43
+ * quem decide é o gerenciador. Comparar apenas a major basta porque as versões
44
+ * que a CLI pede são sempre da forma `^N`.
45
+ */
46
+ export declare function filterInstalledPackages(packages: string[], cwd: string): Promise<string[]>;
6
47
  export {};
7
48
  //# sourceMappingURL=package-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAGA,KAAK,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAItD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAkBpE;AAED,wBAAsB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,CAG7G;AAED,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYhG;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,EAC/C,KAAK,UAAQ,EACb,cAAc,UAAQ,GACrB,OAAO,CAAC,IAAI,CAAC,CAWf"}
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAQA,KAAK,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAYtD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB/F;AASD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAStE;AAYD,wBAAsB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,CAG7G;AAED,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYhG;AAaD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,EAC/C,KAAK,UAAQ,EACb,cAAc,UAAQ,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAcD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,KAAK,UAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAchG"}
@@ -1,9 +1,35 @@
1
1
  import { detect } from '@antfu/ni';
2
+ import { isCapturing } from '../ui/log-sink.js';
2
3
  import { getConfig } from '../utils/config.js';
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';
3
8
  let cachedPackageManager = null;
4
- export async function detectPackageManager() {
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()) {
5
25
  if (cachedPackageManager)
6
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);
7
33
  const userAgent = process.env.npm_config_user_agent || '';
8
34
  if (userAgent.includes('bun'))
9
35
  return (cachedPackageManager = 'bun');
@@ -11,16 +37,45 @@ export async function detectPackageManager() {
11
37
  return (cachedPackageManager = 'pnpm');
12
38
  if (userAgent.includes('yarn'))
13
39
  return (cachedPackageManager = 'yarn');
14
- if (userAgent.includes('npm'))
15
- return (cachedPackageManager = 'npm');
16
- const agent = await detect({ programmatic: true });
17
- if (agent === 'yarn@berry')
18
- return (cachedPackageManager = 'yarn');
19
- if (agent && ['npm', 'yarn', 'pnpm', 'bun'].includes(agent)) {
20
- return (cachedPackageManager = agent);
21
- }
22
40
  return (cachedPackageManager = 'npm');
23
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;
77
+ }
78
+ }
24
79
  export async function getPackageManager(cwd = process.cwd()) {
25
80
  const config = await getConfig(cwd);
26
81
  return config?.packageManager ?? 'npm';
@@ -38,13 +93,151 @@ export async function getInstallCommand(packageManager, isDev = false) {
38
93
  return isDev ? ['install', '-D'] : ['install'];
39
94
  }
40
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
+ }
41
106
  export async function installPackages(packages, cwd, packageManager, isDev = false, legacyPeerDeps = false) {
42
107
  const { execa } = await import('execa');
43
108
  const installCmd = await getInstallCommand(packageManager, isDev);
44
- const args = [...installCmd, ...packages];
109
+ const args = [...installCmd, ...packages, ...speedFlags(packageManager)];
45
110
  if (legacyPeerDeps && packageManager === 'npm') {
46
111
  args.push('--legacy-peer-deps');
47
112
  }
48
- 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
+ }
49
242
  }
50
243
  //# sourceMappingURL=package-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,IAAI,oBAAoB,GAA0B,IAAI,CAAC;AAEvD,MAAM,SAAS,GAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAE5E,SAAS,gBAAgB,CAAC,KAAgC;IACxD,iEAAiE;IACjE,MAAM,IAAI,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAsB,CAAC,CAAC,CAAC,CAAE,IAAuB,CAAC,CAAC,CAAC,IAAI,CAAC;AACtF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACpE,IAAI,oBAAoB;QAAE,OAAO,oBAAoB,CAAC;IAEtD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,QAAQ;QAAE,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACjF,IAAI,YAAY;QAAE,OAAO,CAAC,oBAAoB,GAAG,YAAY,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAE1D,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,oBAAoB,GAAG,KAAK,CAAC,CAAC;IACrE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,CAAC;IACvE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,CAAC;IAEvE,OAAO,CAAC,oBAAoB,GAAG,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,MAAM,GAAmC;IAC7C,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,MAAM;CACZ,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,cAA8B;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAE1D,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACrD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACrD,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAEnD,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC;AAChC,CAAC;AAED,6FAA6F;AAC7F,KAAK,UAAU,uBAAuB,CAAC,GAAW;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACpF,OAAO,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,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;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,cAA8B;IAChD,OAAO,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAkB,EAClB,GAAW,EACX,cAA+C,EAC/C,KAAK,GAAG,KAAK,EACb,cAAc,GAAG,KAAK;IAEtB,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,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IAEzE,IAAI,cAAc,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,cAAc,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7C,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,4BAA4B;IAC5B,IAAI,WAAW,EAAE,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,GAAG,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,0EAA0E;YAC1E,uEAAuE;YACvE,wEAAwE;YACxE,iCAAiC;YACjC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE;gBAC/C,GAAG;gBACH,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,uEAAuE;YACvE,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,aAAa,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO;IACT,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,2DAA2D;IAC3D,MAAM,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAA2D,CAAC;IAC5G,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,uGAAuG;AACvG,SAAS,aAAa,CAAC,cAA8B;IACnD,OAAO,cAAc,KAAK,KAAK,IAAI,cAAc,KAAK,MAAM,CAAC;AAC/D,CAAC;AAED,IAAI,qBAAqB,GAAG,KAAK,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,QAAkB,EAClB,GAAW,EACX,cAA8B,EAC9B,KAAK,GAAG,KAAK;IAEb,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,IAAI,qBAAqB,EAAE,CAAC;QAC1B,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAE,MAAM,KAAK,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACxF,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAClE,qBAAqB,GAAG,IAAI,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAkB,EAAE,GAAW;IAC3E,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE/B,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC5B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,6EAA6E;IAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAEvD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACpF,OAAO,EAAE,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,YAAY,CAAC,IAAY,EAAE,GAAW;IAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE5B,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAElE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACjC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -1,5 +1,23 @@
1
+ import { type IconFamily } from '../core/icons/index.js';
1
2
  import type { Config } from '../utils/config.js';
2
3
  export declare const DEFAULT_REGISTRY_URL: string;
4
+ /**
5
+ * Os ícones que um componente desenha, como o registry os publica.
6
+ *
7
+ * `family` é a família em que os arquivos estão escritos — quem instala com
8
+ * outra família em `components.json` sabe, por este campo, que precisa
9
+ * reescrevê-los. Ausente nos itens publicados antes desta propriedade.
10
+ */
11
+ export interface RegistryIcons {
12
+ family: string;
13
+ symbols: string[];
14
+ tokens: string[];
15
+ /** Os ícones que só aparecem nos demos. Ausente no índice, que não os carrega. */
16
+ demos?: {
17
+ symbols: string[];
18
+ tokens: string[];
19
+ };
20
+ }
3
21
  export interface RegistryItem {
4
22
  name: string;
5
23
  type: 'registry:component';
@@ -11,9 +29,12 @@ export interface RegistryItem {
11
29
  dependencies?: string[];
12
30
  devDependencies?: string[];
13
31
  registryDependencies?: string[];
32
+ icons?: RegistryIcons;
14
33
  }
15
34
  export interface RegistryIndex {
16
35
  $schema: string;
36
+ /** A forma do arquivo. Ausente nos registries anteriores ao campo. */
37
+ schemaVersion?: number;
17
38
  name: string;
18
39
  homepage: string;
19
40
  version: string;
@@ -24,15 +45,34 @@ export interface RegistryIndex {
24
45
  dependencies?: string[];
25
46
  devDependencies?: string[];
26
47
  registryDependencies?: string[];
48
+ icons?: RegistryIcons;
27
49
  files: string[];
28
50
  }>;
29
51
  }
52
+ /**
53
+ * A família em que os arquivos do item estão escritos.
54
+ *
55
+ * Um item sem `icons` — publicado antes da propriedade — está em lucide, que
56
+ * era a única possibilidade. Um valor desconhecido também: preferir o palpite
57
+ * certo a recusar a instalação por causa de um campo novo.
58
+ */
59
+ export declare function sourceFamilyOf(item: Pick<RegistryItem, 'icons'>): IconFamily;
30
60
  export declare function getRegistryUrl(config?: Config): string;
31
61
  export declare function validateRegistryUrl(url: string): void;
32
62
  export declare function fetchRegistryIndex(registryUrl?: string): Promise<RegistryIndex>;
33
63
  export declare function invalidateRegistryCache(): void;
34
64
  export declare function fetchComponentFromRegistry(componentName: string, registryUrl?: string): Promise<RegistryItem>;
35
65
  export declare function getAvailableComponents(registryUrl?: string): Promise<string[]>;
36
- export declare function transformContent(content: string, config: Config): string;
37
- export declare function fetchComponent(componentName: string, config: Config, registryUrl?: string): Promise<RegistryItem>;
66
+ export interface TransformOptions {
67
+ /**
68
+ * O destino veio de `--path`, fora do alias configurado.
69
+ *
70
+ * Nesse caso os componentes do lote viram vizinhos no disco, e é o caminho
71
+ * relativo que resolve — o alias apontaria para a pasta onde eles não estão.
72
+ * `utils` e `core` continuam no alias, porque quem os instalou foi o `init`.
73
+ */
74
+ readonly siblingComponents?: boolean;
75
+ }
76
+ export declare function transformContent(content: string, config: Config, options?: TransformOptions): string;
77
+ export declare function fetchComponent(componentName: string, config: Config, registryUrl?: string, options?: TransformOptions): Promise<RegistryItem>;
38
78
  //# 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;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;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAyCxE;AAED,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC5G,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAOnD,eAAO,MAAM,oBAAoB,QAE0D,CAAC;AAE5F;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kFAAkF;IAClF,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACjD;AAED,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;IAChC,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,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,CAAC,EAAE,aAAa,CAAC;QACtB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;CACJ;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,UAAU,CAG5E;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,CAcrF;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,CAoCvB"}
package/utils/registry.js CHANGED
@@ -1,8 +1,23 @@
1
1
  import { DEFAULT_REGISTRY_URL as BUILD_REGISTRY_URL } from '../config/registry-config.js';
2
+ import { isIconFamily, retargetIcons, SOURCE_ICON_FAMILY } from '../core/icons/index.js';
2
3
  import { ConfigError } from '../utils/errors.js';
3
4
  import { fetchJson } from '../utils/http-client.js';
5
+ import { iconCatalog } from '../utils/icon-catalog.js';
6
+ import { logger } from '../utils/logger.js';
7
+ import { assertSupportedSchema } from '../utils/schema-version.js';
4
8
  export const DEFAULT_REGISTRY_URL = process.env['ZARD_REGISTRY_URL'] ||
5
9
  (BUILD_REGISTRY_URL !== '__REGISTRY_URL__' ? BUILD_REGISTRY_URL : 'https://zardui.com/r');
10
+ /**
11
+ * A família em que os arquivos do item estão escritos.
12
+ *
13
+ * Um item sem `icons` — publicado antes da propriedade — está em lucide, que
14
+ * era a única possibilidade. Um valor desconhecido também: preferir o palpite
15
+ * certo a recusar a instalação por causa de um campo novo.
16
+ */
17
+ export function sourceFamilyOf(item) {
18
+ const family = item.icons?.family;
19
+ return family !== undefined && isIconFamily(family, iconCatalog()) ? family : SOURCE_ICON_FAMILY;
20
+ }
6
21
  export function getRegistryUrl(config) {
7
22
  return config?.registryUrl || DEFAULT_REGISTRY_URL;
8
23
  }
@@ -30,6 +45,7 @@ export async function fetchRegistryIndex(registryUrl) {
30
45
  }
31
46
  const url = `${baseUrl}/registry.json`;
32
47
  const data = await fetchJson(url);
48
+ assertSupportedSchema(data.schemaVersion, 'registry.json');
33
49
  registryIndexCache = { data, timestamp: Date.now() };
34
50
  return data;
35
51
  }
@@ -45,9 +61,18 @@ export async function getAvailableComponents(registryUrl) {
45
61
  const index = await fetchRegistryIndex(registryUrl);
46
62
  return index.items.map(item => item.name);
47
63
  }
48
- export function transformContent(content, config) {
64
+ /** Sem isto, um alias digitado como `@/ui/components/` produz `@/ui/components//button`. */
65
+ function trimSlashes(alias) {
66
+ return alias.replace(/\/+$/, '');
67
+ }
68
+ export function transformContent(content, config, options = {}) {
49
69
  let transformed = content;
50
- const { aliases } = config;
70
+ const aliases = {
71
+ components: options.siblingComponents ? '..' : trimSlashes(config.aliases.components),
72
+ utils: trimSlashes(config.aliases.utils),
73
+ core: trimSlashes(config.aliases.core),
74
+ services: trimSlashes(config.aliases.services),
75
+ };
51
76
  // Replace utils imports
52
77
  transformed = transformed.replace(/from ['"]\.\.\/\.\.\/shared\/utils\/utils['"]/g, `from '${aliases.utils}/merge-classes'`);
53
78
  transformed = transformed.replace(/from ['"]\.\.\/\.\.\/shared\/utils\/number['"]/g, `from '${aliases.utils}/number'`);
@@ -62,20 +87,37 @@ export function transformContent(content, config) {
62
87
  if (!value) {
63
88
  continue;
64
89
  }
65
- const regex = new RegExp(`(['"])@\\/shared\\/${key}\\/([\\w\\-\\/.]+)\\1`, 'g');
66
- transformed = transformed.replace(regex, `$1${value}/$2$1`);
90
+ // O subpath é opcional: `card.component.ts` importa o barrel direto
91
+ // (`from '@/shared/core'`). Exigindo `/algo` depois da chave, esse import
92
+ // escapava da substituição e o componente instalado continuava apontando
93
+ // para `@/shared/core` — uma pasta que não existe com alias customizado.
94
+ const regex = new RegExp(`(['"])@\\/shared\\/${key}(\\/[\\w\\-\\/.]+)?\\1`, 'g');
95
+ transformed = transformed.replace(regex, (_match, quote, subpath) => {
96
+ return `${quote}${value}${subpath ?? ''}${quote}`;
97
+ });
67
98
  }
68
99
  return transformed;
69
100
  }
70
- export async function fetchComponent(componentName, config, registryUrl) {
101
+ export async function fetchComponent(componentName, config, registryUrl, options = {}) {
71
102
  const item = await fetchComponentFromRegistry(componentName, registryUrl);
72
103
  if (!item.files || !Array.isArray(item.files)) {
73
104
  throw new ConfigError(`Component "${componentName}" has no files in the registry`);
74
105
  }
75
- const transformedFiles = item.files.map(file => ({
76
- name: file.name,
77
- content: transformContent(file.content, config),
78
- }));
106
+ const sourceFamily = sourceFamilyOf(item);
107
+ const missing = new Set();
108
+ const transformedFiles = item.files.map(file => {
109
+ const retargeted = retargetIcons(transformContent(file.content, config, options), sourceFamily, config.icons, iconCatalog());
110
+ for (const symbol of retargeted.missing)
111
+ missing.add(symbol);
112
+ return { name: file.name, content: retargeted.content };
113
+ });
114
+ // Um ícone sem equivalente na família escolhida fica no símbolo original, e o
115
+ // import dele não resolve mais. Falhar a instalação inteira por causa disso
116
+ // seria pior: o resto do componente está correto e o conserto é uma linha.
117
+ if (missing.size > 0) {
118
+ logger.warn(`"${componentName}" uses icons that ${config.icons} does not provide: ${[...missing].sort().join(', ')}. ` +
119
+ 'They were left untouched — replace them by hand.');
120
+ }
79
121
  return {
80
122
  ...item,
81
123
  files: transformedFiles,
@@ -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,20 @@
1
+ /**
2
+ * A versão do FORMATO do registry que esta CLI entende.
3
+ *
4
+ * Não confundir com a versão do pacote, que o índice também publica: aquela diz
5
+ * de que release o conteúdo saiu, esta diz que forma ele tem. Sem separá-las não
6
+ * havia como o registry mudar de forma sem quebrar em silêncio quem já estava
7
+ * instalado — a CLI leria `files` de um item com outro shape e erraria calada.
8
+ *
9
+ * Sobe quando a mudança quebra quem lê: campo removido, significado alterado,
10
+ * item reorganizado. Campo novo e opcional não sobe nada.
11
+ */
12
+ export declare const SUPPORTED_SCHEMA_VERSION = 1;
13
+ /**
14
+ * Recusa um documento mais novo do que esta CLI sabe ler.
15
+ *
16
+ * A ausência do campo é um registry anterior à existência dele, que por
17
+ * definição é a versão 1.
18
+ */
19
+ export declare function assertSupportedSchema(schemaVersion: number | undefined, source: string): void;
20
+ //# sourceMappingURL=schema-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-version.d.ts","sourceRoot":"","sources":["../../src/utils/schema-version.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAS7F"}
@@ -0,0 +1,27 @@
1
+ import { SchemaVersionError } from '../utils/errors.js';
2
+ /**
3
+ * A versão do FORMATO do registry que esta CLI entende.
4
+ *
5
+ * Não confundir com a versão do pacote, que o índice também publica: aquela diz
6
+ * de que release o conteúdo saiu, esta diz que forma ele tem. Sem separá-las não
7
+ * havia como o registry mudar de forma sem quebrar em silêncio quem já estava
8
+ * instalado — a CLI leria `files` de um item com outro shape e erraria calada.
9
+ *
10
+ * Sobe quando a mudança quebra quem lê: campo removido, significado alterado,
11
+ * item reorganizado. Campo novo e opcional não sobe nada.
12
+ */
13
+ export const SUPPORTED_SCHEMA_VERSION = 1;
14
+ /**
15
+ * Recusa um documento mais novo do que esta CLI sabe ler.
16
+ *
17
+ * A ausência do campo é um registry anterior à existência dele, que por
18
+ * definição é a versão 1.
19
+ */
20
+ export function assertSupportedSchema(schemaVersion, source) {
21
+ const version = schemaVersion ?? 1;
22
+ if (version > SUPPORTED_SCHEMA_VERSION) {
23
+ throw new SchemaVersionError(`This registry publishes ${source} in format v${version}, and this CLI reads up to v${SUPPORTED_SCHEMA_VERSION}. ` +
24
+ 'Update it with `npm i -g zard-cli@latest`, or run it through npx, which always fetches the latest.');
25
+ }
26
+ }
27
+ //# sourceMappingURL=schema-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-version.js","sourceRoot":"","sources":["../../src/utils/schema-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,aAAiC,EAAE,MAAc;IACrF,MAAM,OAAO,GAAG,aAAa,IAAI,CAAC,CAAC;IAEnC,IAAI,OAAO,GAAG,wBAAwB,EAAE,CAAC;QACvC,MAAM,IAAI,kBAAkB,CAC1B,2BAA2B,MAAM,eAAe,OAAO,+BAA+B,wBAAwB,IAAI;YAChH,oGAAoG,CACvG,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -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"}