trix-ui 0.2.8 → 0.2.10

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 (204) hide show
  1. package/dist/__tests__/contracts/registry.test.d.ts +1 -0
  2. package/dist/__tests__/contracts/registry.test.js +42 -0
  3. package/dist/__tests__/contracts/registry.test.js.map +1 -0
  4. package/dist/__tests__/e2e/cli.test.d.ts +1 -0
  5. package/dist/__tests__/e2e/cli.test.js +67 -0
  6. package/dist/__tests__/e2e/cli.test.js.map +1 -0
  7. package/dist/__tests__/helpers/fs.d.ts +5 -0
  8. package/dist/__tests__/helpers/fs.js +26 -0
  9. package/dist/__tests__/helpers/fs.js.map +1 -0
  10. package/dist/__tests__/integration/commands.integration.test.d.ts +1 -0
  11. package/dist/__tests__/integration/commands.integration.test.js +184 -0
  12. package/dist/__tests__/integration/commands.integration.test.js.map +1 -0
  13. package/dist/commands/__tests__/add-composite.test.d.ts +2 -0
  14. package/dist/commands/__tests__/add-composite.test.js +171 -0
  15. package/dist/commands/__tests__/add-composite.test.js.map +1 -0
  16. package/dist/commands/__tests__/add-entry.mocks.d.ts +23 -0
  17. package/dist/commands/__tests__/add-entry.mocks.js +64 -0
  18. package/dist/commands/__tests__/add-entry.mocks.js.map +1 -0
  19. package/dist/commands/__tests__/add-section.test.d.ts +2 -0
  20. package/dist/commands/__tests__/add-section.test.js +191 -0
  21. package/dist/commands/__tests__/add-section.test.js.map +1 -0
  22. package/dist/commands/__tests__/add-wrapper.test.d.ts +2 -0
  23. package/dist/commands/__tests__/add-wrapper.test.js +171 -0
  24. package/dist/commands/__tests__/add-wrapper.test.js.map +1 -0
  25. package/dist/commands/__tests__/cli-mocks.d.ts +1 -0
  26. package/dist/commands/__tests__/cli-mocks.js +24 -0
  27. package/dist/commands/__tests__/cli-mocks.js.map +1 -0
  28. package/dist/commands/__tests__/doctor.mocks.d.ts +6 -0
  29. package/dist/commands/__tests__/doctor.mocks.js +20 -0
  30. package/dist/commands/__tests__/doctor.mocks.js.map +1 -0
  31. package/dist/commands/__tests__/doctor.test.d.ts +2 -0
  32. package/dist/commands/__tests__/doctor.test.js +80 -0
  33. package/dist/commands/__tests__/doctor.test.js.map +1 -0
  34. package/dist/commands/__tests__/list.mocks.d.ts +8 -0
  35. package/dist/commands/__tests__/list.mocks.js +20 -0
  36. package/dist/commands/__tests__/list.mocks.js.map +1 -0
  37. package/dist/commands/__tests__/list.test.d.ts +2 -0
  38. package/dist/commands/__tests__/list.test.js +60 -0
  39. package/dist/commands/__tests__/list.test.js.map +1 -0
  40. package/dist/commands/__tests__/remove.mocks.d.ts +9 -0
  41. package/dist/commands/__tests__/remove.mocks.js +26 -0
  42. package/dist/commands/__tests__/remove.mocks.js.map +1 -0
  43. package/dist/commands/__tests__/remove.test.d.ts +2 -0
  44. package/dist/commands/__tests__/remove.test.js +116 -0
  45. package/dist/commands/__tests__/remove.test.js.map +1 -0
  46. package/dist/commands/add/__tests__/add.mocks.d.ts +19 -19
  47. package/dist/commands/add/__tests__/add.mocks.js +59 -59
  48. package/dist/commands/add/__tests__/add.test.d.ts +2 -2
  49. package/dist/commands/add/__tests__/add.test.js +140 -140
  50. package/dist/commands/add/analysis.d.ts +4 -4
  51. package/dist/commands/add/analysis.js +56 -56
  52. package/dist/commands/add/command.d.ts +2 -2
  53. package/dist/commands/add/command.js +202 -202
  54. package/dist/commands/add/config.d.ts +2 -2
  55. package/dist/commands/add/config.js +11 -11
  56. package/dist/commands/add/install.d.ts +27 -27
  57. package/dist/commands/add/install.js +80 -80
  58. package/dist/commands/add/package-manager.d.ts +1 -1
  59. package/dist/commands/add/package-manager.js +4 -4
  60. package/dist/commands/add/project-files.d.ts +2 -2
  61. package/dist/commands/add/project-files.js +17 -17
  62. package/dist/commands/add/prompts.d.ts +3 -3
  63. package/dist/commands/add/prompts.js +28 -28
  64. package/dist/commands/add/registry.d.ts +4 -4
  65. package/dist/commands/add/registry.js +6 -6
  66. package/dist/commands/add/types.d.ts +33 -33
  67. package/dist/commands/add/types.js +1 -1
  68. package/dist/commands/add/ui.d.ts +4 -4
  69. package/dist/commands/add/ui.js +55 -55
  70. package/dist/commands/add/validation.d.ts +3 -3
  71. package/dist/commands/add/validation.js +30 -30
  72. package/dist/commands/add-collection.d.ts +1 -1
  73. package/dist/commands/add-collection.js +1 -1
  74. package/dist/commands/add-composite.d.ts +2 -2
  75. package/dist/commands/add-composite.js +201 -201
  76. package/dist/commands/add-section.d.ts +2 -2
  77. package/dist/commands/add-section.js +201 -201
  78. package/dist/commands/add-wrapper.d.ts +2 -2
  79. package/dist/commands/add-wrapper.js +201 -201
  80. package/dist/commands/add.d.ts +1 -1
  81. package/dist/commands/add.js +1 -1
  82. package/dist/commands/build.d.ts +2 -2
  83. package/dist/commands/doctor.d.ts +2 -2
  84. package/dist/commands/doctor.js +67 -67
  85. package/dist/commands/init/__tests__/init.mocks.d.ts +24 -0
  86. package/dist/commands/init/__tests__/init.mocks.js +84 -0
  87. package/dist/commands/init/__tests__/init.mocks.js.map +1 -0
  88. package/dist/commands/init/__tests__/init.test.d.ts +2 -0
  89. package/dist/commands/init/__tests__/init.test.js +283 -0
  90. package/dist/commands/init/__tests__/init.test.js.map +1 -0
  91. package/dist/commands/init/__tests__/tailwind.test.d.ts +1 -0
  92. package/dist/commands/init/__tests__/tailwind.test.js +56 -0
  93. package/dist/commands/init/__tests__/tailwind.test.js.map +1 -0
  94. package/dist/commands/init/__tests__/tsconfig.test.d.ts +1 -0
  95. package/dist/commands/init/__tests__/tsconfig.test.js +108 -0
  96. package/dist/commands/init/__tests__/tsconfig.test.js.map +1 -0
  97. package/dist/commands/init/__tests__/vite.test.d.ts +1 -0
  98. package/dist/commands/init/__tests__/vite.test.js +66 -0
  99. package/dist/commands/init/__tests__/vite.test.js.map +1 -0
  100. package/dist/commands/init/command.d.ts +2 -2
  101. package/dist/commands/init/command.js +114 -114
  102. package/dist/commands/init/config.d.ts +2 -2
  103. package/dist/commands/init/config.js +25 -25
  104. package/dist/commands/init/constants.d.ts +3 -3
  105. package/dist/commands/init/constants.js +105 -105
  106. package/dist/commands/init/dependencies.d.ts +5 -5
  107. package/dist/commands/init/dependencies.js +52 -52
  108. package/dist/commands/init/filesystem.d.ts +1 -1
  109. package/dist/commands/init/filesystem.js +10 -10
  110. package/dist/commands/init/lockfile.d.ts +1 -1
  111. package/dist/commands/init/lockfile.js +1 -1
  112. package/dist/commands/init/package-json.d.ts +6 -6
  113. package/dist/commands/init/package-json.js +18 -18
  114. package/dist/commands/init/project-files.d.ts +8 -0
  115. package/dist/commands/init/project-files.js +37 -0
  116. package/dist/commands/init/project-files.js.map +1 -0
  117. package/dist/commands/init/project.d.ts +3 -3
  118. package/dist/commands/init/project.js +97 -97
  119. package/dist/commands/init/style-imports.d.ts +9 -0
  120. package/dist/commands/init/style-imports.js +218 -0
  121. package/dist/commands/init/style-imports.js.map +1 -0
  122. package/dist/commands/init/tailwind.d.ts +3 -3
  123. package/dist/commands/init/tailwind.js +34 -34
  124. package/dist/commands/init/templates.d.ts +3 -3
  125. package/dist/commands/init/templates.js +15 -15
  126. package/dist/commands/init/tsconfig.d.ts +2 -2
  127. package/dist/commands/init/tsconfig.js +273 -273
  128. package/dist/commands/init/types.d.ts +33 -33
  129. package/dist/commands/init/types.js +1 -1
  130. package/dist/commands/init/ui.d.ts +3 -3
  131. package/dist/commands/init/ui.js +33 -33
  132. package/dist/commands/init/vite.d.ts +23 -0
  133. package/dist/commands/init/vite.js +347 -0
  134. package/dist/commands/init/vite.js.map +1 -0
  135. package/dist/commands/init.d.ts +1 -1
  136. package/dist/commands/init.js +1 -1
  137. package/dist/commands/list.d.ts +2 -2
  138. package/dist/commands/list.js +62 -62
  139. package/dist/commands/remove.d.ts +2 -2
  140. package/dist/commands/remove.js +93 -93
  141. package/dist/commands/shared/add-collection.d.ts +50 -50
  142. package/dist/commands/shared/add-collection.js +206 -206
  143. package/dist/commands/shared/list-entries.d.ts +6 -6
  144. package/dist/commands/shared/list-entries.js +12 -12
  145. package/dist/commands/shared/name-utils.d.ts +1 -1
  146. package/dist/commands/shared/name-utils.js +13 -13
  147. package/dist/commands/shared/remove-entries.d.ts +16 -16
  148. package/dist/commands/shared/remove-entries.js +41 -41
  149. package/dist/icons/index.d.ts +1 -1
  150. package/dist/icons/index.js +1 -1
  151. package/dist/icons/libraries.d.ts +37 -37
  152. package/dist/icons/libraries.js +34 -34
  153. package/dist/index.d.ts +2 -2
  154. package/dist/index.js +30 -30
  155. package/dist/lib/__tests__/config.test.d.ts +1 -0
  156. package/dist/lib/__tests__/config.test.js +49 -0
  157. package/dist/lib/__tests__/config.test.js.map +1 -0
  158. package/dist/lib/__tests__/install.test.d.ts +1 -0
  159. package/dist/lib/__tests__/install.test.js +149 -0
  160. package/dist/lib/__tests__/install.test.js.map +1 -0
  161. package/dist/lib/__tests__/lockfile.test.d.ts +1 -0
  162. package/dist/lib/__tests__/lockfile.test.js +89 -0
  163. package/dist/lib/__tests__/lockfile.test.js.map +1 -0
  164. package/dist/lib/__tests__/paths.test.d.ts +1 -0
  165. package/dist/lib/__tests__/paths.test.js +39 -0
  166. package/dist/lib/__tests__/paths.test.js.map +1 -0
  167. package/dist/lib/__tests__/registry.test.d.ts +1 -0
  168. package/dist/lib/__tests__/registry.test.js +76 -0
  169. package/dist/lib/__tests__/registry.test.js.map +1 -0
  170. package/dist/lib/config.d.ts +45 -45
  171. package/dist/lib/config.js +97 -97
  172. package/dist/lib/fs.d.ts +76 -76
  173. package/dist/lib/fs.js +302 -302
  174. package/dist/lib/highlighter.d.ts +6 -6
  175. package/dist/lib/highlighter.js +7 -7
  176. package/dist/lib/install.d.ts +19 -19
  177. package/dist/lib/install.js +55 -55
  178. package/dist/lib/lockfile.d.ts +63 -63
  179. package/dist/lib/lockfile.js +173 -173
  180. package/dist/lib/logger.d.ts +8 -8
  181. package/dist/lib/logger.js +41 -41
  182. package/dist/lib/paths.d.ts +14 -14
  183. package/dist/lib/paths.js +31 -31
  184. package/dist/lib/registry.d.ts +35 -35
  185. package/dist/lib/registry.js +180 -180
  186. package/dist/schema/index.d.ts +1128 -1128
  187. package/dist/schema/index.js +238 -238
  188. package/dist/styles/create-style-map.d.ts +4 -4
  189. package/dist/styles/create-style-map.js +68 -68
  190. package/dist/styles/transform-style-map.d.ts +3 -3
  191. package/dist/styles/transform-style-map.js +428 -428
  192. package/dist/styles/transform.d.ts +10 -10
  193. package/dist/styles/transform.js +15 -15
  194. package/dist/utils/index.d.ts +6 -6
  195. package/dist/utils/index.js +5 -5
  196. package/dist/utils/transformers/transform-icons.d.ts +2 -2
  197. package/dist/utils/transformers/transform-icons.js +164 -164
  198. package/dist/utils/transformers/transform-menu.d.ts +2 -2
  199. package/dist/utils/transformers/transform-menu.js +39 -39
  200. package/dist/utils/transformers/transform-render.d.ts +2 -2
  201. package/dist/utils/transformers/transform-render.js +97 -97
  202. package/dist/utils/transformers/types.d.ts +14 -14
  203. package/dist/utils/transformers/types.js +1 -1
  204. package/package.json +1 -1
