-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate-svg-icons-sprite.ts
74 lines (64 loc) · 2 KB
/
generate-svg-icons-sprite.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
import { readFileSync, readdirSync, statSync, writeFileSync } from 'fs'
import { format, resolveConfig } from 'prettier'
const svgsDir = `svgs`
const outputPath = `public`
const outputTS = `svgs.ts`
;(async () => {
const directories = readdirSync(svgsDir).filter((dir) =>
statSync(`${svgsDir}/${dir}`).isDirectory(),
)
const filesByDir = directories.reduce<Record<string, string[]>>((acc, dir) => {
const files = readdirSync(`${svgsDir}/${dir}`).filter((file) => file.endsWith('.svg'))
acc[dir] = files
return acc
}, {})
Object.keys(filesByDir).map(async (dir) => {
const files = filesByDir[dir]
const content = `
<svg xmlns="http://www.w3.org/2000/svg">
<defs>
${files
.map((file) => {
const content = readFileSync(`${svgsDir}/${dir}/${file}`).toString()
return content
.replace('<svg', `<symbol id="${file.replace('.svg', '')}"`)
.replace('</svg>', '</symbol>')
.replace(/fill="[#|a-z|0-9]*"/gi, '')
})
.join('\n')}
</defs>
</svg>
`
try {
const formatted = await format(content, {
...(await resolveConfig(process.cwd())),
parser: 'html',
})
writeFileSync(`${outputPath}/${dir}.svg`, formatted)
} catch (err) {
console.log(content)
}
})
const content = Object.keys(filesByDir)
.filter((dir) => filesByDir[dir].length > 0)
.map((dir) => {
return `
export const ${dir}Svgs = [${filesByDir[dir]
.map((file) => `'${file.replace('.svg', '')}'`)
.join(',')}] as const
export type ${dir.charAt(0).toUpperCase()}${dir.slice(1)}Svg = ${filesByDir[dir]
.map((file) => `'${file.replace('.svg', '')}'`)
.join('|')}
`
})
.join('\n')
try {
const formatted = await format(content, {
...(await resolveConfig(process.cwd())),
parser: 'typescript',
})
writeFileSync(outputTS, formatted)
} catch (err) {
console.log(content)
}
})()