dcntui 0.1.6 → 0.1.8
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/dist/commands/add.d.ts +2 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +204 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +68 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +348 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +10 -153
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +104 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/remove.d.ts +2 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +87 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +124 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +247 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.js +27 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/banner.d.ts.map +1 -1
- package/dist/utils/banner.js.map +1 -1
- package/dist/utils/config.d.ts +17 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +41 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/detect-css.d.ts +6 -6
- package/dist/utils/detect-css.d.ts.map +1 -1
- package/dist/utils/detect-css.js +16 -12
- package/dist/utils/detect-css.js.map +1 -1
- package/dist/utils/detect-framework.d.ts +1 -1
- package/dist/utils/detect-framework.d.ts.map +1 -1
- package/dist/utils/detect-package-manager.d.ts +5 -0
- package/dist/utils/detect-package-manager.d.ts.map +1 -0
- package/dist/utils/detect-package-manager.js +40 -0
- package/dist/utils/detect-package-manager.js.map +1 -0
- package/dist/utils/detect-typescript.d.ts.map +1 -1
- package/dist/utils/detect-typescript.js.map +1 -1
- package/dist/utils/helpers.d.ts +1 -2
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +3 -13
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/lock.d.ts +6 -0
- package/dist/utils/lock.d.ts.map +1 -0
- package/dist/utils/lock.js +30 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/registry.d.ts +57 -0
- package/dist/utils/registry.d.ts.map +1 -0
- package/dist/utils/registry.js +158 -0
- package/dist/utils/registry.js.map +1 -0
- package/dist/utils/search.d.ts +21 -0
- package/dist/utils/search.d.ts.map +1 -0
- package/dist/utils/search.js +104 -0
- package/dist/utils/search.js.map +1 -0
- package/dist/utils/wizard.d.ts +12 -0
- package/dist/utils/wizard.d.ts.map +1 -0
- package/dist/utils/wizard.js +168 -0
- package/dist/utils/wizard.js.map +1 -0
- package/dist/utils/write-component.d.ts +13 -0
- package/dist/utils/write-component.d.ts.map +1 -0
- package/dist/utils/write-component.js +132 -0
- package/dist/utils/write-component.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { readConfig, ConfigError } from '../utils/config.js';
|
|
4
|
+
import { fetchCatalog, RegistryError } from '../utils/registry.js';
|
|
5
|
+
import { readLock } from '../utils/lock.js';
|
|
6
|
+
import { detectPackageManager, getPackageRunner } from '../utils/detect-package-manager.js';
|
|
7
|
+
export async function listCommand(options) {
|
|
8
|
+
console.clear();
|
|
9
|
+
clack.intro(chalk.bgCyan.black(' DCNT UI LIST '));
|
|
10
|
+
const cwd = process.cwd();
|
|
11
|
+
const pm = detectPackageManager(cwd);
|
|
12
|
+
const packageRunner = getPackageRunner(pm);
|
|
13
|
+
let config;
|
|
14
|
+
try {
|
|
15
|
+
config = readConfig(cwd);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
if (err instanceof ConfigError) {
|
|
19
|
+
clack.log.error(chalk.red(err.message));
|
|
20
|
+
clack.outro(chalk.red('Aborted.'));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
throw err;
|
|
24
|
+
}
|
|
25
|
+
const lock = readLock(cwd);
|
|
26
|
+
const installedNames = new Set(Object.keys(lock));
|
|
27
|
+
if (options.installed) {
|
|
28
|
+
if (installedNames.size === 0) {
|
|
29
|
+
clack.log.info('No components installed yet.\n\n Run ' +
|
|
30
|
+
chalk.cyan(`${packageRunner} dcntui add <component>`) +
|
|
31
|
+
' to get started.');
|
|
32
|
+
clack.outro('');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
clack.log.info(chalk.bold(`Installed components (${installedNames.size}):\n`));
|
|
36
|
+
const entries = Object.entries(lock).sort(([a], [b]) => a.localeCompare(b));
|
|
37
|
+
for (const [name, version] of entries) {
|
|
38
|
+
console.log(` ${chalk.green('✓')} ${chalk.bold(name.padEnd(28))} ${chalk.gray('v' + version)}`);
|
|
39
|
+
}
|
|
40
|
+
console.log();
|
|
41
|
+
clack.outro(chalk.cyan(`${installedNames.size} component${installedNames.size === 1 ? '' : 's'} installed.`));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const spinner = clack.spinner();
|
|
45
|
+
spinner.start('Fetching catalog from registry…');
|
|
46
|
+
let catalog;
|
|
47
|
+
try {
|
|
48
|
+
catalog = await fetchCatalog(config.registry);
|
|
49
|
+
spinner.stop(`Catalog loaded.`);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err instanceof RegistryError) {
|
|
53
|
+
spinner.stop(chalk.red('Failed to fetch catalog.'));
|
|
54
|
+
clack.log.error(chalk.red(err.message));
|
|
55
|
+
clack.outro(chalk.red('Aborted.'));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
const hasToken = !!(process.env['DCNTUI_TOKEN'] || config.premiumToken);
|
|
61
|
+
let totalFree = 0;
|
|
62
|
+
let totalPremium = 0;
|
|
63
|
+
for (const category of catalog.categories) {
|
|
64
|
+
if (category.components.length === 0)
|
|
65
|
+
continue;
|
|
66
|
+
console.log('\n ' + chalk.bold.underline(category.name));
|
|
67
|
+
for (const component of category.components) {
|
|
68
|
+
console.log(' ' + formatComponentRow(component, installedNames, hasToken));
|
|
69
|
+
if (component.premium)
|
|
70
|
+
totalPremium++;
|
|
71
|
+
else
|
|
72
|
+
totalFree++;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
console.log();
|
|
76
|
+
console.log(' ' + [chalk.green('✓') + ' installed', chalk.cyan('◆') + ' free', chalk.yellow('★') + ' premium'].join(' '));
|
|
77
|
+
console.log();
|
|
78
|
+
const totalComponents = totalFree + totalPremium;
|
|
79
|
+
const summaryParts = [
|
|
80
|
+
chalk.bold(String(totalComponents)) + ' component' + (totalComponents === 1 ? '' : 's'),
|
|
81
|
+
chalk.cyan(String(totalFree) + ' free'),
|
|
82
|
+
chalk.yellow(String(totalPremium) + ' premium'),
|
|
83
|
+
installedNames.size > 0 ? chalk.green(String(installedNames.size) + ' installed') : chalk.gray('0 installed')
|
|
84
|
+
];
|
|
85
|
+
if (!hasToken && totalPremium > 0) {
|
|
86
|
+
clack.outro(summaryParts.join(' · ') +
|
|
87
|
+
'\n\n' +
|
|
88
|
+
chalk.gray(' Unlock premium components at ') +
|
|
89
|
+
chalk.underline.cyan('https://dcntui.com'));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
clack.outro(summaryParts.join(' · '));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function formatComponentRow(component, installedNames, hasToken) {
|
|
96
|
+
const isInstalled = installedNames.has(component.name);
|
|
97
|
+
const badge = isInstalled ? chalk.green('✓') : component.premium ? chalk.yellow('★') : chalk.cyan('◆');
|
|
98
|
+
const name = component.premium && !hasToken && !isInstalled
|
|
99
|
+
? chalk.gray(component.name.padEnd(28))
|
|
100
|
+
: chalk.bold(component.name.padEnd(28));
|
|
101
|
+
const desc = chalk.gray(component.description);
|
|
102
|
+
return `${badge} ${name} ${desc}`;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6H3E"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { readConfig, ConfigError } from '../utils/config.js';
|
|
6
|
+
import { readLock, recordRemoved } from '../utils/lock.js';
|
|
7
|
+
import { revertStylesPatch } from '../utils/write-component.js';
|
|
8
|
+
import { detectPackageManager, getPackageRunner } from '../utils/detect-package-manager.js';
|
|
9
|
+
export async function removeCommand(componentNames) {
|
|
10
|
+
console.clear();
|
|
11
|
+
clack.intro(chalk.bgCyan.black(' DCNT UI REMOVE '));
|
|
12
|
+
const cwd = process.cwd();
|
|
13
|
+
const pm = detectPackageManager(cwd);
|
|
14
|
+
const packageRunner = getPackageRunner(pm);
|
|
15
|
+
let config;
|
|
16
|
+
try {
|
|
17
|
+
config = readConfig(cwd);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
if (err instanceof ConfigError) {
|
|
21
|
+
clack.log.error(chalk.red(err.message));
|
|
22
|
+
clack.outro(chalk.red('Aborted.'));
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
const lock = readLock(cwd);
|
|
28
|
+
const notInstalled = componentNames.filter((name) => !(name in lock));
|
|
29
|
+
if (notInstalled.length > 0) {
|
|
30
|
+
clack.log.error(chalk.red(`The following ${notInstalled.length === 1 ? 'component is' : 'components are'} not installed:\n\n` +
|
|
31
|
+
notInstalled.map((n) => ` ${chalk.bold(n)}`).join('\n') +
|
|
32
|
+
'\n\n' +
|
|
33
|
+
`Run ${chalk.cyan(`${packageRunner} dcntui list --installed`)} to see what's installed.`));
|
|
34
|
+
clack.outro(chalk.red('Aborted.'));
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
clack.log.warn(chalk.yellow(`The following ${componentNames.length === 1 ? 'component' : 'components'} will be permanently removed:\n`));
|
|
38
|
+
for (const name of componentNames) {
|
|
39
|
+
const version = lock[name];
|
|
40
|
+
const componentDir = path.join(config.componentsDir, name);
|
|
41
|
+
console.log(` ${chalk.bold(name)} ${chalk.gray('v' + version)}`);
|
|
42
|
+
console.log(` ${chalk.gray(' ' + componentDir + '/')}`);
|
|
43
|
+
}
|
|
44
|
+
const stylesPath = path.join(cwd, config.stylesFile);
|
|
45
|
+
const hasStylesBlock = fs.existsSync(stylesPath) && fs.readFileSync(stylesPath, 'utf-8').includes('/* dcntui:start */');
|
|
46
|
+
if (hasStylesBlock) {
|
|
47
|
+
console.log(`\n ${chalk.gray('~')} ${chalk.gray(config.stylesFile)} ${chalk.gray('(dcntui CSS block will be removed)')}`);
|
|
48
|
+
}
|
|
49
|
+
console.log();
|
|
50
|
+
const confirmed = await clack.confirm({
|
|
51
|
+
message: chalk.red(`Remove ${componentNames.length === 1 ? 'this component' : 'these components'}? This cannot be undone.`),
|
|
52
|
+
initialValue: false
|
|
53
|
+
});
|
|
54
|
+
if (clack.isCancel(confirmed) || !confirmed) {
|
|
55
|
+
clack.outro(chalk.cyan('Removal cancelled. No changes made.'));
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
const results = [];
|
|
59
|
+
for (const name of componentNames) {
|
|
60
|
+
const componentDir = path.join(cwd, config.componentsDir, name);
|
|
61
|
+
if (fs.existsSync(componentDir)) {
|
|
62
|
+
fs.rmSync(componentDir, { recursive: true, force: true });
|
|
63
|
+
clack.log.success(chalk.green(` ${chalk.gray('-')} ${path.join(config.componentsDir, name)}/`));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
clack.log.warn(chalk.yellow(` Component directory not found: ${componentDir}\n Continuing with lock file cleanup.`));
|
|
67
|
+
}
|
|
68
|
+
const metaPath = path.join(cwd, '.dcntui', `${name}.json`);
|
|
69
|
+
if (fs.existsSync(metaPath)) {
|
|
70
|
+
fs.rmSync(metaPath);
|
|
71
|
+
}
|
|
72
|
+
const remainingAfterThis = componentNames
|
|
73
|
+
.filter((n) => n !== name)
|
|
74
|
+
.concat(Object.keys(lock).filter((n) => !componentNames.includes(n)));
|
|
75
|
+
if (remainingAfterThis.length === 0 && hasStylesBlock) {
|
|
76
|
+
const reverted = revertStylesPatch(cwd, config);
|
|
77
|
+
if (reverted) {
|
|
78
|
+
clack.log.success(chalk.green(` ${chalk.gray('~')} ${config.stylesFile} ${chalk.gray('(dcntui CSS block removed)')}`));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
recordRemoved(cwd, name);
|
|
82
|
+
results.push({ name, success: true });
|
|
83
|
+
}
|
|
84
|
+
const count = results.length;
|
|
85
|
+
clack.outro(chalk.cyan(`Removed ${count} component${count === 1 ? '' : 's'} successfully.`));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AASA,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyJvE"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { readConfig, ConfigError } from '../utils/config.js';
|
|
4
|
+
import { fetchCatalog, RegistryError } from '../utils/registry.js';
|
|
5
|
+
import { aiSearch, keywordSearch, SearchError } from '../utils/search.js';
|
|
6
|
+
import { readLock } from '../utils/lock.js';
|
|
7
|
+
import { detectPackageManager, getPackageRunner } from '../utils/detect-package-manager.js';
|
|
8
|
+
export async function searchCommand(queryWords) {
|
|
9
|
+
console.clear();
|
|
10
|
+
clack.intro(chalk.bgCyan.black(' DCNT UI SEARCH '));
|
|
11
|
+
const cwd = process.cwd();
|
|
12
|
+
const pm = detectPackageManager(cwd);
|
|
13
|
+
const packageRunner = getPackageRunner(pm);
|
|
14
|
+
if (queryWords.length === 0) {
|
|
15
|
+
clack.log.error(chalk.red('Please provide a search query.\n\n' +
|
|
16
|
+
` Example: ${chalk.cyan(`${packageRunner} dcntui search animated pricing cards`)}`));
|
|
17
|
+
clack.outro(chalk.red('Aborted.'));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const query = queryWords.join(' ');
|
|
21
|
+
let registryUrl = 'https://registry.dcntui.com';
|
|
22
|
+
let hasToken = false;
|
|
23
|
+
try {
|
|
24
|
+
const config = readConfig(cwd);
|
|
25
|
+
registryUrl = config.registry;
|
|
26
|
+
hasToken = !!(process.env['DCNTUI_TOKEN'] || config.premiumToken);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
if (!(err instanceof ConfigError))
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
const lock = readLock(cwd);
|
|
33
|
+
const installedNames = new Set(Object.keys(lock));
|
|
34
|
+
const spinner = clack.spinner();
|
|
35
|
+
spinner.start('Fetching component catalog…');
|
|
36
|
+
let flatCatalog;
|
|
37
|
+
try {
|
|
38
|
+
const catalog = await fetchCatalog(registryUrl);
|
|
39
|
+
flatCatalog = catalog.categories.flatMap(({ name: category, components }) => components.map((entry) => ({ entry, category })));
|
|
40
|
+
spinner.stop(`Catalog loaded — ${flatCatalog.length} components.`);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (err instanceof RegistryError) {
|
|
44
|
+
spinner.stop(chalk.red('Failed to fetch catalog.'));
|
|
45
|
+
clack.log.error(chalk.red(err.message));
|
|
46
|
+
clack.outro(chalk.red('Aborted.'));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
const apiKey = process.env['ANTHROPIC_API_KEY'];
|
|
52
|
+
let results;
|
|
53
|
+
let searchMode;
|
|
54
|
+
if (apiKey) {
|
|
55
|
+
spinner.start('Running AI search…');
|
|
56
|
+
try {
|
|
57
|
+
results = await aiSearch(query, flatCatalog, apiKey);
|
|
58
|
+
searchMode = 'ai';
|
|
59
|
+
spinner.stop(`AI search complete — ${results.length} result${results.length === 1 ? '' : 's'}.`);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
if (err instanceof SearchError) {
|
|
63
|
+
spinner.stop(chalk.yellow(err.message));
|
|
64
|
+
results = keywordSearch(query, flatCatalog);
|
|
65
|
+
searchMode = 'keyword';
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
results = keywordSearch(query, flatCatalog);
|
|
74
|
+
searchMode = 'keyword';
|
|
75
|
+
clack.log.info(chalk.gray('Set ANTHROPIC_API_KEY for AI-powered search. Using keyword search.\n'));
|
|
76
|
+
}
|
|
77
|
+
if (results.length === 0) {
|
|
78
|
+
clack.log.warn(`No components found for ${chalk.bold(`"${query}"`)}\n\n` +
|
|
79
|
+
` Try broader terms, or run ${chalk.cyan(`${packageRunner} dcntui list`)} to browse all components.`);
|
|
80
|
+
clack.outro('');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const modeLabel = searchMode === 'ai' ? chalk.cyan('AI') + chalk.gray(' · ') : chalk.gray('keyword · ');
|
|
84
|
+
console.log(`\n ${modeLabel}${chalk.bold(results.length)} result${results.length === 1 ? '' : 's'} for ${chalk.bold(`"${query}"`)}\n`);
|
|
85
|
+
for (const result of results) {
|
|
86
|
+
renderResult(result, installedNames, hasToken);
|
|
87
|
+
}
|
|
88
|
+
console.log();
|
|
89
|
+
console.log(' ' + [chalk.green('✓') + ' installed', chalk.cyan('◆') + ' free', chalk.yellow('★') + ' premium'].join(' '));
|
|
90
|
+
console.log();
|
|
91
|
+
const installable = results.filter((r) => !installedNames.has(r.name));
|
|
92
|
+
if (installable.length === 0) {
|
|
93
|
+
clack.outro(chalk.cyan('All results are already installed.'));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const toInstall = await clack.multiselect({
|
|
97
|
+
message: 'Add any of these components?',
|
|
98
|
+
options: results.map((r) => ({
|
|
99
|
+
value: r.name,
|
|
100
|
+
label: r.name,
|
|
101
|
+
hint: installedNames.has(r.name) ? 'already installed' : r.description
|
|
102
|
+
})),
|
|
103
|
+
required: false
|
|
104
|
+
});
|
|
105
|
+
if (clack.isCancel(toInstall) || toInstall.length === 0) {
|
|
106
|
+
clack.outro(chalk.cyan('No components added.'));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const { addCommand } = await import('./add.js');
|
|
110
|
+
await addCommand(toInstall);
|
|
111
|
+
}
|
|
112
|
+
function renderResult(result, installedNames, hasToken) {
|
|
113
|
+
const isInstalled = installedNames.has(result.name);
|
|
114
|
+
const badge = isInstalled ? chalk.green('✓') : result.premium ? chalk.yellow('★') : chalk.cyan('◆');
|
|
115
|
+
const name = result.premium && !hasToken && !isInstalled
|
|
116
|
+
? chalk.gray(result.name.padEnd(26))
|
|
117
|
+
: chalk.bold(result.name.padEnd(26));
|
|
118
|
+
const category = chalk.gray(`[${result.category}]`.padEnd(16));
|
|
119
|
+
const score = chalk.gray(`${result.score}%`);
|
|
120
|
+
console.log(` ${badge} ${name} ${category} ${score}`);
|
|
121
|
+
console.log(` ${chalk.gray(result.reason)}`);
|
|
122
|
+
console.log();
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAYA,UAAU,aAAa;IACrB,GAAG,EAAE,OAAO,CAAC;CACd;AAoBD,wBAAsB,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwUnG"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { readConfig, ConfigError } from '../utils/config.js';
|
|
7
|
+
import { resolveRegistryUrl, fetchComponent, verifyPremiumToken, RegistryError } from '../utils/registry.js';
|
|
8
|
+
import { detectPackageManager, buildInstallArgs, getPackageRunner } from '../utils/detect-package-manager.js';
|
|
9
|
+
import { writeComponentFiles, patchStylesFile, diffComponentFiles } from '../utils/write-component.js';
|
|
10
|
+
import { readLock, recordInstalled } from '../utils/lock.js';
|
|
11
|
+
function isNewer(local, remote) {
|
|
12
|
+
if (local === remote)
|
|
13
|
+
return false;
|
|
14
|
+
const parse = (v) => v
|
|
15
|
+
.replace(/^[^0-9]*/, '')
|
|
16
|
+
.split('.')
|
|
17
|
+
.map(Number);
|
|
18
|
+
const [lMaj = 0, lMin = 0, lPat = 0] = parse(local);
|
|
19
|
+
const [rMaj = 0, rMin = 0, rPat = 0] = parse(remote);
|
|
20
|
+
if (rMaj !== lMaj)
|
|
21
|
+
return rMaj > lMaj;
|
|
22
|
+
if (rMin !== lMin)
|
|
23
|
+
return rMin > lMin;
|
|
24
|
+
return rPat > lPat;
|
|
25
|
+
}
|
|
26
|
+
export async function updateCommand(componentNames, options) {
|
|
27
|
+
console.clear();
|
|
28
|
+
clack.intro(chalk.bgCyan.black(' DCNT UI UPDATE '));
|
|
29
|
+
const cwd = process.cwd();
|
|
30
|
+
const pm = detectPackageManager(cwd);
|
|
31
|
+
const packageRunner = getPackageRunner(pm);
|
|
32
|
+
let config;
|
|
33
|
+
try {
|
|
34
|
+
config = readConfig(cwd);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
if (err instanceof ConfigError) {
|
|
38
|
+
clack.log.error(chalk.red(err.message));
|
|
39
|
+
clack.outro(chalk.red('Aborted.'));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
const lock = readLock(cwd);
|
|
45
|
+
if (options.all) {
|
|
46
|
+
componentNames = Object.keys(lock);
|
|
47
|
+
}
|
|
48
|
+
if (componentNames.length === 0) {
|
|
49
|
+
clack.log.info(options.all
|
|
50
|
+
? 'No components installed yet.\n\n Run ' +
|
|
51
|
+
chalk.cyan(`${packageRunner} dcntui add <component>`) +
|
|
52
|
+
' to get started.'
|
|
53
|
+
: 'No component names provided.\n\n Usage: ' +
|
|
54
|
+
chalk.cyan(`${packageRunner} dcntui update button`) +
|
|
55
|
+
' or ' +
|
|
56
|
+
chalk.cyan(`${packageRunner} dcntui update --all`));
|
|
57
|
+
clack.outro('');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const notInstalled = componentNames.filter((name) => !(name in lock));
|
|
61
|
+
if (notInstalled.length > 0) {
|
|
62
|
+
clack.log.error(chalk.red(`The following ${notInstalled.length === 1 ? 'component is' : 'components are'} not installed:\n\n` +
|
|
63
|
+
notInstalled.map((n) => ` ${chalk.bold(n)}`).join('\n') +
|
|
64
|
+
'\n\n' +
|
|
65
|
+
`Run ${chalk.cyan(`${packageRunner} dcntui add <component>`)} to install first.`));
|
|
66
|
+
clack.outro(chalk.red('Aborted.'));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
const token = process.env['DCNTUI_TOKEN'] || config.premiumToken || undefined;
|
|
70
|
+
const results = [];
|
|
71
|
+
for (const componentName of componentNames) {
|
|
72
|
+
const installedVersion = lock[componentName];
|
|
73
|
+
clack.log.step(chalk.cyan(`Checking ${chalk.bold(componentName)} ${chalk.gray('v' + installedVersion)}…`));
|
|
74
|
+
const url = resolveRegistryUrl(config, componentName);
|
|
75
|
+
const spinner = clack.spinner();
|
|
76
|
+
spinner.start('Fetching latest from registry…');
|
|
77
|
+
let metadata;
|
|
78
|
+
try {
|
|
79
|
+
metadata = await fetchComponent(url, token);
|
|
80
|
+
spinner.stop(`Registry version: ${chalk.bold('v' + metadata.version)}`);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (err instanceof RegistryError) {
|
|
84
|
+
spinner.stop(chalk.red('Fetch failed.'));
|
|
85
|
+
clack.log.error(chalk.red(err.message));
|
|
86
|
+
results.push({ name: componentName, status: 'failed', reason: err.message });
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
throw err;
|
|
90
|
+
}
|
|
91
|
+
if (!isNewer(installedVersion, metadata.version)) {
|
|
92
|
+
clack.log.info(chalk.gray(`${chalk.bold(componentName)} is already at the latest version (v${installedVersion}).`));
|
|
93
|
+
results.push({ name: componentName, status: 'skipped', reason: 'already latest' });
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
clack.log.info(`Update available: ${chalk.gray('v' + installedVersion)} ${chalk.gray('→')} ${chalk.cyan('v' + metadata.version)}`);
|
|
97
|
+
if (metadata.premium) {
|
|
98
|
+
if (!token) {
|
|
99
|
+
clack.log.error(chalk.red(`${chalk.bold(componentName)} is a premium component.\n\n` +
|
|
100
|
+
`Provide your token via:\n` +
|
|
101
|
+
` ${chalk.cyan(`DCNTUI_TOKEN=<token> ${packageRunner} dcntui update ` + componentName)}\n` +
|
|
102
|
+
` or add ${chalk.cyan('premiumToken')} to ${chalk.cyan('dcntui.config.json')}.\n\n` +
|
|
103
|
+
`Get a token at ${chalk.underline('https://dcntui.com')}`));
|
|
104
|
+
results.push({ name: componentName, status: 'failed', reason: 'no premium token' });
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
spinner.start('Verifying premium token…');
|
|
108
|
+
const valid = await verifyPremiumToken(config.registry, token);
|
|
109
|
+
if (!valid) {
|
|
110
|
+
spinner.stop(chalk.red('Token verification failed.'));
|
|
111
|
+
clack.log.error(chalk.red(`Your premium token is invalid or expired.\n\n` +
|
|
112
|
+
`Manage your subscription at ${chalk.underline('https://dcntui.com')}`));
|
|
113
|
+
results.push({ name: componentName, status: 'failed', reason: 'invalid token' });
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
spinner.stop(chalk.green('Premium token verified.'));
|
|
117
|
+
}
|
|
118
|
+
const diffs = diffComponentFiles(cwd, config, metadata);
|
|
119
|
+
const modifiedFiles = diffs.filter((d) => d.locallyModified);
|
|
120
|
+
if (modifiedFiles.length > 0) {
|
|
121
|
+
clack.log.warn(chalk.yellow(`${modifiedFiles.length} file${modifiedFiles.length === 1 ? ' has' : 's have'} local modifications:\n`));
|
|
122
|
+
for (const diff of modifiedFiles) {
|
|
123
|
+
console.log(` ${chalk.bold(diff.filePath)}`);
|
|
124
|
+
const preview = diff.diffLines.slice(0, 30);
|
|
125
|
+
for (const line of preview) {
|
|
126
|
+
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
127
|
+
console.log(' ' + chalk.green(line));
|
|
128
|
+
}
|
|
129
|
+
else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
130
|
+
console.log(' ' + chalk.red(line));
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
console.log(' ' + chalk.gray(line));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (diff.diffLines.length > 30) {
|
|
137
|
+
console.log(chalk.gray(` … and ${diff.diffLines.length - 30} more lines`));
|
|
138
|
+
}
|
|
139
|
+
console.log();
|
|
140
|
+
}
|
|
141
|
+
const overwrite = await clack.select({
|
|
142
|
+
message: 'How do you want to handle local modifications?',
|
|
143
|
+
options: [
|
|
144
|
+
{
|
|
145
|
+
value: 'overwrite',
|
|
146
|
+
label: 'Overwrite all',
|
|
147
|
+
hint: 'replace local changes with registry version'
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
value: 'skip-modified',
|
|
151
|
+
label: 'Keep local, update unmodified only',
|
|
152
|
+
hint: 'skip modified files, update everything else'
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
value: 'abort',
|
|
156
|
+
label: 'Abort this component',
|
|
157
|
+
hint: 'leave everything as-is'
|
|
158
|
+
}
|
|
159
|
+
],
|
|
160
|
+
initialValue: 'skip-modified'
|
|
161
|
+
});
|
|
162
|
+
if (clack.isCancel(overwrite) || overwrite === 'abort') {
|
|
163
|
+
clack.log.warn(chalk.yellow(`Skipped ${chalk.bold(componentName)}.`));
|
|
164
|
+
results.push({ name: componentName, status: 'skipped', reason: 'user aborted' });
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (overwrite === 'skip-modified') {
|
|
168
|
+
const modifiedPaths = new Set(modifiedFiles.map((d) => d.filePath));
|
|
169
|
+
metadata = {
|
|
170
|
+
...metadata,
|
|
171
|
+
files: metadata.files.filter((f) => !modifiedPaths.has(f.path))
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (metadata.dependencies.length > 0) {
|
|
176
|
+
const pkgJson = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8'));
|
|
177
|
+
const installed = {
|
|
178
|
+
...pkgJson['dependencies'],
|
|
179
|
+
...pkgJson['devDependencies']
|
|
180
|
+
};
|
|
181
|
+
const missing = metadata.dependencies.filter((dep) => !(dep in installed));
|
|
182
|
+
if (missing.length > 0) {
|
|
183
|
+
clack.log.warn(chalk.yellow(`New ${missing.length === 1 ? 'dependency' : 'dependencies'} required:\n\n` +
|
|
184
|
+
missing.map((d) => ` ${chalk.cyan(d)}`).join('\n')));
|
|
185
|
+
const shouldInstall = await clack.confirm({
|
|
186
|
+
message: `Install ${missing.length === 1 ? 'it' : 'them'} now using ${chalk.bold(pm)}?`,
|
|
187
|
+
initialValue: true
|
|
188
|
+
});
|
|
189
|
+
if (clack.isCancel(shouldInstall) || !shouldInstall) {
|
|
190
|
+
clack.log.warn(chalk.yellow(`Skipped. Install manually:\n` + ` ${chalk.cyan(buildInstallArgs(pm, missing).join(' '))}`));
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const installSpinner = clack.spinner();
|
|
194
|
+
installSpinner.start(`Installing ${missing.join(', ')}…`);
|
|
195
|
+
const [cmd, ...args] = buildInstallArgs(pm, missing);
|
|
196
|
+
const result = spawnSync(cmd, args, { cwd, stdio: 'pipe', shell: true });
|
|
197
|
+
if (result.status !== 0) {
|
|
198
|
+
installSpinner.stop(chalk.red('Dependency installation failed.'));
|
|
199
|
+
clack.log.error(chalk.red(`Failed to install dependencies. Try manually:\n` +
|
|
200
|
+
` ${chalk.cyan(buildInstallArgs(pm, missing).join(' '))}`));
|
|
201
|
+
results.push({ name: componentName, status: 'failed', reason: 'dep install failed' });
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
installSpinner.stop(chalk.green(`Installed ${missing.join(', ')}.`));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const written = writeComponentFiles(cwd, config, metadata);
|
|
209
|
+
for (const f of written) {
|
|
210
|
+
clack.log.success(chalk.green(` ${chalk.gray('↑')} ${f}`));
|
|
211
|
+
}
|
|
212
|
+
const patched = patchStylesFile(cwd, config, metadata);
|
|
213
|
+
if (patched) {
|
|
214
|
+
clack.log.success(chalk.green(` ${chalk.gray('~')} ${config.stylesFile} ${chalk.gray('(updated)')}`));
|
|
215
|
+
}
|
|
216
|
+
if (metadata.postInstall.length > 0) {
|
|
217
|
+
clack.log.info(chalk.cyan('Post-update notes:\n') + metadata.postInstall.map((note) => ` ${note}`).join('\n'));
|
|
218
|
+
}
|
|
219
|
+
recordInstalled(cwd, metadata.name, metadata.version);
|
|
220
|
+
clack.log.success(chalk.green(`${chalk.bold(componentName)} updated to v${metadata.version}.`));
|
|
221
|
+
results.push({ name: componentName, status: 'updated' });
|
|
222
|
+
}
|
|
223
|
+
if (componentNames.length > 1) {
|
|
224
|
+
const updated = results.filter((r) => r.status === 'updated');
|
|
225
|
+
const skipped = results.filter((r) => r.status === 'skipped');
|
|
226
|
+
const failed = results.filter((r) => r.status === 'failed');
|
|
227
|
+
clack.log.info([
|
|
228
|
+
'',
|
|
229
|
+
chalk.bold('Summary:'),
|
|
230
|
+
...updated.map((r) => ` ${chalk.green('↑')} ${r.name}`),
|
|
231
|
+
...skipped.map((r) => ` ${chalk.gray('–')} ${r.name} ${chalk.gray(r.reason ?? '')}`),
|
|
232
|
+
...failed.map((r) => ` ${chalk.red('✗')} ${r.name} ${chalk.gray(r.reason ?? '')}`)
|
|
233
|
+
].join('\n'));
|
|
234
|
+
}
|
|
235
|
+
const anyUpdated = results.some((r) => r.status === 'updated');
|
|
236
|
+
const anyFailed = results.some((r) => r.status === 'failed');
|
|
237
|
+
if (!anyUpdated && !anyFailed) {
|
|
238
|
+
clack.outro(chalk.cyan('All components are already up to date.'));
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (anyFailed && !anyUpdated) {
|
|
242
|
+
clack.outro(chalk.red('Update failed.'));
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
clack.outro(chalk.cyan('Done!'));
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=update.js.map
|