@@ -1,202 +1,202 @@
1
- import path from "node:path";
2
- import chalk from "chalk";
3
- import { Command } from "commander";
4
- import ora from "ora";
5
- import { loadConfig } from "../lib/config.js";
6
- import { directoryExists } from "../lib/fs.js";
7
- import { loadLockfile, saveLockfile } from "../lib/lockfile.js";
8
- import { logger } from "../lib/logger.js";
9
- import { getRegistryWrappers, loadRegistry } from "../lib/registry.js";
10
- import { analyzeEntryDependencies, confirmOverwrite, createEmptyResult, displayInstallationPlan, displayResults, getEntryNames, installEntries, normalizeEntryNames, validateEntries } from "./shared/add-collection.js";
11
- import { ensureProjectFiles } from "./add/project-files.js";
12
- import { confirmDependencyInstallation, confirmInstallation } from "./add/prompts.js";
13
- import { displayManualInstallInstructions } from "./add/ui.js";
14
- import { installNpmDependencies } from "./add/install.js";
15
- const WRAPPER_LABELS = {
16
- entrySingular: "wrapper",
17
- entryPlural: "wrappers"
18
- };
19
- function toAddConfig(config) {
20
- return config;
21
- }
22
- export const addWrapperCommand = new Command("add-wrapper")
23
- .description("Add prebuilt wrappers to your project")
24
- .argument("<wrappers...>", "wrapper names (or 'all' to install everything)")
25
- .option("-f, --force", "overwrite existing files", false)
26
- .option("-y, --yes", "skip confirmation prompts", false)
27
- .option("-s, --silent", "suppress output messages", false)
28
- .option("-c, --cwd <path>", "working directory to add wrappers")
29
- .option("--skip-deps", "skip dependency installation", false)
30
- .action(async (wrappers, options) => {
31
- const spinner = options.silent ? null : ora({ color: "blue" });
32
- const shouldLog = !options.silent;
33
- const shouldPrompt = !options.yes && !options.silent;
34
- try {
35
- const cwd = path.resolve(options.cwd || process.cwd());
36
- if (shouldLog) {
37
- logger.info({ cwd }, "Adding wrappers");
38
- }
39
- if (!(await directoryExists(cwd))) {
40
- logger.error(`Directory does not exist: ${cwd}`);
41
- process.exit(1);
42
- }
43
- spinner?.start("Loading configuration...");
44
- const config = toAddConfig(await loadConfig(cwd));
45
- spinner?.succeed("Configuration loaded");
46
- spinner?.start("Loading registry and lockfile...");
47
- const registry = await loadRegistry(config, cwd);
48
- const lockfile = await loadLockfile(cwd);
49
- spinner?.succeed("Registry and lockfile loaded");
50
- const availableWrappers = getRegistryWrappers(registry);
51
- if (availableWrappers.length === 0) {
52
- logger.error("No wrappers available in the registry.");
53
- process.exit(1);
54
- }
55
- let requestedWrappers = normalizeEntryNames(wrappers);
56
- if (requestedWrappers.length === 0) {
57
- logger.error("No wrapper names provided.");
58
- process.exit(1);
59
- }
60
- if (requestedWrappers.includes("all")) {
61
- const allWrappers = getEntryNames(availableWrappers);
62
- if (shouldLog) {
63
- console.log(chalk.yellow(`\nThis will install ${allWrappers.length} wrappers:`));
64
- console.log(chalk.gray(allWrappers.join(", ")));
65
- }
66
- const shouldContinue = shouldPrompt
67
- ? await confirmInstallation(`all ${allWrappers.length} wrappers`)
68
- : true;
69
- if (!shouldContinue) {
70
- logger.info("Installation cancelled");
71
- process.exit(0);
72
- }
73
- requestedWrappers = allWrappers;
74
- }
75
- spinner?.start("Validating wrappers...");
76
- const validation = validateEntries(requestedWrappers, availableWrappers);
77
- spinner?.stop();
78
- if (validation.invalid.length > 0) {
79
- logger.error("The following wrappers were not found:");
80
- validation.invalid.forEach((name) => logger.error(` \u0007 ${name}`));
81
- if (validation.suggestions.length > 0 && shouldLog) {
82
- console.log(chalk.yellow("\nDid you mean:"));
83
- validation.suggestions.forEach((suggestion) => console.log(chalk.gray(` \u0007 ${suggestion}`)));
84
- }
85
- process.exit(1);
86
- return;
87
- }
88
- spinner?.start("Analyzing dependencies...");
89
- const analysis = analyzeEntryDependencies(validation.valid, availableWrappers, registry, lockfile, "wrappers");
90
- spinner?.stop();
91
- if (analysis.missingDependencies.length > 0) {
92
- logger.error("Registry is missing required component dependencies:");
93
- analysis.missingDependencies.forEach((name) => logger.error(` \u0007 ${name}`));
94
- process.exit(1);
95
- return;
96
- }
97
- if (shouldLog) {
98
- displayInstallationPlan(analysis, options, WRAPPER_LABELS);
99
- }
100
- let forceInstall = Boolean(options.force);
101
- if (analysis.conflicts.length > 0 && !forceInstall) {
102
- if (shouldLog) {
103
- logger.warn("The following wrappers or dependencies already exist:");
104
- analysis.conflicts.forEach((name) => logger.warn(` \u0007 ${name}`));
105
- }
106
- if (options.yes) {
107
- forceInstall = true;
108
- }
109
- else if (shouldPrompt) {
110
- const shouldOverwrite = await confirmOverwrite(WRAPPER_LABELS.entryPlural);
111
- if (!shouldOverwrite) {
112
- logger.info("Installation cancelled");
113
- process.exit(0);
114
- return;
115
- }
116
- forceInstall = true;
117
- }
118
- }
119
- const installCount = forceInstall
120
- ? analysis.totalTargets
121
- : analysis.totalToInstall;
122
- if (shouldPrompt && installCount > 0) {
123
- const label = analysis.componentDependencies.length > 0
124
- ? `${installCount} item${installCount > 1 ? "s" : ""}`
125
- : `${installCount} ${WRAPPER_LABELS.entrySingular}${installCount > 1 ? "s" : ""}`;
126
- const shouldInstall = await confirmInstallation(label);
127
- if (!shouldInstall) {
128
- logger.info("Installation cancelled");
129
- process.exit(0);
130
- return;
131
- }
132
- }
133
- spinner?.start("Verifying project setup...");
134
- await ensureProjectFiles(cwd, config);
135
- spinner?.succeed("Project setup verified");
136
- const dependenciesResult = analysis.componentDependencies.length > 0
137
- ? await installEntries(registry.components, analysis.componentDependencies, lockfile.components, {
138
- cwd,
139
- config,
140
- force: forceInstall,
141
- spinner,
142
- itemLabel: "component"
143
- })
144
- : createEmptyResult();
145
- const wrappersResult = await installEntries(availableWrappers, validation.valid, lockfile.wrappers, {
146
- cwd,
147
- config,
148
- force: forceInstall,
149
- spinner,
150
- itemLabel: "wrapper"
151
- });
152
- const npmDependencies = new Set();
153
- dependenciesResult.npmDependencies.forEach((dep) => npmDependencies.add(dep));
154
- wrappersResult.npmDependencies.forEach((dep) => npmDependencies.add(dep));
155
- spinner?.start("Updating lockfile...");
156
- await saveLockfile(cwd, lockfile);
157
- spinner?.succeed("Lockfile updated");
158
- const combinedResult = {
159
- entries: wrappersResult,
160
- dependencies: dependenciesResult,
161
- npmDependencies,
162
- conflicts: analysis.conflicts
163
- };
164
- if (npmDependencies.size > 0 && !options.skipDeps) {
165
- const shouldInstallDeps = shouldPrompt
166
- ? await confirmDependencyInstallation(npmDependencies)
167
- : true;
168
- if (shouldInstallDeps) {
169
- await installNpmDependencies({
170
- cwd,
171
- dependencies: npmDependencies,
172
- spinner
173
- });
174
- }
175
- else {
176
- if (shouldLog) {
177
- await displayManualInstallInstructions(npmDependencies, cwd);
178
- }
179
- }
180
- }
181
- else if (npmDependencies.size > 0 && shouldLog) {
182
- await displayManualInstallInstructions(npmDependencies, cwd);
183
- }
184
- if (shouldLog) {
185
- displayResults(combinedResult, { ...options, force: forceInstall }, WRAPPER_LABELS);
186
- }
187
- if (wrappersResult.failed.length > 0 || dependenciesResult.failed.length > 0) {
188
- process.exit(1);
189
- return;
190
- }
191
- }
192
- catch (error) {
193
- spinner?.fail("Installation failed");
194
- logger.error(error.message);
195
- if (process.env.DEBUG) {
196
- console.error(error);
197
- }
198
- process.exit(1);
199
- return;
200
- }
201
- });
1
+ import path from "node:path";
2
+ import chalk from "chalk";
3
+ import { Command } from "commander";
4
+ import ora from "ora";
5
+ import { loadConfig } from "../lib/config.js";
6
+ import { directoryExists } from "../lib/fs.js";
7
+ import { loadLockfile, saveLockfile } from "../lib/lockfile.js";
8
+ import { logger } from "../lib/logger.js";
9
+ import { getRegistryWrappers, loadRegistry } from "../lib/registry.js";
10
+ import { analyzeEntryDependencies, confirmOverwrite, createEmptyResult, displayInstallationPlan, displayResults, getEntryNames, installEntries, normalizeEntryNames, validateEntries } from "./shared/add-collection.js";
11
+ import { ensureProjectFiles } from "./add/project-files.js";
12
+ import { confirmDependencyInstallation, confirmInstallation } from "./add/prompts.js";
13
+ import { displayManualInstallInstructions } from "./add/ui.js";
14
+ import { installNpmDependencies } from "./add/install.js";
15
+ const WRAPPER_LABELS = {
16
+ entrySingular: "wrapper",
17
+ entryPlural: "wrappers"
18
+ };
19
+ function toAddConfig(config) {
20
+ return config;
21
+ }
22
+ export const addWrapperCommand = new Command("add-wrapper")
23
+ .description("Add prebuilt wrappers to your project")
24
+ .argument("<wrappers...>", "wrapper names (or 'all' to install everything)")
25
+ .option("-f, --force", "overwrite existing files", false)
26
+ .option("-y, --yes", "skip confirmation prompts", false)
27
+ .option("-s, --silent", "suppress output messages", false)
28
+ .option("-c, --cwd <path>", "working directory to add wrappers")
29
+ .option("--skip-deps", "skip dependency installation", false)
30
+ .action(async (wrappers, options) => {
31
+ const spinner = options.silent ? null : ora({ color: "blue" });
32
+ const shouldLog = !options.silent;
33
+ const shouldPrompt = !options.yes && !options.silent;
34
+ try {
35
+ const cwd = path.resolve(options.cwd || process.cwd());
36
+ if (shouldLog) {
37
+ logger.info({ cwd }, "Adding wrappers");
38
+ }
39
+ if (!(await directoryExists(cwd))) {
40
+ logger.error(`Directory does not exist: ${cwd}`);
41
+ process.exit(1);
42
+ }
43
+ spinner?.start("Loading configuration...");
44
+ const config = toAddConfig(await loadConfig(cwd));
45
+ spinner?.succeed("Configuration loaded");
46
+ spinner?.start("Loading registry and lockfile...");
47
+ const registry = await loadRegistry(config, cwd);
48
+ const lockfile = await loadLockfile(cwd);
49
+ spinner?.succeed("Registry and lockfile loaded");
50
+ const availableWrappers = getRegistryWrappers(registry);
51
+ if (availableWrappers.length === 0) {
52
+ logger.error("No wrappers available in the registry.");
53
+ process.exit(1);
54
+ }
55
+ let requestedWrappers = normalizeEntryNames(wrappers);
56
+ if (requestedWrappers.length === 0) {
57
+ logger.error("No wrapper names provided.");
58
+ process.exit(1);
59
+ }
60
+ if (requestedWrappers.includes("all")) {
61
+ const allWrappers = getEntryNames(availableWrappers);
62
+ if (shouldLog) {
63
+ console.log(chalk.yellow(`\nThis will install ${allWrappers.length} wrappers:`));
64
+ console.log(chalk.gray(allWrappers.join(", ")));
65
+ }
66
+ const shouldContinue = shouldPrompt
67
+ ? await confirmInstallation(`all ${allWrappers.length} wrappers`)
68
+ : true;
69
+ if (!shouldContinue) {
70
+ logger.info("Installation cancelled");
71
+ process.exit(0);
72
+ }
73
+ requestedWrappers = allWrappers;
74
+ }
75
+ spinner?.start("Validating wrappers...");
76
+ const validation = validateEntries(requestedWrappers, availableWrappers);
77
+ spinner?.stop();
78
+ if (validation.invalid.length > 0) {
79
+ logger.error("The following wrappers were not found:");
80
+ validation.invalid.forEach((name) => logger.error(` \u0007 ${name}`));
81
+ if (validation.suggestions.length > 0 && shouldLog) {
82
+ console.log(chalk.yellow("\nDid you mean:"));
83
+ validation.suggestions.forEach((suggestion) => console.log(chalk.gray(` \u0007 ${suggestion}`)));
84
+ }
85
+ process.exit(1);
86
+ return;
87
+ }
88
+ spinner?.start("Analyzing dependencies...");
89
+ const analysis = analyzeEntryDependencies(validation.valid, availableWrappers, registry, lockfile, "wrappers");
90
+ spinner?.stop();
91
+ if (analysis.missingDependencies.length > 0) {
92
+ logger.error("Registry is missing required component dependencies:");
93
+ analysis.missingDependencies.forEach((name) => logger.error(` \u0007 ${name}`));
94
+ process.exit(1);
95
+ return;
96
+ }
97
+ if (shouldLog) {
98
+ displayInstallationPlan(analysis, options, WRAPPER_LABELS);
99
+ }
100
+ let forceInstall = Boolean(options.force);
101
+ if (analysis.conflicts.length > 0 && !forceInstall) {
102
+ if (shouldLog) {
103
+ logger.warn("The following wrappers or dependencies already exist:");
104
+ analysis.conflicts.forEach((name) => logger.warn(` \u0007 ${name}`));
105
+ }
106
+ if (options.yes) {
107
+ forceInstall = true;
108
+ }
109
+ else if (shouldPrompt) {
110
+ const shouldOverwrite = await confirmOverwrite(WRAPPER_LABELS.entryPlural);
111
+ if (!shouldOverwrite) {
112
+ logger.info("Installation cancelled");
113
+ process.exit(0);
114
+ return;
115
+ }
116
+ forceInstall = true;
117
+ }
118
+ }
119
+ const installCount = forceInstall
120
+ ? analysis.totalTargets
121
+ : analysis.totalToInstall;
122
+ if (shouldPrompt && installCount > 0) {
123
+ const label = analysis.componentDependencies.length > 0
124
+ ? `${installCount} item${installCount > 1 ? "s" : ""}`
125
+ : `${installCount} ${WRAPPER_LABELS.entrySingular}${installCount > 1 ? "s" : ""}`;
126
+ const shouldInstall = await confirmInstallation(label);
127
+ if (!shouldInstall) {
128
+ logger.info("Installation cancelled");
129
+ process.exit(0);
130
+ return;
131
+ }
132
+ }
133
+ spinner?.start("Verifying project setup...");
134
+ await ensureProjectFiles(cwd, config);
135
+ spinner?.succeed("Project setup verified");
136
+ const dependenciesResult = analysis.componentDependencies.length > 0
137
+ ? await installEntries(registry.components, analysis.componentDependencies, lockfile.components, {
138
+ cwd,
139
+ config,
140
+ force: forceInstall,
141
+ spinner,
142
+ itemLabel: "component"
143
+ })
144
+ : createEmptyResult();
145
+ const wrappersResult = await installEntries(availableWrappers, validation.valid, lockfile.wrappers, {
146
+ cwd,
147
+ config,
148
+ force: forceInstall,
149
+ spinner,
150
+ itemLabel: "wrapper"
151
+ });
152
+ const npmDependencies = new Set();
153
+ dependenciesResult.npmDependencies.forEach((dep) => npmDependencies.add(dep));
154
+ wrappersResult.npmDependencies.forEach((dep) => npmDependencies.add(dep));
155
+ spinner?.start("Updating lockfile...");
156
+ await saveLockfile(cwd, lockfile);
157
+ spinner?.succeed("Lockfile updated");
158
+ const combinedResult = {
159
+ entries: wrappersResult,
160
+ dependencies: dependenciesResult,
161
+ npmDependencies,
162
+ conflicts: analysis.conflicts
163
+ };
164
+ if (npmDependencies.size > 0 && !options.skipDeps) {
165
+ const shouldInstallDeps = shouldPrompt
166
+ ? await confirmDependencyInstallation(npmDependencies)
167
+ : true;
168
+ if (shouldInstallDeps) {
169
+ await installNpmDependencies({
170
+ cwd,
171
+ dependencies: npmDependencies,
172
+ spinner
173
+ });
174
+ }
175
+ else {
176
+ if (shouldLog) {
177
+ await displayManualInstallInstructions(npmDependencies, cwd);
178
+ }
179
+ }
180
+ }
181
+ else if (npmDependencies.size > 0 && shouldLog) {
182
+ await displayManualInstallInstructions(npmDependencies, cwd);
183
+ }
184
+ if (shouldLog) {
185
+ displayResults(combinedResult, { ...options, force: forceInstall }, WRAPPER_LABELS);
186
+ }
187
+ if (wrappersResult.failed.length > 0 || dependenciesResult.failed.length > 0) {
188
+ process.exit(1);
189
+ return;
190
+ }
191
+ }
192
+ catch (error) {
193
+ spinner?.fail("Installation failed");
194
+ logger.error(error.message);
195
+ if (process.env.DEBUG) {
196
+ console.error(error);
197
+ }
198
+ process.exit(1);
199
+ return;
200
+ }
201
+ });
202
202
  //# sourceMappingURL=add-wrapper.js.map
