pittaya 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -0
- package/dist/index.js +338 -156
- package/dist/index.js.map +1 -1
- package/package.json +53 -53
package/README.md
CHANGED
|
@@ -86,6 +86,66 @@ npx pittaya update --all --yes
|
|
|
86
86
|
npx pittaya update button --force
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
+
## list
|
|
90
|
+
|
|
91
|
+
Use the `list` command to view all available and installed components.
|
|
92
|
+
|
|
93
|
+
The `list` command shows all components from the registry organized by category with installation status.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npx pittaya list
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Example
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# List all components
|
|
103
|
+
npx pittaya list
|
|
104
|
+
|
|
105
|
+
# List only installed components
|
|
106
|
+
npx pittaya list --installed
|
|
107
|
+
|
|
108
|
+
# List only available components
|
|
109
|
+
npx pittaya list --available
|
|
110
|
+
|
|
111
|
+
# JSON output for programmatic use
|
|
112
|
+
npx pittaya list --json
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## debug
|
|
116
|
+
|
|
117
|
+
Use the `debug` command to diagnose component installation issues.
|
|
118
|
+
|
|
119
|
+
The `debug` command helps identify why a component is not being detected as installed, showing expected file paths and actual file locations.
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
npx pittaya debug --component [component]
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Example
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# Debug general project setup
|
|
129
|
+
npx pittaya debug
|
|
130
|
+
|
|
131
|
+
# Debug specific component
|
|
132
|
+
npx pittaya debug --component installation-section
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**What it shows:**
|
|
136
|
+
- Project structure detection (src/ vs root)
|
|
137
|
+
- Resolved alias paths
|
|
138
|
+
- Expected file locations
|
|
139
|
+
- Actual file existence
|
|
140
|
+
- Installation status
|
|
141
|
+
- Similar files found (helps identify naming mismatches)
|
|
142
|
+
|
|
143
|
+
**Common issues it helps diagnose:**
|
|
144
|
+
- File name mismatches (e.g., `InstallationSection.tsx` vs `installation-section.tsx`)
|
|
145
|
+
- Wrong directory structure (e.g., missing `src/` folder)
|
|
146
|
+
- Incorrect `components.json` aliases
|
|
147
|
+
- Components installed in unexpected locations
|
|
148
|
+
|
|
89
149
|
## Documentation
|
|
90
150
|
|
|
91
151
|
Visit https://pittaya-ui.vercel.app to view the documentation.
|
package/dist/index.js
CHANGED
|
@@ -7,8 +7,8 @@ import { Command } from "commander";
|
|
|
7
7
|
import chalk from "chalk";
|
|
8
8
|
import ora from "ora";
|
|
9
9
|
import prompts from "prompts";
|
|
10
|
-
import
|
|
11
|
-
import
|
|
10
|
+
import path4 from "path";
|
|
11
|
+
import fs4 from "fs/promises";
|
|
12
12
|
import { execa } from "execa";
|
|
13
13
|
|
|
14
14
|
// src/utils/registry.ts
|
|
@@ -125,13 +125,101 @@ async function checkMissingDependencies(dependencies) {
|
|
|
125
125
|
return missing;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
+
// src/utils/component-checker.ts
|
|
129
|
+
import path3 from "path";
|
|
130
|
+
import fs3 from "fs/promises";
|
|
131
|
+
|
|
132
|
+
// src/utils/project-structure.ts
|
|
133
|
+
import fs2 from "fs/promises";
|
|
134
|
+
import path2 from "path";
|
|
135
|
+
async function hasSrcDirectory(cwd = process.cwd()) {
|
|
136
|
+
try {
|
|
137
|
+
const srcPath = path2.join(cwd, "src");
|
|
138
|
+
await fs2.access(srcPath);
|
|
139
|
+
const commonDirs = ["app", "components", "lib", "pages"];
|
|
140
|
+
for (const dir of commonDirs) {
|
|
141
|
+
try {
|
|
142
|
+
await fs2.access(path2.join(srcPath, dir));
|
|
143
|
+
return true;
|
|
144
|
+
} catch {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const tsconfigPath = path2.join(cwd, "tsconfig.json");
|
|
150
|
+
const tsconfig = JSON.parse(await fs2.readFile(tsconfigPath, "utf-8"));
|
|
151
|
+
if (tsconfig.compilerOptions?.paths) {
|
|
152
|
+
const paths = tsconfig.compilerOptions.paths;
|
|
153
|
+
if (paths["@/*"]?.includes("./src/*")) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
} catch {
|
|
158
|
+
console.error("Bro... just in 21st century you not even have a tsconfig.json file in your project. That way you fuck me up :D");
|
|
159
|
+
}
|
|
160
|
+
return false;
|
|
161
|
+
} catch {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function resolveAliasPath(aliasPath, cwd = process.cwd()) {
|
|
166
|
+
const usesSrc = await hasSrcDirectory(cwd);
|
|
167
|
+
const baseDir = usesSrc ? "src/" : "";
|
|
168
|
+
return aliasPath.replace(/^@\//, baseDir);
|
|
169
|
+
}
|
|
170
|
+
async function getDefaultPaths(cwd = process.cwd()) {
|
|
171
|
+
const usesSrc = await hasSrcDirectory(cwd);
|
|
172
|
+
const baseDir = usesSrc ? "src/" : "";
|
|
173
|
+
return {
|
|
174
|
+
globalsCss: `${baseDir}app/globals.css`,
|
|
175
|
+
components: "@/components",
|
|
176
|
+
utils: "@/lib/utils",
|
|
177
|
+
ui: "@/components/ui",
|
|
178
|
+
lib: "@/lib",
|
|
179
|
+
hooks: "@/hooks",
|
|
180
|
+
baseDir
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// src/utils/component-checker.ts
|
|
185
|
+
async function isComponentInstalled(name, config) {
|
|
186
|
+
try {
|
|
187
|
+
const component = await getRegistryComponent(name);
|
|
188
|
+
if (!component) return false;
|
|
189
|
+
for (const file of component.files) {
|
|
190
|
+
const targetPath = await resolveTargetPath(file.name, component.type, config);
|
|
191
|
+
const filePath = path3.join(process.cwd(), targetPath);
|
|
192
|
+
const exists = await fs3.access(filePath).then(() => true).catch(() => false);
|
|
193
|
+
if (!exists) return false;
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
} catch {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async function resolveTargetPath(fileName, type, config) {
|
|
201
|
+
if (type === "registry:ui") {
|
|
202
|
+
const resolvedPath = await resolveAliasPath(config.aliases.ui);
|
|
203
|
+
return path3.join(resolvedPath, fileName);
|
|
204
|
+
}
|
|
205
|
+
if (type === "registry:lib") {
|
|
206
|
+
const resolvedPath = await resolveAliasPath(config.aliases.lib);
|
|
207
|
+
return path3.join(resolvedPath, fileName);
|
|
208
|
+
}
|
|
209
|
+
if (type === "registry:hook") {
|
|
210
|
+
const resolvedPath = await resolveAliasPath(config.aliases.hooks);
|
|
211
|
+
return path3.join(resolvedPath, fileName);
|
|
212
|
+
}
|
|
213
|
+
return fileName;
|
|
214
|
+
}
|
|
215
|
+
|
|
128
216
|
// src/commands/add.ts
|
|
129
217
|
async function add(components, options) {
|
|
130
218
|
const cwd = process.cwd();
|
|
131
|
-
const componentsJsonPath =
|
|
219
|
+
const componentsJsonPath = path4.join(cwd, "components.json");
|
|
132
220
|
let config;
|
|
133
221
|
try {
|
|
134
|
-
const configContent = await
|
|
222
|
+
const configContent = await fs4.readFile(componentsJsonPath, "utf-8");
|
|
135
223
|
config = JSON.parse(configContent);
|
|
136
224
|
} catch (error) {
|
|
137
225
|
console.log(chalk.red("\n\u274C components.json not found.\n"));
|
|
@@ -182,21 +270,6 @@ Adding ${components.length} component(s)...
|
|
|
182
270
|
}
|
|
183
271
|
console.log(chalk.green("\n\u2705 Components added successfully!\n"));
|
|
184
272
|
}
|
|
185
|
-
async function isComponentInstalled(name, config) {
|
|
186
|
-
try {
|
|
187
|
-
const component = await getRegistryComponent(name);
|
|
188
|
-
if (!component) return false;
|
|
189
|
-
for (const file of component.files) {
|
|
190
|
-
const targetPath = resolveTargetPath(file.name, component.type, config);
|
|
191
|
-
const filePath = path2.join(process.cwd(), targetPath);
|
|
192
|
-
const exists = await fs2.access(filePath).then(() => true).catch(() => false);
|
|
193
|
-
if (!exists) return false;
|
|
194
|
-
}
|
|
195
|
-
return true;
|
|
196
|
-
} catch {
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
273
|
async function addComponent(name, config, options) {
|
|
201
274
|
const alreadyInstalled = await isComponentInstalled(name, config);
|
|
202
275
|
if (alreadyInstalled && !options.overwrite) {
|
|
@@ -262,9 +335,9 @@ async function addComponent(name, config, options) {
|
|
|
262
335
|
spinner.start(`Installing ${chalk.bold(name)}...`);
|
|
263
336
|
}
|
|
264
337
|
for (const file of component.files) {
|
|
265
|
-
const targetPath = resolveTargetPath(file.name, component.type, config);
|
|
266
|
-
const filePath =
|
|
267
|
-
const exists = await
|
|
338
|
+
const targetPath = await resolveTargetPath(file.name, component.type, config);
|
|
339
|
+
const filePath = path4.join(process.cwd(), targetPath);
|
|
340
|
+
const exists = await fs4.access(filePath).then(() => true).catch(() => false);
|
|
268
341
|
if (exists && !options.overwrite && !options.yes) {
|
|
269
342
|
spinner.stop();
|
|
270
343
|
const { overwrite } = await prompts({
|
|
@@ -279,9 +352,9 @@ async function addComponent(name, config, options) {
|
|
|
279
352
|
}
|
|
280
353
|
spinner.start();
|
|
281
354
|
}
|
|
282
|
-
await
|
|
355
|
+
await fs4.mkdir(path4.dirname(filePath), { recursive: true });
|
|
283
356
|
const content = transformImports(file.content, config);
|
|
284
|
-
await
|
|
357
|
+
await fs4.writeFile(filePath, content, "utf-8");
|
|
285
358
|
}
|
|
286
359
|
spinner.succeed(`${chalk.bold(name)} installed successfully!`);
|
|
287
360
|
} catch (error) {
|
|
@@ -289,40 +362,19 @@ async function addComponent(name, config, options) {
|
|
|
289
362
|
console.error(error);
|
|
290
363
|
}
|
|
291
364
|
}
|
|
292
|
-
function resolveTargetPath(fileName, type, config) {
|
|
293
|
-
if (type === "registry:ui") {
|
|
294
|
-
return path2.join(
|
|
295
|
-
config.aliases.ui.replace("@/", "src/"),
|
|
296
|
-
fileName
|
|
297
|
-
);
|
|
298
|
-
}
|
|
299
|
-
if (type === "registry:lib") {
|
|
300
|
-
return path2.join(
|
|
301
|
-
config.aliases.lib.replace("@/", "src/"),
|
|
302
|
-
fileName
|
|
303
|
-
);
|
|
304
|
-
}
|
|
305
|
-
if (type === "registry:hook") {
|
|
306
|
-
return path2.join(
|
|
307
|
-
config.aliases.hooks.replace("@/", "src/"),
|
|
308
|
-
fileName
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
return fileName;
|
|
312
|
-
}
|
|
313
365
|
|
|
314
366
|
// src/commands/init.ts
|
|
315
367
|
import chalk2 from "chalk";
|
|
316
368
|
import ora2 from "ora";
|
|
317
369
|
import prompts2 from "prompts";
|
|
318
|
-
import
|
|
319
|
-
import
|
|
370
|
+
import path5 from "path";
|
|
371
|
+
import fs5 from "fs/promises";
|
|
320
372
|
import { execa as execa2 } from "execa";
|
|
321
373
|
async function init(options) {
|
|
322
374
|
console.log(chalk2.bold("\nWelcome to Pittaya UI!\n"));
|
|
323
375
|
const cwd = process.cwd();
|
|
324
|
-
const componentsJsonPath =
|
|
325
|
-
const exists = await
|
|
376
|
+
const componentsJsonPath = path5.join(cwd, "components.json");
|
|
377
|
+
const exists = await fs5.access(componentsJsonPath).then(() => true).catch(() => false);
|
|
326
378
|
if (exists && !options.yes) {
|
|
327
379
|
const { overwrite } = await prompts2({
|
|
328
380
|
type: "confirm",
|
|
@@ -335,7 +387,14 @@ async function init(options) {
|
|
|
335
387
|
return;
|
|
336
388
|
}
|
|
337
389
|
}
|
|
338
|
-
const
|
|
390
|
+
const defaultPaths = await getDefaultPaths(cwd);
|
|
391
|
+
const config = options.yes ? {
|
|
392
|
+
style: "new-york",
|
|
393
|
+
tailwindCss: defaultPaths.globalsCss,
|
|
394
|
+
rsc: true,
|
|
395
|
+
componentsPath: defaultPaths.components,
|
|
396
|
+
utilsPath: defaultPaths.utils
|
|
397
|
+
} : await prompts2([
|
|
339
398
|
{
|
|
340
399
|
type: "select",
|
|
341
400
|
name: "style",
|
|
@@ -350,7 +409,7 @@ async function init(options) {
|
|
|
350
409
|
type: "text",
|
|
351
410
|
name: "tailwindCss",
|
|
352
411
|
message: "Where is your globals.css file?",
|
|
353
|
-
initial:
|
|
412
|
+
initial: defaultPaths.globalsCss
|
|
354
413
|
},
|
|
355
414
|
{
|
|
356
415
|
type: "confirm",
|
|
@@ -362,13 +421,13 @@ async function init(options) {
|
|
|
362
421
|
type: "text",
|
|
363
422
|
name: "componentsPath",
|
|
364
423
|
message: "Path for components?",
|
|
365
|
-
initial:
|
|
424
|
+
initial: defaultPaths.components
|
|
366
425
|
},
|
|
367
426
|
{
|
|
368
427
|
type: "text",
|
|
369
428
|
name: "utilsPath",
|
|
370
429
|
message: "Path for utils?",
|
|
371
|
-
initial:
|
|
430
|
+
initial: defaultPaths.utils
|
|
372
431
|
}
|
|
373
432
|
]);
|
|
374
433
|
if (!config.style && !options.yes) {
|
|
@@ -397,7 +456,7 @@ async function init(options) {
|
|
|
397
456
|
iconLibrary: "lucide"
|
|
398
457
|
};
|
|
399
458
|
const spinner = ora2("Creating components.json...").start();
|
|
400
|
-
await
|
|
459
|
+
await fs5.writeFile(
|
|
401
460
|
componentsJsonPath,
|
|
402
461
|
JSON.stringify(componentsJson, null, 2)
|
|
403
462
|
);
|
|
@@ -430,23 +489,14 @@ async function init(options) {
|
|
|
430
489
|
)
|
|
431
490
|
);
|
|
432
491
|
}
|
|
433
|
-
function getDefaultConfig() {
|
|
434
|
-
return {
|
|
435
|
-
style: "new-york",
|
|
436
|
-
tailwindCss: "src/app/globals.css",
|
|
437
|
-
rsc: true,
|
|
438
|
-
componentsPath: "@/components",
|
|
439
|
-
utilsPath: "@/lib/utils"
|
|
440
|
-
};
|
|
441
|
-
}
|
|
442
492
|
async function detectPackageManager2() {
|
|
443
493
|
try {
|
|
444
|
-
await
|
|
494
|
+
await fs5.access("pnpm-lock.yaml");
|
|
445
495
|
return "pnpm";
|
|
446
496
|
} catch {
|
|
447
497
|
}
|
|
448
498
|
try {
|
|
449
|
-
await
|
|
499
|
+
await fs5.access("yarn.lock");
|
|
450
500
|
return "yarn";
|
|
451
501
|
} catch {
|
|
452
502
|
}
|
|
@@ -467,14 +517,14 @@ async function credits() {
|
|
|
467
517
|
import chalk4 from "chalk";
|
|
468
518
|
import ora3 from "ora";
|
|
469
519
|
import prompts3 from "prompts";
|
|
470
|
-
import
|
|
471
|
-
import
|
|
520
|
+
import path6 from "path";
|
|
521
|
+
import fs6 from "fs/promises";
|
|
472
522
|
async function diff(components, options) {
|
|
473
523
|
const cwd = process.cwd();
|
|
474
|
-
const componentsJsonPath =
|
|
524
|
+
const componentsJsonPath = path6.join(cwd, "components.json");
|
|
475
525
|
let config;
|
|
476
526
|
try {
|
|
477
|
-
const configContent = await
|
|
527
|
+
const configContent = await fs6.readFile(componentsJsonPath, "utf-8");
|
|
478
528
|
config = JSON.parse(configContent);
|
|
479
529
|
} catch (error) {
|
|
480
530
|
console.log(chalk4.red("\n\u274C components.json not found.\n"));
|
|
@@ -498,7 +548,7 @@ async function diff(components, options) {
|
|
|
498
548
|
if (options.all) {
|
|
499
549
|
const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
|
|
500
550
|
for (const comp of allComponents) {
|
|
501
|
-
const isInstalled = await
|
|
551
|
+
const isInstalled = await isComponentInstalled(comp, config);
|
|
502
552
|
if (isInstalled) {
|
|
503
553
|
componentsToCheck.push(comp);
|
|
504
554
|
}
|
|
@@ -511,7 +561,7 @@ async function diff(components, options) {
|
|
|
511
561
|
const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
|
|
512
562
|
const installedComponents = [];
|
|
513
563
|
for (const comp of allComponents) {
|
|
514
|
-
const isInstalled = await
|
|
564
|
+
const isInstalled = await isComponentInstalled(comp, config);
|
|
515
565
|
if (isInstalled) {
|
|
516
566
|
installedComponents.push(comp);
|
|
517
567
|
}
|
|
@@ -550,21 +600,6 @@ Checking ${componentsToCheck.length} component(s)...
|
|
|
550
600
|
}
|
|
551
601
|
displayDiffResults(results);
|
|
552
602
|
}
|
|
553
|
-
async function isComponentInstalled2(name, config) {
|
|
554
|
-
try {
|
|
555
|
-
const component = await getRegistryComponent(name);
|
|
556
|
-
if (!component) return false;
|
|
557
|
-
for (const file of component.files) {
|
|
558
|
-
const targetPath = resolveTargetPath2(file.name, component.type, config);
|
|
559
|
-
const filePath = path4.join(process.cwd(), targetPath);
|
|
560
|
-
const exists = await fs4.access(filePath).then(() => true).catch(() => false);
|
|
561
|
-
if (!exists) return false;
|
|
562
|
-
}
|
|
563
|
-
return true;
|
|
564
|
-
} catch {
|
|
565
|
-
return false;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
603
|
async function checkComponentDiff(name, config) {
|
|
569
604
|
try {
|
|
570
605
|
const component = await getRegistryComponent(name);
|
|
@@ -572,7 +607,7 @@ async function checkComponentDiff(name, config) {
|
|
|
572
607
|
console.log(chalk4.red(` \u274C Component "${name}" not found in registry.`));
|
|
573
608
|
return null;
|
|
574
609
|
}
|
|
575
|
-
const isInstalled = await
|
|
610
|
+
const isInstalled = await isComponentInstalled(name, config);
|
|
576
611
|
if (!isInstalled) {
|
|
577
612
|
console.log(chalk4.dim(` \u23ED\uFE0F ${name} is not installed, skipping...`));
|
|
578
613
|
return null;
|
|
@@ -580,10 +615,10 @@ async function checkComponentDiff(name, config) {
|
|
|
580
615
|
const fileDiffs = [];
|
|
581
616
|
let hasChanges = false;
|
|
582
617
|
for (const file of component.files) {
|
|
583
|
-
const targetPath =
|
|
584
|
-
const filePath =
|
|
618
|
+
const targetPath = await resolveTargetPath(file.name, component.type, config);
|
|
619
|
+
const filePath = path6.join(process.cwd(), targetPath);
|
|
585
620
|
try {
|
|
586
|
-
const localContent = await
|
|
621
|
+
const localContent = await fs6.readFile(filePath, "utf-8");
|
|
587
622
|
const registryContent = transformImports(file.content, config);
|
|
588
623
|
const contentMatches = localContent.trim() === registryContent.trim();
|
|
589
624
|
fileDiffs.push({
|
|
@@ -649,40 +684,19 @@ function displayDiffResults(results) {
|
|
|
649
684
|
}
|
|
650
685
|
console.log();
|
|
651
686
|
}
|
|
652
|
-
function resolveTargetPath2(fileName, type, config) {
|
|
653
|
-
if (type === "registry:ui") {
|
|
654
|
-
return path4.join(
|
|
655
|
-
config.aliases.ui.replace("@/", "src/"),
|
|
656
|
-
fileName
|
|
657
|
-
);
|
|
658
|
-
}
|
|
659
|
-
if (type === "registry:lib") {
|
|
660
|
-
return path4.join(
|
|
661
|
-
config.aliases.lib.replace("@/", "src/"),
|
|
662
|
-
fileName
|
|
663
|
-
);
|
|
664
|
-
}
|
|
665
|
-
if (type === "registry:hook") {
|
|
666
|
-
return path4.join(
|
|
667
|
-
config.aliases.hooks.replace("@/", "src/"),
|
|
668
|
-
fileName
|
|
669
|
-
);
|
|
670
|
-
}
|
|
671
|
-
return fileName;
|
|
672
|
-
}
|
|
673
687
|
|
|
674
688
|
// src/commands/update.ts
|
|
675
689
|
import chalk5 from "chalk";
|
|
676
690
|
import ora4 from "ora";
|
|
677
691
|
import prompts4 from "prompts";
|
|
678
|
-
import
|
|
679
|
-
import
|
|
692
|
+
import path7 from "path";
|
|
693
|
+
import fs7 from "fs/promises";
|
|
680
694
|
async function update(components, options) {
|
|
681
695
|
const cwd = process.cwd();
|
|
682
|
-
const componentsJsonPath =
|
|
696
|
+
const componentsJsonPath = path7.join(cwd, "components.json");
|
|
683
697
|
let config;
|
|
684
698
|
try {
|
|
685
|
-
const configContent = await
|
|
699
|
+
const configContent = await fs7.readFile(componentsJsonPath, "utf-8");
|
|
686
700
|
config = JSON.parse(configContent);
|
|
687
701
|
} catch (error) {
|
|
688
702
|
console.log(chalk5.red("\n\u274C components.json not found.\n"));
|
|
@@ -706,7 +720,7 @@ async function update(components, options) {
|
|
|
706
720
|
if (options.all) {
|
|
707
721
|
const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
|
|
708
722
|
for (const comp of allComponents) {
|
|
709
|
-
const isInstalled = await
|
|
723
|
+
const isInstalled = await isComponentInstalled(comp, config);
|
|
710
724
|
if (isInstalled) {
|
|
711
725
|
componentsToUpdate.push(comp);
|
|
712
726
|
}
|
|
@@ -731,7 +745,7 @@ async function update(components, options) {
|
|
|
731
745
|
const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
|
|
732
746
|
const installedComponents = [];
|
|
733
747
|
for (const comp of allComponents) {
|
|
734
|
-
const isInstalled = await
|
|
748
|
+
const isInstalled = await isComponentInstalled(comp, config);
|
|
735
749
|
if (isInstalled) {
|
|
736
750
|
installedComponents.push(comp);
|
|
737
751
|
}
|
|
@@ -768,27 +782,12 @@ Checking ${componentsToUpdate.length} component(s) for updates...
|
|
|
768
782
|
}
|
|
769
783
|
displayUpdateResults(results);
|
|
770
784
|
}
|
|
771
|
-
async function isComponentInstalled3(name, config) {
|
|
772
|
-
try {
|
|
773
|
-
const component = await getRegistryComponent(name);
|
|
774
|
-
if (!component) return false;
|
|
775
|
-
for (const file of component.files) {
|
|
776
|
-
const targetPath = resolveTargetPath3(file.name, component.type, config);
|
|
777
|
-
const filePath = path5.join(process.cwd(), targetPath);
|
|
778
|
-
const exists = await fs5.access(filePath).then(() => true).catch(() => false);
|
|
779
|
-
if (!exists) return false;
|
|
780
|
-
}
|
|
781
|
-
return true;
|
|
782
|
-
} catch {
|
|
783
|
-
return false;
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
785
|
async function hasComponentChanges(component, config) {
|
|
787
786
|
for (const file of component.files) {
|
|
788
|
-
const targetPath =
|
|
789
|
-
const filePath =
|
|
787
|
+
const targetPath = await resolveTargetPath(file.name, component.type, config);
|
|
788
|
+
const filePath = path7.join(process.cwd(), targetPath);
|
|
790
789
|
try {
|
|
791
|
-
const localContent = await
|
|
790
|
+
const localContent = await fs7.readFile(filePath, "utf-8");
|
|
792
791
|
const registryContent = transformImports(file.content, config);
|
|
793
792
|
if (localContent.trim() !== registryContent.trim()) {
|
|
794
793
|
return true;
|
|
@@ -806,7 +805,7 @@ async function updateComponent(name, config, options) {
|
|
|
806
805
|
console.log(chalk5.red(` \u274C Component "${name}" not found in registry.`));
|
|
807
806
|
return { name, updated: false, skipped: true, reason: "not found in registry" };
|
|
808
807
|
}
|
|
809
|
-
const isInstalled = await
|
|
808
|
+
const isInstalled = await isComponentInstalled(name, config);
|
|
810
809
|
if (!isInstalled) {
|
|
811
810
|
console.log(chalk5.dim(` \u23ED\uFE0F ${name} is not installed, skipping...`));
|
|
812
811
|
return { name, updated: false, skipped: true, reason: "not installed" };
|
|
@@ -830,11 +829,11 @@ async function updateComponent(name, config, options) {
|
|
|
830
829
|
}
|
|
831
830
|
const spinner = ora4(`Updating ${chalk5.bold(name)}...`).start();
|
|
832
831
|
for (const file of component.files) {
|
|
833
|
-
const targetPath =
|
|
834
|
-
const filePath =
|
|
835
|
-
await
|
|
832
|
+
const targetPath = await resolveTargetPath(file.name, component.type, config);
|
|
833
|
+
const filePath = path7.join(process.cwd(), targetPath);
|
|
834
|
+
await fs7.mkdir(path7.dirname(filePath), { recursive: true });
|
|
836
835
|
const content = transformImports(file.content, config);
|
|
837
|
-
await
|
|
836
|
+
await fs7.writeFile(filePath, content, "utf-8");
|
|
838
837
|
}
|
|
839
838
|
spinner.succeed(`${chalk5.bold(name)} updated successfully!`);
|
|
840
839
|
return { name, updated: true, skipped: false };
|
|
@@ -866,26 +865,207 @@ function displayUpdateResults(results) {
|
|
|
866
865
|
}
|
|
867
866
|
console.log();
|
|
868
867
|
}
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
868
|
+
|
|
869
|
+
// src/commands/list.ts
|
|
870
|
+
import chalk6 from "chalk";
|
|
871
|
+
import ora5 from "ora";
|
|
872
|
+
import path8 from "path";
|
|
873
|
+
import fs8 from "fs/promises";
|
|
874
|
+
async function list(options) {
|
|
875
|
+
const cwd = process.cwd();
|
|
876
|
+
const componentsJsonPath = path8.join(cwd, "components.json");
|
|
877
|
+
let config;
|
|
878
|
+
try {
|
|
879
|
+
const configContent = await fs8.readFile(componentsJsonPath, "utf-8");
|
|
880
|
+
config = JSON.parse(configContent);
|
|
881
|
+
} catch (error) {
|
|
882
|
+
console.log(chalk6.red("\n\u274C components.json not found.\n"));
|
|
883
|
+
console.log(
|
|
884
|
+
chalk6.dim(`Run ${chalk6.bold("npx pittaya init")} first.
|
|
885
|
+
`)
|
|
874
886
|
);
|
|
887
|
+
return;
|
|
875
888
|
}
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
);
|
|
889
|
+
const spinner = ora5("Fetching components...").start();
|
|
890
|
+
let registry;
|
|
891
|
+
try {
|
|
892
|
+
registry = await fetchRegistry();
|
|
893
|
+
spinner.succeed("Components loaded!");
|
|
894
|
+
} catch (error) {
|
|
895
|
+
spinner.fail("Error loading registry");
|
|
896
|
+
console.error(error);
|
|
897
|
+
return;
|
|
881
898
|
}
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
899
|
+
const allComponents = registry.components || [];
|
|
900
|
+
const componentsWithStatus = await Promise.all(
|
|
901
|
+
allComponents.map(async (comp) => {
|
|
902
|
+
const installed = await isComponentInstalled(comp.slug, config);
|
|
903
|
+
return {
|
|
904
|
+
...comp,
|
|
905
|
+
installed
|
|
906
|
+
};
|
|
907
|
+
})
|
|
908
|
+
);
|
|
909
|
+
let filteredComponents = componentsWithStatus;
|
|
910
|
+
if (options.installed) {
|
|
911
|
+
filteredComponents = componentsWithStatus.filter((comp) => comp.installed);
|
|
912
|
+
} else if (options.available) {
|
|
913
|
+
filteredComponents = componentsWithStatus.filter((comp) => !comp.installed);
|
|
914
|
+
}
|
|
915
|
+
if (options.json) {
|
|
916
|
+
console.log(JSON.stringify(filteredComponents, null, 2));
|
|
917
|
+
return;
|
|
918
|
+
}
|
|
919
|
+
displayComponents(filteredComponents, options);
|
|
920
|
+
}
|
|
921
|
+
function displayComponents(components, options) {
|
|
922
|
+
if (components.length === 0) {
|
|
923
|
+
if (options.installed) {
|
|
924
|
+
console.log(chalk6.yellow("\n\u{1F4E6} No components installed yet.\n"));
|
|
925
|
+
console.log(chalk6.dim(`Run ${chalk6.bold("npx pittaya add")} to install components.
|
|
926
|
+
`));
|
|
927
|
+
} else if (options.available) {
|
|
928
|
+
console.log(chalk6.yellow("\n\u2728 All components are already installed!\n"));
|
|
929
|
+
} else {
|
|
930
|
+
console.log(chalk6.yellow("\n\u26A0\uFE0F No components found in registry.\n"));
|
|
931
|
+
}
|
|
932
|
+
return;
|
|
933
|
+
}
|
|
934
|
+
const categorized = components.reduce((acc, comp) => {
|
|
935
|
+
const category = comp.category || "Other";
|
|
936
|
+
if (!acc[category]) {
|
|
937
|
+
acc[category] = [];
|
|
938
|
+
}
|
|
939
|
+
acc[category].push(comp);
|
|
940
|
+
return acc;
|
|
941
|
+
}, {});
|
|
942
|
+
console.log("\n");
|
|
943
|
+
if (options.installed) {
|
|
944
|
+
console.log(chalk6.bold.green("\u{1F4E6} Installed Components\n"));
|
|
945
|
+
} else if (options.available) {
|
|
946
|
+
console.log(chalk6.bold.blue("\u2728 Available Components\n"));
|
|
947
|
+
} else {
|
|
948
|
+
console.log(chalk6.bold("\u{1F4CB} All Components\n"));
|
|
949
|
+
}
|
|
950
|
+
Object.entries(categorized).sort().forEach(([category, comps]) => {
|
|
951
|
+
console.log(chalk6.bold.cyan(`${category}:`));
|
|
952
|
+
comps.forEach((comp) => {
|
|
953
|
+
const status = comp.installed ? chalk6.green("\u2713") : chalk6.dim("\u25CB");
|
|
954
|
+
const name = comp.installed ? chalk6.bold(comp.slug) : chalk6.dim(comp.slug);
|
|
955
|
+
const description = comp.description ? chalk6.dim(` - ${comp.description}`) : "";
|
|
956
|
+
const deps = comp.dependencies && comp.dependencies.length > 0 ? chalk6.dim.yellow(` [${comp.dependencies.length} deps]`) : "";
|
|
957
|
+
const internalDeps = comp.internalDependencies && comp.internalDependencies.length > 0 ? chalk6.dim.blue(` [requires: ${comp.internalDependencies.join(", ")}]`) : "";
|
|
958
|
+
console.log(` ${status} ${name}${description}${deps}${internalDeps}`);
|
|
959
|
+
});
|
|
960
|
+
console.log();
|
|
961
|
+
});
|
|
962
|
+
const installedCount = components.filter((c) => c.installed).length;
|
|
963
|
+
const totalCount = components.length;
|
|
964
|
+
if (!options.installed && !options.available) {
|
|
965
|
+
console.log(chalk6.dim(`Total: ${totalCount} components (${installedCount} installed, ${totalCount - installedCount} available)
|
|
966
|
+
`));
|
|
967
|
+
} else {
|
|
968
|
+
console.log(chalk6.dim(`Total: ${totalCount} components
|
|
969
|
+
`));
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
// src/commands/debug.ts
|
|
974
|
+
import chalk7 from "chalk";
|
|
975
|
+
import path9 from "path";
|
|
976
|
+
import fs9 from "fs/promises";
|
|
977
|
+
async function debug(options) {
|
|
978
|
+
const cwd = process.cwd();
|
|
979
|
+
const componentsJsonPath = path9.join(cwd, "components.json");
|
|
980
|
+
console.log(chalk7.bold("\n\u{1F50D} Pittaya UI Debug Information\n"));
|
|
981
|
+
console.log(chalk7.dim(`Working directory: ${cwd}
|
|
982
|
+
`));
|
|
983
|
+
let config;
|
|
984
|
+
try {
|
|
985
|
+
const configContent = await fs9.readFile(componentsJsonPath, "utf-8");
|
|
986
|
+
config = JSON.parse(configContent);
|
|
987
|
+
console.log(chalk7.green("\u2705 components.json found"));
|
|
988
|
+
console.log(chalk7.dim(` Path: ${componentsJsonPath}`));
|
|
989
|
+
} catch (error) {
|
|
990
|
+
console.log(chalk7.red("\u274C components.json not found\n"));
|
|
991
|
+
return;
|
|
992
|
+
}
|
|
993
|
+
const usesSrc = await hasSrcDirectory(cwd);
|
|
994
|
+
console.log(chalk7.green(`\u2705 Project structure: ${usesSrc ? "src/" : "root"}`));
|
|
995
|
+
console.log(chalk7.bold("\n\u{1F4CB} Configured Aliases:"));
|
|
996
|
+
console.log(chalk7.dim(` components: ${config.aliases.components}`));
|
|
997
|
+
console.log(chalk7.dim(` utils: ${config.aliases.utils}`));
|
|
998
|
+
console.log(chalk7.dim(` ui: ${config.aliases.ui}`));
|
|
999
|
+
const resolvedUi = await resolveAliasPath(config.aliases.ui, cwd);
|
|
1000
|
+
const resolvedLib = await resolveAliasPath(config.aliases.lib || "@/lib", cwd);
|
|
1001
|
+
console.log(chalk7.bold("\n\u{1F4C2} Resolved Paths:"));
|
|
1002
|
+
console.log(chalk7.dim(` UI components: ${resolvedUi}`));
|
|
1003
|
+
console.log(chalk7.dim(` Libraries: ${resolvedLib}`));
|
|
1004
|
+
if (options.component) {
|
|
1005
|
+
console.log(chalk7.bold(`
|
|
1006
|
+
\u{1F50D} Debugging component: ${options.component}
|
|
1007
|
+
`));
|
|
1008
|
+
try {
|
|
1009
|
+
const component = await getRegistryComponent(options.component);
|
|
1010
|
+
if (!component) {
|
|
1011
|
+
console.log(chalk7.red(`\u274C Component not found in registry
|
|
1012
|
+
`));
|
|
1013
|
+
return;
|
|
1014
|
+
}
|
|
1015
|
+
console.log(chalk7.green(`\u2705 Component found in registry`));
|
|
1016
|
+
console.log(chalk7.dim(` Type: ${component.type}`));
|
|
1017
|
+
console.log(chalk7.dim(` Files: ${component.files.length}`));
|
|
1018
|
+
console.log(chalk7.bold("\n\u{1F4C1} Expected Files:"));
|
|
1019
|
+
for (const file of component.files) {
|
|
1020
|
+
const targetPath = await resolveTargetPath(file.name, component.type, config);
|
|
1021
|
+
const fullPath = path9.join(cwd, targetPath);
|
|
1022
|
+
const exists = await fs9.access(fullPath).then(() => true).catch(() => false);
|
|
1023
|
+
const statusIcon = exists ? chalk7.green("\u2705") : chalk7.red("\u274C");
|
|
1024
|
+
const statusText = exists ? chalk7.green("EXISTS") : chalk7.red("NOT FOUND");
|
|
1025
|
+
console.log(` ${statusIcon} ${file.name}`);
|
|
1026
|
+
console.log(chalk7.dim(` Expected: ${fullPath}`));
|
|
1027
|
+
console.log(chalk7.dim(` Status: ${statusText}`));
|
|
1028
|
+
if (!exists) {
|
|
1029
|
+
const dir = path9.dirname(fullPath);
|
|
1030
|
+
try {
|
|
1031
|
+
const dirExists = await fs9.access(dir).then(() => true).catch(() => false);
|
|
1032
|
+
if (dirExists) {
|
|
1033
|
+
const filesInDir = await fs9.readdir(dir);
|
|
1034
|
+
const baseName = path9.basename(file.name, path9.extname(file.name));
|
|
1035
|
+
const similarFiles = filesInDir.filter(
|
|
1036
|
+
(f) => f.includes(baseName) || f.toLowerCase().includes(baseName.toLowerCase())
|
|
1037
|
+
);
|
|
1038
|
+
if (similarFiles.length > 0) {
|
|
1039
|
+
console.log(chalk7.yellow(` \u{1F4A1} Similar files found in directory:`));
|
|
1040
|
+
similarFiles.forEach((f) => {
|
|
1041
|
+
console.log(chalk7.dim(` - ${f}`));
|
|
1042
|
+
});
|
|
1043
|
+
}
|
|
1044
|
+
} else {
|
|
1045
|
+
console.log(chalk7.red(` \u26A0\uFE0F Directory doesn't exist: ${dir}`));
|
|
1046
|
+
}
|
|
1047
|
+
} catch (err) {
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
const isInstalled = await isComponentInstalled(options.component, config);
|
|
1052
|
+
console.log(chalk7.bold(`
|
|
1053
|
+
\u{1F4CA} Installation Status:`));
|
|
1054
|
+
if (isInstalled) {
|
|
1055
|
+
console.log(chalk7.green(` \u2705 Component is detected as INSTALLED`));
|
|
1056
|
+
} else {
|
|
1057
|
+
console.log(chalk7.red(` \u274C Component is detected as NOT INSTALLED`));
|
|
1058
|
+
console.log(chalk7.yellow(` \u{1F4A1} All files must exist for component to be considered installed`));
|
|
1059
|
+
}
|
|
1060
|
+
} catch (error) {
|
|
1061
|
+
console.log(chalk7.red(`
|
|
1062
|
+
\u274C Error debugging component:`));
|
|
1063
|
+
console.error(error);
|
|
1064
|
+
}
|
|
1065
|
+
} else {
|
|
1066
|
+
console.log(chalk7.yellow("\n\u{1F4A1} To debug a specific component, use:"));
|
|
1067
|
+
console.log(chalk7.dim(" npx pittaya debug --component <name>\n"));
|
|
887
1068
|
}
|
|
888
|
-
return fileName;
|
|
889
1069
|
}
|
|
890
1070
|
|
|
891
1071
|
// src/index.ts
|
|
@@ -903,6 +1083,8 @@ program.command("init").description("Initialize Pittaya UI in your project").opt
|
|
|
903
1083
|
program.command("add").description("Add a component to your project").argument("[components...]", "Component names to add").option("-y, --yes", "Skip confirmations and overwrite existing files").option("-o, --overwrite", "Overwrite existing files").option("-a, --all", "Add all available components").option("--add-missing-deps", "Automatically install missing dependencies").action(add);
|
|
904
1084
|
program.command("diff").description("Check for component updates").argument("[components...]", "Component names to check (leave empty for interactive mode)").option("-a, --all", "Check all installed components").action(diff);
|
|
905
1085
|
program.command("update").description("Update components to latest version").argument("[components...]", "Component names to update (leave empty for interactive mode)").option("-a, --all", "Update all installed components").option("-y, --yes", "Skip confirmation prompts").option("-f, --force", "Force update even if no changes detected").action(update);
|
|
1086
|
+
program.command("list").description("List available and installed components").option("--installed", "Show only installed components").option("--available", "Show only available components").option("--json", "Output in JSON format").action(list);
|
|
906
1087
|
program.command("credits").description("Show Pittaya UI creators").action(credits);
|
|
1088
|
+
program.command("debug").description("Debug component installation issues").option("-c, --component <name>", "Component name to debug").action(debug);
|
|
907
1089
|
program.parse();
|
|
908
1090
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/registry.ts","../src/utils/transformer.ts","../src/utils/package-manager.ts","../src/commands/init.ts","../src/commands/credits.ts","../src/commands/diff.ts","../src/commands/update.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { add } from \"./commands/add.js\";\nimport { init } from \"./commands/init.js\";\nimport { credits } from \"./commands/credits.js\";\nimport { diff } from \"./commands/diff.js\";\nimport { update } from \"./commands/update.js\";\nimport { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, \"../package.json\"), \"utf-8\")\n);\n\nconst program = new Command();\n\nprogram\n .name(\"pittaya\")\n .description(\"Add Pittaya UI components to your project\")\n .version(packageJson.version);\n\nprogram\n .command(\"init\")\n .description(\"Initialize Pittaya UI in your project\")\n .option(\"-y, --yes\", \"Skip confirmations and use default values\")\n .action(init);\n\nprogram\n .command(\"add\")\n .description(\"Add a component to your project\")\n .argument(\"[components...]\", \"Component names to add\")\n .option(\"-y, --yes\", \"Skip confirmations and overwrite existing files\")\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\n .option(\"-a, --all\", \"Add all available components\")\n .option(\"--add-missing-deps\", \"Automatically install missing dependencies\")\n .action(add);\n\nprogram\n .command(\"diff\")\n .description(\"Check for component updates\")\n .argument(\"[components...]\", \"Component names to check (leave empty for interactive mode)\")\n .option(\"-a, --all\", \"Check all installed components\")\n .action(diff);\n\nprogram\n .command(\"update\")\n .description(\"Update components to latest version\")\n .argument(\"[components...]\", \"Component names to update (leave empty for interactive mode)\")\n .option(\"-a, --all\", \"Update all installed components\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-f, --force\", \"Force update even if no changes detected\")\n .action(update);\n\nprogram\n .command(\"credits\")\n .description(\"Show Pittaya UI creators\")\n .action(credits);\n\nprogram.parse();\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { execa } from \"execa\";\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\nimport { transformImports } from \"../utils/transformer.js\";\nimport { detectPackageManager, checkMissingDependencies } from \"../utils/package-manager.js\";\nimport { IAddOptions } from \"../interfaces/IAddOptions\";\nimport { IConfig } from \"../interfaces/IConfig\";\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\n\nexport async function add(components: string[], options: IAddOptions) {\n const cwd = process.cwd();\n const componentsJsonPath = path.join(cwd, \"components.json\");\n\n let config: IConfig;\n try {\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\n config = JSON.parse(configContent);\n } catch (error) {\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\n console.log(\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\n );\n return;\n }\n\n const spinner = ora(\"Fetching available components...\").start();\n let registry;\n try {\n registry = await fetchRegistry();\n spinner.succeed(\"Registry loaded!\");\n } catch (error) {\n spinner.fail(\"Error loading registry\");\n console.error(error);\n return;\n }\n\n if (options.all) {\n components = registry.components\n .filter((comp: any) => comp.type === \"registry:ui\")\n .map((comp: any) => comp.name);\n }\n\n if (components.length === 0) {\n const availableComponents = registry.components\n .filter((comp: any) => comp.type === \"registry:ui\")\n .map((comp: any) => ({\n title: `${comp.name}${comp.description ? ` - ${comp.description}` : \"\"}`,\n value: comp.name,\n }));\n\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select components to add:\",\n choices: availableComponents,\n min: 1,\n });\n\n if (!selected || selected.length === 0) {\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\n return;\n }\n\n components = selected;\n }\n\n console.log(\n chalk.dim(`\\nAdding ${components.length} component(s)...\\n`)\n );\n\n for (const componentName of components) {\n await addComponent(componentName, config, options);\n }\n\n console.log(chalk.green(\"\\n✅ Components added successfully!\\n\"));\n}\n\nasync function isComponentInstalled(\n name: string,\n config: IConfig\n): Promise<boolean> {\n try {\n const component: IRegistryComponent = await getRegistryComponent(name);\n if (!component) return false;\n\n for (const file of component.files) {\n const targetPath = resolveTargetPath(file.name, component.type, config);\n const filePath = path.join(process.cwd(), targetPath);\n\n const exists = await fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n\n if (!exists) return false;\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\nasync function addComponent(\n name: string,\n config: IConfig,\n options: IAddOptions\n) {\n const alreadyInstalled = await isComponentInstalled(name, config);\n if (alreadyInstalled && !options.overwrite) {\n console.log(chalk.dim(` ⏭️ ${name} already installed, skipping...`));\n return;\n }\n\n const spinner = ora(`Installing ${chalk.bold(name)}...`).start();\n\n try {\n const component: IRegistryComponent = await getRegistryComponent(name);\n\n if (!component) {\n spinner.fail(`Component \"${name}\" not found in registry.`);\n return;\n }\n\n const packageManager = await detectPackageManager();\n\n if (component.dependencies && component.dependencies.length > 0) {\n const missingDeps = await checkMissingDependencies(component.dependencies);\n\n if (missingDeps.length > 0) {\n spinner.stop();\n\n console.log(chalk.yellow(`\\n⚠️ ${name} requires the following dependencies:\\n`));\n missingDeps.forEach(dep => {\n console.log(chalk.dim(` • ${dep}`));\n });\n console.log();\n\n // If --add-missing-deps was passed, install automatically\n if (options.addMissingDeps) {\n console.log(chalk.dim(\"Installing dependencies automatically...\\n\"));\n } else {\n const { install } = await prompts({\n type: \"confirm\",\n name: \"install\",\n message: \"Do you want to install the dependencies now?\",\n initial: true,\n });\n\n if (!install) {\n console.log(chalk.yellow(\"\\n⚠️ Component not installed. Install the dependencies manually and try again.\\n\"));\n return;\n }\n }\n\n spinner.start(`Installing dependencies for ${name}...`);\n\n try {\n await execa(packageManager, [\n packageManager === \"yarn\" ? \"add\" : \"install\",\n ...missingDeps,\n ]);\n spinner.succeed(`Dependencies installed!`);\n spinner.start(`Installing ${chalk.bold(name)}...`);\n } catch (error) {\n spinner.fail(`Error installing dependencies`);\n console.error(error);\n return;\n }\n }\n }\n\n if (component.registryDependencies && component.registryDependencies.length > 0) {\n spinner.stop();\n console.log(chalk.dim(`\\n 📦 ${name} requires: ${component.registryDependencies.join(\", \")}`));\n\n for (const dep of component.registryDependencies) {\n await addComponent(dep, config, { ...options, yes: true });\n }\n\n console.log(); // Linha em branco\n spinner.start(`Installing ${chalk.bold(name)}...`);\n }\n\n for (const file of component.files) {\n const targetPath = resolveTargetPath(file.name, component.type, config);\n const filePath = path.join(process.cwd(), targetPath);\n\n const exists = await fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n\n if (exists && !options.overwrite && !options.yes) {\n spinner.stop();\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `${targetPath} already exists. Overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n spinner.warn(`Skipping ${targetPath}`);\n continue;\n }\n spinner.start();\n }\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n const content = transformImports(file.content, config);\n\n await fs.writeFile(filePath, content, \"utf-8\");\n }\n\n spinner.succeed(`${chalk.bold(name)} installed successfully!`);\n } catch (error) {\n spinner.fail(`Error installing ${name}`);\n console.error(error);\n }\n}\n\nfunction resolveTargetPath(\n fileName: string,\n type: string,\n config: IConfig\n): string {\n if (type === \"registry:ui\") {\n return path.join(\n config.aliases.ui.replace(\"@/\", \"src/\"),\n fileName\n );\n }\n\n if (type === \"registry:lib\") {\n return path.join(\n config.aliases.lib.replace(\"@/\", \"src/\"),\n fileName\n );\n }\n\n if (type === \"registry:hook\") {\n return path.join(\n config.aliases.hooks.replace(\"@/\", \"src/\"),\n fileName\n );\n }\n\n return fileName;\n}\n\n","import fetch from \"node-fetch\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\nconst REGISTRY_BASE_URL = \"https://raw.githubusercontent.com/pittaya-ui/cli/main/registry\";\r\n\r\n\r\nexport async function fetchRegistry(): Promise<any> {\r\n try {\r\n const response = await fetch(`${REGISTRY_BASE_URL}/index.json`);\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n return await response.json();\r\n } catch (error) {\r\n console.error(\"Error fetching registry:\", error);\r\n throw new Error(\"Unable to load the registry of components\");\r\n }\r\n}\r\n\r\nexport async function getRegistryComponent(name: string): Promise<IRegistryComponent> {\r\n try {\r\n const response = await fetch(\r\n `${REGISTRY_BASE_URL}/components/${name}.json`\r\n );\r\n\r\n if (!response.ok) {\r\n throw new Error(`Component \"${name}\" not found in registry`);\r\n }\r\n\r\n return await response.json() as IRegistryComponent;\r\n } catch (error: any) {\r\n throw new Error(`Error loading component \"${name}\": ${error.message}`);\r\n }\r\n}\r\n\r\nexport function setRegistryUrl(url: string) {\r\n process.env.PITTAYA_REGISTRY_URL = url;\r\n}\r\n\r\n","\r\n\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\n\r\nexport function transformImports(content: string, config: IConfig): string {\r\n let transformed = content;\r\n\r\n const aliasMap: Record<string, string> = {\r\n \"@/components/ui\": config.aliases.ui,\r\n \"@/components\": config.aliases.components,\r\n \"@/lib/utils\": config.aliases.utils,\r\n \"@/lib\": config.aliases.lib,\r\n \"@/hooks\": config.aliases.hooks,\r\n };\r\n\r\n const sortedAliases = Object.entries(aliasMap).sort(\r\n ([a], [b]) => b.length - a.length\r\n );\r\n\r\n for (const [from, to] of sortedAliases) {\r\n if (from !== to) {\r\n transformed = transformed.replace(\r\n new RegExp(`from [\"']${escapeRegex(from)}`, \"g\"),\r\n `from \"${to}`\r\n );\r\n transformed = transformed.replace(\r\n new RegExp(`import [\"']${escapeRegex(from)}`, \"g\"),\r\n `import \"${to}`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\nfunction escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\n","import fs from \"fs/promises\";\r\nimport path from \"path\";\r\n\r\nexport async function detectPackageManager(): Promise<string> {\r\n try {\r\n await fs.access(\"pnpm-lock.yaml\");\r\n return \"pnpm\";\r\n } catch {}\r\n\r\n try {\r\n await fs.access(\"yarn.lock\");\r\n return \"yarn\";\r\n } catch {}\r\n\r\n try {\r\n await fs.access(\"bun.lockb\");\r\n return \"bun\";\r\n } catch {}\r\n\r\n return \"npm\";\r\n}\r\n\r\nexport async function isPackageInstalled(packageName: string): Promise<boolean> {\r\n const cwd = process.cwd();\r\n\r\n try {\r\n const packageJsonPath = path.join(cwd, \"package.json\");\r\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, \"utf-8\"));\r\n\r\n const allDeps = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n if (allDeps[packageName]) {\r\n return true;\r\n }\r\n } catch {}\r\n\r\n try {\r\n const packagePath = path.join(cwd, \"node_modules\", packageName);\r\n await fs.access(packagePath);\r\n return true;\r\n } catch {}\r\n\r\n return false;\r\n}\r\n\r\nexport async function checkMissingDependencies(\r\n dependencies: string[]\r\n): Promise<string[]> {\r\n const missing: string[] = [];\r\n\r\n for (const dep of dependencies) {\r\n const installed = await isPackageInstalled(dep);\r\n if (!installed) {\r\n missing.push(dep);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n\r\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { execa } from \"execa\";\n\ninterface InitOptions {\n yes?: boolean;\n}\n\nexport async function init(options: InitOptions) {\n console.log(chalk.bold(\"\\nWelcome to Pittaya UI!\\n\"));\n\n const cwd = process.cwd();\n const componentsJsonPath = path.join(cwd, \"components.json\");\n\n const exists = await fs\n .access(componentsJsonPath)\n .then(() => true)\n .catch(() => false);\n\n if (exists && !options.yes) {\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: \"components.json already exists. Do you want to overwrite it?\",\n initial: false,\n });\n\n if (!overwrite) {\n console.log(chalk.yellow(\"\\n❌ Operation cancelled.\\n\"));\n return;\n }\n }\n\n const config = options.yes\n ? getDefaultConfig()\n : await prompts([\n {\n type: \"select\",\n name: \"style\",\n message: \"Which style would you like to use?\",\n choices: [\n { title: \"New York\", value: \"new-york\" },\n { title: \"Default\", value: \"default\" },\n { title: \"Recife\", value: \"recife\" },\n ],\n },\n {\n type: \"text\",\n name: \"tailwindCss\",\n message: \"Where is your globals.css file?\",\n initial: \"src/app/globals.css\",\n },\n {\n type: \"confirm\",\n name: \"rsc\",\n message: \"Use React Server Components?\",\n initial: true,\n },\n {\n type: \"text\",\n name: \"componentsPath\",\n message: \"Path for components?\",\n initial: \"@/components\",\n },\n {\n type: \"text\",\n name: \"utilsPath\",\n message: \"Path for utils?\",\n initial: \"@/lib/utils\",\n },\n ]);\n\n if (!config.style && !options.yes) {\n console.log(chalk.yellow(\"\\n❌ Operation cancelled.\\n\"));\n return;\n }\n\n const componentsJson = {\n $schema: \"https://raw.githubusercontent.com/pittaya-ui/cli/main/registry/schema.json\",\n style: config.style || \"new-york\",\n rsc: config.rsc ?? true,\n tsx: true,\n tailwind: {\n config: \"tailwind.config.ts\",\n css: config.tailwindCss || \"src/app/globals.css\",\n baseColor: \"neutral\",\n cssVariables: true,\n prefix: \"\",\n },\n aliases: {\n components: config.componentsPath || \"@/components\",\n utils: config.utilsPath || \"@/lib/utils\",\n ui: `${config.componentsPath || \"@/components\"}/pittaya/ui`,\n lib: \"@/lib\",\n hooks: \"@/hooks\",\n },\n iconLibrary: \"lucide\",\n };\n\n const spinner = ora(\"Creating components.json...\").start();\n await fs.writeFile(\n componentsJsonPath,\n JSON.stringify(componentsJson, null, 2)\n );\n spinner.succeed(\"components.json created successfully!\");\n\n const packageManager = await detectPackageManager();\n\n const depsSpinner = ora(\"Installing base dependencies...\").start();\n try {\n await execa(packageManager, [\n packageManager === \"yarn\" ? \"add\" : \"install\",\n \"class-variance-authority\",\n \"clsx\",\n \"tailwind-merge\",\n ]);\n depsSpinner.succeed(\"Dependencies installed!\");\n } catch (error) {\n depsSpinner.fail(\"Error installing dependencies\");\n console.error(error);\n }\n\n console.log(chalk.green(\"\\n✅ Pittaya UI configured successfully!\\n\"));\n console.log(chalk.dim(\"Next steps:\"));\n console.log(\n chalk.dim(\n ` ${chalk.bold(\"npx pittaya add button\")} - Add a component`\n )\n );\n console.log(\n chalk.dim(\n ` ${chalk.bold(\"npx pittaya add --all\")} - Add all components\\n`\n )\n );\n}\n\nfunction getDefaultConfig() {\n return {\n style: \"new-york\",\n tailwindCss: \"src/app/globals.css\",\n rsc: true,\n componentsPath: \"@/components\",\n utilsPath: \"@/lib/utils\",\n };\n}\n\nasync function detectPackageManager(): Promise<string> {\n try {\n await fs.access(\"pnpm-lock.yaml\");\n return \"pnpm\";\n } catch {}\n\n try {\n await fs.access(\"yarn.lock\");\n return \"yarn\";\n } catch {}\n\n return \"npm\";\n}\n\n","import chalk from \"chalk\";\r\n\r\nexport async function credits() {\r\n console.log(chalk.bold(\"\\nPittaya UI - Creators\\n\"));\r\n\r\n console.log(chalk.cyan(\" • Marcos Bueno\"));\r\n console.log(chalk.cyan(\" • Lucas Ribeiro\"));\r\n console.log(chalk.cyan(\" • Jarbas Gouveia\"));\r\n\r\n console.log(chalk.dim(\"\\n Thank you for using Pittaya UI! ❤️\\n\"));\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport prompts from \"prompts\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\r\nimport { transformImports } from \"../utils/transformer.js\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\ninterface DiffOptions {\r\n all?: boolean;\r\n}\r\n\r\ninterface ComponentDiff {\r\n name: string;\r\n hasChanges: boolean;\r\n files: FileDiff[];\r\n isInstalled: boolean;\r\n}\r\n\r\ninterface FileDiff {\r\n name: string;\r\n hasChanges: boolean;\r\n isNew: boolean;\r\n isMissing: boolean;\r\n}\r\n\r\nexport async function diff(components: string[], options: DiffOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching registry...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Registry loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n let componentsToCheck: string[] = [];\r\n\r\n if (options.all) {\r\n // Check all installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n componentsToCheck.push(comp);\r\n }\r\n }\r\n\r\n if (componentsToCheck.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n } else if (components.length === 0) {\r\n // Interactive mode - show only installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n const installedComponents = [];\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n installedComponents.push(comp);\r\n }\r\n }\r\n\r\n if (installedComponents.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n const { selected } = await prompts({\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"Select components to check for updates:\",\r\n choices: installedComponents.map(name => ({\r\n title: name,\r\n value: name,\r\n })),\r\n min: 1,\r\n });\r\n\r\n if (!selected || selected.length === 0) {\r\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\r\n return;\r\n }\r\n\r\n componentsToCheck = selected;\r\n } else {\r\n componentsToCheck = components;\r\n }\r\n\r\n console.log(chalk.dim(`\\nChecking ${componentsToCheck.length} component(s)...\\n`));\r\n\r\n const results: ComponentDiff[] = [];\r\n\r\n for (const componentName of componentsToCheck) {\r\n const diffResult = await checkComponentDiff(componentName, config);\r\n if (diffResult) {\r\n results.push(diffResult);\r\n }\r\n }\r\n\r\n // Display results\r\n displayDiffResults(results);\r\n}\r\n\r\nasync function isComponentInstalled(\r\n name: string,\r\n config: IConfig\r\n): Promise<boolean> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) return false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n const exists = await fs\r\n .access(filePath)\r\n .then(() => true)\r\n .catch(() => false);\r\n\r\n if (!exists) return false;\r\n }\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function checkComponentDiff(\r\n name: string,\r\n config: IConfig\r\n): Promise<ComponentDiff | null> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) {\r\n console.log(chalk.red(` ❌ Component \"${name}\" not found in registry.`));\r\n return null;\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(name, config);\r\n if (!isInstalled) {\r\n console.log(chalk.dim(` ⏭️ ${name} is not installed, skipping...`));\r\n return null;\r\n }\r\n\r\n const fileDiffs: FileDiff[] = [];\r\n let hasChanges = false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n try {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const registryContent = transformImports(file.content, config);\r\n\r\n const contentMatches = localContent.trim() === registryContent.trim();\r\n\r\n fileDiffs.push({\r\n name: file.name,\r\n hasChanges: !contentMatches,\r\n isNew: false,\r\n isMissing: false,\r\n });\r\n\r\n if (!contentMatches) {\r\n hasChanges = true;\r\n }\r\n } catch (error) {\r\n // File exists check passed but can't read - treat as missing\r\n fileDiffs.push({\r\n name: file.name,\r\n hasChanges: true,\r\n isNew: false,\r\n isMissing: true,\r\n });\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n return {\r\n name,\r\n hasChanges,\r\n files: fileDiffs,\r\n isInstalled: true,\r\n };\r\n } catch (error) {\r\n console.log(chalk.red(` ❌ Error checking ${name}`));\r\n console.error(error);\r\n return null;\r\n }\r\n}\r\n\r\nfunction displayDiffResults(results: ComponentDiff[]) {\r\n const componentsWithChanges = results.filter((r) => r.hasChanges);\r\n const componentsUpToDate = results.filter((r) => !r.hasChanges);\r\n\r\n console.log();\r\n\r\n if (componentsWithChanges.length > 0) {\r\n console.log(chalk.yellow(`📝 Components with updates available (${componentsWithChanges.length}):\\n`));\r\n\r\n for (const result of componentsWithChanges) {\r\n console.log(chalk.yellow(` • ${chalk.bold(result.name)}`));\r\n\r\n for (const file of result.files) {\r\n if (file.hasChanges) {\r\n if (file.isMissing) {\r\n console.log(chalk.red(` └─ ${file.name} (missing locally)`));\r\n } else {\r\n console.log(chalk.dim(` └─ ${file.name} (modified)`));\r\n }\r\n }\r\n }\r\n }\r\n console.log();\r\n console.log(chalk.dim(`Run ${chalk.bold(\"npx pittaya update <component>\")} to update.`));\r\n }\r\n\r\n if (componentsUpToDate.length > 0) {\r\n console.log(chalk.green(`\\n✅ Components up to date (${componentsUpToDate.length}):\\n`));\r\n\r\n for (const result of componentsUpToDate) {\r\n console.log(chalk.dim(` • ${result.name}`));\r\n }\r\n }\r\n\r\n console.log();\r\n}\r\n\r\nfunction resolveTargetPath(\r\n fileName: string,\r\n type: string,\r\n config: IConfig\r\n): string {\r\n if (type === \"registry:ui\") {\r\n return path.join(\r\n config.aliases.ui.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n if (type === \"registry:lib\") {\r\n return path.join(\r\n config.aliases.lib.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n if (type === \"registry:hook\") {\r\n return path.join(\r\n config.aliases.hooks.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n return fileName;\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport prompts from \"prompts\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\r\nimport { transformImports } from \"../utils/transformer.js\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\ninterface UpdateOptions {\r\n all?: boolean;\r\n yes?: boolean;\r\n force?: boolean;\r\n}\r\n\r\ninterface UpdateResult {\r\n name: string;\r\n updated: boolean;\r\n skipped: boolean;\r\n reason?: string;\r\n}\r\n\r\nexport async function update(components: string[], options: UpdateOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching registry...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Registry loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n let componentsToUpdate: string[] = [];\r\n\r\n if (options.all) {\r\n // Update all installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n componentsToUpdate.push(comp);\r\n }\r\n }\r\n\r\n if (componentsToUpdate.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n if (!options.yes && !options.force) {\r\n const { confirm } = await prompts({\r\n type: \"confirm\",\r\n name: \"confirm\",\r\n message: `Update ${componentsToUpdate.length} component(s)?`,\r\n initial: true,\r\n });\r\n\r\n if (!confirm) {\r\n console.log(chalk.yellow(\"\\n❌ Update cancelled.\\n\"));\r\n return;\r\n }\r\n }\r\n } else if (components.length === 0) {\r\n // Interactive mode - show only installed components with updates\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n const installedComponents = [];\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n installedComponents.push(comp);\r\n }\r\n }\r\n\r\n if (installedComponents.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n const { selected } = await prompts({\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"Select components to update:\",\r\n choices: installedComponents.map(name => ({\r\n title: name,\r\n value: name,\r\n })),\r\n min: 1,\r\n });\r\n\r\n if (!selected || selected.length === 0) {\r\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\r\n return;\r\n }\r\n\r\n componentsToUpdate = selected;\r\n } else {\r\n componentsToUpdate = components;\r\n }\r\n\r\n console.log(chalk.dim(`\\nChecking ${componentsToUpdate.length} component(s) for updates...\\n`));\r\n\r\n const results: UpdateResult[] = [];\r\n\r\n for (const componentName of componentsToUpdate) {\r\n const result = await updateComponent(componentName, config, options);\r\n results.push(result);\r\n }\r\n\r\n // Display results\r\n displayUpdateResults(results);\r\n}\r\n\r\nasync function isComponentInstalled(\r\n name: string,\r\n config: IConfig\r\n): Promise<boolean> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) return false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n const exists = await fs\r\n .access(filePath)\r\n .then(() => true)\r\n .catch(() => false);\r\n\r\n if (!exists) return false;\r\n }\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function hasComponentChanges(\r\n component: IRegistryComponent,\r\n config: IConfig\r\n): Promise<boolean> {\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n try {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const registryContent = transformImports(file.content, config);\r\n\r\n if (localContent.trim() !== registryContent.trim()) {\r\n return true;\r\n }\r\n } catch {\r\n // If we can't read the file, consider it as having changes\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nasync function updateComponent(\r\n name: string,\r\n config: IConfig,\r\n options: UpdateOptions\r\n): Promise<UpdateResult> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) {\r\n console.log(chalk.red(` ❌ Component \"${name}\" not found in registry.`));\r\n return { name, updated: false, skipped: true, reason: \"not found in registry\" };\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(name, config);\r\n if (!isInstalled) {\r\n console.log(chalk.dim(` ⏭️ ${name} is not installed, skipping...`));\r\n return { name, updated: false, skipped: true, reason: \"not installed\" };\r\n }\r\n\r\n // Check if there are changes\r\n const hasChanges = await hasComponentChanges(component, config);\r\n\r\n if (!hasChanges && !options.force) {\r\n console.log(chalk.dim(` ✓ ${name} is already up to date`));\r\n return { name, updated: false, skipped: true, reason: \"already up to date\" };\r\n }\r\n\r\n // Ask for confirmation if not --yes or --force\r\n if (!options.yes && !options.force) {\r\n const { confirm } = await prompts({\r\n type: \"confirm\",\r\n name: \"confirm\",\r\n message: `Update ${chalk.bold(name)}?`,\r\n initial: true,\r\n });\r\n\r\n if (!confirm) {\r\n console.log(chalk.yellow(` ⏭️ Skipped ${name}`));\r\n return { name, updated: false, skipped: true, reason: \"user cancelled\" };\r\n }\r\n }\r\n\r\n const spinner = ora(`Updating ${chalk.bold(name)}...`).start();\r\n\r\n // Update files\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n await fs.mkdir(path.dirname(filePath), { recursive: true });\r\n\r\n const content = transformImports(file.content, config);\r\n await fs.writeFile(filePath, content, \"utf-8\");\r\n }\r\n\r\n spinner.succeed(`${chalk.bold(name)} updated successfully!`);\r\n return { name, updated: true, skipped: false };\r\n } catch (error) {\r\n console.log(chalk.red(` ❌ Error updating ${name}`));\r\n console.error(error);\r\n return { name, updated: false, skipped: true, reason: \"error\" };\r\n }\r\n}\r\n\r\nfunction displayUpdateResults(results: UpdateResult[]) {\r\n const updated = results.filter((r) => r.updated);\r\n const skipped = results.filter((r) => r.skipped);\r\n\r\n console.log();\r\n\r\n if (updated.length > 0) {\r\n console.log(chalk.green(`✅ Updated ${updated.length} component(s):\\n`));\r\n for (const result of updated) {\r\n console.log(chalk.dim(` • ${result.name}`));\r\n }\r\n }\r\n\r\n if (skipped.length > 0) {\r\n console.log(chalk.yellow(`\\n⏭️ Skipped ${skipped.length} component(s):\\n`));\r\n for (const result of skipped) {\r\n const reason = result.reason ? ` (${result.reason})` : \"\";\r\n console.log(chalk.dim(` • ${result.name}${reason}`));\r\n }\r\n }\r\n\r\n console.log();\r\n}\r\n\r\nfunction resolveTargetPath(\r\n fileName: string,\r\n type: string,\r\n config: IConfig\r\n): string {\r\n if (type === \"registry:ui\") {\r\n return path.join(\r\n config.aliases.ui.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n if (type === \"registry:lib\") {\r\n return path.join(\r\n config.aliases.lib.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n if (type === \"registry:hook\") {\r\n return path.join(\r\n config.aliases.hooks.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n return fileName;\r\n}\r\n\r\n"],"mappings":"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","names":["path","fs","packageJson","path","fs","chalk","ora","prompts","path","fs","execa","detectPackageManager","chalk","chalk","ora","prompts","path","fs","path","fs","chalk","ora","isComponentInstalled","prompts","resolveTargetPath","chalk","ora","prompts","path","fs","path","fs","chalk","ora","isComponentInstalled","prompts","resolveTargetPath"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/registry.ts","../src/utils/transformer.ts","../src/utils/package-manager.ts","../src/utils/component-checker.ts","../src/utils/project-structure.ts","../src/commands/init.ts","../src/commands/credits.ts","../src/commands/diff.ts","../src/commands/update.ts","../src/commands/list.ts","../src/commands/debug.ts"],"sourcesContent":["#!/usr/bin/env node\r\nimport { Command } from \"commander\";\r\nimport { add } from \"./commands/add.js\";\r\nimport { init } from \"./commands/init.js\";\r\nimport { credits } from \"./commands/credits.js\";\r\nimport { diff } from \"./commands/diff.js\";\r\nimport { update } from \"./commands/update.js\";\r\nimport { list } from \"./commands/list.js\";\r\nimport { debug } from \"./commands/debug.js\";\r\nimport { readFileSync } from \"fs\";\r\nimport { fileURLToPath } from \"url\";\r\nimport { dirname, join } from \"path\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\nconst packageJson = JSON.parse(\r\n readFileSync(join(__dirname, \"../package.json\"), \"utf-8\")\r\n);\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name(\"pittaya\")\r\n .description(\"Add Pittaya UI components to your project\")\r\n .version(packageJson.version);\r\n\r\nprogram\r\n .command(\"init\")\r\n .description(\"Initialize Pittaya UI in your project\")\r\n .option(\"-y, --yes\", \"Skip confirmations and use default values\")\r\n .action(init);\r\n\r\nprogram\r\n .command(\"add\")\r\n .description(\"Add a component to your project\")\r\n .argument(\"[components...]\", \"Component names to add\")\r\n .option(\"-y, --yes\", \"Skip confirmations and overwrite existing files\")\r\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\r\n .option(\"-a, --all\", \"Add all available components\")\r\n .option(\"--add-missing-deps\", \"Automatically install missing dependencies\")\r\n .action(add);\r\n\r\nprogram\r\n .command(\"diff\")\r\n .description(\"Check for component updates\")\r\n .argument(\"[components...]\", \"Component names to check (leave empty for interactive mode)\")\r\n .option(\"-a, --all\", \"Check all installed components\")\r\n .action(diff);\r\n\r\nprogram\r\n .command(\"update\")\r\n .description(\"Update components to latest version\")\r\n .argument(\"[components...]\", \"Component names to update (leave empty for interactive mode)\")\r\n .option(\"-a, --all\", \"Update all installed components\")\r\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\r\n .option(\"-f, --force\", \"Force update even if no changes detected\")\r\n .action(update);\r\n\r\nprogram\r\n .command(\"list\")\r\n .description(\"List available and installed components\")\r\n .option(\"--installed\", \"Show only installed components\")\r\n .option(\"--available\", \"Show only available components\")\r\n .option(\"--json\", \"Output in JSON format\")\r\n .action(list);\r\n\r\nprogram\r\n .command(\"credits\")\r\n .description(\"Show Pittaya UI creators\")\r\n .action(credits);\r\n\r\nprogram\r\n .command(\"debug\")\r\n .description(\"Debug component installation issues\")\r\n .option(\"-c, --component <name>\", \"Component name to debug\")\r\n .action(debug);\r\n\r\nprogram.parse();\r\n\r\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { execa } from \"execa\";\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\nimport { transformImports } from \"../utils/transformer.js\";\nimport { detectPackageManager, checkMissingDependencies } from \"../utils/package-manager.js\";\nimport { isComponentInstalled, resolveTargetPath } from \"../utils/component-checker.js\";\nimport { IAddOptions } from \"../interfaces/IAddOptions\";\nimport { IConfig } from \"../interfaces/IConfig\";\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\n\nexport async function add(components: string[], options: IAddOptions) {\n const cwd = process.cwd();\n const componentsJsonPath = path.join(cwd, \"components.json\");\n\n let config: IConfig;\n try {\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\n config = JSON.parse(configContent);\n } catch (error) {\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\n console.log(\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\n );\n return;\n }\n\n const spinner = ora(\"Fetching available components...\").start();\n let registry;\n try {\n registry = await fetchRegistry();\n spinner.succeed(\"Registry loaded!\");\n } catch (error) {\n spinner.fail(\"Error loading registry\");\n console.error(error);\n return;\n }\n\n if (options.all) {\n components = registry.components\n .filter((comp: any) => comp.type === \"registry:ui\")\n .map((comp: any) => comp.name);\n }\n\n if (components.length === 0) {\n const availableComponents = registry.components\n .filter((comp: any) => comp.type === \"registry:ui\")\n .map((comp: any) => ({\n title: `${comp.name}${comp.description ? ` - ${comp.description}` : \"\"}`,\n value: comp.name,\n }));\n\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select components to add:\",\n choices: availableComponents,\n min: 1,\n });\n\n if (!selected || selected.length === 0) {\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\n return;\n }\n\n components = selected;\n }\n\n console.log(\n chalk.dim(`\\nAdding ${components.length} component(s)...\\n`)\n );\n\n for (const componentName of components) {\n await addComponent(componentName, config, options);\n }\n\n console.log(chalk.green(\"\\n✅ Components added successfully!\\n\"));\n}\n\nasync function addComponent(\n name: string,\n config: IConfig,\n options: IAddOptions\n) {\n const alreadyInstalled = await isComponentInstalled(name, config);\n if (alreadyInstalled && !options.overwrite) {\n console.log(chalk.dim(` ⏭️ ${name} already installed, skipping...`));\n return;\n }\n\n const spinner = ora(`Installing ${chalk.bold(name)}...`).start();\n\n try {\n const component: IRegistryComponent = await getRegistryComponent(name);\n\n if (!component) {\n spinner.fail(`Component \"${name}\" not found in registry.`);\n return;\n }\n\n const packageManager = await detectPackageManager();\n\n if (component.dependencies && component.dependencies.length > 0) {\n const missingDeps = await checkMissingDependencies(component.dependencies);\n\n if (missingDeps.length > 0) {\n spinner.stop();\n\n console.log(chalk.yellow(`\\n⚠️ ${name} requires the following dependencies:\\n`));\n missingDeps.forEach(dep => {\n console.log(chalk.dim(` • ${dep}`));\n });\n console.log();\n\n // If --add-missing-deps was passed, install automatically\n if (options.addMissingDeps) {\n console.log(chalk.dim(\"Installing dependencies automatically...\\n\"));\n } else {\n const { install } = await prompts({\n type: \"confirm\",\n name: \"install\",\n message: \"Do you want to install the dependencies now?\",\n initial: true,\n });\n\n if (!install) {\n console.log(chalk.yellow(\"\\n⚠️ Component not installed. Install the dependencies manually and try again.\\n\"));\n return;\n }\n }\n\n spinner.start(`Installing dependencies for ${name}...`);\n\n try {\n await execa(packageManager, [\n packageManager === \"yarn\" ? \"add\" : \"install\",\n ...missingDeps,\n ]);\n spinner.succeed(`Dependencies installed!`);\n spinner.start(`Installing ${chalk.bold(name)}...`);\n } catch (error) {\n spinner.fail(`Error installing dependencies`);\n console.error(error);\n return;\n }\n }\n }\n\n if (component.registryDependencies && component.registryDependencies.length > 0) {\n spinner.stop();\n console.log(chalk.dim(`\\n 📦 ${name} requires: ${component.registryDependencies.join(\", \")}`));\n\n for (const dep of component.registryDependencies) {\n await addComponent(dep, config, { ...options, yes: true });\n }\n\n console.log(); // Linha em branco\n spinner.start(`Installing ${chalk.bold(name)}...`);\n }\n\n for (const file of component.files) {\n const targetPath = await resolveTargetPath(file.name, component.type, config);\n const filePath = path.join(process.cwd(), targetPath);\n\n const exists = await fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n\n if (exists && !options.overwrite && !options.yes) {\n spinner.stop();\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `${targetPath} already exists. Overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n spinner.warn(`Skipping ${targetPath}`);\n continue;\n }\n spinner.start();\n }\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n const content = transformImports(file.content, config);\n\n await fs.writeFile(filePath, content, \"utf-8\");\n }\n\n spinner.succeed(`${chalk.bold(name)} installed successfully!`);\n } catch (error) {\n spinner.fail(`Error installing ${name}`);\n console.error(error);\n }\n}\n\n","import fetch from \"node-fetch\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\nconst REGISTRY_BASE_URL = \"https://raw.githubusercontent.com/pittaya-ui/cli/main/registry\";\r\n\r\n\r\nexport async function fetchRegistry(): Promise<any> {\r\n try {\r\n const response = await fetch(`${REGISTRY_BASE_URL}/index.json`);\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n return await response.json();\r\n } catch (error) {\r\n console.error(\"Error fetching registry:\", error);\r\n throw new Error(\"Unable to load the registry of components\");\r\n }\r\n}\r\n\r\nexport async function getRegistryComponent(name: string): Promise<IRegistryComponent> {\r\n try {\r\n const response = await fetch(\r\n `${REGISTRY_BASE_URL}/components/${name}.json`\r\n );\r\n\r\n if (!response.ok) {\r\n throw new Error(`Component \"${name}\" not found in registry`);\r\n }\r\n\r\n return await response.json() as IRegistryComponent;\r\n } catch (error: any) {\r\n throw new Error(`Error loading component \"${name}\": ${error.message}`);\r\n }\r\n}\r\n\r\nexport function setRegistryUrl(url: string) {\r\n process.env.PITTAYA_REGISTRY_URL = url;\r\n}\r\n\r\n","\r\n\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\n\r\nexport function transformImports(content: string, config: IConfig): string {\r\n let transformed = content;\r\n\r\n const aliasMap: Record<string, string> = {\r\n \"@/components/ui\": config.aliases.ui,\r\n \"@/components\": config.aliases.components,\r\n \"@/lib/utils\": config.aliases.utils,\r\n \"@/lib\": config.aliases.lib,\r\n \"@/hooks\": config.aliases.hooks,\r\n };\r\n\r\n const sortedAliases = Object.entries(aliasMap).sort(\r\n ([a], [b]) => b.length - a.length\r\n );\r\n\r\n for (const [from, to] of sortedAliases) {\r\n if (from !== to) {\r\n transformed = transformed.replace(\r\n new RegExp(`from [\"']${escapeRegex(from)}`, \"g\"),\r\n `from \"${to}`\r\n );\r\n transformed = transformed.replace(\r\n new RegExp(`import [\"']${escapeRegex(from)}`, \"g\"),\r\n `import \"${to}`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\nfunction escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\n","import fs from \"fs/promises\";\r\nimport path from \"path\";\r\n\r\nexport async function detectPackageManager(): Promise<string> {\r\n try {\r\n await fs.access(\"pnpm-lock.yaml\");\r\n return \"pnpm\";\r\n } catch {}\r\n\r\n try {\r\n await fs.access(\"yarn.lock\");\r\n return \"yarn\";\r\n } catch {}\r\n\r\n try {\r\n await fs.access(\"bun.lockb\");\r\n return \"bun\";\r\n } catch {}\r\n\r\n return \"npm\";\r\n}\r\n\r\nexport async function isPackageInstalled(packageName: string): Promise<boolean> {\r\n const cwd = process.cwd();\r\n\r\n try {\r\n const packageJsonPath = path.join(cwd, \"package.json\");\r\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, \"utf-8\"));\r\n\r\n const allDeps = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n if (allDeps[packageName]) {\r\n return true;\r\n }\r\n } catch {}\r\n\r\n try {\r\n const packagePath = path.join(cwd, \"node_modules\", packageName);\r\n await fs.access(packagePath);\r\n return true;\r\n } catch {}\r\n\r\n return false;\r\n}\r\n\r\nexport async function checkMissingDependencies(\r\n dependencies: string[]\r\n): Promise<string[]> {\r\n const missing: string[] = [];\r\n\r\n for (const dep of dependencies) {\r\n const installed = await isPackageInstalled(dep);\r\n if (!installed) {\r\n missing.push(dep);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n\r\n","import path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { getRegistryComponent } from \"./registry.js\";\r\nimport { IConfig } from \"../interfaces/IConfig.js\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent.js\";\r\nimport { resolveAliasPath } from \"./project-structure.js\";\r\n\r\n/**\r\n * Check if a component is installed in the project\r\n * @param name - The component name/slug\r\n * @param config - The project configuration from components.json\r\n * @returns true if all component files exist, false otherwise\r\n */\r\nexport async function isComponentInstalled(\r\n name: string,\r\n config: IConfig\r\n): Promise<boolean> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) return false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n const exists = await fs\r\n .access(filePath)\r\n .then(() => true)\r\n .catch(() => false);\r\n\r\n if (!exists) return false;\r\n }\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Resolve the target path for a component file based on its type\r\n * @param fileName - The file name\r\n * @param type - The component type (registry:ui, registry:lib, registry:hook)\r\n * @param config - The project configuration\r\n * @returns The resolved file path\r\n */\r\nexport async function resolveTargetPath(\r\n fileName: string,\r\n type: string,\r\n config: IConfig\r\n): Promise<string> {\r\n if (type === \"registry:ui\") {\r\n const resolvedPath = await resolveAliasPath(config.aliases.ui);\r\n return path.join(resolvedPath, fileName);\r\n }\r\n\r\n if (type === \"registry:lib\") {\r\n const resolvedPath = await resolveAliasPath(config.aliases.lib);\r\n return path.join(resolvedPath, fileName);\r\n }\r\n\r\n if (type === \"registry:hook\") {\r\n const resolvedPath = await resolveAliasPath(config.aliases.hooks);\r\n return path.join(resolvedPath, fileName);\r\n }\r\n\r\n return fileName;\r\n}\r\n\r\n","import fs from \"fs/promises\";\r\nimport path from \"path\";\r\n\r\n/**\r\n * Detects if the project uses a \"src/\" directory structure\r\n * by checking for common Next.js directories inside src/\r\n *\r\n * @param cwd - Current working directory (defaults to process.cwd())\r\n * @returns true if project uses src/, false if root structure\r\n */\r\nexport async function hasSrcDirectory(cwd: string = process.cwd()): Promise<boolean> {\r\n try {\r\n // Check if src/ exists\r\n const srcPath = path.join(cwd, \"src\");\r\n await fs.access(srcPath);\r\n\r\n // Verify it's actually being used by checking for common Next.js directories\r\n const commonDirs = [\"app\", \"components\", \"lib\", \"pages\"];\r\n\r\n for (const dir of commonDirs) {\r\n try {\r\n await fs.access(path.join(srcPath, dir));\r\n return true; // Found at least one common directory inside src/\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n try {\r\n const tsconfigPath = path.join(cwd, \"tsconfig.json\");\r\n const tsconfig = JSON.parse(await fs.readFile(tsconfigPath, \"utf-8\"));\r\n\r\n if (tsconfig.compilerOptions?.paths) {\r\n const paths = tsconfig.compilerOptions.paths;\r\n if (paths[\"@/*\"]?.includes(\"./src/*\")) {\r\n return true;\r\n }\r\n }\r\n } catch {\r\n console.error(\"Bro... just in 21st century you not even have a tsconfig.json file in your project. That way you fuck me up :D\");\r\n }\r\n\r\n return false;\r\n } catch {\r\n // Only pretend to be crazy and continue\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Resolves an alias path to an actual file system path\r\n * @param aliasPath - Path with alias (e.g., \"@/components/ui\")\r\n * @param cwd - Current working directory\r\n * @returns Resolved file system path (e.g., \"src/components/ui\" or \"components/ui\")\r\n */\r\nexport async function resolveAliasPath(\r\n aliasPath: string,\r\n cwd: string = process.cwd()\r\n): Promise<string> {\r\n const usesSrc = await hasSrcDirectory(cwd);\r\n const baseDir = usesSrc ? \"src/\" : \"\";\r\n\r\n // Remove @/ prefix and prepend base directory\r\n return aliasPath.replace(/^@\\//, baseDir);\r\n}\r\n\r\n/**\r\n * Gets the default paths configuration based on project structure\r\n * This was necessary due to the fact that the user may not have a src/ directory or a tsconfig.json file.\r\n * @param cwd - Current working directory\r\n * @returns Object with default paths for globals.css, components, utils, etc.\r\n */\r\nexport async function getDefaultPaths(cwd: string = process.cwd()) {\r\n const usesSrc = await hasSrcDirectory(cwd);\r\n const baseDir = usesSrc ? \"src/\" : \"\";\r\n\r\n return {\r\n globalsCss: `${baseDir}app/globals.css`,\r\n components: \"@/components\",\r\n utils: \"@/lib/utils\",\r\n ui: \"@/components/ui\",\r\n lib: \"@/lib\",\r\n hooks: \"@/hooks\",\r\n baseDir,\r\n };\r\n}\r\n\r\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { execa } from \"execa\";\nimport { getDefaultPaths } from \"../utils/project-structure.js\";\n\ninterface InitOptions {\n yes?: boolean;\n}\n\nexport async function init(options: InitOptions) {\n console.log(chalk.bold(\"\\nWelcome to Pittaya UI!\\n\"));\n\n const cwd = process.cwd();\n const componentsJsonPath = path.join(cwd, \"components.json\");\n\n const exists = await fs\n .access(componentsJsonPath)\n .then(() => true)\n .catch(() => false);\n\n if (exists && !options.yes) {\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: \"components.json already exists. Do you want to overwrite it?\",\n initial: false,\n });\n\n if (!overwrite) {\n console.log(chalk.yellow(\"\\n❌ Operation cancelled.\\n\"));\n return;\n }\n }\n\n const defaultPaths = await getDefaultPaths(cwd);\n\n const config = options.yes\n ? {\n style: \"new-york\",\n tailwindCss: defaultPaths.globalsCss,\n rsc: true,\n componentsPath: defaultPaths.components,\n utilsPath: defaultPaths.utils,\n }\n : await prompts([\n {\n type: \"select\",\n name: \"style\",\n message: \"Which style would you like to use?\",\n choices: [\n { title: \"New York\", value: \"new-york\" },\n { title: \"Default\", value: \"default\" },\n { title: \"Recife\", value: \"recife\" },\n ],\n },\n {\n type: \"text\",\n name: \"tailwindCss\",\n message: \"Where is your globals.css file?\",\n initial: defaultPaths.globalsCss,\n },\n {\n type: \"confirm\",\n name: \"rsc\",\n message: \"Use React Server Components?\",\n initial: true,\n },\n {\n type: \"text\",\n name: \"componentsPath\",\n message: \"Path for components?\",\n initial: defaultPaths.components,\n },\n {\n type: \"text\",\n name: \"utilsPath\",\n message: \"Path for utils?\",\n initial: defaultPaths.utils,\n },\n ]);\n\n if (!config.style && !options.yes) {\n console.log(chalk.yellow(\"\\n❌ Operation cancelled.\\n\"));\n return;\n }\n\n const componentsJson = {\n $schema: \"https://raw.githubusercontent.com/pittaya-ui/cli/main/registry/schema.json\",\n style: config.style || \"new-york\",\n rsc: config.rsc ?? true,\n tsx: true,\n tailwind: {\n config: \"tailwind.config.ts\",\n css: config.tailwindCss || \"src/app/globals.css\",\n baseColor: \"neutral\",\n cssVariables: true,\n prefix: \"\",\n },\n aliases: {\n components: config.componentsPath || \"@/components\",\n utils: config.utilsPath || \"@/lib/utils\",\n ui: `${config.componentsPath || \"@/components\"}/pittaya/ui`,\n lib: \"@/lib\",\n hooks: \"@/hooks\",\n },\n iconLibrary: \"lucide\",\n };\n\n const spinner = ora(\"Creating components.json...\").start();\n await fs.writeFile(\n componentsJsonPath,\n JSON.stringify(componentsJson, null, 2)\n );\n spinner.succeed(\"components.json created successfully!\");\n\n const packageManager = await detectPackageManager();\n\n const depsSpinner = ora(\"Installing base dependencies...\").start();\n try {\n await execa(packageManager, [\n packageManager === \"yarn\" ? \"add\" : \"install\",\n \"class-variance-authority\",\n \"clsx\",\n \"tailwind-merge\",\n ]);\n depsSpinner.succeed(\"Dependencies installed!\");\n } catch (error) {\n depsSpinner.fail(\"Error installing dependencies\");\n console.error(error);\n }\n\n console.log(chalk.green(\"\\n✅ Pittaya UI configured successfully!\\n\"));\n console.log(chalk.dim(\"Next steps:\"));\n console.log(\n chalk.dim(\n ` ${chalk.bold(\"npx pittaya add button\")} - Add a component`\n )\n );\n console.log(\n chalk.dim(\n ` ${chalk.bold(\"npx pittaya add --all\")} - Add all components\\n`\n )\n );\n}\n\nasync function detectPackageManager(): Promise<string> {\n try {\n await fs.access(\"pnpm-lock.yaml\");\n return \"pnpm\";\n } catch {}\n\n try {\n await fs.access(\"yarn.lock\");\n return \"yarn\";\n } catch {}\n\n return \"npm\";\n}\n\n","import chalk from \"chalk\";\r\n\r\nexport async function credits() {\r\n console.log(chalk.bold(\"\\nPittaya UI - Creators\\n\"));\r\n\r\n console.log(chalk.cyan(\" • Marcos Bueno\"));\r\n console.log(chalk.cyan(\" • Lucas Ribeiro\"));\r\n console.log(chalk.cyan(\" • Jarbas Gouveia\"));\r\n\r\n console.log(chalk.dim(\"\\n Thank you for using Pittaya UI! ❤️\\n\"));\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport prompts from \"prompts\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\r\nimport { transformImports } from \"../utils/transformer.js\";\r\nimport { isComponentInstalled, resolveTargetPath } from \"../utils/component-checker.js\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\ninterface DiffOptions {\r\n all?: boolean;\r\n}\r\n\r\ninterface ComponentDiff {\r\n name: string;\r\n hasChanges: boolean;\r\n files: FileDiff[];\r\n isInstalled: boolean;\r\n}\r\n\r\ninterface FileDiff {\r\n name: string;\r\n hasChanges: boolean;\r\n isNew: boolean;\r\n isMissing: boolean;\r\n}\r\n\r\nexport async function diff(components: string[], options: DiffOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching registry...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Registry loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n let componentsToCheck: string[] = [];\r\n\r\n if (options.all) {\r\n // Check all installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n componentsToCheck.push(comp);\r\n }\r\n }\r\n\r\n if (componentsToCheck.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n } else if (components.length === 0) {\r\n // Interactive mode - show only installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n const installedComponents = [];\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n installedComponents.push(comp);\r\n }\r\n }\r\n\r\n if (installedComponents.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n const { selected } = await prompts({\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"Select components to check for updates:\",\r\n choices: installedComponents.map(name => ({\r\n title: name,\r\n value: name,\r\n })),\r\n min: 1,\r\n });\r\n\r\n if (!selected || selected.length === 0) {\r\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\r\n return;\r\n }\r\n\r\n componentsToCheck = selected;\r\n } else {\r\n componentsToCheck = components;\r\n }\r\n\r\n console.log(chalk.dim(`\\nChecking ${componentsToCheck.length} component(s)...\\n`));\r\n\r\n const results: ComponentDiff[] = [];\r\n\r\n for (const componentName of componentsToCheck) {\r\n const diffResult = await checkComponentDiff(componentName, config);\r\n if (diffResult) {\r\n results.push(diffResult);\r\n }\r\n }\r\n\r\n // Display results\r\n displayDiffResults(results);\r\n}\r\n\r\nasync function checkComponentDiff(\r\n name: string,\r\n config: IConfig\r\n): Promise<ComponentDiff | null> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) {\r\n console.log(chalk.red(` ❌ Component \"${name}\" not found in registry.`));\r\n return null;\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(name, config);\r\n if (!isInstalled) {\r\n console.log(chalk.dim(` ⏭️ ${name} is not installed, skipping...`));\r\n return null;\r\n }\r\n\r\n const fileDiffs: FileDiff[] = [];\r\n let hasChanges = false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n try {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const registryContent = transformImports(file.content, config);\r\n\r\n const contentMatches = localContent.trim() === registryContent.trim();\r\n\r\n fileDiffs.push({\r\n name: file.name,\r\n hasChanges: !contentMatches,\r\n isNew: false,\r\n isMissing: false,\r\n });\r\n\r\n if (!contentMatches) {\r\n hasChanges = true;\r\n }\r\n } catch (error) {\r\n // File exists check passed but can't read - treat as missing\r\n fileDiffs.push({\r\n name: file.name,\r\n hasChanges: true,\r\n isNew: false,\r\n isMissing: true,\r\n });\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n return {\r\n name,\r\n hasChanges,\r\n files: fileDiffs,\r\n isInstalled: true,\r\n };\r\n } catch (error) {\r\n console.log(chalk.red(` ❌ Error checking ${name}`));\r\n console.error(error);\r\n return null;\r\n }\r\n}\r\n\r\nfunction displayDiffResults(results: ComponentDiff[]) {\r\n const componentsWithChanges = results.filter((r) => r.hasChanges);\r\n const componentsUpToDate = results.filter((r) => !r.hasChanges);\r\n\r\n console.log();\r\n\r\n if (componentsWithChanges.length > 0) {\r\n console.log(chalk.yellow(`📝 Components with updates available (${componentsWithChanges.length}):\\n`));\r\n\r\n for (const result of componentsWithChanges) {\r\n console.log(chalk.yellow(` • ${chalk.bold(result.name)}`));\r\n\r\n for (const file of result.files) {\r\n if (file.hasChanges) {\r\n if (file.isMissing) {\r\n console.log(chalk.red(` └─ ${file.name} (missing locally)`));\r\n } else {\r\n console.log(chalk.dim(` └─ ${file.name} (modified)`));\r\n }\r\n }\r\n }\r\n }\r\n console.log();\r\n console.log(chalk.dim(`Run ${chalk.bold(\"npx pittaya update <component>\")} to update.`));\r\n }\r\n\r\n if (componentsUpToDate.length > 0) {\r\n console.log(chalk.green(`\\n✅ Components up to date (${componentsUpToDate.length}):\\n`));\r\n\r\n for (const result of componentsUpToDate) {\r\n console.log(chalk.dim(` • ${result.name}`));\r\n }\r\n }\r\n\r\n console.log();\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport prompts from \"prompts\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\r\nimport { transformImports } from \"../utils/transformer.js\";\r\nimport { isComponentInstalled, resolveTargetPath } from \"../utils/component-checker.js\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\ninterface UpdateOptions {\r\n all?: boolean;\r\n yes?: boolean;\r\n force?: boolean;\r\n}\r\n\r\ninterface UpdateResult {\r\n name: string;\r\n updated: boolean;\r\n skipped: boolean;\r\n reason?: string;\r\n}\r\n\r\nexport async function update(components: string[], options: UpdateOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching registry...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Registry loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n let componentsToUpdate: string[] = [];\r\n\r\n if (options.all) {\r\n // Update all installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n componentsToUpdate.push(comp);\r\n }\r\n }\r\n\r\n if (componentsToUpdate.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n if (!options.yes && !options.force) {\r\n const { confirm } = await prompts({\r\n type: \"confirm\",\r\n name: \"confirm\",\r\n message: `Update ${componentsToUpdate.length} component(s)?`,\r\n initial: true,\r\n });\r\n\r\n if (!confirm) {\r\n console.log(chalk.yellow(\"\\n❌ Update cancelled.\\n\"));\r\n return;\r\n }\r\n }\r\n } else if (components.length === 0) {\r\n // Interactive mode - show only installed components with updates\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n const installedComponents = [];\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n installedComponents.push(comp);\r\n }\r\n }\r\n\r\n if (installedComponents.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n const { selected } = await prompts({\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"Select components to update:\",\r\n choices: installedComponents.map(name => ({\r\n title: name,\r\n value: name,\r\n })),\r\n min: 1,\r\n });\r\n\r\n if (!selected || selected.length === 0) {\r\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\r\n return;\r\n }\r\n\r\n componentsToUpdate = selected;\r\n } else {\r\n componentsToUpdate = components;\r\n }\r\n\r\n console.log(chalk.dim(`\\nChecking ${componentsToUpdate.length} component(s) for updates...\\n`));\r\n\r\n const results: UpdateResult[] = [];\r\n\r\n for (const componentName of componentsToUpdate) {\r\n const result = await updateComponent(componentName, config, options);\r\n results.push(result);\r\n }\r\n\r\n // Display results\r\n displayUpdateResults(results);\r\n}\r\n\r\nasync function hasComponentChanges(\r\n component: IRegistryComponent,\r\n config: IConfig\r\n): Promise<boolean> {\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n try {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const registryContent = transformImports(file.content, config);\r\n\r\n if (localContent.trim() !== registryContent.trim()) {\r\n return true;\r\n }\r\n } catch {\r\n // If we can't read the file, consider it as having changes\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nasync function updateComponent(\r\n name: string,\r\n config: IConfig,\r\n options: UpdateOptions\r\n): Promise<UpdateResult> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) {\r\n console.log(chalk.red(` ❌ Component \"${name}\" not found in registry.`));\r\n return { name, updated: false, skipped: true, reason: \"not found in registry\" };\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(name, config);\r\n if (!isInstalled) {\r\n console.log(chalk.dim(` ⏭️ ${name} is not installed, skipping...`));\r\n return { name, updated: false, skipped: true, reason: \"not installed\" };\r\n }\r\n\r\n // Check if there are changes\r\n const hasChanges = await hasComponentChanges(component, config);\r\n\r\n if (!hasChanges && !options.force) {\r\n console.log(chalk.dim(` ✓ ${name} is already up to date`));\r\n return { name, updated: false, skipped: true, reason: \"already up to date\" };\r\n }\r\n\r\n // Ask for confirmation if not --yes or --force\r\n if (!options.yes && !options.force) {\r\n const { confirm } = await prompts({\r\n type: \"confirm\",\r\n name: \"confirm\",\r\n message: `Update ${chalk.bold(name)}?`,\r\n initial: true,\r\n });\r\n\r\n if (!confirm) {\r\n console.log(chalk.yellow(` ⏭️ Skipped ${name}`));\r\n return { name, updated: false, skipped: true, reason: \"user cancelled\" };\r\n }\r\n }\r\n\r\n const spinner = ora(`Updating ${chalk.bold(name)}...`).start();\r\n\r\n // Update files\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n await fs.mkdir(path.dirname(filePath), { recursive: true });\r\n\r\n const content = transformImports(file.content, config);\r\n await fs.writeFile(filePath, content, \"utf-8\");\r\n }\r\n\r\n spinner.succeed(`${chalk.bold(name)} updated successfully!`);\r\n return { name, updated: true, skipped: false };\r\n } catch (error) {\r\n console.log(chalk.red(` ❌ Error updating ${name}`));\r\n console.error(error);\r\n return { name, updated: false, skipped: true, reason: \"error\" };\r\n }\r\n}\r\n\r\nfunction displayUpdateResults(results: UpdateResult[]) {\r\n const updated = results.filter((r) => r.updated);\r\n const skipped = results.filter((r) => r.skipped);\r\n\r\n console.log();\r\n\r\n if (updated.length > 0) {\r\n console.log(chalk.green(`✅ Updated ${updated.length} component(s):\\n`));\r\n for (const result of updated) {\r\n console.log(chalk.dim(` • ${result.name}`));\r\n }\r\n }\r\n\r\n if (skipped.length > 0) {\r\n console.log(chalk.yellow(`\\n⏭️ Skipped ${skipped.length} component(s):\\n`));\r\n for (const result of skipped) {\r\n const reason = result.reason ? ` (${result.reason})` : \"\";\r\n console.log(chalk.dim(` • ${result.name}${reason}`));\r\n }\r\n }\r\n\r\n console.log();\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry } from \"../utils/registry.js\";\r\nimport { isComponentInstalled } from \"../utils/component-checker.js\";\r\nimport { IConfig } from \"../interfaces/IConfig.js\";\r\nimport { IComponentIndexItem } from \"../interfaces/IComponentIndexItem.js\";\r\n\r\ninterface ListOptions {\r\n installed?: boolean;\r\n available?: boolean;\r\n json?: boolean;\r\n}\r\n\r\ninterface ComponentInfo extends IComponentIndexItem {\r\n installed: boolean;\r\n version?: string;\r\n}\r\n\r\nexport async function list(options: ListOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching components...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Components loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n const allComponents: IComponentIndexItem[] = registry.components || [];\r\n\r\n // Check installation status for each component\r\n const componentsWithStatus: ComponentInfo[] = await Promise.all(\r\n allComponents.map(async (comp) => {\r\n const installed = await isComponentInstalled(comp.slug, config);\r\n return {\r\n ...comp,\r\n installed,\r\n };\r\n })\r\n );\r\n\r\n let filteredComponents = componentsWithStatus;\r\n\r\n if (options.installed) {\r\n filteredComponents = componentsWithStatus.filter(comp => comp.installed);\r\n } else if (options.available) {\r\n filteredComponents = componentsWithStatus.filter(comp => !comp.installed);\r\n }\r\n\r\n\r\n if (options.json) {\r\n console.log(JSON.stringify(filteredComponents, null, 2));\r\n return;\r\n }\r\n\r\n\r\n displayComponents(filteredComponents, options);\r\n}\r\n\r\nfunction displayComponents(components: ComponentInfo[], options: ListOptions) {\r\n if (components.length === 0) {\r\n if (options.installed) {\r\n console.log(chalk.yellow(\"\\n📦 No components installed yet.\\n\"));\r\n console.log(chalk.dim(`Run ${chalk.bold(\"npx pittaya add\")} to install components.\\n`));\r\n } else if (options.available) {\r\n console.log(chalk.yellow(\"\\n✨ All components are already installed!\\n\"));\r\n } else {\r\n console.log(chalk.yellow(\"\\n⚠️ No components found in registry.\\n\"));\r\n }\r\n return;\r\n }\r\n\r\n\r\n const categorized = components.reduce((acc, comp) => {\r\n const category = comp.category || \"Other\";\r\n if (!acc[category]) {\r\n acc[category] = [];\r\n }\r\n acc[category].push(comp);\r\n return acc;\r\n }, {} as Record<string, ComponentInfo[]>);\r\n\r\n console.log(\"\\n\");\r\n\r\n\r\n if (options.installed) {\r\n console.log(chalk.bold.green(\"📦 Installed Components\\n\"));\r\n } else if (options.available) {\r\n console.log(chalk.bold.blue(\"✨ Available Components\\n\"));\r\n } else {\r\n console.log(chalk.bold(\"📋 All Components\\n\"));\r\n }\r\n\r\n Object.entries(categorized).sort().forEach(([category, comps]) => {\r\n console.log(chalk.bold.cyan(`${category}:`));\r\n\r\n comps.forEach(comp => {\r\n const status = comp.installed\r\n ? chalk.green(\"✓\")\r\n : chalk.dim(\"○\");\r\n\r\n const name = comp.installed\r\n ? chalk.bold(comp.slug)\r\n : chalk.dim(comp.slug);\r\n\r\n const description = comp.description\r\n ? chalk.dim(` - ${comp.description}`)\r\n : \"\";\r\n\r\n const deps = comp.dependencies && comp.dependencies.length > 0\r\n ? chalk.dim.yellow(` [${comp.dependencies.length} deps]`)\r\n : \"\";\r\n\r\n const internalDeps = comp.internalDependencies && comp.internalDependencies.length > 0\r\n ? chalk.dim.blue(` [requires: ${comp.internalDependencies.join(\", \")}]`)\r\n : \"\";\r\n\r\n console.log(` ${status} ${name}${description}${deps}${internalDeps}`);\r\n });\r\n\r\n console.log(); // Empty line between categories\r\n });\r\n\r\n const installedCount = components.filter(c => c.installed).length;\r\n const totalCount = components.length;\r\n\r\n if (!options.installed && !options.available) {\r\n console.log(chalk.dim(`Total: ${totalCount} components (${installedCount} installed, ${totalCount - installedCount} available)\\n`));\r\n } else {\r\n console.log(chalk.dim(`Total: ${totalCount} components\\n`));\r\n }\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { getRegistryComponent } from \"../utils/registry.js\";\r\nimport { resolveTargetPath, isComponentInstalled } from \"../utils/component-checker.js\";\r\nimport { hasSrcDirectory, resolveAliasPath } from \"../utils/project-structure.js\";\r\n\r\ninterface DebugOptions {\r\n component?: string;\r\n}\r\n\r\nexport async function debug(options: DebugOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n console.log(chalk.bold(\"\\n🔍 Pittaya UI Debug Information\\n\"));\r\n console.log(chalk.dim(`Working directory: ${cwd}\\n`));\r\n\r\n // Check components.json\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n console.log(chalk.green(\"✅ components.json found\"));\r\n console.log(chalk.dim(` Path: ${componentsJsonPath}`));\r\n } catch (error) {\r\n console.log(chalk.red(\"❌ components.json not found\\n\"));\r\n return;\r\n }\r\n\r\n // Check project structure\r\n const usesSrc = await hasSrcDirectory(cwd);\r\n console.log(chalk.green(`✅ Project structure: ${usesSrc ? \"src/\" : \"root\"}`));\r\n\r\n // Display aliases\r\n console.log(chalk.bold(\"\\n📋 Configured Aliases:\"));\r\n console.log(chalk.dim(` components: ${config.aliases.components}`));\r\n console.log(chalk.dim(` utils: ${config.aliases.utils}`));\r\n console.log(chalk.dim(` ui: ${config.aliases.ui}`));\r\n\r\n // Resolve aliases to actual paths\r\n const resolvedUi = await resolveAliasPath(config.aliases.ui, cwd);\r\n const resolvedLib = await resolveAliasPath(config.aliases.lib || \"@/lib\", cwd);\r\n console.log(chalk.bold(\"\\n📂 Resolved Paths:\"));\r\n console.log(chalk.dim(` UI components: ${resolvedUi}`));\r\n console.log(chalk.dim(` Libraries: ${resolvedLib}`));\r\n\r\n // Check if component specified\r\n if (options.component) {\r\n console.log(chalk.bold(`\\n🔍 Debugging component: ${options.component}\\n`));\r\n\r\n try {\r\n const component = await getRegistryComponent(options.component);\r\n\r\n if (!component) {\r\n console.log(chalk.red(`❌ Component not found in registry\\n`));\r\n return;\r\n }\r\n\r\n console.log(chalk.green(`✅ Component found in registry`));\r\n console.log(chalk.dim(` Type: ${component.type}`));\r\n console.log(chalk.dim(` Files: ${component.files.length}`));\r\n\r\n console.log(chalk.bold(\"\\n📁 Expected Files:\"));\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const fullPath = path.join(cwd, targetPath);\r\n\r\n const exists = await fs.access(fullPath)\r\n .then(() => true)\r\n .catch(() => false);\r\n\r\n const statusIcon = exists ? chalk.green(\"✅\") : chalk.red(\"❌\");\r\n const statusText = exists ? chalk.green(\"EXISTS\") : chalk.red(\"NOT FOUND\");\r\n\r\n console.log(` ${statusIcon} ${file.name}`);\r\n console.log(chalk.dim(` Expected: ${fullPath}`));\r\n console.log(chalk.dim(` Status: ${statusText}`));\r\n\r\n if (!exists) {\r\n // Check if file exists with different name\r\n const dir = path.dirname(fullPath);\r\n try {\r\n const dirExists = await fs.access(dir).then(() => true).catch(() => false);\r\n if (dirExists) {\r\n const filesInDir = await fs.readdir(dir);\r\n const baseName = path.basename(file.name, path.extname(file.name));\r\n const similarFiles = filesInDir.filter(f =>\r\n f.includes(baseName) || f.toLowerCase().includes(baseName.toLowerCase())\r\n );\r\n\r\n if (similarFiles.length > 0) {\r\n console.log(chalk.yellow(` 💡 Similar files found in directory:`));\r\n similarFiles.forEach(f => {\r\n console.log(chalk.dim(` - ${f}`));\r\n });\r\n }\r\n } else {\r\n console.log(chalk.red(` ⚠️ Directory doesn't exist: ${dir}`));\r\n }\r\n } catch (err) {\r\n // Ignore\r\n }\r\n }\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(options.component, config);\r\n console.log(chalk.bold(`\\n📊 Installation Status:`));\r\n if (isInstalled) {\r\n console.log(chalk.green(` ✅ Component is detected as INSTALLED`));\r\n } else {\r\n console.log(chalk.red(` ❌ Component is detected as NOT INSTALLED`));\r\n console.log(chalk.yellow(` 💡 All files must exist for component to be considered installed`));\r\n }\r\n\r\n } catch (error) {\r\n console.log(chalk.red(`\\n❌ Error debugging component:`));\r\n console.error(error);\r\n }\r\n } else {\r\n console.log(chalk.yellow(\"\\n💡 To debug a specific component, use:\"));\r\n console.log(chalk.dim(\" npx pittaya debug --component <name>\\n\"));\r\n }\r\n}\r\n\r\n"],"mappings":"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","names":["path","fs","packageJson","path","fs","fs","path","path","fs","path","fs","chalk","ora","prompts","path","fs","execa","chalk","path","fs","prompts","ora","detectPackageManager","execa","chalk","chalk","ora","prompts","path","fs","path","fs","chalk","ora","prompts","chalk","ora","prompts","path","fs","path","fs","chalk","ora","prompts","chalk","ora","path","fs","path","fs","chalk","ora","chalk","path","fs","path","chalk","fs"]}
|
package/package.json
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "pittaya",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"pittaya": "./dist/index.js"
|
|
8
|
-
},
|
|
9
|
-
"files": [
|
|
10
|
-
"dist"
|
|
11
|
-
],
|
|
12
|
-
"scripts": {
|
|
13
|
-
"dev": "tsup --watch",
|
|
14
|
-
"build": "tsup",
|
|
15
|
-
"pub:release": "npm run build && npm publish --access public"
|
|
16
|
-
},
|
|
17
|
-
"keywords": [
|
|
18
|
-
"pittaya",
|
|
19
|
-
"ui",
|
|
20
|
-
"components",
|
|
21
|
-
"cli",
|
|
22
|
-
"react",
|
|
23
|
-
"nextjs"
|
|
24
|
-
],
|
|
25
|
-
"author": "Pittaya UI",
|
|
26
|
-
"license": "MIT",
|
|
27
|
-
"repository": {
|
|
28
|
-
"type": "git",
|
|
29
|
-
"url": "git+https://github.com/pittaya-ui/ui.git",
|
|
30
|
-
"directory": "packages/cli"
|
|
31
|
-
},
|
|
32
|
-
"bugs": {
|
|
33
|
-
"url": "https://github.com/pittaya-ui/ui/issues"
|
|
34
|
-
},
|
|
35
|
-
"homepage": "https://pittaya-ui.vercel.app",
|
|
36
|
-
"dependencies": {
|
|
37
|
-
"chalk": "^5.3.0",
|
|
38
|
-
"commander": "^12.0.0",
|
|
39
|
-
"execa": "^9.0.0",
|
|
40
|
-
"https-proxy-agent": "^7.0.4",
|
|
41
|
-
"node-fetch": "^3.3.2",
|
|
42
|
-
"ora": "^8.0.1",
|
|
43
|
-
"prompts": "^2.4.2",
|
|
44
|
-
"ts-morph": "^24.0.0",
|
|
45
|
-
"zod": "^3.23.0"
|
|
46
|
-
},
|
|
47
|
-
"devDependencies": {
|
|
48
|
-
"@types/node": "^20.11.0",
|
|
49
|
-
"@types/prompts": "^2.4.9",
|
|
50
|
-
"tsup": "^8.0.1",
|
|
51
|
-
"typescript": "^5.3.3"
|
|
52
|
-
}
|
|
53
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "pittaya",
|
|
3
|
+
"version": "0.0.8",
|
|
4
|
+
"description": "Pittaya UI CLI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"pittaya": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"dev": "tsup --watch",
|
|
14
|
+
"build": "tsup",
|
|
15
|
+
"pub:release": "npm run build && npm publish --access public"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"pittaya",
|
|
19
|
+
"ui",
|
|
20
|
+
"components",
|
|
21
|
+
"cli",
|
|
22
|
+
"react",
|
|
23
|
+
"nextjs"
|
|
24
|
+
],
|
|
25
|
+
"author": "Pittaya UI",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/pittaya-ui/ui.git",
|
|
30
|
+
"directory": "packages/cli"
|
|
31
|
+
},
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/pittaya-ui/ui/issues"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://pittaya-ui.vercel.app",
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"chalk": "^5.3.0",
|
|
38
|
+
"commander": "^12.0.0",
|
|
39
|
+
"execa": "^9.0.0",
|
|
40
|
+
"https-proxy-agent": "^7.0.4",
|
|
41
|
+
"node-fetch": "^3.3.2",
|
|
42
|
+
"ora": "^8.0.1",
|
|
43
|
+
"prompts": "^2.4.2",
|
|
44
|
+
"ts-morph": "^24.0.0",
|
|
45
|
+
"zod": "^3.23.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/node": "^20.11.0",
|
|
49
|
+
"@types/prompts": "^2.4.9",
|
|
50
|
+
"tsup": "^8.0.1",
|
|
51
|
+
"typescript": "^5.3.3"
|
|
52
|
+
}
|
|
53
|
+
}
|