pittaya 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -86,6 +86,66 @@ npx pittaya update --all --yes
86
86
  npx pittaya update button --force
87
87
  ```
88
88
 
89
+ ## list
90
+
91
+ Use the `list` command to view all available and installed components.
92
+
93
+ The `list` command shows all components from the registry organized by category with installation status.
94
+
95
+ ```bash
96
+ npx pittaya list
97
+ ```
98
+
99
+ ### Example
100
+
101
+ ```bash
102
+ # List all components
103
+ npx pittaya list
104
+
105
+ # List only installed components
106
+ npx pittaya list --installed
107
+
108
+ # List only available components
109
+ npx pittaya list --available
110
+
111
+ # JSON output for programmatic use
112
+ npx pittaya list --json
113
+ ```
114
+
115
+ ## debug
116
+
117
+ Use the `debug` command to diagnose component installation issues.
118
+
119
+ The `debug` command helps identify why a component is not being detected as installed, showing expected file paths and actual file locations.
120
+
121
+ ```bash
122
+ npx pittaya debug --component [component]
123
+ ```
124
+
125
+ ### Example
126
+
127
+ ```bash
128
+ # Debug general project setup
129
+ npx pittaya debug
130
+
131
+ # Debug specific component
132
+ npx pittaya debug --component installation-section
133
+ ```
134
+
135
+ **What it shows:**
136
+ - Project structure detection (src/ vs root)
137
+ - Resolved alias paths
138
+ - Expected file locations
139
+ - Actual file existence
140
+ - Installation status
141
+ - Similar files found (helps identify naming mismatches)
142
+
143
+ **Common issues it helps diagnose:**
144
+ - File name mismatches (e.g., `InstallationSection.tsx` vs `installation-section.tsx`)
145
+ - Wrong directory structure (e.g., missing `src/` folder)
146
+ - Incorrect `components.json` aliases
147
+ - Components installed in unexpected locations
148
+
89
149
  ## Documentation
90
150
 
91
151
  Visit https://pittaya-ui.vercel.app to view the documentation.
package/dist/index.js CHANGED
@@ -7,8 +7,8 @@ import { Command } from "commander";
7
7
  import chalk from "chalk";
8
8
  import ora from "ora";
9
9
  import prompts from "prompts";
10
- import path2 from "path";
11
- import fs2 from "fs/promises";
10
+ import path4 from "path";
11
+ import fs4 from "fs/promises";
12
12
  import { execa } from "execa";
13
13
 
14
14
  // src/utils/registry.ts
@@ -125,13 +125,101 @@ async function checkMissingDependencies(dependencies) {
125
125
  return missing;
126
126
  }
127
127
 
128
+ // src/utils/component-checker.ts
129
+ import path3 from "path";
130
+ import fs3 from "fs/promises";
131
+
132
+ // src/utils/project-structure.ts
133
+ import fs2 from "fs/promises";
134
+ import path2 from "path";
135
+ async function hasSrcDirectory(cwd = process.cwd()) {
136
+ try {
137
+ const srcPath = path2.join(cwd, "src");
138
+ await fs2.access(srcPath);
139
+ const commonDirs = ["app", "components", "lib", "pages"];
140
+ for (const dir of commonDirs) {
141
+ try {
142
+ await fs2.access(path2.join(srcPath, dir));
143
+ return true;
144
+ } catch {
145
+ continue;
146
+ }
147
+ }
148
+ try {
149
+ const tsconfigPath = path2.join(cwd, "tsconfig.json");
150
+ const tsconfig = JSON.parse(await fs2.readFile(tsconfigPath, "utf-8"));
151
+ if (tsconfig.compilerOptions?.paths) {
152
+ const paths = tsconfig.compilerOptions.paths;
153
+ if (paths["@/*"]?.includes("./src/*")) {
154
+ return true;
155
+ }
156
+ }
157
+ } catch {
158
+ console.error("Bro... just in 21st century you not even have a tsconfig.json file in your project. That way you fuck me up :D");
159
+ }
160
+ return false;
161
+ } catch {
162
+ return false;
163
+ }
164
+ }
165
+ async function resolveAliasPath(aliasPath, cwd = process.cwd()) {
166
+ const usesSrc = await hasSrcDirectory(cwd);
167
+ const baseDir = usesSrc ? "src/" : "";
168
+ return aliasPath.replace(/^@\//, baseDir);
169
+ }
170
+ async function getDefaultPaths(cwd = process.cwd()) {
171
+ const usesSrc = await hasSrcDirectory(cwd);
172
+ const baseDir = usesSrc ? "src/" : "";
173
+ return {
174
+ globalsCss: `${baseDir}app/globals.css`,
175
+ components: "@/components",
176
+ utils: "@/lib/utils",
177
+ ui: "@/components/ui",
178
+ lib: "@/lib",
179
+ hooks: "@/hooks",
180
+ baseDir
181
+ };
182
+ }
183
+
184
+ // src/utils/component-checker.ts
185
+ async function isComponentInstalled(name, config) {
186
+ try {
187
+ const component = await getRegistryComponent(name);
188
+ if (!component) return false;
189
+ for (const file of component.files) {
190
+ const targetPath = await resolveTargetPath(file.name, component.type, config);
191
+ const filePath = path3.join(process.cwd(), targetPath);
192
+ const exists = await fs3.access(filePath).then(() => true).catch(() => false);
193
+ if (!exists) return false;
194
+ }
195
+ return true;
196
+ } catch {
197
+ return false;
198
+ }
199
+ }
200
+ async function resolveTargetPath(fileName, type, config) {
201
+ if (type === "registry:ui") {
202
+ const resolvedPath = await resolveAliasPath(config.aliases.ui);
203
+ return path3.join(resolvedPath, fileName);
204
+ }
205
+ if (type === "registry:lib") {
206
+ const resolvedPath = await resolveAliasPath(config.aliases.lib);
207
+ return path3.join(resolvedPath, fileName);
208
+ }
209
+ if (type === "registry:hook") {
210
+ const resolvedPath = await resolveAliasPath(config.aliases.hooks);
211
+ return path3.join(resolvedPath, fileName);
212
+ }
213
+ return fileName;
214
+ }
215
+
128
216
  // src/commands/add.ts
129
217
  async function add(components, options) {
130
218
  const cwd = process.cwd();
131
- const componentsJsonPath = path2.join(cwd, "components.json");
219
+ const componentsJsonPath = path4.join(cwd, "components.json");
132
220
  let config;
133
221
  try {
134
- const configContent = await fs2.readFile(componentsJsonPath, "utf-8");
222
+ const configContent = await fs4.readFile(componentsJsonPath, "utf-8");
135
223
  config = JSON.parse(configContent);
136
224
  } catch (error) {
137
225
  console.log(chalk.red("\n\u274C components.json not found.\n"));
@@ -182,21 +270,6 @@ Adding ${components.length} component(s)...
182
270
  }
183
271
  console.log(chalk.green("\n\u2705 Components added successfully!\n"));
184
272
  }
185
- async function isComponentInstalled(name, config) {
186
- try {
187
- const component = await getRegistryComponent(name);
188
- if (!component) return false;
189
- for (const file of component.files) {
190
- const targetPath = resolveTargetPath(file.name, component.type, config);
191
- const filePath = path2.join(process.cwd(), targetPath);
192
- const exists = await fs2.access(filePath).then(() => true).catch(() => false);
193
- if (!exists) return false;
194
- }
195
- return true;
196
- } catch {
197
- return false;
198
- }
199
- }
200
273
  async function addComponent(name, config, options) {
201
274
  const alreadyInstalled = await isComponentInstalled(name, config);
202
275
  if (alreadyInstalled && !options.overwrite) {
@@ -262,9 +335,9 @@ async function addComponent(name, config, options) {
262
335
  spinner.start(`Installing ${chalk.bold(name)}...`);
263
336
  }
264
337
  for (const file of component.files) {
265
- const targetPath = resolveTargetPath(file.name, component.type, config);
266
- const filePath = path2.join(process.cwd(), targetPath);
267
- const exists = await fs2.access(filePath).then(() => true).catch(() => false);
338
+ const targetPath = await resolveTargetPath(file.name, component.type, config);
339
+ const filePath = path4.join(process.cwd(), targetPath);
340
+ const exists = await fs4.access(filePath).then(() => true).catch(() => false);
268
341
  if (exists && !options.overwrite && !options.yes) {
269
342
  spinner.stop();
270
343
  const { overwrite } = await prompts({
@@ -279,9 +352,9 @@ async function addComponent(name, config, options) {
279
352
  }
280
353
  spinner.start();
281
354
  }
282
- await fs2.mkdir(path2.dirname(filePath), { recursive: true });
355
+ await fs4.mkdir(path4.dirname(filePath), { recursive: true });
283
356
  const content = transformImports(file.content, config);
284
- await fs2.writeFile(filePath, content, "utf-8");
357
+ await fs4.writeFile(filePath, content, "utf-8");
285
358
  }
286
359
  spinner.succeed(`${chalk.bold(name)} installed successfully!`);
287
360
  } catch (error) {
@@ -289,40 +362,19 @@ async function addComponent(name, config, options) {
289
362
  console.error(error);
290
363
  }
291
364
  }
292
- function resolveTargetPath(fileName, type, config) {
293
- if (type === "registry:ui") {
294
- return path2.join(
295
- config.aliases.ui.replace("@/", "src/"),
296
- fileName
297
- );
298
- }
299
- if (type === "registry:lib") {
300
- return path2.join(
301
- config.aliases.lib.replace("@/", "src/"),
302
- fileName
303
- );
304
- }
305
- if (type === "registry:hook") {
306
- return path2.join(
307
- config.aliases.hooks.replace("@/", "src/"),
308
- fileName
309
- );
310
- }
311
- return fileName;
312
- }
313
365
 
314
366
  // src/commands/init.ts
315
367
  import chalk2 from "chalk";
316
368
  import ora2 from "ora";
317
369
  import prompts2 from "prompts";
318
- import path3 from "path";
319
- import fs3 from "fs/promises";
370
+ import path5 from "path";
371
+ import fs5 from "fs/promises";
320
372
  import { execa as execa2 } from "execa";
321
373
  async function init(options) {
322
374
  console.log(chalk2.bold("\nWelcome to Pittaya UI!\n"));
323
375
  const cwd = process.cwd();
324
- const componentsJsonPath = path3.join(cwd, "components.json");
325
- const exists = await fs3.access(componentsJsonPath).then(() => true).catch(() => false);
376
+ const componentsJsonPath = path5.join(cwd, "components.json");
377
+ const exists = await fs5.access(componentsJsonPath).then(() => true).catch(() => false);
326
378
  if (exists && !options.yes) {
327
379
  const { overwrite } = await prompts2({
328
380
  type: "confirm",
@@ -335,7 +387,14 @@ async function init(options) {
335
387
  return;
336
388
  }
337
389
  }
338
- const config = options.yes ? getDefaultConfig() : await prompts2([
390
+ const defaultPaths = await getDefaultPaths(cwd);
391
+ const config = options.yes ? {
392
+ style: "new-york",
393
+ tailwindCss: defaultPaths.globalsCss,
394
+ rsc: true,
395
+ componentsPath: defaultPaths.components,
396
+ utilsPath: defaultPaths.utils
397
+ } : await prompts2([
339
398
  {
340
399
  type: "select",
341
400
  name: "style",
@@ -350,7 +409,7 @@ async function init(options) {
350
409
  type: "text",
351
410
  name: "tailwindCss",
352
411
  message: "Where is your globals.css file?",
353
- initial: "src/app/globals.css"
412
+ initial: defaultPaths.globalsCss
354
413
  },
355
414
  {
356
415
  type: "confirm",
@@ -362,13 +421,13 @@ async function init(options) {
362
421
  type: "text",
363
422
  name: "componentsPath",
364
423
  message: "Path for components?",
365
- initial: "@/components"
424
+ initial: defaultPaths.components
366
425
  },
367
426
  {
368
427
  type: "text",
369
428
  name: "utilsPath",
370
429
  message: "Path for utils?",
371
- initial: "@/lib/utils"
430
+ initial: defaultPaths.utils
372
431
  }
373
432
  ]);
374
433
  if (!config.style && !options.yes) {
@@ -397,7 +456,7 @@ async function init(options) {
397
456
  iconLibrary: "lucide"
398
457
  };
399
458
  const spinner = ora2("Creating components.json...").start();
400
- await fs3.writeFile(
459
+ await fs5.writeFile(
401
460
  componentsJsonPath,
402
461
  JSON.stringify(componentsJson, null, 2)
403
462
  );
@@ -430,23 +489,14 @@ async function init(options) {
430
489
  )
431
490
  );
432
491
  }
433
- function getDefaultConfig() {
434
- return {
435
- style: "new-york",
436
- tailwindCss: "src/app/globals.css",
437
- rsc: true,
438
- componentsPath: "@/components",
439
- utilsPath: "@/lib/utils"
440
- };
441
- }
442
492
  async function detectPackageManager2() {
443
493
  try {
444
- await fs3.access("pnpm-lock.yaml");
494
+ await fs5.access("pnpm-lock.yaml");
445
495
  return "pnpm";
446
496
  } catch {
447
497
  }
448
498
  try {
449
- await fs3.access("yarn.lock");
499
+ await fs5.access("yarn.lock");
450
500
  return "yarn";
451
501
  } catch {
452
502
  }
@@ -467,14 +517,14 @@ async function credits() {
467
517
  import chalk4 from "chalk";
468
518
  import ora3 from "ora";
469
519
  import prompts3 from "prompts";
470
- import path4 from "path";
471
- import fs4 from "fs/promises";
520
+ import path6 from "path";
521
+ import fs6 from "fs/promises";
472
522
  async function diff(components, options) {
473
523
  const cwd = process.cwd();
474
- const componentsJsonPath = path4.join(cwd, "components.json");
524
+ const componentsJsonPath = path6.join(cwd, "components.json");
475
525
  let config;
476
526
  try {
477
- const configContent = await fs4.readFile(componentsJsonPath, "utf-8");
527
+ const configContent = await fs6.readFile(componentsJsonPath, "utf-8");
478
528
  config = JSON.parse(configContent);
479
529
  } catch (error) {
480
530
  console.log(chalk4.red("\n\u274C components.json not found.\n"));
@@ -498,7 +548,7 @@ async function diff(components, options) {
498
548
  if (options.all) {
499
549
  const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
500
550
  for (const comp of allComponents) {
501
- const isInstalled = await isComponentInstalled2(comp, config);
551
+ const isInstalled = await isComponentInstalled(comp, config);
502
552
  if (isInstalled) {
503
553
  componentsToCheck.push(comp);
504
554
  }
@@ -511,7 +561,7 @@ async function diff(components, options) {
511
561
  const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
512
562
  const installedComponents = [];
513
563
  for (const comp of allComponents) {
514
- const isInstalled = await isComponentInstalled2(comp, config);
564
+ const isInstalled = await isComponentInstalled(comp, config);
515
565
  if (isInstalled) {
516
566
  installedComponents.push(comp);
517
567
  }
@@ -550,21 +600,6 @@ Checking ${componentsToCheck.length} component(s)...
550
600
  }
551
601
  displayDiffResults(results);
552
602
  }
553
- async function isComponentInstalled2(name, config) {
554
- try {
555
- const component = await getRegistryComponent(name);
556
- if (!component) return false;
557
- for (const file of component.files) {
558
- const targetPath = resolveTargetPath2(file.name, component.type, config);
559
- const filePath = path4.join(process.cwd(), targetPath);
560
- const exists = await fs4.access(filePath).then(() => true).catch(() => false);
561
- if (!exists) return false;
562
- }
563
- return true;
564
- } catch {
565
- return false;
566
- }
567
- }
568
603
  async function checkComponentDiff(name, config) {
569
604
  try {
570
605
  const component = await getRegistryComponent(name);
@@ -572,7 +607,7 @@ async function checkComponentDiff(name, config) {
572
607
  console.log(chalk4.red(` \u274C Component "${name}" not found in registry.`));
573
608
  return null;
574
609
  }
575
- const isInstalled = await isComponentInstalled2(name, config);
610
+ const isInstalled = await isComponentInstalled(name, config);
576
611
  if (!isInstalled) {
577
612
  console.log(chalk4.dim(` \u23ED\uFE0F ${name} is not installed, skipping...`));
578
613
  return null;
@@ -580,10 +615,10 @@ async function checkComponentDiff(name, config) {
580
615
  const fileDiffs = [];
581
616
  let hasChanges = false;
582
617
  for (const file of component.files) {
583
- const targetPath = resolveTargetPath2(file.name, component.type, config);
584
- const filePath = path4.join(process.cwd(), targetPath);
618
+ const targetPath = await resolveTargetPath(file.name, component.type, config);
619
+ const filePath = path6.join(process.cwd(), targetPath);
585
620
  try {
586
- const localContent = await fs4.readFile(filePath, "utf-8");
621
+ const localContent = await fs6.readFile(filePath, "utf-8");
587
622
  const registryContent = transformImports(file.content, config);
588
623
  const contentMatches = localContent.trim() === registryContent.trim();
589
624
  fileDiffs.push({
@@ -649,40 +684,19 @@ function displayDiffResults(results) {
649
684
  }
650
685
  console.log();
651
686
  }
652
- function resolveTargetPath2(fileName, type, config) {
653
- if (type === "registry:ui") {
654
- return path4.join(
655
- config.aliases.ui.replace("@/", "src/"),
656
- fileName
657
- );
658
- }
659
- if (type === "registry:lib") {
660
- return path4.join(
661
- config.aliases.lib.replace("@/", "src/"),
662
- fileName
663
- );
664
- }
665
- if (type === "registry:hook") {
666
- return path4.join(
667
- config.aliases.hooks.replace("@/", "src/"),
668
- fileName
669
- );
670
- }
671
- return fileName;
672
- }
673
687
 
674
688
  // src/commands/update.ts
675
689
  import chalk5 from "chalk";
676
690
  import ora4 from "ora";
677
691
  import prompts4 from "prompts";
678
- import path5 from "path";
679
- import fs5 from "fs/promises";
692
+ import path7 from "path";
693
+ import fs7 from "fs/promises";
680
694
  async function update(components, options) {
681
695
  const cwd = process.cwd();
682
- const componentsJsonPath = path5.join(cwd, "components.json");
696
+ const componentsJsonPath = path7.join(cwd, "components.json");
683
697
  let config;
684
698
  try {
685
- const configContent = await fs5.readFile(componentsJsonPath, "utf-8");
699
+ const configContent = await fs7.readFile(componentsJsonPath, "utf-8");
686
700
  config = JSON.parse(configContent);
687
701
  } catch (error) {
688
702
  console.log(chalk5.red("\n\u274C components.json not found.\n"));
@@ -706,7 +720,7 @@ async function update(components, options) {
706
720
  if (options.all) {
707
721
  const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
708
722
  for (const comp of allComponents) {
709
- const isInstalled = await isComponentInstalled3(comp, config);
723
+ const isInstalled = await isComponentInstalled(comp, config);
710
724
  if (isInstalled) {
711
725
  componentsToUpdate.push(comp);
712
726
  }
@@ -731,7 +745,7 @@ async function update(components, options) {
731
745
  const allComponents = registry.components.filter((comp) => comp.type === "registry:ui" || comp.type === "registry:lib").map((comp) => comp.name);
732
746
  const installedComponents = [];
733
747
  for (const comp of allComponents) {
734
- const isInstalled = await isComponentInstalled3(comp, config);
748
+ const isInstalled = await isComponentInstalled(comp, config);
735
749
  if (isInstalled) {
736
750
  installedComponents.push(comp);
737
751
  }
@@ -768,27 +782,12 @@ Checking ${componentsToUpdate.length} component(s) for updates...
768
782
  }
769
783
  displayUpdateResults(results);
770
784
  }
771
- async function isComponentInstalled3(name, config) {
772
- try {
773
- const component = await getRegistryComponent(name);
774
- if (!component) return false;
775
- for (const file of component.files) {
776
- const targetPath = resolveTargetPath3(file.name, component.type, config);
777
- const filePath = path5.join(process.cwd(), targetPath);
778
- const exists = await fs5.access(filePath).then(() => true).catch(() => false);
779
- if (!exists) return false;
780
- }
781
- return true;
782
- } catch {
783
- return false;
784
- }
785
- }
786
785
  async function hasComponentChanges(component, config) {
787
786
  for (const file of component.files) {
788
- const targetPath = resolveTargetPath3(file.name, component.type, config);
789
- const filePath = path5.join(process.cwd(), targetPath);
787
+ const targetPath = await resolveTargetPath(file.name, component.type, config);
788
+ const filePath = path7.join(process.cwd(), targetPath);
790
789
  try {
791
- const localContent = await fs5.readFile(filePath, "utf-8");
790
+ const localContent = await fs7.readFile(filePath, "utf-8");
792
791
  const registryContent = transformImports(file.content, config);
793
792
  if (localContent.trim() !== registryContent.trim()) {
794
793
  return true;
@@ -806,7 +805,7 @@ async function updateComponent(name, config, options) {
806
805
  console.log(chalk5.red(` \u274C Component "${name}" not found in registry.`));
807
806
  return { name, updated: false, skipped: true, reason: "not found in registry" };
808
807
  }
809
- const isInstalled = await isComponentInstalled3(name, config);
808
+ const isInstalled = await isComponentInstalled(name, config);
810
809
  if (!isInstalled) {
811
810
  console.log(chalk5.dim(` \u23ED\uFE0F ${name} is not installed, skipping...`));
812
811
  return { name, updated: false, skipped: true, reason: "not installed" };
@@ -830,11 +829,11 @@ async function updateComponent(name, config, options) {
830
829
  }
831
830
  const spinner = ora4(`Updating ${chalk5.bold(name)}...`).start();
832
831
  for (const file of component.files) {
833
- const targetPath = resolveTargetPath3(file.name, component.type, config);
834
- const filePath = path5.join(process.cwd(), targetPath);
835
- await fs5.mkdir(path5.dirname(filePath), { recursive: true });
832
+ const targetPath = await resolveTargetPath(file.name, component.type, config);
833
+ const filePath = path7.join(process.cwd(), targetPath);
834
+ await fs7.mkdir(path7.dirname(filePath), { recursive: true });
836
835
  const content = transformImports(file.content, config);
837
- await fs5.writeFile(filePath, content, "utf-8");
836
+ await fs7.writeFile(filePath, content, "utf-8");
838
837
  }
839
838
  spinner.succeed(`${chalk5.bold(name)} updated successfully!`);
840
839
  return { name, updated: true, skipped: false };
@@ -866,26 +865,207 @@ function displayUpdateResults(results) {
866
865
  }
867
866
  console.log();
868
867
  }
869
- function resolveTargetPath3(fileName, type, config) {
870
- if (type === "registry:ui") {
871
- return path5.join(
872
- config.aliases.ui.replace("@/", "src/"),
873
- fileName
868
+
869
+ // src/commands/list.ts
870
+ import chalk6 from "chalk";
871
+ import ora5 from "ora";
872
+ import path8 from "path";
873
+ import fs8 from "fs/promises";
874
+ async function list(options) {
875
+ const cwd = process.cwd();
876
+ const componentsJsonPath = path8.join(cwd, "components.json");
877
+ let config;
878
+ try {
879
+ const configContent = await fs8.readFile(componentsJsonPath, "utf-8");
880
+ config = JSON.parse(configContent);
881
+ } catch (error) {
882
+ console.log(chalk6.red("\n\u274C components.json not found.\n"));
883
+ console.log(
884
+ chalk6.dim(`Run ${chalk6.bold("npx pittaya init")} first.
885
+ `)
874
886
  );
887
+ return;
875
888
  }
876
- if (type === "registry:lib") {
877
- return path5.join(
878
- config.aliases.lib.replace("@/", "src/"),
879
- fileName
880
- );
889
+ const spinner = ora5("Fetching components...").start();
890
+ let registry;
891
+ try {
892
+ registry = await fetchRegistry();
893
+ spinner.succeed("Components loaded!");
894
+ } catch (error) {
895
+ spinner.fail("Error loading registry");
896
+ console.error(error);
897
+ return;
881
898
  }
882
- if (type === "registry:hook") {
883
- return path5.join(
884
- config.aliases.hooks.replace("@/", "src/"),
885
- fileName
886
- );
899
+ const allComponents = registry.components || [];
900
+ const componentsWithStatus = await Promise.all(
901
+ allComponents.map(async (comp) => {
902
+ const installed = await isComponentInstalled(comp.slug, config);
903
+ return {
904
+ ...comp,
905
+ installed
906
+ };
907
+ })
908
+ );
909
+ let filteredComponents = componentsWithStatus;
910
+ if (options.installed) {
911
+ filteredComponents = componentsWithStatus.filter((comp) => comp.installed);
912
+ } else if (options.available) {
913
+ filteredComponents = componentsWithStatus.filter((comp) => !comp.installed);
914
+ }
915
+ if (options.json) {
916
+ console.log(JSON.stringify(filteredComponents, null, 2));
917
+ return;
918
+ }
919
+ displayComponents(filteredComponents, options);
920
+ }
921
+ function displayComponents(components, options) {
922
+ if (components.length === 0) {
923
+ if (options.installed) {
924
+ console.log(chalk6.yellow("\n\u{1F4E6} No components installed yet.\n"));
925
+ console.log(chalk6.dim(`Run ${chalk6.bold("npx pittaya add")} to install components.
926
+ `));
927
+ } else if (options.available) {
928
+ console.log(chalk6.yellow("\n\u2728 All components are already installed!\n"));
929
+ } else {
930
+ console.log(chalk6.yellow("\n\u26A0\uFE0F No components found in registry.\n"));
931
+ }
932
+ return;
933
+ }
934
+ const categorized = components.reduce((acc, comp) => {
935
+ const category = comp.category || "Other";
936
+ if (!acc[category]) {
937
+ acc[category] = [];
938
+ }
939
+ acc[category].push(comp);
940
+ return acc;
941
+ }, {});
942
+ console.log("\n");
943
+ if (options.installed) {
944
+ console.log(chalk6.bold.green("\u{1F4E6} Installed Components\n"));
945
+ } else if (options.available) {
946
+ console.log(chalk6.bold.blue("\u2728 Available Components\n"));
947
+ } else {
948
+ console.log(chalk6.bold("\u{1F4CB} All Components\n"));
949
+ }
950
+ Object.entries(categorized).sort().forEach(([category, comps]) => {
951
+ console.log(chalk6.bold.cyan(`${category}:`));
952
+ comps.forEach((comp) => {
953
+ const status = comp.installed ? chalk6.green("\u2713") : chalk6.dim("\u25CB");
954
+ const name = comp.installed ? chalk6.bold(comp.slug) : chalk6.dim(comp.slug);
955
+ const description = comp.description ? chalk6.dim(` - ${comp.description}`) : "";
956
+ const deps = comp.dependencies && comp.dependencies.length > 0 ? chalk6.dim.yellow(` [${comp.dependencies.length} deps]`) : "";
957
+ const internalDeps = comp.internalDependencies && comp.internalDependencies.length > 0 ? chalk6.dim.blue(` [requires: ${comp.internalDependencies.join(", ")}]`) : "";
958
+ console.log(` ${status} ${name}${description}${deps}${internalDeps}`);
959
+ });
960
+ console.log();
961
+ });
962
+ const installedCount = components.filter((c) => c.installed).length;
963
+ const totalCount = components.length;
964
+ if (!options.installed && !options.available) {
965
+ console.log(chalk6.dim(`Total: ${totalCount} components (${installedCount} installed, ${totalCount - installedCount} available)
966
+ `));
967
+ } else {
968
+ console.log(chalk6.dim(`Total: ${totalCount} components
969
+ `));
970
+ }
971
+ }
972
+
973
+ // src/commands/debug.ts
974
+ import chalk7 from "chalk";
975
+ import path9 from "path";
976
+ import fs9 from "fs/promises";
977
+ async function debug(options) {
978
+ const cwd = process.cwd();
979
+ const componentsJsonPath = path9.join(cwd, "components.json");
980
+ console.log(chalk7.bold("\n\u{1F50D} Pittaya UI Debug Information\n"));
981
+ console.log(chalk7.dim(`Working directory: ${cwd}
982
+ `));
983
+ let config;
984
+ try {
985
+ const configContent = await fs9.readFile(componentsJsonPath, "utf-8");
986
+ config = JSON.parse(configContent);
987
+ console.log(chalk7.green("\u2705 components.json found"));
988
+ console.log(chalk7.dim(` Path: ${componentsJsonPath}`));
989
+ } catch (error) {
990
+ console.log(chalk7.red("\u274C components.json not found\n"));
991
+ return;
992
+ }
993
+ const usesSrc = await hasSrcDirectory(cwd);
994
+ console.log(chalk7.green(`\u2705 Project structure: ${usesSrc ? "src/" : "root"}`));
995
+ console.log(chalk7.bold("\n\u{1F4CB} Configured Aliases:"));
996
+ console.log(chalk7.dim(` components: ${config.aliases.components}`));
997
+ console.log(chalk7.dim(` utils: ${config.aliases.utils}`));
998
+ console.log(chalk7.dim(` ui: ${config.aliases.ui}`));
999
+ const resolvedUi = await resolveAliasPath(config.aliases.ui, cwd);
1000
+ const resolvedLib = await resolveAliasPath(config.aliases.lib || "@/lib", cwd);
1001
+ console.log(chalk7.bold("\n\u{1F4C2} Resolved Paths:"));
1002
+ console.log(chalk7.dim(` UI components: ${resolvedUi}`));
1003
+ console.log(chalk7.dim(` Libraries: ${resolvedLib}`));
1004
+ if (options.component) {
1005
+ console.log(chalk7.bold(`
1006
+ \u{1F50D} Debugging component: ${options.component}
1007
+ `));
1008
+ try {
1009
+ const component = await getRegistryComponent(options.component);
1010
+ if (!component) {
1011
+ console.log(chalk7.red(`\u274C Component not found in registry
1012
+ `));
1013
+ return;
1014
+ }
1015
+ console.log(chalk7.green(`\u2705 Component found in registry`));
1016
+ console.log(chalk7.dim(` Type: ${component.type}`));
1017
+ console.log(chalk7.dim(` Files: ${component.files.length}`));
1018
+ console.log(chalk7.bold("\n\u{1F4C1} Expected Files:"));
1019
+ for (const file of component.files) {
1020
+ const targetPath = await resolveTargetPath(file.name, component.type, config);
1021
+ const fullPath = path9.join(cwd, targetPath);
1022
+ const exists = await fs9.access(fullPath).then(() => true).catch(() => false);
1023
+ const statusIcon = exists ? chalk7.green("\u2705") : chalk7.red("\u274C");
1024
+ const statusText = exists ? chalk7.green("EXISTS") : chalk7.red("NOT FOUND");
1025
+ console.log(` ${statusIcon} ${file.name}`);
1026
+ console.log(chalk7.dim(` Expected: ${fullPath}`));
1027
+ console.log(chalk7.dim(` Status: ${statusText}`));
1028
+ if (!exists) {
1029
+ const dir = path9.dirname(fullPath);
1030
+ try {
1031
+ const dirExists = await fs9.access(dir).then(() => true).catch(() => false);
1032
+ if (dirExists) {
1033
+ const filesInDir = await fs9.readdir(dir);
1034
+ const baseName = path9.basename(file.name, path9.extname(file.name));
1035
+ const similarFiles = filesInDir.filter(
1036
+ (f) => f.includes(baseName) || f.toLowerCase().includes(baseName.toLowerCase())
1037
+ );
1038
+ if (similarFiles.length > 0) {
1039
+ console.log(chalk7.yellow(` \u{1F4A1} Similar files found in directory:`));
1040
+ similarFiles.forEach((f) => {
1041
+ console.log(chalk7.dim(` - ${f}`));
1042
+ });
1043
+ }
1044
+ } else {
1045
+ console.log(chalk7.red(` \u26A0\uFE0F Directory doesn't exist: ${dir}`));
1046
+ }
1047
+ } catch (err) {
1048
+ }
1049
+ }
1050
+ }
1051
+ const isInstalled = await isComponentInstalled(options.component, config);
1052
+ console.log(chalk7.bold(`
1053
+ \u{1F4CA} Installation Status:`));
1054
+ if (isInstalled) {
1055
+ console.log(chalk7.green(` \u2705 Component is detected as INSTALLED`));
1056
+ } else {
1057
+ console.log(chalk7.red(` \u274C Component is detected as NOT INSTALLED`));
1058
+ console.log(chalk7.yellow(` \u{1F4A1} All files must exist for component to be considered installed`));
1059
+ }
1060
+ } catch (error) {
1061
+ console.log(chalk7.red(`
1062
+ \u274C Error debugging component:`));
1063
+ console.error(error);
1064
+ }
1065
+ } else {
1066
+ console.log(chalk7.yellow("\n\u{1F4A1} To debug a specific component, use:"));
1067
+ console.log(chalk7.dim(" npx pittaya debug --component <name>\n"));
887
1068
  }
