trix-ui 0.2.13 → 0.3.0

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 (241) hide show
  1. package/dist/commands/add/analysis.d.ts +4 -4
  2. package/dist/commands/add/analysis.js +56 -56
  3. package/dist/commands/add/command.d.ts +2 -2
  4. package/dist/commands/add/command.js +205 -202
  5. package/dist/commands/add/command.js.map +1 -1
  6. package/dist/commands/add/config.d.ts +2 -2
  7. package/dist/commands/add/config.js +11 -11
  8. package/dist/commands/add/install.d.ts +27 -27
  9. package/dist/commands/add/install.js +80 -80
  10. package/dist/commands/add/package-manager.d.ts +1 -1
  11. package/dist/commands/add/package-manager.js +4 -4
  12. package/dist/commands/add/project-files.d.ts +2 -2
  13. package/dist/commands/add/project-files.js +17 -17
  14. package/dist/commands/add/prompts.d.ts +3 -3
  15. package/dist/commands/add/prompts.js +28 -28
  16. package/dist/commands/add/registry.d.ts +4 -4
  17. package/dist/commands/add/registry.js +6 -6
  18. package/dist/commands/add/types.d.ts +33 -33
  19. package/dist/commands/add/types.js +1 -1
  20. package/dist/commands/add/ui.d.ts +4 -4
  21. package/dist/commands/add/ui.js +55 -55
  22. package/dist/commands/add/validation.d.ts +3 -3
  23. package/dist/commands/add/validation.js +30 -30
  24. package/dist/commands/add-collection.d.ts +1 -1
  25. package/dist/commands/add-collection.js +1 -1
  26. package/dist/commands/add-composite.d.ts +2 -2
  27. package/dist/commands/add-composite.js +205 -201
  28. package/dist/commands/add-composite.js.map +1 -1
  29. package/dist/commands/add-section.d.ts +2 -2
  30. package/dist/commands/add-section.js +205 -201
  31. package/dist/commands/add-section.js.map +1 -1
  32. package/dist/commands/add-wrapper.d.ts +2 -2
  33. package/dist/commands/add-wrapper.js +205 -201
  34. package/dist/commands/add-wrapper.js.map +1 -1
  35. package/dist/commands/add.d.ts +1 -1
  36. package/dist/commands/add.js +1 -1
  37. package/dist/commands/build.d.ts +2 -2
  38. package/dist/commands/build.js +104 -104
  39. package/dist/commands/build.js.map +1 -1
  40. package/dist/commands/doctor.d.ts +2 -2
  41. package/dist/commands/doctor.js +67 -67
  42. package/dist/commands/doctor.js.map +1 -1
  43. package/dist/commands/init/command.d.ts +8 -2
  44. package/dist/commands/init/command.js +186 -114
  45. package/dist/commands/init/command.js.map +1 -1
  46. package/dist/commands/init/config.d.ts +9 -2
  47. package/dist/commands/init/config.js +45 -25
  48. package/dist/commands/init/config.js.map +1 -1
  49. package/dist/commands/init/constants.d.ts +3 -3
  50. package/dist/commands/init/constants.js +105 -105
  51. package/dist/commands/init/dependencies.d.ts +22 -5
  52. package/dist/commands/init/dependencies.js +86 -52
  53. package/dist/commands/init/dependencies.js.map +1 -1
  54. package/dist/commands/init/filesystem.d.ts +7 -1
  55. package/dist/commands/init/filesystem.js +16 -10
  56. package/dist/commands/init/filesystem.js.map +1 -1
  57. package/dist/commands/init/lockfile.d.ts +1 -1
  58. package/dist/commands/init/lockfile.js +1 -1
  59. package/dist/commands/init/package-json.d.ts +17 -6
  60. package/dist/commands/init/package-json.js +28 -18
  61. package/dist/commands/init/package-json.js.map +1 -1
  62. package/dist/commands/init/project.d.ts +15 -3
  63. package/dist/commands/init/project.js +120 -97
  64. package/dist/commands/init/project.js.map +1 -1
  65. package/dist/commands/init/tailwind.d.ts +14 -3
  66. package/dist/commands/init/tailwind.js +141 -33
  67. package/dist/commands/init/tailwind.js.map +1 -1
  68. package/dist/commands/init/templates.d.ts +15 -3
  69. package/dist/commands/init/templates.js +27 -15
  70. package/dist/commands/init/templates.js.map +1 -1
  71. package/dist/commands/init/tsconfig.d.ts +14 -2
  72. package/dist/commands/init/tsconfig.js +561 -273
  73. package/dist/commands/init/tsconfig.js.map +1 -1
  74. package/dist/commands/init/types.d.ts +34 -33
  75. package/dist/commands/init/types.js +1 -1
  76. package/dist/commands/init/ui.d.ts +12 -3
  77. package/dist/commands/init/ui.js +45 -33
  78. package/dist/commands/init/ui.js.map +1 -1
  79. package/dist/commands/init/vite.d.ts +1 -1
  80. package/dist/commands/init/vite.js +17 -27
  81. package/dist/commands/init/vite.js.map +1 -1
  82. package/dist/commands/init.d.ts +1 -1
  83. package/dist/commands/init.js +1 -1
  84. package/dist/commands/list.d.ts +2 -2
  85. package/dist/commands/list.js +69 -62
  86. package/dist/commands/list.js.map +1 -1
  87. package/dist/commands/remove.d.ts +2 -2
  88. package/dist/commands/remove.js +95 -93
  89. package/dist/commands/remove.js.map +1 -1
  90. package/dist/commands/shared/add-collection.d.ts +50 -50
  91. package/dist/commands/shared/add-collection.js +206 -206
  92. package/dist/commands/shared/list-entries.d.ts +6 -6
  93. package/dist/commands/shared/list-entries.js +12 -12
  94. package/dist/commands/shared/name-utils.d.ts +1 -1
  95. package/dist/commands/shared/name-utils.js +13 -13
  96. package/dist/commands/shared/remove-entries.d.ts +16 -16
  97. package/dist/commands/shared/remove-entries.js +41 -41
  98. package/dist/icons/index.d.ts +1 -1
  99. package/dist/icons/index.js +1 -1
  100. package/dist/icons/libraries.d.ts +37 -37
  101. package/dist/icons/libraries.js +34 -34
  102. package/dist/index.d.ts +1 -2
  103. package/dist/index.js +29 -30
  104. package/dist/index.js.map +1 -1
  105. package/dist/lib/config.d.ts +45 -45
  106. package/dist/lib/config.js +97 -97
  107. package/dist/lib/fs.d.ts +82 -76
  108. package/dist/lib/fs.js +299 -302
  109. package/dist/lib/fs.js.map +1 -1
  110. package/dist/lib/highlighter.d.ts +6 -6
  111. package/dist/lib/highlighter.js +7 -7
  112. package/dist/lib/install.d.ts +19 -19
  113. package/dist/lib/install.js +101 -55
  114. package/dist/lib/install.js.map +1 -1
  115. package/dist/lib/lockfile.d.ts +63 -63
  116. package/dist/lib/lockfile.js +179 -173
  117. package/dist/lib/lockfile.js.map +1 -1
  118. package/dist/lib/logger.d.ts +8 -8
  119. package/dist/lib/logger.js +41 -41
  120. package/dist/lib/logger.js.map +1 -1
  121. package/dist/lib/paths.d.ts +14 -14
  122. package/dist/lib/paths.js +41 -31
  123. package/dist/lib/paths.js.map +1 -1
  124. package/dist/lib/registry.d.ts +35 -35
  125. package/dist/lib/registry.js +180 -180
  126. package/dist/schema/index.d.ts +1128 -1128
  127. package/dist/schema/index.js +237 -238
  128. package/dist/schema/index.js.map +1 -1
  129. package/dist/styles/create-style-map.d.ts +4 -4
  130. package/dist/styles/create-style-map.js +68 -68
  131. package/dist/styles/transform-style-map.d.ts +3 -3
  132. package/dist/styles/transform-style-map.js +428 -428
  133. package/dist/styles/transform.d.ts +10 -10
  134. package/dist/styles/transform.js +15 -15
  135. package/dist/utils/index.d.ts +6 -6
  136. package/dist/utils/index.js +5 -5
  137. package/dist/utils/transformers/transform-icons.d.ts +2 -2
  138. package/dist/utils/transformers/transform-icons.js +164 -164
  139. package/dist/utils/transformers/transform-menu.d.ts +2 -2
  140. package/dist/utils/transformers/transform-menu.js +39 -39
  141. package/dist/utils/transformers/transform-render.d.ts +2 -2
  142. package/dist/utils/transformers/transform-render.js +97 -97
  143. package/dist/utils/transformers/types.d.ts +14 -14
  144. package/dist/utils/transformers/types.js +1 -1
  145. package/package.json +3 -2
  146. package/dist/__tests__/contracts/registry.test.d.ts +0 -1
  147. package/dist/__tests__/contracts/registry.test.js +0 -42
  148. package/dist/__tests__/contracts/registry.test.js.map +0 -1
  149. package/dist/__tests__/e2e/cli.test.d.ts +0 -1
  150. package/dist/__tests__/e2e/cli.test.js +0 -67
  151. package/dist/__tests__/e2e/cli.test.js.map +0 -1
  152. package/dist/__tests__/helpers/fs.d.ts +0 -5
  153. package/dist/__tests__/helpers/fs.js +0 -26
  154. package/dist/__tests__/helpers/fs.js.map +0 -1
  155. package/dist/__tests__/integration/commands.integration.test.d.ts +0 -1
  156. package/dist/__tests__/integration/commands.integration.test.js +0 -184
  157. package/dist/__tests__/integration/commands.integration.test.js.map +0 -1
  158. package/dist/commands/__tests__/add-composite.test.d.ts +0 -2
  159. package/dist/commands/__tests__/add-composite.test.js +0 -171
  160. package/dist/commands/__tests__/add-composite.test.js.map +0 -1
  161. package/dist/commands/__tests__/add-entry.mocks.d.ts +0 -23
  162. package/dist/commands/__tests__/add-entry.mocks.js +0 -64
  163. package/dist/commands/__tests__/add-entry.mocks.js.map +0 -1
  164. package/dist/commands/__tests__/add-section.test.d.ts +0 -2
  165. package/dist/commands/__tests__/add-section.test.js +0 -191
  166. package/dist/commands/__tests__/add-section.test.js.map +0 -1
  167. package/dist/commands/__tests__/add-wrapper.test.d.ts +0 -2
  168. package/dist/commands/__tests__/add-wrapper.test.js +0 -171
  169. package/dist/commands/__tests__/add-wrapper.test.js.map +0 -1
  170. package/dist/commands/__tests__/cli-mocks.d.ts +0 -1
  171. package/dist/commands/__tests__/cli-mocks.js +0 -24
  172. package/dist/commands/__tests__/cli-mocks.js.map +0 -1
  173. package/dist/commands/__tests__/doctor.mocks.d.ts +0 -6
  174. package/dist/commands/__tests__/doctor.mocks.js +0 -20
  175. package/dist/commands/__tests__/doctor.mocks.js.map +0 -1
  176. package/dist/commands/__tests__/doctor.test.d.ts +0 -2
  177. package/dist/commands/__tests__/doctor.test.js +0 -80
  178. package/dist/commands/__tests__/doctor.test.js.map +0 -1
  179. package/dist/commands/__tests__/list.mocks.d.ts +0 -8
  180. package/dist/commands/__tests__/list.mocks.js +0 -20
  181. package/dist/commands/__tests__/list.mocks.js.map +0 -1
  182. package/dist/commands/__tests__/list.test.d.ts +0 -2
  183. package/dist/commands/__tests__/list.test.js +0 -60
  184. package/dist/commands/__tests__/list.test.js.map +0 -1
  185. package/dist/commands/__tests__/remove.mocks.d.ts +0 -9
  186. package/dist/commands/__tests__/remove.mocks.js +0 -26
  187. package/dist/commands/__tests__/remove.mocks.js.map +0 -1
  188. package/dist/commands/__tests__/remove.test.d.ts +0 -2
  189. package/dist/commands/__tests__/remove.test.js +0 -116
  190. package/dist/commands/__tests__/remove.test.js.map +0 -1
  191. package/dist/commands/add/__tests__/__mocks__/cli-mocks.d.ts +0 -1
  192. package/dist/commands/add/__tests__/__mocks__/cli-mocks.js +0 -21
  193. package/dist/commands/add/__tests__/__mocks__/cli-mocks.js.map +0 -1
  194. package/dist/commands/add/__tests__/add.mocks.d.ts +0 -19
  195. package/dist/commands/add/__tests__/add.mocks.js +0 -60
  196. package/dist/commands/add/__tests__/add.mocks.js.map +0 -1
  197. package/dist/commands/add/__tests__/add.test.d.ts +0 -2
  198. package/dist/commands/add/__tests__/add.test.js +0 -141
  199. package/dist/commands/add/__tests__/add.test.js.map +0 -1
  200. package/dist/commands/init/__tests__/init.mocks.d.ts +0 -24
  201. package/dist/commands/init/__tests__/init.mocks.js +0 -84
  202. package/dist/commands/init/__tests__/init.mocks.js.map +0 -1
  203. package/dist/commands/init/__tests__/init.test.d.ts +0 -2
  204. package/dist/commands/init/__tests__/init.test.js +0 -283
  205. package/dist/commands/init/__tests__/init.test.js.map +0 -1
  206. package/dist/commands/init/__tests__/tailwind.test.d.ts +0 -1
  207. package/dist/commands/init/__tests__/tailwind.test.js +0 -56
  208. package/dist/commands/init/__tests__/tailwind.test.js.map +0 -1
  209. package/dist/commands/init/__tests__/tsconfig.test.d.ts +0 -1
  210. package/dist/commands/init/__tests__/tsconfig.test.js +0 -108
  211. package/dist/commands/init/__tests__/tsconfig.test.js.map +0 -1
  212. package/dist/commands/init/__tests__/vite.test.d.ts +0 -1
  213. package/dist/commands/init/__tests__/vite.test.js +0 -66
  214. package/dist/commands/init/__tests__/vite.test.js.map +0 -1
  215. package/dist/commands/list-sections.d.ts +0 -2
  216. package/dist/commands/list-sections.js +0 -20
  217. package/dist/commands/list-sections.js.map +0 -1
  218. package/dist/commands/list-wrappers.d.ts +0 -2
  219. package/dist/commands/list-wrappers.js +0 -20
  220. package/dist/commands/list-wrappers.js.map +0 -1
  221. package/dist/commands/remove-section.d.ts +0 -2
  222. package/dist/commands/remove-section.js +0 -37
  223. package/dist/commands/remove-section.js.map +0 -1
  224. package/dist/commands/remove-wrapper.d.ts +0 -2
  225. package/dist/commands/remove-wrapper.js +0 -37
  226. package/dist/commands/remove-wrapper.js.map +0 -1
  227. package/dist/lib/__tests__/config.test.d.ts +0 -1
  228. package/dist/lib/__tests__/config.test.js +0 -49
  229. package/dist/lib/__tests__/config.test.js.map +0 -1
  230. package/dist/lib/__tests__/install.test.d.ts +0 -1
  231. package/dist/lib/__tests__/install.test.js +0 -149
  232. package/dist/lib/__tests__/install.test.js.map +0 -1
  233. package/dist/lib/__tests__/lockfile.test.d.ts +0 -1
  234. package/dist/lib/__tests__/lockfile.test.js +0 -89
  235. package/dist/lib/__tests__/lockfile.test.js.map +0 -1
  236. package/dist/lib/__tests__/paths.test.d.ts +0 -1
  237. package/dist/lib/__tests__/paths.test.js +0 -39
  238. package/dist/lib/__tests__/paths.test.js.map +0 -1
  239. package/dist/lib/__tests__/registry.test.d.ts +0 -1
  240. package/dist/lib/__tests__/registry.test.js +0 -76
  241. package/dist/lib/__tests__/registry.test.js.map +0 -1
