zard-cli 1.0.0-beta.84 → 1.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +60 -60
  2. package/commands/add/component-installer.d.ts +2 -0
  3. package/commands/add/component-installer.d.ts.map +1 -1
  4. package/commands/add/component-installer.js +9 -4
  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.map +1 -1
  11. package/commands/add/dark-mode-setup.js +2 -11
  12. package/commands/add/dark-mode-setup.js.map +1 -1
  13. package/commands/add/index.d.ts.map +1 -1
  14. package/commands/add/index.js +106 -86
  15. package/commands/add/index.js.map +1 -1
  16. package/commands/add/wizard.d.ts +31 -0
  17. package/commands/add/wizard.d.ts.map +1 -0
  18. package/commands/add/wizard.js +289 -0
  19. package/commands/add/wizard.js.map +1 -0
  20. package/commands/init/config-prompter.d.ts +47 -3
  21. package/commands/init/config-prompter.d.ts.map +1 -1
  22. package/commands/init/config-prompter.js +76 -74
  23. package/commands/init/config-prompter.js.map +1 -1
  24. package/commands/init/dependencies.d.ts +1 -8
  25. package/commands/init/dependencies.d.ts.map +1 -1
  26. package/commands/init/dependencies.js +35 -17
  27. package/commands/init/dependencies.js.map +1 -1
  28. package/commands/init/index.d.ts.map +1 -1
  29. package/commands/init/index.js +129 -81
  30. package/commands/init/index.js.map +1 -1
  31. package/commands/init/project-kind.d.ts +82 -0
  32. package/commands/init/project-kind.d.ts.map +1 -0
  33. package/commands/init/project-kind.js +166 -0
  34. package/commands/init/project-kind.js.map +1 -0
  35. package/commands/init/steps.d.ts +16 -0
  36. package/commands/init/steps.d.ts.map +1 -0
  37. package/commands/init/steps.js +151 -0
  38. package/commands/init/steps.js.map +1 -0
  39. package/commands/init/tailwind-setup.d.ts +9 -2
  40. package/commands/init/tailwind-setup.d.ts.map +1 -1
  41. package/commands/init/tailwind-setup.js +33 -12
  42. package/commands/init/tailwind-setup.js.map +1 -1
  43. package/commands/init/tsconfig-updater.d.ts +8 -1
  44. package/commands/init/tsconfig-updater.d.ts.map +1 -1
  45. package/commands/init/tsconfig-updater.js +30 -11
  46. package/commands/init/tsconfig-updater.js.map +1 -1
  47. package/commands/init/update-angular-config.d.ts.map +1 -1
  48. package/commands/init/update-angular-config.js +28 -50
  49. package/commands/init/update-angular-config.js.map +1 -1
  50. package/commands/init/vite-setup.d.ts +10 -0
  51. package/commands/init/vite-setup.d.ts.map +1 -0
  52. package/commands/init/vite-setup.js +60 -0
  53. package/commands/init/vite-setup.js.map +1 -0
  54. package/commands/init/wizard.d.ts +30 -0
  55. package/commands/init/wizard.d.ts.map +1 -0
  56. package/commands/init/wizard.js +560 -0
  57. package/commands/init/wizard.js.map +1 -0
  58. package/core/registry/registry-data.d.ts.map +1 -1
  59. package/core/registry/registry-data.js +8 -45
  60. package/core/registry/registry-data.js.map +1 -1
  61. package/index.js +5 -3
  62. package/index.js.map +1 -1
  63. package/package.json +58 -61
  64. package/ui/blocks.d.ts +70 -0
  65. package/ui/blocks.d.ts.map +1 -0
  66. package/ui/blocks.js +116 -0
  67. package/ui/blocks.js.map +1 -0
  68. package/ui/brand.d.ts +14 -0
  69. package/ui/brand.d.ts.map +1 -0
  70. package/ui/brand.js +35 -0
  71. package/ui/brand.js.map +1 -0
  72. package/ui/engine/animation/index.d.ts +39 -0
  73. package/ui/engine/animation/index.d.ts.map +1 -0
  74. package/ui/engine/animation/index.js +103 -0
  75. package/ui/engine/animation/index.js.map +1 -0
  76. package/ui/engine/ansi/index.d.ts +52 -0
  77. package/ui/engine/ansi/index.d.ts.map +1 -0
  78. package/ui/engine/ansi/index.js +117 -0
  79. package/ui/engine/ansi/index.js.map +1 -0
  80. package/ui/engine/components/index.d.ts +211 -0
  81. package/ui/engine/components/index.d.ts.map +1 -0
  82. package/ui/engine/components/index.js +109 -0
  83. package/ui/engine/components/index.js.map +1 -0
  84. package/ui/engine/cursor/index.d.ts +17 -0
  85. package/ui/engine/cursor/index.d.ts.map +1 -0
  86. package/ui/engine/cursor/index.js +41 -0
  87. package/ui/engine/cursor/index.js.map +1 -0
  88. package/ui/engine/diff/index.d.ts +27 -0
  89. package/ui/engine/diff/index.d.ts.map +1 -0
  90. package/ui/engine/diff/index.js +57 -0
  91. package/ui/engine/diff/index.js.map +1 -0
  92. package/ui/engine/events/index.d.ts +24 -0
  93. package/ui/engine/events/index.d.ts.map +1 -0
  94. package/ui/engine/events/index.js +60 -0
  95. package/ui/engine/events/index.js.map +1 -0
  96. package/ui/engine/focus/index.d.ts +25 -0
  97. package/ui/engine/focus/index.d.ts.map +1 -0
  98. package/ui/engine/focus/index.js +77 -0
  99. package/ui/engine/focus/index.js.map +1 -0
  100. package/ui/engine/frame/index.d.ts +48 -0
  101. package/ui/engine/frame/index.d.ts.map +1 -0
  102. package/ui/engine/frame/index.js +0 -0
  103. package/ui/engine/frame/index.js.map +1 -0
  104. package/ui/engine/index.d.ts +28 -0
  105. package/ui/engine/index.d.ts.map +1 -0
  106. package/ui/engine/index.js +28 -0
  107. package/ui/engine/index.js.map +1 -0
  108. package/ui/engine/input/index.d.ts +36 -0
  109. package/ui/engine/input/index.d.ts.map +1 -0
  110. package/ui/engine/input/index.js +224 -0
  111. package/ui/engine/input/index.js.map +1 -0
  112. package/ui/engine/layout/index.d.ts +42 -0
  113. package/ui/engine/layout/index.d.ts.map +1 -0
  114. package/ui/engine/layout/index.js +241 -0
  115. package/ui/engine/layout/index.js.map +1 -0
  116. package/ui/engine/renderer/index.d.ts +43 -0
  117. package/ui/engine/renderer/index.d.ts.map +1 -0
  118. package/ui/engine/renderer/index.js +619 -0
  119. package/ui/engine/renderer/index.js.map +1 -0
  120. package/ui/engine/scheduler/index.d.ts +22 -0
  121. package/ui/engine/scheduler/index.d.ts.map +1 -0
  122. package/ui/engine/scheduler/index.js +77 -0
  123. package/ui/engine/scheduler/index.js.map +1 -0
  124. package/ui/engine/screen/index.d.ts +39 -0
  125. package/ui/engine/screen/index.d.ts.map +1 -0
  126. package/ui/engine/screen/index.js +255 -0
  127. package/ui/engine/screen/index.js.map +1 -0
  128. package/ui/engine/terminal/index.d.ts +38 -0
  129. package/ui/engine/terminal/index.d.ts.map +1 -0
  130. package/ui/engine/terminal/index.js +104 -0
  131. package/ui/engine/terminal/index.js.map +1 -0
  132. package/ui/engine/testing/index.d.ts +27 -0
  133. package/ui/engine/testing/index.d.ts.map +1 -0
  134. package/ui/engine/testing/index.js +63 -0
  135. package/ui/engine/testing/index.js.map +1 -0
  136. package/ui/engine/theme/index.d.ts +27 -0
  137. package/ui/engine/theme/index.d.ts.map +1 -0
  138. package/ui/engine/theme/index.js +129 -0
  139. package/ui/engine/theme/index.js.map +1 -0
  140. package/ui/engine/utils/index.d.ts +12 -0
  141. package/ui/engine/utils/index.d.ts.map +1 -0
  142. package/ui/engine/utils/index.js +143 -0
  143. package/ui/engine/utils/index.js.map +1 -0
  144. package/ui/gate.d.ts +19 -0
  145. package/ui/gate.d.ts.map +1 -0
  146. package/ui/gate.js +36 -0
  147. package/ui/gate.js.map +1 -0
  148. package/ui/index.d.ts +18 -0
  149. package/ui/index.d.ts.map +1 -0
  150. package/ui/index.js +18 -0
  151. package/ui/index.js.map +1 -0
  152. package/ui/log-sink.d.ts +24 -0
  153. package/ui/log-sink.d.ts.map +1 -0
  154. package/ui/log-sink.js +35 -0
  155. package/ui/log-sink.js.map +1 -0
  156. package/ui/output.d.ts +14 -0
  157. package/ui/output.d.ts.map +1 -0
  158. package/ui/output.js +28 -0
  159. package/ui/output.js.map +1 -0
  160. package/ui/report.d.ts +30 -0
  161. package/ui/report.d.ts.map +1 -0
  162. package/ui/report.js +45 -0
  163. package/ui/report.js.map +1 -0
  164. package/ui/runner.d.ts +57 -0
  165. package/ui/runner.d.ts.map +1 -0
  166. package/ui/runner.js +119 -0
  167. package/ui/runner.js.map +1 -0
  168. package/ui/style.d.ts +24 -0
  169. package/ui/style.d.ts.map +1 -0
  170. package/ui/style.js +44 -0
  171. package/ui/style.js.map +1 -0
  172. package/ui/testing/fake-tty.d.ts +26 -0
  173. package/ui/testing/fake-tty.d.ts.map +1 -0
  174. package/ui/testing/fake-tty.js +61 -0
  175. package/ui/testing/fake-tty.js.map +1 -0
  176. package/ui/text-input.d.ts +30 -0
  177. package/ui/text-input.d.ts.map +1 -0
  178. package/ui/text-input.js +87 -0
  179. package/ui/text-input.js.map +1 -0
  180. package/ui/theme.d.ts +10 -0
  181. package/ui/theme.d.ts.map +1 -0
  182. package/ui/theme.js +20 -0
  183. package/ui/theme.js.map +1 -0
  184. package/utils/config.d.ts +22 -0
  185. package/utils/config.d.ts.map +1 -1
  186. package/utils/config.js +26 -1
  187. package/utils/config.js.map +1 -1
  188. package/utils/get-project-info.d.ts +29 -0
  189. package/utils/get-project-info.d.ts.map +1 -1
  190. package/utils/get-project-info.js +176 -1
  191. package/utils/get-project-info.js.map +1 -1
  192. package/utils/logger.d.ts +13 -1
  193. package/utils/logger.d.ts.map +1 -1
  194. package/utils/logger.js +95 -15
  195. package/utils/logger.js.map +1 -1
  196. package/utils/package-manager.d.ts +42 -1
  197. package/utils/package-manager.d.ts.map +1 -1
  198. package/utils/package-manager.js +204 -11
  199. package/utils/package-manager.js.map +1 -1
  200. package/utils/registry.d.ts +12 -2
  201. package/utils/registry.d.ts.map +1 -1
  202. package/utils/registry.js +21 -6
  203. package/utils/registry.js.map +1 -1
  204. package/utils/source-file.d.ts +40 -0
  205. package/utils/source-file.d.ts.map +1 -0
  206. package/utils/source-file.js +104 -0
  207. package/utils/source-file.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-kind.js","sourceRoot":"","sources":["../../../src/commands/init/project-kind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type Config } from '../../utils/config.js';
