trix-ui 0.0.5 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/commands/add/analysis.d.ts +4 -0
  2. package/dist/commands/add/analysis.js +51 -0
  3. package/dist/commands/add/analysis.js.map +1 -0
  4. package/dist/commands/add/command.d.ts +2 -0
  5. package/dist/commands/add/command.js +150 -0
  6. package/dist/commands/add/command.js.map +1 -0
  7. package/dist/commands/add/config.d.ts +2 -0
  8. package/dist/commands/add/config.js +12 -0
  9. package/dist/commands/add/config.js.map +1 -0
  10. package/dist/commands/add/install.d.ts +27 -0
  11. package/dist/commands/add/install.js +80 -0
  12. package/dist/commands/add/install.js.map +1 -0
  13. package/dist/commands/add/package-manager.d.ts +1 -0
  14. package/dist/commands/add/package-manager.js +5 -0
  15. package/dist/commands/add/package-manager.js.map +1 -0
  16. package/dist/commands/add/project-files.d.ts +2 -0
  17. package/dist/commands/add/project-files.js +16 -0
  18. package/dist/commands/add/project-files.js.map +1 -0
  19. package/dist/commands/add/prompts.d.ts +3 -0
  20. package/dist/commands/add/prompts.js +29 -0
  21. package/dist/commands/add/prompts.js.map +1 -0
  22. package/dist/commands/add/registry.d.ts +4 -0
  23. package/dist/commands/add/registry.js +7 -0
  24. package/dist/commands/add/registry.js.map +1 -0
  25. package/dist/commands/add/types.d.ts +31 -0
  26. package/dist/commands/add/types.js +2 -0
  27. package/dist/commands/add/types.js.map +1 -0
  28. package/dist/commands/add/ui.d.ts +4 -0
  29. package/dist/commands/add/ui.js +49 -0
  30. package/dist/commands/add/ui.js.map +1 -0
  31. package/dist/commands/add/validation.d.ts +3 -0
  32. package/dist/commands/add/validation.js +31 -0
  33. package/dist/commands/add/validation.js.map +1 -0
  34. package/dist/commands/add.d.ts +1 -2
  35. package/dist/commands/add.js +1 -52
  36. package/dist/commands/add.js.map +1 -1
  37. package/dist/commands/doctor.js +2 -2
  38. package/dist/commands/doctor.js.map +1 -1
  39. package/dist/commands/init/command.d.ts +2 -0
  40. package/dist/commands/init/command.js +121 -0
  41. package/dist/commands/init/command.js.map +1 -0
  42. package/dist/commands/init/config.d.ts +2 -0
  43. package/dist/commands/init/config.js +25 -0
  44. package/dist/commands/init/config.js.map +1 -0
  45. package/dist/commands/init/constants.d.ts +3 -0
  46. package/dist/commands/init/constants.js +106 -0
  47. package/dist/commands/init/constants.js.map +1 -0
  48. package/dist/commands/init/dependencies.d.ts +5 -0
  49. package/dist/commands/init/dependencies.js +53 -0
  50. package/dist/commands/init/dependencies.js.map +1 -0
  51. package/dist/commands/init/filesystem.d.ts +1 -0
  52. package/dist/commands/init/filesystem.js +11 -0
  53. package/dist/commands/init/filesystem.js.map +1 -0
  54. package/dist/commands/init/lockfile.d.ts +1 -0
  55. package/dist/commands/init/lockfile.js +2 -0
  56. package/dist/commands/init/lockfile.js.map +1 -0
  57. package/dist/commands/init/package-json.d.ts +6 -0
  58. package/dist/commands/init/package-json.js +19 -0
  59. package/dist/commands/init/package-json.js.map +1 -0
  60. package/dist/commands/init/project.d.ts +3 -0
  61. package/dist/commands/init/project.js +98 -0
  62. package/dist/commands/init/project.js.map +1 -0
  63. package/dist/commands/init/tailwind.d.ts +3 -0
  64. package/dist/commands/init/tailwind.js +35 -0
  65. package/dist/commands/init/tailwind.js.map +1 -0
  66. package/dist/commands/init/templates.d.ts +3 -0
  67. package/dist/commands/init/templates.js +16 -0
  68. package/dist/commands/init/templates.js.map +1 -0
  69. package/dist/commands/init/types.d.ts +33 -0
  70. package/dist/commands/init/types.js +2 -0
  71. package/dist/commands/init/types.js.map +1 -0
  72. package/dist/commands/init/ui.d.ts +3 -0
  73. package/dist/commands/init/ui.js +34 -0
  74. package/dist/commands/init/ui.js.map +1 -0
  75. package/dist/commands/init.d.ts +1 -2
  76. package/dist/commands/init.js +1 -43
  77. package/dist/commands/init.js.map +1 -1
  78. package/dist/commands/remove-section.js +2 -2
  79. package/dist/commands/remove-wrapper.js +2 -2
  80. package/dist/commands/remove.js +2 -2
  81. package/dist/index.js +12 -23
  82. package/dist/index.js.map +1 -1
  83. package/dist/lib/config.d.ts +29 -14
  84. package/dist/lib/config.js +73 -40
  85. package/dist/lib/config.js.map +1 -1
  86. package/dist/lib/fs.d.ts +74 -4
  87. package/dist/lib/fs.js +280 -20
  88. package/dist/lib/fs.js.map +1 -1
  89. package/dist/lib/install.d.ts +4 -4
  90. package/dist/lib/install.js +6 -7
  91. package/dist/lib/install.js.map +1 -1
  92. package/dist/lib/lockfile.d.ts +57 -11
  93. package/dist/lib/lockfile.js +142 -31
  94. package/dist/lib/lockfile.js.map +1 -1
  95. package/dist/lib/logger.d.ts +9 -0
  96. package/dist/lib/logger.js +56 -0
  97. package/dist/lib/logger.js.map +1 -0
  98. package/dist/lib/paths.d.ts +1 -1
  99. package/dist/lib/paths.js +1 -1
  100. package/dist/lib/paths.js.map +1 -1
  101. package/dist/lib/registry.d.ts +2 -2
  102. package/dist/lib/registry.js +3 -3
  103. package/dist/lib/registry.js.map +1 -1
  104. package/dist/schema/index.d.ts +3 -3
  105. package/package.json +4 -2
