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,158 @@
1
+ export function isCollection(meta) {
2
+ return meta.type === 'collection';
3
+ }
4
+ export function resolveVariantSlug(config) {
5
+ const lang = config.typescript ? 'ts' : 'js';
6
+ return `${config.framework}-${config.css}-${lang}`;
7
+ }
8
+ export function resolveRegistryUrl(config, componentName) {
9
+ const slug = resolveVariantSlug(config);
10
+ const base = config.registry.replace(/\/$/, '');
11
+ return `${base}/components/${componentName}/${slug}.json`;
12
+ }
13
+ export function resolveCollectionUrl(config, collectionName) {
14
+ const slug = resolveVariantSlug(config);
15
+ const base = config.registry.replace(/\/$/, '');
16
+ return `${base}/collections/${collectionName}/${slug}.json`;
17
+ }
18
+ export async function fetchAny(config, name, token) {
19
+ const componentUrl = resolveRegistryUrl(config, name);
20
+ const collectionUrl = resolveCollectionUrl(config, name);
21
+ const headers = {
22
+ Accept: 'application/json',
23
+ 'User-Agent': 'dcntui-cli'
24
+ };
25
+ if (token)
26
+ headers['Authorization'] = `Bearer ${token}`;
27
+ let res;
28
+ try {
29
+ res = await fetch(componentUrl, { headers });
30
+ }
31
+ catch {
32
+ throw new RegistryError(`Could not reach the DCNT UI registry.\n\nCheck your internet connection.\nRegistry: ${componentUrl}`);
33
+ }
34
+ if (res.ok) {
35
+ try {
36
+ return (await res.json());
37
+ }
38
+ catch {
39
+ throw new RegistryError(`Registry response could not be parsed as JSON.\nURL: ${componentUrl}`);
40
+ }
41
+ }
42
+ if (res.status === 404) {
43
+ let colRes;
44
+ try {
45
+ colRes = await fetch(collectionUrl, { headers });
46
+ }
47
+ catch {
48
+ throw new RegistryError(`Could not reach the DCNT UI registry.\n\nCheck your internet connection.\nRegistry: ${collectionUrl}`);
49
+ }
50
+ if (colRes.ok) {
51
+ try {
52
+ return (await colRes.json());
53
+ }
54
+ catch {
55
+ throw new RegistryError(`Registry response could not be parsed as JSON.\nURL: ${collectionUrl}`);
56
+ }
57
+ }
58
+ if (colRes.status === 404) {
59
+ throw new RegistryError(`"${name}" was not found as a component or collection.\n\n` +
60
+ `Run ${`npx dcntui list`} to browse available components and collections.`, 404);
61
+ }
62
+ if (colRes.status === 401 || colRes.status === 403) {
63
+ throw new RegistryError(`Access denied. "${name}" requires a valid premium token.\n` +
64
+ `Set DCNTUI_TOKEN or add premiumToken to dcntui.config.json.`, colRes.status);
65
+ }
66
+ throw new RegistryError(`Registry returned an unexpected error (HTTP ${colRes.status}).`, colRes.status);
67
+ }
68
+ if (res.status === 401 || res.status === 403) {
69
+ throw new RegistryError(`Access denied. "${name}" requires a valid premium token.\n` +
70
+ `Set DCNTUI_TOKEN or add premiumToken to dcntui.config.json.`, res.status);
71
+ }
72
+ throw new RegistryError(`Registry returned an unexpected error (HTTP ${res.status}).`, res.status);
73
+ }
74
+ export class RegistryError extends Error {
75
+ constructor(message, statusCode) {
76
+ super(message);
77
+ this.statusCode = statusCode;
78
+ this.name = 'RegistryError';
79
+ }
80
+ }
81
+ export async function fetchComponent(url, token) {
82
+ const headers = {
83
+ Accept: 'application/json',
84
+ 'User-Agent': 'dcntui-cli'
85
+ };
86
+ if (token) {
87
+ headers['Authorization'] = `Bearer ${token}`;
88
+ }
89
+ let response;
90
+ try {
91
+ response = await fetch(url, { headers });
92
+ }
93
+ catch {
94
+ throw new RegistryError(`Could not reach the DCNT UI registry.\n\n` +
95
+ `Check your internet connection or try again later.\n` +
96
+ `Registry: ${url}`);
97
+ }
98
+ if (!response.ok) {
99
+ if (response.status === 404) {
100
+ throw new RegistryError(`Component not found in the registry for this variant.\n\n` +
101
+ `URL: ${url}\n\n` +
102
+ `This may mean the component doesn't support your current\n` +
103
+ `framework / CSS / language combination yet.`, 404);
104
+ }
105
+ if (response.status === 401 || response.status === 403) {
106
+ throw new RegistryError(`Access denied by the registry.\n\n` +
107
+ `This component requires a valid premium token.\n` +
108
+ `Set DCNTUI_TOKEN in your environment or add premiumToken to dcntui.config.json.`, response.status);
109
+ }
110
+ throw new RegistryError(`Registry returned an unexpected error (HTTP ${response.status}).`, response.status);
111
+ }
112
+ try {
113
+ return (await response.json());
114
+ }
115
+ catch {
116
+ throw new RegistryError(`Registry response could not be parsed as JSON.\nURL: ${url}`);
117
+ }
118
+ }
119
+ export async function verifyPremiumToken(registry, token) {
120
+ const base = registry.replace(/\/$/, '');
121
+ try {
122
+ const res = await fetch(`${base}/api/verify-token`, {
123
+ method: 'POST',
124
+ headers: {
125
+ 'Content-Type': 'application/json',
126
+ 'User-Agent': 'dcntui-cli'
127
+ },
128
+ body: JSON.stringify({ token })
129
+ });
130
+ return res.ok;
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ }
136
+ export async function fetchCatalog(registry) {
137
+ const base = registry.replace(/\/$/, '');
138
+ const url = `${base}/catalog.json`;
139
+ let response;
140
+ try {
141
+ response = await fetch(url, {
142
+ headers: { Accept: 'application/json', 'User-Agent': 'dcntui-cli' }
143
+ });
144
+ }
145
+ catch {
146
+ throw new RegistryError(`Could not reach the DCNT UI registry.\n\nCheck your internet connection or try again later.\nRegistry: ${url}`);
147
+ }
148
+ if (!response.ok) {
149
+ throw new RegistryError(`Registry returned an unexpected error (HTTP ${response.status}).`, response.status);
150
+ }
151
+ try {
152
+ return (await response.json());
153
+ }
154
+ catch {
155
+ throw new RegistryError(`Catalog response could not be parsed as JSON.\nURL: ${url}`);
156
+ }
157
+ }
158
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CatalogEntry } from './registry.js';
2
+ export interface SearchResult {
3
+ name: string;
4
+ description: string;
5
+ premium: boolean;
6
+ category: string;
7
+ reason: string;
8
+ score: number;
9
+ }
10
+ export declare class SearchError extends Error {
11
+ constructor(message: string);
12
+ }
13
+ export declare function keywordSearch(query: string, catalog: Array<{
14
+ entry: CatalogEntry;
15
+ category: string;
16
+ }>): SearchResult[];
17
+ export declare function aiSearch(query: string, catalog: Array<{
18
+ entry: CatalogEntry;
19
+ category: string;
20
+ }>, apiKey: string): Promise<SearchResult[]>;
21
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GACxD,YAAY,EAAE,CAoBhB;AAED,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EACzD,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,EAAE,CAAC,CAyFzB"}
@@ -0,0 +1,104 @@
1
+ export class SearchError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'SearchError';
5
+ }
6
+ }
7
+ export function keywordSearch(query, catalog) {
8
+ const tokens = query.toLowerCase().split(/\s+/).filter(Boolean);
9
+ const scored = catalog
10
+ .map(({ entry, category }) => {
11
+ const haystack = `${entry.name} ${entry.description}`.toLowerCase();
12
+ const matches = tokens.filter((t) => haystack.includes(t));
13
+ return {
14
+ name: entry.name,
15
+ description: entry.description,
16
+ premium: entry.premium,
17
+ category,
18
+ reason: matches.length > 0 ? `Matches: ${matches.join(', ')}` : '',
19
+ score: Math.round((matches.length / tokens.length) * 100)
20
+ };
21
+ })
22
+ .filter((r) => r.score > 0)
23
+ .sort((a, b) => b.score - a.score);
24
+ return scored;
25
+ }
26
+ export async function aiSearch(query, catalog, apiKey) {
27
+ const catalogText = catalog
28
+ .map(({ entry, category }) => `${entry.name} [${category}] — ${entry.description}${entry.premium ? ' (premium)' : ''}`)
29
+ .join('\n');
30
+ const systemPrompt = `You are a UI component search engine. Given a user query and a component catalog, return the most relevant components as a JSON array. Each item must have:
31
+ - "name": exact component name from the catalog
32
+ - "reason": one concise sentence (max 12 words) explaining why it matches
33
+ - "score": integer 0-100 relevance score
34
+
35
+ Return ONLY valid JSON — no markdown, no explanation. Example:
36
+ [{"name":"button","reason":"Core interactive element for any UI","score":95}]
37
+
38
+ If nothing is relevant, return an empty array: []`;
39
+ const userPrompt = `Query: "${query}"\n\nCatalog:\n${catalogText}`;
40
+ let response;
41
+ try {
42
+ response = await fetch('https://api.anthropic.com/v1/messages', {
43
+ method: 'POST',
44
+ headers: {
45
+ 'Content-Type': 'application/json',
46
+ 'x-api-key': apiKey,
47
+ 'anthropic-version': '2023-06-01'
48
+ },
49
+ body: JSON.stringify({
50
+ model: 'claude-sonnet-4-20250514',
51
+ max_tokens: 1024,
52
+ system: systemPrompt,
53
+ messages: [{ role: 'user', content: userPrompt }]
54
+ })
55
+ });
56
+ }
57
+ catch {
58
+ throw new SearchError('Could not reach the Anthropic API. Falling back to keyword search.');
59
+ }
60
+ if (!response.ok) {
61
+ if (response.status === 401) {
62
+ throw new SearchError('Invalid ANTHROPIC_API_KEY. Falling back to keyword search.');
63
+ }
64
+ throw new SearchError(`Anthropic API error (HTTP ${response.status}). Falling back to keyword search.`);
65
+ }
66
+ let data;
67
+ try {
68
+ data = (await response.json());
69
+ }
70
+ catch {
71
+ throw new SearchError('Could not parse Anthropic API response. Falling back to keyword search.');
72
+ }
73
+ const rawText = data.content
74
+ .filter((b) => b.type === 'text')
75
+ .map((b) => b.text)
76
+ .join('');
77
+ let ranked;
78
+ try {
79
+ const cleaned = rawText.replace(/```json|```/g, '').trim();
80
+ ranked = JSON.parse(cleaned);
81
+ if (!Array.isArray(ranked))
82
+ throw new Error('not an array');
83
+ }
84
+ catch {
85
+ throw new SearchError('AI response was not valid JSON. Falling back to keyword search.');
86
+ }
87
+ const catalogMap = new Map(catalog.map(({ entry, category }) => [entry.name, { entry, category }]));
88
+ const results = [];
89
+ for (const item of ranked) {
90
+ const catalogItem = catalogMap.get(item.name);
91
+ if (!catalogItem)
92
+ continue;
93
+ results.push({
94
+ name: item.name,
95
+ description: catalogItem.entry.description,
96
+ premium: catalogItem.entry.premium,
97
+ category: catalogItem.category,
98
+ reason: item.reason,
99
+ score: Math.max(0, Math.min(100, item.score))
100
+ });
101
+ }
102
+ return results.sort((a, b) => b.score - a.score);
103
+ }
104
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface WizardResult {
2
+ framework: string;
3
+ css: string;
4
+ stylesFile: string;
5
+ typescript: boolean;
6
+ componentsDir: string;
7
+ }
8
+ export interface WizardOptions {
9
+ existing?: Partial<WizardResult>;
10
+ }
11
+ export declare function runConfigWizard(cwd: string, options?: WizardOptions): Promise<WizardResult>;
12
+ //# sourceMappingURL=wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/utils/wizard.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAClC;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA4NrG"}
@@ -0,0 +1,168 @@
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 { detectFramework, FRAMEWORK_OPTIONS } from './detect-framework.js';
6
+ import { detectCss, detectBaseStylesFile, CSS_OPTIONS } from './detect-css.js';
7
+ import { detectTypeScript } from './detect-typescript.js';
8
+ import { CONFIG_FILE, REGISTRY_BASE } from '../constants.js';
9
+ export async function runConfigWizard(cwd, options = {}) {
10
+ const { existing } = options;
11
+ const configPath = path.join(cwd, CONFIG_FILE);
12
+ let config = {};
13
+ if (fs.existsSync(configPath)) {
14
+ try {
15
+ config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
16
+ }
17
+ catch {
18
+ config = {};
19
+ }
20
+ }
21
+ config['version'] ?? (config['version'] = 1);
22
+ config['registry'] ?? (config['registry'] = REGISTRY_BASE);
23
+ const detectedFramework = detectFramework(cwd);
24
+ const frameworkDefault = existing?.framework ?? detectedFramework;
25
+ if (existing?.framework) {
26
+ clack.log.info(`Current framework: ${chalk.cyan(FRAMEWORK_OPTIONS.find((f) => f.value === existing.framework)?.label ?? existing.framework)}`);
27
+ }
28
+ else if (detectedFramework) {
29
+ clack.log.info(`Detected framework: ${chalk.cyan(FRAMEWORK_OPTIONS.find((f) => f.value === detectedFramework)?.label ?? detectedFramework)}`);
30
+ }
31
+ else {
32
+ clack.log.warn('No supported framework detected.\n\n' +
33
+ ' Supported: Next.js, React, Svelte, SvelteKit.\n' +
34
+ ' Select your framework manually, or choose None to exit.');
35
+ }
36
+ const framework = await clack.select({
37
+ message: 'Framework:',
38
+ options: FRAMEWORK_OPTIONS,
39
+ initialValue: frameworkDefault
40
+ });
41
+ if (clack.isCancel(framework)) {
42
+ clack.outro(chalk.yellow('Cancelled. No changes made.'));
43
+ process.exit(0);
44
+ }
45
+ if (framework === null) {
46
+ clack.log.error(chalk.red('DCNT UI requires a supported framework to function correctly.\n\n' +
47
+ ' Supported frameworks: Next.js (App Router & Pages Router), React, Svelte, SvelteKit.\n'));
48
+ clack.outro(chalk.red('Aborted. Please set up a supported framework first.'));
49
+ process.exit(1);
50
+ }
51
+ config['framework'] = framework;
52
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
53
+ const frameworkLabel = FRAMEWORK_OPTIONS.find((f) => f.value === framework).label;
54
+ clack.log.success(chalk.green(`Framework set to ${chalk.bold(frameworkLabel)}.`));
55
+ const detectedCss = detectCss(cwd);
56
+ const cssDefault = existing?.css ?? detectedCss ?? 'css';
57
+ if (existing?.css) {
58
+ clack.log.info(`Current CSS strategy: ${chalk.cyan(CSS_OPTIONS.find((c) => c.value === existing.css)?.label ?? existing.css)}`);
59
+ }
60
+ else if (detectedCss) {
61
+ clack.log.info(`Detected CSS strategy: ${chalk.cyan(CSS_OPTIONS.find((c) => c.value === detectedCss)?.label ?? detectedCss)}`);
62
+ }
63
+ else {
64
+ clack.log.warn('Could not auto-detect a CSS strategy. Please select one manually.');
65
+ }
66
+ const css = await clack.select({
67
+ message: 'CSS strategy:',
68
+ options: CSS_OPTIONS,
69
+ initialValue: cssDefault
70
+ });
71
+ if (clack.isCancel(css)) {
72
+ clack.outro(chalk.yellow('Cancelled. No changes made.'));
73
+ process.exit(0);
74
+ }
75
+ config['css'] = css;
76
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
77
+ const cssLabel = CSS_OPTIONS.find((c) => c.value === css).label;
78
+ clack.log.success(chalk.green(`CSS strategy set to ${chalk.bold(cssLabel)}.`));
79
+ const detectedStylesFile = detectBaseStylesFile(cwd, css);
80
+ const defaultStylesExt = css === 'scss' ? '.scss' : '.css';
81
+ const stylesFileDefault = existing?.stylesFile ?? detectedStylesFile ?? `src/index${defaultStylesExt}`;
82
+ if (existing?.stylesFile) {
83
+ clack.log.info(`Current base styles file: ${chalk.cyan(existing.stylesFile)}`);
84
+ }
85
+ else if (detectedStylesFile) {
86
+ clack.log.info(`Detected base styles file: ${chalk.cyan(detectedStylesFile)}`);
87
+ }
88
+ else {
89
+ clack.log.warn('Could not find a base styles file. Please enter the path manually.');
90
+ }
91
+ const stylesFile = await clack.text({
92
+ message: 'Base styles file:',
93
+ placeholder: stylesFileDefault,
94
+ defaultValue: stylesFileDefault,
95
+ validate(value) {
96
+ const trimmed = value.trim();
97
+ if (trimmed.length === 0)
98
+ return 'Styles file path cannot be empty.';
99
+ if (path.isAbsolute(trimmed))
100
+ return 'Please use a relative path (e.g. src/index.css).';
101
+ if (trimmed.includes('..'))
102
+ return 'Path must not traverse outside the project root.';
103
+ const ext = path.extname(trimmed).toLowerCase();
104
+ if (!['.css', '.scss'].includes(ext))
105
+ return 'File must have a .css or .scss extension.';
106
+ }
107
+ });
108
+ if (clack.isCancel(stylesFile)) {
109
+ clack.outro(chalk.yellow('Cancelled. No changes made.'));
110
+ process.exit(0);
111
+ }
112
+ config['stylesFile'] = stylesFile.trim();
113
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
114
+ clack.log.success(chalk.green(`Base styles file set to ${chalk.bold(stylesFile.trim())}.`));
115
+ const detectedTs = detectTypeScript(cwd);
116
+ const tsDefault = existing?.typescript ?? detectedTs;
117
+ if (existing?.typescript !== undefined) {
118
+ clack.log.info(`Current language: ${chalk.cyan(existing.typescript ? 'TypeScript' : 'JavaScript')}`);
119
+ }
120
+ else {
121
+ clack.log.info(`Detected language: ${chalk.cyan(detectedTs ? 'TypeScript' : 'JavaScript')}`);
122
+ }
123
+ const typescript = await clack.confirm({
124
+ message: 'Use TypeScript?',
125
+ initialValue: tsDefault
126
+ });
127
+ if (clack.isCancel(typescript)) {
128
+ clack.outro(chalk.yellow('Cancelled. No changes made.'));
129
+ process.exit(0);
130
+ }
131
+ config['typescript'] = typescript;
132
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
133
+ clack.log.success(chalk.green(`Language set to ${chalk.bold(typescript ? 'TypeScript' : 'JavaScript')}.`));
134
+ const defaultComponentsDir = existing?.componentsDir ?? (fs.existsSync(path.join(cwd, 'src')) ? 'src/components/ui' : 'components/ui');
135
+ if (existing?.componentsDir) {
136
+ clack.log.info(`Current components directory: ${chalk.cyan(existing.componentsDir)}`);
137
+ }
138
+ const componentsDir = await clack.text({
139
+ message: 'Components directory:',
140
+ placeholder: defaultComponentsDir,
141
+ defaultValue: defaultComponentsDir,
142
+ validate(value) {
143
+ const trimmed = value.trim();
144
+ if (trimmed.length === 0)
145
+ return 'Directory path cannot be empty.';
146
+ if (path.isAbsolute(trimmed))
147
+ return 'Please use a relative path (e.g. src/components/ui).';
148
+ if (trimmed.includes('..'))
149
+ return 'Path must not traverse outside the project root.';
150
+ }
151
+ });
152
+ if (clack.isCancel(componentsDir)) {
153
+ clack.outro(chalk.yellow('Cancelled. No changes made.'));
154
+ process.exit(0);
155
+ }
156
+ config['componentsDir'] = componentsDir.trim();
157
+ config['premiumToken'] ?? (config['premiumToken'] = '');
158
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
159
+ clack.log.success(chalk.green(`Components directory set to ${chalk.bold(componentsDir.trim())}.`));
160
+ return {
161
+ framework: framework,
162
+ css: css,
163
+ stylesFile: stylesFile.trim(),
164
+ typescript,
165
+ componentsDir: componentsDir.trim()
166
+ };
167
+ }
168
+ //# sourceMappingURL=wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/utils/wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
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 hashContent(content: string): string;
5
+ export interface FileDiff {
6
+ filePath: string;
7
+ locallyModified: boolean;
8
+ diffLines: string[];
9
+ }
10
+ export declare function diffComponentFiles(cwd: string, config: DCNTUIConfig, metadata: ComponentMetadata): FileDiff[];
11
+ export declare function patchStylesFile(cwd: string, config: DCNTUIConfig, metadata: ComponentMetadata): boolean;
12
+ export declare function revertStylesPatch(cwd: string, config: DCNTUIConfig): boolean;
13
+ //# 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":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,GAAG,MAAM,EAAE,CA4C5G;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,GAAG,QAAQ,EAAE,CAsC7G;AAwCD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CA4BvG;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAc5E"}
@@ -0,0 +1,132 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
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
+ const dcntuiDir = path.join(cwd, '.dcntui');
15
+ fs.mkdirSync(dcntuiDir, { recursive: true });
16
+ const fileHashes = {};
17
+ for (const file of metadata.files) {
18
+ fileHashes[file.path] = hashContent(file.content);
19
+ }
20
+ fs.writeFileSync(path.join(dcntuiDir, `${metadata.name}.json`), JSON.stringify({
21
+ name: metadata.name,
22
+ version: metadata.version,
23
+ dependencies: metadata.dependencies,
24
+ fileHashes
25
+ }, null, 2) + '\n', 'utf-8');
26
+ return written;
27
+ }
28
+ export function hashContent(content) {
29
+ return createHash('sha256').update(content, 'utf-8').digest('hex');
30
+ }
31
+ export function diffComponentFiles(cwd, config, metadata) {
32
+ const componentDir = path.join(cwd, config.componentsDir, metadata.name);
33
+ const metaPath = path.join(cwd, '.dcntui', `${metadata.name}.json`);
34
+ let storedHashes = {};
35
+ if (fs.existsSync(metaPath)) {
36
+ try {
37
+ const meta = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
38
+ storedHashes = meta.fileHashes ?? {};
39
+ }
40
+ catch { }
41
+ }
42
+ return metadata.files.map((file) => {
43
+ const diskPath = path.join(componentDir, file.path);
44
+ const diskExists = fs.existsSync(diskPath);
45
+ if (!diskExists) {
46
+ return { filePath: file.path, locallyModified: false, diffLines: [] };
47
+ }
48
+ const diskContent = fs.readFileSync(diskPath, 'utf-8');
49
+ const diskHash = hashContent(diskContent);
50
+ const remoteHash = hashContent(file.content);
51
+ const installedHash = storedHashes[file.path];
52
+ const locallyModified = installedHash !== undefined && diskHash !== installedHash && diskHash !== remoteHash;
53
+ const diffLines = locallyModified ? buildDiffLines(file.path, diskContent, file.content) : [];
54
+ return { filePath: file.path, locallyModified, diffLines };
55
+ });
56
+ }
57
+ function buildDiffLines(filePath, oldText, newText) {
58
+ const oldLines = oldText.split('\n');
59
+ const newLines = newText.split('\n');
60
+ const output = [];
61
+ const maxLen = Math.max(oldLines.length, newLines.length);
62
+ output.push(`--- ${filePath} (local)`);
63
+ output.push(`+++ ${filePath} (registry)`);
64
+ let changed = false;
65
+ for (let i = 0; i < maxLen; i++) {
66
+ const oldLine = oldLines[i];
67
+ const newLine = newLines[i];
68
+ if (oldLine === undefined) {
69
+ output.push(`+ ${newLine}`);
70
+ changed = true;
71
+ }
72
+ else if (newLine === undefined) {
73
+ output.push(`- ${oldLine}`);
74
+ changed = true;
75
+ }
76
+ else if (oldLine !== newLine) {
77
+ output.push(`- ${oldLine}`);
78
+ output.push(`+ ${newLine}`);
79
+ changed = true;
80
+ }
81
+ else {
82
+ output.push(` ${oldLine}`);
83
+ }
84
+ }
85
+ return changed ? output : [];
86
+ }
87
+ const DCNTUI_START = '/* dcntui:start */';
88
+ const DCNTUI_END = '/* dcntui:end */';
89
+ export function patchStylesFile(cwd, config, metadata) {
90
+ const stylesPath = path.join(cwd, config.stylesFile);
91
+ const cssBlock = buildCssBlock(config, metadata);
92
+ if (!cssBlock)
93
+ return false;
94
+ if (!fs.existsSync(stylesPath)) {
95
+ fs.mkdirSync(path.dirname(stylesPath), { recursive: true });
96
+ fs.writeFileSync(stylesPath, '', 'utf-8');
97
+ }
98
+ let content = fs.readFileSync(stylesPath, 'utf-8');
99
+ const markedBlock = `${DCNTUI_START}\n${cssBlock}\n${DCNTUI_END}`;
100
+ if (content.includes(DCNTUI_START) && content.includes(DCNTUI_END)) {
101
+ content = content.replace(new RegExp(`\\/\\* dcntui:start \\*\\/[\\s\\S]*?\\/\\* dcntui:end \\*\\/`, 'g'), markedBlock);
102
+ }
103
+ else {
104
+ content = content.trimEnd() + '\n\n' + markedBlock + '\n';
105
+ }
106
+ fs.writeFileSync(stylesPath, content, 'utf-8');
107
+ return true;
108
+ }
109
+ export function revertStylesPatch(cwd, config) {
110
+ const stylesPath = path.join(cwd, config.stylesFile);
111
+ if (!fs.existsSync(stylesPath))
112
+ return false;
113
+ let content = fs.readFileSync(stylesPath, 'utf-8');
114
+ if (!content.includes(DCNTUI_START))
115
+ return false;
116
+ content = content.replace(/\n*\/\* dcntui:start \*\/[\s\S]*?\/\* dcntui:end \*\/\n*/g, '\n');
117
+ fs.writeFileSync(stylesPath, content.trimEnd() + '\n', 'utf-8');
118
+ return true;
119
+ }
120
+ function buildCssBlock(config, metadata) {
121
+ const { tailwind } = metadata;
122
+ switch (config.css) {
123
+ case 'tailwind-v4':
124
+ return tailwind.v4 ?? null;
125
+ case 'tailwind-v3':
126
+ return tailwind.v3 ?? null;
127
+ case 'scss':
128
+ case 'css':
129
+ return tailwind.v4 ?? tailwind.v3 ?? null;
130
+ }
131
+ }
132
+ //# sourceMappingURL=write-component.js.map