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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { access, readFile } from 'node:fs/promises';
|
|
1
|
+
import { access, readdir, readFile } from 'node:fs/promises';
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
async function pathExists(filePath) {
|
|
@@ -17,27 +17,216 @@ async function readJson(filePath) {
|
|
|
17
17
|
const packageJsonSchema = z.object({
|
|
18
18
|
name: z.string(),
|
|
19
19
|
version: z.string().optional(),
|
|
20
|
-
dependencies: z.record(z.string()).optional(),
|
|
21
|
-
devDependencies: z.record(z.string()).optional(),
|
|
20
|
+
dependencies: z.record(z.string(), z.string()).optional(),
|
|
21
|
+
devDependencies: z.record(z.string(), z.string()).optional(),
|
|
22
22
|
});
|
|
23
|
+
async function findPackageJson(startDir) {
|
|
24
|
+
let dir = path.resolve(startDir);
|
|
25
|
+
const root = path.parse(dir).root;
|
|
26
|
+
while (dir !== root) {
|
|
27
|
+
const candidate = path.join(dir, 'package.json');
|
|
28
|
+
if (await pathExists(candidate)) {
|
|
29
|
+
return candidate;
|
|
30
|
+
}
|
|
31
|
+
dir = path.dirname(dir);
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/** Normaliza separadores para o formato que os arquivos de configuração usam. */
|
|
36
|
+
function toPosix(value) {
|
|
37
|
+
return value.split(path.sep).join('/');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* O que o target de build diz sobre o projeto.
|
|
41
|
+
*
|
|
42
|
+
* `angular.json` chama de `architect`/`builder` e o Nx de `targets`/`executor`,
|
|
43
|
+
* mas o formato das opções é o mesmo — então uma leitura só serve aos dois.
|
|
44
|
+
*/
|
|
45
|
+
function readBuildTarget(targets) {
|
|
46
|
+
const build = targets?.build ?? {};
|
|
47
|
+
const options = build.options ?? {};
|
|
48
|
+
const index = options.index;
|
|
49
|
+
return {
|
|
50
|
+
tool: String(build.builder ?? build.executor ?? ''),
|
|
51
|
+
styles: Array.isArray(options.styles) ? options.styles.filter((style) => typeof style === 'string') : [],
|
|
52
|
+
index: typeof index === 'string' ? index : typeof index?.input === 'string' ? index.input : null,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** Analog substitui o builder do Angular pelo dele; é assim que se anuncia. */
|
|
56
|
+
function flavorOf(tool) {
|
|
57
|
+
return tool.startsWith('@analogjs/') ? 'analog' : 'angular';
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Lê os projetos do `angular.json`.
|
|
61
|
+
*
|
|
62
|
+
* É o que distingue uma aplicação de uma biblioteca — o package.json não diz.
|
|
63
|
+
* Workspace sem `angular.json` (ou ilegível) devolve lista vazia, e quem chama
|
|
64
|
+
* decide o que fazer com isso.
|
|
65
|
+
*/
|
|
66
|
+
async function readAngularProjects(workspaceRoot) {
|
|
67
|
+
try {
|
|
68
|
+
const workspace = await readJson(path.join(workspaceRoot, 'angular.json'));
|
|
69
|
+
return Object.entries(workspace.projects ?? {}).map(([name, project]) => {
|
|
70
|
+
const config = project;
|
|
71
|
+
const root = config.root === '.' ? '' : (config.root ?? '');
|
|
72
|
+
const build = readBuildTarget(config.architect);
|
|
73
|
+
return {
|
|
74
|
+
name,
|
|
75
|
+
projectType: config.projectType === 'library' ? 'library' : 'application',
|
|
76
|
+
root,
|
|
77
|
+
sourceRoot: config.sourceRoot ?? (root ? `${root}/src` : 'src'),
|
|
78
|
+
flavor: flavorOf(build.tool),
|
|
79
|
+
styles: build.styles,
|
|
80
|
+
index: build.index,
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Onde procurar por `project.json`.
|
|
90
|
+
*
|
|
91
|
+
* O Nx não obriga um layout, mas gera em `apps/` e `libs/` (ou no que
|
|
92
|
+
* `workspaceLayout` disser), e monorepos de pacotes usam `packages/`. Procurar
|
|
93
|
+
* só nesses lugares evita varrer o repositório inteiro atrás de configuração.
|
|
94
|
+
*/
|
|
95
|
+
async function nxSearchRoots(workspaceRoot) {
|
|
96
|
+
try {
|
|
97
|
+
const nxConfig = await readJson(path.join(workspaceRoot, 'nx.json'));
|
|
98
|
+
const layout = nxConfig.workspaceLayout ?? {};
|
|
99
|
+
return [...new Set([layout.appsDir ?? 'apps', layout.libsDir ?? 'libs', 'packages'])];
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return ['apps', 'libs', 'packages'];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Diretórios que contêm um `project.json`, até dois níveis abaixo da busca.
|
|
107
|
+
*
|
|
108
|
+
* Um projeto não contém outro, então achar a configuração encerra a descida —
|
|
109
|
+
* o que também impede que `node_modules` de um projeto vire um segundo projeto.
|
|
110
|
+
*/
|
|
111
|
+
async function findProjectDirs(baseDir, depth) {
|
|
112
|
+
if (await pathExists(path.join(baseDir, 'project.json'))) {
|
|
113
|
+
return [baseDir];
|
|
114
|
+
}
|
|
115
|
+
if (depth === 0)
|
|
116
|
+
return [];
|
|
117
|
+
let entries;
|
|
118
|
+
try {
|
|
119
|
+
entries = await readdir(baseDir, { withFileTypes: true });
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
const found = await Promise.all(entries
|
|
125
|
+
.filter(entry => entry.isDirectory() && entry.name !== 'node_modules' && !entry.name.startsWith('.'))
|
|
126
|
+
.map(entry => findProjectDirs(path.join(baseDir, entry.name), depth - 1)));
|
|
127
|
+
return found.flat();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Lê os projetos de um workspace Nx.
|
|
131
|
+
*
|
|
132
|
+
* O Nx não tem `angular.json`: cada projeto se descreve no próprio
|
|
133
|
+
* `project.json`, e a raiz do projeto é o diretório onde esse arquivo está.
|
|
134
|
+
*/
|
|
135
|
+
async function readNxProjects(workspaceRoot) {
|
|
136
|
+
const searchRoots = await nxSearchRoots(workspaceRoot);
|
|
137
|
+
const dirs = (await Promise.all(searchRoots.map(dir => findProjectDirs(path.join(workspaceRoot, dir), 2)))).flat();
|
|
138
|
+
const projects = await Promise.all(dirs.map(async (dir) => {
|
|
139
|
+
try {
|
|
140
|
+
const config = await readJson(path.join(dir, 'project.json'));
|
|
141
|
+
const root = toPosix(path.relative(workspaceRoot, dir));
|
|
142
|
+
const name = config.name ?? path.basename(dir);
|
|
143
|
+
if (await isE2eProject(dir, name))
|
|
144
|
+
return null;
|
|
145
|
+
const build = readBuildTarget(config.targets);
|
|
146
|
+
return {
|
|
147
|
+
name,
|
|
148
|
+
projectType: nxProjectType(config),
|
|
149
|
+
root,
|
|
150
|
+
sourceRoot: config.sourceRoot ?? `${root}/src`,
|
|
151
|
+
flavor: flavorOf(build.tool),
|
|
152
|
+
styles: build.styles,
|
|
153
|
+
index: build.index,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
}));
|
|
160
|
+
// A ordem do sistema de arquivos é arbitrária; ordenar dá ao menu uma lista
|
|
161
|
+
// estável entre execuções.
|
|
162
|
+
return projects
|
|
163
|
+
.filter((project) => project !== null)
|
|
164
|
+
.sort((a, b) => a.root.localeCompare(b.root));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Aplicação ou biblioteca, quando o `project.json` não declara.
|
|
168
|
+
*
|
|
169
|
+
* Um `serve` só existe para o que é servido; biblioteca nenhuma tem. É a
|
|
170
|
+
* distinção que sobra quando o campo explícito falta.
|
|
171
|
+
*/
|
|
172
|
+
function nxProjectType(config) {
|
|
173
|
+
if (config.projectType === 'library' || config.projectType === 'application') {
|
|
174
|
+
return config.projectType;
|
|
175
|
+
}
|
|
176
|
+
return config.targets?.serve ? 'application' : 'library';
|
|
177
|
+
}
|
|
178
|
+
/** Configurações que só existem num projeto de testes de ponta a ponta. */
|
|
179
|
+
const E2E_CONFIGS = ['playwright.config.ts', 'playwright.config.js', 'cypress.config.ts', 'cypress.config.js'];
|
|
180
|
+
/**
|
|
181
|
+
* Se o projeto existe apenas para rodar testes de ponta a ponta.
|
|
182
|
+
*
|
|
183
|
+
* O gerador do Nx cria `<app>-e2e` declarando `projectType: "application"`, e
|
|
184
|
+
* com isso ele aparecia na lista de apps que podem receber os componentes — mas
|
|
185
|
+
* ali não há `app.config.ts`, CSS global nem build para configurar. O sufixo é
|
|
186
|
+
* a convenção do Nx; o arquivo de configuração do runner confirma os casos em
|
|
187
|
+
* que o projeto foi renomeado.
|
|
188
|
+
*/
|
|
189
|
+
async function isE2eProject(projectDir, name) {
|
|
190
|
+
if (name.endsWith('-e2e') || name.endsWith('-e2e-ct'))
|
|
191
|
+
return true;
|
|
192
|
+
const configs = await Promise.all(E2E_CONFIGS.map(file => pathExists(path.join(projectDir, file))));
|
|
193
|
+
return configs.some(Boolean);
|
|
194
|
+
}
|
|
23
195
|
export async function getProjectInfo(cwd) {
|
|
24
|
-
const packageJsonPath =
|
|
25
|
-
if (!
|
|
196
|
+
const packageJsonPath = await findPackageJson(cwd);
|
|
197
|
+
if (!packageJsonPath) {
|
|
26
198
|
throw new Error('No package.json found. Please run this command in your project root.');
|
|
27
199
|
}
|
|
200
|
+
const workspaceRoot = path.dirname(packageJsonPath);
|
|
28
201
|
const packageJson = packageJsonSchema.parse(await readJson(packageJsonPath));
|
|
29
202
|
const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
|
|
30
203
|
const hasAngular = !!deps['@angular/core'];
|
|
31
204
|
const hasTypeScript = !!deps['typescript'];
|
|
32
205
|
const hasTailwind = !!deps['tailwindcss'];
|
|
33
206
|
const hasNx = !!deps['nx'] || !!deps['@nx/workspace'];
|
|
34
|
-
const
|
|
207
|
+
const hasAnalog = !!deps['@analogjs/platform'] || !!deps['@analogjs/router'] || !!deps['@analogjs/vite-plugin-angular'];
|
|
208
|
+
// Um workspace Nx pode ter os dois arquivos; o `angular.json` só descreve os
|
|
209
|
+
// projetos que já existiam antes da migração, então o Nx tem a palavra final.
|
|
210
|
+
const projects = hasNx ? await readNxProjects(workspaceRoot) : await readAngularProjects(workspaceRoot);
|
|
211
|
+
const angularVersionRaw = deps['@angular/core'] || null;
|
|
212
|
+
const angularVersion = angularVersionRaw?.replace(/[^0-9.]/g, '') || null;
|
|
213
|
+
// O Nx guarda os paths num tsconfig.base.json que os projetos estendem;
|
|
214
|
+
// escrever no tsconfig.json da raiz não chegaria a nenhum deles.
|
|
215
|
+
const tsconfigFile = (await pathExists(path.join(workspaceRoot, 'tsconfig.base.json')))
|
|
216
|
+
? 'tsconfig.base.json'
|
|
217
|
+
: 'tsconfig.json';
|
|
35
218
|
return {
|
|
36
219
|
framework: hasAngular ? 'angular' : 'unknown',
|
|
220
|
+
root: workspaceRoot,
|
|
221
|
+
workspace: hasNx ? 'nx' : 'angular',
|
|
37
222
|
hasTypeScript,
|
|
38
223
|
hasTailwind,
|
|
39
224
|
hasNx,
|
|
225
|
+
hasAnalog,
|
|
226
|
+
tsconfigFile,
|
|
40
227
|
angularVersion,
|
|
228
|
+
angularVersionRaw,
|
|
229
|
+
projects,
|
|
41
230
|
};
|
|
42
231
|
}
|
|
43
232
|
//# sourceMappingURL=get-project-info.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-project-info.js","sourceRoot":"","sources":["../../src/utils/get-project-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-project-info.js","sourceRoot":"","sources":["../../src/utils/get-project-info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface FetchOptions {
|
|
2
|
+
timeout?: number;
|
|
3
|
+
retries?: number;
|
|
4
|
+
backoffBase?: number;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function fetchJson<T>(url: string, options?: FetchOptions): Promise<T>;
|
|
8
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAUD,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CA6DlF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { NetworkError } from '../utils/errors.js';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
|
+
const DEFAULT_TIMEOUT = 30_000;
|
|
4
|
+
const DEFAULT_RETRIES = 3;
|
|
5
|
+
const DEFAULT_BACKOFF_BASE = 1_000;
|
|
6
|
+
function sleep(ms) {
|
|
7
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
8
|
+
}
|
|
9
|
+
export async function fetchJson(url, options) {
|
|
10
|
+
const { timeout = DEFAULT_TIMEOUT, retries = DEFAULT_RETRIES, backoffBase = DEFAULT_BACKOFF_BASE } = options ?? {};
|
|
11
|
+
const headers = {
|
|
12
|
+
'User-Agent': 'zard-cli',
|
|
13
|
+
Accept: 'application/json',
|
|
14
|
+
...options?.headers,
|
|
15
|
+
};
|
|
16
|
+
for (let attempt = 1; attempt <= retries; attempt++) {
|
|
17
|
+
try {
|
|
18
|
+
const response = await fetch(url, {
|
|
19
|
+
signal: AbortSignal.timeout(timeout),
|
|
20
|
+
headers,
|
|
21
|
+
});
|
|
22
|
+
if (response.status === 429) {
|
|
23
|
+
const retryAfter = parseInt(response.headers.get('Retry-After') ?? '5', 10);
|
|
24
|
+
logger.debug(`Rate limited by ${url}, retrying in ${retryAfter}s...`);
|
|
25
|
+
await sleep(retryAfter * 1000);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw new NetworkError(`HTTP ${response.status}: ${response.statusText}`, url);
|
|
30
|
+
}
|
|
31
|
+
const text = await response.text();
|
|
32
|
+
if (!text || text.includes('<!DOCTYPE') || text.includes('<html')) {
|
|
33
|
+
throw new NetworkError('Received HTML instead of JSON from registry', url);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
return JSON.parse(text);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new NetworkError('Invalid JSON response from registry', url);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof NetworkError) {
|
|
44
|
+
if (attempt === retries)
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
else if (error instanceof DOMException && error.name === 'TimeoutError') {
|
|
48
|
+
if (attempt === retries) {
|
|
49
|
+
throw new NetworkError(`Request timed out after ${timeout}ms`, url);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (error instanceof TypeError) {
|
|
53
|
+
// fetch throws TypeError for DNS failures, connection refused, etc.
|
|
54
|
+
if (attempt === retries) {
|
|
55
|
+
throw new NetworkError(`Connection failed: ${error.message}`, url);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
const delay = backoffBase * Math.pow(2, attempt - 1);
|
|
62
|
+
logger.debug(`Attempt ${attempt}/${retries} failed for ${url}, retrying in ${delay}ms...`);
|
|
63
|
+
await sleep(delay);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
throw new NetworkError(`Failed after ${retries} attempts`, url);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"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"}
|
package/utils/logger.d.ts
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
|
+
export declare function enableDebug(): void;
|
|
2
|
+
export declare function isDebugEnabled(): boolean;
|
|
1
3
|
export declare const logger: {
|
|
2
4
|
error(...args: unknown[]): void;
|
|
3
5
|
warn(...args: unknown[]): void;
|
|
4
6
|
info(...args: unknown[]): void;
|
|
5
7
|
success(...args: unknown[]): void;
|
|
8
|
+
debug(...args: unknown[]): void;
|
|
6
9
|
break(): void;
|
|
7
10
|
};
|
|
8
|
-
export
|
|
11
|
+
export interface Spinner {
|
|
12
|
+
text: string;
|
|
13
|
+
start(): Spinner;
|
|
14
|
+
stop(): Spinner;
|
|
15
|
+
succeed(text?: string): Spinner;
|
|
16
|
+
fail(text?: string): Spinner;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Indicador de progresso para os caminhos que rodam fora da tela interativa
|
|
20
|
+
* (headless, --yes, CI). Dentro de um wizard quem anima é a engine, e aqui as
|
|
21
|
+
* transições viram apenas registros no sink.
|
|
22
|
+
*/
|
|
23
|
+
export declare function spinner(text: string): Spinner;
|
|
9
24
|
//# sourceMappingURL=logger.d.ts.map
|
package/utils/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAwBD,eAAO,MAAM,MAAM;mBACF,OAAO,EAAE;kBAGV,OAAO,EAAE;kBAGT,OAAO,EAAE;qBAGN,OAAO,EAAE;mBAGX,OAAO,EAAE;;CAQzB,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,IAAI,OAAO,CAAC;IACjB,IAAI,IAAI,OAAO,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAKD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAuD7C"}
|
package/utils/logger.js
CHANGED
|
@@ -1,27 +1,119 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { capture, isCapturing } from '../ui/log-sink.js';
|
|
2
|
+
import { formatRecord, writeLine } from '../ui/output.js';
|
|
3
|
+
import { style } from '../ui/style.js';
|
|
4
|
+
let debugEnabled = false;
|
|
5
|
+
export function enableDebug() {
|
|
6
|
+
debugEnabled = true;
|
|
7
|
+
}
|
|
8
|
+
export function isDebugEnabled() {
|
|
9
|
+
return debugEnabled;
|
|
10
|
+
}
|
|
11
|
+
function toMessage(args) {
|
|
12
|
+
return args
|
|
13
|
+
.map(arg => {
|
|
14
|
+
if (typeof arg === 'string')
|
|
15
|
+
return arg;
|
|
16
|
+
if (arg instanceof Error)
|
|
17
|
+
return arg.message;
|
|
18
|
+
return String(arg);
|
|
19
|
+
})
|
|
20
|
+
.join(' ');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Escreve uma mensagem — ou a retém, quando a tela interativa está montada.
|
|
24
|
+
*
|
|
25
|
+
* Sem esse desvio, um `logger.warn` disparado no meio de uma instalação
|
|
26
|
+
* escreveria por cima do frame que a engine acabou de pintar.
|
|
27
|
+
*/
|
|
28
|
+
function emit(level, args) {
|
|
29
|
+
const message = toMessage(args);
|
|
30
|
+
if (capture(level, message))
|
|
31
|
+
return;
|
|
32
|
+
writeLine(formatRecord({ level, message }));
|
|
33
|
+
}
|
|
3
34
|
export const logger = {
|
|
4
35
|
error(...args) {
|
|
5
|
-
|
|
36
|
+
emit('error', args);
|
|
6
37
|
},
|
|
7
38
|
warn(...args) {
|
|
8
|
-
|
|
39
|
+
emit('warn', args);
|
|
9
40
|
},
|
|
10
41
|
info(...args) {
|
|
11
|
-
|
|
42
|
+
emit('info', args);
|
|
12
43
|
},
|
|
13
44
|
success(...args) {
|
|
14
|
-
|
|
45
|
+
emit('success', args);
|
|
46
|
+
},
|
|
47
|
+
debug(...args) {
|
|
48
|
+
if (!debugEnabled)
|
|
49
|
+
return;
|
|
50
|
+
emit('debug', args);
|
|
15
51
|
},
|
|
16
52
|
break() {
|
|
17
|
-
|
|
53
|
+
if (isCapturing())
|
|
54
|
+
return;
|
|
55
|
+
writeLine();
|
|
18
56
|
},
|
|
19
57
|
};
|
|
58
|
+
const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
59
|
+
const FRAME_MS = 80;
|
|
60
|
+
/**
|
|
61
|
+
* Indicador de progresso para os caminhos que rodam fora da tela interativa
|
|
62
|
+
* (headless, --yes, CI). Dentro de um wizard quem anima é a engine, e aqui as
|
|
63
|
+
* transições viram apenas registros no sink.
|
|
64
|
+
*/
|
|
20
65
|
export function spinner(text) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
66
|
+
const animated = Boolean(process.stdout.isTTY) && !isCapturing();
|
|
67
|
+
let timer;
|
|
68
|
+
let frame = 0;
|
|
69
|
+
const clearLine = () => {
|
|
70
|
+
if (animated)
|
|
71
|
+
process.stdout.write('\r\x1b[2K');
|
|
72
|
+
};
|
|
73
|
+
const paint = () => {
|
|
74
|
+
// A captura pode começar depois que o spinner já estava rodando; nesse caso
|
|
75
|
+
// a tela é dona do terminal e nada mais pode escrever direto nele.
|
|
76
|
+
if (isCapturing())
|
|
77
|
+
return;
|
|
78
|
+
clearLine();
|
|
79
|
+
process.stdout.write(`${style.primary(FRAMES[frame] ?? FRAMES[0] ?? '')} ${style.dim(instance.text)}`);
|
|
80
|
+
frame = (frame + 1) % FRAMES.length;
|
|
81
|
+
};
|
|
82
|
+
const finish = (level, message) => {
|
|
83
|
+
instance.stop();
|
|
84
|
+
emit(level, [message ?? instance.text]);
|
|
85
|
+
return instance;
|
|
86
|
+
};
|
|
87
|
+
const instance = {
|
|
88
|
+
text,
|
|
89
|
+
start() {
|
|
90
|
+
if (!animated) {
|
|
91
|
+
emit('info', [instance.text]);
|
|
92
|
+
return instance;
|
|
93
|
+
}
|
|
94
|
+
if (timer)
|
|
95
|
+
return instance;
|
|
96
|
+
paint();
|
|
97
|
+
timer = setInterval(paint, FRAME_MS);
|
|
98
|
+
// Um spinner ativo não deve segurar o processo vivo por si só.
|
|
99
|
+
timer.unref?.();
|
|
100
|
+
return instance;
|
|
101
|
+
},
|
|
102
|
+
stop() {
|
|
103
|
+
if (timer) {
|
|
104
|
+
clearInterval(timer);
|
|
105
|
+
timer = undefined;
|
|
106
|
+
clearLine();
|
|
107
|
+
}
|
|
108
|
+
return instance;
|
|
109
|
+
},
|
|
110
|
+
succeed(message) {
|
|
111
|
+
return finish('success', message);
|
|
112
|
+
},
|
|
113
|
+
fail(message) {
|
|
114
|
+
return finish('error', message);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
return instance;
|
|
26
118
|
}
|
|
27
119
|
//# sourceMappingURL=logger.js.map
|
package/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';
|
|
2
|
+
/**
|
|
3
|
+
* Qual gerenciador o *projeto* usa.
|
|
4
|
+
*
|
|
5
|
+
* A ordem importa. `npm_config_user_agent` descreve como a CLI foi chamada
|
|
6
|
+
* (`npx` sempre diz npm), não o que o projeto usa — confiar nele primeiro fazia
|
|
7
|
+
* um projeto bun receber `packageManager: "npm"` no components.json e ganhar um
|
|
8
|
+
* package-lock.json ao lado do bun.lock. O projeto responde por si: primeiro o
|
|
9
|
+
* campo `packageManager` do package.json, depois os lockfiles.
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectPackageManager(cwd?: string): Promise<PackageManager>;
|
|
12
|
+
/**
|
|
13
|
+
* Como sugerir que o usuário rode a CLI de novo.
|
|
14
|
+
*
|
|
15
|
+
* Aqui a pergunta é outra: não é qual gerenciador o projeto usa para instalar
|
|
16
|
+
* dependências, e sim por onde a CLI acabou de ser executada. Quem chamou
|
|
17
|
+
* `npx zard-cli init` num projeto bun não espera terminar lendo `bunx` — e o
|
|
18
|
+
* `npx` que ele já usou funciona. Só quando não dá para saber é que o
|
|
19
|
+
* gerenciador do projeto responde.
|
|
20
|
+
*/
|
|
21
|
+
export declare function suggestedRunner(packageManager: PackageManager): string;
|
|
2
22
|
export declare function getPackageManager(cwd?: string): Promise<'npm' | 'yarn' | 'pnpm' | 'bun'>;
|
|
3
23
|
export declare function getInstallCommand(packageManager: string, isDev?: boolean): Promise<string[]>;
|
|
4
24
|
export declare function installPackages(packages: string[], cwd: string, packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun', isDev?: boolean, legacyPeerDeps?: boolean): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Instala o lote e, se o gerenciador recusar a árvore por conflito de peers,
|
|
27
|
+
* repete com a checagem relaxada.
|
|
28
|
+
*
|
|
29
|
+
* A queda fica registrada para o resto da execução: quando o primeiro lote
|
|
30
|
+
* precisou do fallback, os seguintes vão precisar pelo mesmo motivo, e a
|
|
31
|
+
* tentativa que já se sabe condenada custa uma resolução inteira da árvore.
|
|
32
|
+
*/
|
|
33
|
+
export declare function installPackagesWithRetry(packages: string[], cwd: string, packageManager: PackageManager, isDev?: boolean): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Descarta do lote os pacotes que o projeto já declara e já resolve.
|
|
36
|
+
*
|
|
37
|
+
* O gerenciador cobra caro por invocação — revalida a árvore inteira mesmo
|
|
38
|
+
* quando não há nada a fazer —, então o ganho não está em acelerar a instalação
|
|
39
|
+
* e sim em não chamá-la. Um `add` em projeto já inicializado pede justamente as
|
|
40
|
+
* dependências que o `init` colocou lá.
|
|
41
|
+
*
|
|
42
|
+
* O filtro é deliberadamente conservador: na dúvida o pacote continua no lote e
|
|
43
|
+
* quem decide é o gerenciador. Comparar apenas a major basta porque as versões
|
|
44
|
+
* que a CLI pede são sempre da forma `^N`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function filterInstalledPackages(packages: string[], cwd: string): Promise<string[]>;
|
|
47
|
+
export {};
|
|
5
48
|
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAQA,KAAK,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAYtD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB/F;AASD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAStE;AAYD,wBAAsB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,CAG7G;AAED,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYhG;AAaD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,EAC/C,KAAK,UAAQ,EACb,cAAc,UAAQ,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAcD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,KAAK,UAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAchG"}
|