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.
Files changed (80) hide show
  1. package/dist/commands/add.d.ts +2 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +204 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/config.d.ts +2 -0
  6. package/dist/commands/config.d.ts.map +1 -0
  7. package/dist/commands/config.js +68 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/doctor.d.ts +2 -0
  10. package/dist/commands/doctor.d.ts.map +1 -0
  11. package/dist/commands/doctor.js +348 -0
  12. package/dist/commands/doctor.js.map +1 -0
  13. package/dist/commands/init.d.ts.map +1 -1
  14. package/dist/commands/init.js +10 -153
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/list.d.ts +6 -0
  17. package/dist/commands/list.d.ts.map +1 -0
  18. package/dist/commands/list.js +104 -0
  19. package/dist/commands/list.js.map +1 -0
  20. package/dist/commands/remove.d.ts +2 -0
  21. package/dist/commands/remove.d.ts.map +1 -0
  22. package/dist/commands/remove.js +87 -0
  23. package/dist/commands/remove.js.map +1 -0
  24. package/dist/commands/search.d.ts +2 -0
  25. package/dist/commands/search.d.ts.map +1 -0
  26. package/dist/commands/search.js +124 -0
  27. package/dist/commands/search.js.map +1 -0
  28. package/dist/commands/update.d.ts +6 -0
  29. package/dist/commands/update.d.ts.map +1 -0
  30. package/dist/commands/update.js +247 -0
  31. package/dist/commands/update.js.map +1 -0
  32. package/dist/constants.d.ts +4 -0
  33. package/dist/constants.d.ts.map +1 -0
  34. package/dist/constants.js +4 -0
  35. package/dist/constants.js.map +1 -0
  36. package/dist/index.js +27 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/utils/banner.d.ts.map +1 -1
  39. package/dist/utils/banner.js.map +1 -1
  40. package/dist/utils/config.d.ts +17 -0
  41. package/dist/utils/config.d.ts.map +1 -0
  42. package/dist/utils/config.js +41 -0
  43. package/dist/utils/config.js.map +1 -0
  44. package/dist/utils/detect-css.d.ts +6 -6
  45. package/dist/utils/detect-css.d.ts.map +1 -1
  46. package/dist/utils/detect-css.js +16 -12
  47. package/dist/utils/detect-css.js.map +1 -1
  48. package/dist/utils/detect-framework.d.ts +1 -1
  49. package/dist/utils/detect-framework.d.ts.map +1 -1
  50. package/dist/utils/detect-package-manager.d.ts +5 -0
  51. package/dist/utils/detect-package-manager.d.ts.map +1 -0
  52. package/dist/utils/detect-package-manager.js +40 -0
  53. package/dist/utils/detect-package-manager.js.map +1 -0
  54. package/dist/utils/detect-typescript.d.ts.map +1 -1
  55. package/dist/utils/detect-typescript.js.map +1 -1
  56. package/dist/utils/helpers.d.ts +1 -2
  57. package/dist/utils/helpers.d.ts.map +1 -1
  58. package/dist/utils/helpers.js +3 -13
  59. package/dist/utils/helpers.js.map +1 -1
  60. package/dist/utils/lock.d.ts +6 -0
  61. package/dist/utils/lock.d.ts.map +1 -0
  62. package/dist/utils/lock.js +30 -0
  63. package/dist/utils/lock.js.map +1 -0
  64. package/dist/utils/registry.d.ts +57 -0
  65. package/dist/utils/registry.d.ts.map +1 -0
  66. package/dist/utils/registry.js +158 -0
  67. package/dist/utils/registry.js.map +1 -0
  68. package/dist/utils/search.d.ts +21 -0
  69. package/dist/utils/search.d.ts.map +1 -0
  70. package/dist/utils/search.js +104 -0
  71. package/dist/utils/search.js.map +1 -0
  72. package/dist/utils/wizard.d.ts +12 -0
  73. package/dist/utils/wizard.d.ts.map +1 -0
  74. package/dist/utils/wizard.js +168 -0
  75. package/dist/utils/wizard.js.map +1 -0
  76. package/dist/utils/write-component.d.ts +13 -0
  77. package/dist/utils/write-component.d.ts.map +1 -0
  78. package/dist/utils/write-component.js +132 -0
  79. package/dist/utils/write-component.js.map +1 -0
  80. 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,2 @@
1
+ export declare function removeCommand(componentNames: string[]): Promise<void>;
2
+ //# sourceMappingURL=remove.d.ts.map
@@ -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,2 @@
1
+ export declare function searchCommand(queryWords: string[]): Promise<void>;
2
+ //# sourceMappingURL=search.d.ts.map
@@ -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,6 @@
1
+ interface UpdateOptions {
2
+ all: boolean;
3
+ }
4
+ export declare function updateCommand(componentNames: string[], options: UpdateOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=update.d.ts.map
@@ -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