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,37 +1,37 @@
1
- export declare const iconLibraries: {
2
- readonly lucide: {
3
- readonly name: "lucide";
4
- readonly title: "Lucide";
5
- readonly packages: readonly ["lucide-react"];
6
- readonly import: "import { ICON } from 'lucide-react'";
7
- readonly usage: "<ICON />";
8
- readonly export: "lucide-react";
9
- };
10
- readonly tabler: {
11
- readonly name: "tabler";
12
- readonly title: "Tabler Icons";
13
- readonly packages: readonly ["@tabler/icons-react"];
14
- readonly import: "import { ICON } from '@tabler/icons-react'";
15
- readonly usage: "<ICON />";
16
- readonly export: "@tabler/icons-react";
17
- };
18
- readonly hugeicons: {
19
- readonly name: "hugeicons";
20
- readonly title: "HugeIcons";
21
- readonly packages: readonly ["@hugeicons/react", "@hugeicons/core-free-icons"];
22
- readonly import: "import { HugeiconsIcon } from '@hugeicons/react'\nimport { ICON } from '@hugeicons/core-free-icons';";
23
- readonly usage: "<HugeiconsIcon icon={ICON} strokeWidth={2} />";
24
- readonly export: "@hugeicons/core-free-icons";
25
- };
26
- readonly phosphor: {
27
- readonly name: "phosphor";
28
- readonly title: "Phosphor Icons";
29
- readonly packages: readonly ["@phosphor-icons/react"];
30
- readonly import: "import { ICON } from '@phosphor-icons/react'";
31
- readonly usage: "<ICON strokeWidth={2} />";
32
- readonly export: "@phosphor-icons/react";
33
- };
34
- };
35
- export type IconLibraries = typeof iconLibraries;
36
- export type IconLibrary = IconLibraries[keyof IconLibraries];
37
- export type IconLibraryName = keyof IconLibraries;
1
+ export declare const iconLibraries: {
2
+ readonly lucide: {
3
+ readonly name: "lucide";
4
+ readonly title: "Lucide";
5
+ readonly packages: readonly ["lucide-react"];
6
+ readonly import: "import { ICON } from 'lucide-react'";
7
+ readonly usage: "<ICON />";
8
+ readonly export: "lucide-react";
9
+ };
10
+ readonly tabler: {
11
+ readonly name: "tabler";
12
+ readonly title: "Tabler Icons";
13
+ readonly packages: readonly ["@tabler/icons-react"];
14
+ readonly import: "import { ICON } from '@tabler/icons-react'";
15
+ readonly usage: "<ICON />";
16
+ readonly export: "@tabler/icons-react";
17
+ };
18
+ readonly hugeicons: {
19
+ readonly name: "hugeicons";
20
+ readonly title: "HugeIcons";
21
+ readonly packages: readonly ["@hugeicons/react", "@hugeicons/core-free-icons"];
22
+ readonly import: "import { HugeiconsIcon } from '@hugeicons/react'\nimport { ICON } from '@hugeicons/core-free-icons';";
23
+ readonly usage: "<HugeiconsIcon icon={ICON} strokeWidth={2} />";
24
+ readonly export: "@hugeicons/core-free-icons";
25
+ };
26
+ readonly phosphor: {
27
+ readonly name: "phosphor";
28
+ readonly title: "Phosphor Icons";
29
+ readonly packages: readonly ["@phosphor-icons/react"];
30
+ readonly import: "import { ICON } from '@phosphor-icons/react'";
31
+ readonly usage: "<ICON strokeWidth={2} />";
32
+ readonly export: "@phosphor-icons/react";
33
+ };
34
+ };
35
+ export type IconLibraries = typeof iconLibraries;
36
+ export type IconLibrary = IconLibraries[keyof IconLibraries];
37
+ export type IconLibraryName = keyof IconLibraries;
@@ -1,35 +1,35 @@
1
- export const iconLibraries = {
2
- lucide: {
3
- name: "lucide",
4
- title: "Lucide",
5
- packages: ["lucide-react"],
6
- import: "import { ICON } from 'lucide-react'",
7
- usage: "<ICON />",
8
- export: "lucide-react"
9
- },
10
- tabler: {
11
- name: "tabler",
12
- title: "Tabler Icons",
13
- packages: ["@tabler/icons-react"],
14
- import: "import { ICON } from '@tabler/icons-react'",
15
- usage: "<ICON />",
16
- export: "@tabler/icons-react"
17
- },
18
- hugeicons: {
19
- name: "hugeicons",
20
- title: "HugeIcons",
21
- packages: ["@hugeicons/react", "@hugeicons/core-free-icons"],
22
- import: "import { HugeiconsIcon } from '@hugeicons/react'\nimport { ICON } from '@hugeicons/core-free-icons';",
23
- usage: "<HugeiconsIcon icon={ICON} strokeWidth={2} />",
24
- export: "@hugeicons/core-free-icons"
25
- },
26
- phosphor: {
27
- name: "phosphor",
28
- title: "Phosphor Icons",
29
- packages: ["@phosphor-icons/react"],
30
- import: "import { ICON } from '@phosphor-icons/react'",
31
- usage: "<ICON strokeWidth={2} />",
32
- export: "@phosphor-icons/react"
33
- }
34
- };
1
+ export const iconLibraries = {
2
+ lucide: {
3
+ name: "lucide",
4
+ title: "Lucide",
5
+ packages: ["lucide-react"],
6
+ import: "import { ICON } from 'lucide-react'",
7
+ usage: "<ICON />",
8
+ export: "lucide-react"
9
+ },
10
+ tabler: {
11
+ name: "tabler",
12
+ title: "Tabler Icons",
13
+ packages: ["@tabler/icons-react"],
14
+ import: "import { ICON } from '@tabler/icons-react'",
15
+ usage: "<ICON />",
16
+ export: "@tabler/icons-react"
17
+ },
18
+ hugeicons: {
19
+ name: "hugeicons",
20
+ title: "HugeIcons",
21
+ packages: ["@hugeicons/react", "@hugeicons/core-free-icons"],
22
+ import: "import { HugeiconsIcon } from '@hugeicons/react'\nimport { ICON } from '@hugeicons/core-free-icons';",
23
+ usage: "<HugeiconsIcon icon={ICON} strokeWidth={2} />",
24
+ export: "@hugeicons/core-free-icons"
25
+ },
26
+ phosphor: {
27
+ name: "phosphor",
28
+ title: "Phosphor Icons",
29
+ packages: ["@phosphor-icons/react"],
30
+ import: "import { ICON } from '@phosphor-icons/react'",
31
+ usage: "<ICON strokeWidth={2} />",
32
+ export: "@phosphor-icons/react"
33
+ }
34
+ };
35
35
  //# sourceMappingURL=libraries.js.map
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- #!/usr/bin/env node
2
- export {};
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js CHANGED
@@ -1,31 +1,31 @@
1
- #!/usr/bin/env node
2
- import { Command } from "commander";
3
- import { createRequire } from "node:module";
4
- import { addCommand } from "./commands/add.js";
5
- import { addCompositeCommand } from "./commands/add-composite.js";
6
- import { addSectionCommand } from "./commands/add-section.js";
7
- import { addWrapperCommand } from "./commands/add-wrapper.js";
8
- // import { buildCommand } from "./commands/build.js"
9
- import { doctorCommand } from "./commands/doctor.js";
10
- import { initCommand } from "./commands/init.js";
11
- import { listCommand } from "./commands/list.js";
12
- import { removeCommand } from "./commands/remove.js";
13
- const require = createRequire(import.meta.url);
14
- const packageJson = require("../package.json");
15
- process.on("SIGINT", () => process.exit(0));
16
- process.on("SIGTERM", () => process.exit(0));
17
- const program = new Command()
18
- .name("ui")
19
- .description("Trix UI registry CLI")
20
- .version(packageJson.version ?? "0.0.0", "-v, --version", "display version");
21
- program.addCommand(initCommand);
22
- program.addCommand(addCommand);
23
- program.addCommand(addCompositeCommand);
24
- program.addCommand(addSectionCommand);
25
- program.addCommand(addWrapperCommand);
26
- // program.addCommand(buildCommand)
27
- program.addCommand(removeCommand);
28
- program.addCommand(listCommand);
29
- program.addCommand(doctorCommand);
30
- program.parse();
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { createRequire } from "node:module";
4
+ import { addCommand } from "./commands/add.js";
5
+ import { addCompositeCommand } from "./commands/add-composite.js";
6
+ import { addSectionCommand } from "./commands/add-section.js";
7
+ import { addWrapperCommand } from "./commands/add-wrapper.js";
8
+ // import { buildCommand } from "./commands/build.js"
9
+ import { doctorCommand } from "./commands/doctor.js";
10
+ import { initCommand } from "./commands/init.js";
11
+ import { listCommand } from "./commands/list.js";
12
+ import { removeCommand } from "./commands/remove.js";
13
+ const require = createRequire(import.meta.url);
14
+ const packageJson = require("../package.json");
15
+ process.on("SIGINT", () => process.exit(0));
16
+ process.on("SIGTERM", () => process.exit(0));
17
+ const program = new Command()
18
+ .name("ui")
19
+ .description("Trix UI registry CLI")
20
+ .version(packageJson.version ?? "0.0.0", "-v, --version", "display version");
21
+ program.addCommand(initCommand);
22
+ program.addCommand(addCommand);
23
+ program.addCommand(addCompositeCommand);
24
+ program.addCommand(addSectionCommand);
25
+ program.addCommand(addWrapperCommand);
26
+ // program.addCommand(buildCommand)
27
+ program.addCommand(removeCommand);
28
+ program.addCommand(listCommand);
29
+ program.addCommand(doctorCommand);
30
+ program.parse();
31
31
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,49 @@
1
+ import path from "node:path";
2
+ import { describe, expect, it } from "vitest";
3
+ import { createTempDir, removeDir, writeJson } from "../../__tests__/helpers/fs.js";
4
+ import { DEFAULT_CONFIG, loadConfig, updateConfig, writeConfig } from "../config.js";
5
+ describe("config", () => {
6
+ it("merges defaults when loading config", async () => {
7
+ const cwd = await createTempDir("trix-ui-config-");
8
+ try {
9
+ await writeJson(path.join(cwd, "trix-ui.json"), {
10
+ paths: {
11
+ components: "components/ui"
12
+ }
13
+ });
14
+ const config = await loadConfig(cwd);
15
+ expect(config.paths.components).toBe("components/ui");
16
+ expect(config.paths.sections).toBe(DEFAULT_CONFIG.paths.sections);
17
+ expect(config.framework).toBe(DEFAULT_CONFIG.framework);
18
+ }
19
+ finally {
20
+ await removeDir(cwd);
21
+ }
22
+ });
23
+ it("writes schema when creating config", async () => {
24
+ const cwd = await createTempDir("trix-ui-config-");
25
+ try {
26
+ await writeConfig(cwd, DEFAULT_CONFIG, true);
27
+ const config = await loadConfig(cwd);
28
+ expect(config.$schema).toBeDefined();
29
+ }
30
+ finally {
31
+ await removeDir(cwd);
32
+ }
33
+ });
34
+ it("updates config paths via updateConfig", async () => {
35
+ const cwd = await createTempDir("trix-ui-config-");
36
+ try {
37
+ await writeConfig(cwd, DEFAULT_CONFIG, true);
38
+ await updateConfig(cwd, {
39
+ paths: { components: "src/components/ui" }
40
+ });
41
+ const config = await loadConfig(cwd);
42
+ expect(config.paths.components).toBe("src/components/ui");
43
+ }
44
+ finally {
45
+ await removeDir(cwd);
46
+ }
47
+ });
48
+ });
49
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACnF,OAAO,EACL,cAAc,EACd,UAAU,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,cAAc,CAAA;AAErB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAA;QAClD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE;gBAC9C,KAAK,EAAE;oBACL,UAAU,EAAE,eAAe;iBAC5B;aACF,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YACjE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;QACzD,CAAC;gBAAS,CAAC;YACT,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAA;QAClD,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAA;YAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;YACpC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;QACtC,CAAC;gBAAS,CAAC;YACT,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAA;QAClD,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAA;YAC5C,MAAM,YAAY,CAAC,GAAG,EAAE;gBACtB,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE;aAC3C,CAAC,CAAA;YACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC3D,CAAC;gBAAS,CAAC;YACT,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,149 @@
1
+ import path from "node:path";
2
+ import { describe, expect, it } from "vitest";
3
+ import { createTempDir, pathExists, removeDir, writeFile, writeJson } from "../../__tests__/helpers/fs.js";
4
+ import { installRegistryEntries } from "../install.js";
5
+ describe("install", () => {
6
+ it("installs registry entries and updates lock entries", async () => {
7
+ const cwd = await createTempDir("trix-ui-install-");
8
+ try {
9
+ const registryPath = path.join(cwd, "registry", "index.json");
10
+ const templatesPath = path.join(cwd, "templates");
11
+ await writeJson(registryPath, { version: 1, components: [] });
12
+ await writeFile(path.join(templatesPath, "components", "ui", "button.tsx"), "export const button = () => null;");
13
+ const lockEntries = {};
14
+ const result = await installRegistryEntries({
15
+ cwd,
16
+ config: {
17
+ registry: { type: "local", path: "registry/index.json" },
18
+ typescript: true,
19
+ tailwind: true,
20
+ framework: "react",
21
+ barrel: false,
22
+ paths: {
23
+ components: "components/ui",
24
+ sections: "components/sections",
25
+ wrappers: "components/wrappers",
26
+ composites: "components/composites",
27
+ utils: "lib/utils.ts",
28
+ styles: "styles/globals.css"
29
+ }
30
+ },
31
+ entries: [
32
+ {
33
+ name: "button",
34
+ description: "Button",
35
+ files: [
36
+ {
37
+ source: "components/ui/button.tsx",
38
+ target: "{{components}}/button.tsx"
39
+ }
40
+ ]
41
+ }
42
+ ],
43
+ names: ["button"],
44
+ lockEntries,
45
+ force: false,
46
+ itemLabel: "component"
47
+ });
48
+ expect(result.installed).toEqual(["button"]);
49
+ expect(await pathExists(path.join(cwd, "components", "ui", "button.tsx"))).toBe(true);
50
+ expect(lockEntries.button).toBeDefined();
51
+ }
52
+ finally {
53
+ await removeDir(cwd);
54
+ }
55
+ });
56
+ it("skips install when target exists and force is false", async () => {
57
+ const cwd = await createTempDir("trix-ui-install-");
58
+ try {
59
+ const registryPath = path.join(cwd, "registry", "index.json");
60
+ await writeJson(registryPath, { version: 1, components: [] });
61
+ await writeFile(path.join(cwd, "components", "ui", "button.tsx"), "existing");
62
+ const lockEntries = {};
63
+ const result = await installRegistryEntries({
64
+ cwd,
65
+ config: {
66
+ registry: { type: "local", path: "registry/index.json" },
67
+ typescript: true,
68
+ tailwind: true,
69
+ framework: "react",
70
+ barrel: false,
71
+ paths: {
72
+ components: "components/ui",
73
+ sections: "components/sections",
74
+ wrappers: "components/wrappers",
75
+ composites: "components/composites",
76
+ utils: "lib/utils.ts",
77
+ styles: "styles/globals.css"
78
+ }
79
+ },
80
+ entries: [
81
+ {
82
+ name: "button",
83
+ description: "Button",
84
+ files: [
85
+ {
86
+ source: "components/ui/button.tsx",
87
+ target: "{{components}}/button.tsx"
88
+ }
89
+ ]
90
+ }
91
+ ],
92
+ names: ["button"],
93
+ lockEntries,
94
+ force: false,
95
+ itemLabel: "component"
96
+ });
97
+ expect(result.skipped).toEqual(["button"]);
98
+ }
99
+ finally {
100
+ await removeDir(cwd);
101
+ }
102
+ });
103
+ it("rejects targets that escape the project root", async () => {
104
+ const cwd = await createTempDir("trix-ui-install-");
105
+ try {
106
+ const registryPath = path.join(cwd, "registry", "index.json");
107
+ await writeJson(registryPath, { version: 1, components: [] });
108
+ const lockEntries = {};
109
+ await expect(installRegistryEntries({
110
+ cwd,
111
+ config: {
112
+ registry: { type: "local", path: "registry/index.json" },
113
+ typescript: true,
114
+ tailwind: true,
115
+ framework: "react",
116
+ barrel: false,
117
+ paths: {
118
+ components: "components/ui",
119
+ sections: "components/sections",
120
+ wrappers: "components/wrappers",
121
+ composites: "components/composites",
122
+ utils: "lib/utils.ts",
123
+ styles: "styles/globals.css"
124
+ }
125
+ },
126
+ entries: [
127
+ {
128
+ name: "bad",
129
+ description: "Bad",
130
+ files: [
131
+ {
132
+ source: "components/ui/bad.tsx",
133
+ target: "../bad.tsx"
134
+ }
135
+ ]
136
+ }
137
+ ],
138
+ names: ["bad"],
139
+ lockEntries,
140
+ force: false,
141
+ itemLabel: "component"
142
+ })).rejects.toThrow(/outside of the root directory/i);
143
+ }
144
+ finally {
145
+ await removeDir(cwd);
146
+ }
147
+ });
148
+ });
149
+ //# sourceMappingURL=install.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/install.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,89 @@
1
+ import path from "node:path";
2
+ import { describe, expect, it } from "vitest";
3
+ import { createTempDir, pathExists, removeDir, writeJson } from "../../__tests__/helpers/fs.js";
4
+ import { createEmptyLockfile, loadLockfile, saveLockfile, validateLockfile } from "../lockfile.js";
5
+ describe("lockfile", () => {
6
+ it("creates an empty lockfile when none exists", async () => {
7
+ const cwd = await createTempDir("trix-ui-lock-");
8
+ try {
9
+ const lockfile = await loadLockfile(cwd);
10
+ expect(lockfile.version).toBe(1);
11
+ expect(lockfile.components).toEqual({});
12
+ }
13
+ finally {
14
+ await removeDir(cwd);
15
+ }
16
+ });
17
+ it("loads legacy lockfile when present", async () => {
18
+ const cwd = await createTempDir("trix-ui-lock-");
19
+ try {
20
+ await writeJson(path.join(cwd, "trix-ui.lock.json"), {
21
+ version: 1,
22
+ components: { button: { files: [], version: "1", installedAt: "" } },
23
+ sections: {},
24
+ wrappers: {},
25
+ composites: {}
26
+ });
27
+ const lockfile = await loadLockfile(cwd);
28
+ expect(lockfile.components.button).toBeDefined();
29
+ }
30
+ finally {
31
+ await removeDir(cwd);
32
+ }
33
+ });
34
+ it("saves lockfile to .ui/lock.json", async () => {
35
+ const cwd = await createTempDir("trix-ui-lock-");
36
+ try {
37
+ await saveLockfile(cwd, createEmptyLockfile());
38
+ const lockfilePath = path.join(cwd, ".ui", "lock.json");
39
+ expect(await pathExists(lockfilePath)).toBe(true);
40
+ }
41
+ finally {
42
+ await removeDir(cwd);
43
+ }
44
+ });
45
+ it("validates missing files across entry types", async () => {
46
+ const cwd = await createTempDir("trix-ui-lock-");
47
+ try {
48
+ await writeJson(path.join(cwd, ".ui", "lock.json"), {
49
+ version: 1,
50
+ components: {
51
+ button: {
52
+ version: "1",
53
+ files: ["components/ui/button.tsx"],
54
+ installedAt: ""
55
+ }
56
+ },
57
+ sections: {
58
+ hero: {
59
+ version: "1",
60
+ files: ["components/sections/hero.tsx"],
61
+ installedAt: ""
62
+ }
63
+ },
64
+ wrappers: {},
65
+ composites: {}
66
+ });
67
+ const result = await validateLockfile(cwd, {
68
+ typescript: true,
69
+ tailwind: true,
70
+ framework: "react",
71
+ barrel: false,
72
+ paths: {
73
+ components: "components/ui",
74
+ sections: "components/sections",
75
+ wrappers: "components/wrappers",
76
+ composites: "components/composites",
77
+ utils: "lib/utils.ts",
78
+ styles: "styles/globals.css"
79
+ }
80
+ });
81
+ expect(result.valid).toBe(true);
82
+ expect(result.warnings.length).toBeGreaterThan(0);
83
+ }
84
+ finally {
85
+ await removeDir(cwd);
86
+ }
87
+ });
88
+ });
89
+ //# sourceMappingURL=lockfile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/lockfile.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,39 @@
1
+ import path from "node:path";
2
+ import { describe, expect, it } from "vitest";
3
+ import { fromPosix, resolveTargetPath, resolveTemplatePath, toPosix } from "../paths.js";
4
+ describe("paths", () => {
5
+ it("normalizes toPosix and fromPosix", () => {
6
+ const joined = path.join("components", "ui", "button.tsx");
7
+ const posix = toPosix(joined);
8
+ expect(posix).toBe("components/ui/button.tsx");
9
+ expect(fromPosix(posix)).toBe(joined);
10
+ });
11
+ it("resolves target tokens inside project root", () => {
12
+ const cwd = path.resolve("project-root");
13
+ const resolved = resolveTargetPath(cwd, "{{components}}/button.tsx", {
14
+ components: "components/ui",
15
+ sections: "components/sections",
16
+ wrappers: "components/wrappers",
17
+ composites: "components/composites",
18
+ utils: "lib/utils.ts",
19
+ styles: "styles/globals.css"
20
+ });
21
+ expect(resolved).toBe(path.resolve(cwd, "components", "ui", "button.tsx"));
22
+ });
23
+ it("rejects target paths that escape the project root", () => {
24
+ const cwd = path.resolve("project-root");
25
+ expect(() => resolveTargetPath(cwd, "../secrets.txt", {
26
+ components: "components/ui",
27
+ sections: "components/sections",
28
+ wrappers: "components/wrappers",
29
+ composites: "components/composites",
30
+ utils: "lib/utils.ts",
31
+ styles: "styles/globals.css"
32
+ })).toThrow(/outside of the root directory/i);
33
+ });
34
+ it("rejects template paths that escape the template root", () => {
35
+ const templateRoot = path.resolve("templates-root");
36
+ expect(() => resolveTemplatePath("../hack.tsx", templateRoot)).toThrow(/outside of the root directory/i);
37
+ });
38
+ });
39
+ //# sourceMappingURL=paths.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/paths.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,OAAO,EACR,MAAM,aAAa,CAAA;AAEpB,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QAC9C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,2BAA2B,EAAE;YACnE,UAAU,EAAE,eAAe;YAC3B,QAAQ,EAAE,qBAAqB;YAC/B,QAAQ,EAAE,qBAAqB;YAC/B,UAAU,EAAE,uBAAuB;YACnC,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,oBAAoB;SAC7B,CAAC,CAAA;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CACnB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,CACpD,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;QACxC,MAAM,CAAC,GAAG,EAAE,CACV,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,EAAE;YACvC,UAAU,EAAE,eAAe;YAC3B,QAAQ,EAAE,qBAAqB;YAC/B,QAAQ,EAAE,qBAAqB;YAC/B,UAAU,EAAE,uBAAuB;YACnC,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,oBAAoB;SAC7B,CAAC,CACH,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QACnD,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CACpE,gCAAgC,CACjC,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};