zard-cli 1.0.0-beta.11 → 1.0.0-beta.110
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -167
- 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 +3 -2
- package/commands/add/dependency-resolver.d.ts.map +1 -1
- package/commands/add/dependency-resolver.js +23 -9
- package/commands/add/dependency-resolver.js.map +1 -1
- package/commands/add/index.d.ts.map +1 -1
- package/commands/add/index.js +137 -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 +61 -56
- package/commands/init/config-prompter.d.ts.map +1 -1
- package/commands/init/config-prompter.js +84 -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 +47 -16
- package/commands/init/dependencies.js.map +1 -1
- package/commands/init/index.d.ts.map +1 -1
- package/commands/init/index.js +150 -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 +153 -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/icons/families.d.ts +38 -0
- package/core/icons/families.d.ts.map +1 -0
- package/core/icons/families.js +26 -0
- package/core/icons/families.js.map +1 -0
- package/core/icons/icon-map.d.ts +24 -0
- package/core/icons/icon-map.d.ts.map +1 -0
- package/core/icons/icon-map.js +130 -0
- package/core/icons/icon-map.js.map +1 -0
- package/core/icons/index.d.ts +107 -0
- package/core/icons/index.d.ts.map +1 -0
- package/core/icons/index.js +183 -0
- package/core/icons/index.js.map +1 -0
- package/core/registry/registry-data.d.ts.map +1 -1
- package/core/registry/registry-data.js +571 -84
- 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 +65 -61
- package/core/themes/theme-definitions.js.map +1 -1
- package/index.js +40 -4
- package/index.js.map +1 -1
- package/package.json +4 -7
- 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 +84 -0
- package/ui/engine/terminal/index.d.ts.map +1 -0
- package/ui/engine/terminal/index.js +235 -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 +66 -0
- package/ui/runner.d.ts.map +1 -0
- package/ui/runner.js +135 -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 +52 -69
- package/utils/config.d.ts.map +1 -1
- package/utils/config.js +58 -7
- package/utils/config.js.map +1 -1
- package/utils/errors.d.ts +27 -0
- package/utils/errors.d.ts.map +1 -0
- package/utils/errors.js +45 -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/icon-catalog.d.ts +33 -0
- package/utils/icon-catalog.d.ts.map +1 -0
- package/utils/icon-catalog.js +62 -0
- package/utils/icon-catalog.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 +44 -2
- package/utils/registry.d.ts.map +1 -1
- package/utils/registry.js +82 -27
- package/utils/registry.js.map +1 -1
- package/utils/schema-version.d.ts +20 -0
- package/utils/schema-version.d.ts.map +1 -0
- package/utils/schema-version.js +27 -0
- package/utils/schema-version.js.map +1 -0
- 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,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O catálogo de ícones em uso, buscado no registry.
|
|
3
|
+
*
|
|
4
|
+
* A CLI carrega uma cópia da tabela, mas quem manda é o registry: é assim que
|
|
5
|
+
* uma família nova chega a quem já tem a CLI instalada, sem esperar um release
|
|
6
|
+
* dela. A cópia local é o piso — vale offline, em registry antigo que não
|
|
7
|
+
* publica o arquivo, e em qualquer falha de rede.
|
|
8
|
+
*
|
|
9
|
+
* É carregado uma vez por comando e lido de forma síncrona depois disso. A
|
|
10
|
+
* alternativa seria passar o catálogo por parâmetro da ação até o instalador de
|
|
11
|
+
* arquivos, quatro camadas abaixo, sem que nenhuma delas tivesse o que decidir
|
|
12
|
+
* sobre ele.
|
|
13
|
+
*/
|
|
14
|
+
import { type IconCatalog, type IconFamily } from '../core/icons/index.js';
|
|
15
|
+
/** O que `<registry>/icons.json` publica. */
|
|
16
|
+
export interface IconCatalogDocument extends IconCatalog {
|
|
17
|
+
$schema?: string;
|
|
18
|
+
schemaVersion?: number;
|
|
19
|
+
}
|
|
20
|
+
/** O catálogo carregado, ou a cópia local enquanto ninguém o carregou. */
|
|
21
|
+
export declare function iconCatalog(): IconCatalog;
|
|
22
|
+
/** Volta ao estado inicial. Existe para os testes não vazarem um no outro. */
|
|
23
|
+
export declare function resetIconCatalog(): void;
|
|
24
|
+
export declare function loadIconCatalog(registryUrl: string): Promise<IconCatalog>;
|
|
25
|
+
/**
|
|
26
|
+
* Recusa uma família que o catálogo não conhece, dizendo quais existem.
|
|
27
|
+
*
|
|
28
|
+
* "Invalid configuration file: components.json" era tudo o que um `"icons":
|
|
29
|
+
* "materia"` produzia — sem o campo, sem os valores aceitos, e com o arquivo
|
|
30
|
+
* inteiro sob suspeita.
|
|
31
|
+
*/
|
|
32
|
+
export declare function assertIconFamily(family: IconFamily, catalog?: IconCatalog): void;
|
|
33
|
+
//# sourceMappingURL=icon-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-catalog.d.ts","sourceRoot":"","sources":["../../src/utils/icon-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAsB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAMjG,6CAA6C;AAC7C,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,0EAA0E;AAC1E,wBAAgB,WAAW,IAAI,WAAW,CAEzC;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAqB/E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,WAA2B,GAAG,IAAI,CAO/F"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* O catálogo de ícones em uso, buscado no registry.
|
|
3
|
+
*
|
|
4
|
+
* A CLI carrega uma cópia da tabela, mas quem manda é o registry: é assim que
|
|
5
|
+
* uma família nova chega a quem já tem a CLI instalada, sem esperar um release
|
|
6
|
+
* dela. A cópia local é o piso — vale offline, em registry antigo que não
|
|
7
|
+
* publica o arquivo, e em qualquer falha de rede.
|
|
8
|
+
*
|
|
9
|
+
* É carregado uma vez por comando e lido de forma síncrona depois disso. A
|
|
10
|
+
* alternativa seria passar o catálogo por parâmetro da ação até o instalador de
|
|
11
|
+
* arquivos, quatro camadas abaixo, sem que nenhuma delas tivesse o que decidir
|
|
12
|
+
* sobre ele.
|
|
13
|
+
*/
|
|
14
|
+
import { LOCAL_ICON_CATALOG } from '../core/icons/index.js';
|
|
15
|
+
import { CliError, SchemaVersionError } from '../utils/errors.js';
|
|
16
|
+
import { fetchJson } from '../utils/http-client.js';
|
|
17
|
+
import { logger } from '../utils/logger.js';
|
|
18
|
+
import { assertSupportedSchema } from '../utils/schema-version.js';
|
|
19
|
+
let current = LOCAL_ICON_CATALOG;
|
|
20
|
+
/** O catálogo carregado, ou a cópia local enquanto ninguém o carregou. */
|
|
21
|
+
export function iconCatalog() {
|
|
22
|
+
return current;
|
|
23
|
+
}
|
|
24
|
+
/** Volta ao estado inicial. Existe para os testes não vazarem um no outro. */
|
|
25
|
+
export function resetIconCatalog() {
|
|
26
|
+
current = LOCAL_ICON_CATALOG;
|
|
27
|
+
}
|
|
28
|
+
export async function loadIconCatalog(registryUrl) {
|
|
29
|
+
try {
|
|
30
|
+
const document = await fetchJson(`${registryUrl}/icons.json`);
|
|
31
|
+
assertSupportedSchema(document.schemaVersion, 'icons.json');
|
|
32
|
+
if (!document.families || !document.icons)
|
|
33
|
+
throw new Error('missing families or icons');
|
|
34
|
+
current = { families: document.families, icons: document.icons };
|
|
35
|
+
logger.debug(`Icon catalog loaded: ${Object.keys(current.families).join(', ')}`);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
// Só a incompatibilidade de formato interrompe. Todo o resto — 404, HTML da
|
|
39
|
+
// SPA no lugar do JSON, timeout, JSON quebrado — é registry sem o catálogo,
|
|
40
|
+
// que é o estado de todos eles até o primeiro deploy com o arquivo. Tratar
|
|
41
|
+
// isso como falha derrubaria o `add` no mundo inteiro por causa de um
|
|
42
|
+
// arquivo que só importa para quem trocou de família.
|
|
43
|
+
if (error instanceof SchemaVersionError)
|
|
44
|
+
throw error;
|
|
45
|
+
logger.debug(`Falling back to the bundled icon catalog: ${error instanceof Error ? error.message : error}`);
|
|
46
|
+
current = LOCAL_ICON_CATALOG;
|
|
47
|
+
}
|
|
48
|
+
return current;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Recusa uma família que o catálogo não conhece, dizendo quais existem.
|
|
52
|
+
*
|
|
53
|
+
* "Invalid configuration file: components.json" era tudo o que um `"icons":
|
|
54
|
+
* "materia"` produzia — sem o campo, sem os valores aceitos, e com o arquivo
|
|
55
|
+
* inteiro sob suspeita.
|
|
56
|
+
*/
|
|
57
|
+
export function assertIconFamily(family, catalog = iconCatalog()) {
|
|
58
|
+
if (Object.prototype.hasOwnProperty.call(catalog.families, family))
|
|
59
|
+
return;
|
|
60
|
+
throw new CliError(`Unknown icon set "${family}" in components.json. Available: ${Object.keys(catalog.families).sort().join(', ')}.`, 'UNKNOWN_ICON_FAMILY');
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=icon-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-catalog.js","sourceRoot":"","sources":["../../src/utils/icon-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,kBAAkB,EAAqC,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAQrE,IAAI,OAAO,GAAgB,kBAAkB,CAAC;AAE9C,0EAA0E;AAC1E,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB;IAC9B,OAAO,GAAG,kBAAkB,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAsB,GAAG,WAAW,aAAa,CAAC,CAAC;QACnF,qBAAqB,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAExF,OAAO,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,sEAAsE;QACtE,sDAAsD;QACtD,IAAI,KAAK,YAAY,kBAAkB;YAAE,MAAM,KAAK,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,6CAA6C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5G,OAAO,GAAG,kBAAkB,CAAC;IAC/B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB,EAAE,UAAuB,WAAW,EAAE;IACvF,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAE,OAAO;IAE3E,MAAM,IAAI,QAAQ,CAChB,qBAAqB,MAAM,oCAAoC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACjH,qBAAqB,CACtB,CAAC;AACJ,CAAC"}
|
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"}
|
package/utils/package-manager.js
CHANGED
|
@@ -1,22 +1,80 @@
|
|
|
1
1
|
import { detect } from '@antfu/ni';
|
|
2
|
+
import { isCapturing } from '../ui/log-sink.js';
|
|
2
3
|
import { getConfig } from '../utils/config.js';
|
|
3
|
-
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { readFile } from 'node:fs/promises';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
let cachedPackageManager = null;
|
|
9
|
+
const SUPPORTED = ['npm', 'yarn', 'pnpm', 'bun'];
|
|
10
|
+
function asPackageManager(value) {
|
|
11
|
+
// `yarn@berry`, `pnpm@6`, `bun@1.3.14` — só a família interessa.
|
|
12
|
+
const name = value?.split('@')[0];
|
|
13
|
+
return SUPPORTED.includes(name) ? name : null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Qual gerenciador o *projeto* usa.
|
|
17
|
+
*
|
|
18
|
+
* A ordem importa. `npm_config_user_agent` descreve como a CLI foi chamada
|
|
19
|
+
* (`npx` sempre diz npm), não o que o projeto usa — confiar nele primeiro fazia
|
|
20
|
+
* um projeto bun receber `packageManager: "npm"` no components.json e ganhar um
|
|
21
|
+
* package-lock.json ao lado do bun.lock. O projeto responde por si: primeiro o
|
|
22
|
+
* campo `packageManager` do package.json, depois os lockfiles.
|
|
23
|
+
*/
|
|
24
|
+
export async function detectPackageManager(cwd = process.cwd()) {
|
|
25
|
+
if (cachedPackageManager)
|
|
26
|
+
return cachedPackageManager;
|
|
27
|
+
const declared = asPackageManager(await readPackageManagerField(cwd));
|
|
28
|
+
if (declared)
|
|
29
|
+
return (cachedPackageManager = declared);
|
|
30
|
+
const fromLockfile = asPackageManager(await detect({ programmatic: true, cwd }));
|
|
31
|
+
if (fromLockfile)
|
|
32
|
+
return (cachedPackageManager = fromLockfile);
|
|
4
33
|
const userAgent = process.env.npm_config_user_agent || '';
|
|
5
34
|
if (userAgent.includes('bun'))
|
|
6
|
-
return 'bun';
|
|
35
|
+
return (cachedPackageManager = 'bun');
|
|
7
36
|
if (userAgent.includes('pnpm'))
|
|
8
|
-
return 'pnpm';
|
|
37
|
+
return (cachedPackageManager = 'pnpm');
|
|
9
38
|
if (userAgent.includes('yarn'))
|
|
10
|
-
return 'yarn';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
39
|
+
return (cachedPackageManager = 'yarn');
|
|
40
|
+
return (cachedPackageManager = 'npm');
|
|
41
|
+
}
|
|
42
|
+
const RUNNER = {
|
|
43
|
+
npm: 'npx',
|
|
44
|
+
yarn: 'yarn dlx',
|
|
45
|
+
pnpm: 'pnpm dlx',
|
|
46
|
+
bun: 'bunx',
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Como sugerir que o usuário rode a CLI de novo.
|
|
50
|
+
*
|
|
51
|
+
* Aqui a pergunta é outra: não é qual gerenciador o projeto usa para instalar
|
|
52
|
+
* dependências, e sim por onde a CLI acabou de ser executada. Quem chamou
|
|
53
|
+
* `npx zard-cli init` num projeto bun não espera terminar lendo `bunx` — e o
|
|
54
|
+
* `npx` que ele já usou funciona. Só quando não dá para saber é que o
|
|
55
|
+
* gerenciador do projeto responde.
|
|
56
|
+
*/
|
|
57
|
+
export function suggestedRunner(packageManager) {
|
|
58
|
+
const userAgent = process.env.npm_config_user_agent || '';
|
|
59
|
+
if (userAgent.startsWith('bun'))
|
|
60
|
+
return RUNNER.bun;
|
|
61
|
+
if (userAgent.startsWith('pnpm'))
|
|
62
|
+
return RUNNER.pnpm;
|
|
63
|
+
if (userAgent.startsWith('yarn'))
|
|
64
|
+
return RUNNER.yarn;
|
|
65
|
+
if (userAgent.startsWith('npm'))
|
|
66
|
+
return RUNNER.npm;
|
|
67
|
+
return RUNNER[packageManager];
|
|
68
|
+
}
|
|
69
|
+
/** O campo `packageManager` do package.json — padrão do Corepack, é declaração explícita. */
|
|
70
|
+
async function readPackageManagerField(cwd) {
|
|
71
|
+
try {
|
|
72
|
+
const manifest = JSON.parse(await readFile(path.join(cwd, 'package.json'), 'utf8'));
|
|
73
|
+
return typeof manifest.packageManager === 'string' ? manifest.packageManager : null;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null;
|
|
18
77
|
}
|
|
19
|
-
return 'npm';
|
|
20
78
|
}
|
|
21
79
|
export async function getPackageManager(cwd = process.cwd()) {
|
|
22
80
|
const config = await getConfig(cwd);
|
|
@@ -35,13 +93,151 @@ export async function getInstallCommand(packageManager, isDev = false) {
|
|
|
35
93
|
return isDev ? ['install', '-D'] : ['install'];
|
|
36
94
|
}
|
|
37
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Trabalho que o gerenciador faz por hábito e que não serve à instalação em si.
|
|
98
|
+
*
|
|
99
|
+
* A auditoria de vulnerabilidades manda a árvore inteira para o registro e
|
|
100
|
+
* espera a resposta; em projeto Angular, com mais de mil pacotes, ela sozinha
|
|
101
|
+
* responde por vários segundos de uma chamada que instala meia dúzia deles.
|
|
102
|
+
*/
|
|
103
|
+
function speedFlags(packageManager) {
|
|
104
|
+
return packageManager === 'npm' ? ['--no-audit', '--no-fund'] : [];
|
|
105
|
+
}
|
|
38
106
|
export async function installPackages(packages, cwd, packageManager, isDev = false, legacyPeerDeps = false) {
|
|
39
107
|
const { execa } = await import('execa');
|
|
40
108
|
const installCmd = await getInstallCommand(packageManager, isDev);
|
|
41
|
-
const args = [...installCmd, ...packages];
|
|
109
|
+
const args = [...installCmd, ...packages, ...speedFlags(packageManager)];
|
|
42
110
|
if (legacyPeerDeps && packageManager === 'npm') {
|
|
43
111
|
args.push('--legacy-peer-deps');
|
|
44
112
|
}
|
|
45
|
-
|
|
113
|
+
if (legacyPeerDeps && packageManager === 'pnpm') {
|
|
114
|
+
args.push('--no-strict-peer-dependencies');
|
|
115
|
+
}
|
|
116
|
+
// Com a tela interativa montada, herdar o stdio deixaria o gerenciador de
|
|
117
|
+
// pacotes escrever por cima do frame. Nesse caso a saída é capturada e só
|
|
118
|
+
// aparece em modo debug; fora dela, o comportamento continua sendo o de
|
|
119
|
+
// repassar a saída ao vivo.
|
|
120
|
+
if (isCapturing()) {
|
|
121
|
+
const command = `${packageManager} ${args.join(' ')}`;
|
|
122
|
+
try {
|
|
123
|
+
// stdin ignorado, não em pipe: um pipe de entrada aberto nunca recebe EOF
|
|
124
|
+
// e o gerenciador de pacotes fica esperando nele para sempre. Fechar o
|
|
125
|
+
// stdin também garante que ele nunca tente abrir um prompt, o que seria
|
|
126
|
+
// invisível atrás da tela cheia.
|
|
127
|
+
const result = await execa(packageManager, args, {
|
|
128
|
+
cwd,
|
|
129
|
+
stdin: 'ignore',
|
|
130
|
+
stdout: 'pipe',
|
|
131
|
+
stderr: 'pipe',
|
|
132
|
+
});
|
|
133
|
+
logger.debug(`${command}\n${result.stdout}`);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
// Sem isso a falha chega ao usuário como uma linha genérica: a saída real
|
|
137
|
+
// do gerenciador de pacotes fica no sink e é impressa junto do resumo.
|
|
138
|
+
logger.error(`${command} failed:\n${outputOf(error)}`);
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// stdin ignorado aqui também. A instalação recebe os pacotes por argumento e
|
|
144
|
+
// nunca tem o que perguntar; herdar um stdin que não fecha (pipe, CI, job em
|
|
145
|
+
// background) prende o gerenciador esperando um EOF que não vem — a saída
|
|
146
|
+
// continua ao vivo porque stdout e stderr seguem herdados.
|
|
147
|
+
await execa(packageManager, args, { cwd, stdin: 'ignore', stdout: 'inherit', stderr: 'inherit' });
|
|
148
|
+
}
|
|
149
|
+
function outputOf(error) {
|
|
150
|
+
const { stderr, stdout, message } = (error ?? {});
|
|
151
|
+
return (stderr?.trim() || stdout?.trim() || message || String(error)).trim();
|
|
152
|
+
}
|
|
153
|
+
/** Só npm e pnpm têm como relaxar a checagem de peers; nos outros, repetir é repetir a mesma falha. */
|
|
154
|
+
function canRelaxPeers(packageManager) {
|
|
155
|
+
return packageManager === 'npm' || packageManager === 'pnpm';
|
|
156
|
+
}
|
|
157
|
+
let peerRelaxationEngaged = false;
|
|
158
|
+
/**
|
|
159
|
+
* Instala o lote e, se o gerenciador recusar a árvore por conflito de peers,
|
|
160
|
+
* repete com a checagem relaxada.
|
|
161
|
+
*
|
|
162
|
+
* A queda fica registrada para o resto da execução: quando o primeiro lote
|
|
163
|
+
* precisou do fallback, os seguintes vão precisar pelo mesmo motivo, e a
|
|
164
|
+
* tentativa que já se sabe condenada custa uma resolução inteira da árvore.
|
|
165
|
+
*/
|
|
166
|
+
export async function installPackagesWithRetry(packages, cwd, packageManager, isDev = false) {
|
|
167
|
+
if (packages.length === 0)
|
|
168
|
+
return;
|
|
169
|
+
if (peerRelaxationEngaged) {
|
|
170
|
+
await installPackages(packages, cwd, packageManager, isDev, true);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
await installPackages(packages, cwd, packageManager, isDev);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (!canRelaxPeers(packageManager))
|
|
178
|
+
throw error;
|
|
179
|
+
logger.warn('Installation failed, retrying with relaxed peer dependency resolution...');
|
|
180
|
+
await installPackages(packages, cwd, packageManager, isDev, true);
|
|
181
|
+
peerRelaxationEngaged = true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Descarta do lote os pacotes que o projeto já declara e já resolve.
|
|
186
|
+
*
|
|
187
|
+
* O gerenciador cobra caro por invocação — revalida a árvore inteira mesmo
|
|
188
|
+
* quando não há nada a fazer —, então o ganho não está em acelerar a instalação
|
|
189
|
+
* e sim em não chamá-la. Um `add` em projeto já inicializado pede justamente as
|
|
190
|
+
* dependências que o `init` colocou lá.
|
|
191
|
+
*
|
|
192
|
+
* O filtro é deliberadamente conservador: na dúvida o pacote continua no lote e
|
|
193
|
+
* quem decide é o gerenciador. Comparar apenas a major basta porque as versões
|
|
194
|
+
* que a CLI pede são sempre da forma `^N`.
|
|
195
|
+
*/
|
|
196
|
+
export async function filterInstalledPackages(packages, cwd) {
|
|
197
|
+
const declared = await readDeclaredDependencies(cwd);
|
|
198
|
+
if (!declared)
|
|
199
|
+
return packages;
|
|
200
|
+
return packages.filter(spec => {
|
|
201
|
+
const { name, range } = parseSpec(spec);
|
|
202
|
+
const declaredRange = declared[name];
|
|
203
|
+
if (!declaredRange)
|
|
204
|
+
return true;
|
|
205
|
+
if (!isResolvable(name, cwd))
|
|
206
|
+
return true;
|
|
207
|
+
if (range && majorOf(range) !== majorOf(declaredRange))
|
|
208
|
+
return true;
|
|
209
|
+
return false;
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
function parseSpec(spec) {
|
|
213
|
+
// O `@` de `@ng-icons/core` abre o escopo, não a versão — por isso o último.
|
|
214
|
+
const separator = spec.lastIndexOf('@');
|
|
215
|
+
if (separator <= 0)
|
|
216
|
+
return { name: spec, range: null };
|
|
217
|
+
return { name: spec.slice(0, separator), range: spec.slice(separator + 1) };
|
|
218
|
+
}
|
|
219
|
+
function majorOf(range) {
|
|
220
|
+
return /(\d+)/.exec(range)?.[1] ?? null;
|
|
221
|
+
}
|
|
222
|
+
async function readDeclaredDependencies(cwd) {
|
|
223
|
+
try {
|
|
224
|
+
const manifest = JSON.parse(await readFile(path.join(cwd, 'package.json'), 'utf8'));
|
|
225
|
+
return { ...manifest.dependencies, ...manifest.devDependencies };
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/** node_modules pode estar acima do projeto — workspaces içam tudo para a raiz. */
|
|
232
|
+
function isResolvable(name, cwd) {
|
|
233
|
+
let dir = path.resolve(cwd);
|
|
234
|
+
for (;;) {
|
|
235
|
+
if (existsSync(path.join(dir, 'node_modules', name)))
|
|
236
|
+
return true;
|
|
237
|
+
const parent = path.dirname(dir);
|
|
238
|
+
if (parent === dir)
|
|
239
|
+
return false;
|
|
240
|
+
dir = parent;
|
|
241
|
+
}
|
|
46
242
|
}
|
|
47
243
|
//# sourceMappingURL=package-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,IAAI,oBAAoB,GAA0B,IAAI,CAAC;AAEvD,MAAM,SAAS,GAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAE5E,SAAS,gBAAgB,CAAC,KAAgC;IACxD,iEAAiE;IACjE,MAAM,IAAI,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAsB,CAAC,CAAC,CAAC,CAAE,IAAuB,CAAC,CAAC,CAAC,IAAI,CAAC;AACtF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACpE,IAAI,oBAAoB;QAAE,OAAO,oBAAoB,CAAC;IAEtD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,QAAQ;QAAE,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACjF,IAAI,YAAY;QAAE,OAAO,CAAC,oBAAoB,GAAG,YAAY,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAE1D,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,oBAAoB,GAAG,KAAK,CAAC,CAAC;IACrE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,CAAC;IACvE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,CAAC;IAEvE,OAAO,CAAC,oBAAoB,GAAG,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,MAAM,GAAmC;IAC7C,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,MAAM;CACZ,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,cAA8B;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAE1D,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACnD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACrD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACrD,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAEnD,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC;AAChC,CAAC;AAED,6FAA6F;AAC7F,KAAK,UAAU,uBAAuB,CAAC,GAAW;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACpF,OAAO,OAAO,QAAQ,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,MAAM,EAAE,cAAc,IAAI,KAAK,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,cAAsB,EAAE,KAAK,GAAG,KAAK;IAC3E,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,KAAK;YACR,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,KAAK,CAAC;QACX;YACE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,cAA8B;IAChD,OAAO,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAkB,EAClB,GAAW,EACX,cAA+C,EAC/C,KAAK,GAAG,KAAK,EACb,cAAc,GAAG,KAAK;IAEtB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAElE,MAAM,IAAI,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IAEzE,IAAI,cAAc,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,cAAc,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7C,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,4BAA4B;IAC5B,IAAI,WAAW,EAAE,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,GAAG,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,0EAA0E;YAC1E,uEAAuE;YACvE,wEAAwE;YACxE,iCAAiC;YACjC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE;gBAC/C,GAAG;gBACH,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,uEAAuE;YACvE,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,aAAa,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO;IACT,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,2DAA2D;IAC3D,MAAM,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAA2D,CAAC;IAC5G,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,uGAAuG;AACvG,SAAS,aAAa,CAAC,cAA8B;IACnD,OAAO,cAAc,KAAK,KAAK,IAAI,cAAc,KAAK,MAAM,CAAC;AAC/D,CAAC;AAED,IAAI,qBAAqB,GAAG,KAAK,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,QAAkB,EAClB,GAAW,EACX,cAA8B,EAC9B,KAAK,GAAG,KAAK;IAEb,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,IAAI,qBAAqB,EAAE,CAAC;QAC1B,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAE,MAAM,KAAK,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACxF,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAClE,qBAAqB,GAAG,IAAI,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAkB,EAAE,GAAW;IAC3E,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE/B,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC5B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,6EAA6E;IAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAEvD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACpF,OAAO,EAAE,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,YAAY,CAAC,IAAY,EAAE,GAAW;IAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE5B,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAElE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACjC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC"}
|