zard-cli 1.0.0-beta.9 → 1.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -188
- package/commands/add/component-installer.d.ts +4 -1
- package/commands/add/component-installer.d.ts.map +1 -1
- package/commands/add/component-installer.js +33 -5
- package/commands/add/component-installer.js.map +1 -1
- package/commands/add/component-selector.d.ts +6 -0
- package/commands/add/component-selector.d.ts.map +1 -1
- package/commands/add/component-selector.js +9 -27
- package/commands/add/component-selector.js.map +1 -1
- package/commands/add/dark-mode-setup.d.ts +2 -0
- package/commands/add/dark-mode-setup.d.ts.map +1 -1
- package/commands/add/dark-mode-setup.js +5 -11
- package/commands/add/dark-mode-setup.js.map +1 -1
- package/commands/add/dependency-resolver.d.ts +1 -1
- package/commands/add/dependency-resolver.d.ts.map +1 -1
- package/commands/add/dependency-resolver.js +5 -6
- package/commands/add/dependency-resolver.js.map +1 -1
- package/commands/add/index.d.ts.map +1 -1
- package/commands/add/index.js +127 -85
- package/commands/add/index.js.map +1 -1
- package/commands/add/wizard.d.ts +31 -0
- package/commands/add/wizard.d.ts.map +1 -0
- package/commands/add/wizard.js +289 -0
- package/commands/add/wizard.js.map +1 -0
- package/commands/init/config-prompter.d.ts +59 -56
- package/commands/init/config-prompter.d.ts.map +1 -1
- package/commands/init/config-prompter.js +76 -74
- package/commands/init/config-prompter.js.map +1 -1
- package/commands/init/dependencies.d.ts +1 -8
- package/commands/init/dependencies.d.ts.map +1 -1
- package/commands/init/dependencies.js +36 -16
- package/commands/init/dependencies.js.map +1 -1
- package/commands/init/index.d.ts.map +1 -1
- package/commands/init/index.js +132 -86
- package/commands/init/index.js.map +1 -1
- package/commands/init/project-kind.d.ts +82 -0
- package/commands/init/project-kind.d.ts.map +1 -0
- package/commands/init/project-kind.js +166 -0
- package/commands/init/project-kind.js.map +1 -0
- package/commands/init/steps.d.ts +16 -0
- package/commands/init/steps.d.ts.map +1 -0
- package/commands/init/steps.js +151 -0
- package/commands/init/steps.js.map +1 -0
- package/commands/init/tailwind-setup.d.ts +9 -2
- package/commands/init/tailwind-setup.d.ts.map +1 -1
- package/commands/init/tailwind-setup.js +33 -9
- package/commands/init/tailwind-setup.js.map +1 -1
- package/commands/init/theme-loader.d.ts.map +1 -1
- package/commands/init/theme-loader.js +1 -3
- package/commands/init/theme-loader.js.map +1 -1
- package/commands/init/tsconfig-updater.d.ts +8 -1
- package/commands/init/tsconfig-updater.d.ts.map +1 -1
- package/commands/init/tsconfig-updater.js +30 -11
- package/commands/init/tsconfig-updater.js.map +1 -1
- package/commands/init/update-angular-config.d.ts.map +1 -1
- package/commands/init/update-angular-config.js +28 -47
- package/commands/init/update-angular-config.js.map +1 -1
- package/commands/init/vite-setup.d.ts +10 -0
- package/commands/init/vite-setup.d.ts.map +1 -0
- package/commands/init/vite-setup.js +60 -0
- package/commands/init/vite-setup.js.map +1 -0
- package/commands/init/wizard.d.ts +30 -0
- package/commands/init/wizard.d.ts.map +1 -0
- package/commands/init/wizard.js +560 -0
- package/commands/init/wizard.js.map +1 -0
- package/core/registry/registry-data.d.ts.map +1 -1
- package/core/registry/registry-data.js +359 -61
- package/core/registry/registry-data.js.map +1 -1
- package/core/themes/theme-definitions.d.ts +5 -5
- package/core/themes/theme-definitions.d.ts.map +1 -1
- package/core/themes/theme-definitions.js +15 -11
- package/core/themes/theme-definitions.js.map +1 -1
- package/index.js +40 -4
- package/index.js.map +1 -1
- package/package.json +58 -61
- package/ui/blocks.d.ts +70 -0
- package/ui/blocks.d.ts.map +1 -0
- package/ui/blocks.js +116 -0
- package/ui/blocks.js.map +1 -0
- package/ui/brand.d.ts +14 -0
- package/ui/brand.d.ts.map +1 -0
- package/ui/brand.js +35 -0
- package/ui/brand.js.map +1 -0
- package/ui/engine/animation/index.d.ts +39 -0
- package/ui/engine/animation/index.d.ts.map +1 -0
- package/ui/engine/animation/index.js +103 -0
- package/ui/engine/animation/index.js.map +1 -0
- package/ui/engine/ansi/index.d.ts +52 -0
- package/ui/engine/ansi/index.d.ts.map +1 -0
- package/ui/engine/ansi/index.js +117 -0
- package/ui/engine/ansi/index.js.map +1 -0
- package/ui/engine/components/index.d.ts +211 -0
- package/ui/engine/components/index.d.ts.map +1 -0
- package/ui/engine/components/index.js +109 -0
- package/ui/engine/components/index.js.map +1 -0
- package/ui/engine/cursor/index.d.ts +17 -0
- package/ui/engine/cursor/index.d.ts.map +1 -0
- package/ui/engine/cursor/index.js +41 -0
- package/ui/engine/cursor/index.js.map +1 -0
- package/ui/engine/diff/index.d.ts +27 -0
- package/ui/engine/diff/index.d.ts.map +1 -0
- package/ui/engine/diff/index.js +57 -0
- package/ui/engine/diff/index.js.map +1 -0
- package/ui/engine/events/index.d.ts +24 -0
- package/ui/engine/events/index.d.ts.map +1 -0
- package/ui/engine/events/index.js +60 -0
- package/ui/engine/events/index.js.map +1 -0
- package/ui/engine/focus/index.d.ts +25 -0
- package/ui/engine/focus/index.d.ts.map +1 -0
- package/ui/engine/focus/index.js +77 -0
- package/ui/engine/focus/index.js.map +1 -0
- package/ui/engine/frame/index.d.ts +48 -0
- package/ui/engine/frame/index.d.ts.map +1 -0
- package/ui/engine/frame/index.js +0 -0
- package/ui/engine/frame/index.js.map +1 -0
- package/ui/engine/index.d.ts +28 -0
- package/ui/engine/index.d.ts.map +1 -0
- package/ui/engine/index.js +28 -0
- package/ui/engine/index.js.map +1 -0
- package/ui/engine/input/index.d.ts +36 -0
- package/ui/engine/input/index.d.ts.map +1 -0
- package/ui/engine/input/index.js +224 -0
- package/ui/engine/input/index.js.map +1 -0
- package/ui/engine/layout/index.d.ts +42 -0
- package/ui/engine/layout/index.d.ts.map +1 -0
- package/ui/engine/layout/index.js +241 -0
- package/ui/engine/layout/index.js.map +1 -0
- package/ui/engine/renderer/index.d.ts +43 -0
- package/ui/engine/renderer/index.d.ts.map +1 -0
- package/ui/engine/renderer/index.js +619 -0
- package/ui/engine/renderer/index.js.map +1 -0
- package/ui/engine/scheduler/index.d.ts +22 -0
- package/ui/engine/scheduler/index.d.ts.map +1 -0
- package/ui/engine/scheduler/index.js +77 -0
- package/ui/engine/scheduler/index.js.map +1 -0
- package/ui/engine/screen/index.d.ts +39 -0
- package/ui/engine/screen/index.d.ts.map +1 -0
- package/ui/engine/screen/index.js +255 -0
- package/ui/engine/screen/index.js.map +1 -0
- package/ui/engine/terminal/index.d.ts +38 -0
- package/ui/engine/terminal/index.d.ts.map +1 -0
- package/ui/engine/terminal/index.js +104 -0
- package/ui/engine/terminal/index.js.map +1 -0
- package/ui/engine/testing/index.d.ts +27 -0
- package/ui/engine/testing/index.d.ts.map +1 -0
- package/ui/engine/testing/index.js +63 -0
- package/ui/engine/testing/index.js.map +1 -0
- package/ui/engine/theme/index.d.ts +27 -0
- package/ui/engine/theme/index.d.ts.map +1 -0
- package/ui/engine/theme/index.js +129 -0
- package/ui/engine/theme/index.js.map +1 -0
- package/ui/engine/utils/index.d.ts +12 -0
- package/ui/engine/utils/index.d.ts.map +1 -0
- package/ui/engine/utils/index.js +143 -0
- package/ui/engine/utils/index.js.map +1 -0
- package/ui/gate.d.ts +19 -0
- package/ui/gate.d.ts.map +1 -0
- package/ui/gate.js +36 -0
- package/ui/gate.js.map +1 -0
- package/ui/index.d.ts +18 -0
- package/ui/index.d.ts.map +1 -0
- package/ui/index.js +18 -0
- package/ui/index.js.map +1 -0
- package/ui/log-sink.d.ts +24 -0
- package/ui/log-sink.d.ts.map +1 -0
- package/ui/log-sink.js +35 -0
- package/ui/log-sink.js.map +1 -0
- package/ui/output.d.ts +14 -0
- package/ui/output.d.ts.map +1 -0
- package/ui/output.js +28 -0
- package/ui/output.js.map +1 -0
- package/ui/report.d.ts +30 -0
- package/ui/report.d.ts.map +1 -0
- package/ui/report.js +45 -0
- package/ui/report.js.map +1 -0
- package/ui/runner.d.ts +57 -0
- package/ui/runner.d.ts.map +1 -0
- package/ui/runner.js +119 -0
- package/ui/runner.js.map +1 -0
- package/ui/style.d.ts +24 -0
- package/ui/style.d.ts.map +1 -0
- package/ui/style.js +44 -0
- package/ui/style.js.map +1 -0
- package/ui/testing/fake-tty.d.ts +26 -0
- package/ui/testing/fake-tty.d.ts.map +1 -0
- package/ui/testing/fake-tty.js +61 -0
- package/ui/testing/fake-tty.js.map +1 -0
- package/ui/text-input.d.ts +30 -0
- package/ui/text-input.d.ts.map +1 -0
- package/ui/text-input.js +87 -0
- package/ui/text-input.js.map +1 -0
- package/ui/theme.d.ts +10 -0
- package/ui/theme.d.ts.map +1 -0
- package/ui/theme.js +20 -0
- package/ui/theme.js.map +1 -0
- package/utils/config.d.ts +48 -69
- package/utils/config.d.ts.map +1 -1
- package/utils/config.js +43 -7
- package/utils/config.js.map +1 -1
- package/utils/errors.d.ts +16 -0
- package/utils/errors.d.ts.map +1 -0
- package/utils/errors.js +31 -0
- package/utils/errors.js.map +1 -0
- package/utils/get-package-info.js +4 -4
- package/utils/get-package-info.js.map +1 -1
- package/utils/get-project-info.d.ts +30 -0
- package/utils/get-project-info.d.ts.map +1 -1
- package/utils/get-project-info.js +195 -6
- package/utils/get-project-info.js.map +1 -1
- package/utils/http-client.d.ts +8 -0
- package/utils/http-client.d.ts.map +1 -0
- package/utils/http-client.js +68 -0
- package/utils/http-client.js.map +1 -0
- package/utils/logger.d.ts +16 -1
- package/utils/logger.d.ts.map +1 -1
- package/utils/logger.js +104 -12
- package/utils/logger.js.map +1 -1
- package/utils/package-manager.d.ts +44 -1
- package/utils/package-manager.d.ts.map +1 -1
- package/utils/package-manager.js +210 -14
- package/utils/package-manager.js.map +1 -1
- package/utils/registry.d.ts +14 -2
- package/utils/registry.d.ts.map +1 -1
- package/utils/registry.js +52 -24
- package/utils/registry.js.map +1 -1
- package/utils/source-file.d.ts +40 -0
- package/utils/source-file.d.ts.map +1 -0
- package/utils/source-file.js +104 -0
- package/utils/source-file.js.map +1 -0
- package/utils/theme-selector.d.ts +1 -1
- package/utils/theme-selector.d.ts.map +1 -1
- package/utils/theme-selector.js +6 -6
- package/utils/theme-selector.js.map +1 -1
- package/utils/fetch-component.d.ts +0 -3
- package/utils/fetch-component.d.ts.map +0 -1
- package/utils/fetch-component.js +0 -75
- package/utils/fetch-component.js.map +0 -1
|
@@ -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
|
-
|
|
3
|
-
|
|
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,
|
|
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,18 +8,41 @@ const POSTCSS_CONFIG = `{
|
|
|
7
8
|
}
|
|
8
9
|
}
|
|
9
10
|
`;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
21
|
-
|
|
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 });
|
|
22
46
|
await writeFile(stylesPath, themeContent, 'utf8');
|
|
23
47
|
}
|
|
24
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":"
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-loader.d.ts","sourceRoot":"","sources":["../../../src/commands/init/theme-loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"theme-loader.d.ts","sourceRoot":"","sources":["../../../src/commands/init/theme-loader.ts"],"names":[],"mappings":"AAyBA,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCrF"}
|
|
@@ -13,11 +13,9 @@ const THEME_SCRIPT_CONTENT = `
|
|
|
13
13
|
|
|
14
14
|
const isSystem = theme === 'system' || !('theme' in localStorage);
|
|
15
15
|
const isDark = theme === 'dark' || (isSystem && prefersDark);
|
|
16
|
-
|
|
16
|
+
html.classList.add('scheme-light-dark');
|
|
17
17
|
html.classList.toggle('dark', isDark);
|
|
18
|
-
html.classList.toggle('dark-theme', isDark);
|
|
19
18
|
html.setAttribute('data-theme', theme ?? 'system');
|
|
20
|
-
html.style.colorScheme = resolvedTheme;
|
|
21
19
|
} catch (_) {}
|
|
22
20
|
})();
|
|
23
21
|
</script>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-loader.js","sourceRoot":"","sources":["../../../src/commands/init/theme-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,MAAM,oBAAoB,GAAG
|
|
1
|
+
{"version":3,"file":"theme-loader.js","sourceRoot":"","sources":["../../../src/commands/init/theme-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;CAiB5B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,SAAiB;IACpE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACzC,IAAI,OAAO,GAAW,MAAM,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAEzE,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACxC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAErE,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1B,MAAM,cAAc,GAAG,cAAc,CAAC;YAEtC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,oBAAoB,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAE3G,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,gDAAgD;QAChD,MAAM,UAAU,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrE,MAAM,CAAC,KAAK,CAAC,uCAAuC,eAAe,0BAA0B,CAAC,CAAC;QACjG,CAAC;aAAM,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,iCAAiC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { type Config } from '../../utils/config.js';
|
|
2
|
-
|
|
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,
|
|
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
|
-
|
|
7
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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":"
|
|
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;
|
|
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,9 +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 =
|
|
6
|
-
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
|
+
}
|
|
7
22
|
/**
|
|
8
23
|
* Asynchronously reads, modifies, and writes the Angular application configuration file.
|
|
9
24
|
* @returns {Promise<void>} A promise that resolves when the file operation is complete.
|
|
@@ -16,54 +31,20 @@ export async function updateAngularConfig(cwd, config) {
|
|
|
16
31
|
}
|
|
17
32
|
try {
|
|
18
33
|
await fsPromises.access(appConfigPath);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
let match;
|
|
25
|
-
while ((match = importRegex.exec(content)) !== null) {
|
|
26
|
-
lastImportMatch = match;
|
|
27
|
-
}
|
|
28
|
-
if (lastImportMatch) {
|
|
29
|
-
const insertionIndex = lastImportMatch.index + lastImportMatch[0].length;
|
|
30
|
-
content = content.slice(0, insertionIndex) + ZARD_PROVIDER_IMPORT + content.slice(insertionIndex);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
content = ZARD_PROVIDER_IMPORT + content;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
logger.warn('Import statement already exists. Skipping.');
|
|
38
|
-
}
|
|
39
|
-
// Add the provider to the providers array
|
|
40
|
-
const providersRegex = /providers:\s*\[([^\]]*?)\]/s;
|
|
41
|
-
if (providersRegex.test(content)) {
|
|
42
|
-
content = content.replace(providersRegex, (match, providersContent) => {
|
|
43
|
-
const entryToCheck = ZARD_PROVIDER_ENTRY.replace(/,$/, '').trim();
|
|
44
|
-
if (providersContent.includes(entryToCheck)) {
|
|
45
|
-
logger.warn('Provider already exists in the list. Skipping.');
|
|
46
|
-
return match;
|
|
47
|
-
}
|
|
48
|
-
let newProvidersContent;
|
|
49
|
-
const trimmedContent = providersContent.trim();
|
|
50
|
-
if (trimmedContent === '') {
|
|
51
|
-
newProvidersContent = `\n ${ZARD_PROVIDER_ENTRY.trim().replace(/,$/, '')}\n `;
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
const contentWithTrailingComma = trimmedContent.endsWith(',')
|
|
55
|
-
? providersContent
|
|
56
|
-
: providersContent.trimEnd() + ',';
|
|
57
|
-
newProvidersContent = `${contentWithTrailingComma}\n ${ZARD_PROVIDER_ENTRY}`;
|
|
58
|
-
}
|
|
59
|
-
return `providers: [${newProvidersContent.replace(/,\s*$/, ',')}]`;
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
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) {
|
|
63
39
|
logger.error('Could not find the "providers: [...]" array in app.config.ts. The file structure may be unsupported.');
|
|
64
40
|
return;
|
|
65
41
|
}
|
|
66
|
-
|
|
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');
|
|
67
48
|
}
|
|
68
49
|
catch (e) {
|
|
69
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":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,oBAAoB,GAAG,
|
|
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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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ProjectKind } from '../../commands/init/project-kind.js';
|
|
2
|
+
import { type InitStep } from '../../commands/init/steps.js';
|
|
3
|
+
import { type LogRecord } from '../../ui/index.js';
|
|
4
|
+
import { type Config } from '../../utils/config.js';
|
|
5
|
+
import { type ProjectInfo } from '../../utils/get-project-info.js';
|
|
6
|
+
export interface InitWizardOptions {
|
|
7
|
+
readonly cwd: string;
|
|
8
|
+
readonly projectInfo: ProjectInfo;
|
|
9
|
+
readonly packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun';
|
|
10
|
+
readonly isReInitializing: boolean;
|
|
11
|
+
/** Pula a confirmação final (`--yes`). */
|
|
12
|
+
readonly skipConfirmation: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* O tipo pedido em `--type`, se houver.
|
|
15
|
+
*
|
|
16
|
+
* A pergunta continua sendo feita — a flag só posiciona o cursor no que o
|
|
17
|
+
* usuário já disse querer, em vez de deixá-lo procurar na lista de novo.
|
|
18
|
+
*/
|
|
19
|
+
readonly presetKind?: ProjectKind;
|
|
20
|
+
/** O projeto pedido em `--project`, pelo mesmo motivo. */
|
|
21
|
+
readonly presetProjectRoot?: string;
|
|
22
|
+
/** Etapas de execução, montadas só quando o config está pronto. */
|
|
23
|
+
buildSteps(config: Config): InitStep[];
|
|
24
|
+
}
|
|
25
|
+
export interface InitWizardResult {
|
|
26
|
+
readonly config: Config;
|
|
27
|
+
readonly logs: readonly LogRecord[];
|
|
28
|
+
}
|
|
29
|
+
export declare function runInitWizard(options: InitWizardOptions): Promise<InitWizardResult>;
|
|
30
|
+
//# sourceMappingURL=wizard.d.ts.map
|