888
- return fileName;
889
1069
  }
890
1070
 
891
1071
  // src/index.ts
@@ -903,6 +1083,8 @@ program.command("init").description("Initialize Pittaya UI in your project").opt
903
1083
  program.command("add").description("Add a component to your project").argument("[components...]", "Component names to add").option("-y, --yes", "Skip confirmations and overwrite existing files").option("-o, --overwrite", "Overwrite existing files").option("-a, --all", "Add all available components").option("--add-missing-deps", "Automatically install missing dependencies").action(add);
904
1084
  program.command("diff").description("Check for component updates").argument("[components...]", "Component names to check (leave empty for interactive mode)").option("-a, --all", "Check all installed components").action(diff);
905
1085
  program.command("update").description("Update components to latest version").argument("[components...]", "Component names to update (leave empty for interactive mode)").option("-a, --all", "Update all installed components").option("-y, --yes", "Skip confirmation prompts").option("-f, --force", "Force update even if no changes detected").action(update);
1086
+ program.command("list").description("List available and installed components").option("--installed", "Show only installed components").option("--available", "Show only available components").option("--json", "Output in JSON format").action(list);
906
1087
  program.command("credits").description("Show Pittaya UI creators").action(credits);
1088
+ program.command("debug").description("Debug component installation issues").option("-c, --component <name>", "Component name to debug").action(debug);
907
1089
  program.parse();
