dcntui 0.1.5 → 0.1.7
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 +150 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +64 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.js +4 -2
- package/dist/index.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 +1 -0
- package/dist/utils/detect-css.d.ts.map +1 -1
- package/dist/utils/detect-css.js +56 -1
- 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-framework.js +2 -1
- package/dist/utils/detect-framework.js.map +1 -1
- package/dist/utils/detect-package-manager.d.ts +4 -0
- package/dist/utils/detect-package-manager.d.ts.map +1 -0
- package/dist/utils/detect-package-manager.js +28 -0
- package/dist/utils/detect-package-manager.js.map +1 -0
- package/dist/utils/registry.d.ts +30 -0
- package/dist/utils/registry.d.ts.map +1 -0
- package/dist/utils/registry.js +74 -0
- package/dist/utils/registry.js.map +1 -0
- package/dist/utils/write-component.d.ts +5 -0
- package/dist/utils/write-component.d.ts.map +1 -0
- package/dist/utils/write-component.js +51 -0
- package/dist/utils/write-component.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAUA,wBAAsB,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgMxE"}
|
|
@@ -0,0 +1,150 @@
|
|
|
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 } from '../utils/detect-package-manager.js';
|
|
9
|
+
import { writeComponentFiles, patchStylesFile } from '../utils/write-component.js';
|
|
10
|
+
export async function addCommand(componentNames) {
|
|
11
|
+
console.clear();
|
|
12
|
+
clack.intro(chalk.bgCyan.black(' DCNTUI ADD '));
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
// Read config
|
|
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
|
+
// Resolve token
|
|
28
|
+
const token = process.env['DCNTUI_TOKEN'] || config.premiumToken || undefined;
|
|
29
|
+
// Process each component
|
|
30
|
+
const pm = detectPackageManager(cwd);
|
|
31
|
+
const results = [];
|
|
32
|
+
for (const componentName of componentNames) {
|
|
33
|
+
clack.log.step(chalk.cyan(`Installing ${chalk.bold(componentName)}…`));
|
|
34
|
+
// Resolve registry variant URL
|
|
35
|
+
const url = resolveRegistryUrl(config, componentName);
|
|
36
|
+
// Fetch component metadata
|
|
37
|
+
const spinner = clack.spinner();
|
|
38
|
+
spinner.start('Fetching from registry…');
|
|
39
|
+
let metadata;
|
|
40
|
+
try {
|
|
41
|
+
metadata = await fetchComponent(url, token);
|
|
42
|
+
spinner.stop(`Fetched ${chalk.bold(componentName)} v${metadata.version}`);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
if (err instanceof RegistryError) {
|
|
46
|
+
spinner.stop(chalk.red('Fetch failed.'));
|
|
47
|
+
clack.log.error(chalk.red(err.message));
|
|
48
|
+
if (componentNames.length > 1) {
|
|
49
|
+
results.push({ name: componentName, success: false });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
clack.outro(chalk.red('Installation aborted.'));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
// Premium verification
|
|
58
|
+
if (metadata.premium) {
|
|
59
|
+
if (!token) {
|
|
60
|
+
clack.log.error(chalk.red(`${chalk.bold(componentName)} is a premium component.\n\n` +
|
|
61
|
+
`Provide your token via:\n` +
|
|
62
|
+
` ${chalk.cyan('DCNTUI_TOKEN=<token> npx dcntui add ' + componentName)}\n` +
|
|
63
|
+
` or add ${chalk.cyan('premiumToken')} to ${chalk.cyan('dcntui.config.json')}.\n\n` +
|
|
64
|
+
`Get a token at ${chalk.underline('https://dcntui.com')}`));
|
|
65
|
+
results.push({ name: componentName, success: false });
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
spinner.start('Verifying premium token…');
|
|
69
|
+
const valid = await verifyPremiumToken(config.registry, token);
|
|
70
|
+
if (!valid) {
|
|
71
|
+
spinner.stop(chalk.red('Token verification failed.'));
|
|
72
|
+
clack.log.error(chalk.red(`Your premium token is invalid or expired.\n\n` +
|
|
73
|
+
`Manage your subscription at ${chalk.underline('https://dcntui.com')}`));
|
|
74
|
+
results.push({ name: componentName, success: false });
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
spinner.stop(chalk.green('Premium token verified.'));
|
|
78
|
+
}
|
|
79
|
+
// Dependency management
|
|
80
|
+
if (metadata.dependencies.length > 0) {
|
|
81
|
+
const pkgJsonPath = path.join(cwd, 'package.json');
|
|
82
|
+
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
|
|
83
|
+
const installed = {
|
|
84
|
+
...pkgJson['dependencies'],
|
|
85
|
+
...pkgJson['devDependencies']
|
|
86
|
+
};
|
|
87
|
+
const missing = metadata.dependencies.filter((dep) => !(dep in installed));
|
|
88
|
+
if (missing.length > 0) {
|
|
89
|
+
clack.log.warn(chalk.yellow(`${chalk.bold(componentName)} requires the following ${missing.length === 1 ? 'package' : 'packages'}:\n\n` +
|
|
90
|
+
missing.map((d) => ` ${chalk.cyan(d)}`).join('\n')));
|
|
91
|
+
const shouldInstall = await clack.confirm({
|
|
92
|
+
message: `Install ${missing.length === 1 ? 'it' : 'them'} now using ${chalk.bold(pm)}?`,
|
|
93
|
+
initialValue: true
|
|
94
|
+
});
|
|
95
|
+
if (clack.isCancel(shouldInstall) || !shouldInstall) {
|
|
96
|
+
clack.log.warn(chalk.yellow(`Skipped dependency installation. You can install manually:\n` +
|
|
97
|
+
` ${chalk.cyan(buildInstallArgs(pm, missing).join(' '))}`));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const installSpinner = clack.spinner();
|
|
101
|
+
installSpinner.start(`Installing ${missing.join(', ')}…`);
|
|
102
|
+
const [cmd, ...args] = buildInstallArgs(pm, missing);
|
|
103
|
+
const result = spawnSync(cmd, args, { cwd, stdio: 'pipe', shell: true });
|
|
104
|
+
if (result.status !== 0) {
|
|
105
|
+
installSpinner.stop(chalk.red('Dependency installation failed.'));
|
|
106
|
+
clack.log.error(chalk.red(`Failed to install dependencies.\n\n` +
|
|
107
|
+
`Try running manually:\n` +
|
|
108
|
+
` ${chalk.cyan(buildInstallArgs(pm, missing).join(' '))}`));
|
|
109
|
+
results.push({ name: componentName, success: false });
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
installSpinner.stop(chalk.green(`Installed ${missing.join(', ')}.`));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Write component files
|
|
117
|
+
const written = writeComponentFiles(cwd, config, metadata);
|
|
118
|
+
for (const f of written) {
|
|
119
|
+
clack.log.success(chalk.green(` ${chalk.gray('+')} ${f}`));
|
|
120
|
+
}
|
|
121
|
+
// Patch styles file
|
|
122
|
+
const patched = patchStylesFile(cwd, config, metadata);
|
|
123
|
+
if (patched) {
|
|
124
|
+
clack.log.success(chalk.green(` ${chalk.gray('~')} ${config.stylesFile} ${chalk.gray('(patched)')}`));
|
|
125
|
+
}
|
|
126
|
+
// Post-install notes
|
|
127
|
+
if (metadata.postInstall.length > 0) {
|
|
128
|
+
clack.log.info(chalk.cyan('Post-install notes:\n') + metadata.postInstall.map((note) => ` ${note}`).join('\n'));
|
|
129
|
+
}
|
|
130
|
+
results.push({ name: componentName, success: true });
|
|
131
|
+
}
|
|
132
|
+
// Summary
|
|
133
|
+
if (componentNames.length > 1) {
|
|
134
|
+
const succeeded = results.filter((r) => r.success);
|
|
135
|
+
const failed = results.filter((r) => !r.success);
|
|
136
|
+
clack.log.info([
|
|
137
|
+
'',
|
|
138
|
+
chalk.bold('Summary:'),
|
|
139
|
+
...succeeded.map((r) => ` ${chalk.green('✓')} ${r.name}`),
|
|
140
|
+
...failed.map((r) => ` ${chalk.red('✗')} ${r.name}`)
|
|
141
|
+
].join('\n'));
|
|
142
|
+
}
|
|
143
|
+
const allFailed = results.every((r) => !r.success);
|
|
144
|
+
if (allFailed) {
|
|
145
|
+
clack.outro(chalk.red('No components were installed.'));
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
clack.outro(chalk.cyan('Done!'));
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,cAAwB;IACvD,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IAEhD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,cAAc;IACd,IAAI,MAAM,CAAC;IAEX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACxC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;IAE9E,yBAAyB;IACzB,MAAM,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,OAAO,GAAiE,EAAE,CAAC;IAEjF,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC3C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvE,+BAA+B;QAC/B,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAEtD,2BAA2B;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAEzC,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;gBACzC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;gBAExC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBACtD,SAAS;gBACX,CAAC;gBAED,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,uBAAuB;QACvB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,KAAK,CAAC,GAAG,CACP,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,8BAA8B;oBACxD,2BAA2B;oBAC3B,KAAK,KAAK,CAAC,IAAI,CAAC,sCAAsC,GAAG,aAAa,CAAC,IAAI;oBAC3E,YAAY,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO;oBACpF,kBAAkB,KAAK,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAC5D,CACF,CAAC;gBAEF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtD,SAAS;YACX,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACtD,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,KAAK,CAAC,GAAG,CACP,+CAA+C;oBAC7C,+BAA+B,KAAK,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CACzE,CACF,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtD,SAAS;YACX,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,wBAAwB;QACxB,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAA4B,CAAC;YAC7F,MAAM,SAAS,GAAG;gBAChB,GAAI,OAAO,CAAC,cAAc,CAAwC;gBAClE,GAAI,OAAO,CAAC,iBAAiB,CAAwC;aACtE,CAAC;YAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;YAE3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,KAAK,CAAC,MAAM,CACV,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,2BAA2B,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,OAAO;oBACzG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACtD,CACF,CAAC;gBAEF,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC;oBACxC,OAAO,EAAE,WAAW,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,cAAc,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG;oBACvF,YAAY,EAAE,IAAI;iBACnB,CAAC,CAAC;gBAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACpD,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,KAAK,CAAC,MAAM,CACV,8DAA8D;wBAC5D,KAAK,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAC7D,CACF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;oBACvC,cAAc,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAE1D,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;oBACrD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAE1E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACxB,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;wBAClE,KAAK,CAAC,GAAG,CAAC,KAAK,CACb,KAAK,CAAC,GAAG,CACP,qCAAqC;4BACnC,yBAAyB;4BACzB,KAAK,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAC7D,CACF,CAAC;wBACF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;wBACtD,SAAS;oBACX,CAAC;oBAED,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,oBAAoB;QACpB,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QACzG,CAAC;QAED,qBAAqB;QACrB,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,UAAU;IACV,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAEjD,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ;YACE,EAAE;YACF,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YACtB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;SACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEnD,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAWA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAWA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA6OjD"}
|
package/dist/commands/init.js
CHANGED
|
@@ -4,13 +4,17 @@ import fs from 'node:fs';
|
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { renderBanner } from '../utils/banner.js';
|
|
6
6
|
import { detectFramework, FRAMEWORK_OPTIONS } from '../utils/detect-framework.js';
|
|
7
|
-
import {
|
|
7
|
+
import { detectCss, detectBaseStylesFile, CSS_OPTIONS } from '../utils/detect-css.js';
|
|
8
8
|
import { detectTypeScript } from '../utils/detect-typescript.js';
|
|
9
|
-
|
|
9
|
+
import { CONFIG_FILE, REGISTRY_BASE } from '../constants.js';
|
|
10
|
+
import { detectPackageManager } from '../utils/detect-package-manager.js';
|
|
10
11
|
export async function initCommand() {
|
|
11
12
|
console.clear();
|
|
13
|
+
// Banner
|
|
12
14
|
renderBanner();
|
|
15
|
+
// Intro
|
|
13
16
|
clack.intro(chalk.bgCyan.black(' DCNTUI INIT '));
|
|
17
|
+
// Verify project root
|
|
14
18
|
const cwd = process.cwd();
|
|
15
19
|
const packageJsonPath = path.join(cwd, 'package.json');
|
|
16
20
|
if (!fs.existsSync(packageJsonPath)) {
|
|
@@ -21,6 +25,7 @@ export async function initCommand() {
|
|
|
21
25
|
process.exit(1);
|
|
22
26
|
}
|
|
23
27
|
clack.log.success(chalk.green("package.json found — you're in the right place."));
|
|
28
|
+
// Detect existing config
|
|
24
29
|
clack.log.info('Checking existing configuration…\n');
|
|
25
30
|
const configPath = path.join(cwd, CONFIG_FILE);
|
|
26
31
|
if (fs.existsSync(configPath)) {
|
|
@@ -39,23 +44,33 @@ export async function initCommand() {
|
|
|
39
44
|
process.exit(0);
|
|
40
45
|
}
|
|
41
46
|
}
|
|
47
|
+
// Framework detection
|
|
42
48
|
const detectedFramework = detectFramework(cwd);
|
|
43
49
|
if (detectedFramework) {
|
|
44
50
|
const detected = FRAMEWORK_OPTIONS.find((f) => f.value === detectedFramework);
|
|
45
51
|
clack.log.info(`Detected framework: ${chalk.cyan(detected.label)}`);
|
|
46
52
|
}
|
|
47
53
|
else {
|
|
48
|
-
clack.log.warn('
|
|
54
|
+
clack.log.warn('No supported framework detected.\n\n' +
|
|
55
|
+
' Supported: Next.js, React, Svelte, SvelteKit.\n' +
|
|
56
|
+
' Select your framework manually, or choose None to exit.');
|
|
49
57
|
}
|
|
50
58
|
const framework = await clack.select({
|
|
51
59
|
message: 'Framework:',
|
|
52
60
|
options: FRAMEWORK_OPTIONS,
|
|
53
|
-
initialValue: detectedFramework
|
|
61
|
+
initialValue: detectedFramework
|
|
54
62
|
});
|
|
55
63
|
if (clack.isCancel(framework)) {
|
|
56
64
|
clack.outro(chalk.yellow('Initialization cancelled.'));
|
|
57
65
|
process.exit(0);
|
|
58
66
|
}
|
|
67
|
+
if (framework === null) {
|
|
68
|
+
clack.log.error(chalk.red('DCNT UI requires a supported framework to function correctly.\n\n' +
|
|
69
|
+
' Supported frameworks: Next.js (App Router & Pages Router), React, Svelte, SvelteKit.\n'));
|
|
70
|
+
clack.outro(chalk.red('Initialization aborted. Please set up a supported framework first.'));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
// Write / patch dcntui.config.json
|
|
59
74
|
let config = {};
|
|
60
75
|
if (fs.existsSync(configPath)) {
|
|
61
76
|
try {
|
|
@@ -66,11 +81,12 @@ export async function initCommand() {
|
|
|
66
81
|
}
|
|
67
82
|
}
|
|
68
83
|
config['version'] ?? (config['version'] = 1);
|
|
69
|
-
config['registry'] ?? (config['registry'] =
|
|
84
|
+
config['registry'] ?? (config['registry'] = REGISTRY_BASE);
|
|
70
85
|
config['framework'] = framework;
|
|
71
86
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
72
87
|
const frameworkLabel = FRAMEWORK_OPTIONS.find((f) => f.value === framework).label;
|
|
73
88
|
clack.log.success(chalk.green(`Framework set to ${chalk.bold(frameworkLabel)}.`));
|
|
89
|
+
// CSS strategy detection
|
|
74
90
|
const detectedCss = detectCss(cwd);
|
|
75
91
|
if (detectedCss) {
|
|
76
92
|
const detected = CSS_OPTIONS.find((c) => c.value === detectedCss);
|
|
@@ -92,6 +108,41 @@ export async function initCommand() {
|
|
|
92
108
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
93
109
|
const cssLabel = CSS_OPTIONS.find((c) => c.value === css).label;
|
|
94
110
|
clack.log.success(chalk.green(`CSS strategy set to ${chalk.bold(cssLabel)}.`));
|
|
111
|
+
// Base styles file
|
|
112
|
+
const detectedStylesFile = detectBaseStylesFile(cwd, css);
|
|
113
|
+
if (detectedStylesFile) {
|
|
114
|
+
clack.log.info(`Detected base styles file: ${chalk.cyan(detectedStylesFile)}`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
clack.log.warn('Could not find a base styles file. Please enter the path manually.');
|
|
118
|
+
}
|
|
119
|
+
const defaultStylesExt = css === 'scss' ? '.scss' : '.css';
|
|
120
|
+
const defaultStylesFile = detectedStylesFile ?? `src/index${defaultStylesExt}`;
|
|
121
|
+
const stylesFile = await clack.text({
|
|
122
|
+
message: 'Base styles file:',
|
|
123
|
+
placeholder: defaultStylesFile,
|
|
124
|
+
defaultValue: defaultStylesFile,
|
|
125
|
+
validate(value) {
|
|
126
|
+
const trimmed = value.trim();
|
|
127
|
+
if (trimmed.length === 0)
|
|
128
|
+
return 'Styles file path cannot be empty.';
|
|
129
|
+
if (path.isAbsolute(trimmed))
|
|
130
|
+
return 'Please use a relative path (e.g. src/index.css).';
|
|
131
|
+
if (trimmed.includes('..'))
|
|
132
|
+
return 'Path must not traverse outside the project root.';
|
|
133
|
+
const ext = path.extname(trimmed).toLowerCase();
|
|
134
|
+
if (!['.css', '.scss'].includes(ext))
|
|
135
|
+
return 'File must have a .css or .scss extension.';
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
if (clack.isCancel(stylesFile)) {
|
|
139
|
+
clack.outro(chalk.yellow('Initialization cancelled.'));
|
|
140
|
+
process.exit(0);
|
|
141
|
+
}
|
|
142
|
+
config['stylesFile'] = stylesFile.trim();
|
|
143
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
144
|
+
clack.log.success(chalk.green(`Base styles file set to ${chalk.bold(stylesFile.trim())}.`));
|
|
145
|
+
// TypeScript detection
|
|
95
146
|
const detectedTypeScript = detectTypeScript(cwd);
|
|
96
147
|
clack.log.info(`Detected language: ${chalk.cyan(detectedTypeScript ? 'TypeScript' : 'JavaScript')}`);
|
|
97
148
|
const typescript = await clack.confirm({
|
|
@@ -105,7 +156,8 @@ export async function initCommand() {
|
|
|
105
156
|
config['typescript'] = typescript;
|
|
106
157
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
107
158
|
clack.log.success(chalk.green(`Language set to ${chalk.bold(typescript ? 'TypeScript' : 'JavaScript')}.`));
|
|
108
|
-
|
|
159
|
+
// Components directory
|
|
160
|
+
const defaultComponentsDir = fs.existsSync(path.join(cwd, 'src')) ? 'src/components/ui' : 'components/ui';
|
|
109
161
|
const componentsDir = await clack.text({
|
|
110
162
|
message: 'Components directory:',
|
|
111
163
|
placeholder: defaultComponentsDir,
|
|
@@ -128,12 +180,15 @@ export async function initCommand() {
|
|
|
128
180
|
config['premiumToken'] ?? (config['premiumToken'] = '');
|
|
129
181
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
130
182
|
clack.log.success(chalk.green(`Components directory set to ${chalk.bold(componentsDir.trim())}.`));
|
|
131
|
-
|
|
183
|
+
// Outro
|
|
184
|
+
const pm = detectPackageManager(cwd);
|
|
185
|
+
const pmCommand = pm === 'bun' ? 'bunx' : pm === 'pnpm' ? 'pnpm dlx' : pm === 'yarn' ? 'yarn dlx' : 'npx';
|
|
186
|
+
clack.outro(chalk.cyan('DCNT UI initialized successfully!') +
|
|
132
187
|
'\n\n ' +
|
|
133
188
|
chalk.gray('Next steps:') +
|
|
134
189
|
'\n ' +
|
|
135
|
-
chalk.white(` Run ${chalk.cyan('
|
|
190
|
+
chalk.white(` Run ${chalk.cyan(`'${pmCommand} dcntui add <component>'`)} to install your first component.`) +
|
|
136
191
|
'\n ' +
|
|
137
|
-
chalk.white(` Run ${chalk.cyan('
|
|
192
|
+
chalk.white(` Run ${chalk.cyan(`'${pmCommand} dcntui list'`)} to browse available components.`));
|
|
138
193
|
}
|
|
139
194
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,aAAa,gCAAgC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,6BAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { initCommand } from './commands/init.js';
|
|
4
|
+
import { addCommand } from './commands/add.js';
|
|
4
5
|
const program = new Command();
|
|
5
|
-
program.name('dcntui').description('
|
|
6
|
-
program.command('init').description('Initialize
|
|
6
|
+
program.name('dcntui').description('DCNT UI — Beautiful UI components for modern frameworks').version('0.1.0');
|
|
7
|
+
program.command('init').description('Initialize DCNT UI in your project').action(initCommand);
|
|
8
|
+
program.command('add <components...>').description('Add one or more components to your project').action(addCommand);
|
|
7
9
|
program.parse(process.argv);
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,yDAAyD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/G,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAE9F,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAEpH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CssStrategy } from './detect-css.js';
|
|
2
|
+
import type { Framework } from './detect-framework.js';
|
|
3
|
+
export interface DCNTUIConfig {
|
|
4
|
+
version: number;
|
|
5
|
+
framework: Exclude<Framework, null>;
|
|
6
|
+
css: CssStrategy;
|
|
7
|
+
typescript: boolean;
|
|
8
|
+
componentsDir: string;
|
|
9
|
+
stylesFile: string;
|
|
10
|
+
premiumToken: string;
|
|
11
|
+
registry: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class ConfigError extends Error {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
export declare function readConfig(cwd: string): DCNTUIConfig;
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpC,GAAG,EAAE,WAAW,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CA4BpD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { CONFIG_FILE } from '../constants.js';
|
|
4
|
+
const REQUIRED_FIELDS = [
|
|
5
|
+
'version',
|
|
6
|
+
'framework',
|
|
7
|
+
'css',
|
|
8
|
+
'typescript',
|
|
9
|
+
'componentsDir',
|
|
10
|
+
'stylesFile',
|
|
11
|
+
'registry'
|
|
12
|
+
];
|
|
13
|
+
export class ConfigError extends Error {
|
|
14
|
+
constructor(message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'ConfigError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function readConfig(cwd) {
|
|
20
|
+
const configPath = path.join(cwd, CONFIG_FILE);
|
|
21
|
+
if (!fs.existsSync(configPath)) {
|
|
22
|
+
throw new ConfigError(`No ${CONFIG_FILE} found in this directory.\n\n` +
|
|
23
|
+
`Run ${chalk_placeholder('dcntui init')} first to set up DCNT UI in your project.`);
|
|
24
|
+
}
|
|
25
|
+
let raw;
|
|
26
|
+
try {
|
|
27
|
+
raw = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new ConfigError(`${CONFIG_FILE} exists but could not be parsed as JSON.\n\n` + `Run ${'dcntui init'} to recreate it.`);
|
|
31
|
+
}
|
|
32
|
+
const missing = REQUIRED_FIELDS.filter((f) => raw[f] === undefined);
|
|
33
|
+
if (missing.length > 0) {
|
|
34
|
+
throw new ConfigError(`${CONFIG_FILE} is missing required fields: ${missing.join(', ')}.\n\n` + `Run ${'dcntui init'} to reconfigure.`);
|
|
35
|
+
}
|
|
36
|
+
return raw;
|
|
37
|
+
}
|
|
38
|
+
function chalk_placeholder(s) {
|
|
39
|
+
return `\`${s}\``;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAa9C,MAAM,eAAe,GAA2B;IAC9C,SAAS;IACT,WAAW;IACX,KAAK;IACL,YAAY;IACZ,eAAe;IACf,YAAY;IACZ,UAAU;CACX,CAAC;AAEF,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,WAAW,CACnB,MAAM,WAAW,+BAA+B;YAC9C,OAAO,iBAAiB,CAAC,aAAa,CAAC,2CAA2C,CACrF,CAAC;IACJ,CAAC;IAED,IAAI,GAA4B,CAAC;IAEjC,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAA4B,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,WAAW,CACnB,GAAG,WAAW,8CAA8C,GAAG,OAAO,aAAa,kBAAkB,CACtG,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,WAAW,CACnB,GAAG,WAAW,gCAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,aAAa,kBAAkB,CACjH,CAAC;IACJ,CAAC;IAED,OAAO,GAA8B,CAAC;AACxC,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC"}
|
|
@@ -4,5 +4,6 @@ export interface CssOption {
|
|
|
4
4
|
label: string;
|
|
5
5
|
}
|
|
6
6
|
export declare const CSS_OPTIONS: CssOption[];
|
|
7
|
+
export declare function detectBaseStylesFile(cwd: string, css: CssStrategy): string | null;
|
|
7
8
|
export declare function detectCss(cwd: string): CssStrategy | null;
|
|
8
9
|
//# sourceMappingURL=detect-css.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-css.d.ts","sourceRoot":"","sources":["../../src/utils/detect-css.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"detect-css.d.ts","sourceRoot":"","sources":["../../src/utils/detect-css.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,aAAa,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,WAAW,EAAE,SAAS,EAKlC,CAAC;AAuDF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAqCjF;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAkCzD"}
|
package/dist/utils/detect-css.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fg from 'fast-glob';
|
|
2
2
|
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
3
4
|
import { fileExists, hasDep, readPackageJson } from './helpers.js';
|
|
4
5
|
export const CSS_OPTIONS = [
|
|
5
6
|
{ value: 'tailwind-v4', label: 'Tailwind CSS v4' },
|
|
@@ -17,7 +18,7 @@ function hasTailwindV4Import(cwd) {
|
|
|
17
18
|
return true;
|
|
18
19
|
}
|
|
19
20
|
catch {
|
|
20
|
-
//
|
|
21
|
+
// skip
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
return false;
|
|
@@ -36,6 +37,60 @@ function tailwindMajorVersion(pkg) {
|
|
|
36
37
|
const match = raw.match(/(\d+)\./);
|
|
37
38
|
return match ? parseInt(match[1], 10) : null;
|
|
38
39
|
}
|
|
40
|
+
const BASE_STYLE_CANDIDATES = [
|
|
41
|
+
'src/app/globals.css',
|
|
42
|
+
'app/globals.css',
|
|
43
|
+
'src/index.css',
|
|
44
|
+
'src/styles/globals.css',
|
|
45
|
+
'src/styles/index.css',
|
|
46
|
+
'src/styles.css',
|
|
47
|
+
'styles/globals.css',
|
|
48
|
+
'index.css'
|
|
49
|
+
];
|
|
50
|
+
const BASE_STYLE_CANDIDATES_SCSS = [
|
|
51
|
+
'src/app/globals.scss',
|
|
52
|
+
'src/styles/globals.scss',
|
|
53
|
+
'src/styles/main.scss',
|
|
54
|
+
'src/styles/index.scss',
|
|
55
|
+
'src/index.scss',
|
|
56
|
+
'src/styles.scss',
|
|
57
|
+
'styles/globals.scss'
|
|
58
|
+
];
|
|
59
|
+
export function detectBaseStylesFile(cwd, css) {
|
|
60
|
+
switch (css) {
|
|
61
|
+
case 'tailwind-v4': {
|
|
62
|
+
const cssFiles = fg.sync('**/*.css', { cwd, ignore: IGNORE, deep: 4, absolute: true });
|
|
63
|
+
const pattern = /@import\s+['"]tailwindcss['"]/;
|
|
64
|
+
for (const file of cssFiles) {
|
|
65
|
+
try {
|
|
66
|
+
if (pattern.test(fs.readFileSync(file, 'utf-8'))) {
|
|
67
|
+
return path.relative(cwd, file);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// skip
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
case 'tailwind-v3':
|
|
77
|
+
case 'css': {
|
|
78
|
+
for (const candidate of BASE_STYLE_CANDIDATES) {
|
|
79
|
+
if (fs.existsSync(path.join(cwd, candidate)))
|
|
80
|
+
return candidate;
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
case 'scss': {
|
|
85
|
+
for (const candidate of BASE_STYLE_CANDIDATES_SCSS) {
|
|
86
|
+
if (fs.existsSync(path.join(cwd, candidate)))
|
|
87
|
+
return candidate;
|
|
88
|
+
}
|
|
89
|
+
const found = fg.sync('**/*.scss', { cwd, ignore: IGNORE, deep: 4 });
|
|
90
|
+
return found[0] ? path.normalize(found[0]) : null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
39
94
|
export function detectCss(cwd) {
|
|
40
95
|
const pkg = readPackageJson(cwd);
|
|
41
96
|
if (!pkg)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-css.js","sourceRoot":"","sources":["../../src/utils/detect-css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AASnE,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE;IACvC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE;CACrC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;AAErH,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"detect-css.js","sourceRoot":"","sources":["../../src/utils/detect-css.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-framework.d.ts","sourceRoot":"","sources":["../../src/utils/detect-framework.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"detect-framework.d.ts","sourceRoot":"","sources":["../../src/utils/detect-framework.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7F,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAO9C,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAwB7D"}
|
|
@@ -4,7 +4,8 @@ export const FRAMEWORK_OPTIONS = [
|
|
|
4
4
|
{ value: 'next-pages', label: 'Next.js Pages Router' },
|
|
5
5
|
{ value: 'svelte-kit', label: 'SvelteKit' },
|
|
6
6
|
{ value: 'svelte', label: 'Svelte' },
|
|
7
|
-
{ value: 'react', label: 'React' }
|
|
7
|
+
{ value: 'react', label: 'React' },
|
|
8
|
+
{ value: null, label: 'None', hint: 'unsupported / exit' }
|
|
8
9
|
];
|
|
9
10
|
export function detectFramework(cwd) {
|
|
10
11
|
const pkg = readPackageJson(cwd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-framework.js","sourceRoot":"","sources":["../../src/utils/detect-framework.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAUlE,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,oBAAoB,EAAE;IAClD,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,sBAAsB,EAAE;IACtD,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE;IAC3C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"detect-framework.js","sourceRoot":"","sources":["../../src/utils/detect-framework.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAUlE,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,oBAAoB,EAAE;IAClD,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,sBAAsB,EAAE;IACtD,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE;IAC3C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAClC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE;CAC3D,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,IAAI,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC;QAAE,OAAO,YAAY,CAAC;IAEtD,IAAI,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE3C,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAErE,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAE3E,IAAI,SAAS,IAAI,CAAC,WAAW;YAAE,OAAO,UAAU,CAAC;QACjD,IAAI,WAAW,IAAI,CAAC,SAAS;YAAE,OAAO,YAAY,CAAC;QAEnD,IAAI,SAAS,IAAI,WAAW;YAAE,OAAO,UAAU,CAAC;QAEhD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAEzC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';
|
|
2
|
+
export declare function detectPackageManager(cwd: string): PackageManager;
|
|
3
|
+
export declare function buildInstallArgs(pm: PackageManager, packages: string[]): string[];
|
|
4
|
+
//# sourceMappingURL=detect-package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/detect-package-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAS7D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAKhE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAWjF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
const LOCKFILES = [
|
|
4
|
+
{ file: 'pnpm-lock.yaml', pm: 'pnpm' },
|
|
5
|
+
{ file: 'yarn.lock', pm: 'yarn' },
|
|
6
|
+
{ file: 'bun.lockb', pm: 'bun' },
|
|
7
|
+
{ file: 'package-lock.json', pm: 'npm' }
|
|
8
|
+
];
|
|
9
|
+
export function detectPackageManager(cwd) {
|
|
10
|
+
for (const { file, pm } of LOCKFILES) {
|
|
11
|
+
if (fs.existsSync(path.join(cwd, file)))
|
|
12
|
+
return pm;
|
|
13
|
+
}
|
|
14
|
+
return 'npm';
|
|
15
|
+
}
|
|
16
|
+
export function buildInstallArgs(pm, packages) {
|
|
17
|
+
switch (pm) {
|
|
18
|
+
case 'pnpm':
|
|
19
|
+
return ['pnpm', 'add', ...packages];
|
|
20
|
+
case 'yarn':
|
|
21
|
+
return ['yarn', 'add', ...packages];
|
|
22
|
+
case 'bun':
|
|
23
|
+
return ['bun', 'add', ...packages];
|
|
24
|
+
case 'npm':
|
|
25
|
+
return ['npm', 'install', ...packages];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=detect-package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-package-manager.js","sourceRoot":"","sources":["../../src/utils/detect-package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,SAAS,GAAgD;IAC7D,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE;IACtC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE;IACjC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE;IAChC,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,KAAK,EAAE;CACzC,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,SAAS,EAAE,CAAC;QACrC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAkB,EAAE,QAAkB;IACrE,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;QACtC,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;QACtC,KAAK,KAAK;YACR,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;QACrC,KAAK,KAAK;YACR,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { DCNTUIConfig } from './config.js';
|
|
2
|
+
export interface ComponentFile {
|
|
3
|
+
path: string;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface TailwindPatch {
|
|
7
|
+
v4?: string;
|
|
8
|
+
v3?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ComponentMetadata {
|
|
11
|
+
name: string;
|
|
12
|
+
version: string;
|
|
13
|
+
framework: string;
|
|
14
|
+
css: string;
|
|
15
|
+
typescript: boolean;
|
|
16
|
+
premium: boolean;
|
|
17
|
+
dependencies: string[];
|
|
18
|
+
files: ComponentFile[];
|
|
19
|
+
tailwind: TailwindPatch;
|
|
20
|
+
postInstall: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function resolveVariantSlug(config: DCNTUIConfig): string;
|
|
23
|
+
export declare function resolveRegistryUrl(config: DCNTUIConfig, componentName: string): string;
|
|
24
|
+
export declare class RegistryError extends Error {
|
|
25
|
+
readonly statusCode?: number | undefined;
|
|
26
|
+
constructor(message: string, statusCode?: number | undefined);
|
|
27
|
+
}
|
|
28
|
+
export declare function fetchComponent(url: string, token?: string): Promise<ComponentMetadata>;
|
|
29
|
+
export declare function verifyPremiumToken(registry: string, token: string): Promise<boolean>;
|
|
30
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAI/D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAKtF;AAID,qBAAa,aAAc,SAAQ,KAAK;aAGpB,UAAU,CAAC,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA;CAKtC;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiD5F;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAe1F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Variant resolution
|
|
2
|
+
export function resolveVariantSlug(config) {
|
|
3
|
+
const lang = config.typescript ? 'ts' : 'js';
|
|
4
|
+
return `${config.framework}-${config.css}-${lang}`;
|
|
5
|
+
}
|
|
6
|
+
export function resolveRegistryUrl(config, componentName) {
|
|
7
|
+
const slug = resolveVariantSlug(config);
|
|
8
|
+
const base = config.registry.replace(/\/$/, '');
|
|
9
|
+
return `${base}/components/${componentName}/${slug}.json`;
|
|
10
|
+
}
|
|
11
|
+
// Fetch helpers
|
|
12
|
+
export class RegistryError extends Error {
|
|
13
|
+
constructor(message, statusCode) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.statusCode = statusCode;
|
|
16
|
+
this.name = 'RegistryError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function fetchComponent(url, token) {
|
|
20
|
+
const headers = {
|
|
21
|
+
Accept: 'application/json',
|
|
22
|
+
'User-Agent': 'dcntui-cli'
|
|
23
|
+
};
|
|
24
|
+
if (token) {
|
|
25
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
26
|
+
}
|
|
27
|
+
let response;
|
|
28
|
+
try {
|
|
29
|
+
response = await fetch(url, { headers });
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new RegistryError(`Could not reach the DCNT UI registry.\n\n` +
|
|
33
|
+
`Check your internet connection or try again later.\n` +
|
|
34
|
+
`Registry: ${url}`);
|
|
35
|
+
}
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
if (response.status === 404) {
|
|
38
|
+
throw new RegistryError(`Component not found in the registry for this variant.\n\n` +
|
|
39
|
+
`URL: ${url}\n\n` +
|
|
40
|
+
`This may mean the component doesn't support your current\n` +
|
|
41
|
+
`framework / CSS / language combination yet.`, 404);
|
|
42
|
+
}
|
|
43
|
+
if (response.status === 401 || response.status === 403) {
|
|
44
|
+
throw new RegistryError(`Access denied by the registry.\n\n` +
|
|
45
|
+
`This component requires a valid premium token.\n` +
|
|
46
|
+
`Set DCNTUI_TOKEN in your environment or add premiumToken to dcntui.config.json.`, response.status);
|
|
47
|
+
}
|
|
48
|
+
throw new RegistryError(`Registry returned an unexpected error (HTTP ${response.status}).`, response.status);
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
return (await response.json());
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new RegistryError(`Registry response could not be parsed as JSON.\nURL: ${url}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export async function verifyPremiumToken(registry, token) {
|
|
58
|
+
const base = registry.replace(/\/$/, '');
|
|
59
|
+
try {
|
|
60
|
+
const res = await fetch(`${base}/api/verify-token`, {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
headers: {
|
|
63
|
+
'Content-Type': 'application/json',
|
|
64
|
+
'User-Agent': 'dcntui-cli'
|
|
65
|
+
},
|
|
66
|
+
body: JSON.stringify({ token })
|
|
67
|
+
});
|
|
68
|
+
return res.ok;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AA2BA,qBAAqB;AACrB,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7C,OAAO,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,aAAqB;IAC5E,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEhD,OAAO,GAAG,IAAI,eAAe,aAAa,IAAI,IAAI,OAAO,CAAC;AAC5D,CAAC;AAED,gBAAgB;AAEhB,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YACE,OAAe,EACC,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAc;IAC9D,MAAM,OAAO,GAA2B;QACtC,MAAM,EAAE,kBAAkB;QAC1B,YAAY,EAAE,YAAY;KAC3B,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,aAAa,CACrB,2CAA2C;YACzC,sDAAsD;YACtD,aAAa,GAAG,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,aAAa,CACrB,2DAA2D;gBACzD,QAAQ,GAAG,MAAM;gBACjB,4DAA4D;gBAC5D,6CAA6C,EAC/C,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvD,MAAM,IAAI,aAAa,CACrB,oCAAoC;gBAClC,kDAAkD;gBAClD,iFAAiF,EACnF,QAAQ,CAAC,MAAM,CAChB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,aAAa,CAAC,+CAA+C,QAAQ,CAAC,MAAM,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/G,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,aAAa,CAAC,wDAAwD,GAAG,EAAE,CAAC,CAAC;IACzF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAAa;IACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,mBAAmB,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,YAAY;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ComponentMetadata } from './registry.js';
|
|
2
|
+
import type { DCNTUIConfig } from './config.js';
|
|
3
|
+
export declare function writeComponentFiles(cwd: string, config: DCNTUIConfig, metadata: ComponentMetadata): string[];
|
|
4
|
+
export declare function patchStylesFile(cwd: string, config: DCNTUIConfig, metadata: ComponentMetadata): boolean;
|
|
5
|
+
//# sourceMappingURL=write-component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-component.d.ts","sourceRoot":"","sources":["../../src/utils/write-component.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAc5G;AAOD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CA0BvG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
// File writing
|
|
4
|
+
export function writeComponentFiles(cwd, config, metadata) {
|
|
5
|
+
const componentDir = path.join(cwd, config.componentsDir, metadata.name);
|
|
6
|
+
fs.mkdirSync(componentDir, { recursive: true });
|
|
7
|
+
const written = [];
|
|
8
|
+
for (const file of metadata.files) {
|
|
9
|
+
const dest = path.join(componentDir, file.path);
|
|
10
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
11
|
+
fs.writeFileSync(dest, file.content, 'utf-8');
|
|
12
|
+
written.push(path.relative(cwd, dest));
|
|
13
|
+
}
|
|
14
|
+
return written;
|
|
15
|
+
}
|
|
16
|
+
// Styles patching
|
|
17
|
+
const DCNTUI_START = '/* dcntui:start */';
|
|
18
|
+
const DCNTUI_END = '/* dcntui:end */';
|
|
19
|
+
export function patchStylesFile(cwd, config, metadata) {
|
|
20
|
+
const stylesPath = path.join(cwd, config.stylesFile);
|
|
21
|
+
const cssBlock = buildCssBlock(config, metadata);
|
|
22
|
+
if (!cssBlock)
|
|
23
|
+
return false;
|
|
24
|
+
if (!fs.existsSync(stylesPath)) {
|
|
25
|
+
fs.mkdirSync(path.dirname(stylesPath), { recursive: true });
|
|
26
|
+
fs.writeFileSync(stylesPath, '', 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
let content = fs.readFileSync(stylesPath, 'utf-8');
|
|
29
|
+
const markedBlock = `${DCNTUI_START}\n${cssBlock}\n${DCNTUI_END}`;
|
|
30
|
+
if (content.includes(DCNTUI_START) && content.includes(DCNTUI_END)) {
|
|
31
|
+
content = content.replace(new RegExp(`\\/\\* dcntui:start \\*\\/[\\s\\S]*?\\/\\* dcntui:end \\*\\/`, 'g'), markedBlock);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
content = content.trimEnd() + '\n\n' + markedBlock + '\n';
|
|
35
|
+
}
|
|
36
|
+
fs.writeFileSync(stylesPath, content, 'utf-8');
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
function buildCssBlock(config, metadata) {
|
|
40
|
+
const { tailwind } = metadata;
|
|
41
|
+
switch (config.css) {
|
|
42
|
+
case 'tailwind-v4':
|
|
43
|
+
return tailwind.v4 ?? null;
|
|
44
|
+
case 'tailwind-v3':
|
|
45
|
+
return tailwind.v3 ?? null;
|
|
46
|
+
case 'scss':
|
|
47
|
+
case 'css':
|
|
48
|
+
return tailwind.v4 ?? tailwind.v3 ?? null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=write-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-component.js","sourceRoot":"","sources":["../../src/utils/write-component.ts"],"names":[],"mappings":"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"}
|