zard-cli 1.0.0-beta.99 → 1.0.1
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 +98 -36
- package/commands/add/component-installer.d.ts +3 -0
- package/commands/add/component-installer.d.ts.map +1 -1
- package/commands/add/component-installer.js +31 -8
- 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 +16 -11
- package/commands/add/dark-mode-setup.js.map +1 -1
- package/commands/add/dependency-resolver.d.ts +8 -1
- package/commands/add/dependency-resolver.d.ts.map +1 -1
- package/commands/add/dependency-resolver.js +87 -16
- package/commands/add/dependency-resolver.js.map +1 -1
- package/commands/add/index.d.ts.map +1 -1
- package/commands/add/index.js +142 -96
- package/commands/add/index.js.map +1 -1
- package/commands/add/stylesheet-setup.d.ts +3 -0
- package/commands/add/stylesheet-setup.d.ts.map +1 -0
- package/commands/add/stylesheet-setup.js +92 -0
- package/commands/add/stylesheet-setup.js.map +1 -0
- package/commands/add/wizard.d.ts +35 -0
- package/commands/add/wizard.d.ts.map +1 -0
- package/commands/add/wizard.js +299 -0
- package/commands/add/wizard.js.map +1 -0
- package/commands/init/config-prompter.d.ts +65 -3
- package/commands/init/config-prompter.d.ts.map +1 -1
- package/commands/init/config-prompter.js +93 -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 +54 -24
- package/commands/init/dependencies.js.map +1 -1
- package/commands/init/index.d.ts.map +1 -1
- package/commands/init/index.js +175 -81
- package/commands/init/index.js.map +1 -1
- package/commands/init/library-peers.d.ts +28 -0
- package/commands/init/library-peers.d.ts.map +1 -0
- package/commands/init/library-peers.js +61 -0
- package/commands/init/library-peers.js.map +1 -0
- 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 +15 -0
- package/commands/init/steps.d.ts.map +1 -0
- package/commands/init/steps.js +188 -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 +47 -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 +11 -0
- package/commands/init/vite-setup.d.ts.map +1 -0
- package/commands/init/vite-setup.js +61 -0
- package/commands/init/vite-setup.js.map +1 -0
- package/commands/init/wizard.d.ts +33 -0
- package/commands/init/wizard.d.ts.map +1 -0
- package/commands/init/wizard.js +561 -0
- package/commands/init/wizard.js.map +1 -0
- package/constants/app.constants.d.ts +17 -0
- package/constants/app.constants.d.ts.map +1 -1
- package/constants/app.constants.js +39 -16
- package/constants/app.constants.js.map +1 -1
- 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 +141 -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 +498 -36
- package/core/registry/registry-data.js.map +1 -1
- package/core/themes/theme-definitions.d.ts.map +1 -1
- package/core/themes/theme-definitions.js +61 -72
- package/core/themes/theme-definitions.js.map +1 -1
- package/index.js +6 -3
- package/index.js.map +1 -1
- package/package.json +6 -11
- package/ui/blocks.d.ts +71 -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 +38 -0
- package/ui/engine/animation/index.d.ts.map +1 -0
- package/ui/engine/animation/index.js +102 -0
- package/ui/engine/animation/index.js.map +1 -0
- package/ui/engine/ansi/index.d.ts +51 -0
- package/ui/engine/ansi/index.d.ts.map +1 -0
- package/ui/engine/ansi/index.js +116 -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 +16 -0
- package/ui/engine/cursor/index.d.ts.map +1 -0
- package/ui/engine/cursor/index.js +40 -0
- package/ui/engine/cursor/index.js.map +1 -0
- package/ui/engine/diff/index.d.ts +26 -0
- package/ui/engine/diff/index.d.ts.map +1 -0
- package/ui/engine/diff/index.js +56 -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 +26 -0
- package/ui/engine/theme/index.d.ts.map +1 -0
- package/ui/engine/theme/index.js +128 -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 +31 -0
- package/ui/text-input.d.ts.map +1 -0
- package/ui/text-input.js +89 -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/angular-compat.d.ts +21 -0
- package/utils/angular-compat.d.ts.map +1 -0
- package/utils/angular-compat.js +52 -0
- package/utils/angular-compat.js.map +1 -0
- package/utils/config.d.ts +29 -0
- package/utils/config.d.ts.map +1 -1
- package/utils/config.js +50 -4
- package/utils/config.js.map +1 -1
- package/utils/errors.d.ts +11 -0
- package/utils/errors.d.ts.map +1 -1
- package/utils/errors.js +14 -0
- package/utils/errors.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 +246 -1
- package/utils/get-project-info.js.map +1 -1
- package/utils/http-client.d.ts.map +1 -1
- package/utils/http-client.js +18 -3
- package/utils/http-client.js.map +1 -1
- package/utils/icon-catalog.d.ts +34 -0
- package/utils/icon-catalog.d.ts.map +1 -0
- package/utils/icon-catalog.js +63 -0
- package/utils/icon-catalog.js.map +1 -0
- 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 +106 -2
- package/utils/registry.d.ts.map +1 -1
- package/utils/registry.js +155 -21
- package/utils/registry.js.map +1 -1
- package/utils/schema-version.d.ts +21 -0
- package/utils/schema-version.d.ts.map +1 -0
- package/utils/schema-version.js +28 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,GAAG,SAmGZ,CAAC"}
|
package/commands/add/index.js
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import { installComponent, validateTargetPath } from '../../commands/add/component-installer.js';
|
|
2
2
|
import { selectComponents } from '../../commands/add/component-selector.js';
|
|
3
3
|
import { updateProvideZardWithDarkMode } from '../../commands/add/dark-mode-setup.js';
|
|
4
|
-
import {
|
|
4
|
+
import { getAllInstallableNames, getTargetDir, resolveDependencies, } from '../../commands/add/dependency-resolver.js';
|
|
5
|
+
import { setupTypeset, setupUtilities } from '../../commands/add/stylesheet-setup.js';
|
|
6
|
+
import { runAddWizard } from '../../commands/add/wizard.js';
|
|
7
|
+
import { syncLibraryPeerDependencies } from '../../commands/init/library-peers.js';
|
|
8
|
+
import { indexHtmlFor } from '../../commands/init/project-kind.js';
|
|
5
9
|
import { injectThemeScript } from '../../commands/init/theme-loader.js';
|
|
10
|
+
import { isInteractive, printReport, WizardCancelledError } from '../../ui/index.js';
|
|
11
|
+
import { pinAllForAngular } from '../../utils/angular-compat.js';
|
|
6
12
|
import { getConfig, resolveConfigPaths } from '../../utils/config.js';
|
|
7
13
|
import { CliError } from '../../utils/errors.js';
|
|
8
14
|
import { getProjectInfo } from '../../utils/get-project-info.js';
|
|
15
|
+
import { assertIconFamily, loadIconCatalog } from '../../utils/icon-catalog.js';
|
|
9
16
|
import { logger, spinner } from '../../utils/logger.js';
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
17
|
+
import { filterInstalledPackages, installPackagesWithRetry } from '../../utils/package-manager.js';
|
|
18
|
+
import { getRegistryUrl } from '../../utils/registry.js';
|
|
12
19
|
import { Command } from 'commander';
|
|
13
20
|
import { existsSync } from 'node:fs';
|
|
14
21
|
import * as path from 'node:path';
|
|
15
|
-
import prompts from 'prompts';
|
|
16
22
|
export const add = new Command()
|
|
17
23
|
.name('add')
|
|
18
24
|
.description('add a component to your project')
|
|
@@ -22,6 +28,7 @@ export const add = new Command()
|
|
|
22
28
|
.option('-c, --cwd <cwd>', 'the working directory. defaults to the current directory.', process.cwd())
|
|
23
29
|
.option('-a, --all', 'add all available components', false)
|
|
24
30
|
.option('-p, --path <path>', 'the path to add the component to.')
|
|
31
|
+
.option('--index-html <path>', 'the index.html that receives the dark-mode theme script.')
|
|
25
32
|
.action(async (components, options) => {
|
|
26
33
|
const cwd = path.resolve(options.cwd);
|
|
27
34
|
validateWorkingDirectory(cwd);
|
|
@@ -31,33 +38,134 @@ export const add = new Command()
|
|
|
31
38
|
const config = await loadConfiguration(cwd);
|
|
32
39
|
const projectInfo = await validateProject(cwd);
|
|
33
40
|
const resolvedConfig = await resolveConfigPaths(cwd, config);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
// The catalog decides whether `icons` is a valid value and how to translate
|
|
42
|
+
// the symbols on install, so it comes before resolving any component.
|
|
43
|
+
await loadIconCatalog(getRegistryUrl(config));
|
|
44
|
+
assertIconFamily(config.icons);
|
|
45
|
+
const preselected = await selectComponents(components, options.all);
|
|
46
|
+
warnOnPrereleaseAngular(projectInfo.angularVersionRaw);
|
|
47
|
+
const actions = {
|
|
48
|
+
loadNames: () => getAllInstallableNames(),
|
|
49
|
+
resolve: async (names) => {
|
|
50
|
+
const { componentsToInstall, dependenciesToInstall } = await resolveDependencies(names, resolvedConfig, cwd, options);
|
|
51
|
+
return {
|
|
52
|
+
components: componentsToInstall,
|
|
53
|
+
dependencies: pinAllForAngular(dependenciesToInstall, projectInfo.angularVersion),
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
installDependencies: async (packages) => {
|
|
57
|
+
await installDependencies(packages, cwd, config.packageManager);
|
|
58
|
+
await syncLibraryPeerDependencies(cwd, config, packages);
|
|
59
|
+
},
|
|
60
|
+
installComponent: (component) => installComponent(component.name, getTargetDir(component, resolvedConfig, cwd, options.path), resolvedConfig, {
|
|
61
|
+
customPath: Boolean(options.path),
|
|
62
|
+
isBlock: component.isBlock,
|
|
63
|
+
}),
|
|
64
|
+
setupDarkMode: async (indexHtml) => {
|
|
65
|
+
// A library has no index.html of its own — it belongs to the consuming app —
|
|
66
|
+
// so a missing file is a note, not a reason to abort the whole install.
|
|
67
|
+
if (existsSync(path.resolve(cwd, indexHtml))) {
|
|
68
|
+
await injectThemeScript(cwd, indexHtml);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
logger.warn(`${indexHtml} not found: add the dark-mode theme script to the app's index.html by hand, ` +
|
|
72
|
+
'or run `zard-cli add dark-mode --overwrite --index-html <path>`.');
|
|
73
|
+
}
|
|
74
|
+
await updateProvideZardWithDarkMode(cwd, resolvedConfig);
|
|
75
|
+
},
|
|
76
|
+
setupTypeset: () => setupTypeset(resolvedConfig.resolvedPaths.tailwindCss),
|
|
77
|
+
setupUtilities: () => setupUtilities(resolvedConfig.resolvedPaths.tailwindCss),
|
|
78
|
+
defaultIndexHtml: options.indexHtml ?? indexHtmlFor(config.projectType, config.baseUrl),
|
|
79
|
+
};
|
|
80
|
+
if (!isInteractive()) {
|
|
81
|
+
// See the note in `init`: without this, falling back to text mode is
|
|
82
|
+
// indistinguishable from the interface not existing.
|
|
83
|
+
logger.debug(`No terminal to draw on (stdin TTY: ${Boolean(process.stdin.isTTY)}, ` +
|
|
84
|
+
`stdout TTY: ${Boolean(process.stdout.isTTY)}, controlling terminal: unreachable) — running headless.`);
|
|
85
|
+
await runHeadless(preselected, options, actions);
|
|
40
86
|
return;
|
|
41
87
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
88
|
+
try {
|
|
89
|
+
const { installed, logs } = await runAddWizard({
|
|
90
|
+
preselected,
|
|
91
|
+
skipConfirmation: options.yes,
|
|
92
|
+
...actions,
|
|
93
|
+
});
|
|
94
|
+
reportSuccess(installed, logs);
|
|
45
95
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error instanceof WizardCancelledError) {
|
|
98
|
+
printReport({ status: 'cancelled', headline: error.message, notes: ['No files were written.'] });
|
|
49
99
|
process.exit(0);
|
|
50
100
|
}
|
|
101
|
+
throw error;
|
|
51
102
|
}
|
|
52
|
-
await installDependencies(resolvedDeps, cwd, config.packageManager);
|
|
53
|
-
await installComponents(componentsToInstall, cwd, resolvedConfig, options);
|
|
54
|
-
const isDarkModeBeingInstalled = componentsToInstall.some(c => c.name === 'dark-mode');
|
|
55
|
-
if (isDarkModeBeingInstalled) {
|
|
56
|
-
await setupDarkMode(cwd, resolvedConfig);
|
|
57
|
-
}
|
|
58
|
-
logger.break();
|
|
59
|
-
logger.success('Done!');
|
|
60
103
|
});
|
|
104
|
+
/**
|
|
105
|
+
* The path without a UI — CI, pipes and non-interactive terminals.
|
|
106
|
+
*
|
|
107
|
+
* With nobody to pick from the list, the components have to arrive as arguments
|
|
108
|
+
* or through `--all`; the confirmation is skipped because there is no way to
|
|
109
|
+
* answer it.
|
|
110
|
+
*/
|
|
111
|
+
async function runHeadless(preselected, options, actions) {
|
|
112
|
+
if (!preselected.length) {
|
|
113
|
+
throw new CliError('No components specified. Pass the component names or --all when running without an interactive terminal.', 'NO_COMPONENTS');
|
|
114
|
+
}
|
|
115
|
+
const resolveSpinner = spinner('Resolving components...').start();
|
|
116
|
+
const { components, dependencies } = await actions.resolve(preselected);
|
|
117
|
+
resolveSpinner.stop();
|
|
118
|
+
if (components.length === 0) {
|
|
119
|
+
logger.info('All components already installed.');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (dependencies.length) {
|
|
123
|
+
const depsSpinner = spinner('Installing dependencies...').start();
|
|
124
|
+
await actions.installDependencies(dependencies);
|
|
125
|
+
depsSpinner.succeed('Dependencies installed');
|
|
126
|
+
}
|
|
127
|
+
const installed = [];
|
|
128
|
+
const failed = [];
|
|
129
|
+
for (const component of components) {
|
|
130
|
+
const componentSpinner = spinner(`Installing ${component.name}...`).start();
|
|
131
|
+
try {
|
|
132
|
+
await actions.installComponent(component);
|
|
133
|
+
installed.push(component.name);
|
|
134
|
+
componentSpinner.succeed(component.name);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
failed.push(component.name);
|
|
138
|
+
componentSpinner.fail(component.name);
|
|
139
|
+
logger.debug(`Failed to install ${component.name}: ${error instanceof Error ? error.message : error}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (installed.includes('typeset')) {
|
|
143
|
+
await actions.setupTypeset();
|
|
144
|
+
}
|
|
145
|
+
if (installed.includes('utilities')) {
|
|
146
|
+
await actions.setupUtilities();
|
|
147
|
+
}
|
|
148
|
+
// `--index-html` answers what the wizard asks; without it, the project's own index.html.
|
|
149
|
+
if (installed.includes('dark-mode')) {
|
|
150
|
+
await actions.setupDarkMode(actions.defaultIndexHtml);
|
|
151
|
+
}
|
|
152
|
+
if (failed.length) {
|
|
153
|
+
throw new CliError(`Failed to install: ${failed.join(', ')}`, 'INSTALL_FAILED');
|
|
154
|
+
}
|
|
155
|
+
reportSuccess(installed, []);
|
|
156
|
+
}
|
|
157
|
+
function reportSuccess(installed, logs) {
|
|
158
|
+
if (!installed.length) {
|
|
159
|
+
printReport({ status: 'success', headline: 'All components are already installed.', logs });
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
printReport({
|
|
163
|
+
status: 'success',
|
|
164
|
+
headline: `Installed ${installed.length} component${installed.length > 1 ? 's' : ''}.`,
|
|
165
|
+
items: [...installed],
|
|
166
|
+
logs,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
61
169
|
function validateWorkingDirectory(cwd) {
|
|
62
170
|
if (!existsSync(cwd)) {
|
|
63
171
|
throw new CliError(`The path ${cwd} does not exist. Please try again.`, 'INVALID_CWD');
|
|
@@ -77,83 +185,21 @@ async function validateProject(cwd) {
|
|
|
77
185
|
}
|
|
78
186
|
return projectInfo;
|
|
79
187
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
message: `Ready to install ${componentsCount} component(s) and ${depsCount} dependencies. Proceed?`,
|
|
85
|
-
initial: true,
|
|
86
|
-
});
|
|
87
|
-
return proceed;
|
|
88
|
-
}
|
|
89
|
-
const ANGULAR_VERSION_PACKAGES = ['embla-carousel-angular'];
|
|
90
|
-
function resolveCompatibleVersions(dependencies, angularVersion) {
|
|
91
|
-
const angularMajor = angularVersion ? parseInt(angularVersion.split('.')[0], 10) : null;
|
|
92
|
-
return Array.from(dependencies).map(dep => {
|
|
93
|
-
if (angularMajor && ANGULAR_VERSION_PACKAGES.includes(dep)) {
|
|
94
|
-
return `${dep}@^${angularMajor}.0.0`;
|
|
95
|
-
}
|
|
96
|
-
return dep;
|
|
97
|
-
});
|
|
188
|
+
function warnOnPrereleaseAngular(angularVersionRaw) {
|
|
189
|
+
if (angularVersionRaw && /-(rc|next|canary)/.test(angularVersionRaw)) {
|
|
190
|
+
logger.warn(`You are using a pre-release version of Angular (${angularVersionRaw}). Some dependencies may have compatibility issues.`);
|
|
191
|
+
}
|
|
98
192
|
}
|
|
99
193
|
async function installDependencies(packages, cwd, packageManager) {
|
|
100
194
|
if (packages.length === 0)
|
|
101
195
|
return;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
depsSpinner.text = 'Retrying with --legacy-peer-deps...';
|
|
108
|
-
await installPackages(packages, cwd, packageManager, false, true);
|
|
109
|
-
}
|
|
110
|
-
depsSpinner.succeed('Dependencies installed');
|
|
111
|
-
}
|
|
112
|
-
async function installComponents(componentsToInstall, cwd, resolvedConfig, options) {
|
|
113
|
-
const installSpinner = spinner('Installing components...').start();
|
|
114
|
-
const installed = [];
|
|
115
|
-
const failed = [];
|
|
116
|
-
for (const component of componentsToInstall) {
|
|
117
|
-
try {
|
|
118
|
-
installSpinner.text = `Installing ${component.name}...`;
|
|
119
|
-
const targetDir = getTargetDir(component, resolvedConfig, cwd, options.path);
|
|
120
|
-
await installComponent(component.name, targetDir, resolvedConfig);
|
|
121
|
-
installed.push(component.name);
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
failed.push(component.name);
|
|
125
|
-
logger.debug(`Failed to install ${component.name}: ${error instanceof Error ? error.message : error}`);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
if (failed.length > 0) {
|
|
129
|
-
installSpinner.fail(`Failed to install: ${failed.join(', ')}`);
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
installSpinner.succeed(`Installed ${installed.length} component${installed.length > 1 ? 's' : ''}`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
async function setupDarkMode(cwd, resolvedConfig) {
|
|
136
|
-
logger.break();
|
|
137
|
-
logger.info('Dark mode requires additional configuration.');
|
|
138
|
-
const { indexFile } = await prompts({
|
|
139
|
-
type: 'text',
|
|
140
|
-
name: 'indexFile',
|
|
141
|
-
message: `Where is your ${chalk.cyan('index.html')} file?`,
|
|
142
|
-
initial: 'src/index.html',
|
|
143
|
-
});
|
|
144
|
-
if (!indexFile) {
|
|
145
|
-
logger.warn('Skipping dark mode script injection.');
|
|
196
|
+
// An already-initialized project usually has all of them: without the filter,
|
|
197
|
+
// every `add` would pay for a full tree revalidation to install nothing.
|
|
198
|
+
const missing = await filterInstalledPackages(packages, cwd);
|
|
199
|
+
if (missing.length === 0) {
|
|
200
|
+
logger.debug(`Dependencies already installed: ${packages.join(', ')}`);
|
|
146
201
|
return;
|
|
147
202
|
}
|
|
148
|
-
|
|
149
|
-
try {
|
|
150
|
-
await injectThemeScript(cwd, indexFile);
|
|
151
|
-
await updateProvideZardWithDarkMode(cwd, resolvedConfig);
|
|
152
|
-
darkModeSpinner.succeed('Dark mode configured');
|
|
153
|
-
}
|
|
154
|
-
catch (error) {
|
|
155
|
-
darkModeSpinner.fail('Failed to configure dark mode');
|
|
156
|
-
logger.debug(`Dark mode error: ${error instanceof Error ? error.message : error}`);
|
|
157
|
-
}
|
|
203
|
+
await installPackagesWithRetry(missing, cwd, packageManager, false);
|
|
158
204
|
}
|
|
159
205
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stylesheet-setup.d.ts","sourceRoot":"","sources":["../../../src/commands/add/stylesheet-setup.ts"],"names":[],"mappings":"AAqGA,wBAAgB,YAAY,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { logger } from '../../utils/logger.js';
|
|
2
|
+
import { lineEndingOf } from '../../utils/source-file.js';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import * as fsPromises from 'fs/promises';
|
|
5
|
+
/**
|
|
6
|
+
* The same text with every CSS comment blanked out.
|
|
7
|
+
*
|
|
8
|
+
* Spaces replace the comment rather than removing it, so every offset into the
|
|
9
|
+
* result still points at the same character of the original. A commented-out
|
|
10
|
+
* `@import` is a note, not a rule, and CSS ignores it — so must we, or we
|
|
11
|
+
* anchor the new import to a line the browser never reads.
|
|
12
|
+
*/
|
|
13
|
+
function withoutComments(content) {
|
|
14
|
+
return content.replace(/\/\*[\s\S]*?\*\//g, comment => ' '.repeat(comment.length));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Whether the stylesheet already imports `fileName` for real.
|
|
18
|
+
*
|
|
19
|
+
* It asks the same scan that decides where to anchor, so the two cannot
|
|
20
|
+
* disagree: whatever counts as an import here counts as one there.
|
|
21
|
+
*
|
|
22
|
+
* The target has to name the file the CLI wrote next to the stylesheet, not
|
|
23
|
+
* merely end with it: `tailwindcss/utilities.css` or `./legacy-utilities.css`
|
|
24
|
+
* are other files, and taking them for ours would leave ours unimported.
|
|
25
|
+
*/
|
|
26
|
+
function alreadyImports(content, fileName) {
|
|
27
|
+
return cssImports(withoutComments(content)).some(match => {
|
|
28
|
+
const target = importTarget(match[0]);
|
|
29
|
+
return target === fileName || target === `./${fileName}`;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** The path an `@import` rule points at, whether quoted or wrapped in `url(...)`. */
|
|
33
|
+
function importTarget(rule) {
|
|
34
|
+
const target = /@import\s+(?:url\(\s*)?(['"]?)([^'"()\s;]+)\1/.exec(rule);
|
|
35
|
+
return target ? target[2] : null;
|
|
36
|
+
}
|
|
37
|
+
/** Every CSS `@import` in the file, in the order they appear. */
|
|
38
|
+
function cssImports(content) {
|
|
39
|
+
// `url(...)` and the media query list are optional and run to the `;`, so the
|
|
40
|
+
// pattern closes on the semicolon rather than on the quote: an
|
|
41
|
+
// `@import 'x' layer(base);` has to be recognised as the last one too.
|
|
42
|
+
const importRegex = /^[ \t]*@import\s[^;]*;/gm;
|
|
43
|
+
const matches = [];
|
|
44
|
+
let match;
|
|
45
|
+
while ((match = importRegex.exec(content)) !== null)
|
|
46
|
+
matches.push(match);
|
|
47
|
+
return matches;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Wires an installed stylesheet up by importing it into the project's global CSS.
|
|
51
|
+
*
|
|
52
|
+
* The file was written next to that CSS, but a file nobody imports styles
|
|
53
|
+
* nothing — and the order matters: coming after the other `@import`s lets the
|
|
54
|
+
* stylesheet see the theme tokens, which is where it takes colour and radius
|
|
55
|
+
* from.
|
|
56
|
+
*
|
|
57
|
+
* Calling this twice is the same as calling it once; a repeated `add` must not
|
|
58
|
+
* duplicate the line.
|
|
59
|
+
*/
|
|
60
|
+
async function importIntoGlobalCss(tailwindCssPath, fileName, label) {
|
|
61
|
+
const importLine = `@import './${fileName}';`;
|
|
62
|
+
if (!existsSync(tailwindCssPath)) {
|
|
63
|
+
logger.warn(`${tailwindCssPath} not found. Import ${fileName} in your global stylesheet manually.`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const content = await fsPromises.readFile(tailwindCssPath, 'utf8');
|
|
67
|
+
if (alreadyImports(content, fileName)) {
|
|
68
|
+
logger.info(`${label} already imported in your global stylesheet.`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const imports = cssImports(withoutComments(content));
|
|
72
|
+
const last = imports[imports.length - 1];
|
|
73
|
+
// With no `@import` to anchor to there is no safe position: before a `@layer`
|
|
74
|
+
// or a `@charset` the import is invalid, and guessing would corrupt the CSS
|
|
75
|
+
// of whoever installed it. Better one line to copy than a broken file.
|
|
76
|
+
if (!last) {
|
|
77
|
+
logger.warn(`No @import found in ${tailwindCssPath}. Add \`${importLine}\` to it manually.`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const eol = lineEndingOf(content);
|
|
81
|
+
const end = last.index + last[0].length;
|
|
82
|
+
const updated = content.slice(0, end) + eol + importLine + content.slice(end);
|
|
83
|
+
await fsPromises.writeFile(tailwindCssPath, updated, 'utf8');
|
|
84
|
+
logger.info(`${label} imported in your global stylesheet.`);
|
|
85
|
+
}
|
|
86
|
+
export function setupTypeset(tailwindCssPath) {
|
|
87
|
+
return importIntoGlobalCss(tailwindCssPath, 'typeset.css', 'Typeset');
|
|
88
|
+
}
|
|
89
|
+
export function setupUtilities(tailwindCssPath) {
|
|
90
|
+
return importIntoGlobalCss(tailwindCssPath, 'utilities.css', 'Utilities');
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=stylesheet-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stylesheet-setup.js","sourceRoot":"","sources":["../../../src/commands/add/stylesheet-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ComponentMeta } from '../../commands/add/dependency-resolver.js';
|
|
2
|
+
import { type LogRecord } from '../../ui/index.js';
|
|
3
|
+
export interface AddWizardOptions {
|
|
4
|
+
/** Components already given on the command line — they skip selection. */
|
|
5
|
+
readonly preselected: readonly string[];
|
|
6
|
+
/** Loads the available names; only called when there is a selection to make. */
|
|
7
|
+
loadNames(): Promise<string[]>;
|
|
8
|
+
resolve(names: string[]): Promise<{
|
|
9
|
+
components: ComponentMeta[];
|
|
10
|
+
dependencies: string[];
|
|
11
|
+
}>;
|
|
12
|
+
/** Skips the confirmation (`--yes`). */
|
|
13
|
+
readonly skipConfirmation: boolean;
|
|
14
|
+
installDependencies(packages: string[]): Promise<void>;
|
|
15
|
+
installComponent(component: ComponentMeta): Promise<void>;
|
|
16
|
+
/** Only called when dark-mode is part of the install. */
|
|
17
|
+
setupDarkMode(indexHtml: string): Promise<void>;
|
|
18
|
+
/** Only called when typeset is part of the install. */
|
|
19
|
+
setupTypeset(): Promise<void>;
|
|
20
|
+
setupUtilities(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Where index.html should be, according to the configured project type.
|
|
23
|
+
*
|
|
24
|
+
* A fixed `src/index.html` only exists in a single Angular app: in a workspace
|
|
25
|
+
* it sits under `apps/<app>/`, and in Analog it is Vite's entry page, at the
|
|
26
|
+
* project root.
|
|
27
|
+
*/
|
|
28
|
+
readonly defaultIndexHtml: string;
|
|
29
|
+
}
|
|
30
|
+
export interface AddWizardResult {
|
|
31
|
+
readonly installed: readonly string[];
|
|
32
|
+
readonly logs: readonly LogRecord[];
|
|
33
|
+
}
|
|
34
|
+
export declare function runAddWizard(options: AddWizardOptions): Promise<AddWizardResult>;
|
|
35
|
+
//# sourceMappingURL=wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../../src/commands/add/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAuBL,KAAK,SAAS,EAKf,MAAM,kBAAkB,CAAC;AA6B1B,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,gFAAgF;IAChF,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,aAAa,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC3F,wCAAwC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,gBAAgB,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,yDAAyD;IACzD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,uDAAuD;IACvD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC;;;;;;OAMG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;CACrC;AAMD,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkLtF"}
|