zard-cli 1.0.0-beta.12 → 1.0.0-beta.121
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 +5 -2
- package/commands/add/dependency-resolver.d.ts.map +1 -1
- package/commands/add/dependency-resolver.js +54 -20
- package/commands/add/dependency-resolver.js.map +1 -1
- package/commands/add/index.d.ts.map +1 -1
- package/commands/add/index.js +135 -86
- package/commands/add/index.js.map +1 -1
- package/commands/add/typeset-setup.d.ts +12 -0
- package/commands/add/typeset-setup.d.ts.map +1 -0
- package/commands/add/typeset-setup.js +68 -0
- package/commands/add/typeset-setup.js.map +1 -0
- package/commands/add/wizard.d.ts +34 -0
- package/commands/add/wizard.d.ts.map +1 -0
- package/commands/add/wizard.js +295 -0
- package/commands/add/wizard.js.map +1 -0
- package/commands/init/config-prompter.d.ts +66 -56
- package/commands/init/config-prompter.d.ts.map +1 -1
- package/commands/init/config-prompter.js +90 -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 +51 -23
- 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 +15 -0
- package/commands/init/steps.d.ts.map +1 -0
- package/commands/init/steps.js +154 -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 +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 +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 +135 -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 +752 -126
- 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 +75 -61
- package/core/themes/theme-definitions.js.map +1 -1
- package/index.js +41 -4
- package/index.js.map +1 -1
- package/package.json +9 -14
- 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 +52 -69
- package/utils/config.d.ts.map +1 -1
- package/utils/config.js +60 -9
- 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 +83 -0
- package/utils/http-client.js.map +1 -0
- 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 +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 +89 -30
- 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
- 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
package/commands/add/index.js
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
|
-
import { installComponent } from '../../commands/add/component-installer.js';
|
|
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 { getAllComponentNames, getTargetDir, resolveDependencies, } from '../../commands/add/dependency-resolver.js';
|
|
5
|
+
import { setupTypeset } from '../../commands/add/typeset-setup.js';
|
|
6
|
+
import { runAddWizard } from '../../commands/add/wizard.js';
|
|
7
|
+
import { indexHtmlFor } from '../../commands/init/project-kind.js';
|
|
5
8
|
import { injectThemeScript } from '../../commands/init/theme-loader.js';
|
|
9
|
+
import { isInteractive, printReport, WizardCancelledError } from '../../ui/index.js';
|
|
10
|
+
import { pinAllForAngular } from '../../utils/angular-compat.js';
|
|
6
11
|
import { getConfig, resolveConfigPaths } from '../../utils/config.js';
|
|
12
|
+
import { CliError } from '../../utils/errors.js';
|
|
7
13
|
import { getProjectInfo } from '../../utils/get-project-info.js';
|
|
14
|
+
import { assertIconFamily, loadIconCatalog } from '../../utils/icon-catalog.js';
|
|
8
15
|
import { logger, spinner } from '../../utils/logger.js';
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
16
|
+
import { filterInstalledPackages, installPackagesWithRetry } from '../../utils/package-manager.js';
|
|
17
|
+
import { getRegistryUrl } from '../../utils/registry.js';
|
|
11
18
|
import { Command } from 'commander';
|
|
12
19
|
import { existsSync } from 'node:fs';
|
|
13
20
|
import * as path from 'node:path';
|
|
14
|
-
import prompts from 'prompts';
|
|
15
21
|
export const add = new Command()
|
|
16
22
|
.name('add')
|
|
17
23
|
.description('add a component to your project')
|
|
@@ -24,114 +30,157 @@ export const add = new Command()
|
|
|
24
30
|
.action(async (components, options) => {
|
|
25
31
|
const cwd = path.resolve(options.cwd);
|
|
26
32
|
validateWorkingDirectory(cwd);
|
|
33
|
+
if (options.path) {
|
|
34
|
+
validateTargetPath(path.resolve(cwd, options.path), cwd);
|
|
35
|
+
}
|
|
27
36
|
const config = await loadConfiguration(cwd);
|
|
28
|
-
await validateProject(cwd);
|
|
37
|
+
const projectInfo = await validateProject(cwd);
|
|
29
38
|
const resolvedConfig = await resolveConfigPaths(cwd, config);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
// The catalog decides whether `icons` is a valid value and how to translate
|
|
40
|
+
// the symbols on install, so it comes before resolving any component.
|
|
41
|
+
await loadIconCatalog(getRegistryUrl(config));
|
|
42
|
+
assertIconFamily(config.icons);
|
|
43
|
+
const preselected = await selectComponents(components, options.all);
|
|
44
|
+
warnOnPrereleaseAngular(projectInfo.angularVersionRaw);
|
|
45
|
+
const actions = {
|
|
46
|
+
loadNames: () => getAllComponentNames(),
|
|
47
|
+
resolve: async (names) => {
|
|
48
|
+
const { componentsToInstall, dependenciesToInstall } = await resolveDependencies(names, resolvedConfig, cwd, options);
|
|
49
|
+
return {
|
|
50
|
+
components: componentsToInstall,
|
|
51
|
+
dependencies: pinAllForAngular(dependenciesToInstall, projectInfo.angularVersion),
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
installDependencies: (packages) => installDependencies(packages, cwd, config.packageManager),
|
|
55
|
+
installComponent: (component) => installComponent(component.name, getTargetDir(component, resolvedConfig, cwd, options.path), resolvedConfig, {
|
|
56
|
+
customPath: Boolean(options.path),
|
|
57
|
+
}),
|
|
58
|
+
setupDarkMode: async (indexHtml) => {
|
|
59
|
+
await injectThemeScript(cwd, indexHtml);
|
|
60
|
+
await updateProvideZardWithDarkMode(cwd, resolvedConfig);
|
|
61
|
+
},
|
|
62
|
+
setupTypeset: () => setupTypeset(resolvedConfig.resolvedPaths.tailwindCss),
|
|
63
|
+
defaultIndexHtml: indexHtmlFor(config.projectType, config.baseUrl),
|
|
64
|
+
};
|
|
65
|
+
if (!isInteractive()) {
|
|
66
|
+
// See the note in `init`: without this, falling back to text mode is
|
|
67
|
+
// indistinguishable from the interface not existing.
|
|
68
|
+
logger.debug(`No terminal to draw on (stdin TTY: ${Boolean(process.stdin.isTTY)}, ` +
|
|
69
|
+
`stdout TTY: ${Boolean(process.stdout.isTTY)}, controlling terminal: unreachable) — running headless.`);
|
|
70
|
+
await runHeadless(preselected, options, actions);
|
|
36
71
|
return;
|
|
37
72
|
}
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
73
|
+
try {
|
|
74
|
+
const { installed, logs } = await runAddWizard({
|
|
75
|
+
preselected,
|
|
76
|
+
skipConfirmation: options.yes,
|
|
77
|
+
...actions,
|
|
78
|
+
});
|
|
79
|
+
reportSuccess(installed, logs);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (error instanceof WizardCancelledError) {
|
|
83
|
+
printReport({ status: 'cancelled', headline: error.message, notes: ['No files were written.'] });
|
|
41
84
|
process.exit(0);
|
|
42
85
|
}
|
|
86
|
+
throw error;
|
|
43
87
|
}
|
|
44
|
-
await installDependencies(dependenciesToInstall, cwd, config.packageManager);
|
|
45
|
-
await installComponents(componentsToInstall, cwd, resolvedConfig, options);
|
|
46
|
-
const isDarkModeBeingInstalled = componentsToInstall.some(c => c.name === 'dark-mode');
|
|
47
|
-
if (isDarkModeBeingInstalled) {
|
|
48
|
-
await setupDarkMode(cwd, resolvedConfig);
|
|
49
|
-
}
|
|
50
|
-
logger.break();
|
|
51
|
-
logger.success('Done!');
|
|
52
88
|
});
|
|
89
|
+
/**
|
|
90
|
+
* The path without a UI — CI, pipes and non-interactive terminals.
|
|
91
|
+
*
|
|
92
|
+
* With nobody to pick from the list, the components have to arrive as arguments
|
|
93
|
+
* or through `--all`; the confirmation is skipped because there is no way to
|
|
94
|
+
* answer it.
|
|
95
|
+
*/
|
|
96
|
+
async function runHeadless(preselected, options, actions) {
|
|
97
|
+
if (!preselected.length) {
|
|
98
|
+
throw new CliError('No components specified. Pass the component names or --all when running without an interactive terminal.', 'NO_COMPONENTS');
|
|
99
|
+
}
|
|
100
|
+
const resolveSpinner = spinner('Resolving components...').start();
|
|
101
|
+
const { components, dependencies } = await actions.resolve(preselected);
|
|
102
|
+
resolveSpinner.stop();
|
|
103
|
+
if (components.length === 0) {
|
|
104
|
+
logger.info('All components already installed.');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (dependencies.length) {
|
|
108
|
+
const depsSpinner = spinner('Installing dependencies...').start();
|
|
109
|
+
await actions.installDependencies(dependencies);
|
|
110
|
+
depsSpinner.succeed('Dependencies installed');
|
|
111
|
+
}
|
|
112
|
+
const installed = [];
|
|
113
|
+
const failed = [];
|
|
114
|
+
for (const component of components) {
|
|
115
|
+
const componentSpinner = spinner(`Installing ${component.name}...`).start();
|
|
116
|
+
try {
|
|
117
|
+
await actions.installComponent(component);
|
|
118
|
+
installed.push(component.name);
|
|
119
|
+
componentSpinner.succeed(component.name);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
failed.push(component.name);
|
|
123
|
+
componentSpinner.fail(component.name);
|
|
124
|
+
logger.debug(`Failed to install ${component.name}: ${error instanceof Error ? error.message : error}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (installed.includes('typeset')) {
|
|
128
|
+
await actions.setupTypeset();
|
|
129
|
+
}
|
|
130
|
+
if (components.some(component => component.name === 'dark-mode')) {
|
|
131
|
+
logger.warn('Dark mode needs an index.html path; run `zard-cli add dark-mode` interactively to configure it.');
|
|
132
|
+
}
|
|
133
|
+
if (failed.length) {
|
|
134
|
+
throw new CliError(`Failed to install: ${failed.join(', ')}`, 'INSTALL_FAILED');
|
|
135
|
+
}
|
|
136
|
+
reportSuccess(installed, []);
|
|
137
|
+
}
|
|
138
|
+
function reportSuccess(installed, logs) {
|
|
139
|
+
if (!installed.length) {
|
|
140
|
+
printReport({ status: 'success', headline: 'All components are already installed.', logs });
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
printReport({
|
|
144
|
+
status: 'success',
|
|
145
|
+
headline: `Installed ${installed.length} component${installed.length > 1 ? 's' : ''}.`,
|
|
146
|
+
items: [...installed],
|
|
147
|
+
logs,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
53
150
|
function validateWorkingDirectory(cwd) {
|
|
54
151
|
if (!existsSync(cwd)) {
|
|
55
|
-
|
|
56
|
-
process.exit(1);
|
|
152
|
+
throw new CliError(`The path ${cwd} does not exist. Please try again.`, 'INVALID_CWD');
|
|
57
153
|
}
|
|
58
154
|
}
|
|
59
155
|
async function loadConfiguration(cwd) {
|
|
60
156
|
const config = await getConfig(cwd);
|
|
61
157
|
if (!config) {
|
|
62
|
-
|
|
63
|
-
process.exit(1);
|
|
158
|
+
throw new CliError('Configuration not found. Please run `zard-cli init` first.', 'CONFIG_NOT_FOUND');
|
|
64
159
|
}
|
|
65
160
|
return config;
|
|
66
161
|
}
|
|
67
162
|
async function validateProject(cwd) {
|
|
68
163
|
const projectInfo = await getProjectInfo(cwd);
|
|
69
164
|
if (projectInfo.framework !== 'angular') {
|
|
70
|
-
|
|
71
|
-
process.exit(1);
|
|
165
|
+
throw new CliError('This project does not appear to be an Angular project.', 'NOT_ANGULAR');
|
|
72
166
|
}
|
|
73
167
|
return projectInfo;
|
|
74
168
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
name: 'proceed',
|
|
79
|
-
message: `Ready to install ${componentsCount} component(s) and ${dependenciesCount} dependencies. Proceed?`,
|
|
80
|
-
initial: true,
|
|
81
|
-
});
|
|
82
|
-
return proceed;
|
|
83
|
-
}
|
|
84
|
-
async function installDependencies(dependenciesToInstall, cwd, packageManager) {
|
|
85
|
-
if (dependenciesToInstall.size === 0)
|
|
86
|
-
return;
|
|
87
|
-
const depsSpinner = spinner('Installing dependencies...').start();
|
|
88
|
-
await installPackages(Array.from(dependenciesToInstall), cwd, packageManager, false);
|
|
89
|
-
depsSpinner.succeed('Dependencies installed');
|
|
90
|
-
}
|
|
91
|
-
async function installComponents(componentsToInstall, cwd, resolvedConfig, options) {
|
|
92
|
-
const installSpinner = spinner('Installing components...').start();
|
|
93
|
-
const installed = [];
|
|
94
|
-
const failed = [];
|
|
95
|
-
for (const component of componentsToInstall) {
|
|
96
|
-
try {
|
|
97
|
-
installSpinner.text = `Installing ${component.name}...`;
|
|
98
|
-
const targetDir = getTargetDir(component, resolvedConfig, cwd, options.path);
|
|
99
|
-
await installComponent(component.name, targetDir, resolvedConfig);
|
|
100
|
-
installed.push(component.name);
|
|
101
|
-
}
|
|
102
|
-
catch (error) {
|
|
103
|
-
failed.push(component.name);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
if (failed.length > 0) {
|
|
107
|
-
installSpinner.fail(`Failed to install: ${failed.join(', ')}`);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
installSpinner.succeed(`Installed ${installed.length} component${installed.length > 1 ? 's' : ''}`);
|
|
169
|
+
function warnOnPrereleaseAngular(angularVersionRaw) {
|
|
170
|
+
if (angularVersionRaw && /-(rc|next|canary)/.test(angularVersionRaw)) {
|
|
171
|
+
logger.warn(`You are using a pre-release version of Angular (${angularVersionRaw}). Some dependencies may have compatibility issues.`);
|
|
111
172
|
}
|
|
112
173
|
}
|
|
113
|
-
async function
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
});
|
|
122
|
-
if (!indexFile) {
|
|
123
|
-
logger.warn('Skipping dark mode script injection.');
|
|
174
|
+
async function installDependencies(packages, cwd, packageManager) {
|
|
175
|
+
if (packages.length === 0)
|
|
176
|
+
return;
|
|
177
|
+
// An already-initialized project usually has all of them: without the filter,
|
|
178
|
+
// every `add` would pay for a full tree revalidation to install nothing.
|
|
179
|
+
const missing = await filterInstalledPackages(packages, cwd);
|
|
180
|
+
if (missing.length === 0) {
|
|
181
|
+
logger.debug(`Dependencies already installed: ${packages.join(', ')}`);
|
|
124
182
|
return;
|
|
125
183
|
}
|
|
126
|
-
|
|
127
|
-
try {
|
|
128
|
-
await injectThemeScript(cwd, indexFile);
|
|
129
|
-
await updateProvideZardWithDarkMode(cwd, resolvedConfig);
|
|
130
|
-
darkModeSpinner.succeed('Dark mode configured');
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
darkModeSpinner.fail('Failed to configure dark mode');
|
|
134
|
-
logger.error(error);
|
|
135
|
-
}
|
|
184
|
+
await installPackagesWithRetry(missing, cwd, packageManager, false);
|
|
136
185
|
}
|
|
137
186
|
//# 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,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wires typeset up by importing it into the project's global CSS.
|
|
3
|
+
*
|
|
4
|
+
* The file was written next to that CSS, but a file nobody imports styles
|
|
5
|
+
* nothing — and the order matters: coming after the other `@import`s lets
|
|
6
|
+
* typeset see the theme tokens, which is where it takes colour and radius from.
|
|
7
|
+
*
|
|
8
|
+
* Calling this twice is the same as calling it once; a repeated `add typeset`
|
|
9
|
+
* must not duplicate the line.
|
|
10
|
+
*/
|
|
11
|
+
export declare function setupTypeset(tailwindCssPath: string): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=typeset-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeset-setup.d.ts","sourceRoot":"","sources":["../../../src/commands/add/typeset-setup.ts"],"names":[],"mappings":"AAsCA;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BzE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
const TYPESET_IMPORT = "@import './typeset.css';";
|
|
6
|
+
/**
|
|
7
|
+
* The same text with every CSS comment blanked out.
|
|
8
|
+
*
|
|
9
|
+
* Spaces replace the comment rather than removing it, so every offset into the
|
|
10
|
+
* result still points at the same character of the original. A commented-out
|
|
11
|
+
* `@import` is a note, not a rule, and CSS ignores it — so must we, or we
|
|
12
|
+
* anchor the new import to a line the browser never reads.
|
|
13
|
+
*/
|
|
14
|
+
function withoutComments(content) {
|
|
15
|
+
return content.replace(/\/\*[\s\S]*?\*\//g, comment => ' '.repeat(comment.length));
|
|
16
|
+
}
|
|
17
|
+
/** Whether the stylesheet already imports typeset.css for real. */
|
|
18
|
+
function importsTypeset(content) {
|
|
19
|
+
return /@import\s[^;]*['"][^'"]*typeset\.css['"][^;]*;/.test(withoutComments(content));
|
|
20
|
+
}
|
|
21
|
+
/** Every CSS `@import` in the file, in the order they appear. */
|
|
22
|
+
function cssImports(content) {
|
|
23
|
+
// `url(...)` and the media query list are optional and run to the `;`, so the
|
|
24
|
+
// pattern closes on the semicolon rather than on the quote: an
|
|
25
|
+
// `@import 'x' layer(base);` has to be recognised as the last one too.
|
|
26
|
+
const importRegex = /^[ \t]*@import\s[^;]*;/gm;
|
|
27
|
+
const matches = [];
|
|
28
|
+
let match;
|
|
29
|
+
while ((match = importRegex.exec(content)) !== null)
|
|
30
|
+
matches.push(match);
|
|
31
|
+
return matches;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Wires typeset up by importing it into the project's global CSS.
|
|
35
|
+
*
|
|
36
|
+
* The file was written next to that CSS, but a file nobody imports styles
|
|
37
|
+
* nothing — and the order matters: coming after the other `@import`s lets
|
|
38
|
+
* typeset see the theme tokens, which is where it takes colour and radius from.
|
|
39
|
+
*
|
|
40
|
+
* Calling this twice is the same as calling it once; a repeated `add typeset`
|
|
41
|
+
* must not duplicate the line.
|
|
42
|
+
*/
|
|
43
|
+
export async function setupTypeset(tailwindCssPath) {
|
|
44
|
+
if (!existsSync(tailwindCssPath)) {
|
|
45
|
+
logger.warn(`${tailwindCssPath} not found. Import typeset.css in your global stylesheet manually.`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const content = await fsPromises.readFile(tailwindCssPath, 'utf8');
|
|
49
|
+
if (importsTypeset(content)) {
|
|
50
|
+
logger.info('Typeset already imported in your global stylesheet.');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const imports = cssImports(withoutComments(content));
|
|
54
|
+
const last = imports[imports.length - 1];
|
|
55
|
+
// With no `@import` to anchor to there is no safe position: before a `@layer`
|
|
56
|
+
// or a `@charset` the import is invalid, and guessing would corrupt the CSS
|
|
57
|
+
// of whoever installed it. Better one line to copy than a broken file.
|
|
58
|
+
if (!last) {
|
|
59
|
+
logger.warn(`No @import found in ${tailwindCssPath}. Add \`${TYPESET_IMPORT}\` to it manually.`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const eol = lineEndingOf(content);
|
|
63
|
+
const end = last.index + last[0].length;
|
|
64
|
+
const updated = content.slice(0, end) + eol + TYPESET_IMPORT + content.slice(end);
|
|
65
|
+
await fsPromises.writeFile(tailwindCssPath, updated, 'utf8');
|
|
66
|
+
logger.info('Typeset imported in your global stylesheet.');
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=typeset-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeset-setup.js","sourceRoot":"","sources":["../../../src/commands/add/typeset-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAE1C,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAElD;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,mEAAmE;AACnE,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,gDAAgD,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,iEAAiE;AACjE,SAAS,UAAU,CAAC,OAAe;IACjC,8EAA8E;IAC9E,+DAA+D;IAC/D,uEAAuE;IACvE,MAAM,WAAW,GAAG,0BAA0B,CAAC;IAE/C,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEzE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,eAAuB;IACxD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,oEAAoE,CAAC,CAAC;QACpG,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAEnE,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEzC,8EAA8E;IAC9E,4EAA4E;IAC5E,uEAAuE;IACvE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,IAAI,CAAC,uBAAuB,eAAe,WAAW,cAAc,oBAAoB,CAAC,CAAC;QACjG,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAElF,MAAM,UAAU,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
/**
|
|
21
|
+
* Where index.html should be, according to the configured project type.
|
|
22
|
+
*
|
|
23
|
+
* A fixed `src/index.html` only exists in a single Angular app: in a workspace
|
|
24
|
+
* it sits under `apps/<app>/`, and in Analog it is Vite's entry page, at the
|
|
25
|
+
* project root.
|
|
26
|
+
*/
|
|
27
|
+
readonly defaultIndexHtml: string;
|
|
28
|
+
}
|
|
29
|
+
export interface AddWizardResult {
|
|
30
|
+
readonly installed: readonly string[];
|
|
31
|
+
readonly logs: readonly LogRecord[];
|
|
32
|
+
}
|
|
33
|
+
export declare function runAddWizard(options: AddWizardOptions): Promise<AddWizardResult>;
|
|
34
|
+
//# 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;;;;;;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;AAKD,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8KtF"}
|