@@ -1 +1 @@
1
- export { addCommand } from "./add/command.js";
1
+ export { addCommand } from "./add/command.js";
@@ -1,2 +1,2 @@
1
- export { addCommand } from "./add/command.js";
1
+ export { addCommand } from "./add/command.js";
2
2
  //# sourceMappingURL=add.js.map
@@ -1,2 +1,2 @@
1
- import { Command } from "commander";
2
- export declare const buildCommand: Command;
1
+ import { Command } from "commander";
2
+ export declare const buildCommand: Command;
@@ -1,2 +1,2 @@
1
- import { Command } from "commander";
2
- export declare const doctorCommand: Command;
1
+ import { Command } from "commander";
2
+ export declare const doctorCommand: Command;
@@ -1,68 +1,68 @@
1
- import path from "node:path";
2
- import { Command } from "commander";
3
- import { loadConfig, getConfigPath } from "../lib/config.js";
4
- import { fileExists } from "../lib/fs.js";
5
- import { lockfileExists } from "../lib/lockfile.js";
6
- import { loadRegistry } from "../lib/registry.js";
7
- export const doctorCommand = new Command("doctor")
8
- .description("Check project setup and suggest fixes")
9
- .option("-c, --cwd <path>", "working directory to check")
10
- .action(async (options) => {
11
- const cwd = path.resolve(options.cwd || process.cwd());
12
- const issues = [];
13
- if (!(await fileExists(getConfigPath(cwd)))) {
14
- issues.push("Missing components.json. Run: ui init");
15
- }
16
- let config;
17
- try {
18
- config = await loadConfig(cwd);
19
- }
20
- catch (error) {
21
- issues.push(error.message);
22
- }
23
- if (config) {
24
- const componentsDir = path.resolve(cwd, config.paths.components);
25
- if (!(await fileExists(componentsDir))) {
26
- issues.push(`Missing components directory: ${componentsDir}`);
27
- }
28
- const sectionsDir = path.resolve(cwd, config.paths.sections);
29
- if (!(await fileExists(sectionsDir))) {
30
- issues.push(`Missing sections directory: ${sectionsDir}`);
31
- }
32
- const wrappersDir = path.resolve(cwd, config.paths.wrappers);
33
- if (!(await fileExists(wrappersDir))) {
34
- issues.push(`Missing wrappers directory: ${wrappersDir}`);
35
- }
36
- const compositesDir = path.resolve(cwd, config.paths.composites);
37
- if (!(await fileExists(compositesDir))) {
38
- issues.push(`Missing composites directory: ${compositesDir}`);
39
- }
40
- const utilsPath = path.resolve(cwd, config.paths.utils);
41
- if (!(await fileExists(utilsPath))) {
42
- issues.push(`Missing utils file: ${utilsPath}`);
43
- }
44
- const stylesPath = path.resolve(cwd, config.paths.styles);
45
- if (!(await fileExists(stylesPath))) {
46
- issues.push(`Missing styles file: ${stylesPath}`);
47
- }
48
- try {
49
- await loadRegistry(config, cwd);
50
- }
51
- catch (error) {
52
- issues.push(`Registry load failed: ${error.message}`);
53
- }
54
- }
55
- if (!(await lockfileExists(cwd))) {
56
- issues.push("Missing lockfile. Run: ui init");
57
- }
58
- if (issues.length === 0) {
59
- console.log("All checks passed.");
60
- return;
61
- }
62
- console.log("Doctor found issues:");
63
- for (const issue of issues) {
64
- console.log(`- ${issue}`);
65
- }
66
- process.exit(1);
67
- });
1
+ import path from "node:path";
2
+ import { Command } from "commander";
3
+ import { loadConfig, getConfigPath } from "../lib/config.js";
4
+ import { fileExists } from "../lib/fs.js";
5
+ import { lockfileExists } from "../lib/lockfile.js";
6
+ import { loadRegistry } from "../lib/registry.js";
7
+ export const doctorCommand = new Command("doctor")
8
+ .description("Check project setup and suggest fixes")
9
+ .option("-c, --cwd <path>", "working directory to check")
10
+ .action(async (options) => {
11
+ const cwd = path.resolve(options.cwd || process.cwd());
12
+ const issues = [];
13
+ if (!(await fileExists(getConfigPath(cwd)))) {
14
+ issues.push("Missing components.json. Run: ui init");
15
+ }
16
+ let config;
17
+ try {
18
+ config = await loadConfig(cwd);
19
+ }
20
+ catch (error) {
21
+ issues.push(error.message);
22
+ }
23
+ if (config) {
24
+ const componentsDir = path.resolve(cwd, config.paths.components);
25
+ if (!(await fileExists(componentsDir))) {
26
+ issues.push(`Missing components directory: ${componentsDir}`);
27
+ }
28
+ const sectionsDir = path.resolve(cwd, config.paths.sections);
29
+ if (!(await fileExists(sectionsDir))) {
30
+ issues.push(`Missing sections directory: ${sectionsDir}`);
31
+ }
32
+ const wrappersDir = path.resolve(cwd, config.paths.wrappers);
33
+ if (!(await fileExists(wrappersDir))) {
34
+ issues.push(`Missing wrappers directory: ${wrappersDir}`);
35
+ }
36
+ const compositesDir = path.resolve(cwd, config.paths.composites);
37
+ if (!(await fileExists(compositesDir))) {
38
+ issues.push(`Missing composites directory: ${compositesDir}`);
39
+ }
40
+ const utilsPath = path.resolve(cwd, config.paths.utils);
41
+ if (!(await fileExists(utilsPath))) {
42
+ issues.push(`Missing utils file: ${utilsPath}`);
43
+ }
44
+ const stylesPath = path.resolve(cwd, config.paths.styles);
45
+ if (!(await fileExists(stylesPath))) {
46
+ issues.push(`Missing styles file: ${stylesPath}`);
47
+ }
48
+ try {
49
+ await loadRegistry(config, cwd);
50
+ }
51
+ catch (error) {
52
+ issues.push(`Registry load failed: ${error.message}`);
53
+ }
54
+ }
55
+ if (!(await lockfileExists(cwd))) {
56
+ issues.push("Missing lockfile. Run: ui init");
57
+ }
58
+ if (issues.length === 0) {
59
+ console.log("All checks passed.");
60
+ return;
61
+ }
62
+ console.log("Doctor found issues:");
63
+ for (const issue of issues) {
64
+ console.log(`- ${issue}`);
65
+ }
66
+ process.exit(1);
67
+ });
68
68
  //# sourceMappingURL=doctor.js.map
