main.mjs102 lines · main
1#!/usr/bin/env node
2import fs from 'fs'
3import getArgumentOptions from 'minimist'
4import path from 'path'
5
6import generateExportsFile from './building/generateExportsFile.mjs'
7import generateIconFiles from './building/generateIconFiles.mjs'
8import renderIconsObject from './render/renderIconsObject.mjs'
9
10import generateAliasesFile from './building/generateAliasesFile.mjs'
11import generateDynamicImports from './building/generateDynamicImports.mjs'
12import getIconMetaData from './utils/getIconMetaData.mjs'
13import { readSvgDirectory } from './utils/helpers.mjs'
14
15const cliArguments = getArgumentOptions(process.argv.slice(2))
16
17const ICONS_DIR = path.resolve(process.cwd(), 'src/raw-icons')
18const OUTPUT_DIR = path.resolve(process.cwd(), cliArguments.output || 'src')
19const REGISTRY_DIR = path.resolve(process.cwd(), cliArguments.registryOutput || '__registry__')
20
21if (!fs.existsSync(OUTPUT_DIR)) {
22 fs.mkdirSync(OUTPUT_DIR)
23}
24
25const {
26 renderUniqueKey = false,
27 templateSrc,
28 silent = false,
29 iconFileExtension = '.js',
30 importImportFileExtension = '',
31 exportFileName = 'index.js',
32 withAliases = false,
33 aliasNamesOnly = false,
34 withDynamicImports = false,
35 separateAliasesFile = false,
36 aliasesFileExtension = '.js',
37 aliasImportFileExtension = '',
38 pretty = true,
39} = cliArguments
40
41async function buildIcons() {
42 if (templateSrc == null) {
43 throw new Error('No `templateSrc` argument given.')
44 }
45 const svgFiles = readSvgDirectory(ICONS_DIR)
46
47 const icons = renderIconsObject(svgFiles, ICONS_DIR, renderUniqueKey)
48
49 const { default: iconFileTemplate } = await import(path.resolve(process.cwd(), templateSrc))
50
51 const iconMetaData = await getIconMetaData(ICONS_DIR)
52
53 // Generates iconsNodes files for each icon
54 generateIconFiles({
55 iconNodes: icons,
56 outputDirectory: OUTPUT_DIR,
57 template: iconFileTemplate,
58 showLog: !silent,
59 iconFileExtension,
60 pretty: JSON.parse(pretty),
61 iconsDir: ICONS_DIR,
62 iconMetaData,
63 registryDir: REGISTRY_DIR,
64 })
65
66 if (withAliases) {
67 await generateAliasesFile({
68 iconNodes: icons,
69 iconMetaData,
70 aliasNamesOnly,
71 iconFileExtension,
72 outputDirectory: OUTPUT_DIR,
73 fileExtension: aliasesFileExtension,
74 aliasImportFileExtension,
75 separateAliasesFile,
76 showLog: !silent,
77 })
78 }
79
80 if (withDynamicImports) {
81 generateDynamicImports({
82 iconNodes: icons,
83 outputDirectory: OUTPUT_DIR,
84 fileExtension: aliasesFileExtension,
85 showLog: !silent,
86 })
87 }
88
89 // Generates entry files for the compiler filled with icons exports
90 generateExportsFile(
91 path.join(OUTPUT_DIR, 'icons', exportFileName),
92 path.join(OUTPUT_DIR, 'icons'),
93 icons,
94 importImportFileExtension
95 )
96}
97
98try {
99 buildIcons()
100} catch (error) {
101 console.error(error)
102}