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.
- package/dist/commands/add/analysis.d.ts +4 -4
- package/dist/commands/add/analysis.js +56 -56
- package/dist/commands/add/command.d.ts +2 -2
- package/dist/commands/add/command.js +205 -202
- package/dist/commands/add/command.js.map +1 -1
- package/dist/commands/add/config.d.ts +2 -2
- package/dist/commands/add/config.js +11 -11
- package/dist/commands/add/install.d.ts +27 -27
- package/dist/commands/add/install.js +80 -80
- package/dist/commands/add/package-manager.d.ts +1 -1
- package/dist/commands/add/package-manager.js +4 -4
- package/dist/commands/add/project-files.d.ts +2 -2
- package/dist/commands/add/project-files.js +17 -17
- package/dist/commands/add/prompts.d.ts +3 -3
- package/dist/commands/add/prompts.js +28 -28
- package/dist/commands/add/registry.d.ts +4 -4
- package/dist/commands/add/registry.js +6 -6
- package/dist/commands/add/types.d.ts +33 -33
- package/dist/commands/add/types.js +1 -1
- package/dist/commands/add/ui.d.ts +4 -4
- package/dist/commands/add/ui.js +55 -55
- package/dist/commands/add/validation.d.ts +3 -3
- package/dist/commands/add/validation.js +30 -30
- package/dist/commands/add-collection.d.ts +1 -1
- package/dist/commands/add-collection.js +1 -1
- package/dist/commands/add-composite.d.ts +2 -2
- package/dist/commands/add-composite.js +205 -201
- package/dist/commands/add-composite.js.map +1 -1
- package/dist/commands/add-section.d.ts +2 -2
- package/dist/commands/add-section.js +205 -201
- package/dist/commands/add-section.js.map +1 -1
- package/dist/commands/add-wrapper.d.ts +2 -2
- package/dist/commands/add-wrapper.js +205 -201
- package/dist/commands/add-wrapper.js.map +1 -1
- package/dist/commands/add.d.ts +1 -1
- package/dist/commands/add.js +1 -1
- package/dist/commands/build.d.ts +2 -2
- package/dist/commands/build.js +104 -104
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -2
- package/dist/commands/doctor.js +67 -67
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init/command.d.ts +8 -2
- package/dist/commands/init/command.js +186 -114
- package/dist/commands/init/command.js.map +1 -1
- package/dist/commands/init/config.d.ts +9 -2
- package/dist/commands/init/config.js +45 -25
- package/dist/commands/init/config.js.map +1 -1
- package/dist/commands/init/constants.d.ts +3 -3
- package/dist/commands/init/constants.js +105 -105
- package/dist/commands/init/dependencies.d.ts +22 -5
- package/dist/commands/init/dependencies.js +86 -52
- package/dist/commands/init/dependencies.js.map +1 -1
- package/dist/commands/init/filesystem.d.ts +7 -1
- package/dist/commands/init/filesystem.js +16 -10
- package/dist/commands/init/filesystem.js.map +1 -1
- package/dist/commands/init/lockfile.d.ts +1 -1
- package/dist/commands/init/lockfile.js +1 -1
- package/dist/commands/init/package-json.d.ts +17 -6
- package/dist/commands/init/package-json.js +28 -18
- package/dist/commands/init/package-json.js.map +1 -1
- package/dist/commands/init/project.d.ts +15 -3
- package/dist/commands/init/project.js +120 -97
- package/dist/commands/init/project.js.map +1 -1
- package/dist/commands/init/tailwind.d.ts +14 -3
- package/dist/commands/init/tailwind.js +141 -33
- package/dist/commands/init/tailwind.js.map +1 -1
- package/dist/commands/init/templates.d.ts +15 -3
- package/dist/commands/init/templates.js +27 -15
- package/dist/commands/init/templates.js.map +1 -1
- package/dist/commands/init/tsconfig.d.ts +14 -2
- package/dist/commands/init/tsconfig.js +561 -273
- package/dist/commands/init/tsconfig.js.map +1 -1
- package/dist/commands/init/types.d.ts +34 -33
- package/dist/commands/init/types.js +1 -1
- package/dist/commands/init/ui.d.ts +12 -3
- package/dist/commands/init/ui.js +45 -33
- package/dist/commands/init/ui.js.map +1 -1
- package/dist/commands/init/vite.d.ts +1 -1
- package/dist/commands/init/vite.js +17 -27
- package/dist/commands/init/vite.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/list.d.ts +2 -2
- package/dist/commands/list.js +69 -62
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/remove.d.ts +2 -2
- package/dist/commands/remove.js +95 -93
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/shared/add-collection.d.ts +50 -50
- package/dist/commands/shared/add-collection.js +206 -206
- package/dist/commands/shared/list-entries.d.ts +6 -6
- package/dist/commands/shared/list-entries.js +12 -12
- package/dist/commands/shared/name-utils.d.ts +1 -1
- package/dist/commands/shared/name-utils.js +13 -13
- package/dist/commands/shared/remove-entries.d.ts +16 -16
- package/dist/commands/shared/remove-entries.js +41 -41
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +1 -1
- package/dist/icons/libraries.d.ts +37 -37
- package/dist/icons/libraries.js +34 -34
- package/dist/index.d.ts +1 -2
- package/dist/index.js +29 -30
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +45 -45
- package/dist/lib/config.js +97 -97
- package/dist/lib/fs.d.ts +82 -76
- package/dist/lib/fs.js +299 -302
- package/dist/lib/fs.js.map +1 -1
- package/dist/lib/highlighter.d.ts +6 -6
- package/dist/lib/highlighter.js +7 -7
- package/dist/lib/install.d.ts +19 -19
- package/dist/lib/install.js +101 -55
- package/dist/lib/install.js.map +1 -1
- package/dist/lib/lockfile.d.ts +63 -63
- package/dist/lib/lockfile.js +179 -173
- package/dist/lib/lockfile.js.map +1 -1
- package/dist/lib/logger.d.ts +8 -8
- package/dist/lib/logger.js +41 -41
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/paths.d.ts +14 -14
- package/dist/lib/paths.js +41 -31
- package/dist/lib/paths.js.map +1 -1
- package/dist/lib/registry.d.ts +35 -35
- package/dist/lib/registry.js +180 -180
- package/dist/schema/index.d.ts +1128 -1128
- package/dist/schema/index.js +237 -238
- package/dist/schema/index.js.map +1 -1
- package/dist/styles/create-style-map.d.ts +4 -4
- package/dist/styles/create-style-map.js +68 -68
- package/dist/styles/transform-style-map.d.ts +3 -3
- package/dist/styles/transform-style-map.js +428 -428
- package/dist/styles/transform.d.ts +10 -10
- package/dist/styles/transform.js +15 -15
- package/dist/utils/index.d.ts +6 -6
- package/dist/utils/index.js +5 -5
- package/dist/utils/transformers/transform-icons.d.ts +2 -2
- package/dist/utils/transformers/transform-icons.js +164 -164
- package/dist/utils/transformers/transform-menu.d.ts +2 -2
- package/dist/utils/transformers/transform-menu.js +39 -39
- package/dist/utils/transformers/transform-render.d.ts +2 -2
- package/dist/utils/transformers/transform-render.js +97 -97
- package/dist/utils/transformers/types.d.ts +14 -14
- package/dist/utils/transformers/types.js +1 -1
- package/package.json +3 -2
- package/dist/__tests__/contracts/registry.test.d.ts +0 -1
- package/dist/__tests__/contracts/registry.test.js +0 -42
- package/dist/__tests__/contracts/registry.test.js.map +0 -1
- package/dist/__tests__/e2e/cli.test.d.ts +0 -1
- package/dist/__tests__/e2e/cli.test.js +0 -67
- package/dist/__tests__/e2e/cli.test.js.map +0 -1
- package/dist/__tests__/helpers/fs.d.ts +0 -5
- package/dist/__tests__/helpers/fs.js +0 -26
- package/dist/__tests__/helpers/fs.js.map +0 -1
- package/dist/__tests__/integration/commands.integration.test.d.ts +0 -1
- package/dist/__tests__/integration/commands.integration.test.js +0 -184
- package/dist/__tests__/integration/commands.integration.test.js.map +0 -1
- package/dist/commands/__tests__/add-composite.test.d.ts +0 -2
- package/dist/commands/__tests__/add-composite.test.js +0 -171
- package/dist/commands/__tests__/add-composite.test.js.map +0 -1
- package/dist/commands/__tests__/add-entry.mocks.d.ts +0 -23
- package/dist/commands/__tests__/add-entry.mocks.js +0 -64
- package/dist/commands/__tests__/add-entry.mocks.js.map +0 -1
- package/dist/commands/__tests__/add-section.test.d.ts +0 -2
- package/dist/commands/__tests__/add-section.test.js +0 -191
- package/dist/commands/__tests__/add-section.test.js.map +0 -1
- package/dist/commands/__tests__/add-wrapper.test.d.ts +0 -2
- package/dist/commands/__tests__/add-wrapper.test.js +0 -171
- package/dist/commands/__tests__/add-wrapper.test.js.map +0 -1
- package/dist/commands/__tests__/cli-mocks.d.ts +0 -1
- package/dist/commands/__tests__/cli-mocks.js +0 -24
- package/dist/commands/__tests__/cli-mocks.js.map +0 -1
- package/dist/commands/__tests__/doctor.mocks.d.ts +0 -6
- package/dist/commands/__tests__/doctor.mocks.js +0 -20
- package/dist/commands/__tests__/doctor.mocks.js.map +0 -1
- package/dist/commands/__tests__/doctor.test.d.ts +0 -2
- package/dist/commands/__tests__/doctor.test.js +0 -80
- package/dist/commands/__tests__/doctor.test.js.map +0 -1
- package/dist/commands/__tests__/list.mocks.d.ts +0 -8
- package/dist/commands/__tests__/list.mocks.js +0 -20
- package/dist/commands/__tests__/list.mocks.js.map +0 -1
- package/dist/commands/__tests__/list.test.d.ts +0 -2
- package/dist/commands/__tests__/list.test.js +0 -60
- package/dist/commands/__tests__/list.test.js.map +0 -1
- package/dist/commands/__tests__/remove.mocks.d.ts +0 -9
- package/dist/commands/__tests__/remove.mocks.js +0 -26
- package/dist/commands/__tests__/remove.mocks.js.map +0 -1
- package/dist/commands/__tests__/remove.test.d.ts +0 -2
- package/dist/commands/__tests__/remove.test.js +0 -116
- package/dist/commands/__tests__/remove.test.js.map +0 -1
- package/dist/commands/add/__tests__/__mocks__/cli-mocks.d.ts +0 -1
- package/dist/commands/add/__tests__/__mocks__/cli-mocks.js +0 -21
- package/dist/commands/add/__tests__/__mocks__/cli-mocks.js.map +0 -1
- package/dist/commands/add/__tests__/add.mocks.d.ts +0 -19
- package/dist/commands/add/__tests__/add.mocks.js +0 -60
- package/dist/commands/add/__tests__/add.mocks.js.map +0 -1
- package/dist/commands/add/__tests__/add.test.d.ts +0 -2
- package/dist/commands/add/__tests__/add.test.js +0 -141
- package/dist/commands/add/__tests__/add.test.js.map +0 -1
- package/dist/commands/init/__tests__/init.mocks.d.ts +0 -24
- package/dist/commands/init/__tests__/init.mocks.js +0 -84
- package/dist/commands/init/__tests__/init.mocks.js.map +0 -1
- package/dist/commands/init/__tests__/init.test.d.ts +0 -2
- package/dist/commands/init/__tests__/init.test.js +0 -283
- package/dist/commands/init/__tests__/init.test.js.map +0 -1
- package/dist/commands/init/__tests__/tailwind.test.d.ts +0 -1
- package/dist/commands/init/__tests__/tailwind.test.js +0 -56
- package/dist/commands/init/__tests__/tailwind.test.js.map +0 -1
- package/dist/commands/init/__tests__/tsconfig.test.d.ts +0 -1
- package/dist/commands/init/__tests__/tsconfig.test.js +0 -108
- package/dist/commands/init/__tests__/tsconfig.test.js.map +0 -1
- package/dist/commands/init/__tests__/vite.test.d.ts +0 -1
- package/dist/commands/init/__tests__/vite.test.js +0 -66
- package/dist/commands/init/__tests__/vite.test.js.map +0 -1
- package/dist/commands/list-sections.d.ts +0 -2
- package/dist/commands/list-sections.js +0 -20
- package/dist/commands/list-sections.js.map +0 -1
- package/dist/commands/list-wrappers.d.ts +0 -2
- package/dist/commands/list-wrappers.js +0 -20
- package/dist/commands/list-wrappers.js.map +0 -1
- package/dist/commands/remove-section.d.ts +0 -2
- package/dist/commands/remove-section.js +0 -37
- package/dist/commands/remove-section.js.map +0 -1
- package/dist/commands/remove-wrapper.d.ts +0 -2
- package/dist/commands/remove-wrapper.js +0 -37
- package/dist/commands/remove-wrapper.js.map +0 -1
- package/dist/lib/__tests__/config.test.d.ts +0 -1
- package/dist/lib/__tests__/config.test.js +0 -49
- package/dist/lib/__tests__/config.test.js.map +0 -1
- package/dist/lib/__tests__/install.test.d.ts +0 -1
- package/dist/lib/__tests__/install.test.js +0 -149
- package/dist/lib/__tests__/install.test.js.map +0 -1
- package/dist/lib/__tests__/lockfile.test.d.ts +0 -1
- package/dist/lib/__tests__/lockfile.test.js +0 -89
- package/dist/lib/__tests__/lockfile.test.js.map +0 -1
- package/dist/lib/__tests__/paths.test.d.ts +0 -1
- package/dist/lib/__tests__/paths.test.js +0 -39
- package/dist/lib/__tests__/paths.test.js.map +0 -1
- package/dist/lib/__tests__/registry.test.d.ts +0 -1
- package/dist/lib/__tests__/registry.test.js +0 -76
- 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>;
|
package/dist/styles/transform.js
CHANGED
|
@@ -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
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -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";
|
package/dist/utils/index.js
CHANGED
|
@@ -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;
|