@@ -0,0 +1,4 @@
1
+ import type { Lockfile } from "../../lib/lockfile.js";
2
+ import type { RegistryIndex } from "../../lib/registry.js";
3
+ import type { DependencyAnalysis } from "./types.js";
4
+ export declare function analyzeDependencies(components: string[], registry: RegistryIndex, lockfile: Lockfile): DependencyAnalysis;
@@ -0,0 +1,51 @@
1
+ import { createComponentMap } from "./registry.js";
2
+ function collectLocalDependencies(entry) {
3
+ return entry.dependencies?.local ?? [];
4
+ }
5
+ function collectNpmDependencies(entry) {
6
+ return entry.dependencies?.npm ?? [];
7
+ }
8
+ export function analyzeDependencies(components, registry, lockfile) {
9
+ const componentMap = createComponentMap(registry);
10
+ const allComponents = new Set(components);
11
+ const dependencies = new Set();
12
+ const npmDependencies = new Set();
13
+ const visited = new Set();
14
+ const resolveDependencies = (componentName) => {
15
+ if (visited.has(componentName)) {
16
+ return;
17
+ }
18
+ visited.add(componentName);
19
+ const entry = componentMap.get(componentName);
20
+ if (!entry) {
21
+ return;
22
+ }
23
+ for (const dep of collectLocalDependencies(entry)) {
24
+ if (!allComponents.has(dep)) {
25
+ allComponents.add(dep);
26
+ dependencies.add(dep);
27
+ }
28
+ resolveDependencies(dep);
29
+ }
30
+ for (const dep of collectNpmDependencies(entry)) {
31
+ npmDependencies.add(dep);
32
+ }
33
+ };
34
+ for (const component of components) {
35
+ resolveDependencies(component);
36
+ }
37
+ const conflicts = [];
38
+ for (const component of allComponents) {
39
+ if (lockfile.components[component]) {
40
+ conflicts.push(component);
41
+ }
42
+ }
43
+ return {
44
+ components: Array.from(allComponents),
45
+ dependencies,
46
+ npmDependencies,
47
+ conflicts,
48
+ totalToInstall: allComponents.size
49
+ };
50
+ }
51
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../../src/commands/add/analysis.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAElD,SAAS,wBAAwB,CAAC,KAAmB;IACnD,OAAO,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAA;AACxC,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAmB;IACjD,OAAO,KAAK,CAAC,YAAY,EAAE,GAAG,IAAI,EAAE,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,UAAoB,EACpB,QAAuB,EACvB,QAAkB;IAElB,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACjD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,UAAU,CAAC,CAAA;IACjD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IACtC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAA;IAEzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IAEjC,MAAM,mBAAmB,GAAG,CAAC,aAAqB,EAAQ,EAAE;QAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,OAAM;QACR,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAE1B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACtB,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACvB,CAAC;YACD,mBAAmB,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC,CAAA;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;QACrC,YAAY;QACZ,eAAe;QACf,SAAS;QACT,cAAc,EAAE,aAAa,CAAC,IAAI;KACnC,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const addCommand: Command;
@@ -0,0 +1,150 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { loadConfig } from "../../lib/config.js";
5
+ import { loadLockfile, saveLockfile } from "../../lib/lockfile.js";
6
+ import { loadRegistry } from "../../lib/registry.js";
7
+ import { logger } from "../../lib/logger.js";
8
+ import { analyzeDependencies } from "./analysis.js";
9
+ import { ensureProjectFiles } from "./project-files.js";
10
+ import { confirmDependencyInstallation, confirmInstallation, confirmOverwrite } from "./prompts.js";
11
+ import { installComponents, installNpmDependencies, updateBarrelFile } from "./install.js";
12
+ import { getComponentNames } from "./registry.js";
13
+ import { displayInstallationPlan, displayManualInstallInstructions, displayResults } from "./ui.js";
14
+ import { validateComponents } from "./validation.js";
15
+ function normalizeComponents(components) {
16
+ return components.map((component) => component.trim()).filter(Boolean);
17
+ }
18
+ function toAddConfig(config) {
19
+ return config;
20
+ }
21
+ export const addCommand = new Command("add")
22
+ .description("Add components to your project")
23
+ .argument("<components...>", "component names (or 'all' to install everything)")
24
+ .option("-f, --force", "overwrite existing files", false)
25
+ .option("-y, --yes", "skip confirmation prompts", false)
26
+ .option("-s, --silent", "suppress output messages", false)
27
+ .option("--skip-deps", "skip npm dependency installation", false)
28
+ .action(async (components, options) => {
29
+ const spinner = options.silent ? null : ora();
30
+ try {
31
+ const cwd = process.cwd();
32
+ spinner?.start("Loading configuration...");
33
+ const config = toAddConfig(await loadConfig(cwd));
34
+ spinner?.succeed("Configuration loaded");
35
+ spinner?.start("Loading component registry...");
36
+ const registry = await loadRegistry(config, cwd);
37
+ const lockfile = await loadLockfile(cwd);
38
+ spinner?.succeed("Registry loaded");
39
+ let requestedComponents = normalizeComponents(components);
40
+ if (requestedComponents.includes("all")) {
41
+ const allComponents = getComponentNames(registry);
42
+ if (!options.silent) {
43
+ console.log(chalk.yellow(`\nThis will install ${allComponents.length} components:`));
44
+ console.log(chalk.gray(allComponents.join(", ")));
45
+ }
46
+ const shouldContinue = options.yes
47
+ ? true
48
+ : await confirmInstallation(`all ${allComponents.length} components`);
49
+ if (!shouldContinue) {
50
+ logger.info("Installation cancelled");
51
+ process.exit(0);
52
+ }
53
+ requestedComponents = allComponents;
54
+ }
55
+ spinner?.start("Validating components...");
56
+ const validation = validateComponents(requestedComponents, registry);
57
+ spinner?.stop();
58
+ if (validation.invalid.length > 0) {
59
+ logger.error("The following components were not found:");
60
+ validation.invalid.forEach((name) => logger.error(` \u0007 ${name}`));
61
+ if (validation.suggestions.length > 0) {
62
+ console.log(chalk.yellow("\nDid you mean:"));
63
+ validation.suggestions.forEach((suggestion) => console.log(chalk.gray(` \u0007 ${suggestion}`)));
64
+ }
65
+ process.exit(1);
66
+ }
67
+ spinner?.start("Analyzing dependencies...");
68
+ const analysis = analyzeDependencies(validation.valid, registry, lockfile);
69
+ spinner?.stop();
70
+ if (!options.silent) {
71
+ displayInstallationPlan(analysis, options);
72
+ }
73
+ let forceInstall = Boolean(options.force);
74
+ if (analysis.conflicts.length > 0 && !forceInstall) {
75
+ logger.warn("The following components already exist:");
76
+ analysis.conflicts.forEach((name) => logger.warn(` \u0007 ${name}`));
77
+ const shouldOverwrite = options.yes
78
+ ? true
79
+ : await confirmOverwrite();
80
+ if (!shouldOverwrite) {
81
+ logger.info("Installation cancelled");
82
+ process.exit(0);
83
+ }
84
+ forceInstall = true;
85
+ }
86
+ if (!options.yes && !options.silent && analysis.totalToInstall > 0) {
87
+ const shouldInstall = await confirmInstallation(`${analysis.totalToInstall} component${analysis.totalToInstall > 1 ? "s" : ""}`);
88
+ if (!shouldInstall) {
89
+ logger.info("Installation cancelled");
90
+ process.exit(0);
91
+ }
92
+ }
93
+ spinner?.start("Verifying project setup...");
94
+ await ensureProjectFiles(cwd, config);
95
+ spinner?.succeed("Project setup verified");
96
+ spinner?.start("Installing components...");
97
+ const result = await installComponents({
98
+ cwd,
99
+ config,
100
+ registry,
101
+ lockfile,
102
+ components: analysis.components,
103
+ conflicts: analysis.conflicts,
104
+ force: forceInstall,
105
+ spinner
106
+ });
107
+ spinner?.stop();
108
+ spinner?.start("Updating lockfile...");
109
+ await saveLockfile(cwd, lockfile);
110
+ spinner?.succeed("Lockfile updated");
111
+ if (config.barrel && result.installed.length > 0) {
112
+ spinner?.start("Updating barrel file...");
113
+ await updateBarrelFile({ cwd, config, lockfile });
114
+ spinner?.succeed("Barrel file updated");
115
+ }
116
+ if (result.npmDependencies.size > 0 && !options.skipDeps) {
117
+ const shouldInstallDeps = options.yes
118
+ ? true
119
+ : await confirmDependencyInstallation(result.npmDependencies);
120
+ if (shouldInstallDeps) {
121
+ await installNpmDependencies({
122
+ cwd,
123
+ dependencies: result.npmDependencies,
124
+ spinner
125
+ });
126
+ }
127
+ else {
128
+ await displayManualInstallInstructions(result.npmDependencies, cwd);
129
+ }
130
+ }
131
+ else if (result.npmDependencies.size > 0) {
132
+ await displayManualInstallInstructions(result.npmDependencies, cwd);
133
+ }
134
+ if (!options.silent) {
135
+ displayResults(result, { ...options, force: forceInstall });
136
+ }
137
+ if (result.failed.length > 0) {
138
+ process.exit(1);
139
+ }
140
+ }
141
+ catch (error) {
142
+ spinner?.fail("Installation failed");
143
+ logger.error(error.message);
144
+ if (process.env.DEBUG) {
145
+ console.error(error);
146
+ }
147
+ process.exit(1);
148
+ }
149
+ });
150
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/add/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { AddConfig } from "./types.js";
2
+ export declare function inferScriptExtension(config: AddConfig): "ts" | "js";
@@ -0,0 +1,12 @@
1
+ import path from "node:path";
2
+ export function inferScriptExtension(config) {
3
+ if (config.typescript) {
4
+ return "ts";
5
+ }
6
+ const ext = path.extname(config.paths.utils).toLowerCase();
7
+ if (ext === ".ts" || ext === ".tsx") {
8
+ return "ts";
9
+ }
10
+ return "js";
11
+ }
12
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/add/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;IAC1D,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Ora } from "ora";
2
+ import type { Lockfile } from "../../lib/lockfile.js";
3
+ import type { RegistryIndex } from "../../lib/registry.js";
4
+ import type { AddConfig, InstallationResult } from "./types.js";
5
+ export interface InstallComponentsOptions {
6
+ cwd: string;
7
+ config: AddConfig;
8
+ registry: RegistryIndex;
9
+ lockfile: Lockfile;
10
+ components: string[];
11
+ conflicts: string[];
12
+ force: boolean;
13
+ spinner: Ora | null;
14
+ }
15
+ export declare function installComponents(options: InstallComponentsOptions): Promise<InstallationResult>;
16
+ export interface UpdateBarrelFileOptions {
17
+ cwd: string;
18
+ config: AddConfig;
19
+ lockfile: Lockfile;
20
+ }
21
+ export declare function updateBarrelFile(options: UpdateBarrelFileOptions): Promise<void>;
22
+ export interface InstallNpmDependenciesOptions {
23
+ cwd: string;
24
+ dependencies: Set<string>;
25
+ spinner: Ora | null;
26
+ }
27
+ export declare function installNpmDependencies(options: InstallNpmDependenciesOptions): Promise<void>;
@@ -0,0 +1,80 @@
1
+ import path from "node:path";
2
+ import { execa } from "execa";
3
+ import { installRegistryEntries } from "../../lib/install.js";
4
+ import { writeFileSafe } from "../../lib/fs.js";
5
+ import { logger } from "../../lib/logger.js";
6
+ import { inferScriptExtension } from "./config.js";
7
+ import { detectPackageManager } from "./package-manager.js";
8
+ export async function installComponents(options) {
9
+ const { cwd, config, registry, lockfile, components, conflicts, force, spinner } = options;
10
+ const installed = [];
11
+ const skipped = [];
12
+ const failed = [];
13
+ const npmDependencies = new Set();
14
+ let currentIndex = 0;
15
+ const total = components.length;
16
+ for (const componentName of components) {
17
+ currentIndex += 1;
18
+ try {
19
+ spinner.text = `Installing ${componentName} (${currentIndex}/${total})...`;
20
+ const result = await installRegistryEntries({
21
+ cwd,
22
+ config,
23
+ entries: registry.components,
24
+ names: [componentName],
25
+ lockEntries: lockfile.components,
26
+ force,
27
+ itemLabel: "component"
28
+ });
29
+ if (result.installed.length > 0) {
30
+ installed.push(...result.installed);
31
+ }
32
+ if (result.skipped.length > 0) {
33
+ skipped.push(...result.skipped);
34
+ }
35
+ result.npmDependencies.forEach((dep) => npmDependencies.add(dep));
36
+ }
37
+ catch (error) {
38
+ failed.push(componentName);
39
+ logger.error(`Failed to install ${componentName}: ${error.message}`);
40
+ }
41
+ }
42
+ spinner?.succeed(`Installed ${installed.length} component${installed.length !== 1 ? "s" : ""}`);
43
+ return {
44
+ installed,
45
+ skipped,
46
+ failed,
47
+ npmDependencies,
48
+ conflicts
49
+ };
50
+ }
51
+ export async function updateBarrelFile(options) {
52
+ const { cwd, config, lockfile } = options;
53
+ const ext = inferScriptExtension(config);
54
+ const barrelPath = path.resolve(cwd, config.paths.components, `index.${ext}`);
55
+ const components = Object.keys(lockfile.components).sort();
56
+ const exports = components
57
+ .map((name) => `export { ${name} } from "./${name}"`)
58
+ .join("\n");
59
+ const content = `// Auto-generated barrel file
60
+ // This file exports all components from this directory
61
+
62
+ ${exports}
63
+ `;
64
+ await writeFileSafe(barrelPath, content, true);
65
+ }
66
+ export async function installNpmDependencies(options) {
67
+ const { cwd, dependencies, spinner } = options;
68
+ const packageManager = await detectPackageManager(cwd);
69
+ const installCmd = packageManager === "npm" ? "install" : "add";
70
+ try {
71
+ spinner?.start(`Installing ${dependencies.size} npm package${dependencies.size > 1 ? "s" : ""}...`);
72
+ await execa(packageManager, [installCmd, ...Array.from(dependencies)], { cwd });
73
+ spinner?.succeed("NPM packages installed");
74
+ }
75
+ catch (error) {
76
+ spinner?.fail("Failed to install npm packages");
77
+ throw new Error(`Failed to install dependencies: ${error.message}`);
78
+ }
79
+ }
80
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/add/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function detectPackageManager(cwd: string): Promise<string>;
@@ -0,0 +1,5 @@
1
+ import { detect } from "@antfu/ni";
2
+ export async function detectPackageManager(cwd) {
3
+ return (await detect({ cwd })) || "npm";
4
+ }
5
+ //# sourceMappingURL=package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../../src/commands/add/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAW;IACpD,OAAO,CAAC,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,CAAA;AACzC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { AddConfig } from "./types.js";
2
+ export declare function ensureProjectFiles(cwd: string, config: AddConfig): Promise<void>;
@@ -0,0 +1,16 @@
1
+ import path from "node:path";
2
+ import { copyFileSafe, fileExists } from "../../lib/fs.js";
3
+ import { getTemplatePath } from "../../lib/paths.js";
4
+ import { inferScriptExtension } from "./config.js";
5
+ export async function ensureProjectFiles(cwd, config) {
6
+ const utilsPath = path.resolve(cwd, config.paths.utils);
7
+ if (!(await fileExists(utilsPath))) {
8
+ const ext = inferScriptExtension(config);
9
+ await copyFileSafe(getTemplatePath(`lib/utils.${ext}`), utilsPath, true);
10
+ }
11
+ const stylesPath = path.resolve(cwd, config.paths.styles);
12
+ if (!(await fileExists(stylesPath))) {
13
+ await copyFileSafe(getTemplatePath("styles/globals.css"), stylesPath, true);
14
+ }
15
+ }
16
+ //# sourceMappingURL=project-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../../src/commands/add/project-files.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,MAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACvD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;QACxC,MAAM,YAAY,CAChB,eAAe,CAAC,aAAa,GAAG,EAAE,CAAC,EACnC,SAAS,EACT,IAAI,CACL,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,YAAY,CAChB,eAAe,CAAC,oBAAoB,CAAC,EACrC,UAAU,EACV,IAAI,CACL,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function confirmInstallation(what: string): Promise<boolean>;
2
+ export declare function confirmOverwrite(): Promise<boolean>;
3
+ export declare function confirmDependencyInstallation(dependencies: Set<string>): Promise<boolean>;
@@ -0,0 +1,29 @@
1
+ import prompts from "prompts";
2
+ export async function confirmInstallation(what) {
3
+ const { confirmed } = await prompts({
4
+ type: "confirm",
5
+ name: "confirmed",
6
+ message: `Install ${what}?`,
7
+ initial: true
8
+ });
9
+ return confirmed;
10
+ }
11
+ export async function confirmOverwrite() {
12
+ const { overwrite } = await prompts({
13
+ type: "confirm",
14
+ name: "overwrite",
15
+ message: "Overwrite existing components?",
16
+ initial: false
17
+ });
18
+ return overwrite;
19
+ }
20
+ export async function confirmDependencyInstallation(dependencies) {
21
+ const { shouldInstall } = await prompts({
22
+ type: "confirm",
23
+ name: "shouldInstall",
24
+ message: `Install ${dependencies.size} npm package${dependencies.size > 1 ? "s" : ""}?`,
25
+ initial: true
26
+ });
27
+ return shouldInstall;
28
+ }
29
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/add/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAE7B,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;QAClC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,WAAW,IAAI,GAAG;QAC3B,OAAO,EAAE,IAAI;KACd,CAAC,CAAA;IAEF,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;QAClC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,gCAAgC;QACzC,OAAO,EAAE,KAAK;KACf,CAAC,CAAA;IAEF,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,YAAyB;IAEzB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,OAAO,CAAC;QACtC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,WAAW,YAAY,CAAC,IAAI,eAAe,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;QACvF,OAAO,EAAE,IAAI;KACd,CAAC,CAAA;IAEF,OAAO,aAAa,CAAA;AACtB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RegistryIndex } from "../../lib/registry.js";
2
+ import type { ComponentMap } from "./types.js";
3
+ export declare function getComponentNames(registry: RegistryIndex): string[];
4
+ export declare function createComponentMap(registry: RegistryIndex): ComponentMap;
@@ -0,0 +1,7 @@
1
+ export function getComponentNames(registry) {
2
+ return registry.components.map((component) => component.name);
3
+ }
4
+ export function createComponentMap(registry) {
5
+ return new Map(registry.components.map((component) => [component.name, component]));
6
+ }
7
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/commands/add/registry.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAAC,QAAuB;IACvD,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAuB;IACxD,OAAO,IAAI,GAAG,CACZ,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CACpE,CAAA;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { TrixUIConfig } from "../../lib/config.js";
2
+ import type { RegistryItem } from "../../lib/registry.js";
3
+ export interface AddOptions {
4
+ force?: boolean;
5
+ yes?: boolean;
6
+ silent?: boolean;
7
+ skipDeps?: boolean;
8
+ }
9
+ export interface InstallationResult {
10
+ installed: string[];
11
+ skipped: string[];
12
+ failed: string[];
13
+ npmDependencies: Set<string>;
14
+ conflicts: string[];
15
+ }
16
+ export interface ComponentValidation {
17
+ valid: string[];
18
+ invalid: string[];
19
+ suggestions: string[];
20
+ }
21
+ export interface DependencyAnalysis {
22
+ components: string[];
23
+ dependencies: Set<string>;
24
+ npmDependencies: Set<string>;
25
+ conflicts: string[];
26
+ totalToInstall: number;
27
+ }
28
+ export type AddConfig = TrixUIConfig & {
29
+ typescript?: boolean;
30
+ };
31
+ export type ComponentMap = Map<string, RegistryItem>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/add/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { AddOptions, DependencyAnalysis, InstallationResult } from "./types.js";
2
+ export declare function displayInstallationPlan(analysis: DependencyAnalysis, options: AddOptions): void;
3
+ export declare function displayManualInstallInstructions(dependencies: Set<string>, cwd: string): Promise<void>;
4
+ export declare function displayResults(result: InstallationResult, options: AddOptions): void;
@@ -0,0 +1,49 @@
1
+ import chalk from "chalk";
2
+ import { detectPackageManager } from "./package-manager.js";
3
+ export function displayInstallationPlan(analysis, options) {
4
+ console.log("\n" + chalk.bold("Installation Plan:"));
5
+ console.log(chalk.gray("\u00c4".repeat(50)));
6
+ console.log(`${chalk.cyan("Components to install:")} ${chalk.white(analysis.totalToInstall)}`);
7
+ if (analysis.dependencies.size > 0) {
8
+ console.log(`${chalk.cyan("Additional dependencies:")} ${chalk.white(analysis.dependencies.size)}`);
9
+ console.log(chalk.gray(` ${Array.from(analysis.dependencies).join(", ")}`));
10
+ }
11
+ if (analysis.npmDependencies.size > 0) {
12
+ console.log(`${chalk.cyan("NPM packages required:")} ${chalk.white(analysis.npmDependencies.size)}`);
13
+ console.log(chalk.gray(` ${Array.from(analysis.npmDependencies).join(", ")}`));
14
+ }
15
+ if (analysis.conflicts.length > 0 && !options.force) {
16
+ console.log(`${chalk.yellow("Conflicts detected:")} ${chalk.white(analysis.conflicts.length)}`);
17
+ console.log(chalk.gray(` ${analysis.conflicts.join(", ")}`));
18
+ }
19
+ console.log(chalk.gray("\u00c4".repeat(50)) + "\n");
20
+ }
21
+ export async function displayManualInstallInstructions(dependencies, cwd) {
22
+ const packageManager = await detectPackageManager(cwd);
23
+ const installCmd = packageManager === "npm" ? "install" : "add";
24
+ console.log(chalk.yellow("\nPlease install the following dependencies:"));
25
+ console.log(chalk.cyan(`${packageManager} ${installCmd} ${Array.from(dependencies).join(" ")}`));
26
+ console.log();
27
+ }
28
+ export function displayResults(result, options) {
29
+ console.log("\n" + chalk.bold("Installation Results:"));
30
+ console.log(chalk.gray("\u00c4".repeat(50)));
31
+ if (result.installed.length > 0) {
32
+ console.log(chalk.green(`\u00fb Installed (${result.installed.length}):`));
33
+ result.installed.forEach((name) => console.log(chalk.gray(` \u0007 ${name}`)));
34
+ }
35
+ if (result.skipped.length > 0 && !options.force) {
36
+ console.log(chalk.yellow(`? Skipped (${result.skipped.length}):`));
37
+ result.skipped.forEach((name) => console.log(chalk.gray(` \u0007 ${name} (already exists)`)));
38
+ }
39
+ if (result.failed.length > 0) {
40
+ console.log(chalk.red(`? Failed (${result.failed.length}):`));
41
+ result.failed.forEach((name) => console.log(chalk.gray(` \u0007 ${name}`)));
42
+ }
43
+ console.log(chalk.gray("\u00c4".repeat(50)));
44
+ if (result.installed.length > 0) {
45
+ console.log(chalk.green.bold(`\n\u00fb Successfully installed ${result.installed.length} component${result.installed.length !== 1 ? "s" : ""}!`));
46
+ }
47
+ console.log();
48
+ }
49
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/commands/add/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RegistryIndex } from "../../lib/registry.js";
2
+ import type { ComponentValidation } from "./types.js";
3
+ export declare function validateComponents(components: string[], registry: RegistryIndex): ComponentValidation;
@@ -0,0 +1,31 @@
1
+ import { createComponentMap, getComponentNames } from "./registry.js";
2
+ export function validateComponents(components, registry) {
3
+ const valid = [];
4
+ const invalid = [];
5
+ const suggestions = [];
6
+ const componentMap = createComponentMap(registry);
7
+ const availableComponents = getComponentNames(registry);
8
+ for (const component of components) {
9
+ const trimmed = component.trim();
10
+ if (!trimmed) {
11
+ continue;
12
+ }
13
+ if (componentMap.has(trimmed)) {
14
+ valid.push(trimmed);
15
+ continue;
16
+ }
17
+ invalid.push(trimmed);
18
+ const lower = trimmed.toLowerCase();
19
+ const similar = availableComponents.filter((name) => {
20
+ const candidate = name.toLowerCase();
21
+ return candidate.includes(lower) || lower.includes(candidate);
22
+ });
23
+ suggestions.push(...similar);
24
+ }
25
+ return {
26
+ valid,
27
+ invalid,
28
+ suggestions: [...new Set(suggestions)]
29
+ };
30
+ }
31
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/commands/add/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAErE,MAAM,UAAU,kBAAkB,CAChC,UAAoB,EACpB,QAAuB;IAEvB,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,WAAW,GAAa,EAAE,CAAA;IAEhC,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACjD,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IAEvD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAQ;QACV,CAAC;QAED,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACnB,SAAQ;QACV,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAErB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QACnC,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAClD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;YACpC,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;QACF,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO;QACL,KAAK;QACL,OAAO;QACP,WAAW,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;KACvC,CAAA;AACH,CAAC"}
@@ -1,2 +1 @@
1
- import { Command } from "commander";
2
- export declare const addCommand: Command;
1
+ export { addCommand } from "./add/command.js";