@@ -1,10 +1,10 @@
1
- import { type SourceFile } from "ts-morph";
2
- import { type StyleMap } from "./create-style-map.js";
3
- export type TransformerStyle<Output = SourceFile> = (opts: {
4
- sourceFile: SourceFile;
5
- styleMap: StyleMap;
6
- }) => Promise<Output>;
7
- export declare function transformStyle(source: string, { styleMap, transformers, }: {
8
- styleMap: StyleMap;
9
- transformers?: TransformerStyle<SourceFile>[];
10
- }): Promise<string>;
1
+ import { type SourceFile } from "ts-morph";
2
+ import { type StyleMap } from "./create-style-map.js";
3
+ export type TransformerStyle<Output = SourceFile> = (opts: {
4
+ sourceFile: SourceFile;
5
+ styleMap: StyleMap;
6
+ }) => Promise<Output>;
7
+ export declare function transformStyle(source: string, { styleMap, transformers, }: {
8
+ styleMap: StyleMap;
9
+ transformers?: TransformerStyle<SourceFile>[];
10
+ }): Promise<string>;
@@ -1,16 +1,16 @@
1
- import { Project, ScriptKind } from "ts-morph";
2
- import { transformStyleMap } from "./transform-style-map.js";
3
- export async function transformStyle(source, { styleMap, transformers = [transformStyleMap], }) {
4
- const project = new Project({
5
- useInMemoryFileSystem: true,
6
- });
7
- const sourceFile = project.createSourceFile("component.tsx", source, {
8
- scriptKind: ScriptKind.TSX,
9
- overwrite: true,
10
- });
11
- for (const transformer of transformers) {
12
- await transformer({ sourceFile, styleMap });
13
- }
14
- return sourceFile.getText();
15
- }
1
+ import { Project, ScriptKind } from "ts-morph";
2
+ import { transformStyleMap } from "./transform-style-map.js";
3
+ export async function transformStyle(source, { styleMap, transformers = [transformStyleMap], }) {
4
+ const project = new Project({
5
+ useInMemoryFileSystem: true,
6
+ });
7
+ const sourceFile = project.createSourceFile("component.tsx", source, {
8
+ scriptKind: ScriptKind.TSX,
9
+ overwrite: true,
10
+ });
11
+ for (const transformer of transformers) {
12
+ await transformer({ sourceFile, styleMap });
13
+ }
14
+ return sourceFile.getText();
15
+ }
16
16
  //# sourceMappingURL=transform.js.map
