pittaya 0.0.4 → 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 CHANGED
@@ -1,41 +1,108 @@
1
- # Pittaya CLI
1
+ # Pittaya UI
2
2
 
3
- CLI to add Pittaya UI components to your project.
3
+ <div>
4
+ <img src="https://img.shields.io/npm/dy/pittaya" alt="npm downloads" />
5
+ <img src="https://img.shields.io/npm/v/pittaya" alt="npm version" />
6
+ <img src="https://img.shields.io/github/license/pittaya-ui/ui" alt="license" />
7
+ </div>
4
8
 
5
- See the [full documentation](https://github.com/pittaya-ui/cli#readme) for more information.
9
+ A CLI for adding components to your project.
6
10
 
7
- ## Quick Start
11
+ Usage
12
+
13
+ Use the `init` command to initialize dependencies for a new project.
14
+
15
+ The `init` command installs dependencies, adds the `cn` util, configures `tailwind.config.js`, and CSS variables for the project.
8
16
 
9
17
  ```bash
10
- npx pittaya@latest init
11
- npx pittaya@latest add button
18
+ npx pittaya init
12
19
  ```
13
20
 
14
- ### Local Setup
21
+ ## add
22
+
23
+ Use the `add` command to add components to your project.
24
+
25
+ The `add` command adds a component to your project and installs all required dependencies.
15
26
 
16
27
  ```bash
17
- # 1. Clone the repository
18
- git clone git@github.com:pittaya-ui/cli.git
19
- cd cli
28
+ npx pittaya add [component]
29
+ ```
20
30
 
21
- # 2. Install dependencies
22
- npm install
31
+ ### Example
23
32
 
24
- # 3. Build the CLI
25
- cd packages/cli
26
- npm run build
33
+ ```bash
34
+ npx pittaya add orbit-images
35
+ ```
27
36
 
28
- # 4. Link to test
29
- npm link
37
+ You can also run the command without any arguments to view a list of all available components:
30
38
 
31
- # 5. Test in another project
32
- cd /path/to/test-project
33
- pittaya init
34
- pittaya add button
39
+ ```bash
40
+ npx pittaya add
35
41
  ```
36
42
 
37
- ## Links
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
+
89
+ ## Documentation
90
+
91
+ Visit https://pittaya-ui.vercel.app to view the documentation.
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
+
100
+ ## Contributors
101
+
102
+ <a href="https://github.com/pittaya-ui/ui-kit/graphs/contributors">
103
+ <img src="https://contrib.rocks/image?repo=pittaya-ui/ui-kit" />
104
+ </a>
38
105
 
39
- - [Documentation](https://pittaya-ui.vercel.app)
40
- - [GitHub](https://github.com/pittaya-ui/cli)
106
+ ## License
41
107
 
108
+ Licensed under the [MIT license](https://github.com/pittaya-ui/cli/blob/main/LICENSE.md).
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 packageJson = JSON.parse(await fs.readFile(packageJsonPath, "utf-8"));
99
+ const packageJson2 = JSON.parse(await fs.readFile(packageJsonPath, "utf-8"));
100
100
  const allDeps = {
101
- ...packageJson.dependencies,
102
- ...packageJson.devDependencies
101
+ ...packageJson2.dependencies,
102
+ ...packageJson2.devDependencies
103
103
  };
104
104
  if (allDeps[packageName]) {
105
105
  return true;
@@ -182,7 +182,27 @@ Adding ${components.length} component(s)...
182
182
  }
183
183
  console.log(chalk.green("\n\u2705 Components added successfully!\n"));
184
184
  }
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
+ }
185
200
  async function addComponent(name, config, options) {
201
+ const alreadyInstalled = await isComponentInstalled(name, config);
202
+ if (alreadyInstalled && !options.overwrite) {
203
+ console.log(chalk.dim(` \u23ED\uFE0F ${name} already installed, skipping...`));
204
+ return;
205
+ }
186
206
  const spinner = ora(`Installing ${chalk.bold(name)}...`).start();
187
207
  try {
188
208
  const component = await getRegistryComponent(name);
@@ -232,10 +252,14 @@ async function addComponent(name, config, options) {
232
252
  }
233
253
  }
234
254
  if (component.registryDependencies && component.registryDependencies.length > 0) {
255
+ spinner.stop();
256
+ console.log(chalk.dim(`
257
+ \u{1F4E6} ${name} requires: ${component.registryDependencies.join(", ")}`));
235
258
  for (const dep of component.registryDependencies) {
236
- spinner.text = `Installing dependency ${dep}...`;
237
259
  await addComponent(dep, config, { ...options, yes: true });
238
260
  }
261
+ console.log();
262
+ spinner.start(`Installing ${chalk.bold(name)}...`);
239
263
  }
240
264
  for (const file of component.files) {
241
265
  const targetPath = resolveTargetPath(file.name, component.type, config);
@@ -439,11 +463,446 @@ async function credits() {
439
463
  console.log(chalk3.dim("\n Thank you for using Pittaya UI! \u2764\uFE0F\n"));
440
464
  }
441
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
+
442
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
+ );
443
900
  var program = new Command();
444
- program.name("pittaya").description("Add Pittaya UI components to your project").version("0.0.1");
901
+ program.name("pittaya").description("Add Pittaya UI components to your project").version(packageJson.version);
445
902
  program.command("init").description("Initialize Pittaya UI in your project").option("-y, --yes", "Skip confirmations and use default values").action(init);
446
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);
447
906
  program.command("credits").description("Show Pittaya UI creators").action(credits);
448
907
  program.parse();
449
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 addComponent(\n name: string,\n config: IConfig,\n options: IAddOptions\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 for (const dep of component.registryDependencies) {\n spinner.text = `Installing dependency ${dep}...`;\n await addComponent(dep, config, { ...options, yes: true });\n }\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",
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": "SEE LICENSE IN LICENSE",
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
+ }