pittaya 0.0.5 â 0.0.6
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 +54 -1
- package/dist/index.js +439 -4
- package/dist/index.js.map +1 -1
- package/package.json +53 -53
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ Use the `add` command to add components to your project.
|
|
|
25
25
|
The `add` command adds a component to your project and installs all required dependencies.
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
npx pittaya add [component]
|
|
28
|
+
npx pittaya add [component]
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
### Example
|
|
@@ -40,10 +40,63 @@ You can also run the command without any arguments to view a list of all availab
|
|
|
40
40
|
npx pittaya add
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
+
## diff
|
|
44
|
+
|
|
45
|
+
Use the `diff` command to check for component updates.
|
|
46
|
+
|
|
47
|
+
The `diff` command compares your installed components with the registry and shows which ones have updates available.
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
npx pittaya diff [component]
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Example
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Check specific components
|
|
57
|
+
npx pittaya diff button orbit-images
|
|
58
|
+
|
|
59
|
+
# Check all installed components
|
|
60
|
+
npx pittaya diff --all
|
|
61
|
+
|
|
62
|
+
# Interactive mode
|
|
63
|
+
npx pittaya diff
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## update
|
|
67
|
+
|
|
68
|
+
Use the `update` command to update components to the latest version.
|
|
69
|
+
|
|
70
|
+
The `update` command updates your installed components to match the registry version.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npx pittaya update [component]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Example
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Update specific component
|
|
80
|
+
npx pittaya update button
|
|
81
|
+
|
|
82
|
+
# Update all components
|
|
83
|
+
npx pittaya update --all --yes
|
|
84
|
+
|
|
85
|
+
# Force update (even if no changes detected)
|
|
86
|
+
npx pittaya update button --force
|
|
87
|
+
```
|
|
88
|
+
|
|
43
89
|
## Documentation
|
|
44
90
|
|
|
45
91
|
Visit https://pittaya-ui.vercel.app to view the documentation.
|
|
46
92
|
|
|
93
|
+
### Additional Resources
|
|
94
|
+
|
|
95
|
+
- [Roadmap](../../ROADMAP.md) - đşď¸ Future plans and completed features
|
|
96
|
+
- [Changelog](../../CHANGELOG.md) - Version history and changes
|
|
97
|
+
- [Contributing Guide](../../CONTRIBUTING.md) - How to contribute
|
|
98
|
+
- [ADRs](../../docs/adr/README.md) - Architectural decisions
|
|
99
|
+
|
|
47
100
|
## Contributors
|
|
48
101
|
|
|
49
102
|
<a href="https://github.com/pittaya-ui/ui-kit/graphs/contributors">
|
package/dist/index.js
CHANGED
|
@@ -96,10 +96,10 @@ async function isPackageInstalled(packageName) {
|
|
|
96
96
|
const cwd = process.cwd();
|
|
97
97
|
try {
|
|
98
98
|
const packageJsonPath = path.join(cwd, "package.json");
|
|
99
|
-
const
|
|
99
|
+
const packageJson2 = JSON.parse(await fs.readFile(packageJsonPath, "utf-8"));
|
|
100
100
|
const allDeps = {
|
|
101
|
-
...
|
|
102
|
-
...
|
|
101
|
+
...packageJson2.dependencies,
|
|
102
|
+
...packageJson2.devDependencies
|
|
103
103
|
};
|
|
104
104
|
if (allDeps[packageName]) {
|
|
105
105
|
return true;
|
|
@@ -463,11 +463,446 @@ async function credits() {
|
|
|
463
463
|
console.log(chalk3.dim("\n Thank you for using Pittaya UI! \u2764\uFE0F\n"));
|
|
464
464
|
}
|
|
465
465
|
|
|
466
|
+
// src/commands/diff.ts
|
|
467
|
+
import chalk4 from "chalk";
|
|
468
|
+
import ora3 from "ora";
|
|
469
|
+
import prompts3 from "prompts";
|
|
470
|
+
import path4 from "path";
|
|
471
|
+
import fs4 from "fs/promises";
|
|
472
|
+
async function diff(components, options) {
|
|
473
|
+
const cwd = process.cwd();
|
|
474
|
+
const componentsJsonPath = path4.join(cwd, "components.json");
|
|
475
|
+
let config;
|
|
476
|
+
try {
|
|
477
|
+
const configContent = await fs4.readFile(componentsJsonPath, "utf-8");
|
|
478
|
+
config = JSON.parse(configContent);
|
|
479
|
+
} catch (error) {
|
|
480
|
+
console.log(chalk4.red("\n\u274C components.json not found.\n"));
|
|
481
|
+
console.log(
|
|
482
|
+
chalk4.dim(`Run ${chalk4.bold("npx pittaya init")} first.
|
|
483
|
+
`)
|
|
484
|
+
);
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
const spinner = ora3("Fetching registry...").start();
|
|
488
|
+
let registry;
|
|
489
|
+
try {
|
|
490
|
+
registry = await fetchRegistry();
|
|
491
|
+
spinner.succeed("Registry loaded!");
|
|
492
|
+
} catch (error) {
|
|
493
|
+
spinner.fail("Error loading registry");
|
|
494
|
+
console.error(error);
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
let componentsToCheck = [];
|
|
498
|
+
if (options.all) {
|
|
499
|
+
const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
|
|
500
|
+
for (const comp of allComponents) {
|
|
501
|
+
const isInstalled = await isComponentInstalled2(comp, config);
|
|
502
|
+
if (isInstalled) {
|
|
503
|
+
componentsToCheck.push(comp);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
if (componentsToCheck.length === 0) {
|
|
507
|
+
console.log(chalk4.yellow("\n\u26A0\uFE0F No components installed yet.\n"));
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
} else if (components.length === 0) {
|
|
511
|
+
const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
|
|
512
|
+
const installedComponents = [];
|
|
513
|
+
for (const comp of allComponents) {
|
|
514
|
+
const isInstalled = await isComponentInstalled2(comp, config);
|
|
515
|
+
if (isInstalled) {
|
|
516
|
+
installedComponents.push(comp);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
if (installedComponents.length === 0) {
|
|
520
|
+
console.log(chalk4.yellow("\n\u26A0\uFE0F No components installed yet.\n"));
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
const { selected } = await prompts3({
|
|
524
|
+
type: "multiselect",
|
|
525
|
+
name: "selected",
|
|
526
|
+
message: "Select components to check for updates:",
|
|
527
|
+
choices: installedComponents.map((name) => ({
|
|
528
|
+
title: name,
|
|
529
|
+
value: name
|
|
530
|
+
})),
|
|
531
|
+
min: 1
|
|
532
|
+
});
|
|
533
|
+
if (!selected || selected.length === 0) {
|
|
534
|
+
console.log(chalk4.yellow("\n\u274C No components selected.\n"));
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
componentsToCheck = selected;
|
|
538
|
+
} else {
|
|
539
|
+
componentsToCheck = components;
|
|
540
|
+
}
|
|
541
|
+
console.log(chalk4.dim(`
|
|
542
|
+
Checking ${componentsToCheck.length} component(s)...
|
|
543
|
+
`));
|
|
544
|
+
const results = [];
|
|
545
|
+
for (const componentName of componentsToCheck) {
|
|
546
|
+
const diffResult = await checkComponentDiff(componentName, config);
|
|
547
|
+
if (diffResult) {
|
|
548
|
+
results.push(diffResult);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
displayDiffResults(results);
|
|
552
|
+
}
|
|
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
|
+
async function checkComponentDiff(name, config) {
|
|
569
|
+
try {
|
|
570
|
+
const component = await getRegistryComponent(name);
|
|
571
|
+
if (!component) {
|
|
572
|
+
console.log(chalk4.red(` \u274C Component "${name}" not found in registry.`));
|
|
573
|
+
return null;
|
|
574
|
+
}
|
|
575
|
+
const isInstalled = await isComponentInstalled2(name, config);
|
|
576
|
+
if (!isInstalled) {
|
|
577
|
+
console.log(chalk4.dim(` \u23ED\uFE0F ${name} is not installed, skipping...`));
|
|
578
|
+
return null;
|
|
579
|
+
}
|
|
580
|
+
const fileDiffs = [];
|
|
581
|
+
let hasChanges = false;
|
|
582
|
+
for (const file of component.files) {
|
|
583
|
+
const targetPath = resolveTargetPath2(file.name, component.type, config);
|
|
584
|
+
const filePath = path4.join(process.cwd(), targetPath);
|
|
585
|
+
try {
|
|
586
|
+
const localContent = await fs4.readFile(filePath, "utf-8");
|
|
587
|
+
const registryContent = transformImports(file.content, config);
|
|
588
|
+
const contentMatches = localContent.trim() === registryContent.trim();
|
|
589
|
+
fileDiffs.push({
|
|
590
|
+
name: file.name,
|
|
591
|
+
hasChanges: !contentMatches,
|
|
592
|
+
isNew: false,
|
|
593
|
+
isMissing: false
|
|
594
|
+
});
|
|
595
|
+
if (!contentMatches) {
|
|
596
|
+
hasChanges = true;
|
|
597
|
+
}
|
|
598
|
+
} catch (error) {
|
|
599
|
+
fileDiffs.push({
|
|
600
|
+
name: file.name,
|
|
601
|
+
hasChanges: true,
|
|
602
|
+
isNew: false,
|
|
603
|
+
isMissing: true
|
|
604
|
+
});
|
|
605
|
+
hasChanges = true;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
return {
|
|
609
|
+
name,
|
|
610
|
+
hasChanges,
|
|
611
|
+
files: fileDiffs,
|
|
612
|
+
isInstalled: true
|
|
613
|
+
};
|
|
614
|
+
} catch (error) {
|
|
615
|
+
console.log(chalk4.red(` \u274C Error checking ${name}`));
|
|
616
|
+
console.error(error);
|
|
617
|
+
return null;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
function displayDiffResults(results) {
|
|
621
|
+
const componentsWithChanges = results.filter((r) => r.hasChanges);
|
|
622
|
+
const componentsUpToDate = results.filter((r) => !r.hasChanges);
|
|
623
|
+
console.log();
|
|
624
|
+
if (componentsWithChanges.length > 0) {
|
|
625
|
+
console.log(chalk4.yellow(`\u{1F4DD} Components with updates available (${componentsWithChanges.length}):
|
|
626
|
+
`));
|
|
627
|
+
for (const result of componentsWithChanges) {
|
|
628
|
+
console.log(chalk4.yellow(` \u2022 ${chalk4.bold(result.name)}`));
|
|
629
|
+
for (const file of result.files) {
|
|
630
|
+
if (file.hasChanges) {
|
|
631
|
+
if (file.isMissing) {
|
|
632
|
+
console.log(chalk4.red(` \u2514\u2500 ${file.name} (missing locally)`));
|
|
633
|
+
} else {
|
|
634
|
+
console.log(chalk4.dim(` \u2514\u2500 ${file.name} (modified)`));
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
console.log();
|
|
640
|
+
console.log(chalk4.dim(`Run ${chalk4.bold("npx pittaya update <component>")} to update.`));
|
|
641
|
+
}
|
|
642
|
+
if (componentsUpToDate.length > 0) {
|
|
643
|
+
console.log(chalk4.green(`
|
|
644
|
+
\u2705 Components up to date (${componentsUpToDate.length}):
|
|
645
|
+
`));
|
|
646
|
+
for (const result of componentsUpToDate) {
|
|
647
|
+
console.log(chalk4.dim(` \u2022 ${result.name}`));
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
console.log();
|
|
651
|
+
}
|
|
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
|
+
|
|
674
|
+
// src/commands/update.ts
|
|
675
|
+
import chalk5 from "chalk";
|
|
676
|
+
import ora4 from "ora";
|
|
677
|
+
import prompts4 from "prompts";
|
|
678
|
+
import path5 from "path";
|
|
679
|
+
import fs5 from "fs/promises";
|
|
680
|
+
async function update(components, options) {
|
|
681
|
+
const cwd = process.cwd();
|
|
682
|
+
const componentsJsonPath = path5.join(cwd, "components.json");
|
|
683
|
+
let config;
|
|
684
|
+
try {
|
|
685
|
+
const configContent = await fs5.readFile(componentsJsonPath, "utf-8");
|
|
686
|
+
config = JSON.parse(configContent);
|
|
687
|
+
} catch (error) {
|
|
688
|
+
console.log(chalk5.red("\n\u274C components.json not found.\n"));
|
|
689
|
+
console.log(
|
|
690
|
+
chalk5.dim(`Run ${chalk5.bold("npx pittaya init")} first.
|
|
691
|
+
`)
|
|
692
|
+
);
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
const spinner = ora4("Fetching registry...").start();
|
|
696
|
+
let registry;
|
|
697
|
+
try {
|
|
698
|
+
registry = await fetchRegistry();
|
|
699
|
+
spinner.succeed("Registry loaded!");
|
|
700
|
+
} catch (error) {
|
|
701
|
+
spinner.fail("Error loading registry");
|
|
702
|
+
console.error(error);
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
let componentsToUpdate = [];
|
|
706
|
+
if (options.all) {
|
|
707
|
+
const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
|
|
708
|
+
for (const comp of allComponents) {
|
|
709
|
+
const isInstalled = await isComponentInstalled3(comp, config);
|
|
710
|
+
if (isInstalled) {
|
|
711
|
+
componentsToUpdate.push(comp);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
if (componentsToUpdate.length === 0) {
|
|
715
|
+
console.log(chalk5.yellow("\n\u26A0\uFE0F No components installed yet.\n"));
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
718
|
+
if (!options.yes && !options.force) {
|
|
719
|
+
const { confirm } = await prompts4({
|
|
720
|
+
type: "confirm",
|
|
721
|
+
name: "confirm",
|
|
722
|
+
message: `Update ${componentsToUpdate.length} component(s)?`,
|
|
723
|
+
initial: true
|
|
724
|
+
});
|
|
725
|
+
if (!confirm) {
|
|
726
|
+
console.log(chalk5.yellow("\n\u274C Update cancelled.\n"));
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
} else if (components.length === 0) {
|
|
731
|
+
const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
|
|
732
|
+
const installedComponents = [];
|
|
733
|
+
for (const comp of allComponents) {
|
|
734
|
+
const isInstalled = await isComponentInstalled3(comp, config);
|
|
735
|
+
if (isInstalled) {
|
|
736
|
+
installedComponents.push(comp);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
if (installedComponents.length === 0) {
|
|
740
|
+
console.log(chalk5.yellow("\n\u26A0\uFE0F No components installed yet.\n"));
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
const { selected } = await prompts4({
|
|
744
|
+
type: "multiselect",
|
|
745
|
+
name: "selected",
|
|
746
|
+
message: "Select components to update:",
|
|
747
|
+
choices: installedComponents.map((name) => ({
|
|
748
|
+
title: name,
|
|
749
|
+
value: name
|
|
750
|
+
})),
|
|
751
|
+
min: 1
|
|
752
|
+
});
|
|
753
|
+
if (!selected || selected.length === 0) {
|
|
754
|
+
console.log(chalk5.yellow("\n\u274C No components selected.\n"));
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
componentsToUpdate = selected;
|
|
758
|
+
} else {
|
|
759
|
+
componentsToUpdate = components;
|
|
760
|
+
}
|
|
761
|
+
console.log(chalk5.dim(`
|
|
762
|
+
Checking ${componentsToUpdate.length} component(s) for updates...
|
|
763
|
+
`));
|
|
764
|
+
const results = [];
|
|
765
|
+
for (const componentName of componentsToUpdate) {
|
|
766
|
+
const result = await updateComponent(componentName, config, options);
|
|
767
|
+
results.push(result);
|
|
768
|
+
}
|
|
769
|
+
displayUpdateResults(results);
|
|
770
|
+
}
|
|
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
|
+
async function hasComponentChanges(component, config) {
|
|
787
|
+
for (const file of component.files) {
|
|
788
|
+
const targetPath = resolveTargetPath3(file.name, component.type, config);
|
|
789
|
+
const filePath = path5.join(process.cwd(), targetPath);
|
|
790
|
+
try {
|
|
791
|
+
const localContent = await fs5.readFile(filePath, "utf-8");
|
|
792
|
+
const registryContent = transformImports(file.content, config);
|
|
793
|
+
if (localContent.trim() !== registryContent.trim()) {
|
|
794
|
+
return true;
|
|
795
|
+
}
|
|
796
|
+
} catch {
|
|
797
|
+
return true;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
return false;
|
|
801
|
+
}
|
|
802
|
+
async function updateComponent(name, config, options) {
|
|
803
|
+
try {
|
|
804
|
+
const component = await getRegistryComponent(name);
|
|
805
|
+
if (!component) {
|
|
806
|
+
console.log(chalk5.red(` \u274C Component "${name}" not found in registry.`));
|
|
807
|
+
return { name, updated: false, skipped: true, reason: "not found in registry" };
|
|
808
|
+
}
|
|
809
|
+
const isInstalled = await isComponentInstalled3(name, config);
|
|
810
|
+
if (!isInstalled) {
|
|
811
|
+
console.log(chalk5.dim(` \u23ED\uFE0F ${name} is not installed, skipping...`));
|
|
812
|
+
return { name, updated: false, skipped: true, reason: "not installed" };
|
|
813
|
+
}
|
|
814
|
+
const hasChanges = await hasComponentChanges(component, config);
|
|
815
|
+
if (!hasChanges && !options.force) {
|
|
816
|
+
console.log(chalk5.dim(` \u2713 ${name} is already up to date`));
|
|
817
|
+
return { name, updated: false, skipped: true, reason: "already up to date" };
|
|
818
|
+
}
|
|
819
|
+
if (!options.yes && !options.force) {
|
|
820
|
+
const { confirm } = await prompts4({
|
|
821
|
+
type: "confirm",
|
|
822
|
+
name: "confirm",
|
|
823
|
+
message: `Update ${chalk5.bold(name)}?`,
|
|
824
|
+
initial: true
|
|
825
|
+
});
|
|
826
|
+
if (!confirm) {
|
|
827
|
+
console.log(chalk5.yellow(` \u23ED\uFE0F Skipped ${name}`));
|
|
828
|
+
return { name, updated: false, skipped: true, reason: "user cancelled" };
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
const spinner = ora4(`Updating ${chalk5.bold(name)}...`).start();
|
|
832
|
+
for (const file of component.files) {
|
|
833
|
+
const targetPath = resolveTargetPath3(file.name, component.type, config);
|
|
834
|
+
const filePath = path5.join(process.cwd(), targetPath);
|
|
835
|
+
await fs5.mkdir(path5.dirname(filePath), { recursive: true });
|
|
836
|
+
const content = transformImports(file.content, config);
|
|
837
|
+
await fs5.writeFile(filePath, content, "utf-8");
|
|
838
|
+
}
|
|
839
|
+
spinner.succeed(`${chalk5.bold(name)} updated successfully!`);
|
|
840
|
+
return { name, updated: true, skipped: false };
|
|
841
|
+
} catch (error) {
|
|
842
|
+
console.log(chalk5.red(` \u274C Error updating ${name}`));
|
|
843
|
+
console.error(error);
|
|
844
|
+
return { name, updated: false, skipped: true, reason: "error" };
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
function displayUpdateResults(results) {
|
|
848
|
+
const updated = results.filter((r) => r.updated);
|
|
849
|
+
const skipped = results.filter((r) => r.skipped);
|
|
850
|
+
console.log();
|
|
851
|
+
if (updated.length > 0) {
|
|
852
|
+
console.log(chalk5.green(`\u2705 Updated ${updated.length} component(s):
|
|
853
|
+
`));
|
|
854
|
+
for (const result of updated) {
|
|
855
|
+
console.log(chalk5.dim(` \u2022 ${result.name}`));
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
if (skipped.length > 0) {
|
|
859
|
+
console.log(chalk5.yellow(`
|
|
860
|
+
\u23ED\uFE0F Skipped ${skipped.length} component(s):
|
|
861
|
+
`));
|
|
862
|
+
for (const result of skipped) {
|
|
863
|
+
const reason = result.reason ? ` (${result.reason})` : "";
|
|
864
|
+
console.log(chalk5.dim(` \u2022 ${result.name}${reason}`));
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
console.log();
|
|
868
|
+
}
|
|
869
|
+
function resolveTargetPath3(fileName, type, config) {
|
|
870
|
+
if (type === "registry:ui") {
|
|
871
|
+
return path5.join(
|
|
872
|
+
config.aliases.ui.replace("@/", "src/"),
|
|
873
|
+
fileName
|
|
874
|
+
);
|
|
875
|
+
}
|
|
876
|
+
if (type === "registry:lib") {
|
|
877
|
+
return path5.join(
|
|
878
|
+
config.aliases.lib.replace("@/", "src/"),
|
|
879
|
+
fileName
|
|
880
|
+
);
|
|
881
|
+
}
|
|
882
|
+
if (type === "registry:hook") {
|
|
883
|
+
return path5.join(
|
|
884
|
+
config.aliases.hooks.replace("@/", "src/"),
|
|
885
|
+
fileName
|
|
886
|
+
);
|
|
887
|
+
}
|
|
888
|
+
return fileName;
|
|
889
|
+
}
|
|
890
|
+
|
|
466
891
|
// src/index.ts
|
|
892
|
+
import { readFileSync } from "fs";
|
|
893
|
+
import { fileURLToPath } from "url";
|
|
894
|
+
import { dirname, join } from "path";
|
|
895
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
896
|
+
var __dirname = dirname(__filename);
|
|
897
|
+
var packageJson = JSON.parse(
|
|
898
|
+
readFileSync(join(__dirname, "../package.json"), "utf-8")
|
|
899
|
+
);
|
|
467
900
|
var program = new Command();
|
|
468
|
-
program.name("pittaya").description("Add Pittaya UI components to your project").version(
|
|
901
|
+
program.name("pittaya").description("Add Pittaya UI components to your project").version(packageJson.version);
|
|
469
902
|
program.command("init").description("Initialize Pittaya UI in your project").option("-y, --yes", "Skip confirmations and use default values").action(init);
|
|
470
903
|
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
|
+
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
|
+
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);
|
|
471
906
|
program.command("credits").description("Show Pittaya UI creators").action(credits);
|
|
472
907
|
program.parse();
|
|
473
908
|
//# 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"],"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\";\n\nconst program = new Command();\n\nprogram\n .name(\"pittaya\")\n .description(\"Add Pittaya UI components to your project\")\n .version(\"0.0.1\");\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(\"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"],"mappings":"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","names":["path","fs","path","fs","chalk","ora","prompts","path","fs","execa","detectPackageManager","chalk"]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "pittaya",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "CLI para adicionar componentes Pittaya UI ao seu projeto",
|
|
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.6",
|
|
4
|
+
"description": "CLI para adicionar componentes Pittaya UI ao seu projeto",
|
|
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
|
+
}
|