@@ -1,6 +1,6 @@
1
- export { createStyleMap } from "../styles/create-style-map.js";
2
- export { transformStyle } from "../styles/transform.js";
3
- export { transformIcons } from "./transformers/transform-icons.js";
4
- export { transformMenu } from "./transformers/transform-menu.js";
5
- export { transformRender } from "./transformers/transform-render.js";
6
- export type { TransformConfig, TransformOpts, Transformer } from "./transformers/types.js";
1
+ export { createStyleMap } from "../styles/create-style-map.js";
2
+ export { transformStyle } from "../styles/transform.js";
3
+ export { transformIcons } from "./transformers/transform-icons.js";
4
+ export { transformMenu } from "./transformers/transform-menu.js";
5
+ export { transformRender } from "./transformers/transform-render.js";
6
+ export type { TransformConfig, TransformOpts, Transformer } from "./transformers/types.js";
@@ -1,6 +1,6 @@
1
- export { createStyleMap } from "../styles/create-style-map.js";
2
- export { transformStyle } from "../styles/transform.js";
3
- export { transformIcons } from "./transformers/transform-icons.js";
4
- export { transformMenu } from "./transformers/transform-menu.js";
5
- export { transformRender } from "./transformers/transform-render.js";
1
+ export { createStyleMap } from "../styles/create-style-map.js";
2
+ export { transformStyle } from "../styles/transform.js";
3
+ export { transformIcons } from "./transformers/transform-icons.js";
4
+ export { transformMenu } from "./transformers/transform-menu.js";
5
+ export { transformRender } from "./transformers/transform-render.js";
6
6
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import { Transformer } from "./types.js";
2
- export declare const transformIcons: Transformer;
1
+ import { Transformer } from "./types.js";
2
+ export declare const transformIcons: Transformer;
@@ -1,165 +1,165 @@
1
- import { iconLibraries } from "../../icons/libraries.js";
2
- import { SyntaxKind } from "ts-morph";
3
- export const transformIcons = async ({ sourceFile, config }) => {
4
- const iconLibrary = config.iconLibrary;
5
- // Fail silently if the icon library is not supported.
6
- // This is for legacy icon libraries.
7
- if (!iconLibrary || !(iconLibrary in iconLibraries)) {
8
- return sourceFile;
9
- }
10
- const targetLibrary = iconLibrary;
11
- const libraryConfig = iconLibraries[targetLibrary];
12
- let transformedIcons = [];
13
- for (const element of sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)) {
14
- if (element.getTagNameNode()?.getText() !== "IconPlaceholder") {
15
- continue;
16
- }
17
- // Find the library-specific prop (e.g., "lucide", "tabler", "hugeicons")
18
- const libraryPropAttr = element.getAttributes().find((attr) => {
19
- if (attr.getKind() !== SyntaxKind.JsxAttribute) {
20
- return false;
21
- }
22
- const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);
23
- return jsxAttr.getNameNode().getText() === targetLibrary;
24
- });
25
- if (!libraryPropAttr) {
26
- continue; // No icon specified for this library
27
- }
28
- const jsxIconAttr = libraryPropAttr.asKindOrThrow(SyntaxKind.JsxAttribute);
29
- const targetIconName = jsxIconAttr
30
- .getInitializer()
31
- ?.getText()
32
- .replace(/^["']|["']$/g, "");
33
- if (!targetIconName) {
34
- continue;
35
- }
36
- if (!transformedIcons.includes(targetIconName)) {
37
- transformedIcons.push(targetIconName);
38
- }
39
- const usage = libraryConfig.usage;
40
- const usageMatch = usage.match(/<(\w+)([^>]*)\s*\/>/);
41
- // Remove the library-specific prop
42
- jsxIconAttr.remove();
43
- // Remove all other library-specific props
44
- for (const attr of element.getAttributes()) {
45
- if (attr.getKind() !== SyntaxKind.JsxAttribute) {
46
- continue;
47
- }
48
- const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);
49
- const attrName = jsxAttr.getNameNode().getText();
50
- // Filter out library-specific props (lucide, tabler, hugeicons, etc.)
51
- if (attrName in iconLibraries) {
52
- jsxAttr.remove();
53
- }
54
- }
55
- if (!usageMatch) {
56
- element.getTagNameNode()?.replaceWithText(targetIconName);
57
- continue;
58
- }
59
- const [, componentName, defaultPropsStr] = usageMatch;
60
- if (componentName === "ICON") {
61
- // Get remaining user attributes (non-library props)
62
- const userAttributes = element
63
- .getAttributes()
64
- .filter((attr) => {
65
- if (attr.getKind() !== SyntaxKind.JsxAttribute) {
66
- return true;
67
- }
68
- const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);
69
- const attrName = jsxAttr.getNameNode().getText();
70
- // Filter out library-specific props (lucide, tabler, hugeicons, etc.)
71
- return !(attrName in iconLibraries);
72
- })
73
- .map((attr) => attr.getText())
74
- .join(" ");
75
- if (userAttributes.trim()) {
76
- element.replaceWithText(`<${targetIconName} ${userAttributes} />`);
77
- }
78
- else {
79
- element.getTagNameNode()?.replaceWithText(targetIconName);
80
- }
81
- }
82
- else {
83
- const existingPropNames = new Set(element
84
- .getAttributes()
85
- .filter((attr) => attr.getKind() === SyntaxKind.JsxAttribute)
86
- .map((attr) => attr.asKindOrThrow(SyntaxKind.JsxAttribute).getNameNode().getText()));
87
- // Replace ICON placeholder in defaultPropsStr with actual icon name
88
- const defaultPropsWithIcon = defaultPropsStr.replace(/\{ICON\}/g, `{${targetIconName}}`);
89
- const defaultPropsToAdd = defaultPropsWithIcon
90
- .trim()
91
- .split(/\s+(?=\w+=)/)
92
- .filter((prop) => prop)
93
- .map((prop) => {
94
- const propName = prop.split("=")[0];
95
- return propName && !existingPropNames.has(propName) ? prop : null;
96
- })
97
- .filter(Boolean);
98
- const userAttributes = element
99
- .getAttributes()
100
- .filter((attr) => {
101
- if (attr.getKind() !== SyntaxKind.JsxAttribute) {
102
- return true;
103
- }
104
- const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);
105
- const attrName = jsxAttr.getNameNode().getText();
106
- // Filter out library-specific props (lucide, tabler, hugeicons, etc.)
107
- return !(attrName in iconLibraries);
108
- })
109
- .map((attr) => attr.getText())
110
- .join(" ");
111
- const allProps = [...defaultPropsToAdd, userAttributes]
112
- .filter(Boolean)
113
- .join(" ");
114
- element.replaceWithText(`<${componentName} ${allProps} />`);
115
- }
116
- }
117
- for (const importDeclaration of sourceFile.getImportDeclarations() ?? []) {
118
- const moduleSpecifier = importDeclaration.getModuleSpecifier()?.getText();
119
- if (moduleSpecifier?.includes("icon-placeholder")) {
120
- const namedImports = importDeclaration.getNamedImports() ?? [];
121
- const iconPlaceholderImport = namedImports.find((specifier) => specifier.getName() === "IconPlaceholder");
122
- if (iconPlaceholderImport) {
123
- iconPlaceholderImport.remove();
124
- }
125
- if (importDeclaration.getNamedImports()?.length === 0) {
126
- importDeclaration.remove();
127
- }
128
- }
129
- }
130
- if (transformedIcons.length > 0) {
131
- const importStatements = libraryConfig.import.split("\n");
132
- const addedImports = [];
133
- for (const importStmt of importStatements) {
134
- const importMatch = importStmt.match(/import\s+{([^}]+)}\s+from\s+['"]([^'"]+)['"]/);
135
- if (!importMatch)
136
- continue;
137
- const [, importedNames, modulePath] = importMatch;
138
- const namedImports = importedNames
139
- .split(",")
140
- .map((name) => name.trim())
141
- .map((name) => {
142
- if (name === "ICON") {
143
- return transformedIcons.map((icon) => ({ name: icon }));
144
- }
145
- return { name };
146
- })
147
- .flat();
148
- const newImport = sourceFile.addImportDeclaration({
149
- moduleSpecifier: modulePath,
150
- namedImports,
151
- });
152
- addedImports.push(newImport);
153
- }
154
- if (!_useSemicolon(sourceFile)) {
155
- for (const importDecl of addedImports) {
156
- importDecl.replaceWithText(importDecl.getText().replace(";", ""));
157
- }
158
- }
159
- }
160
- return sourceFile;
161
- };
162
- function _useSemicolon(sourceFile) {
163
- return (sourceFile.getImportDeclarations()?.[0]?.getText().endsWith(";") ?? false);
164
- }
1
+ import { iconLibraries } from "../../icons/libraries.js";
2
+ import { SyntaxKind } from "ts-morph";
3
+ export const transformIcons = async ({ sourceFile, config }) => {
4
+ const iconLibrary = config.iconLibrary;
5
+ // Fail silently if the icon library is not supported.
6
+ // This is for legacy icon libraries.
7
+ if (!iconLibrary || !(iconLibrary in iconLibraries)) {
8
+ return sourceFile;
9
+ }
10
+ const targetLibrary = iconLibrary;
11
+ const libraryConfig = iconLibraries[targetLibrary];
12
+ let transformedIcons = [];
13
+ for (const element of sourceFile.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)) {
14
+ if (element.getTagNameNode()?.getText() !== "IconPlaceholder") {
15
+ continue;
16
+ }
17
+ // Find the library-specific prop (e.g., "lucide", "tabler", "hugeicons")
18
+ const libraryPropAttr = element.getAttributes().find((attr) => {
19
+ if (attr.getKind() !== SyntaxKind.JsxAttribute) {
20
+ return false;
21
+ }
22
+ const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);
23
+ return jsxAttr.getNameNode().getText() === targetLibrary;
24
+ });
25
+ if (!libraryPropAttr) {
26
+ continue; // No icon specified for this library
27
+ }
28
+ const jsxIconAttr = libraryPropAttr.asKindOrThrow(SyntaxKind.JsxAttribute);
29
+ const targetIconName = jsxIconAttr
30
+ .getInitializer()
31
+ ?.getText()
32
+ .replace(/^["']|["']$/g, "");
33
+ if (!targetIconName) {
34
+ continue;
35
+ }
36
+ if (!transformedIcons.includes(targetIconName)) {
37
+ transformedIcons.push(targetIconName);
38
+ }
39
+ const usage = libraryConfig.usage;
40
+ const usageMatch = usage.match(/<(\w+)([^>]*)\s*\/>/);
41
+ // Remove the library-specific prop
42
+ jsxIconAttr.remove();
43
+ // Remove all other library-specific props
44
+ for (const attr of element.getAttributes()) {
45
+ if (attr.getKind() !== SyntaxKind.JsxAttribute) {
46
+ continue;
47
+ }
48
+ const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);
49
+ const attrName = jsxAttr.getNameNode().getText();
50
+ // Filter out library-specific props (lucide, tabler, hugeicons, etc.)
51
+ if (attrName in iconLibraries) {
52
+ jsxAttr.remove();
53
+ }
54
+ }
55
+ if (!usageMatch) {
56
+ element.getTagNameNode()?.replaceWithText(targetIconName);
57
+ continue;
58
+ }
59
+ const [, componentName, defaultPropsStr] = usageMatch;
60
+ if (componentName === "ICON") {
61
+ // Get remaining user attributes (non-library props)
62
+ const userAttributes = element
63
+ .getAttributes()
64
+ .filter((attr) => {
65
+ if (attr.getKind() !== SyntaxKind.JsxAttribute) {
66
+ return true;
67
+ }
68
+ const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);
69
+ const attrName = jsxAttr.getNameNode().getText();
70
+ // Filter out library-specific props (lucide, tabler, hugeicons, etc.)
71
+ return !(attrName in iconLibraries);
72
+ })
73
+ .map((attr) => attr.getText())
74
+ .join(" ");
75
+ if (userAttributes.trim()) {
76
+ element.replaceWithText(`<${targetIconName} ${userAttributes} />`);
77
+ }
78
+ else {
79
+ element.getTagNameNode()?.replaceWithText(targetIconName);
80
+ }
81
+ }
82
+ else {
83
+ const existingPropNames = new Set(element
84
+ .getAttributes()
85
+ .filter((attr) => attr.getKind() === SyntaxKind.JsxAttribute)
86
+ .map((attr) => attr.asKindOrThrow(SyntaxKind.JsxAttribute).getNameNode().getText()));
87
+ // Replace ICON placeholder in defaultPropsStr with actual icon name
88
+ const defaultPropsWithIcon = defaultPropsStr.replace(/\{ICON\}/g, `{${targetIconName}}`);
89
+ const defaultPropsToAdd = defaultPropsWithIcon
90
+ .trim()
91
+ .split(/\s+(?=\w+=)/)
92
+ .filter((prop) => prop)
93
+ .map((prop) => {
94
+ const propName = prop.split("=")[0];
95
+ return propName && !existingPropNames.has(propName) ? prop : null;
96
+ })
97
+ .filter(Boolean);
98
+ const userAttributes = element
99
+ .getAttributes()
100
+ .filter((attr) => {
101
+ if (attr.getKind() !== SyntaxKind.JsxAttribute) {
102
+ return true;
103
+ }
104
+ const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute);
105
+ const attrName = jsxAttr.getNameNode().getText();
106
+ // Filter out library-specific props (lucide, tabler, hugeicons, etc.)
107
+ return !(attrName in iconLibraries);
108
+ })
109
+ .map((attr) => attr.getText())
110
+ .join(" ");
111
+ const allProps = [...defaultPropsToAdd, userAttributes]
112
+ .filter(Boolean)
113
+ .join(" ");
114
+ element.replaceWithText(`<${componentName} ${allProps} />`);
115
+ }
116
+ }
117
+ for (const importDeclaration of sourceFile.getImportDeclarations() ?? []) {
118
+ const moduleSpecifier = importDeclaration.getModuleSpecifier()?.getText();
119
+ if (moduleSpecifier?.includes("icon-placeholder")) {
120
+ const namedImports = importDeclaration.getNamedImports() ?? [];
121
+ const iconPlaceholderImport = namedImports.find((specifier) => specifier.getName() === "IconPlaceholder");
122
+ if (iconPlaceholderImport) {
123
+ iconPlaceholderImport.remove();
124
+ }
125
+ if (importDeclaration.getNamedImports()?.length === 0) {
126
+ importDeclaration.remove();
127
+ }
128
+ }
129
+ }
130
+ if (transformedIcons.length > 0) {
131
+ const importStatements = libraryConfig.import.split("\n");
132
+ const addedImports = [];
133
+ for (const importStmt of importStatements) {
134
+ const importMatch = importStmt.match(/import\s+{([^}]+)}\s+from\s+['"]([^'"]+)['"]/);
135
+ if (!importMatch)
136
+ continue;
137
+ const [, importedNames, modulePath] = importMatch;
138
+ const namedImports = importedNames
139
+ .split(",")
140
+ .map((name) => name.trim())
141
+ .map((name) => {
142
+ if (name === "ICON") {
143
+ return transformedIcons.map((icon) => ({ name: icon }));
144
+ }
145
+ return { name };
146
+ })
147
+ .flat();
148
+ const newImport = sourceFile.addImportDeclaration({
149
+ moduleSpecifier: modulePath,
150
+ namedImports,
151
+ });
152
+ addedImports.push(newImport);
153
+ }
154
+ if (!_useSemicolon(sourceFile)) {
155
+ for (const importDecl of addedImports) {
156
+ importDecl.replaceWithText(importDecl.getText().replace(";", ""));
157
+ }
158
+ }
159
+ }
160
+ return sourceFile;
161
+ };
162
+ function _useSemicolon(sourceFile) {
163
+ return (sourceFile.getImportDeclarations()?.[0]?.getText().endsWith(";") ?? false);
164
+ }
165
165
  //# sourceMappingURL=transform-icons.js.map
