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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +39 -167
  2. package/commands/add/component-installer.d.ts +4 -1
  3. package/commands/add/component-installer.d.ts.map +1 -1
  4. package/commands/add/component-installer.js +33 -5
  5. package/commands/add/component-installer.js.map +1 -1
  6. package/commands/add/component-selector.d.ts +6 -0
  7. package/commands/add/component-selector.d.ts.map +1 -1
  8. package/commands/add/component-selector.js +9 -27
  9. package/commands/add/component-selector.js.map +1 -1
  10. package/commands/add/dark-mode-setup.d.ts +2 -0
  11. package/commands/add/dark-mode-setup.d.ts.map +1 -1
  12. package/commands/add/dark-mode-setup.js +5 -11
  13. package/commands/add/dark-mode-setup.js.map +1 -1
  14. package/commands/add/dependency-resolver.d.ts +3 -2
  15. package/commands/add/dependency-resolver.d.ts.map +1 -1
  16. package/commands/add/dependency-resolver.js +23 -9
  17. package/commands/add/dependency-resolver.js.map +1 -1
  18. package/commands/add/index.d.ts.map +1 -1
  19. package/commands/add/index.js +137 -85
  20. package/commands/add/index.js.map +1 -1
  21. package/commands/add/wizard.d.ts +31 -0
  22. package/commands/add/wizard.d.ts.map +1 -0
  23. package/commands/add/wizard.js +289 -0
  24. package/commands/add/wizard.js.map +1 -0
  25. package/commands/init/config-prompter.d.ts +61 -56
  26. package/commands/init/config-prompter.d.ts.map +1 -1
  27. package/commands/init/config-prompter.js +84 -74
  28. package/commands/init/config-prompter.js.map +1 -1
  29. package/commands/init/dependencies.d.ts +1 -8
  30. package/commands/init/dependencies.d.ts.map +1 -1
  31. package/commands/init/dependencies.js +47 -16
  32. package/commands/init/dependencies.js.map +1 -1
  33. package/commands/init/index.d.ts.map +1 -1
  34. package/commands/init/index.js +150 -86
  35. package/commands/init/index.js.map +1 -1
  36. package/commands/init/project-kind.d.ts +82 -0
  37. package/commands/init/project-kind.d.ts.map +1 -0
  38. package/commands/init/project-kind.js +166 -0
  39. package/commands/init/project-kind.js.map +1 -0
  40. package/commands/init/steps.d.ts +16 -0
  41. package/commands/init/steps.d.ts.map +1 -0
  42. package/commands/init/steps.js +153 -0
  43. package/commands/init/steps.js.map +1 -0
  44. package/commands/init/tailwind-setup.d.ts +9 -2
  45. package/commands/init/tailwind-setup.d.ts.map +1 -1
  46. package/commands/init/tailwind-setup.js +33 -9
  47. package/commands/init/tailwind-setup.js.map +1 -1
  48. package/commands/init/theme-loader.d.ts.map +1 -1
  49. package/commands/init/theme-loader.js +1 -3
  50. package/commands/init/theme-loader.js.map +1 -1
  51. package/commands/init/tsconfig-updater.d.ts +8 -1
  52. package/commands/init/tsconfig-updater.d.ts.map +1 -1
  53. package/commands/init/tsconfig-updater.js +30 -11
  54. package/commands/init/tsconfig-updater.js.map +1 -1
  55. package/commands/init/update-angular-config.d.ts.map +1 -1
  56. package/commands/init/update-angular-config.js +28 -47
  57. package/commands/init/update-angular-config.js.map +1 -1
  58. package/commands/init/vite-setup.d.ts +10 -0
  59. package/commands/init/vite-setup.d.ts.map +1 -0
  60. package/commands/init/vite-setup.js +60 -0
  61. package/commands/init/vite-setup.js.map +1 -0
  62. package/commands/init/wizard.d.ts +30 -0
  63. package/commands/init/wizard.d.ts.map +1 -0
  64. package/commands/init/wizard.js +560 -0
  65. package/commands/init/wizard.js.map +1 -0
  66. package/core/icons/families.d.ts +38 -0
  67. package/core/icons/families.d.ts.map +1 -0
  68. package/core/icons/families.js +26 -0
  69. package/core/icons/families.js.map +1 -0
  70. package/core/icons/icon-map.d.ts +24 -0
  71. package/core/icons/icon-map.d.ts.map +1 -0
  72. package/core/icons/icon-map.js +130 -0
  73. package/core/icons/icon-map.js.map +1 -0
  74. package/core/icons/index.d.ts +107 -0
  75. package/core/icons/index.d.ts.map +1 -0
  76. package/core/icons/index.js +183 -0
  77. package/core/icons/index.js.map +1 -0
  78. package/core/registry/registry-data.d.ts.map +1 -1
  79. package/core/registry/registry-data.js +571 -84
  80. package/core/registry/registry-data.js.map +1 -1
  81. package/core/themes/theme-definitions.d.ts +5 -5
  82. package/core/themes/theme-definitions.d.ts.map +1 -1
  83. package/core/themes/theme-definitions.js +65 -61
  84. package/core/themes/theme-definitions.js.map +1 -1
  85. package/index.js +40 -4
  86. package/index.js.map +1 -1
  87. package/package.json +4 -7
  88. package/ui/blocks.d.ts +70 -0
  89. package/ui/blocks.d.ts.map +1 -0
  90. package/ui/blocks.js +116 -0
  91. package/ui/blocks.js.map +1 -0
  92. package/ui/brand.d.ts +14 -0
  93. package/ui/brand.d.ts.map +1 -0
  94. package/ui/brand.js +35 -0
  95. package/ui/brand.js.map +1 -0
  96. package/ui/engine/animation/index.d.ts +39 -0
  97. package/ui/engine/animation/index.d.ts.map +1 -0
  98. package/ui/engine/animation/index.js +103 -0
  99. package/ui/engine/animation/index.js.map +1 -0
  100. package/ui/engine/ansi/index.d.ts +52 -0
  101. package/ui/engine/ansi/index.d.ts.map +1 -0
  102. package/ui/engine/ansi/index.js +117 -0
  103. package/ui/engine/ansi/index.js.map +1 -0
  104. package/ui/engine/components/index.d.ts +211 -0
  105. package/ui/engine/components/index.d.ts.map +1 -0
  106. package/ui/engine/components/index.js +109 -0
  107. package/ui/engine/components/index.js.map +1 -0
  108. package/ui/engine/cursor/index.d.ts +17 -0
  109. package/ui/engine/cursor/index.d.ts.map +1 -0
  110. package/ui/engine/cursor/index.js +41 -0
  111. package/ui/engine/cursor/index.js.map +1 -0
  112. package/ui/engine/diff/index.d.ts +27 -0
  113. package/ui/engine/diff/index.d.ts.map +1 -0
  114. package/ui/engine/diff/index.js +57 -0
  115. package/ui/engine/diff/index.js.map +1 -0
  116. package/ui/engine/events/index.d.ts +24 -0
  117. package/ui/engine/events/index.d.ts.map +1 -0
  118. package/ui/engine/events/index.js +60 -0
  119. package/ui/engine/events/index.js.map +1 -0
  120. package/ui/engine/focus/index.d.ts +25 -0
  121. package/ui/engine/focus/index.d.ts.map +1 -0
  122. package/ui/engine/focus/index.js +77 -0
  123. package/ui/engine/focus/index.js.map +1 -0
  124. package/ui/engine/frame/index.d.ts +48 -0
  125. package/ui/engine/frame/index.d.ts.map +1 -0
  126. package/ui/engine/frame/index.js +0 -0
  127. package/ui/engine/frame/index.js.map +1 -0
  128. package/ui/engine/index.d.ts +28 -0
  129. package/ui/engine/index.d.ts.map +1 -0
  130. package/ui/engine/index.js +28 -0
  131. package/ui/engine/index.js.map +1 -0
  132. package/ui/engine/input/index.d.ts +36 -0
  133. package/ui/engine/input/index.d.ts.map +1 -0
  134. package/ui/engine/input/index.js +224 -0
  135. package/ui/engine/input/index.js.map +1 -0
  136. package/ui/engine/layout/index.d.ts +42 -0
  137. package/ui/engine/layout/index.d.ts.map +1 -0
  138. package/ui/engine/layout/index.js +241 -0
  139. package/ui/engine/layout/index.js.map +1 -0
  140. package/ui/engine/renderer/index.d.ts +43 -0
  141. package/ui/engine/renderer/index.d.ts.map +1 -0
  142. package/ui/engine/renderer/index.js +619 -0
  143. package/ui/engine/renderer/index.js.map +1 -0
  144. package/ui/engine/scheduler/index.d.ts +22 -0
  145. package/ui/engine/scheduler/index.d.ts.map +1 -0
  146. package/ui/engine/scheduler/index.js +77 -0
  147. package/ui/engine/scheduler/index.js.map +1 -0
  148. package/ui/engine/screen/index.d.ts +39 -0
  149. package/ui/engine/screen/index.d.ts.map +1 -0
  150. package/ui/engine/screen/index.js +255 -0
  151. package/ui/engine/screen/index.js.map +1 -0
  152. package/ui/engine/terminal/index.d.ts +84 -0
  153. package/ui/engine/terminal/index.d.ts.map +1 -0
  154. package/ui/engine/terminal/index.js +235 -0
  155. package/ui/engine/terminal/index.js.map +1 -0
  156. package/ui/engine/testing/index.d.ts +27 -0
  157. package/ui/engine/testing/index.d.ts.map +1 -0
  158. package/ui/engine/testing/index.js +63 -0
  159. package/ui/engine/testing/index.js.map +1 -0
  160. package/ui/engine/theme/index.d.ts +27 -0
  161. package/ui/engine/theme/index.d.ts.map +1 -0
  162. package/ui/engine/theme/index.js +129 -0
  163. package/ui/engine/theme/index.js.map +1 -0
  164. package/ui/engine/utils/index.d.ts +12 -0
  165. package/ui/engine/utils/index.d.ts.map +1 -0
  166. package/ui/engine/utils/index.js +143 -0
  167. package/ui/engine/utils/index.js.map +1 -0
  168. package/ui/gate.d.ts +19 -0
  169. package/ui/gate.d.ts.map +1 -0
  170. package/ui/gate.js +36 -0
  171. package/ui/gate.js.map +1 -0
  172. package/ui/index.d.ts +18 -0
  173. package/ui/index.d.ts.map +1 -0
  174. package/ui/index.js +18 -0
  175. package/ui/index.js.map +1 -0
  176. package/ui/log-sink.d.ts +24 -0
  177. package/ui/log-sink.d.ts.map +1 -0
  178. package/ui/log-sink.js +35 -0
  179. package/ui/log-sink.js.map +1 -0
  180. package/ui/output.d.ts +14 -0
  181. package/ui/output.d.ts.map +1 -0
  182. package/ui/output.js +28 -0
  183. package/ui/output.js.map +1 -0
  184. package/ui/report.d.ts +30 -0
  185. package/ui/report.d.ts.map +1 -0
  186. package/ui/report.js +45 -0
  187. package/ui/report.js.map +1 -0
  188. package/ui/runner.d.ts +66 -0
  189. package/ui/runner.d.ts.map +1 -0
  190. package/ui/runner.js +135 -0
  191. package/ui/runner.js.map +1 -0
  192. package/ui/style.d.ts +24 -0
  193. package/ui/style.d.ts.map +1 -0
  194. package/ui/style.js +44 -0
  195. package/ui/style.js.map +1 -0
  196. package/ui/testing/fake-tty.d.ts +26 -0
  197. package/ui/testing/fake-tty.d.ts.map +1 -0
  198. package/ui/testing/fake-tty.js +61 -0
  199. package/ui/testing/fake-tty.js.map +1 -0
  200. package/ui/text-input.d.ts +30 -0
  201. package/ui/text-input.d.ts.map +1 -0
  202. package/ui/text-input.js +87 -0
  203. package/ui/text-input.js.map +1 -0
  204. package/ui/theme.d.ts +10 -0
  205. package/ui/theme.d.ts.map +1 -0
  206. package/ui/theme.js +20 -0
  207. package/ui/theme.js.map +1 -0
  208. package/utils/config.d.ts +52 -69
  209. package/utils/config.d.ts.map +1 -1
  210. package/utils/config.js +58 -7
  211. package/utils/config.js.map +1 -1
  212. package/utils/errors.d.ts +27 -0
  213. package/utils/errors.d.ts.map +1 -0
  214. package/utils/errors.js +45 -0
  215. package/utils/errors.js.map +1 -0
  216. package/utils/get-package-info.js +4 -4
  217. package/utils/get-package-info.js.map +1 -1
  218. package/utils/get-project-info.d.ts +30 -0
  219. package/utils/get-project-info.d.ts.map +1 -1
  220. package/utils/get-project-info.js +195 -6
  221. package/utils/get-project-info.js.map +1 -1
  222. package/utils/http-client.d.ts +8 -0
  223. package/utils/http-client.d.ts.map +1 -0
  224. package/utils/http-client.js +68 -0
  225. package/utils/http-client.js.map +1 -0
  226. package/utils/icon-catalog.d.ts +33 -0
  227. package/utils/icon-catalog.d.ts.map +1 -0
  228. package/utils/icon-catalog.js +62 -0
  229. package/utils/icon-catalog.js.map +1 -0
  230. package/utils/logger.d.ts +16 -1
  231. package/utils/logger.d.ts.map +1 -1
  232. package/utils/logger.js +104 -12
  233. package/utils/logger.js.map +1 -1
  234. package/utils/package-manager.d.ts +44 -1
  235. package/utils/package-manager.d.ts.map +1 -1
  236. package/utils/package-manager.js +210 -14
  237. package/utils/package-manager.js.map +1 -1
  238. package/utils/registry.d.ts +44 -2
  239. package/utils/registry.d.ts.map +1 -1
  240. package/utils/registry.js +82 -27
  241. package/utils/registry.js.map +1 -1
  242. package/utils/schema-version.d.ts +20 -0
  243. package/utils/schema-version.d.ts.map +1 -0
  244. package/utils/schema-version.js +27 -0
  245. package/utils/schema-version.js.map +1 -0
  246. package/utils/source-file.d.ts +40 -0
  247. package/utils/source-file.d.ts.map +1 -0
  248. package/utils/source-file.js +104 -0
  249. package/utils/source-file.js.map +1 -0
  250. package/utils/theme-selector.d.ts +1 -1
  251. package/utils/theme-selector.d.ts.map +1 -1
  252. package/utils/theme-selector.js +6 -6
  253. package/utils/theme-selector.js.map +1 -1
  254. package/utils/fetch-component.d.ts +0 -3
  255. package/utils/fetch-component.d.ts.map +0 -1
  256. package/utils/fetch-component.js +0 -75
  257. package/utils/fetch-component.js.map +0 -1