@@ -0,0 +1,24 @@
1
+ import type { Mock } from "vitest";
2
+ export declare const getConfigPath: Mock;
3
+ export declare const writeConfig: Mock;
4
+ export declare const fileExists: Mock;
5
+ export declare const lockfileExists: Mock;
6
+ export declare const saveLockfile: Mock;
7
+ export declare const createEmptyLockfile: Mock;
8
+ export declare const createConfig: Mock;
9
+ export declare const checkDependencies: Mock;
10
+ export declare const confirmInstallation: Mock;
11
+ export declare const installDependencies: Mock;
12
+ export declare const directoryExists: Mock;
13
+ export declare const detectProject: Mock;
14
+ export declare const validateProject: Mock;
15
+ export declare const setupGlobalStyles: Mock;
16
+ export declare const setupTailwind: Mock;
17
+ export declare const setupTypeScriptPaths: Mock;
18
+ export declare const setupJavaScriptPaths: Mock;
19
+ export declare const ensureGlobalStyleImport: Mock;
20
+ export declare const validateViteAliasSupport: Mock;
21
+ export declare const ensureInitProjectFiles: Mock;
22
+ export declare const displayProjectInfo: Mock;
23
+ export declare const displaySuccessMessage: Mock;
24
+ export declare const promptsMock: Mock;