trix-ui 0.2.7 → 0.2.9

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 (206) 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 +68 -68
  205. package/templates/lib/utils.js +7 -0
  206. package/templates/styles/globals.css +85 -67
@@ -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;