package/ui/runner.js ADDED
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Runner — a ponte entre o loop de frames da engine e o fluxo async da CLI.
3
+ *
4
+ * Os comandos são sequenciais (`const config = await promptForConfig(...)`),
5
+ * enquanto a engine é um laço de render dirigido por eventos. O runner concilia
6
+ * os dois: monta a tela, entrega o controle ao `onKey`/`run` e resolve uma
7
+ * Promise quando o fluxo chama `done()`.
8
+ *
9
+ * Três invariantes valem para qualquer wizard:
10
+ * 1. o terminal é restaurado em todos os caminhos de saída — inclusive erro,
11
+ * SIGINT e crash do processo;
12
+ * 2. sem TTY a tela nunca é montada: quem chamou recebe NonInteractiveError e
13
+ * segue pelo caminho headless;
14
+ * 3. o que o logger escreveria durante a montagem fica retido no sink e é
15
+ * reemitido depois, para não rasgar o frame.
16
+ */
17
+ import { createScreen, createTerminal, resolveTerminalStreams, } from './engine/index.js';
18
+ import { beginCapture, endCapture } from './log-sink.js';
19
+ import { flushRecords } from './output.js';
20
+ import { zardTheme } from './theme.js';
21
+ /** Sinaliza que o comando precisa seguir sem UI interativa (CI, pipe, --yes). */
22
+ export class NonInteractiveError extends Error {
23
+ constructor(message = 'This terminal is not interactive.') {
24
+ super(message);
25
+ this.name = 'NonInteractiveError';
26
+ }
27
+ }
28
+ /** O usuário abandonou o wizard (Ctrl+C ou um passo que cancela o fluxo). */
29
+ export class WizardCancelledError extends Error {
30
+ constructor(message = 'Operation cancelled.') {
31
+ super(message);
32
+ this.name = 'WizardCancelledError';
33
+ }
34
+ }
35
+ /**
36
+ * true quando existe um terminal onde montar a tela.
37
+ *
38
+ * Não basta olhar `process.stdout.isTTY && process.stdin.isTTY`: era isso que
39
+ * fazia `npx zard-cli init` sair em modo texto no macOS e no Linux, onde o npm
40
+ * executa o binário por um shell e entrega o stdin como pipe. O terminal de
41
+ * controle continua alcançável, e é ele que decide.
42
+ */
43
+ export function isInteractive(resolve = resolveTerminalStreams) {
44
+ const streams = resolve();
45
+ if (!streams)
46
+ return false;
47
+ streams.close();
48
+ return true;
49
+ }
50
+ export async function runWizard(options) {
51
+ const streams = (options.resolveStreams ?? resolveTerminalStreams)();
52
+ if (!streams)
53
+ throw new NonInteractiveError();
54
+ const screen = createScreen({
55
+ theme: zardTheme,
56
+ fps: options.fps ?? 30,
57
+ terminal: createTerminal({ stdin: streams.input, stdout: streams.output }),
58
+ // O teardown é nosso: interceptamos Ctrl+C para encerrar o wizard com uma
59
+ // mensagem, em vez de matar o processo direto de dentro da engine.
60
+ handleExitSignals: false,
61
+ });
62
+ let settled = false;
63
+ let teardownDone = false;
64
+ const teardown = () => {
65
+ if (teardownDone)
66
+ return;
67
+ teardownDone = true;
68
+ screen.unmount();
69
+ // Depois do unmount: é ele que devolve o terminal ao estado normal, e
70
+ // fechar os streams antes deixaria o alt-screen e o raw mode ligados.
71
+ streams.close();
72
+ process.off('exit', teardown);
73
+ process.off('SIGINT', onSignal);
74
+ process.off('SIGTERM', onSignal);
75
+ };
76
+ // Rede de segurança: se o processo morrer com a tela montada, o terminal
77
+ // ainda volta ao normal (cursor visível, sem raw mode, fora do alt-screen).
78
+ function onSignal() {
79
+ teardown();
80
+ process.exit(130);
81
+ }
82
+ process.on('exit', teardown);
83
+ process.on('SIGINT', onSignal);
84
+ process.on('SIGTERM', onSignal);
85
+ beginCapture();
86
+ try {
87
+ const value = await new Promise((resolve, reject) => {
88
+ const settle = (fn) => {
89
+ if (settled)
90
+ return;
91
+ settled = true;
92
+ teardown();
93
+ fn();
94
+ };
95
+ const ctx = {
96
+ done: v => settle(() => resolve(v)),
97
+ cancel: message => settle(() => reject(new WizardCancelledError(message))),
98
+ refresh: () => screen.scheduler.requestRender(),
99
+ screen,
100
+ };
101
+ screen.setView(options.view);
102
+ screen.onKey(event => {
103
+ if (settled)
104
+ return;
105
+ if (event.ctrl && (event.key === 'c' || event.key === 'd')) {
106
+ ctx.cancel();
107
+ return;
108
+ }
109
+ options.onKey?.(event, ctx);
110
+ });
111
+ screen.mount();
112
+ if (options.run) {
113
+ void (async () => {
114
+ try {
115
+ await options.run?.(ctx);
116
+ }
117
+ catch (error) {
118
+ settle(() => reject(error));
119
+ }
120
+ })();
121
+ }
122
+ });
123
+ return { value, logs: endCapture() };
124
+ }
125
+ catch (error) {
126
+ // Última chance de mostrar o que foi retido: a tela já caiu e quem trata o
127
+ // erro acima só verá a mensagem da exceção.
128
+ flushRecords(endCapture());
129
+ throw error;
130
+ }
131
+ finally {
132
+ teardown();
133
+ }
134
+ }
135
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/ui/runner.ts"],"names":[],"mappings":"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"}
package/ui/style.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Estilo para saída em linha — o que a CLI escreve fora da tela interativa.
3
+ *
4
+ * Substitui o chalk usando o vocabulário ANSI da própria engine, o que mantém
5
+ * uma única fonte de verdade de cor: os mesmos tokens do tema valem para o
6
+ * wizard em alt-screen e para o texto que sobra no histórico do terminal.
7
+ */
8
+ /** Reavalia a capacidade de cor — usado em teste, quando o stdout é trocado. */
9
+ export declare function resetColorLevel(): void;
10
+ export declare const style: {
11
+ primary: (text: string) => string;
12
+ success: (text: string) => string;
13
+ warning: (text: string) => string;
14
+ danger: (text: string) => string;
15
+ muted: (text: string) => string;
16
+ foreground: (text: string) => string;
17
+ bold: (text: string) => string;
18
+ dim: (text: string) => string;
19
+ /** Destaque de nome de arquivo, comando ou caminho dentro de uma frase. */
20
+ code: (text: string) => string;
21
+ };
22
+ /** true quando o terminal aceita as caixas e glifos Unicode da UI. */
23
+ export declare function supportsUnicode(): boolean;
24
+ //# sourceMappingURL=style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/ui/style.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH,gFAAgF;AAChF,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAWD,eAAO,MAAM,KAAK;oBACA,MAAM;oBACN,MAAM;oBACN,MAAM;mBACP,MAAM;kBACP,MAAM;uBACD,MAAM;iBACZ,MAAM;gBACP,MAAM;IAClB,2EAA2E;iBAC9D,MAAM;CACpB,CAAC;AAEF,sEAAsE;AACtE,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
package/ui/style.js ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Estilo para saída em linha — o que a CLI escreve fora da tela interativa.
3
+ *
4
+ * Substitui o chalk usando o vocabulário ANSI da própria engine, o que mantém
5
+ * uma única fonte de verdade de cor: os mesmos tokens do tema valem para o
6
+ * wizard em alt-screen e para o texto que sobra no histórico do terminal.
7
+ */
8
+ import { Attr, createSgrBuilder, createTerminal } from './engine/index.js';
9
+ import { zardTheme } from './theme.js';
10
+ let cachedLevel = null;
11
+ /** Nível de cor do terminal atual, resolvido uma única vez por processo. */
12
+ function colorLevel() {
13
+ cachedLevel ??= createTerminal().caps.colors;
14
+ return cachedLevel;
15
+ }
16
+ /** Reavalia a capacidade de cor — usado em teste, quando o stdout é trocado. */
17
+ export function resetColorLevel() {
18
+ cachedLevel = null;
19
+ }
20
+ function paint(text, token, attrs = Attr.None) {
21
+ const level = colorLevel();
22
+ if (level === 'none' || (token === undefined && attrs === Attr.None))
23
+ return text;
24
+ const sgr = createSgrBuilder();
25
+ const fg = zardTheme.resolve(token, level);
26
+ return sgr.transition(fg, { kind: 'default' }, attrs) + text + sgr.reset();
27
+ }
28
+ export const style = {
29
+ primary: (text) => paint(text, 'primary'),
30
+ success: (text) => paint(text, 'success'),
31
+ warning: (text) => paint(text, 'warning'),
32
+ danger: (text) => paint(text, 'danger'),
33
+ muted: (text) => paint(text, 'muted'),
34
+ foreground: (text) => paint(text, 'foreground'),
35
+ bold: (text) => paint(text, undefined, Attr.Bold),
36
+ dim: (text) => paint(text, undefined, Attr.Dim),
37
+ /** Destaque de nome de arquivo, comando ou caminho dentro de uma frase. */
38
+ code: (text) => paint(text, 'primary', Attr.Bold),
39
+ };
40
+ /** true quando o terminal aceita as caixas e glifos Unicode da UI. */
41
+ export function supportsUnicode() {
42
+ return createTerminal().caps.unicode;
43
+ }
44
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/ui/style.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAmB,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,IAAI,WAAW,GAAsB,IAAI,CAAC;AAE1C,4EAA4E;AAC5E,SAAS,UAAU;IACjB,WAAW,KAAK,cAAc,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;IAC7C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe;IAC7B,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,KAAyB,EAAE,QAAc,IAAI,CAAC,IAAI;IAC7E,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAElF,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;IACjD,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;IACjD,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;IACjD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;IAC/C,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;IAC7C,UAAU,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC;IACvD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;IACzD,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC;IACvD,2EAA2E;IAC3E,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;CAC1D,CAAC;AAEF,sEAAsE;AACtE,MAAM,UAAU,eAAe;IAC7B,OAAO,cAAc,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;AACvC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Um TTY simulado para exercitar wizards sem um terminal real.
3
+ *
4
+ * `runWizard` se recusa a montar fora de um TTY — é o que protege o usuário de
5
+ * uma UI de tela cheia num pipe. Para testar o wizard em si, então, stdout vira
6
+ * um buffer e stdin um emissor onde injetamos bytes de teclado.
7
+ */
8
+ export interface FakeTty {
9
+ /** Tudo o que foi escrito, concatenado. */
10
+ output(): string;
11
+ isRawMode(): boolean;
12
+ /** Injeta bytes de teclado — `\r` para enter, `\x1b[B` para seta abaixo. */
13
+ press(bytes: string): void;
14
+ restore(): void;
15
+ }
16
+ export declare const KEY: {
17
+ readonly enter: "\r";
18
+ readonly up: "\u001B[A";
19
+ readonly down: "\u001B[B";
20
+ readonly left: "\u001B[D";
21
+ readonly right: "\u001B[C";
22
+ readonly backspace: "";
23
+ readonly escape: "\u001B";
24
+ };
25
+ export declare function fakeTty(): FakeTty;
26
+ //# sourceMappingURL=fake-tty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-tty.d.ts","sourceRoot":"","sources":["../../../src/ui/testing/fake-tty.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,OAAO;IACtB,2CAA2C;IAC3C,MAAM,IAAI,MAAM,CAAC;IACjB,SAAS,IAAI,OAAO,CAAC;IACrB,4EAA4E;IAC5E,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,eAAO,MAAM,GAAG;;;;;;;;CAQN,CAAC;AAEX,wBAAgB,OAAO,IAAI,OAAO,CAiDjC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Um TTY simulado para exercitar wizards sem um terminal real.
3
+ *
4
+ * `runWizard` se recusa a montar fora de um TTY — é o que protege o usuário de
5
+ * uma UI de tela cheia num pipe. Para testar o wizard em si, então, stdout vira
6
+ * um buffer e stdin um emissor onde injetamos bytes de teclado.
7
+ */
8
+ import { EventEmitter } from 'node:events';
9
+ export const KEY = {
10
+ enter: '\r',
11
+ up: '\x1b[A',
12
+ down: '\x1b[B',
13
+ left: '\x1b[D',
14
+ right: '\x1b[C',
15
+ backspace: '\x7f',
16
+ escape: '\x1b',
17
+ };
18
+ export function fakeTty() {
19
+ const written = [];
20
+ const originalWrite = process.stdout.write.bind(process.stdout);
21
+ const originalStdin = process.stdin;
22
+ const descriptors = {
23
+ isTTY: Object.getOwnPropertyDescriptor(process.stdout, 'isTTY'),
24
+ columns: Object.getOwnPropertyDescriptor(process.stdout, 'columns'),
25
+ rows: Object.getOwnPropertyDescriptor(process.stdout, 'rows'),
26
+ };
27
+ process.stdout.write = ((chunk) => {
28
+ written.push(String(chunk));
29
+ return true;
30
+ });
31
+ Object.defineProperty(process.stdout, 'isTTY', { value: true, configurable: true });
32
+ Object.defineProperty(process.stdout, 'columns', { value: 80, configurable: true });
33
+ Object.defineProperty(process.stdout, 'rows', { value: 24, configurable: true });
34
+ const stdin = new EventEmitter();
35
+ let rawMode = false;
36
+ stdin.isTTY = true;
37
+ stdin.setRawMode = value => {
38
+ rawMode = value;
39
+ };
40
+ stdin.resume = () => undefined;
41
+ stdin.pause = () => undefined;
42
+ Object.defineProperty(process, 'stdin', { value: stdin, configurable: true });
43
+ return {
44
+ output: () => written.join(''),
45
+ isRawMode: () => rawMode,
46
+ press: bytes => {
47
+ stdin.emit('data', Buffer.from(bytes, 'utf8'));
48
+ },
49
+ restore: () => {
50
+ process.stdout.write = originalWrite;
51
+ Object.defineProperty(process, 'stdin', { value: originalStdin, configurable: true });
52
+ for (const [key, descriptor] of Object.entries(descriptors)) {
53
+ if (descriptor)
54
+ Object.defineProperty(process.stdout, key, descriptor);
55
+ else
56
+ delete process.stdout[key];
57
+ }
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=fake-tty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-tty.js","sourceRoot":"","sources":["../../../src/ui/testing/fake-tty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Edição de uma linha de texto num campo do wizard.
3
+ *
4
+ * O campo aceitava só duas coisas — digitar no fim e apagar de trás para a
5
+ * frente. Quem quisesse trocar o meio de um alias (`@/shared/components` para
6
+ * `@app/shared/components`) apertava as setas, não via nada acontecer e ficava
7
+ * sem saída a não ser apagar tudo e redigitar. Aqui o cursor é de verdade:
8
+ * anda, insere no meio, apaga para os dois lados.
9
+ */
10
+ import type { KeyEvent } from '../ui/engine/index.js';
11
+ export interface TextInput {
12
+ readonly value: string;
13
+ /** Posição do cursor, em caracteres — nunca fora de `[0, comprimento]`. */
14
+ readonly caret: number;
15
+ /**
16
+ * true enquanto o campo ainda mostra a sugestão e o usuário não tocou nela:
17
+ * a primeira tecla digitada substitui a sugestão inteira, em vez de emendar
18
+ * nela. Mover o cursor ou apagar assume o valor e passa a editá-lo.
19
+ */
20
+ readonly pristine: boolean;
21
+ }
22
+ export declare function startInput(value: string): TextInput;
23
+ /**
24
+ * Aplica uma tecla ao campo.
25
+ *
26
+ * Devolve `null` quando a tecla não é de edição — `enter` e `escape` pertencem
27
+ * ao fluxo do wizard, e é ele quem decide o que fazer com elas.
28
+ */
29
+ export declare function editInput(state: TextInput, event: KeyEvent): TextInput | null;
30
+ //# sourceMappingURL=text-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-input.d.ts","sourceRoot":"","sources":["../../src/ui/text-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CA0C7E"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Edição de uma linha de texto num campo do wizard.
3
+ *
4
+ * O campo aceitava só duas coisas — digitar no fim e apagar de trás para a
5
+ * frente. Quem quisesse trocar o meio de um alias (`@/shared/components` para
6
+ * `@app/shared/components`) apertava as setas, não via nada acontecer e ficava
7
+ * sem saída a não ser apagar tudo e redigitar. Aqui o cursor é de verdade:
8
+ * anda, insere no meio, apaga para os dois lados.
9
+ */
10
+ export function startInput(value) {
11
+ return { value, caret: [...value].length, pristine: true };
12
+ }
13
+ /**
14
+ * Aplica uma tecla ao campo.
15
+ *
16
+ * Devolve `null` quando a tecla não é de edição — `enter` e `escape` pertencem
17
+ * ao fluxo do wizard, e é ele quem decide o que fazer com elas.
18
+ */
19
+ export function editInput(state, event) {
20
+ const chars = [...state.value];
21
+ const caret = clamp(state.caret, chars.length);
22
+ if (event.ctrl)
23
+ return editWithControl(state, chars, caret, event.key);
24
+ if (event.alt)
25
+ return null;
26
+ if (event.key.length === 1) {
27
+ // A sugestão inteira sai na primeira tecla: quem já sabe o que quer digita
28
+ // direto, sem apagar caractere por caractere o que a CLI propôs.
29
+ if (state.pristine)
30
+ return { value: event.key, caret: 1, pristine: false };
31
+ chars.splice(caret, 0, event.key);
32
+ return { value: chars.join(''), caret: caret + 1, pristine: false };
33
+ }
34
+ switch (event.key) {
35
+ case 'backspace':
36
+ if (caret === 0)
37
+ return { ...state, caret, pristine: false };
38
+ chars.splice(caret - 1, 1);
39
+ return { value: chars.join(''), caret: caret - 1, pristine: false };
40
+ case 'delete':
41
+ if (caret >= chars.length)
42
+ return { ...state, caret, pristine: false };
43
+ chars.splice(caret, 1);
44
+ return { value: chars.join(''), caret, pristine: false };
45
+ case 'left':
46
+ return { ...state, caret: Math.max(0, caret - 1), pristine: false };
47
+ case 'right':
48
+ return { ...state, caret: Math.min(chars.length, caret + 1), pristine: false };
49
+ case 'home':
50
+ return { ...state, caret: 0, pristine: false };
51
+ case 'end':
52
+ return { ...state, caret: chars.length, pristine: false };
53
+ default:
54
+ return null;
55
+ }
56
+ }
57
+ /** Os atalhos de linha que qualquer shell oferece. */
58
+ function editWithControl(state, chars, caret, key) {
59
+ switch (key) {
60
+ case 'u': // limpa até o começo
61
+ return { value: chars.slice(caret).join(''), caret: 0, pristine: false };
62
+ case 'k': // limpa até o fim
63
+ return { value: chars.slice(0, caret).join(''), caret, pristine: false };
64
+ case 'w': {
65
+ // apaga a palavra anterior, incluindo os separadores que a antecedem
66
+ let start = caret;
67
+ while (start > 0 && isSeparator(chars[start - 1]))
68
+ start--;
69
+ while (start > 0 && !isSeparator(chars[start - 1]))
70
+ start--;
71
+ return { value: [...chars.slice(0, start), ...chars.slice(caret)].join(''), caret: start, pristine: false };
72
+ }
73
+ case 'a':
74
+ return { ...state, caret: 0, pristine: false };
75
+ case 'e':
76
+ return { ...state, caret: chars.length, pristine: false };
77
+ default:
78
+ return null;
79
+ }
80
+ }
81
+ function isSeparator(char) {
82
+ return char === ' ' || char === '/' || char === '\\' || char === '.' || char === '-';
83
+ }
84
+ function clamp(caret, length) {
85
+ return Math.max(0, Math.min(caret, length));
86
+ }
87
+ //# sourceMappingURL=text-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-input.js","sourceRoot":"","sources":["../../src/ui/text-input.ts"],"names":[],"mappings":"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"}
package/ui/theme.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tema da CLI — tokens semânticos consumidos por toda a UI do terminal.
3
+ *
4
+ * A paleta segue a base neutra do ZardUI (zinc) para texto e bordas, com os
5
+ * acentos reservados para estado: primary marca o passo ativo e o cursor,
6
+ * success/warning/danger comunicam o resultado de cada etapa.
7
+ */
8
+ import { type Theme } from './engine/index.js';
9
+ export declare const zardTheme: Theme;
10
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE5D,eAAO,MAAM,SAAS,EAAE,KAUtB,CAAC"}
package/ui/theme.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Tema da CLI — tokens semânticos consumidos por toda a UI do terminal.
3
+ *
4
+ * A paleta segue a base neutra do ZardUI (zinc) para texto e bordas, com os
5
+ * acentos reservados para estado: primary marca o passo ativo e o cursor,
6
+ * success/warning/danger comunicam o resultado de cada etapa.
7
+ */
8
+ import { createTheme } from './engine/index.js';
9
+ export const zardTheme = createTheme({
10
+ primary: '#7c93ff',
11
+ secondary: '#a78bfa',
12
+ success: '#4ade80',
13
+ warning: '#fbbf24',
14
+ danger: '#f87171',
15
+ muted: '#a1a1aa',
16
+ foreground: '#fafafa',
17
+ background: '#09090b',
18
+ border: '#27272a',
19
+ });
20
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAE5D,MAAM,CAAC,MAAM,SAAS,GAAU,WAAW,CAAC;IAC1C,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,MAAM,EAAE,SAAS;CAClB,CAAC,CAAC"}
package/utils/config.d.ts CHANGED
@@ -2,74 +2,54 @@ import { z } from 'zod';
2
2
  declare const configSchema: z.ZodObject<{
3
3
  $schema: z.ZodOptional<z.ZodString>;
4
4
  appConfigFile: z.ZodDefault<z.ZodString>;
5
- style: z.ZodDefault<z.ZodEnum<["css"]>>;
6
- packageManager: z.ZodDefault<z.ZodEnum<["npm", "yarn", "pnpm", "bun"]>>;
5
+ style: z.ZodDefault<z.ZodEnum<{
6
+ css: "css";
7
+ }>>;
8
+ icons: z.ZodDefault<z.ZodString>;
9
+ rtl: z.ZodDefault<z.ZodBoolean>;
10
+ projectType: z.ZodDefault<z.ZodEnum<{
11
+ angular: "angular";
12
+ "angular-library": "angular-library";
13
+ nx: "nx";
14
+ "nx-library": "nx-library";
15
+ analog: "analog";
16
+ }>>;
17
+ packageManager: z.ZodDefault<z.ZodEnum<{
18
+ npm: "npm";
19
+ yarn: "yarn";
20
+ pnpm: "pnpm";
21
+ bun: "bun";
22
+ }>>;
7
23
  registryUrl: z.ZodOptional<z.ZodString>;
8
24
  tailwind: z.ZodDefault<z.ZodObject<{
9
25
  css: z.ZodDefault<z.ZodString>;
10
26
  baseColor: z.ZodDefault<z.ZodString>;
11
- }, "strip", z.ZodTypeAny, {
12
- css?: string;
13
- baseColor?: string;
14
- }, {
15
- css?: string;
16
- baseColor?: string;
17
- }>>;
27
+ }, z.core.$strip>>;
18
28
  baseUrl: z.ZodDefault<z.ZodString>;
19
29
  aliases: z.ZodDefault<z.ZodObject<{
20
30
  components: z.ZodDefault<z.ZodString>;
21
31
  utils: z.ZodDefault<z.ZodString>;
22
32
  core: z.ZodDefault<z.ZodString>;
23
33
  services: z.ZodDefault<z.ZodString>;
24
- }, "strip", z.ZodTypeAny, {
25
- components?: string;
26
- utils?: string;
27
- core?: string;
28
- services?: string;
29
- }, {
30
- components?: string;
31
- utils?: string;
32
- core?: string;
33
- services?: string;
34
- }>>;
35
- }, "strip", z.ZodTypeAny, {
36
- $schema?: string;
37
- appConfigFile?: string;
38
- style?: "css";
39
- packageManager?: "npm" | "yarn" | "pnpm" | "bun";
40
- registryUrl?: string;
41
- tailwind?: {
42
- css?: string;
43
- baseColor?: string;
44
- };
45
- baseUrl?: string;
46
- aliases?: {
47
- components?: string;
48
- utils?: string;
49
- core?: string;
50
- services?: string;
51
- };
52
- }, {
53
- $schema?: string;
54
- appConfigFile?: string;
55
- style?: "css";
56
- packageManager?: "npm" | "yarn" | "pnpm" | "bun";
57
- registryUrl?: string;
58
- tailwind?: {
59
- css?: string;
60
- baseColor?: string;
61
- };
62
- baseUrl?: string;
63
- aliases?: {
64
- components?: string;
65
- utils?: string;
66
- core?: string;
67
- services?: string;
68
- };
69
- }>;
34
+ }, z.core.$strip>>;
35
+ }, z.core.$strip>;
70
36
  export type Config = z.infer<typeof configSchema>;