2
+ import { type ProjectInfo } from '../../utils/get-project-info.js';
3
+ /**
4
+ * Uma etapa da inicialização: o rótulo que a UI mostra e o trabalho que ela faz.
5
+ *
6
+ * A lista é montada uma vez e consumida tanto pelo wizard quanto pelo caminho
7
+ * headless, para que os dois executem exatamente a mesma sequência — a UI só
8
+ * decide como apresentá-la.
9
+ */
10
+ export interface InitStep {
11
+ readonly label: string;
12
+ readonly note: string;
13
+ run(): Promise<void>;
14
+ }
15
+ export declare function buildInitSteps(cwd: string, config: Config, projectInfo: ProjectInfo, isReInitializing: boolean): InitStep[];
16
+ //# sourceMappingURL=steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../../../src/commands/init/steps.ts"],"names":[],"mappings":"AAOA,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAMlE;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,OAAO,GACxB,QAAQ,EAAE,CA6DZ"}
@@ -0,0 +1,151 @@
1
+ import { installComponent } from '../../commands/add/component-installer.js';
2
+ import { installDependencies } from '../../commands/init/dependencies.js';
3
+ import { bundlerFor, isLibraryKind, projectRootOf, tsconfigFileFor } from '../../commands/init/project-kind.js';
4
+ import { applyThemeToStyles, createPostCssConfig } from '../../commands/init/tailwind-setup.js';
5
+ import { updateTsConfig } from '../../commands/init/tsconfig-updater.js';
6
+ import { updateAngularConfig } from '../../commands/init/update-angular-config.js';
7
+ import { setupVitePlugin } from '../../commands/init/vite-setup.js';
8
+ import { resolveConfigPaths } from '../../utils/config.js';
9
+ import { logger } from '../../utils/logger.js';
10
+ import { existsSync } from 'node:fs';
11
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
12
+ import * as path from 'node:path';
13
+ export function buildInitSteps(cwd, config, projectInfo, isReInitializing) {
14
+ const kind = config.projectType;
15
+ const isLibrary = isLibraryKind(kind);
16
+ const projectRoot = projectRootOf(config.baseUrl);
17
+ const tsconfigFile = tsconfigFileFor(kind, projectInfo);
18
+ const steps = [
19
+ {
20
+ label: 'components.json',
21
+ note: 'component & utils aliases',
22
+ run: async () => {
23
+ await writeFile(path.resolve(cwd, 'components.json'), JSON.stringify(config, null, 2), 'utf8');
24
+ },
25
+ },
26
+ {
27
+ label: 'dependencies',
28
+ note: 'CDK, CVA, tailwind-merge, ng-icons',
29
+ run: () => installDependencies(cwd, config, projectInfo),
30
+ },
31
+ ];
32
+ // Providers de aplicação não são da biblioteca: quem os registra é o app que
33
+ // a consome, e numa lib não existe app.config.ts para escrever.
34
+ if (!isLibrary) {
35
+ steps.push({
36
+ label: config.appConfigFile,
37
+ note: 'ZardUI providers',
38
+ run: () => updateAngularConfig(cwd, config),
39
+ });
40
+ steps.push(tailwindPipelineStep(cwd, projectRoot, kind, projectInfo, isReInitializing));
41
+ }
42
+ steps.push({
43
+ label: config.tailwind.css,
44
+ note: `theme tokens (${config.tailwind.baseColor})`,
45
+ run: () => applyThemeToStyles(cwd, config),
46
+ });
47
+ if (isLibrary) {
48
+ steps.push({
49
+ label: 'ng-package.json',
50
+ note: 'ship the theme with the library',
51
+ run: () => registerStylesAsset(cwd, config),
52
+ });
53
+ }
54
+ steps.push({
55
+ label: tsconfigFile,
56
+ note: 'import path aliases',
57
+ run: () => updateTsConfig(cwd, config, tsconfigFile),
58
+ }, {
59
+ label: 'core & utils',
60
+ note: 'shared helpers used by every component',
61
+ run: () => installCoreDependencies(cwd, config),
62
+ });
63
+ return steps;
64
+ }
65
+ /**
66
+ * Como o Tailwind entra no build da aplicação.
67
+ *
68
+ * No Analog quem compila é o Vite, e o Tailwind é um plugin dele — um
69
+ * `.postcssrc.json` ali não seria lido por ninguém. Nos demais o build do
70
+ * Angular carrega o PostCSS, e o arquivo vai para a raiz do projeto: num
71
+ * workspace com vários apps, escrevê-lo na raiz do repositório configuraria
72
+ * todos eles de uma vez.
73
+ */
74
+ function tailwindPipelineStep(cwd, projectRoot, kind, projectInfo, isReInitializing) {
75
+ if (bundlerFor(kind) === 'vite') {
76
+ return {
77
+ label: 'vite.config.ts',
78
+ note: 'Tailwind Vite plugin',
79
+ run: () => setupVitePlugin(cwd),
80
+ };
81
+ }
82
+ const relative = projectRoot === '.' ? '.postcssrc.json' : `${projectRoot}/.postcssrc.json`;
83
+ return {
84
+ label: relative,
85
+ note: 'Tailwind PostCSS plugin',
86
+ // Reinicializar reescreve o arquivo de propósito: é a chance de corrigir um
87
+ // `.postcssrc.json` que ficou de uma configuração anterior.
88
+ run: () => !projectInfo.hasTailwind || isReInitializing || !existsSync(path.resolve(cwd, relative))
89
+ ? createPostCssConfig(cwd, projectRoot)
90
+ : Promise.resolve(),
91
+ };
92
+ }
93
+ /**
94
+ * Declara o CSS de tema como asset da biblioteca.
95
+ *
96
+ * O ng-packagr só publica o que o ponto de entrada alcança; um `.css` solto em
97
+ * `src/` fica de fora do pacote. Sem esta entrada, o arquivo que a etapa
98
+ * anterior escreveu existiria só no repositório e nunca chegaria a quem
99
+ * instala a lib.
100
+ *
101
+ * O asset é declarado com `output: '/'` para cair na raiz do pacote. Listá-lo
102
+ * como caminho simples preserva a pasta de origem, e o consumidor acabaria
103
+ * importando `<lib>/src/styles.css` — um `src/` que é detalhe do repositório da
104
+ * lib, não algo que quem a instala deva conhecer.
105
+ */
106
+ async function registerStylesAsset(cwd, config) {
107
+ const libraryRoot = path.resolve(cwd, projectRootOf(config.baseUrl));
108
+ const ngPackagePath = path.join(libraryRoot, 'ng-package.json');
109
+ if (!existsSync(ngPackagePath)) {
110
+ // Uma lib Nx só ganha ng-package.json quando é publicável; nas demais não
111
+ // há pacote a montar, e o CSS é consumido direto do código-fonte.
112
+ logger.warn(`ng-package.json not found in ${path.relative(cwd, libraryRoot)}; skipping the theme asset.`);
113
+ return;
114
+ }
115
+ const relative = path.relative(libraryRoot, path.resolve(cwd, config.tailwind.css)).split(path.sep).join('/');
116
+ const input = path.posix.dirname(relative);
117
+ const glob = path.posix.basename(relative);
118
+ const entry = { glob, input, output: '/' };
119
+ const ngPackage = JSON.parse(await readFile(ngPackagePath, 'utf8'));
120
+ const assets = Array.isArray(ngPackage.assets) ? ngPackage.assets : [];
121
+ // Entradas antigas apontando para o mesmo arquivo são substituídas, e não
122
+ // acumuladas: um init repetido publicaria o CSS duas vezes, em dois lugares.
123
+ const others = assets.filter(asset => !describesSameFile(asset, relative, entry));
124
+ const alreadyCorrect = assets.length === others.length + 1 && hasEntry(assets, entry);
125
+ if (alreadyCorrect)
126
+ return;
127
+ ngPackage.assets = [...others, entry];
128
+ await writeFile(ngPackagePath, `${JSON.stringify(ngPackage, null, 2)}\n`, 'utf8');
129
+ }
130
+ /** Se um asset já declarado publica exatamente o mesmo arquivo. */
131
+ function describesSameFile(asset, relative, entry) {
132
+ if (typeof asset === 'string')
133
+ return asset.replace(/^\.\//, '') === relative;
134
+ const declared = asset;
135
+ return declared?.glob === entry.glob && declared?.input === entry.input;
136
+ }
137
+ function hasEntry(assets, entry) {
138
+ return assets.some(asset => typeof asset === 'object' &&
139
+ asset !== null &&
140
+ asset.glob === entry.glob &&
141
+ asset.input === entry.input &&
142
+ asset.output === entry.output);
143
+ }
144
+ async function installCoreDependencies(cwd, config) {
145
+ const resolvedConfig = await resolveConfigPaths(cwd, config);
146
+ await mkdir(resolvedConfig.resolvedPaths.core, { recursive: true });
147
+ await mkdir(resolvedConfig.resolvedPaths.utils, { recursive: true });
148
+ await installComponent('core', resolvedConfig.resolvedPaths.core, resolvedConfig);
149
+ await installComponent('utils', resolvedConfig.resolvedPaths.utils, resolvedConfig);
150
+ }
151
+ //# sourceMappingURL=steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.js","sourceRoot":"","sources":["../../../src/commands/init/steps.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,12 @@
1
1
  import { type Config } from '../../utils/config.js';
2
- export declare function setupTailwind(cwd: string, config: Config): Promise<void>;
3
- export declare function createPostCssConfig(cwd: string): Promise<void>;
2
+ /**
3
+ * Escreve o `.postcssrc.json` na raiz do projeto que vai usá-lo.
4
+ *
5
+ * O build do Angular procura o arquivo a partir do CSS que está processando e
6
+ * sobe até a raiz do workspace, então o projeto é o lugar mais específico que
7
+ * funciona — e num monorepo com vários apps é o único que não configura todos
8
+ * eles de uma vez. `projectRoot` é `.` no app único.
9
+ */
10
+ export declare function createPostCssConfig(cwd: string, projectRoot?: string): Promise<void>;
4
11
  export declare function applyThemeToStyles(cwd: string, config: Config): Promise<void>;
5
12
  //# sourceMappingURL=tailwind-setup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind-setup.d.ts","sourceRoot":"","sources":["../../../src/commands/init/tailwind-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAYnD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASnF"}
1
+ {"version":3,"file":"tailwind-setup.d.ts","sourceRoot":"","sources":["../../../src/commands/init/tailwind-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAYvE;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvF;AAqBD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnF"}
@@ -1,5 +1,6 @@
1
+ import { resolveAliasToPath } from '../../utils/config.js';
1
2
  import { getThemeContent } from '../../utils/theme-selector.js';
2
- import { writeFile } from 'node:fs/promises';
3
+ import { mkdir, writeFile } from 'node:fs/promises';
3
4
  import * as path from 'path';
4
5
  const POSTCSS_CONFIG = `{
5
6
  "plugins": {
@@ -7,21 +8,41 @@ const POSTCSS_CONFIG = `{
7
8
  }
8
9
  }
9
10
  `;
10
- export async function setupTailwind(cwd, config) {
11
- await createPostCssConfig(cwd);
12
- await applyThemeToStyles(cwd, config);
11
+ /**
12
+ * Escreve o `.postcssrc.json` na raiz do projeto que vai usá-lo.
13
+ *
14
+ * O build do Angular procura o arquivo a partir do CSS que está processando e
15
+ * sobe até a raiz do workspace, então o projeto é o lugar mais específico que
16
+ * funciona — e num monorepo com vários apps é o único que não configura todos
17
+ * eles de uma vez. `projectRoot` é `.` no app único.
18
+ */
19
+ export async function createPostCssConfig(cwd, projectRoot = '.') {
20
+ const targetDir = path.resolve(cwd, projectRoot);
21
+ await mkdir(targetDir, { recursive: true });
22
+ await writeFile(path.join(targetDir, '.postcssrc.json'), POSTCSS_CONFIG, 'utf8');
13
23
  }
14
- export async function createPostCssConfig(cwd) {
15
- const postcssConfigPath = path.join(cwd, '.postcssrc.json');
16
- await writeFile(postcssConfigPath, POSTCSS_CONFIG, 'utf8');
24
+ /**
25
+ * O `@import` do CSS é resolvido pelo bundler a partir do arquivo que o contém,
26
+ * então precisa ser um caminho relativo de verdade — não dá para montá-lo
27
+ * fatiando o alias.
28
+ *
29
+ * A versão anterior pegava o segundo segmento do baseUrl e colava o alias sem o
30
+ * primeiro caractere. Só acertava no layout `src/app` + `@/...`: com baseUrl
31
+ * `projects/admin/src/app` mirava `./admin/...`, e com um alias `@app/core`
32
+ * gerava `./appapp/core`.
33
+ */
34
+ function coreImportPath(cwd, config) {
35
+ const cssDir = path.dirname(path.resolve(cwd, config.tailwind.css));
36
+ const coreDir = path.resolve(cwd, resolveAliasToPath(config.aliases.core, config.baseUrl));
37
+ const relative = path.relative(cssDir, coreDir).split(path.sep).join('/');
38
+ return relative.startsWith('.') ? relative : `./${relative}`;
17
39
  }
18
40
  export async function applyThemeToStyles(cwd, config) {
19
41
  const stylesPath = path.join(cwd, config.tailwind.css);
20
- const selectedTheme = config.tailwind.baseColor;
21
- const parts = config.baseUrl.split('/');
22
- const base = parts.length > 1 ? parts[1] : parts[0];
23
- const corePath = './' + base + config.aliases.core.substring(1);
24
- const themeContent = getThemeContent(selectedTheme, corePath);
42
+ const themeContent = getThemeContent(config.tailwind.baseColor, coreImportPath(cwd, config));
43
+ // Numa biblioteca esse arquivo normalmente não existe — é o init que o cria,
44
+ // para a lib expor os tokens a quem a consome.
45
+ await mkdir(path.dirname(stylesPath), { recursive: true });
25
46
  await writeFile(stylesPath, themeContent, 'utf8');
26
47
  }
27
48
  //# sourceMappingURL=tailwind-setup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tailwind-setup.js","sourceRoot":"","sources":["../../../src/commands/init/tailwind-setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,cAAc,GAAG;;;;;CAKtB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,MAAc;IAC7D,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW;IACnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC5D,MAAM,SAAS,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,MAAc;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAE9D,MAAM,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"tailwind-setup.js","sourceRoot":"","sources":["../../../src/commands/init/tailwind-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAe,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,cAAc,GAAG;;;;;CAKtB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW,EAAE,WAAW,GAAG,GAAG;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAEjD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AACnF,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,cAAc,CAAC,GAAW,EAAE,MAAc;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3F,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1E,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,MAAc;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAE7F,6EAA6E;IAC7E,+CAA+C;IAC/C,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
@@ -1,3 +1,10 @@
1
1
  import { type Config } from '../../utils/config.js';
2
- export declare function updateTsConfig(cwd: string, config: Config): Promise<void>;
2
+ /**
3
+ * Escreve o alias no tsconfig que os projetos realmente estendem.
4
+ *
5
+ * Num workspace Nx isso é o `tsconfig.base.json`: o `tsconfig.json` da raiz não
6
+ * é herdado por projeto nenhum, e o mapeamento escrito nele nunca chegaria ao
7
+ * compilador — o alias resolvia no editor e quebrava no build.
8
+ */
9
+ export declare function updateTsConfig(cwd: string, config: Config, tsconfigFile?: string): Promise<void>;
3
10
  //# sourceMappingURL=tsconfig-updater.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tsconfig-updater.d.ts","sourceRoot":"","sources":["../../../src/commands/init/tsconfig-updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAOnD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/E"}
1
+ {"version":3,"file":"tsconfig-updater.d.ts","sourceRoot":"","sources":["../../../src/commands/init/tsconfig-updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAOjE;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,SAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/G"}
@@ -1,12 +1,20 @@
1
+ import { aliasPattern } from '../../utils/config.js';
1
2
  import { logger } from '../../utils/logger.js';
2
3
  import * as commentJson from 'comment-json';
3
4
  import { existsSync } from 'fs';
4
5
  import { writeFile, readFile } from 'node:fs/promises';
5
6
  import * as path from 'path';
6
- export async function updateTsConfig(cwd, config) {
7
- const tsconfigPath = path.join(cwd, 'tsconfig.json');
7
+ /**
8
+ * Escreve o alias no tsconfig que os projetos realmente estendem.
9
+ *
10
+ * Num workspace Nx isso é o `tsconfig.base.json`: o `tsconfig.json` da raiz não
11
+ * é herdado por projeto nenhum, e o mapeamento escrito nele nunca chegaria ao
12
+ * compilador — o alias resolvia no editor e quebrava no build.
13
+ */
14
+ export async function updateTsConfig(cwd, config, tsconfigFile = 'tsconfig.json') {
15
+ const tsconfigPath = path.join(cwd, tsconfigFile);
8
16
  if (!existsSync(tsconfigPath)) {
9
- logger.warn('tsconfig.json not found, skipping path configuration');
17
+ logger.warn(`${tsconfigFile} not found, skipping path configuration`);
10
18
  return;
11
19
  }
12
20
  try {
@@ -15,7 +23,7 @@ export async function updateTsConfig(cwd, config) {
15
23
  await writeTsConfig(tsconfigPath, updatedTsConfig);
16
24
  }
17
25
  catch (error) {
18
- logger.warn('Failed to update tsconfig.json paths');
26
+ logger.warn(`Failed to update ${tsconfigFile} paths`);
19
27
  logger.error(error);
20
28
  }
21
29
  }
@@ -27,21 +35,32 @@ function updatePaths(tsconfig, config) {
27
35
  if (!tsconfig.compilerOptions) {
28
36
  tsconfig.compilerOptions = {};
29
37
  }
30
- if (!tsconfig.compilerOptions.baseUrl) {
31
- tsconfig.compilerOptions.baseUrl = './';
32
- }
33
38
  if (!tsconfig.compilerOptions.paths) {
34
39
  tsconfig.compilerOptions.paths = {};
35
40
  }
36
- const pathMappings = {
37
- '@/*': [`${config.baseUrl}/*`],
38
- };
41
+ // A chave vem do alias escolhido, não de um `@/*` fixo: quem configurou
42
+ // `@app/components` gera imports com esse prefixo, e mapear outro deixaria
43
+ // todo import do projeto sem resolver.
39
44
  tsconfig.compilerOptions.paths = {
40
45
  ...tsconfig.compilerOptions.paths,
41
- ...pathMappings,
46
+ [aliasPattern(config.aliases.components)]: [`${pathMappingBase(tsconfig, config)}/*`],
42
47
  };
43
48
  return tsconfig;
44
49
  }
50
+ /**
51
+ * Escreve o mapeamento sem introduzir `baseUrl`.
52
+ *
53
+ * Declarar `baseUrl` quebra o build em TypeScript 6 — a opção virou erro e some
54
+ * no 7 —, e desde o 4.1 ela não é mais necessária: sem ela, os caminhos são
55
+ * resolvidos a partir do próprio tsconfig. Projetos que já declaram a opção
56
+ * continuam sendo respeitados, com o mapeamento escrito em relação a ela.
57
+ */
58
+ function pathMappingBase(tsconfig, config) {
59
+ const baseUrl = tsconfig.compilerOptions.baseUrl;
60
+ if (!baseUrl)
61
+ return `./${config.baseUrl}`;
62
+ return path.posix.relative(path.posix.normalize(baseUrl), path.posix.normalize(config.baseUrl)) || '.';
63
+ }
45
64
  async function writeTsConfig(tsconfigPath, tsconfig) {
46
65
  const updatedContent = commentJson.stringify(tsconfig, null, 2);
47
66
  await writeFile(tsconfigPath, updatedContent, 'utf8');
@@ -1 +1 @@
1
- {"version":3,"file":"tsconfig-updater.js","sourceRoot":"","sources":["../../../src/commands/init/tsconfig-updater.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,MAAc;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAErD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,aAAa,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,YAAoB;IAC9C,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7D,OAAO,WAAW,CAAC,KAAK,CAAC,eAAe,CAAQ,CAAC;AACnD,CAAC;AAED,SAAS,WAAW,CAAC,QAAa,EAAE,MAAc;IAChD,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC9B,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QACtC,QAAQ,CAAC,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QACpC,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,YAAY,GAAG;QACnB,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC;KAC/B,CAAC;IAEF,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG;QAC/B,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK;QACjC,GAAG,YAAY;KAChB,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,YAAoB,EAAE,QAAa;IAC9D,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,SAAS,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"tsconfig-updater.js","sourceRoot":"","sources":["../../../src/commands/init/tsconfig-updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,MAAc,EAAE,YAAY,GAAG,eAAe;IAC9F,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAElD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,yCAAyC,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,aAAa,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,oBAAoB,YAAY,QAAQ,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,YAAoB;IAC9C,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7D,OAAO,WAAW,CAAC,KAAK,CAAC,eAAe,CAAQ,CAAC;AACnD,CAAC;AAED,SAAS,WAAW,CAAC,QAAa,EAAE,MAAc;IAChD,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC9B,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QACpC,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,EAAE,CAAC;IACtC,CAAC;IAED,wEAAwE;IACxE,2EAA2E;IAC3E,uCAAuC;IACvC,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG;QAC/B,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK;QACjC,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC;KACtF,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,QAAa,EAAE,MAAc;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC;IAEjD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;IAE3C,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC;AACzG,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,YAAoB,EAAE,QAAa;IAC9D,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,SAAS,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-angular-config.d.ts","sourceRoot":"","sources":["../../../src/commands/init/update-angular-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAWnD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EpF"}
1
+ {"version":3,"file":"update-angular-config.d.ts","sourceRoot":"","sources":["../../../src/commands/init/update-angular-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AA4BnD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCpF"}
@@ -1,11 +1,24 @@
1
1
  import { logger } from '../../utils/logger.js';
2
+ import { arrayRange, lineEndingOf, withImport } from '../../utils/source-file.js';
2
3
  import { existsSync } from 'fs';
3
4
  import * as fsPromises from 'fs/promises';
4
5
  import * as path from 'path';
5
- const ZARD_PROVIDER_IMPORT = (corePath) => `
6
- import { provideZard } from '${corePath}/provider/providezard';
7
- `;
8
- const ZARD_PROVIDER_ENTRY = 'provideZard(),';
6
+ const ZARD_PROVIDER_IMPORT = (corePath) => `import { provideZard } from '${corePath}/provider/providezard';`;
7
+ const ZARD_PROVIDER_ENTRY = 'provideZard()';
8
+ /**
9
+ * Acrescenta o provider ao fim da lista.
10
+ *
11
+ * O `]` fica na própria linha: a lista é código que o usuário vai ler e editar
12
+ * depois, e emendar o fechamento no último provider deixa o arquivo torto assim
13
+ * que o Prettier do projeto não roda em seguida.
14
+ */
15
+ function withProvider(content, providers, eol) {
16
+ const body = providers.body.replace(/\s+$/, '');
17
+ const entries = body.trim() === '' ? '' : `${body.endsWith(',') ? body : `${body},`}`;
18
+ return (content.slice(0, providers.open) +
19
+ `[${entries}${eol} ${ZARD_PROVIDER_ENTRY},${eol} ]` +
20
+ content.slice(providers.close + 1));
21
+ }
9
22
  /**
10
23
  * Asynchronously reads, modifies, and writes the Angular application configuration file.
11
24
  * @returns {Promise<void>} A promise that resolves when the file operation is complete.
@@ -18,55 +31,20 @@ export async function updateAngularConfig(cwd, config) {
18
31
  }
19
32
  try {
20
33
  await fsPromises.access(appConfigPath);
21
- let content = await fsPromises.readFile(appConfigPath, 'utf8');
22
- // Add new import at the top
23
- if (!content.includes(ZARD_PROVIDER_IMPORT(config.aliases.core).trim())) {
24
- const importRegex = /^import .* from '.*';\n?/gm;
25
- let lastImportMatch = null;
26
- let match;
27
- while ((match = importRegex.exec(content)) !== null) {
28
- lastImportMatch = match;
29
- }
30
- if (lastImportMatch && lastImportMatch.index) {
31
- const insertionIndex = lastImportMatch.index + lastImportMatch[0].length;
32
- content =
33
- content.slice(0, insertionIndex) + ZARD_PROVIDER_IMPORT(config.aliases.core) + content.slice(insertionIndex);
34
- }
35
- else {
36
- content = ZARD_PROVIDER_IMPORT(config.aliases.core) + content;
37
- }
38
- }
39
- else {
40
- logger.warn('Import statement already exists. Skipping.');
41
- }
42
- // Add the provider to the providers array
43
- const providersRegex = /providers:\s*\[([^\]]*?)\]/s;
44
- if (providersRegex.test(content)) {
45
- content = content.replace(providersRegex, (match, providersContent) => {
46
- const entryToCheck = ZARD_PROVIDER_ENTRY.replace(/,$/, '').trim();
47
- if (providersContent.includes(entryToCheck)) {
48
- logger.warn('Provider already exists in the list. Skipping.');
49
- return match;
50
- }
51
- let newProvidersContent;
52
- const trimmedContent = providersContent.trim();
53
- if (trimmedContent === '') {
54
- newProvidersContent = `\n ${ZARD_PROVIDER_ENTRY.trim().replace(/,$/, '')}\n `;
55
- }
56
- else {
57
- const contentWithTrailingComma = trimmedContent.endsWith(',')
58
- ? providersContent
59
- : providersContent.trimEnd() + ',';
60
- newProvidersContent = `${contentWithTrailingComma}\n ${ZARD_PROVIDER_ENTRY}`;
61
- }
62
- return `providers: [${newProvidersContent.replace(/,\s*$/, ',')}]`;
63
- });
64
- }
65
- else {
34
+ const original = await fsPromises.readFile(appConfigPath, 'utf8');
35
+ const eol = lineEndingOf(original);
36
+ const content = withImport(original, ZARD_PROVIDER_IMPORT(config.aliases.core));
37
+ const providers = arrayRange(content, 'providers');
38
+ if (!providers) {
66
39
  logger.error('Could not find the "providers: [...]" array in app.config.ts. The file structure may be unsupported.');
67
40
  return;
68
41
  }
69
- await fsPromises.writeFile(appConfigPath, content, 'utf8');
42
+ if (providers.body.includes(ZARD_PROVIDER_ENTRY)) {
43
+ logger.warn('Provider already exists in the list. Skipping.');
44
+ await fsPromises.writeFile(appConfigPath, content, 'utf8');
45
+ return;
46
+ }
47
+ await fsPromises.writeFile(appConfigPath, withProvider(content, providers, eol), 'utf8');
70
48
  }
71
49
  catch (e) {
72
50
  if (e && typeof e === 'object' && 'code' in e && e.code === 'ENOENT') {
@@ -1 +1 @@
1
- {"version":3,"file":"update-angular-config.js","sourceRoot":"","sources":["../../../src/commands/init/update-angular-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-angular-config.js","sourceRoot":"","sources":["../../../src/commands/init/update-angular-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function findViteConfig(cwd: string): string | null;
2
+ /**
3
+ * Registra o Tailwind como plugin do Vite.
4
+ *
5
+ * No Analog quem compila é o Vite, não o build do Angular — um `.postcssrc.json`
6
+ * ali não é lido por ninguém, e sem o plugin o `@import 'tailwindcss'` que o
7
+ * tema escreve no CSS global não gera utilitário nenhum.
8
+ */
9
+ export declare function setupVitePlugin(cwd: string): Promise<void>;
10
+ //# sourceMappingURL=vite-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-setup.d.ts","sourceRoot":"","sources":["../../../src/commands/init/vite-setup.ts"],"names":[],"mappings":"AAYA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzD;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhE"}
@@ -0,0 +1,60 @@
1
+ import { logger } from '../../utils/logger.js';
2
+ import { arrayRange, lineEndingOf, withImport } from '../../utils/source-file.js';
3
+ import { existsSync } from 'node:fs';
4
+ import { readFile, writeFile } from 'node:fs/promises';
5
+ import * as path from 'node:path';
6
+ const TAILWIND_IMPORT = "import tailwindcss from '@tailwindcss/vite';";
7
+ const TAILWIND_PLUGIN = 'tailwindcss()';
8
+ /** Os nomes que o Vite aceita, na ordem em que ele próprio procura. */
9
+ const CONFIG_FILES = ['vite.config.ts', 'vite.config.mts', 'vite.config.js', 'vite.config.mjs'];
10
+ export function findViteConfig(cwd) {
11
+ return CONFIG_FILES.map(name => path.join(cwd, name)).find(existsSync) ?? null;
12
+ }
13
+ /**
14
+ * Registra o Tailwind como plugin do Vite.
15
+ *
16
+ * No Analog quem compila é o Vite, não o build do Angular — um `.postcssrc.json`
17
+ * ali não é lido por ninguém, e sem o plugin o `@import 'tailwindcss'` que o
18
+ * tema escreve no CSS global não gera utilitário nenhum.
19
+ */
20
+ export async function setupVitePlugin(cwd) {
21
+ const configPath = findViteConfig(cwd);
22
+ if (!configPath) {
23
+ logger.warn('vite.config.ts not found; add the @tailwindcss/vite plugin manually.');
24
+ return;
25
+ }
26
+ const original = await readFile(configPath, 'utf8');
27
+ if (original.includes('@tailwindcss/vite')) {
28
+ logger.info('Tailwind is already registered as a Vite plugin. Skipping.');
29
+ return;
30
+ }
31
+ const withPlugin = registerPlugin(withImport(original, TAILWIND_IMPORT), lineEndingOf(original));
32
+ if (withPlugin === null) {
33
+ logger.warn(`Could not find the "plugins: [...]" array in ${path.basename(configPath)}; add tailwindcss() manually.`);
34
+ return;
35
+ }
36
+ await writeFile(configPath, withPlugin, 'utf8');
37
+ }
38
+ /**
39
+ * Acrescenta `tailwindcss()` à lista de plugins.
40
+ *
41
+ * O plugin entra no fim: a ordem importa para o Vite, e o do Analog precisa
42
+ * processar os arquivos Angular antes que o Tailwind varra as classes.
43
+ */
44
+ function registerPlugin(content, eol) {
45
+ const plugins = arrayRange(content, 'plugins');
46
+ if (!plugins)
47
+ return null;
48
+ if (plugins.body.includes(TAILWIND_PLUGIN))
49
+ return content;
50
+ // A indentação dos itens existentes é a que o arquivo já usa; repeti-la evita
51
+ // que a linha nova destoe do resto quando não há Prettier depois.
52
+ const indent = /\n([ \t]+)\S/.exec(plugins.body)?.[1] ?? ' ';
53
+ const closingIndent = indent.slice(0, Math.max(0, indent.length - 2));
54
+ const trimmed = plugins.body.replace(/\s+$/, '');
55
+ const entries = trimmed.trim() ? `${trimmed.endsWith(',') ? trimmed : `${trimmed},`}` : '';
56
+ return (content.slice(0, plugins.open) +
57
+ `[${entries}${eol}${indent}${TAILWIND_PLUGIN},${eol}${closingIndent}]` +
58
+ content.slice(plugins.close + 1));
59
+ }
60
+ //# sourceMappingURL=vite-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-setup.js","sourceRoot":"","sources":["../../../src/commands/init/vite-setup.ts"],"names":[],"mappings":"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"}