-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathconverter.ts
106 lines (96 loc) · 2.33 KB
/
converter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import svgr from "@svgr/core";
import { SvgConversionOptions } from "./utils";
interface SVGRConfig {
icon?: boolean;
memo?: boolean;
native?: boolean | object;
typescript?: boolean;
template?: any;
plugins: string[];
}
export const dryRun = async (
svg: string | Buffer | undefined
): Promise<boolean> => {
try {
const jsx = await convertSelection(svg, {
componentName: "TestDryRun",
reactEnviroment: "web",
template: "jsx",
});
console.log(jsx);
return !!jsx;
} catch {
return false;
}
};
export const convertSelection = async (
svg: string | Buffer | undefined,
options: SvgConversionOptions
) => {
let svgrConfig: SVGRConfig = {
icon: options.isIcon,
memo: options.useMemo,
native: false,
typescript: options.isTypescript,
plugins: ["@svgr/plugin-svgo", "@svgr/plugin-jsx", "@svgr/plugin-prettier"],
};
// Check if React Native
if (options.reactEnviroment === "native") {
svgrConfig.native = { expo: options.isExpo };
}
// Check if we should override the template
if (options.template === "jsx") {
svgrConfig.template = JsxOnlyTemplate;
}
if (options.template === "snippet") {
svgrConfig.template = SnippetTemplate;
}
const jsCode = await svgr(svg, svgrConfig, {
componentName: options.componentName,
});
return jsCode;
};
interface SVGROptions {
componentName: string;
typescript: boolean;
}
interface SVGRTemplateProps {
imports?: string;
exports?: string;
interfaces?: string;
props?: string;
jsx?: string;
componentName?: string;
}
// This is used when just returning inline SVG code
function JsxOnlyTemplate(
{ template }: SVGRConfig,
opts: any,
{ jsx }: SVGRTemplateProps
) {
const plugins = ["jsx"];
if (opts.typescript) {
plugins.push("typescript");
}
const typeScriptTpl = template?.smart({ plugins });
return typeScriptTpl.ast`${jsx}`;
}
// Used when creating snuppet components
function SnippetTemplate(
{ template }: SVGRConfig,
opts: SVGROptions,
{ imports, interfaces, componentName, props, jsx, exports }: SVGRTemplateProps
) {
const plugins = ["jsx"];
if (opts.typescript) {
plugins.push("typescript");
}
const typeScriptTpl = template?.smart({ plugins });
return typeScriptTpl.ast`${imports}
${interfaces}
function $1 (${props}) {
return ${jsx};
}
${exports}
`;
}