71
37
  export declare const DEFAULT_CONFIG: Config;
72
38
  export declare function getConfig(cwd: string): Promise<Config | null>;
39
+ /**
40
+ * Separa o prefixo do alias do caminho que vem depois dele.
41
+ *
42
+ * `@`, `@app`, `~` — o nome não importa: o prefixo é um apelido para `baseUrl`,
43
+ * e o resto é o caminho dentro do projeto. Tratar só `@/` fazia um alias como
44
+ * `@app/components` escapar da substituição e virar uma pasta literal chamada
45
+ * `@app` na raiz, fora de qualquer coisa que o tsconfig mapeie.
46
+ */
47
+ export declare function splitAlias(alias: string): {
48
+ prefix: string;
49
+ rest: string;
50
+ };
51
+ /** O prefixo do alias, com `/*` — a chave que o tsconfig precisa mapear. */
52
+ export declare function aliasPattern(alias: string): string;
73
53
  export declare function resolveAliasToPath(alias: string, baseUrl: string): string;
74
54
  export declare function resolveConfigPaths(cwd: string, config: Config): Promise<{
75
55
  resolvedPaths: {
@@ -80,22 +60,25 @@ export declare function resolveConfigPaths(cwd: string, config: Config): Promise
80
60
  core: string;
81
61
  services: string;
82
62
  };
83
- $schema?: string;
84
- appConfigFile?: string;
85
- style?: "css";
86
- packageManager?: "npm" | "yarn" | "pnpm" | "bun";
87
- registryUrl?: string;
88
- tailwind?: {
89
- css?: string;
90
- baseColor?: string;
63
+ appConfigFile: string;
64
+ style: "css";
65
+ icons: string;
66
+ rtl: boolean;
67
+ projectType: "angular" | "angular-library" | "nx" | "nx-library" | "analog";
68
+ packageManager: "npm" | "yarn" | "pnpm" | "bun";
69
+ tailwind: {
70
+ css: string;
71
+ baseColor: string;
91
72
  };
92
- baseUrl?: string;
93
- aliases?: {
94
- components?: string;
95
- utils?: string;
96
- core?: string;
97
- services?: string;
73
+ baseUrl: string;
74
+ aliases: {
75
+ components: string;
76
+ utils: string;
77
+ core: string;
78
+ services: string;
98
79
  };
80
+ $schema?: string;
81
+ registryUrl?: string;
99
82
  }>;
100
83
  export {};
101
84
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,MAAM,cAAc,EAAE,MAe5B,CAAC;AAEF,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcnE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;GAcnE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyChB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,MAAM,cAAc,EAAE,MAkB5B,CAAC;AAEF,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBnE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAO1E;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKzE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAcnE"}