zard-cli 1.0.0-beta.84 → 1.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -60
- package/commands/add/component-installer.d.ts +2 -0
- package/commands/add/component-installer.d.ts.map +1 -1
- package/commands/add/component-installer.js +9 -4
- 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.map +1 -1
- package/commands/add/dark-mode-setup.js +2 -11
- package/commands/add/dark-mode-setup.js.map +1 -1
- package/commands/add/index.d.ts.map +1 -1
- package/commands/add/index.js +106 -86
- 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 +47 -3
- 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 +35 -17
- package/commands/init/dependencies.js.map +1 -1
- package/commands/init/index.d.ts.map +1 -1
- package/commands/init/index.js +129 -81
- 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 -12
- package/commands/init/tailwind-setup.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 -50
- 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 +8 -45
- package/core/registry/registry-data.js.map +1 -1
- package/index.js +5 -3
- 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 +22 -0
- package/utils/config.d.ts.map +1 -1
- package/utils/config.js +26 -1
- package/utils/config.js.map +1 -1
- package/utils/get-project-info.d.ts +29 -0
- package/utils/get-project-info.d.ts.map +1 -1
- package/utils/get-project-info.js +176 -1
- package/utils/get-project-info.js.map +1 -1
- package/utils/logger.d.ts +13 -1
- package/utils/logger.d.ts.map +1 -1
- package/utils/logger.js +95 -15
- package/utils/logger.js.map +1 -1
- package/utils/package-manager.d.ts +42 -1
- package/utils/package-manager.d.ts.map +1 -1
- package/utils/package-manager.js +204 -11
- package/utils/package-manager.js.map +1 -1
- package/utils/registry.d.ts +12 -2
- package/utils/registry.d.ts.map +1 -1
- package/utils/registry.js +21 -6
- 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
|
@@ -1,20 +1,47 @@
|
|
|
1
|
+
import { bundlerFor, isLibraryKind } from '../../commands/init/project-kind.js';
|
|
1
2
|
import { getProjectInfo } from '../../utils/get-project-info.js';
|
|
2
3
|
import { logger } from '../../utils/logger.js';
|
|
3
|
-
import {
|
|
4
|
+
import { filterInstalledPackages, installPackagesWithRetry } from '../../utils/package-manager.js';
|
|
4
5
|
export async function installDependencies(cwd, config, projectInfo) {
|
|
5
6
|
const info = projectInfo || (await getProjectInfo(cwd));
|
|
6
7
|
const cdkVersion = getCdkVersion(info.angularVersion);
|
|
7
8
|
const deps = [cdkVersion, 'class-variance-authority', 'clsx', 'tailwind-merge', '@ng-icons/core', '@ng-icons/lucide'];
|
|
8
|
-
const devDeps =
|
|
9
|
-
? ['tailwindcss-animate']
|
|
10
|
-
: ['tailwindcss', '@tailwindcss/postcss', 'postcss', 'tailwindcss-animate'];
|
|
9
|
+
const devDeps = tailwindPackages(config.projectType);
|
|
11
10
|
if (info.hasTailwind) {
|
|
12
|
-
logger.info('Tailwind CSS is already installed.
|
|
11
|
+
logger.info('Tailwind CSS is already installed. Only the missing pieces will be added.');
|
|
13
12
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
// Cada lote que sobra vazio é uma invocação inteira do gerenciador poupada —
|
|
14
|
+
// o caso comum de um `init` repetido é justamente esse, nada a instalar.
|
|
15
|
+
const [missingDeps, missingDevDeps] = await Promise.all([
|
|
16
|
+
filterInstalledPackages(deps, cwd),
|
|
17
|
+
filterInstalledPackages(devDeps, cwd),
|
|
18
|
+
]);
|
|
19
|
+
if (!missingDeps.length && !missingDevDeps.length) {
|
|
20
|
+
logger.info('All dependencies are already installed.');
|
|
21
|
+
return;
|
|
17
22
|
}
|
|
23
|
+
await installPackagesWithRetry(missingDeps, cwd, config.packageManager, false);
|
|
24
|
+
await installPackagesWithRetry(missingDevDeps, cwd, config.packageManager, true);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* O que o Tailwind precisa para rodar naquele tipo de projeto.
|
|
28
|
+
*
|
|
29
|
+
* A lista é sempre a completa e o filtro de instalados decide o que sobra:
|
|
30
|
+
* checar só a presença do `tailwindcss` deixava passar o caso de quem já o
|
|
31
|
+
* tinha instalado mas sem o adaptador do bundler, e aí o build não gerava
|
|
32
|
+
* utilitário nenhum.
|
|
33
|
+
*
|
|
34
|
+
* Numa biblioteca não há bundler a configurar — quem compila o CSS é a
|
|
35
|
+
* aplicação que a consome —, mas os pacotes ficam porque o tema que o init
|
|
36
|
+
* escreve ali os declara.
|
|
37
|
+
*/
|
|
38
|
+
function tailwindPackages(kind) {
|
|
39
|
+
const shared = ['tailwindcss', 'tailwindcss-animate'];
|
|
40
|
+
if (isLibraryKind(kind))
|
|
41
|
+
return shared;
|
|
42
|
+
return bundlerFor(kind) === 'vite'
|
|
43
|
+
? [...shared, '@tailwindcss/vite']
|
|
44
|
+
: [...shared, '@tailwindcss/postcss', 'postcss'];
|
|
18
45
|
}
|
|
19
46
|
function getCdkVersion(angularVersion) {
|
|
20
47
|
if (!angularVersion) {
|
|
@@ -23,13 +50,4 @@ function getCdkVersion(angularVersion) {
|
|
|
23
50
|
const majorVersion = Number.parseInt(angularVersion.split('.')[0]);
|
|
24
51
|
return `@angular/cdk@^${majorVersion}`;
|
|
25
52
|
}
|
|
26
|
-
async function installWithRetry(packages, cwd, packageManager, isDev) {
|
|
27
|
-
try {
|
|
28
|
-
await installPackages(packages, cwd, packageManager, isDev);
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
logger.warn('Installation failed, retrying with --legacy-peer-deps...');
|
|
32
|
-
await installPackages(packages, cwd, packageManager, isDev, true);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
53
|
//# sourceMappingURL=dependencies.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../src/commands/init/dependencies.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../src/commands/init/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAoB,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAElG,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW,EAAE,MAAc,EAAE,WAAyB;IAC9F,MAAM,IAAI,GAAG,WAAW,IAAI,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAExD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,0BAA0B,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACtH,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAErD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IAC3F,CAAC;IAED,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtD,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC;QAClC,uBAAuB,CAAC,OAAO,EAAE,GAAG,CAAC;KACtC,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,MAAM,wBAAwB,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC/E,MAAM,wBAAwB,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AACnF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,gBAAgB,CAAC,IAA2B;IACnD,MAAM,MAAM,GAAG,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;IAEtD,IAAI,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAEvC,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,MAAM;QAChC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,mBAAmB,CAAC;QAClC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,cAA8B;IACnD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnE,OAAO,iBAAiB,YAAY,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,IAAI,SA6Db,CAAC"}
|
package/commands/init/index.js
CHANGED
|
@@ -1,52 +1,69 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { resolveConfigPaths } from '../../utils/config.js';
|
|
1
|
+
import { buildConfig, defaultAnswers, inspectCssFile } from '../../commands/init/config-prompter.js';
|
|
2
|
+
import { candidateProjects, detectProjectKind, isLibraryKind, PROJECT_KINDS, } from '../../commands/init/project-kind.js';
|
|
3
|
+
import { buildInitSteps } from '../../commands/init/steps.js';
|
|
4
|
+
import { runInitWizard } from '../../commands/init/wizard.js';
|
|
5
|
+
import { isInteractive, printReport, WizardCancelledError } from '../../ui/index.js';
|
|
7
6
|
import { CliError } from '../../utils/errors.js';
|
|
8
7
|
import { getProjectInfo } from '../../utils/get-project-info.js';
|
|
9
8
|
import { logger, spinner } from '../../utils/logger.js';
|
|
10
|
-
import { detectPackageManager } from '../../utils/package-manager.js';
|
|
11
|
-
import chalk from 'chalk';
|
|
9
|
+
import { detectPackageManager, suggestedRunner } from '../../utils/package-manager.js';
|
|
12
10
|
import { Command } from 'commander';
|
|
13
11
|
import { existsSync } from 'node:fs';
|
|
14
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
15
12
|
import * as path from 'node:path';
|
|
16
|
-
import prompts from 'prompts';
|
|
17
|
-
import { updateAngularConfig } from './update-angular-config.js';
|
|
18
13
|
export const init = new Command()
|
|
19
14
|
.name('init')
|
|
20
15
|
.description('initialize your project and install dependencies')
|
|
21
16
|
.option('-y, --yes', 'skip confirmation prompt.', false)
|
|
22
17
|
.option('-c, --cwd <cwd>', 'the working directory. defaults to the current directory.', process.cwd())
|
|
18
|
+
.option('-t, --type <type>', `the project type: ${PROJECT_KINDS.map(kind => kind.value).join(', ')}.`)
|
|
19
|
+
.option('-p, --project <name>', 'the workspace project to configure. defaults to the first compatible one.')
|
|
23
20
|
.action(async (options) => {
|
|
24
21
|
const cwd = path.resolve(options.cwd);
|
|
25
22
|
validateWorkingDirectory(cwd);
|
|
26
23
|
const projectInfo = await getProjectInfo(cwd);
|
|
27
24
|
validateAngularProject(projectInfo);
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
25
|
+
const kind = resolveKind(options.type);
|
|
26
|
+
const projectRoot = resolveProjectRoot(options.project, kind ?? detectProjectKind(projectInfo), projectInfo);
|
|
27
|
+
const isReInitializing = existsSync(path.resolve(cwd, 'components.json'));
|
|
28
|
+
const packageManager = await detectPackageManager(cwd);
|
|
29
|
+
const buildSteps = (config) => buildInitSteps(cwd, config, projectInfo, isReInitializing);
|
|
30
|
+
if (!isInteractive()) {
|
|
31
|
+
await runHeadless({
|
|
32
|
+
cwd,
|
|
33
|
+
projectInfo,
|
|
34
|
+
packageManager,
|
|
35
|
+
isReInitializing,
|
|
36
|
+
buildSteps,
|
|
37
|
+
yes: options.yes,
|
|
38
|
+
kind,
|
|
39
|
+
projectRoot,
|
|
40
|
+
});
|
|
41
|
+
return;
|
|
36
42
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
try {
|
|
44
|
+
const { config, logs } = await runInitWizard({
|
|
45
|
+
cwd,
|
|
46
|
+
projectInfo,
|
|
47
|
+
packageManager,
|
|
48
|
+
isReInitializing,
|
|
49
|
+
skipConfirmation: options.yes,
|
|
50
|
+
buildSteps,
|
|
51
|
+
presetKind: kind,
|
|
52
|
+
presetProjectRoot: projectRoot,
|
|
53
|
+
});
|
|
54
|
+
reportSuccess(config, buildSteps(config), logs);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof WizardCancelledError) {
|
|
58
|
+
printReport({
|
|
59
|
+
status: 'cancelled',
|
|
60
|
+
headline: error.message,
|
|
61
|
+
notes: ['Nothing was changed in your project.'],
|
|
62
|
+
});
|
|
45
63
|
process.exit(0);
|
|
46
64
|
}
|
|
65
|
+
throw error;
|
|
47
66
|
}
|
|
48
|
-
await runInitializationSteps(cwd, config, projectInfo, isReInitializing);
|
|
49
|
-
displaySuccessMessage(config);
|
|
50
67
|
});
|
|
51
68
|
function validateWorkingDirectory(cwd) {
|
|
52
69
|
if (!existsSync(cwd)) {
|
|
@@ -58,62 +75,93 @@ function validateAngularProject(projectInfo) {
|
|
|
58
75
|
throw new CliError('This project does not appear to be an Angular project.', 'NOT_ANGULAR');
|
|
59
76
|
}
|
|
60
77
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
/**
|
|
79
|
+
* O tipo pedido em `--type`, quando houver.
|
|
80
|
+
*
|
|
81
|
+
* É a resposta à primeira pergunta do wizard dada de antemão — o que torna o
|
|
82
|
+
* init utilizável em CI, onde ninguém pode escolher no menu.
|
|
83
|
+
*/
|
|
84
|
+
function resolveKind(value) {
|
|
85
|
+
if (!value)
|
|
86
|
+
return undefined;
|
|
87
|
+
const kind = PROJECT_KINDS.find(option => option.value === value);
|
|
88
|
+
if (!kind) {
|
|
89
|
+
throw new CliError(`Unknown project type "${value}". Expected one of: ${PROJECT_KINDS.map(option => option.value).join(', ')}.`, 'UNKNOWN_PROJECT_TYPE');
|
|
90
|
+
}
|
|
91
|
+
return kind.value;
|
|
70
92
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
93
|
+
/** A raiz do projeto pedido em `--project`, procurado entre os compatíveis. */
|
|
94
|
+
function resolveProjectRoot(name, kind, projectInfo) {
|
|
95
|
+
if (!name)
|
|
96
|
+
return undefined;
|
|
97
|
+
const candidates = candidateProjects(kind, projectInfo);
|
|
98
|
+
const project = candidates.find(candidate => candidate.name === name);
|
|
99
|
+
if (!project) {
|
|
100
|
+
const available = candidates.map(candidate => candidate.name).join(', ') || 'none';
|
|
101
|
+
throw new CliError(`Project "${name}" is not a ${kind} project in this workspace. Available: ${available}.`, 'UNKNOWN_PROJECT');
|
|
102
|
+
}
|
|
103
|
+
return project.root;
|
|
79
104
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (!
|
|
88
|
-
|
|
89
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Caminho sem UI — CI, pipes e terminais não interativos.
|
|
107
|
+
*
|
|
108
|
+
* Aqui ninguém pode responder nada, então os defaults valem e `--yes` é
|
|
109
|
+
* obrigatório: sem ele a CLI se recusa a sobrescrever o CSS global do projeto.
|
|
110
|
+
*/
|
|
111
|
+
async function runHeadless(options) {
|
|
112
|
+
if (!options.yes) {
|
|
113
|
+
throw new CliError('Running without an interactive terminal requires --yes, since init overwrites your global CSS.', 'NOT_INTERACTIVE');
|
|
114
|
+
}
|
|
115
|
+
const kind = options.kind ?? detectProjectKind(options.projectInfo);
|
|
116
|
+
const answers = defaultAnswers(options.projectInfo, kind, options.projectRoot);
|
|
117
|
+
const cssState = await inspectCssFile(options.cwd, answers.globalCss);
|
|
118
|
+
// Numa biblioteca o CSS de tema é criado pelo init, então não existir é o
|
|
119
|
+
// esperado; numa aplicação, o arquivo tem que estar lá e ligado ao build.
|
|
120
|
+
if (cssState === 'missing' && !isLibraryKind(answers.kind)) {
|
|
121
|
+
throw new CliError(`CSS file not found at: ${answers.globalCss}. Run init in an interactive terminal to choose another path.`, 'CSS_NOT_FOUND');
|
|
90
122
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
123
|
+
const config = buildConfig(answers, options.packageManager);
|
|
124
|
+
const steps = options.buildSteps(config);
|
|
125
|
+
logger.info(options.isReInitializing ? 'Re-initializing ZardUI...' : 'Initializing ZardUI...');
|
|
126
|
+
for (const step of steps) {
|
|
127
|
+
const stepSpinner = spinner(`${step.label} — ${step.note}`).start();
|
|
128
|
+
try {
|
|
129
|
+
await step.run();
|
|
130
|
+
stepSpinner.succeed(step.label);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
stepSpinner.fail(`${step.label}: ${error instanceof Error ? error.message : String(error)}`);
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
reportSuccess(config, steps, []);
|
|
98
138
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
139
|
+
function reportSuccess(config, steps, logs) {
|
|
140
|
+
printReport({
|
|
141
|
+
status: 'success',
|
|
142
|
+
headline: 'ZardUI has been initialized successfully!',
|
|
143
|
+
items: steps.map(step => `${step.label} — ${step.note}`),
|
|
144
|
+
notes: nextStepsFor(config),
|
|
145
|
+
commands: [{ command: `${suggestedRunner(config.packageManager)} zard-cli add`, argument: '[component]' }],
|
|
146
|
+
logs,
|
|
147
|
+
});
|
|
105
148
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
149
|
+
/**
|
|
150
|
+
* O que ainda falta fazer à mão.
|
|
151
|
+
*
|
|
152
|
+
* Numa biblioteca o init não tem onde registrar `provideZard()` nem como
|
|
153
|
+
* importar os tokens — as duas coisas pertencem ao app que consome a lib, e
|
|
154
|
+
* sem esse aviso o usuário só descobre quando os componentes não renderizam.
|
|
155
|
+
*/
|
|
156
|
+
function nextStepsFor(config) {
|
|
157
|
+
if (!isLibraryKind(config.projectType)) {
|
|
158
|
+
return ['You can now add components using:'];
|
|
159
|
+
}
|
|
160
|
+
return [
|
|
161
|
+
'The consuming app still needs to register provideZard() in its app.config.ts',
|
|
162
|
+
`and import the theme tokens from this library's ${path.basename(config.tailwind.css)}.`,
|
|
163
|
+
'',
|
|
164
|
+
'You can now add components using:',
|
|
165
|
+
];
|
|
118
166
|
}
|
|
119
167
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Que tipo de projeto o `init` está configurando.
|
|
3
|
+
*
|
|
4
|
+
* Quem responde é o usuário, na primeira pergunta do wizard — a CLI não decide
|
|
5
|
+
* por ele. O que o workspace revela entra depois, para preencher os caminhos
|
|
6
|
+
* sugeridos do tipo escolhido; a detecção só vira decisão no caminho headless,
|
|
7
|
+
* onde não há ninguém para perguntar.
|
|
8
|
+
*
|
|
9
|
+
* As diferenças entre os tipos não são cosméticas: uma biblioteca não tem
|
|
10
|
+
* `app.config.ts` onde registrar providers nem CSS global pré-existente, o Nx
|
|
11
|
+
* guarda os paths do TypeScript noutro arquivo, e o Analog troca o build do
|
|
12
|
+
* Angular por Vite — e com ele a forma de configurar o Tailwind. Concentrar
|
|
13
|
+
* essas diferenças aqui evita que cada etapa precise redescobri-las.
|
|
14
|
+
*/
|
|
15
|
+
import type { ProjectInfo, WorkspaceProject } from '../../utils/get-project-info.js';
|
|
16
|
+
export type ProjectKind = 'angular' | 'angular-library' | 'nx' | 'nx-library' | 'analog';
|
|
17
|
+
export interface ProjectKindOption {
|
|
18
|
+
readonly value: ProjectKind;
|
|
19
|
+
readonly label: string;
|
|
20
|
+
readonly detail: string;
|
|
21
|
+
/** A cor do ecossistema, para o menu dizer de relance a que mundo o tipo pertence. */
|
|
22
|
+
readonly color: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A ordem é a do menu: cada ecossistema com a aplicação antes da biblioteca,
|
|
26
|
+
* do mais comum ao mais raro. Angular abre a lista porque é o default.
|
|
27
|
+
*/
|
|
28
|
+
export declare const PROJECT_KINDS: readonly ProjectKindOption[];
|
|
29
|
+
export declare function isLibraryKind(kind: ProjectKind): boolean;
|
|
30
|
+
/** Onde os paths do TypeScript precisam ser escritos para o projeto enxergá-los. */
|
|
31
|
+
export declare function tsconfigFileFor(kind: ProjectKind, projectInfo: ProjectInfo): string;
|
|
32
|
+
/** Se o Tailwind entra pelo PostCSS do Angular ou pelo plugin do Vite. */
|
|
33
|
+
export declare function bundlerFor(kind: ProjectKind): 'angular' | 'vite';
|
|
34
|
+
/**
|
|
35
|
+
* Os projetos do workspace que podem receber a instalação.
|
|
36
|
+
*
|
|
37
|
+
* Escolhido o tipo, só faz sentido oferecer o que combina com ele: pedir para
|
|
38
|
+
* instalar numa aplicação quem escolheu biblioteca seria oferecer um alvo que
|
|
39
|
+
* as etapas seguintes não sabem configurar.
|
|
40
|
+
*/
|
|
41
|
+
export declare function candidateProjects(kind: ProjectKind, projectInfo: ProjectInfo): WorkspaceProject[];
|
|
42
|
+
/** Raiz padrão quando o workspace não declara nenhum projeto compatível. */
|
|
43
|
+
export declare function fallbackRootFor(kind: ProjectKind): string;
|
|
44
|
+
/**
|
|
45
|
+
* O tipo que o caminho headless assume.
|
|
46
|
+
*
|
|
47
|
+
* Sem terminal interativo ninguém responde à primeira pergunta, então aqui — e
|
|
48
|
+
* só aqui — o workspace decide: o gerenciador dá o mundo (Nx ou Angular), o
|
|
49
|
+
* Analog se anuncia pelas próprias dependências, e a ausência de qualquer
|
|
50
|
+
* aplicação é o que sugere que o alvo é uma biblioteca.
|
|
51
|
+
*/
|
|
52
|
+
export declare function detectProjectKind(projectInfo: ProjectInfo): ProjectKind;
|
|
53
|
+
/**
|
|
54
|
+
* Onde o código da biblioteca vive.
|
|
55
|
+
*
|
|
56
|
+
* `src/lib` é a convenção tanto do `ng generate library` quanto do
|
|
57
|
+
* `nx g @nx/angular:library`: `src/` guarda o ponto de entrada público, e tudo
|
|
58
|
+
* que ele exporta fica em `src/lib`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function libraryBaseUrl(libraryRoot: string): string;
|
|
61
|
+
/** O CSS de tema que a biblioteca passa a expor para quem a consome. */
|
|
62
|
+
export declare function libraryStylesPath(libraryRoot: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* A raiz do projeto, deduzida do `baseUrl`.
|
|
65
|
+
*
|
|
66
|
+
* Os dois layouts terminam dois níveis abaixo da raiz — `<root>/src/app` numa
|
|
67
|
+
* aplicação, `<root>/src/lib` numa biblioteca —, então subir dois níveis
|
|
68
|
+
* devolve o diretório onde vivem o `project.json`, o `ng-package.json` e o
|
|
69
|
+
* `.postcssrc.json` daquele projeto. Um app único na raiz devolve `.`.
|
|
70
|
+
*/
|
|
71
|
+
export declare function projectRootOf(baseUrl: string): string;
|
|
72
|
+
/** O diretório de fontes do projeto — onde `index.html` e `main.ts` ficam. */
|
|
73
|
+
export declare function sourceRootOf(baseUrl: string): string;
|
|
74
|
+
/**
|
|
75
|
+
* Onde procurar o `index.html` do projeto.
|
|
76
|
+
*
|
|
77
|
+
* No Analog ele é a página de entrada do Vite e fica na raiz, e não em `src/`
|
|
78
|
+
* como no build do Angular — sugerir o caminho errado fazia o `add dark-mode`
|
|
79
|
+
* falhar logo depois de perguntar.
|
|
80
|
+
*/
|
|
81
|
+
export declare function indexHtmlFor(kind: ProjectKind, baseUrl: string): string;
|
|
82
|
+
//# sourceMappingURL=project-kind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-kind.d.ts","sourceRoot":"","sources":["../../../src/commands/init/project-kind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGpF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,iBAAiB,GAAG,IAAI,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEzF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAYD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,iBAAiB,EA+BrD,CAAC;AAqBF,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAExD;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CAOnF;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAEhE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,GAAG,gBAAgB,EAAE,CAIjG;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CASvE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOvE"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Que tipo de projeto o `init` está configurando.
|
|
3
|
+
*
|
|
4
|
+
* Quem responde é o usuário, na primeira pergunta do wizard — a CLI não decide
|
|
5
|
+
* por ele. O que o workspace revela entra depois, para preencher os caminhos
|
|
6
|
+
* sugeridos do tipo escolhido; a detecção só vira decisão no caminho headless,
|
|
7
|
+
* onde não há ninguém para perguntar.
|
|
8
|
+
*
|
|
9
|
+
* As diferenças entre os tipos não são cosméticas: uma biblioteca não tem
|
|
10
|
+
* `app.config.ts` onde registrar providers nem CSS global pré-existente, o Nx
|
|
11
|
+
* guarda os paths do TypeScript noutro arquivo, e o Analog troca o build do
|
|
12
|
+
* Angular por Vite — e com ele a forma de configurar o Tailwind. Concentrar
|
|
13
|
+
* essas diferenças aqui evita que cada etapa precise redescobri-las.
|
|
14
|
+
*/
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
/**
|
|
17
|
+
* As cores de cada ecossistema no menu.
|
|
18
|
+
*
|
|
19
|
+
* Angular fica no branco da base — é o caso padrão, e destacá-lo com uma cor
|
|
20
|
+
* daria a impressão de que é uma opção especial entre as outras.
|
|
21
|
+
*/
|
|
22
|
+
const ANGULAR = '#fafafa';
|
|
23
|
+
const NX = '#6aa9ff';
|
|
24
|
+
const ANALOG = '#fb7185';
|
|
25
|
+
/**
|
|
26
|
+
* A ordem é a do menu: cada ecossistema com a aplicação antes da biblioteca,
|
|
27
|
+
* do mais comum ao mais raro. Angular abre a lista porque é o default.
|
|
28
|
+
*/
|
|
29
|
+
export const PROJECT_KINDS = [
|
|
30
|
+
{
|
|
31
|
+
value: 'angular',
|
|
32
|
+
label: 'Angular',
|
|
33
|
+
detail: 'Application — providers in app.config.ts, tokens in the global CSS.',
|
|
34
|
+
color: ANGULAR,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
value: 'angular-library',
|
|
38
|
+
label: 'Angular Library',
|
|
39
|
+
detail: 'Publishable library — components ship with it, no app providers.',
|
|
40
|
+
color: ANGULAR,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
value: 'nx',
|
|
44
|
+
label: 'Nx',
|
|
45
|
+
detail: 'Application inside an Nx workspace — paths go to tsconfig.base.json.',
|
|
46
|
+
color: NX,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
value: 'nx-library',
|
|
50
|
+
label: 'Nx Library',
|
|
51
|
+
detail: 'Library inside an Nx workspace — lives in libs/, no app providers.',
|
|
52
|
+
color: NX,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
value: 'analog',
|
|
56
|
+
label: 'Analog.js',
|
|
57
|
+
detail: 'Vite-powered Angular app — Tailwind is a Vite plugin, not PostCSS.',
|
|
58
|
+
color: ANALOG,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
const TRAITS = {
|
|
62
|
+
angular: { isLibrary: false, workspace: 'angular', bundler: 'angular', fallbackRoot: '' },
|
|
63
|
+
analog: { isLibrary: false, workspace: 'angular', bundler: 'vite', fallbackRoot: '' },
|
|
64
|
+
nx: { isLibrary: false, workspace: 'nx', bundler: 'angular', fallbackRoot: 'apps/app' },
|
|
65
|
+
'angular-library': { isLibrary: true, workspace: 'angular', bundler: 'angular', fallbackRoot: 'projects/ui' },
|
|
66
|
+
'nx-library': { isLibrary: true, workspace: 'nx', bundler: 'angular', fallbackRoot: 'libs/ui' },
|
|
67
|
+
};
|
|
68
|
+
export function isLibraryKind(kind) {
|
|
69
|
+
return TRAITS[kind].isLibrary;
|
|
70
|
+
}
|
|
71
|
+
/** Onde os paths do TypeScript precisam ser escritos para o projeto enxergá-los. */
|
|
72
|
+
export function tsconfigFileFor(kind, projectInfo) {
|
|
73
|
+
// O Nx estende um tsconfig.base.json na raiz; escrever no tsconfig.json de lá
|
|
74
|
+
// não chegaria a projeto nenhum. Fora do Nx o próprio tsconfig.json é o alvo,
|
|
75
|
+
// a menos que o workspace já mantenha um base — aí ele é quem manda.
|
|
76
|
+
if (TRAITS[kind].workspace === 'nx')
|
|
77
|
+
return 'tsconfig.base.json';
|
|
78
|
+
return projectInfo.tsconfigFile;
|
|
79
|
+
}
|
|
80
|
+
/** Se o Tailwind entra pelo PostCSS do Angular ou pelo plugin do Vite. */
|
|
81
|
+
export function bundlerFor(kind) {
|
|
82
|
+
return TRAITS[kind].bundler;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Os projetos do workspace que podem receber a instalação.
|
|
86
|
+
*
|
|
87
|
+
* Escolhido o tipo, só faz sentido oferecer o que combina com ele: pedir para
|
|
88
|
+
* instalar numa aplicação quem escolheu biblioteca seria oferecer um alvo que
|
|
89
|
+
* as etapas seguintes não sabem configurar.
|
|
90
|
+
*/
|
|
91
|
+
export function candidateProjects(kind, projectInfo) {
|
|
92
|
+
const wanted = TRAITS[kind].isLibrary ? 'library' : 'application';
|
|
93
|
+
return projectInfo.projects.filter(project => project.projectType === wanted);
|
|
94
|
+
}
|
|
95
|
+
/** Raiz padrão quando o workspace não declara nenhum projeto compatível. */
|
|
96
|
+
export function fallbackRootFor(kind) {
|
|
97
|
+
return TRAITS[kind].fallbackRoot;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* O tipo que o caminho headless assume.
|
|
101
|
+
*
|
|
102
|
+
* Sem terminal interativo ninguém responde à primeira pergunta, então aqui — e
|
|
103
|
+
* só aqui — o workspace decide: o gerenciador dá o mundo (Nx ou Angular), o
|
|
104
|
+
* Analog se anuncia pelas próprias dependências, e a ausência de qualquer
|
|
105
|
+
* aplicação é o que sugere que o alvo é uma biblioteca.
|
|
106
|
+
*/
|
|
107
|
+
export function detectProjectKind(projectInfo) {
|
|
108
|
+
const hasApplication = projectInfo.projects.some(project => project.projectType === 'application');
|
|
109
|
+
const hasLibrary = projectInfo.projects.some(project => project.projectType === 'library');
|
|
110
|
+
const isLibraryWorkspace = !hasApplication && hasLibrary;
|
|
111
|
+
if (projectInfo.hasNx)
|
|
112
|
+
return isLibraryWorkspace ? 'nx-library' : 'nx';
|
|
113
|
+
if (isLibraryWorkspace)
|
|
114
|
+
return 'angular-library';
|
|
115
|
+
return projectInfo.hasAnalog ? 'analog' : 'angular';
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Onde o código da biblioteca vive.
|
|
119
|
+
*
|
|
120
|
+
* `src/lib` é a convenção tanto do `ng generate library` quanto do
|
|
121
|
+
* `nx g @nx/angular:library`: `src/` guarda o ponto de entrada público, e tudo
|
|
122
|
+
* que ele exporta fica em `src/lib`.
|
|
123
|
+
*/
|
|
124
|
+
export function libraryBaseUrl(libraryRoot) {
|
|
125
|
+
return `${trimSlashes(libraryRoot)}/src/lib`;
|
|
126
|
+
}
|
|
127
|
+
/** O CSS de tema que a biblioteca passa a expor para quem a consome. */
|
|
128
|
+
export function libraryStylesPath(libraryRoot) {
|
|
129
|
+
return `${trimSlashes(libraryRoot)}/src/styles.css`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* A raiz do projeto, deduzida do `baseUrl`.
|
|
133
|
+
*
|
|
134
|
+
* Os dois layouts terminam dois níveis abaixo da raiz — `<root>/src/app` numa
|
|
135
|
+
* aplicação, `<root>/src/lib` numa biblioteca —, então subir dois níveis
|
|
136
|
+
* devolve o diretório onde vivem o `project.json`, o `ng-package.json` e o
|
|
137
|
+
* `.postcssrc.json` daquele projeto. Um app único na raiz devolve `.`.
|
|
138
|
+
*/
|
|
139
|
+
export function projectRootOf(baseUrl) {
|
|
140
|
+
return path.posix.normalize(path.posix.join(toPosix(baseUrl), '..', '..'));
|
|
141
|
+
}
|
|
142
|
+
/** O diretório de fontes do projeto — onde `index.html` e `main.ts` ficam. */
|
|
143
|
+
export function sourceRootOf(baseUrl) {
|
|
144
|
+
return path.posix.dirname(toPosix(baseUrl));
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Onde procurar o `index.html` do projeto.
|
|
148
|
+
*
|
|
149
|
+
* No Analog ele é a página de entrada do Vite e fica na raiz, e não em `src/`
|
|
150
|
+
* como no build do Angular — sugerir o caminho errado fazia o `add dark-mode`
|
|
151
|
+
* falhar logo depois de perguntar.
|
|
152
|
+
*/
|
|
153
|
+
export function indexHtmlFor(kind, baseUrl) {
|
|
154
|
+
if (kind === 'analog') {
|
|
155
|
+
const root = projectRootOf(baseUrl);
|
|
156
|
+
return root === '.' ? 'index.html' : `${root}/index.html`;
|
|
157
|
+
}
|
|
158
|
+
return `${sourceRootOf(baseUrl)}/index.html`;
|
|
159
|
+
}
|
|
160
|
+
function toPosix(value) {
|
|
161
|
+
return value.replace(/\\/g, '/');
|
|
162
|
+
}
|
|
163
|
+
function trimSlashes(value) {
|
|
164
|
+
return value.replace(/\/+$/, '');
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=project-kind.js.map
|