908
1090
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/registry.ts","../src/utils/transformer.ts","../src/utils/package-manager.ts","../src/commands/init.ts","../src/commands/credits.ts","../src/commands/diff.ts","../src/commands/update.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { add } from \"./commands/add.js\";\nimport { init } from \"./commands/init.js\";\nimport { credits } from \"./commands/credits.js\";\nimport { diff } from \"./commands/diff.js\";\nimport { update } from \"./commands/update.js\";\nimport { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, \"../package.json\"), \"utf-8\")\n);\n\nconst program = new Command();\n\nprogram\n .name(\"pittaya\")\n .description(\"Add Pittaya UI components to your project\")\n .version(packageJson.version);\n\nprogram\n .command(\"init\")\n .description(\"Initialize Pittaya UI in your project\")\n .option(\"-y, --yes\", \"Skip confirmations and use default values\")\n .action(init);\n\nprogram\n .command(\"add\")\n .description(\"Add a component to your project\")\n .argument(\"[components...]\", \"Component names to add\")\n .option(\"-y, --yes\", \"Skip confirmations and overwrite existing files\")\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\n .option(\"-a, --all\", \"Add all available components\")\n .option(\"--add-missing-deps\", \"Automatically install missing dependencies\")\n .action(add);\n\nprogram\n .command(\"diff\")\n .description(\"Check for component updates\")\n .argument(\"[components...]\", \"Component names to check (leave empty for interactive mode)\")\n .option(\"-a, --all\", \"Check all installed components\")\n .action(diff);\n\nprogram\n .command(\"update\")\n .description(\"Update components to latest version\")\n .argument(\"[components...]\", \"Component names to update (leave empty for interactive mode)\")\n .option(\"-a, --all\", \"Update all installed components\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-f, --force\", \"Force update even if no changes detected\")\n .action(update);\n\nprogram\n .command(\"credits\")\n .description(\"Show Pittaya UI creators\")\n .action(credits);\n\nprogram.parse();\n\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { execa } from \"execa\";\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\nimport { transformImports } from \"../utils/transformer.js\";\nimport { detectPackageManager, checkMissingDependencies } from \"../utils/package-manager.js\";\nimport { IAddOptions } from \"../interfaces/IAddOptions\";\nimport { IConfig } from \"../interfaces/IConfig\";\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\n\nexport async function add(components: string[], options: IAddOptions) {\n const cwd = process.cwd();\n const componentsJsonPath = path.join(cwd, \"components.json\");\n\n let config: IConfig;\n try {\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\n config = JSON.parse(configContent);\n } catch (error) {\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\n console.log(\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\n );\n return;\n }\n\n const spinner = ora(\"Fetching available components...\").start();\n let registry;\n try {\n registry = await fetchRegistry();\n spinner.succeed(\"Registry loaded!\");\n } catch (error) {\n spinner.fail(\"Error loading registry\");\n console.error(error);\n return;\n }\n\n if (options.all) {\n components = registry.components\n .filter((comp: any) => comp.type === \"registry:ui\")\n .map((comp: any) => comp.name);\n }\n\n if (components.length === 0) {\n const availableComponents = registry.components\n .filter((comp: any) => comp.type === \"registry:ui\")\n .map((comp: any) => ({\n title: `${comp.name}${comp.description ? ` - ${comp.description}` : \"\"}`,\n value: comp.name,\n }));\n\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select components to add:\",\n choices: availableComponents,\n min: 1,\n });\n\n if (!selected || selected.length === 0) {\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\n return;\n }\n\n components = selected;\n }\n\n console.log(\n chalk.dim(`\\nAdding ${components.length} component(s)...\\n`)\n );\n\n for (const componentName of components) {\n await addComponent(componentName, config, options);\n }\n\n console.log(chalk.green(\"\\n✅ Components added successfully!\\n\"));\n}\n\nasync function isComponentInstalled(\n name: string,\n config: IConfig\n): Promise<boolean> {\n try {\n const component: IRegistryComponent = await getRegistryComponent(name);\n if (!component) return false;\n\n for (const file of component.files) {\n const targetPath = resolveTargetPath(file.name, component.type, config);\n const filePath = path.join(process.cwd(), targetPath);\n\n const exists = await fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n\n if (!exists) return false;\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\nasync function addComponent(\n name: string,\n config: IConfig,\n options: IAddOptions\n) {\n const alreadyInstalled = await isComponentInstalled(name, config);\n if (alreadyInstalled && !options.overwrite) {\n console.log(chalk.dim(` ⏭️ ${name} already installed, skipping...`));\n return;\n }\n\n const spinner = ora(`Installing ${chalk.bold(name)}...`).start();\n\n try {\n const component: IRegistryComponent = await getRegistryComponent(name);\n\n if (!component) {\n spinner.fail(`Component \"${name}\" not found in registry.`);\n return;\n }\n\n const packageManager = await detectPackageManager();\n\n if (component.dependencies && component.dependencies.length > 0) {\n const missingDeps = await checkMissingDependencies(component.dependencies);\n\n if (missingDeps.length > 0) {\n spinner.stop();\n\n console.log(chalk.yellow(`\\n⚠️ ${name} requires the following dependencies:\\n`));\n missingDeps.forEach(dep => {\n console.log(chalk.dim(` • ${dep}`));\n });\n console.log();\n\n // If --add-missing-deps was passed, install automatically\n if (options.addMissingDeps) {\n console.log(chalk.dim(\"Installing dependencies automatically...\\n\"));\n } else {\n const { install } = await prompts({\n type: \"confirm\",\n name: \"install\",\n message: \"Do you want to install the dependencies now?\",\n initial: true,\n });\n\n if (!install) {\n console.log(chalk.yellow(\"\\n⚠️ Component not installed. Install the dependencies manually and try again.\\n\"));\n return;\n }\n }\n\n spinner.start(`Installing dependencies for ${name}...`);\n\n try {\n await execa(packageManager, [\n packageManager === \"yarn\" ? \"add\" : \"install\",\n ...missingDeps,\n ]);\n spinner.succeed(`Dependencies installed!`);\n spinner.start(`Installing ${chalk.bold(name)}...`);\n } catch (error) {\n spinner.fail(`Error installing dependencies`);\n console.error(error);\n return;\n }\n }\n }\n\n if (component.registryDependencies && component.registryDependencies.length > 0) {\n spinner.stop();\n console.log(chalk.dim(`\\n 📦 ${name} requires: ${component.registryDependencies.join(\", \")}`));\n\n for (const dep of component.registryDependencies) {\n await addComponent(dep, config, { ...options, yes: true });\n }\n\n console.log(); // Linha em branco\n spinner.start(`Installing ${chalk.bold(name)}...`);\n }\n\n for (const file of component.files) {\n const targetPath = resolveTargetPath(file.name, component.type, config);\n const filePath = path.join(process.cwd(), targetPath);\n\n const exists = await fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n\n if (exists && !options.overwrite && !options.yes) {\n spinner.stop();\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `${targetPath} already exists. Overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n spinner.warn(`Skipping ${targetPath}`);\n continue;\n }\n spinner.start();\n }\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n const content = transformImports(file.content, config);\n\n await fs.writeFile(filePath, content, \"utf-8\");\n }\n\n spinner.succeed(`${chalk.bold(name)} installed successfully!`);\n } catch (error) {\n spinner.fail(`Error installing ${name}`);\n console.error(error);\n }\n}\n\nfunction resolveTargetPath(\n fileName: string,\n type: string,\n config: IConfig\n): string {\n if (type === \"registry:ui\") {\n return path.join(\n config.aliases.ui.replace(\"@/\", \"src/\"),\n fileName\n );\n }\n\n if (type === \"registry:lib\") {\n return path.join(\n config.aliases.lib.replace(\"@/\", \"src/\"),\n fileName\n );\n }\n\n if (type === \"registry:hook\") {\n return path.join(\n config.aliases.hooks.replace(\"@/\", \"src/\"),\n fileName\n );\n }\n\n return fileName;\n}\n\n","import fetch from \"node-fetch\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\nconst REGISTRY_BASE_URL = \"https://raw.githubusercontent.com/pittaya-ui/cli/main/registry\";\r\n\r\n\r\nexport async function fetchRegistry(): Promise<any> {\r\n try {\r\n const response = await fetch(`${REGISTRY_BASE_URL}/index.json`);\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n return await response.json();\r\n } catch (error) {\r\n console.error(\"Error fetching registry:\", error);\r\n throw new Error(\"Unable to load the registry of components\");\r\n }\r\n}\r\n\r\nexport async function getRegistryComponent(name: string): Promise<IRegistryComponent> {\r\n try {\r\n const response = await fetch(\r\n `${REGISTRY_BASE_URL}/components/${name}.json`\r\n );\r\n\r\n if (!response.ok) {\r\n throw new Error(`Component \"${name}\" not found in registry`);\r\n }\r\n\r\n return await response.json() as IRegistryComponent;\r\n } catch (error: any) {\r\n throw new Error(`Error loading component \"${name}\": ${error.message}`);\r\n }\r\n}\r\n\r\nexport function setRegistryUrl(url: string) {\r\n process.env.PITTAYA_REGISTRY_URL = url;\r\n}\r\n\r\n","\r\n\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\n\r\nexport function transformImports(content: string, config: IConfig): string {\r\n let transformed = content;\r\n\r\n const aliasMap: Record<string, string> = {\r\n \"@/components/ui\": config.aliases.ui,\r\n \"@/components\": config.aliases.components,\r\n \"@/lib/utils\": config.aliases.utils,\r\n \"@/lib\": config.aliases.lib,\r\n \"@/hooks\": config.aliases.hooks,\r\n };\r\n\r\n const sortedAliases = Object.entries(aliasMap).sort(\r\n ([a], [b]) => b.length - a.length\r\n );\r\n\r\n for (const [from, to] of sortedAliases) {\r\n if (from !== to) {\r\n transformed = transformed.replace(\r\n new RegExp(`from [\"']${escapeRegex(from)}`, \"g\"),\r\n `from \"${to}`\r\n );\r\n transformed = transformed.replace(\r\n new RegExp(`import [\"']${escapeRegex(from)}`, \"g\"),\r\n `import \"${to}`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\nfunction escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\n","import fs from \"fs/promises\";\r\nimport path from \"path\";\r\n\r\nexport async function detectPackageManager(): Promise<string> {\r\n try {\r\n await fs.access(\"pnpm-lock.yaml\");\r\n return \"pnpm\";\r\n } catch {}\r\n\r\n try {\r\n await fs.access(\"yarn.lock\");\r\n return \"yarn\";\r\n } catch {}\r\n\r\n try {\r\n await fs.access(\"bun.lockb\");\r\n return \"bun\";\r\n } catch {}\r\n\r\n return \"npm\";\r\n}\r\n\r\nexport async function isPackageInstalled(packageName: string): Promise<boolean> {\r\n const cwd = process.cwd();\r\n\r\n try {\r\n const packageJsonPath = path.join(cwd, \"package.json\");\r\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, \"utf-8\"));\r\n\r\n const allDeps = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n if (allDeps[packageName]) {\r\n return true;\r\n }\r\n } catch {}\r\n\r\n try {\r\n const packagePath = path.join(cwd, \"node_modules\", packageName);\r\n await fs.access(packagePath);\r\n return true;\r\n } catch {}\r\n\r\n return false;\r\n}\r\n\r\nexport async function checkMissingDependencies(\r\n dependencies: string[]\r\n): Promise<string[]> {\r\n const missing: string[] = [];\r\n\r\n for (const dep of dependencies) {\r\n const installed = await isPackageInstalled(dep);\r\n if (!installed) {\r\n missing.push(dep);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n\r\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { execa } from \"execa\";\n\ninterface InitOptions {\n yes?: boolean;\n}\n\nexport async function init(options: InitOptions) {\n console.log(chalk.bold(\"\\nWelcome to Pittaya UI!\\n\"));\n\n const cwd = process.cwd();\n const componentsJsonPath = path.join(cwd, \"components.json\");\n\n const exists = await fs\n .access(componentsJsonPath)\n .then(() => true)\n .catch(() => false);\n\n if (exists && !options.yes) {\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: \"components.json already exists. Do you want to overwrite it?\",\n initial: false,\n });\n\n if (!overwrite) {\n console.log(chalk.yellow(\"\\n❌ Operation cancelled.\\n\"));\n return;\n }\n }\n\n const config = options.yes\n ? getDefaultConfig()\n : await prompts([\n {\n type: \"select\",\n name: \"style\",\n message: \"Which style would you like to use?\",\n choices: [\n { title: \"New York\", value: \"new-york\" },\n { title: \"Default\", value: \"default\" },\n { title: \"Recife\", value: \"recife\" },\n ],\n },\n {\n type: \"text\",\n name: \"tailwindCss\",\n message: \"Where is your globals.css file?\",\n initial: \"src/app/globals.css\",\n },\n {\n type: \"confirm\",\n name: \"rsc\",\n message: \"Use React Server Components?\",\n initial: true,\n },\n {\n type: \"text\",\n name: \"componentsPath\",\n message: \"Path for components?\",\n initial: \"@/components\",\n },\n {\n type: \"text\",\n name: \"utilsPath\",\n message: \"Path for utils?\",\n initial: \"@/lib/utils\",\n },\n ]);\n\n if (!config.style && !options.yes) {\n console.log(chalk.yellow(\"\\n❌ Operation cancelled.\\n\"));\n return;\n }\n\n const componentsJson = {\n $schema: \"https://raw.githubusercontent.com/pittaya-ui/cli/main/registry/schema.json\",\n style: config.style || \"new-york\",\n rsc: config.rsc ?? true,\n tsx: true,\n tailwind: {\n config: \"tailwind.config.ts\",\n css: config.tailwindCss || \"src/app/globals.css\",\n baseColor: \"neutral\",\n cssVariables: true,\n prefix: \"\",\n },\n aliases: {\n components: config.componentsPath || \"@/components\",\n utils: config.utilsPath || \"@/lib/utils\",\n ui: `${config.componentsPath || \"@/components\"}/pittaya/ui`,\n lib: \"@/lib\",\n hooks: \"@/hooks\",\n },\n iconLibrary: \"lucide\",\n };\n\n const spinner = ora(\"Creating components.json...\").start();\n await fs.writeFile(\n componentsJsonPath,\n JSON.stringify(componentsJson, null, 2)\n );\n spinner.succeed(\"components.json created successfully!\");\n\n const packageManager = await detectPackageManager();\n\n const depsSpinner = ora(\"Installing base dependencies...\").start();\n try {\n await execa(packageManager, [\n packageManager === \"yarn\" ? \"add\" : \"install\",\n \"class-variance-authority\",\n \"clsx\",\n \"tailwind-merge\",\n ]);\n depsSpinner.succeed(\"Dependencies installed!\");\n } catch (error) {\n depsSpinner.fail(\"Error installing dependencies\");\n console.error(error);\n }\n\n console.log(chalk.green(\"\\n✅ Pittaya UI configured successfully!\\n\"));\n console.log(chalk.dim(\"Next steps:\"));\n console.log(\n chalk.dim(\n ` ${chalk.bold(\"npx pittaya add button\")} - Add a component`\n )\n );\n console.log(\n chalk.dim(\n ` ${chalk.bold(\"npx pittaya add --all\")} - Add all components\\n`\n )\n );\n}\n\nfunction getDefaultConfig() {\n return {\n style: \"new-york\",\n tailwindCss: \"src/app/globals.css\",\n rsc: true,\n componentsPath: \"@/components\",\n utilsPath: \"@/lib/utils\",\n };\n}\n\nasync function detectPackageManager(): Promise<string> {\n try {\n await fs.access(\"pnpm-lock.yaml\");\n return \"pnpm\";\n } catch {}\n\n try {\n await fs.access(\"yarn.lock\");\n return \"yarn\";\n } catch {}\n\n return \"npm\";\n}\n\n","import chalk from \"chalk\";\r\n\r\nexport async function credits() {\r\n console.log(chalk.bold(\"\\nPittaya UI - Creators\\n\"));\r\n\r\n console.log(chalk.cyan(\" • Marcos Bueno\"));\r\n console.log(chalk.cyan(\" • Lucas Ribeiro\"));\r\n console.log(chalk.cyan(\" • Jarbas Gouveia\"));\r\n\r\n console.log(chalk.dim(\"\\n Thank you for using Pittaya UI! ❤️\\n\"));\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport prompts from \"prompts\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\r\nimport { transformImports } from \"../utils/transformer.js\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\ninterface DiffOptions {\r\n all?: boolean;\r\n}\r\n\r\ninterface ComponentDiff {\r\n name: string;\r\n hasChanges: boolean;\r\n files: FileDiff[];\r\n isInstalled: boolean;\r\n}\r\n\r\ninterface FileDiff {\r\n name: string;\r\n hasChanges: boolean;\r\n isNew: boolean;\r\n isMissing: boolean;\r\n}\r\n\r\nexport async function diff(components: string[], options: DiffOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching registry...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Registry loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n let componentsToCheck: string[] = [];\r\n\r\n if (options.all) {\r\n // Check all installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n componentsToCheck.push(comp);\r\n }\r\n }\r\n\r\n if (componentsToCheck.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n } else if (components.length === 0) {\r\n // Interactive mode - show only installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n const installedComponents = [];\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n installedComponents.push(comp);\r\n }\r\n }\r\n\r\n if (installedComponents.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n const { selected } = await prompts({\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"Select components to check for updates:\",\r\n choices: installedComponents.map(name => ({\r\n title: name,\r\n value: name,\r\n })),\r\n min: 1,\r\n });\r\n\r\n if (!selected || selected.length === 0) {\r\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\r\n return;\r\n }\r\n\r\n componentsToCheck = selected;\r\n } else {\r\n componentsToCheck = components;\r\n }\r\n\r\n console.log(chalk.dim(`\\nChecking ${componentsToCheck.length} component(s)...\\n`));\r\n\r\n const results: ComponentDiff[] = [];\r\n\r\n for (const componentName of componentsToCheck) {\r\n const diffResult = await checkComponentDiff(componentName, config);\r\n if (diffResult) {\r\n results.push(diffResult);\r\n }\r\n }\r\n\r\n // Display results\r\n displayDiffResults(results);\r\n}\r\n\r\nasync function isComponentInstalled(\r\n name: string,\r\n config: IConfig\r\n): Promise<boolean> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) return false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n const exists = await fs\r\n .access(filePath)\r\n .then(() => true)\r\n .catch(() => false);\r\n\r\n if (!exists) return false;\r\n }\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function checkComponentDiff(\r\n name: string,\r\n config: IConfig\r\n): Promise<ComponentDiff | null> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) {\r\n console.log(chalk.red(` ❌ Component \"${name}\" not found in registry.`));\r\n return null;\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(name, config);\r\n if (!isInstalled) {\r\n console.log(chalk.dim(` ⏭️ ${name} is not installed, skipping...`));\r\n return null;\r\n }\r\n\r\n const fileDiffs: FileDiff[] = [];\r\n let hasChanges = false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n try {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const registryContent = transformImports(file.content, config);\r\n\r\n const contentMatches = localContent.trim() === registryContent.trim();\r\n\r\n fileDiffs.push({\r\n name: file.name,\r\n hasChanges: !contentMatches,\r\n isNew: false,\r\n isMissing: false,\r\n });\r\n\r\n if (!contentMatches) {\r\n hasChanges = true;\r\n }\r\n } catch (error) {\r\n // File exists check passed but can't read - treat as missing\r\n fileDiffs.push({\r\n name: file.name,\r\n hasChanges: true,\r\n isNew: false,\r\n isMissing: true,\r\n });\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n return {\r\n name,\r\n hasChanges,\r\n files: fileDiffs,\r\n isInstalled: true,\r\n };\r\n } catch (error) {\r\n console.log(chalk.red(` ❌ Error checking ${name}`));\r\n console.error(error);\r\n return null;\r\n }\r\n}\r\n\r\nfunction displayDiffResults(results: ComponentDiff[]) {\r\n const componentsWithChanges = results.filter((r) => r.hasChanges);\r\n const componentsUpToDate = results.filter((r) => !r.hasChanges);\r\n\r\n console.log();\r\n\r\n if (componentsWithChanges.length > 0) {\r\n console.log(chalk.yellow(`📝 Components with updates available (${componentsWithChanges.length}):\\n`));\r\n\r\n for (const result of componentsWithChanges) {\r\n console.log(chalk.yellow(` • ${chalk.bold(result.name)}`));\r\n\r\n for (const file of result.files) {\r\n if (file.hasChanges) {\r\n if (file.isMissing) {\r\n console.log(chalk.red(` └─ ${file.name} (missing locally)`));\r\n } else {\r\n console.log(chalk.dim(` └─ ${file.name} (modified)`));\r\n }\r\n }\r\n }\r\n }\r\n console.log();\r\n console.log(chalk.dim(`Run ${chalk.bold(\"npx pittaya update <component>\")} to update.`));\r\n }\r\n\r\n if (componentsUpToDate.length > 0) {\r\n console.log(chalk.green(`\\n✅ Components up to date (${componentsUpToDate.length}):\\n`));\r\n\r\n for (const result of componentsUpToDate) {\r\n console.log(chalk.dim(` • ${result.name}`));\r\n }\r\n }\r\n\r\n console.log();\r\n}\r\n\r\nfunction resolveTargetPath(\r\n fileName: string,\r\n type: string,\r\n config: IConfig\r\n): string {\r\n if (type === \"registry:ui\") {\r\n return path.join(\r\n config.aliases.ui.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n if (type === \"registry:lib\") {\r\n return path.join(\r\n config.aliases.lib.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n if (type === \"registry:hook\") {\r\n return path.join(\r\n config.aliases.hooks.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n return fileName;\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport prompts from \"prompts\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\r\nimport { transformImports } from \"../utils/transformer.js\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\ninterface UpdateOptions {\r\n all?: boolean;\r\n yes?: boolean;\r\n force?: boolean;\r\n}\r\n\r\ninterface UpdateResult {\r\n name: string;\r\n updated: boolean;\r\n skipped: boolean;\r\n reason?: string;\r\n}\r\n\r\nexport async function update(components: string[], options: UpdateOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching registry...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Registry loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n let componentsToUpdate: string[] = [];\r\n\r\n if (options.all) {\r\n // Update all installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n componentsToUpdate.push(comp);\r\n }\r\n }\r\n\r\n if (componentsToUpdate.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n if (!options.yes && !options.force) {\r\n const { confirm } = await prompts({\r\n type: \"confirm\",\r\n name: \"confirm\",\r\n message: `Update ${componentsToUpdate.length} component(s)?`,\r\n initial: true,\r\n });\r\n\r\n if (!confirm) {\r\n console.log(chalk.yellow(\"\\n❌ Update cancelled.\\n\"));\r\n return;\r\n }\r\n }\r\n } else if (components.length === 0) {\r\n // Interactive mode - show only installed components with updates\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n const installedComponents = [];\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n installedComponents.push(comp);\r\n }\r\n }\r\n\r\n if (installedComponents.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n const { selected } = await prompts({\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"Select components to update:\",\r\n choices: installedComponents.map(name => ({\r\n title: name,\r\n value: name,\r\n })),\r\n min: 1,\r\n });\r\n\r\n if (!selected || selected.length === 0) {\r\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\r\n return;\r\n }\r\n\r\n componentsToUpdate = selected;\r\n } else {\r\n componentsToUpdate = components;\r\n }\r\n\r\n console.log(chalk.dim(`\\nChecking ${componentsToUpdate.length} component(s) for updates...\\n`));\r\n\r\n const results: UpdateResult[] = [];\r\n\r\n for (const componentName of componentsToUpdate) {\r\n const result = await updateComponent(componentName, config, options);\r\n results.push(result);\r\n }\r\n\r\n // Display results\r\n displayUpdateResults(results);\r\n}\r\n\r\nasync function isComponentInstalled(\r\n name: string,\r\n config: IConfig\r\n): Promise<boolean> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) return false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n const exists = await fs\r\n .access(filePath)\r\n .then(() => true)\r\n .catch(() => false);\r\n\r\n if (!exists) return false;\r\n }\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function hasComponentChanges(\r\n component: IRegistryComponent,\r\n config: IConfig\r\n): Promise<boolean> {\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n try {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const registryContent = transformImports(file.content, config);\r\n\r\n if (localContent.trim() !== registryContent.trim()) {\r\n return true;\r\n }\r\n } catch {\r\n // If we can't read the file, consider it as having changes\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nasync function updateComponent(\r\n name: string,\r\n config: IConfig,\r\n options: UpdateOptions\r\n): Promise<UpdateResult> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) {\r\n console.log(chalk.red(` ❌ Component \"${name}\" not found in registry.`));\r\n return { name, updated: false, skipped: true, reason: \"not found in registry\" };\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(name, config);\r\n if (!isInstalled) {\r\n console.log(chalk.dim(` ⏭️ ${name} is not installed, skipping...`));\r\n return { name, updated: false, skipped: true, reason: \"not installed\" };\r\n }\r\n\r\n // Check if there are changes\r\n const hasChanges = await hasComponentChanges(component, config);\r\n\r\n if (!hasChanges && !options.force) {\r\n console.log(chalk.dim(` ✓ ${name} is already up to date`));\r\n return { name, updated: false, skipped: true, reason: \"already up to date\" };\r\n }\r\n\r\n // Ask for confirmation if not --yes or --force\r\n if (!options.yes && !options.force) {\r\n const { confirm } = await prompts({\r\n type: \"confirm\",\r\n name: \"confirm\",\r\n message: `Update ${chalk.bold(name)}?`,\r\n initial: true,\r\n });\r\n\r\n if (!confirm) {\r\n console.log(chalk.yellow(` ⏭️ Skipped ${name}`));\r\n return { name, updated: false, skipped: true, reason: \"user cancelled\" };\r\n }\r\n }\r\n\r\n const spinner = ora(`Updating ${chalk.bold(name)}...`).start();\r\n\r\n // Update files\r\n for (const file of component.files) {\r\n const targetPath = resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n await fs.mkdir(path.dirname(filePath), { recursive: true });\r\n\r\n const content = transformImports(file.content, config);\r\n await fs.writeFile(filePath, content, \"utf-8\");\r\n }\r\n\r\n spinner.succeed(`${chalk.bold(name)} updated successfully!`);\r\n return { name, updated: true, skipped: false };\r\n } catch (error) {\r\n console.log(chalk.red(` ❌ Error updating ${name}`));\r\n console.error(error);\r\n return { name, updated: false, skipped: true, reason: \"error\" };\r\n }\r\n}\r\n\r\nfunction displayUpdateResults(results: UpdateResult[]) {\r\n const updated = results.filter((r) => r.updated);\r\n const skipped = results.filter((r) => r.skipped);\r\n\r\n console.log();\r\n\r\n if (updated.length > 0) {\r\n console.log(chalk.green(`✅ Updated ${updated.length} component(s):\\n`));\r\n for (const result of updated) {\r\n console.log(chalk.dim(` • ${result.name}`));\r\n }\r\n }\r\n\r\n if (skipped.length > 0) {\r\n console.log(chalk.yellow(`\\n⏭️ Skipped ${skipped.length} component(s):\\n`));\r\n for (const result of skipped) {\r\n const reason = result.reason ? ` (${result.reason})` : \"\";\r\n console.log(chalk.dim(` • ${result.name}${reason}`));\r\n }\r\n }\r\n\r\n console.log();\r\n}\r\n\r\nfunction resolveTargetPath(\r\n fileName: string,\r\n type: string,\r\n config: IConfig\r\n): string {\r\n if (type === \"registry:ui\") {\r\n return path.join(\r\n config.aliases.ui.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n if (type === \"registry:lib\") {\r\n return path.join(\r\n config.aliases.lib.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n if (type === \"registry:hook\") {\r\n return path.join(\r\n config.aliases.hooks.replace(\"@/\", \"src/\"),\r\n fileName\r\n );\r\n }\r\n\r\n return fileName;\r\n}\r\n\r\n"],"mappings":";;;AACA,SAAS,eAAe;;;ACDxB,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,OAAO,aAAa;AACpB,OAAOA,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,aAAa;;;ACLtB,OAAO,WAAW;AAGlB,IAAM,oBAAoB;AAG1B,eAAsB,gBAA8B;AAClD,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,aAAa;AAC9D,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,IACnE;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAEA,eAAsB,qBAAqB,MAA2C;AACpF,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,iBAAiB,eAAe,IAAI;AAAA,IACzC;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,cAAc,IAAI,yBAAyB;AAAA,IAC7D;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,OAAY;AACnB,UAAM,IAAI,MAAM,4BAA4B,IAAI,MAAM,MAAM,OAAO,EAAE;AAAA,EACvE;AACF;;;AC7BO,SAAS,iBAAiB,SAAiB,QAAyB;AACzE,MAAI,cAAc;AAElB,QAAM,WAAmC;AAAA,IACvC,mBAAmB,OAAO,QAAQ;AAAA,IAClC,gBAAgB,OAAO,QAAQ;AAAA,IAC/B,eAAe,OAAO,QAAQ;AAAA,IAC9B,SAAS,OAAO,QAAQ;AAAA,IACxB,WAAW,OAAO,QAAQ;AAAA,EAC5B;AAEA,QAAM,gBAAgB,OAAO,QAAQ,QAAQ,EAAE;AAAA,IAC7C,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE;AAAA,EAC7B;AAEA,aAAW,CAAC,MAAM,EAAE,KAAK,eAAe;AACtC,QAAI,SAAS,IAAI;AACf,oBAAc,YAAY;AAAA,QACxB,IAAI,OAAO,YAAY,YAAY,IAAI,CAAC,IAAI,GAAG;AAAA,QAC/C,SAAS,EAAE;AAAA,MACb;AACA,oBAAc,YAAY;AAAA,QACxB,IAAI,OAAO,cAAc,YAAY,IAAI,CAAC,IAAI,GAAG;AAAA,QACjD,WAAW,EAAE;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;;;ACrCA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,eAAsB,uBAAwC;AAC5D,MAAI;AACF,UAAM,GAAG,OAAO,gBAAgB;AAChC,WAAO;AAAA,EACT,QAAQ;AAAA,EAAC;AAET,MAAI;AACF,UAAM,GAAG,OAAO,WAAW;AAC3B,WAAO;AAAA,EACT,QAAQ;AAAA,EAAC;AAET,MAAI;AACF,UAAM,GAAG,OAAO,WAAW;AAC3B,WAAO;AAAA,EACT,QAAQ;AAAA,EAAC;AAET,SAAO;AACT;AAEA,eAAsB,mBAAmB,aAAuC;AAC9E,QAAM,MAAM,QAAQ,IAAI;AAExB,MAAI;AACF,UAAM,kBAAkB,KAAK,KAAK,KAAK,cAAc;AACrD,UAAMC,eAAc,KAAK,MAAM,MAAM,GAAG,SAAS,iBAAiB,OAAO,CAAC;AAE1E,UAAM,UAAU;AAAA,MACd,GAAGA,aAAY;AAAA,MACf,GAAGA,aAAY;AAAA,IACjB;AAEA,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAAC;AAET,MAAI;AACF,UAAM,cAAc,KAAK,KAAK,KAAK,gBAAgB,WAAW;AAC9D,UAAM,GAAG,OAAO,WAAW;AAC3B,WAAO;AAAA,EACT,QAAQ;AAAA,EAAC;AAET,SAAO;AACT;AAEA,eAAsB,yBACpB,cACmB;AACnB,QAAM,UAAoB,CAAC;AAE3B,aAAW,OAAO,cAAc;AAC9B,UAAM,YAAY,MAAM,mBAAmB,GAAG;AAC9C,QAAI,CAAC,WAAW;AACd,cAAQ,KAAK,GAAG;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;;;AHhDA,eAAsB,IAAI,YAAsB,SAAsB;AACpE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,qBAAqBC,MAAK,KAAK,KAAK,iBAAiB;AAE3D,MAAI;AACJ,MAAI;AACF,UAAM,gBAAgB,MAAMC,IAAG,SAAS,oBAAoB,OAAO;AACnE,aAAS,KAAK,MAAM,aAAa;AAAA,EACnC,SAAS,OAAO;AACd,YAAQ,IAAI,MAAM,IAAI,uCAAkC,CAAC;AACzD,YAAQ;AAAA,MACN,MAAM,IAAI,OAAO,MAAM,KAAK,kBAAkB,CAAC;AAAA,CAAW;AAAA,IAC5D;AACA;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,kCAAkC,EAAE,MAAM;AAC9D,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,cAAc;AAC/B,YAAQ,QAAQ,kBAAkB;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ,KAAK,wBAAwB;AACrC,YAAQ,MAAM,KAAK;AACnB;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK;AACf,iBAAa,SAAS,WACnB,OAAO,CAAC,SAAc,KAAK,SAAS,aAAa,EACjD,IAAI,CAAC,SAAc,KAAK,IAAI;AAAA,EACjC;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,sBAAsB,SAAS,WAClC,OAAO,CAAC,SAAc,KAAK,SAAS,aAAa,EACjD,IAAI,CAAC,UAAe;AAAA,MACnB,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,cAAc,MAAM,KAAK,WAAW,KAAK,EAAE;AAAA,MACtE,OAAO,KAAK;AAAA,IACd,EAAE;AAEJ,UAAM,EAAE,SAAS,IAAI,MAAM,QAAQ;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,KAAK;AAAA,IACP,CAAC;AAED,QAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,cAAQ,IAAI,MAAM,OAAO,oCAA+B,CAAC;AACzD;AAAA,IACF;AAEA,iBAAa;AAAA,EACf;AAEA,UAAQ;AAAA,IACN,MAAM,IAAI;AAAA,SAAY,WAAW,MAAM;AAAA,CAAoB;AAAA,EAC7D;AAEA,aAAW,iBAAiB,YAAY;AACtC,UAAM,aAAa,eAAe,QAAQ,OAAO;AAAA,EACnD;AAEA,UAAQ,IAAI,MAAM,MAAM,2CAAsC,CAAC;AACjE;AAEA,eAAe,qBACb,MACA,QACkB;AAClB,MAAI;AACF,UAAM,YAAgC,MAAM,qBAAqB,IAAI;AACrE,QAAI,CAAC,UAAW,QAAO;AAEvB,eAAW,QAAQ,UAAU,OAAO;AAClC,YAAM,aAAa,kBAAkB,KAAK,MAAM,UAAU,MAAM,MAAM;AACtE,YAAM,WAAWD,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AAEpD,YAAM,SAAS,MAAMC,IAClB,OAAO,QAAQ,EACf,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAEpB,UAAI,CAAC,OAAQ,QAAO;AAAA,IACtB;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,aACb,MACA,QACA,SACA;AACA,QAAM,mBAAmB,MAAM,qBAAqB,MAAM,MAAM;AAChE,MAAI,oBAAoB,CAAC,QAAQ,WAAW;AAC1C,YAAQ,IAAI,MAAM,IAAI,oBAAU,IAAI,iCAAiC,CAAC;AACtE;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,cAAc,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM;AAE/D,MAAI;AACF,UAAM,YAAgC,MAAM,qBAAqB,IAAI;AAErE,QAAI,CAAC,WAAW;AACd,cAAQ,KAAK,cAAc,IAAI,0BAA0B;AACzD;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,qBAAqB;AAElD,QAAI,UAAU,gBAAgB,UAAU,aAAa,SAAS,GAAG;AAC/D,YAAM,cAAc,MAAM,yBAAyB,UAAU,YAAY;AAEzE,UAAI,YAAY,SAAS,GAAG;AAC1B,gBAAQ,KAAK;AAEb,gBAAQ,IAAI,MAAM,OAAO;AAAA,gBAAS,IAAI;AAAA,CAAyC,CAAC;AAChF,oBAAY,QAAQ,SAAO;AACzB,kBAAQ,IAAI,MAAM,IAAI,YAAO,GAAG,EAAE,CAAC;AAAA,QACrC,CAAC;AACD,gBAAQ,IAAI;AAGZ,YAAI,QAAQ,gBAAgB;AAC1B,kBAAQ,IAAI,MAAM,IAAI,4CAA4C,CAAC;AAAA,QACrE,OAAO;AACL,gBAAM,EAAE,QAAQ,IAAI,MAAM,QAAQ;AAAA,YAChC,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AAED,cAAI,CAAC,SAAS;AACZ,oBAAQ,IAAI,MAAM,OAAO,6FAAmF,CAAC;AAC7G;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,MAAM,+BAA+B,IAAI,KAAK;AAEtD,YAAI;AACF,gBAAM,MAAM,gBAAgB;AAAA,YAC1B,mBAAmB,SAAS,QAAQ;AAAA,YACpC,GAAG;AAAA,UACL,CAAC;AACD,kBAAQ,QAAQ,yBAAyB;AACzC,kBAAQ,MAAM,cAAc,MAAM,KAAK,IAAI,CAAC,KAAK;AAAA,QACnD,SAAS,OAAO;AACd,kBAAQ,KAAK,+BAA+B;AAC5C,kBAAQ,MAAM,KAAK;AACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,wBAAwB,UAAU,qBAAqB,SAAS,GAAG;AAC/E,cAAQ,KAAK;AACb,cAAQ,IAAI,MAAM,IAAI;AAAA,eAAW,IAAI,cAAc,UAAU,qBAAqB,KAAK,IAAI,CAAC,EAAE,CAAC;AAE/F,iBAAW,OAAO,UAAU,sBAAsB;AAChD,cAAM,aAAa,KAAK,QAAQ,EAAE,GAAG,SAAS,KAAK,KAAK,CAAC;AAAA,MAC3D;AAEA,cAAQ,IAAI;AACZ,cAAQ,MAAM,cAAc,MAAM,KAAK,IAAI,CAAC,KAAK;AAAA,IACnD;AAEA,eAAW,QAAQ,UAAU,OAAO;AAClC,YAAM,aAAa,kBAAkB,KAAK,MAAM,UAAU,MAAM,MAAM;AACtE,YAAM,WAAWD,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AAEpD,YAAM,SAAS,MAAMC,IAClB,OAAO,QAAQ,EACf,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAEpB,UAAI,UAAU,CAAC,QAAQ,aAAa,CAAC,QAAQ,KAAK;AAChD,gBAAQ,KAAK;AACb,cAAM,EAAE,UAAU,IAAI,MAAM,QAAQ;AAAA,UAClC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,GAAG,UAAU;AAAA,UACtB,SAAS;AAAA,QACX,CAAC;AAED,YAAI,CAAC,WAAW;AACd,kBAAQ,KAAK,YAAY,UAAU,EAAE;AACrC;AAAA,QACF;AACA,gBAAQ,MAAM;AAAA,MAChB;AAEA,YAAMA,IAAG,MAAMD,MAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAE1D,YAAM,UAAU,iBAAiB,KAAK,SAAS,MAAM;AAErD,YAAMC,IAAG,UAAU,UAAU,SAAS,OAAO;AAAA,IAC/C;AAEA,YAAQ,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAC,0BAA0B;AAAA,EAC/D,SAAS,OAAO;AACd,YAAQ,KAAK,oBAAoB,IAAI,EAAE;AACvC,YAAQ,MAAM,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,kBACP,UACA,MACA,QACQ;AACR,MAAI,SAAS,eAAe;AAC1B,WAAOD,MAAK;AAAA,MACV,OAAO,QAAQ,GAAG,QAAQ,MAAM,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,gBAAgB;AAC3B,WAAOA,MAAK;AAAA,MACV,OAAO,QAAQ,IAAI,QAAQ,MAAM,MAAM;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,iBAAiB;AAC5B,WAAOA,MAAK;AAAA,MACV,OAAO,QAAQ,MAAM,QAAQ,MAAM,MAAM;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AI9PA,OAAOE,YAAW;AAClB,OAAOC,UAAS;AAChB,OAAOC,cAAa;AACpB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,SAAAC,cAAa;AAMtB,eAAsB,KAAK,SAAsB;AAC/C,UAAQ,IAAIL,OAAM,KAAK,4BAA4B,CAAC;AAEpD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,qBAAqBG,MAAK,KAAK,KAAK,iBAAiB;AAE3D,QAAM,SAAS,MAAMC,IAClB,OAAO,kBAAkB,EACzB,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAEpB,MAAI,UAAU,CAAC,QAAQ,KAAK;AAC1B,UAAM,EAAE,UAAU,IAAI,MAAMF,SAAQ;AAAA,MAClC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,WAAW;AACd,cAAQ,IAAIF,OAAM,OAAO,iCAA4B,CAAC;AACtD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,MACnB,iBAAiB,IACjB,MAAME,SAAQ;AAAA,IACZ;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,QACvC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,QACrC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAEL,MAAI,CAAC,OAAO,SAAS,CAAC,QAAQ,KAAK;AACjC,YAAQ,IAAIF,OAAM,OAAO,iCAA4B,CAAC;AACtD;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,SAAS;AAAA,IACT,OAAO,OAAO,SAAS;AAAA,IACvB,KAAK,OAAO,OAAO;AAAA,IACnB,KAAK;AAAA,IACL,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,OAAO,eAAe;AAAA,MAC3B,WAAW;AAAA,MACX,cAAc;AAAA,MACd,QAAQ;AAAA,IACV;AAAA,IACA,SAAS;AAAA,MACP,YAAY,OAAO,kBAAkB;AAAA,MACrC,OAAO,OAAO,aAAa;AAAA,MAC3B,IAAI,GAAG,OAAO,kBAAkB,cAAc;AAAA,MAC9C,KAAK;AAAA,MACL,OAAO;AAAA,IACT;AAAA,IACA,aAAa;AAAA,EACf;AAEA,QAAM,UAAUC,KAAI,6BAA6B,EAAE,MAAM;AACzD,QAAMG,IAAG;AAAA,IACP;AAAA,IACA,KAAK,UAAU,gBAAgB,MAAM,CAAC;AAAA,EACxC;AACA,UAAQ,QAAQ,uCAAuC;AAEvD,QAAM,iBAAiB,MAAME,sBAAqB;AAElD,QAAM,cAAcL,KAAI,iCAAiC,EAAE,MAAM;AACjE,MAAI;AACF,UAAMI,OAAM,gBAAgB;AAAA,MAC1B,mBAAmB,SAAS,QAAQ;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,gBAAY,QAAQ,yBAAyB;AAAA,EAC/C,SAAS,OAAO;AACd,gBAAY,KAAK,+BAA+B;AAChD,YAAQ,MAAM,KAAK;AAAA,EACrB;AAEA,UAAQ,IAAIL,OAAM,MAAM,gDAA2C,CAAC;AACpE,UAAQ,IAAIA,OAAM,IAAI,aAAa,CAAC;AACpC,UAAQ;AAAA,IACNA,OAAM;AAAA,MACJ,KAAKA,OAAM,KAAK,wBAAwB,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,UAAQ;AAAA,IACNA,OAAM;AAAA,MACJ,KAAKA,OAAM,KAAK,uBAAuB,CAAC;AAAA;AAAA,IAC1C;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB;AAC1B,SAAO;AAAA,IACL,OAAO;AAAA,IACP,aAAa;AAAA,IACb,KAAK;AAAA,IACL,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AACF;AAEA,eAAeM,wBAAwC;AACrD,MAAI;AACF,UAAMF,IAAG,OAAO,gBAAgB;AAChC,WAAO;AAAA,EACT,QAAQ;AAAA,EAAC;AAET,MAAI;AACF,UAAMA,IAAG,OAAO,WAAW;AAC3B,WAAO;AAAA,EACT,QAAQ;AAAA,EAAC;AAET,SAAO;AACT;;;ACjKA,OAAOG,YAAW;AAElB,eAAsB,UAAU;AAC9B,UAAQ,IAAIA,OAAM,KAAK,2BAA2B,CAAC;AAEnD,UAAQ,IAAIA,OAAM,KAAK,uBAAkB,CAAC;AAC1C,UAAQ,IAAIA,OAAM,KAAK,wBAAmB,CAAC;AAC3C,UAAQ,IAAIA,OAAM,KAAK,yBAAoB,CAAC;AAE5C,UAAQ,IAAIA,OAAM,IAAI,oDAA0C,CAAC;AACnE;;;ACVA,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,OAAOC,cAAa;AACpB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAwBf,eAAsB,KAAK,YAAsB,SAAsB;AACrE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,qBAAqBC,MAAK,KAAK,KAAK,iBAAiB;AAE3D,MAAI;AACJ,MAAI;AACF,UAAM,gBAAgB,MAAMC,IAAG,SAAS,oBAAoB,OAAO;AACnE,aAAS,KAAK,MAAM,aAAa;AAAA,EACnC,SAAS,OAAO;AACd,YAAQ,IAAIC,OAAM,IAAI,uCAAkC,CAAC;AACzD,YAAQ;AAAA,MACNA,OAAM,IAAI,OAAOA,OAAM,KAAK,kBAAkB,CAAC;AAAA,CAAW;AAAA,IAC5D;AACA;AAAA,EACF;AAEA,QAAM,UAAUC,KAAI,sBAAsB,EAAE,MAAM;AAClD,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,cAAc;AAC/B,YAAQ,QAAQ,kBAAkB;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ,KAAK,wBAAwB;AACrC,YAAQ,MAAM,KAAK;AACnB;AAAA,EACF;AAEA,MAAI,oBAA8B,CAAC;AAEnC,MAAI,QAAQ,KAAK;AAEf,UAAM,gBAAgB,SAAS,WAC5B,OAAO,CAAC,SAAc,KAAK,SAAS,iBAAiB,KAAK,SAAS,cAAc,EACjF,IAAI,CAAC,SAAc,KAAK,IAAI;AAE/B,eAAW,QAAQ,eAAe;AAChC,YAAM,cAAc,MAAMC,sBAAqB,MAAM,MAAM;AAC3D,UAAI,aAAa;AACf,0BAAkB,KAAK,IAAI;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,kBAAkB,WAAW,GAAG;AAClC,cAAQ,IAAIF,OAAM,OAAO,gDAAsC,CAAC;AAChE;AAAA,IACF;AAAA,EACF,WAAW,WAAW,WAAW,GAAG;AAElC,UAAM,gBAAgB,SAAS,WAC5B,OAAO,CAAC,SAAc,KAAK,SAAS,iBAAiB,KAAK,SAAS,cAAc,EACjF,IAAI,CAAC,SAAc,KAAK,IAAI;AAE/B,UAAM,sBAAsB,CAAC;AAC7B,eAAW,QAAQ,eAAe;AAChC,YAAM,cAAc,MAAME,sBAAqB,MAAM,MAAM;AAC3D,UAAI,aAAa;AACf,4BAAoB,KAAK,IAAI;AAAA,MAC/B;AAAA,IACF;AAEA,QAAI,oBAAoB,WAAW,GAAG;AACpC,cAAQ,IAAIF,OAAM,OAAO,gDAAsC,CAAC;AAChE;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,IAAI,MAAMG,SAAQ;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,oBAAoB,IAAI,WAAS;AAAA,QACxC,OAAO;AAAA,QACP,OAAO;AAAA,MACT,EAAE;AAAA,MACF,KAAK;AAAA,IACP,CAAC;AAED,QAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,cAAQ,IAAIH,OAAM,OAAO,oCAA+B,CAAC;AACzD;AAAA,IACF;AAEA,wBAAoB;AAAA,EACtB,OAAO;AACL,wBAAoB;AAAA,EACtB;AAEA,UAAQ,IAAIA,OAAM,IAAI;AAAA,WAAc,kBAAkB,MAAM;AAAA,CAAoB,CAAC;AAEjF,QAAM,UAA2B,CAAC;AAElC,aAAW,iBAAiB,mBAAmB;AAC7C,UAAM,aAAa,MAAM,mBAAmB,eAAe,MAAM;AACjE,QAAI,YAAY;AACd,cAAQ,KAAK,UAAU;AAAA,IACzB;AAAA,EACF;AAGA,qBAAmB,OAAO;AAC5B;AAEA,eAAeE,sBACb,MACA,QACkB;AAClB,MAAI;AACF,UAAM,YAAgC,MAAM,qBAAqB,IAAI;AACrE,QAAI,CAAC,UAAW,QAAO;AAEvB,eAAW,QAAQ,UAAU,OAAO;AAClC,YAAM,aAAaE,mBAAkB,KAAK,MAAM,UAAU,MAAM,MAAM;AACtE,YAAM,WAAWN,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AAEpD,YAAM,SAAS,MAAMC,IAClB,OAAO,QAAQ,EACf,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAEpB,UAAI,CAAC,OAAQ,QAAO;AAAA,IACtB;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mBACb,MACA,QAC+B;AAC/B,MAAI;AACF,UAAM,YAAgC,MAAM,qBAAqB,IAAI;AACrE,QAAI,CAAC,WAAW;AACd,cAAQ,IAAIC,OAAM,IAAI,wBAAmB,IAAI,0BAA0B,CAAC;AACxE,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,MAAME,sBAAqB,MAAM,MAAM;AAC3D,QAAI,CAAC,aAAa;AAChB,cAAQ,IAAIF,OAAM,IAAI,oBAAU,IAAI,gCAAgC,CAAC;AACrE,aAAO;AAAA,IACT;AAEA,UAAM,YAAwB,CAAC;AAC/B,QAAI,aAAa;AAEjB,eAAW,QAAQ,UAAU,OAAO;AAClC,YAAM,aAAaI,mBAAkB,KAAK,MAAM,UAAU,MAAM,MAAM;AACtE,YAAM,WAAWN,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AAEpD,UAAI;AACF,cAAM,eAAe,MAAMC,IAAG,SAAS,UAAU,OAAO;AACxD,cAAM,kBAAkB,iBAAiB,KAAK,SAAS,MAAM;AAE7D,cAAM,iBAAiB,aAAa,KAAK,MAAM,gBAAgB,KAAK;AAEpE,kBAAU,KAAK;AAAA,UACb,MAAM,KAAK;AAAA,UACX,YAAY,CAAC;AAAA,UACb,OAAO;AAAA,UACP,WAAW;AAAA,QACb,CAAC;AAED,YAAI,CAAC,gBAAgB;AACnB,uBAAa;AAAA,QACf;AAAA,MACF,SAAS,OAAO;AAEd,kBAAU,KAAK;AAAA,UACb,MAAM,KAAK;AAAA,UACX,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,WAAW;AAAA,QACb,CAAC;AACD,qBAAa;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,IAAIC,OAAM,IAAI,4BAAuB,IAAI,EAAE,CAAC;AACpD,YAAQ,MAAM,KAAK;AACnB,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,SAA0B;AACpD,QAAM,wBAAwB,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU;AAChE,QAAM,qBAAqB,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU;AAE9D,UAAQ,IAAI;AAEZ,MAAI,sBAAsB,SAAS,GAAG;AACpC,YAAQ,IAAIA,OAAM,OAAO,gDAAyC,sBAAsB,MAAM;AAAA,CAAM,CAAC;AAErG,eAAW,UAAU,uBAAuB;AAC1C,cAAQ,IAAIA,OAAM,OAAO,aAAQA,OAAM,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC;AAE3D,iBAAW,QAAQ,OAAO,OAAO;AAC/B,YAAI,KAAK,YAAY;AACnB,cAAI,KAAK,WAAW;AAClB,oBAAQ,IAAIA,OAAM,IAAI,qBAAW,KAAK,IAAI,oBAAoB,CAAC;AAAA,UACjE,OAAO;AACL,oBAAQ,IAAIA,OAAM,IAAI,qBAAW,KAAK,IAAI,aAAa,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,IAAI,OAAOA,OAAM,KAAK,gCAAgC,CAAC,aAAa,CAAC;AAAA,EACzF;AAEA,MAAI,mBAAmB,SAAS,GAAG;AACjC,YAAQ,IAAIA,OAAM,MAAM;AAAA,gCAA8B,mBAAmB,MAAM;AAAA,CAAM,CAAC;AAEtF,eAAW,UAAU,oBAAoB;AACvC,cAAQ,IAAIA,OAAM,IAAI,aAAQ,OAAO,IAAI,EAAE,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,UAAQ,IAAI;AACd;AAEA,SAASI,mBACP,UACA,MACA,QACQ;AACR,MAAI,SAAS,eAAe;AAC1B,WAAON,MAAK;AAAA,MACV,OAAO,QAAQ,GAAG,QAAQ,MAAM,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,gBAAgB;AAC3B,WAAOA,MAAK;AAAA,MACV,OAAO,QAAQ,IAAI,QAAQ,MAAM,MAAM;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,iBAAiB;AAC5B,WAAOA,MAAK;AAAA,MACV,OAAO,QAAQ,MAAM,QAAQ,MAAM,MAAM;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC5RA,OAAOO,YAAW;AAClB,OAAOC,UAAS;AAChB,OAAOC,cAAa;AACpB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAmBf,eAAsB,OAAO,YAAsB,SAAwB;AACzE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,qBAAqBC,MAAK,KAAK,KAAK,iBAAiB;AAE3D,MAAI;AACJ,MAAI;AACF,UAAM,gBAAgB,MAAMC,IAAG,SAAS,oBAAoB,OAAO;AACnE,aAAS,KAAK,MAAM,aAAa;AAAA,EACnC,SAAS,OAAO;AACd,YAAQ,IAAIC,OAAM,IAAI,uCAAkC,CAAC;AACzD,YAAQ;AAAA,MACNA,OAAM,IAAI,OAAOA,OAAM,KAAK,kBAAkB,CAAC;AAAA,CAAW;AAAA,IAC5D;AACA;AAAA,EACF;AAEA,QAAM,UAAUC,KAAI,sBAAsB,EAAE,MAAM;AAClD,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,cAAc;AAC/B,YAAQ,QAAQ,kBAAkB;AAAA,EACpC,SAAS,OAAO;AACd,YAAQ,KAAK,wBAAwB;AACrC,YAAQ,MAAM,KAAK;AACnB;AAAA,EACF;AAEA,MAAI,qBAA+B,CAAC;AAEpC,MAAI,QAAQ,KAAK;AAEf,UAAM,gBAAgB,SAAS,WAC5B,OAAO,CAAC,SAAc,KAAK,SAAS,iBAAiB,KAAK,SAAS,cAAc,EACjF,IAAI,CAAC,SAAc,KAAK,IAAI;AAE/B,eAAW,QAAQ,eAAe;AAChC,YAAM,cAAc,MAAMC,sBAAqB,MAAM,MAAM;AAC3D,UAAI,aAAa;AACf,2BAAmB,KAAK,IAAI;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,mBAAmB,WAAW,GAAG;AACnC,cAAQ,IAAIF,OAAM,OAAO,gDAAsC,CAAC;AAChE;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,OAAO,CAAC,QAAQ,OAAO;AAClC,YAAM,EAAE,QAAQ,IAAI,MAAMG,SAAQ;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,UAAU,mBAAmB,MAAM;AAAA,QAC5C,SAAS;AAAA,MACX,CAAC;AAED,UAAI,CAAC,SAAS;AACZ,gBAAQ,IAAIH,OAAM,OAAO,8BAAyB,CAAC;AACnD;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,WAAW,WAAW,GAAG;AAElC,UAAM,gBAAgB,SAAS,WAC5B,OAAO,CAAC,SAAc,KAAK,SAAS,iBAAiB,KAAK,SAAS,cAAc,EACjF,IAAI,CAAC,SAAc,KAAK,IAAI;AAE/B,UAAM,sBAAsB,CAAC;AAC7B,eAAW,QAAQ,eAAe;AAChC,YAAM,cAAc,MAAME,sBAAqB,MAAM,MAAM;AAC3D,UAAI,aAAa;AACf,4BAAoB,KAAK,IAAI;AAAA,MAC/B;AAAA,IACF;AAEA,QAAI,oBAAoB,WAAW,GAAG;AACpC,cAAQ,IAAIF,OAAM,OAAO,gDAAsC,CAAC;AAChE;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,IAAI,MAAMG,SAAQ;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,oBAAoB,IAAI,WAAS;AAAA,QACxC,OAAO;AAAA,QACP,OAAO;AAAA,MACT,EAAE;AAAA,MACF,KAAK;AAAA,IACP,CAAC;AAED,QAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,cAAQ,IAAIH,OAAM,OAAO,oCAA+B,CAAC;AACzD;AAAA,IACF;AAEA,yBAAqB;AAAA,EACvB,OAAO;AACL,yBAAqB;AAAA,EACvB;AAEA,UAAQ,IAAIA,OAAM,IAAI;AAAA,WAAc,mBAAmB,MAAM;AAAA,CAAgC,CAAC;AAE9F,QAAM,UAA0B,CAAC;AAEjC,aAAW,iBAAiB,oBAAoB;AAC9C,UAAM,SAAS,MAAM,gBAAgB,eAAe,QAAQ,OAAO;AACnE,YAAQ,KAAK,MAAM;AAAA,EACrB;AAGA,uBAAqB,OAAO;AAC9B;AAEA,eAAeE,sBACb,MACA,QACkB;AAClB,MAAI;AACF,UAAM,YAAgC,MAAM,qBAAqB,IAAI;AACrE,QAAI,CAAC,UAAW,QAAO;AAEvB,eAAW,QAAQ,UAAU,OAAO;AAClC,YAAM,aAAaE,mBAAkB,KAAK,MAAM,UAAU,MAAM,MAAM;AACtE,YAAM,WAAWN,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AAEpD,YAAM,SAAS,MAAMC,IAClB,OAAO,QAAQ,EACf,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAEpB,UAAI,CAAC,OAAQ,QAAO;AAAA,IACtB;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,oBACb,WACA,QACkB;AAClB,aAAW,QAAQ,UAAU,OAAO;AAClC,UAAM,aAAaK,mBAAkB,KAAK,MAAM,UAAU,MAAM,MAAM;AACtE,UAAM,WAAWN,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AAEpD,QAAI;AACF,YAAM,eAAe,MAAMC,IAAG,SAAS,UAAU,OAAO;AACxD,YAAM,kBAAkB,iBAAiB,KAAK,SAAS,MAAM;AAE7D,UAAI,aAAa,KAAK,MAAM,gBAAgB,KAAK,GAAG;AAClD,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAEN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,gBACb,MACA,QACA,SACuB;AACvB,MAAI;AACF,UAAM,YAAgC,MAAM,qBAAqB,IAAI;AACrE,QAAI,CAAC,WAAW;AACd,cAAQ,IAAIC,OAAM,IAAI,wBAAmB,IAAI,0BAA0B,CAAC;AACxE,aAAO,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,QAAQ,wBAAwB;AAAA,IAChF;AAEA,UAAM,cAAc,MAAME,sBAAqB,MAAM,MAAM;AAC3D,QAAI,CAAC,aAAa;AAChB,cAAQ,IAAIF,OAAM,IAAI,oBAAU,IAAI,gCAAgC,CAAC;AACrE,aAAO,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,QAAQ,gBAAgB;AAAA,IACxE;AAGA,UAAM,aAAa,MAAM,oBAAoB,WAAW,MAAM;AAE9D,QAAI,CAAC,cAAc,CAAC,QAAQ,OAAO;AACjC,cAAQ,IAAIA,OAAM,IAAI,aAAQ,IAAI,wBAAwB,CAAC;AAC3D,aAAO,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,QAAQ,qBAAqB;AAAA,IAC7E;AAGA,QAAI,CAAC,QAAQ,OAAO,CAAC,QAAQ,OAAO;AAClC,YAAM,EAAE,QAAQ,IAAI,MAAMG,SAAQ;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,UAAUH,OAAM,KAAK,IAAI,CAAC;AAAA,QACnC,SAAS;AAAA,MACX,CAAC;AAED,UAAI,CAAC,SAAS;AACZ,gBAAQ,IAAIA,OAAM,OAAO,4BAAkB,IAAI,EAAE,CAAC;AAClD,eAAO,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,QAAQ,iBAAiB;AAAA,MACzE;AAAA,IACF;AAEA,UAAM,UAAUC,KAAI,YAAYD,OAAM,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM;AAG7D,eAAW,QAAQ,UAAU,OAAO;AAClC,YAAM,aAAaI,mBAAkB,KAAK,MAAM,UAAU,MAAM,MAAM;AACtE,YAAM,WAAWN,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU;AAEpD,YAAMC,IAAG,MAAMD,MAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAE1D,YAAM,UAAU,iBAAiB,KAAK,SAAS,MAAM;AACrD,YAAMC,IAAG,UAAU,UAAU,SAAS,OAAO;AAAA,IAC/C;AAEA,YAAQ,QAAQ,GAAGC,OAAM,KAAK,IAAI,CAAC,wBAAwB;AAC3D,WAAO,EAAE,MAAM,SAAS,MAAM,SAAS,MAAM;AAAA,EAC/C,SAAS,OAAO;AACd,YAAQ,IAAIA,OAAM,IAAI,4BAAuB,IAAI,EAAE,CAAC;AACpD,YAAQ,MAAM,KAAK;AACnB,WAAO,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,QAAQ,QAAQ;AAAA,EAChE;AACF;AAEA,SAAS,qBAAqB,SAAyB;AACrD,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO;AAC/C,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO;AAE/C,UAAQ,IAAI;AAEZ,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,IAAIA,OAAM,MAAM,kBAAa,QAAQ,MAAM;AAAA,CAAkB,CAAC;AACtE,eAAW,UAAU,SAAS;AAC5B,cAAQ,IAAIA,OAAM,IAAI,aAAQ,OAAO,IAAI,EAAE,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,IAAIA,OAAM,OAAO;AAAA,wBAAiB,QAAQ,MAAM;AAAA,CAAkB,CAAC;AAC3E,eAAW,UAAU,SAAS;AAC5B,YAAM,SAAS,OAAO,SAAS,KAAK,OAAO,MAAM,MAAM;AACvD,cAAQ,IAAIA,OAAM,IAAI,aAAQ,OAAO,IAAI,GAAG,MAAM,EAAE,CAAC;AAAA,IACvD;AAAA,EACF;AAEA,UAAQ,IAAI;AACd;AAEA,SAASI,mBACP,UACA,MACA,QACQ;AACR,MAAI,SAAS,eAAe;AAC1B,WAAON,MAAK;AAAA,MACV,OAAO,QAAQ,GAAG,QAAQ,MAAM,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,gBAAgB;AAC3B,WAAOA,MAAK;AAAA,MACV,OAAO,QAAQ,IAAI,QAAQ,MAAM,MAAM;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,iBAAiB;AAC5B,WAAOA,MAAK;AAAA,MACV,OAAO,QAAQ,MAAM,QAAQ,MAAM,MAAM;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ARrSA,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,SAAS,YAAY;AAE9B,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AACpC,IAAM,cAAc,KAAK;AAAA,EACvB,aAAa,KAAK,WAAW,iBAAiB,GAAG,OAAO;AAC1D;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,2CAA2C,EACvD,QAAQ,YAAY,OAAO;AAE9B,QACG,QAAQ,MAAM,EACd,YAAY,uCAAuC,EACnD,OAAO,aAAa,2CAA2C,EAC/D,OAAO,IAAI;AAEd,QACG,QAAQ,KAAK,EACb,YAAY,iCAAiC,EAC7C,SAAS,mBAAmB,wBAAwB,EACpD,OAAO,aAAa,iDAAiD,EACrE,OAAO,mBAAmB,0BAA0B,EACpD,OAAO,aAAa,8BAA8B,EAClD,OAAO,sBAAsB,4CAA4C,EACzE,OAAO,GAAG;AAEb,QACG,QAAQ,MAAM,EACd,YAAY,6BAA6B,EACzC,SAAS,mBAAmB,6DAA6D,EACzF,OAAO,aAAa,gCAAgC,EACpD,OAAO,IAAI;AAEd,QACG,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,SAAS,mBAAmB,8DAA8D,EAC1F,OAAO,aAAa,iCAAiC,EACrD,OAAO,aAAa,2BAA2B,EAC/C,OAAO,eAAe,0CAA0C,EAChE,OAAO,MAAM;AAEhB,QACG,QAAQ,SAAS,EACjB,YAAY,0BAA0B,EACtC,OAAO,OAAO;AAEjB,QAAQ,MAAM;","names":["path","fs","packageJson","path","fs","chalk","ora","prompts","path","fs","execa","detectPackageManager","chalk","chalk","ora","prompts","path","fs","path","fs","chalk","ora","isComponentInstalled","prompts","resolveTargetPath","chalk","ora","prompts","path","fs","path","fs","chalk","ora","isComponentInstalled","prompts","resolveTargetPath"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/registry.ts","../src/utils/transformer.ts","../src/utils/package-manager.ts","../src/utils/component-checker.ts","../src/utils/project-structure.ts","../src/commands/init.ts","../src/commands/credits.ts","../src/commands/diff.ts","../src/commands/update.ts","../src/commands/list.ts","../src/commands/debug.ts"],"sourcesContent":["#!/usr/bin/env node\r\nimport { Command } from \"commander\";\r\nimport { add } from \"./commands/add.js\";\r\nimport { init } from \"./commands/init.js\";\r\nimport { credits } from \"./commands/credits.js\";\r\nimport { diff } from \"./commands/diff.js\";\r\nimport { update } from \"./commands/update.js\";\r\nimport { list } from \"./commands/list.js\";\r\nimport { debug } from \"./commands/debug.js\";\r\nimport { readFileSync } from \"fs\";\r\nimport { fileURLToPath } from \"url\";\r\nimport { dirname, join } from \"path\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = dirname(__filename);\r\nconst packageJson = JSON.parse(\r\n readFileSync(join(__dirname, \"../package.json\"), \"utf-8\")\r\n);\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name(\"pittaya\")\r\n .description(\"Add Pittaya UI components to your project\")\r\n .version(packageJson.version);\r\n\r\nprogram\r\n .command(\"init\")\r\n .description(\"Initialize Pittaya UI in your project\")\r\n .option(\"-y, --yes\", \"Skip confirmations and use default values\")\r\n .action(init);\r\n\r\nprogram\r\n .command(\"add\")\r\n .description(\"Add a component to your project\")\r\n .argument(\"[components...]\", \"Component names to add\")\r\n .option(\"-y, --yes\", \"Skip confirmations and overwrite existing files\")\r\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\r\n .option(\"-a, --all\", \"Add all available components\")\r\n .option(\"--add-missing-deps\", \"Automatically install missing dependencies\")\r\n .action(add);\r\n\r\nprogram\r\n .command(\"diff\")\r\n .description(\"Check for component updates\")\r\n .argument(\"[components...]\", \"Component names to check (leave empty for interactive mode)\")\r\n .option(\"-a, --all\", \"Check all installed components\")\r\n .action(diff);\r\n\r\nprogram\r\n .command(\"update\")\r\n .description(\"Update components to latest version\")\r\n .argument(\"[components...]\", \"Component names to update (leave empty for interactive mode)\")\r\n .option(\"-a, --all\", \"Update all installed components\")\r\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\r\n .option(\"-f, --force\", \"Force update even if no changes detected\")\r\n .action(update);\r\n\r\nprogram\r\n .command(\"list\")\r\n .description(\"List available and installed components\")\r\n .option(\"--installed\", \"Show only installed components\")\r\n .option(\"--available\", \"Show only available components\")\r\n .option(\"--json\", \"Output in JSON format\")\r\n .action(list);\r\n\r\nprogram\r\n .command(\"credits\")\r\n .description(\"Show Pittaya UI creators\")\r\n .action(credits);\r\n\r\nprogram\r\n .command(\"debug\")\r\n .description(\"Debug component installation issues\")\r\n .option(\"-c, --component <name>\", \"Component name to debug\")\r\n .action(debug);\r\n\r\nprogram.parse();\r\n\r\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { execa } from \"execa\";\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\nimport { transformImports } from \"../utils/transformer.js\";\nimport { detectPackageManager, checkMissingDependencies } from \"../utils/package-manager.js\";\nimport { isComponentInstalled, resolveTargetPath } from \"../utils/component-checker.js\";\nimport { IAddOptions } from \"../interfaces/IAddOptions\";\nimport { IConfig } from \"../interfaces/IConfig\";\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\n\nexport async function add(components: string[], options: IAddOptions) {\n const cwd = process.cwd();\n const componentsJsonPath = path.join(cwd, \"components.json\");\n\n let config: IConfig;\n try {\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\n config = JSON.parse(configContent);\n } catch (error) {\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\n console.log(\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\n );\n return;\n }\n\n const spinner = ora(\"Fetching available components...\").start();\n let registry;\n try {\n registry = await fetchRegistry();\n spinner.succeed(\"Registry loaded!\");\n } catch (error) {\n spinner.fail(\"Error loading registry\");\n console.error(error);\n return;\n }\n\n if (options.all) {\n components = registry.components\n .filter((comp: any) => comp.type === \"registry:ui\")\n .map((comp: any) => comp.name);\n }\n\n if (components.length === 0) {\n const availableComponents = registry.components\n .filter((comp: any) => comp.type === \"registry:ui\")\n .map((comp: any) => ({\n title: `${comp.name}${comp.description ? ` - ${comp.description}` : \"\"}`,\n value: comp.name,\n }));\n\n const { selected } = await prompts({\n type: \"multiselect\",\n name: \"selected\",\n message: \"Select components to add:\",\n choices: availableComponents,\n min: 1,\n });\n\n if (!selected || selected.length === 0) {\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\n return;\n }\n\n components = selected;\n }\n\n console.log(\n chalk.dim(`\\nAdding ${components.length} component(s)...\\n`)\n );\n\n for (const componentName of components) {\n await addComponent(componentName, config, options);\n }\n\n console.log(chalk.green(\"\\n✅ Components added successfully!\\n\"));\n}\n\nasync function addComponent(\n name: string,\n config: IConfig,\n options: IAddOptions\n) {\n const alreadyInstalled = await isComponentInstalled(name, config);\n if (alreadyInstalled && !options.overwrite) {\n console.log(chalk.dim(` ⏭️ ${name} already installed, skipping...`));\n return;\n }\n\n const spinner = ora(`Installing ${chalk.bold(name)}...`).start();\n\n try {\n const component: IRegistryComponent = await getRegistryComponent(name);\n\n if (!component) {\n spinner.fail(`Component \"${name}\" not found in registry.`);\n return;\n }\n\n const packageManager = await detectPackageManager();\n\n if (component.dependencies && component.dependencies.length > 0) {\n const missingDeps = await checkMissingDependencies(component.dependencies);\n\n if (missingDeps.length > 0) {\n spinner.stop();\n\n console.log(chalk.yellow(`\\n⚠️ ${name} requires the following dependencies:\\n`));\n missingDeps.forEach(dep => {\n console.log(chalk.dim(` • ${dep}`));\n });\n console.log();\n\n // If --add-missing-deps was passed, install automatically\n if (options.addMissingDeps) {\n console.log(chalk.dim(\"Installing dependencies automatically...\\n\"));\n } else {\n const { install } = await prompts({\n type: \"confirm\",\n name: \"install\",\n message: \"Do you want to install the dependencies now?\",\n initial: true,\n });\n\n if (!install) {\n console.log(chalk.yellow(\"\\n⚠️ Component not installed. Install the dependencies manually and try again.\\n\"));\n return;\n }\n }\n\n spinner.start(`Installing dependencies for ${name}...`);\n\n try {\n await execa(packageManager, [\n packageManager === \"yarn\" ? \"add\" : \"install\",\n ...missingDeps,\n ]);\n spinner.succeed(`Dependencies installed!`);\n spinner.start(`Installing ${chalk.bold(name)}...`);\n } catch (error) {\n spinner.fail(`Error installing dependencies`);\n console.error(error);\n return;\n }\n }\n }\n\n if (component.registryDependencies && component.registryDependencies.length > 0) {\n spinner.stop();\n console.log(chalk.dim(`\\n 📦 ${name} requires: ${component.registryDependencies.join(\", \")}`));\n\n for (const dep of component.registryDependencies) {\n await addComponent(dep, config, { ...options, yes: true });\n }\n\n console.log(); // Linha em branco\n spinner.start(`Installing ${chalk.bold(name)}...`);\n }\n\n for (const file of component.files) {\n const targetPath = await resolveTargetPath(file.name, component.type, config);\n const filePath = path.join(process.cwd(), targetPath);\n\n const exists = await fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n\n if (exists && !options.overwrite && !options.yes) {\n spinner.stop();\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `${targetPath} already exists. Overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n spinner.warn(`Skipping ${targetPath}`);\n continue;\n }\n spinner.start();\n }\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n const content = transformImports(file.content, config);\n\n await fs.writeFile(filePath, content, \"utf-8\");\n }\n\n spinner.succeed(`${chalk.bold(name)} installed successfully!`);\n } catch (error) {\n spinner.fail(`Error installing ${name}`);\n console.error(error);\n }\n}\n\n","import fetch from \"node-fetch\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\nconst REGISTRY_BASE_URL = \"https://raw.githubusercontent.com/pittaya-ui/cli/main/registry\";\r\n\r\n\r\nexport async function fetchRegistry(): Promise<any> {\r\n try {\r\n const response = await fetch(`${REGISTRY_BASE_URL}/index.json`);\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n return await response.json();\r\n } catch (error) {\r\n console.error(\"Error fetching registry:\", error);\r\n throw new Error(\"Unable to load the registry of components\");\r\n }\r\n}\r\n\r\nexport async function getRegistryComponent(name: string): Promise<IRegistryComponent> {\r\n try {\r\n const response = await fetch(\r\n `${REGISTRY_BASE_URL}/components/${name}.json`\r\n );\r\n\r\n if (!response.ok) {\r\n throw new Error(`Component \"${name}\" not found in registry`);\r\n }\r\n\r\n return await response.json() as IRegistryComponent;\r\n } catch (error: any) {\r\n throw new Error(`Error loading component \"${name}\": ${error.message}`);\r\n }\r\n}\r\n\r\nexport function setRegistryUrl(url: string) {\r\n process.env.PITTAYA_REGISTRY_URL = url;\r\n}\r\n\r\n","\r\n\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\n\r\nexport function transformImports(content: string, config: IConfig): string {\r\n let transformed = content;\r\n\r\n const aliasMap: Record<string, string> = {\r\n \"@/components/ui\": config.aliases.ui,\r\n \"@/components\": config.aliases.components,\r\n \"@/lib/utils\": config.aliases.utils,\r\n \"@/lib\": config.aliases.lib,\r\n \"@/hooks\": config.aliases.hooks,\r\n };\r\n\r\n const sortedAliases = Object.entries(aliasMap).sort(\r\n ([a], [b]) => b.length - a.length\r\n );\r\n\r\n for (const [from, to] of sortedAliases) {\r\n if (from !== to) {\r\n transformed = transformed.replace(\r\n new RegExp(`from [\"']${escapeRegex(from)}`, \"g\"),\r\n `from \"${to}`\r\n );\r\n transformed = transformed.replace(\r\n new RegExp(`import [\"']${escapeRegex(from)}`, \"g\"),\r\n `import \"${to}`\r\n );\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n\r\nfunction escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\n","import fs from \"fs/promises\";\r\nimport path from \"path\";\r\n\r\nexport async function detectPackageManager(): Promise<string> {\r\n try {\r\n await fs.access(\"pnpm-lock.yaml\");\r\n return \"pnpm\";\r\n } catch {}\r\n\r\n try {\r\n await fs.access(\"yarn.lock\");\r\n return \"yarn\";\r\n } catch {}\r\n\r\n try {\r\n await fs.access(\"bun.lockb\");\r\n return \"bun\";\r\n } catch {}\r\n\r\n return \"npm\";\r\n}\r\n\r\nexport async function isPackageInstalled(packageName: string): Promise<boolean> {\r\n const cwd = process.cwd();\r\n\r\n try {\r\n const packageJsonPath = path.join(cwd, \"package.json\");\r\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, \"utf-8\"));\r\n\r\n const allDeps = {\r\n ...packageJson.dependencies,\r\n ...packageJson.devDependencies,\r\n };\r\n\r\n if (allDeps[packageName]) {\r\n return true;\r\n }\r\n } catch {}\r\n\r\n try {\r\n const packagePath = path.join(cwd, \"node_modules\", packageName);\r\n await fs.access(packagePath);\r\n return true;\r\n } catch {}\r\n\r\n return false;\r\n}\r\n\r\nexport async function checkMissingDependencies(\r\n dependencies: string[]\r\n): Promise<string[]> {\r\n const missing: string[] = [];\r\n\r\n for (const dep of dependencies) {\r\n const installed = await isPackageInstalled(dep);\r\n if (!installed) {\r\n missing.push(dep);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n\r\n","import path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { getRegistryComponent } from \"./registry.js\";\r\nimport { IConfig } from \"../interfaces/IConfig.js\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent.js\";\r\nimport { resolveAliasPath } from \"./project-structure.js\";\r\n\r\n/**\r\n * Check if a component is installed in the project\r\n * @param name - The component name/slug\r\n * @param config - The project configuration from components.json\r\n * @returns true if all component files exist, false otherwise\r\n */\r\nexport async function isComponentInstalled(\r\n name: string,\r\n config: IConfig\r\n): Promise<boolean> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) return false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n const exists = await fs\r\n .access(filePath)\r\n .then(() => true)\r\n .catch(() => false);\r\n\r\n if (!exists) return false;\r\n }\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Resolve the target path for a component file based on its type\r\n * @param fileName - The file name\r\n * @param type - The component type (registry:ui, registry:lib, registry:hook)\r\n * @param config - The project configuration\r\n * @returns The resolved file path\r\n */\r\nexport async function resolveTargetPath(\r\n fileName: string,\r\n type: string,\r\n config: IConfig\r\n): Promise<string> {\r\n if (type === \"registry:ui\") {\r\n const resolvedPath = await resolveAliasPath(config.aliases.ui);\r\n return path.join(resolvedPath, fileName);\r\n }\r\n\r\n if (type === \"registry:lib\") {\r\n const resolvedPath = await resolveAliasPath(config.aliases.lib);\r\n return path.join(resolvedPath, fileName);\r\n }\r\n\r\n if (type === \"registry:hook\") {\r\n const resolvedPath = await resolveAliasPath(config.aliases.hooks);\r\n return path.join(resolvedPath, fileName);\r\n }\r\n\r\n return fileName;\r\n}\r\n\r\n","import fs from \"fs/promises\";\r\nimport path from \"path\";\r\n\r\n/**\r\n * Detects if the project uses a \"src/\" directory structure\r\n * by checking for common Next.js directories inside src/\r\n *\r\n * @param cwd - Current working directory (defaults to process.cwd())\r\n * @returns true if project uses src/, false if root structure\r\n */\r\nexport async function hasSrcDirectory(cwd: string = process.cwd()): Promise<boolean> {\r\n try {\r\n // Check if src/ exists\r\n const srcPath = path.join(cwd, \"src\");\r\n await fs.access(srcPath);\r\n\r\n // Verify it's actually being used by checking for common Next.js directories\r\n const commonDirs = [\"app\", \"components\", \"lib\", \"pages\"];\r\n\r\n for (const dir of commonDirs) {\r\n try {\r\n await fs.access(path.join(srcPath, dir));\r\n return true; // Found at least one common directory inside src/\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n try {\r\n const tsconfigPath = path.join(cwd, \"tsconfig.json\");\r\n const tsconfig = JSON.parse(await fs.readFile(tsconfigPath, \"utf-8\"));\r\n\r\n if (tsconfig.compilerOptions?.paths) {\r\n const paths = tsconfig.compilerOptions.paths;\r\n if (paths[\"@/*\"]?.includes(\"./src/*\")) {\r\n return true;\r\n }\r\n }\r\n } catch {\r\n console.error(\"Bro... just in 21st century you not even have a tsconfig.json file in your project. That way you fuck me up :D\");\r\n }\r\n\r\n return false;\r\n } catch {\r\n // Only pretend to be crazy and continue\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Resolves an alias path to an actual file system path\r\n * @param aliasPath - Path with alias (e.g., \"@/components/ui\")\r\n * @param cwd - Current working directory\r\n * @returns Resolved file system path (e.g., \"src/components/ui\" or \"components/ui\")\r\n */\r\nexport async function resolveAliasPath(\r\n aliasPath: string,\r\n cwd: string = process.cwd()\r\n): Promise<string> {\r\n const usesSrc = await hasSrcDirectory(cwd);\r\n const baseDir = usesSrc ? \"src/\" : \"\";\r\n\r\n // Remove @/ prefix and prepend base directory\r\n return aliasPath.replace(/^@\\//, baseDir);\r\n}\r\n\r\n/**\r\n * Gets the default paths configuration based on project structure\r\n * This was necessary due to the fact that the user may not have a src/ directory or a tsconfig.json file.\r\n * @param cwd - Current working directory\r\n * @returns Object with default paths for globals.css, components, utils, etc.\r\n */\r\nexport async function getDefaultPaths(cwd: string = process.cwd()) {\r\n const usesSrc = await hasSrcDirectory(cwd);\r\n const baseDir = usesSrc ? \"src/\" : \"\";\r\n\r\n return {\r\n globalsCss: `${baseDir}app/globals.css`,\r\n components: \"@/components\",\r\n utils: \"@/lib/utils\",\r\n ui: \"@/components/ui\",\r\n lib: \"@/lib\",\r\n hooks: \"@/hooks\",\r\n baseDir,\r\n };\r\n}\r\n\r\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport prompts from \"prompts\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { execa } from \"execa\";\nimport { getDefaultPaths } from \"../utils/project-structure.js\";\n\ninterface InitOptions {\n yes?: boolean;\n}\n\nexport async function init(options: InitOptions) {\n console.log(chalk.bold(\"\\nWelcome to Pittaya UI!\\n\"));\n\n const cwd = process.cwd();\n const componentsJsonPath = path.join(cwd, \"components.json\");\n\n const exists = await fs\n .access(componentsJsonPath)\n .then(() => true)\n .catch(() => false);\n\n if (exists && !options.yes) {\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: \"components.json already exists. Do you want to overwrite it?\",\n initial: false,\n });\n\n if (!overwrite) {\n console.log(chalk.yellow(\"\\n❌ Operation cancelled.\\n\"));\n return;\n }\n }\n\n const defaultPaths = await getDefaultPaths(cwd);\n\n const config = options.yes\n ? {\n style: \"new-york\",\n tailwindCss: defaultPaths.globalsCss,\n rsc: true,\n componentsPath: defaultPaths.components,\n utilsPath: defaultPaths.utils,\n }\n : await prompts([\n {\n type: \"select\",\n name: \"style\",\n message: \"Which style would you like to use?\",\n choices: [\n { title: \"New York\", value: \"new-york\" },\n { title: \"Default\", value: \"default\" },\n { title: \"Recife\", value: \"recife\" },\n ],\n },\n {\n type: \"text\",\n name: \"tailwindCss\",\n message: \"Where is your globals.css file?\",\n initial: defaultPaths.globalsCss,\n },\n {\n type: \"confirm\",\n name: \"rsc\",\n message: \"Use React Server Components?\",\n initial: true,\n },\n {\n type: \"text\",\n name: \"componentsPath\",\n message: \"Path for components?\",\n initial: defaultPaths.components,\n },\n {\n type: \"text\",\n name: \"utilsPath\",\n message: \"Path for utils?\",\n initial: defaultPaths.utils,\n },\n ]);\n\n if (!config.style && !options.yes) {\n console.log(chalk.yellow(\"\\n❌ Operation cancelled.\\n\"));\n return;\n }\n\n const componentsJson = {\n $schema: \"https://raw.githubusercontent.com/pittaya-ui/cli/main/registry/schema.json\",\n style: config.style || \"new-york\",\n rsc: config.rsc ?? true,\n tsx: true,\n tailwind: {\n config: \"tailwind.config.ts\",\n css: config.tailwindCss || \"src/app/globals.css\",\n baseColor: \"neutral\",\n cssVariables: true,\n prefix: \"\",\n },\n aliases: {\n components: config.componentsPath || \"@/components\",\n utils: config.utilsPath || \"@/lib/utils\",\n ui: `${config.componentsPath || \"@/components\"}/pittaya/ui`,\n lib: \"@/lib\",\n hooks: \"@/hooks\",\n },\n iconLibrary: \"lucide\",\n };\n\n const spinner = ora(\"Creating components.json...\").start();\n await fs.writeFile(\n componentsJsonPath,\n JSON.stringify(componentsJson, null, 2)\n );\n spinner.succeed(\"components.json created successfully!\");\n\n const packageManager = await detectPackageManager();\n\n const depsSpinner = ora(\"Installing base dependencies...\").start();\n try {\n await execa(packageManager, [\n packageManager === \"yarn\" ? \"add\" : \"install\",\n \"class-variance-authority\",\n \"clsx\",\n \"tailwind-merge\",\n ]);\n depsSpinner.succeed(\"Dependencies installed!\");\n } catch (error) {\n depsSpinner.fail(\"Error installing dependencies\");\n console.error(error);\n }\n\n console.log(chalk.green(\"\\n✅ Pittaya UI configured successfully!\\n\"));\n console.log(chalk.dim(\"Next steps:\"));\n console.log(\n chalk.dim(\n ` ${chalk.bold(\"npx pittaya add button\")} - Add a component`\n )\n );\n console.log(\n chalk.dim(\n ` ${chalk.bold(\"npx pittaya add --all\")} - Add all components\\n`\n )\n );\n}\n\nasync function detectPackageManager(): Promise<string> {\n try {\n await fs.access(\"pnpm-lock.yaml\");\n return \"pnpm\";\n } catch {}\n\n try {\n await fs.access(\"yarn.lock\");\n return \"yarn\";\n } catch {}\n\n return \"npm\";\n}\n\n","import chalk from \"chalk\";\r\n\r\nexport async function credits() {\r\n console.log(chalk.bold(\"\\nPittaya UI - Creators\\n\"));\r\n\r\n console.log(chalk.cyan(\" • Marcos Bueno\"));\r\n console.log(chalk.cyan(\" • Lucas Ribeiro\"));\r\n console.log(chalk.cyan(\" • Jarbas Gouveia\"));\r\n\r\n console.log(chalk.dim(\"\\n Thank you for using Pittaya UI! ❤️\\n\"));\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport prompts from \"prompts\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\r\nimport { transformImports } from \"../utils/transformer.js\";\r\nimport { isComponentInstalled, resolveTargetPath } from \"../utils/component-checker.js\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\ninterface DiffOptions {\r\n all?: boolean;\r\n}\r\n\r\ninterface ComponentDiff {\r\n name: string;\r\n hasChanges: boolean;\r\n files: FileDiff[];\r\n isInstalled: boolean;\r\n}\r\n\r\ninterface FileDiff {\r\n name: string;\r\n hasChanges: boolean;\r\n isNew: boolean;\r\n isMissing: boolean;\r\n}\r\n\r\nexport async function diff(components: string[], options: DiffOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching registry...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Registry loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n let componentsToCheck: string[] = [];\r\n\r\n if (options.all) {\r\n // Check all installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n componentsToCheck.push(comp);\r\n }\r\n }\r\n\r\n if (componentsToCheck.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n } else if (components.length === 0) {\r\n // Interactive mode - show only installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n const installedComponents = [];\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n installedComponents.push(comp);\r\n }\r\n }\r\n\r\n if (installedComponents.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n const { selected } = await prompts({\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"Select components to check for updates:\",\r\n choices: installedComponents.map(name => ({\r\n title: name,\r\n value: name,\r\n })),\r\n min: 1,\r\n });\r\n\r\n if (!selected || selected.length === 0) {\r\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\r\n return;\r\n }\r\n\r\n componentsToCheck = selected;\r\n } else {\r\n componentsToCheck = components;\r\n }\r\n\r\n console.log(chalk.dim(`\\nChecking ${componentsToCheck.length} component(s)...\\n`));\r\n\r\n const results: ComponentDiff[] = [];\r\n\r\n for (const componentName of componentsToCheck) {\r\n const diffResult = await checkComponentDiff(componentName, config);\r\n if (diffResult) {\r\n results.push(diffResult);\r\n }\r\n }\r\n\r\n // Display results\r\n displayDiffResults(results);\r\n}\r\n\r\nasync function checkComponentDiff(\r\n name: string,\r\n config: IConfig\r\n): Promise<ComponentDiff | null> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) {\r\n console.log(chalk.red(` ❌ Component \"${name}\" not found in registry.`));\r\n return null;\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(name, config);\r\n if (!isInstalled) {\r\n console.log(chalk.dim(` ⏭️ ${name} is not installed, skipping...`));\r\n return null;\r\n }\r\n\r\n const fileDiffs: FileDiff[] = [];\r\n let hasChanges = false;\r\n\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n try {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const registryContent = transformImports(file.content, config);\r\n\r\n const contentMatches = localContent.trim() === registryContent.trim();\r\n\r\n fileDiffs.push({\r\n name: file.name,\r\n hasChanges: !contentMatches,\r\n isNew: false,\r\n isMissing: false,\r\n });\r\n\r\n if (!contentMatches) {\r\n hasChanges = true;\r\n }\r\n } catch (error) {\r\n // File exists check passed but can't read - treat as missing\r\n fileDiffs.push({\r\n name: file.name,\r\n hasChanges: true,\r\n isNew: false,\r\n isMissing: true,\r\n });\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n return {\r\n name,\r\n hasChanges,\r\n files: fileDiffs,\r\n isInstalled: true,\r\n };\r\n } catch (error) {\r\n console.log(chalk.red(` ❌ Error checking ${name}`));\r\n console.error(error);\r\n return null;\r\n }\r\n}\r\n\r\nfunction displayDiffResults(results: ComponentDiff[]) {\r\n const componentsWithChanges = results.filter((r) => r.hasChanges);\r\n const componentsUpToDate = results.filter((r) => !r.hasChanges);\r\n\r\n console.log();\r\n\r\n if (componentsWithChanges.length > 0) {\r\n console.log(chalk.yellow(`📝 Components with updates available (${componentsWithChanges.length}):\\n`));\r\n\r\n for (const result of componentsWithChanges) {\r\n console.log(chalk.yellow(` • ${chalk.bold(result.name)}`));\r\n\r\n for (const file of result.files) {\r\n if (file.hasChanges) {\r\n if (file.isMissing) {\r\n console.log(chalk.red(` └─ ${file.name} (missing locally)`));\r\n } else {\r\n console.log(chalk.dim(` └─ ${file.name} (modified)`));\r\n }\r\n }\r\n }\r\n }\r\n console.log();\r\n console.log(chalk.dim(`Run ${chalk.bold(\"npx pittaya update <component>\")} to update.`));\r\n }\r\n\r\n if (componentsUpToDate.length > 0) {\r\n console.log(chalk.green(`\\n✅ Components up to date (${componentsUpToDate.length}):\\n`));\r\n\r\n for (const result of componentsUpToDate) {\r\n console.log(chalk.dim(` • ${result.name}`));\r\n }\r\n }\r\n\r\n console.log();\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport prompts from \"prompts\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry, getRegistryComponent } from \"../utils/registry.js\";\r\nimport { transformImports } from \"../utils/transformer.js\";\r\nimport { isComponentInstalled, resolveTargetPath } from \"../utils/component-checker.js\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { IRegistryComponent } from \"../interfaces/IRegistryComponent\";\r\n\r\ninterface UpdateOptions {\r\n all?: boolean;\r\n yes?: boolean;\r\n force?: boolean;\r\n}\r\n\r\ninterface UpdateResult {\r\n name: string;\r\n updated: boolean;\r\n skipped: boolean;\r\n reason?: string;\r\n}\r\n\r\nexport async function update(components: string[], options: UpdateOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching registry...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Registry loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n let componentsToUpdate: string[] = [];\r\n\r\n if (options.all) {\r\n // Update all installed components\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n componentsToUpdate.push(comp);\r\n }\r\n }\r\n\r\n if (componentsToUpdate.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n if (!options.yes && !options.force) {\r\n const { confirm } = await prompts({\r\n type: \"confirm\",\r\n name: \"confirm\",\r\n message: `Update ${componentsToUpdate.length} component(s)?`,\r\n initial: true,\r\n });\r\n\r\n if (!confirm) {\r\n console.log(chalk.yellow(\"\\n❌ Update cancelled.\\n\"));\r\n return;\r\n }\r\n }\r\n } else if (components.length === 0) {\r\n // Interactive mode - show only installed components with updates\r\n const allComponents = registry.components\r\n .filter((comp: any) => comp.type === \"registry:ui\" || comp.type === \"registry:lib\")\r\n .map((comp: any) => comp.name);\r\n\r\n const installedComponents = [];\r\n for (const comp of allComponents) {\r\n const isInstalled = await isComponentInstalled(comp, config);\r\n if (isInstalled) {\r\n installedComponents.push(comp);\r\n }\r\n }\r\n\r\n if (installedComponents.length === 0) {\r\n console.log(chalk.yellow(\"\\n⚠️ No components installed yet.\\n\"));\r\n return;\r\n }\r\n\r\n const { selected } = await prompts({\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"Select components to update:\",\r\n choices: installedComponents.map(name => ({\r\n title: name,\r\n value: name,\r\n })),\r\n min: 1,\r\n });\r\n\r\n if (!selected || selected.length === 0) {\r\n console.log(chalk.yellow(\"\\n❌ No components selected.\\n\"));\r\n return;\r\n }\r\n\r\n componentsToUpdate = selected;\r\n } else {\r\n componentsToUpdate = components;\r\n }\r\n\r\n console.log(chalk.dim(`\\nChecking ${componentsToUpdate.length} component(s) for updates...\\n`));\r\n\r\n const results: UpdateResult[] = [];\r\n\r\n for (const componentName of componentsToUpdate) {\r\n const result = await updateComponent(componentName, config, options);\r\n results.push(result);\r\n }\r\n\r\n // Display results\r\n displayUpdateResults(results);\r\n}\r\n\r\nasync function hasComponentChanges(\r\n component: IRegistryComponent,\r\n config: IConfig\r\n): Promise<boolean> {\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n try {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const registryContent = transformImports(file.content, config);\r\n\r\n if (localContent.trim() !== registryContent.trim()) {\r\n return true;\r\n }\r\n } catch {\r\n // If we can't read the file, consider it as having changes\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nasync function updateComponent(\r\n name: string,\r\n config: IConfig,\r\n options: UpdateOptions\r\n): Promise<UpdateResult> {\r\n try {\r\n const component: IRegistryComponent = await getRegistryComponent(name);\r\n if (!component) {\r\n console.log(chalk.red(` ❌ Component \"${name}\" not found in registry.`));\r\n return { name, updated: false, skipped: true, reason: \"not found in registry\" };\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(name, config);\r\n if (!isInstalled) {\r\n console.log(chalk.dim(` ⏭️ ${name} is not installed, skipping...`));\r\n return { name, updated: false, skipped: true, reason: \"not installed\" };\r\n }\r\n\r\n // Check if there are changes\r\n const hasChanges = await hasComponentChanges(component, config);\r\n\r\n if (!hasChanges && !options.force) {\r\n console.log(chalk.dim(` ✓ ${name} is already up to date`));\r\n return { name, updated: false, skipped: true, reason: \"already up to date\" };\r\n }\r\n\r\n // Ask for confirmation if not --yes or --force\r\n if (!options.yes && !options.force) {\r\n const { confirm } = await prompts({\r\n type: \"confirm\",\r\n name: \"confirm\",\r\n message: `Update ${chalk.bold(name)}?`,\r\n initial: true,\r\n });\r\n\r\n if (!confirm) {\r\n console.log(chalk.yellow(` ⏭️ Skipped ${name}`));\r\n return { name, updated: false, skipped: true, reason: \"user cancelled\" };\r\n }\r\n }\r\n\r\n const spinner = ora(`Updating ${chalk.bold(name)}...`).start();\r\n\r\n // Update files\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const filePath = path.join(process.cwd(), targetPath);\r\n\r\n await fs.mkdir(path.dirname(filePath), { recursive: true });\r\n\r\n const content = transformImports(file.content, config);\r\n await fs.writeFile(filePath, content, \"utf-8\");\r\n }\r\n\r\n spinner.succeed(`${chalk.bold(name)} updated successfully!`);\r\n return { name, updated: true, skipped: false };\r\n } catch (error) {\r\n console.log(chalk.red(` ❌ Error updating ${name}`));\r\n console.error(error);\r\n return { name, updated: false, skipped: true, reason: \"error\" };\r\n }\r\n}\r\n\r\nfunction displayUpdateResults(results: UpdateResult[]) {\r\n const updated = results.filter((r) => r.updated);\r\n const skipped = results.filter((r) => r.skipped);\r\n\r\n console.log();\r\n\r\n if (updated.length > 0) {\r\n console.log(chalk.green(`✅ Updated ${updated.length} component(s):\\n`));\r\n for (const result of updated) {\r\n console.log(chalk.dim(` • ${result.name}`));\r\n }\r\n }\r\n\r\n if (skipped.length > 0) {\r\n console.log(chalk.yellow(`\\n⏭️ Skipped ${skipped.length} component(s):\\n`));\r\n for (const result of skipped) {\r\n const reason = result.reason ? ` (${result.reason})` : \"\";\r\n console.log(chalk.dim(` • ${result.name}${reason}`));\r\n }\r\n }\r\n\r\n console.log();\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { fetchRegistry } from \"../utils/registry.js\";\r\nimport { isComponentInstalled } from \"../utils/component-checker.js\";\r\nimport { IConfig } from \"../interfaces/IConfig.js\";\r\nimport { IComponentIndexItem } from \"../interfaces/IComponentIndexItem.js\";\r\n\r\ninterface ListOptions {\r\n installed?: boolean;\r\n available?: boolean;\r\n json?: boolean;\r\n}\r\n\r\ninterface ComponentInfo extends IComponentIndexItem {\r\n installed: boolean;\r\n version?: string;\r\n}\r\n\r\nexport async function list(options: ListOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n } catch (error) {\r\n console.log(chalk.red(\"\\n❌ components.json not found.\\n\"));\r\n console.log(\r\n chalk.dim(`Run ${chalk.bold(\"npx pittaya init\")} first.\\n`)\r\n );\r\n return;\r\n }\r\n\r\n const spinner = ora(\"Fetching components...\").start();\r\n let registry;\r\n try {\r\n registry = await fetchRegistry();\r\n spinner.succeed(\"Components loaded!\");\r\n } catch (error) {\r\n spinner.fail(\"Error loading registry\");\r\n console.error(error);\r\n return;\r\n }\r\n\r\n const allComponents: IComponentIndexItem[] = registry.components || [];\r\n\r\n // Check installation status for each component\r\n const componentsWithStatus: ComponentInfo[] = await Promise.all(\r\n allComponents.map(async (comp) => {\r\n const installed = await isComponentInstalled(comp.slug, config);\r\n return {\r\n ...comp,\r\n installed,\r\n };\r\n })\r\n );\r\n\r\n let filteredComponents = componentsWithStatus;\r\n\r\n if (options.installed) {\r\n filteredComponents = componentsWithStatus.filter(comp => comp.installed);\r\n } else if (options.available) {\r\n filteredComponents = componentsWithStatus.filter(comp => !comp.installed);\r\n }\r\n\r\n\r\n if (options.json) {\r\n console.log(JSON.stringify(filteredComponents, null, 2));\r\n return;\r\n }\r\n\r\n\r\n displayComponents(filteredComponents, options);\r\n}\r\n\r\nfunction displayComponents(components: ComponentInfo[], options: ListOptions) {\r\n if (components.length === 0) {\r\n if (options.installed) {\r\n console.log(chalk.yellow(\"\\n📦 No components installed yet.\\n\"));\r\n console.log(chalk.dim(`Run ${chalk.bold(\"npx pittaya add\")} to install components.\\n`));\r\n } else if (options.available) {\r\n console.log(chalk.yellow(\"\\n✨ All components are already installed!\\n\"));\r\n } else {\r\n console.log(chalk.yellow(\"\\n⚠️ No components found in registry.\\n\"));\r\n }\r\n return;\r\n }\r\n\r\n\r\n const categorized = components.reduce((acc, comp) => {\r\n const category = comp.category || \"Other\";\r\n if (!acc[category]) {\r\n acc[category] = [];\r\n }\r\n acc[category].push(comp);\r\n return acc;\r\n }, {} as Record<string, ComponentInfo[]>);\r\n\r\n console.log(\"\\n\");\r\n\r\n\r\n if (options.installed) {\r\n console.log(chalk.bold.green(\"📦 Installed Components\\n\"));\r\n } else if (options.available) {\r\n console.log(chalk.bold.blue(\"✨ Available Components\\n\"));\r\n } else {\r\n console.log(chalk.bold(\"📋 All Components\\n\"));\r\n }\r\n\r\n Object.entries(categorized).sort().forEach(([category, comps]) => {\r\n console.log(chalk.bold.cyan(`${category}:`));\r\n\r\n comps.forEach(comp => {\r\n const status = comp.installed\r\n ? chalk.green(\"✓\")\r\n : chalk.dim(\"○\");\r\n\r\n const name = comp.installed\r\n ? chalk.bold(comp.slug)\r\n : chalk.dim(comp.slug);\r\n\r\n const description = comp.description\r\n ? chalk.dim(` - ${comp.description}`)\r\n : \"\";\r\n\r\n const deps = comp.dependencies && comp.dependencies.length > 0\r\n ? chalk.dim.yellow(` [${comp.dependencies.length} deps]`)\r\n : \"\";\r\n\r\n const internalDeps = comp.internalDependencies && comp.internalDependencies.length > 0\r\n ? chalk.dim.blue(` [requires: ${comp.internalDependencies.join(\", \")}]`)\r\n : \"\";\r\n\r\n console.log(` ${status} ${name}${description}${deps}${internalDeps}`);\r\n });\r\n\r\n console.log(); // Empty line between categories\r\n });\r\n\r\n const installedCount = components.filter(c => c.installed).length;\r\n const totalCount = components.length;\r\n\r\n if (!options.installed && !options.available) {\r\n console.log(chalk.dim(`Total: ${totalCount} components (${installedCount} installed, ${totalCount - installedCount} available)\\n`));\r\n } else {\r\n console.log(chalk.dim(`Total: ${totalCount} components\\n`));\r\n }\r\n}\r\n\r\n","import chalk from \"chalk\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { IConfig } from \"../interfaces/IConfig\";\r\nimport { getRegistryComponent } from \"../utils/registry.js\";\r\nimport { resolveTargetPath, isComponentInstalled } from \"../utils/component-checker.js\";\r\nimport { hasSrcDirectory, resolveAliasPath } from \"../utils/project-structure.js\";\r\n\r\ninterface DebugOptions {\r\n component?: string;\r\n}\r\n\r\nexport async function debug(options: DebugOptions) {\r\n const cwd = process.cwd();\r\n const componentsJsonPath = path.join(cwd, \"components.json\");\r\n\r\n console.log(chalk.bold(\"\\n🔍 Pittaya UI Debug Information\\n\"));\r\n console.log(chalk.dim(`Working directory: ${cwd}\\n`));\r\n\r\n // Check components.json\r\n let config: IConfig;\r\n try {\r\n const configContent = await fs.readFile(componentsJsonPath, \"utf-8\");\r\n config = JSON.parse(configContent);\r\n console.log(chalk.green(\"✅ components.json found\"));\r\n console.log(chalk.dim(` Path: ${componentsJsonPath}`));\r\n } catch (error) {\r\n console.log(chalk.red(\"❌ components.json not found\\n\"));\r\n return;\r\n }\r\n\r\n // Check project structure\r\n const usesSrc = await hasSrcDirectory(cwd);\r\n console.log(chalk.green(`✅ Project structure: ${usesSrc ? \"src/\" : \"root\"}`));\r\n\r\n // Display aliases\r\n console.log(chalk.bold(\"\\n📋 Configured Aliases:\"));\r\n console.log(chalk.dim(` components: ${config.aliases.components}`));\r\n console.log(chalk.dim(` utils: ${config.aliases.utils}`));\r\n console.log(chalk.dim(` ui: ${config.aliases.ui}`));\r\n\r\n // Resolve aliases to actual paths\r\n const resolvedUi = await resolveAliasPath(config.aliases.ui, cwd);\r\n const resolvedLib = await resolveAliasPath(config.aliases.lib || \"@/lib\", cwd);\r\n console.log(chalk.bold(\"\\n📂 Resolved Paths:\"));\r\n console.log(chalk.dim(` UI components: ${resolvedUi}`));\r\n console.log(chalk.dim(` Libraries: ${resolvedLib}`));\r\n\r\n // Check if component specified\r\n if (options.component) {\r\n console.log(chalk.bold(`\\n🔍 Debugging component: ${options.component}\\n`));\r\n\r\n try {\r\n const component = await getRegistryComponent(options.component);\r\n\r\n if (!component) {\r\n console.log(chalk.red(`❌ Component not found in registry\\n`));\r\n return;\r\n }\r\n\r\n console.log(chalk.green(`✅ Component found in registry`));\r\n console.log(chalk.dim(` Type: ${component.type}`));\r\n console.log(chalk.dim(` Files: ${component.files.length}`));\r\n\r\n console.log(chalk.bold(\"\\n📁 Expected Files:\"));\r\n for (const file of component.files) {\r\n const targetPath = await resolveTargetPath(file.name, component.type, config);\r\n const fullPath = path.join(cwd, targetPath);\r\n\r\n const exists = await fs.access(fullPath)\r\n .then(() => true)\r\n .catch(() => false);\r\n\r\n const statusIcon = exists ? chalk.green(\"✅\") : chalk.red(\"❌\");\r\n const statusText = exists ? chalk.green(\"EXISTS\") : chalk.red(\"NOT FOUND\");\r\n\r\n console.log(` ${statusIcon} ${file.name}`);\r\n console.log(chalk.dim(` Expected: ${fullPath}`));\r\n console.log(chalk.dim(` Status: ${statusText}`));\r\n\r\n if (!exists) {\r\n // Check if file exists with different name\r\n const dir = path.dirname(fullPath);\r\n try {\r\n const dirExists = await fs.access(dir).then(() => true).catch(() => false);\r\n if (dirExists) {\r\n const filesInDir = await fs.readdir(dir);\r\n const baseName = path.basename(file.name, path.extname(file.name));\r\n const similarFiles = filesInDir.filter(f =>\r\n f.includes(baseName) || f.toLowerCase().includes(baseName.toLowerCase())\r\n );\r\n\r\n if (similarFiles.length > 0) {\r\n console.log(chalk.yellow(` 💡 Similar files found in directory:`));\r\n similarFiles.forEach(f => {\r\n console.log(chalk.dim(` - ${f}`));\r\n });\r\n }\r\n } else {\r\n console.log(chalk.red(` ⚠️ Directory doesn't exist: ${dir}`));\r\n }\r\n } catch (err) {\r\n // Ignore\r\n }\r\n }\r\n }\r\n\r\n const isInstalled = await isComponentInstalled(options.component, config);\r\n console.log(chalk.bold(`\\n📊 Installation Status:`));\r\n if (isInstalled) {\r\n console.log(chalk.green(` ✅ Component is detected as INSTALLED`));\r\n } else {\r\n console.log(chalk.red(` ❌ Component is detected as NOT INSTALLED`));\r\n console.log(chalk.yellow(` 💡 All files must exist for component to be considered installed`));\r\n }\r\n\r\n } catch (error) {\r\n console.log(chalk.red(`\\n❌ Error debugging component:`));\r\n console.error(error);\r\n }\r\n } else {\r\n console.log(chalk.yellow(\"\\n💡 To debug a specific component, use:\"));\r\n console.log(chalk.dim(\" npx pittaya debug --component <name>\\n\"));\r\n }\r\n}\r\n\r\n"],"mappings":"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","names":["path","fs","packageJson","path","fs","fs","path","path","fs","path","fs","chalk","ora","prompts","path","fs","execa","chalk","path","fs","prompts","ora","detectPackageManager","execa","chalk","chalk","ora","prompts","path","fs","path","fs","chalk","ora","prompts","chalk","ora","prompts","path","fs","path","fs","chalk","ora","prompts","chalk","ora","path","fs","path","fs","chalk","ora","chalk","path","fs","path","chalk","fs"]}
package/package.json CHANGED
@@ -1,53 +1,53 @@
1
- {
2
- "name": "pittaya",
3
- "version": "0.0.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
- }
1
+ {
2
+ "name": "pittaya",
3
+ "version": "0.0.8",
4
+ "description": "Pittaya UI CLI",
5
+ "type": "module",
6
+ "bin": {
7
+ "pittaya": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "dev": "tsup --watch",
14
+ "build": "tsup",
15
+ "pub:release": "npm run build && npm publish --access public"
16
+ },
17
+ "keywords": [
18
+ "pittaya",
19
+ "ui",
20
+ "components",
21
+ "cli",
22
+ "react",
23
+ "nextjs"
24
+ ],
25
+ "author": "Pittaya UI",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/pittaya-ui/ui.git",
30
+ "directory": "packages/cli"
31
+ },
32
+ "bugs": {
33
+ "url": "https://github.com/pittaya-ui/ui/issues"
34
+ },
35
+ "homepage": "https://pittaya-ui.vercel.app",
36
+ "dependencies": {
37
+ "chalk": "^5.3.0",
38
+ "commander": "^12.0.0",
39
+ "execa": "^9.0.0",
40
+ "https-proxy-agent": "^7.0.4",
41
+ "node-fetch": "^3.3.2",
42
+ "ora": "^8.0.1",
43
+ "prompts": "^2.4.2",
44
+ "ts-morph": "^24.0.0",
45
+ "zod": "^3.23.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^20.11.0",
49
+ "@types/prompts": "^2.4.9",
50
+ "tsup": "^8.0.1",
51
+ "typescript": "^5.3.3"
52
+ }
53
+ }