@@ -1,2 +1,2 @@
1
- import { Transformer } from "./types.js";
2
- export declare const transformMenu: Transformer;
1
+ import { Transformer } from "./types.js";
2
+ export declare const transformMenu: Transformer;
@@ -1,40 +1,40 @@
1
- import { SyntaxKind } from "ts-morph";
2
- // Transforms cn-menu-target class based on config.menuColor.
3
- // If menuColor is "inverted", replaces cn-menu-target with "dark".
4
- // Otherwise, removes cn-menu-target entirely.
5
- export const transformMenu = async ({ sourceFile, config }) => {
6
- const menuColor = config.menuColor;
7
- // If menuColor is not set or is "default", we remove the placeholder.
8
- const replacement = menuColor === "inverted" ? "dark" : "";
9
- for (const attr of sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute)) {
10
- const attrName = attr.getNameNode().getText();
11
- if (attrName !== "className") {
12
- continue;
13
- }
14
- const initializer = attr.getInitializer();
15
- if (!initializer) {
16
- continue;
17
- }
18
- const text = initializer.getText();
19
- if (!text.includes("cn-menu-target")) {
20
- continue;
21
- }
22
- // Replace cn-menu-target with the replacement value.
23
- let newText = text.replace(/cn-menu-target/g, replacement);
24
- // Clean up extra spaces if we removed the class.
25
- if (!replacement) {
26
- // Remove double spaces.
27
- newText = newText.replace(/\s{2,}/g, " ");
28
- // Clean up leading/trailing spaces in strings.
29
- newText = newText.replace(/"\s+/g, '"');
30
- newText = newText.replace(/\s+"/g, '"');
31
- // Clean up empty strings in cn() calls.
32
- newText = newText.replace(/,\s*""\s*,/g, ",");
33
- newText = newText.replace(/\(\s*""\s*,/g, "(");
34
- newText = newText.replace(/,\s*""\s*\)/g, ")");
35
- }
36
- attr.setInitializer(newText);
37
- }
38
- return sourceFile;
39
- };
1
+ import { SyntaxKind } from "ts-morph";
2
+ // Transforms cn-menu-target class based on config.menuColor.
3
+ // If menuColor is "inverted", replaces cn-menu-target with "dark".
4
+ // Otherwise, removes cn-menu-target entirely.
5
+ export const transformMenu = async ({ sourceFile, config }) => {
6
+ const menuColor = config.menuColor;
7
+ // If menuColor is not set or is "default", we remove the placeholder.
8
+ const replacement = menuColor === "inverted" ? "dark" : "";
9
+ for (const attr of sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute)) {
10
+ const attrName = attr.getNameNode().getText();
11
+ if (attrName !== "className") {
12
+ continue;
13
+ }
14
+ const initializer = attr.getInitializer();
15
+ if (!initializer) {
16
+ continue;
17
+ }
18
+ const text = initializer.getText();
19
+ if (!text.includes("cn-menu-target")) {
20
+ continue;
21
+ }
22
+ // Replace cn-menu-target with the replacement value.
23
+ let newText = text.replace(/cn-menu-target/g, replacement);
24
+ // Clean up extra spaces if we removed the class.
25
+ if (!replacement) {
26
+ // Remove double spaces.
27
+ newText = newText.replace(/\s{2,}/g, " ");
28
+ // Clean up leading/trailing spaces in strings.
29
+ newText = newText.replace(/"\s+/g, '"');
30
+ newText = newText.replace(/\s+"/g, '"');
31
+ // Clean up empty strings in cn() calls.
32
+ newText = newText.replace(/,\s*""\s*,/g, ",");
33
+ newText = newText.replace(/\(\s*""\s*,/g, "(");
34
+ newText = newText.replace(/,\s*""\s*\)/g, ")");
35
+ }
36
+ attr.setInitializer(newText);
37
+ }
38
+ return sourceFile;
39
+ };
40
40
  //# sourceMappingURL=transform-menu.js.map
@@ -1,2 +1,2 @@
1
- import { Transformer } from "./types.js";
2
- export declare const transformRender: Transformer;
1
+ import { Transformer } from "./types.js";
2
+ export declare const transformRender: Transformer;