build-icons.mjs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import fs from 'fs-extra'
  2. import path from 'path'
  3. import { PACKAGES_DIR, readSvgs, readAliases, toPascalCase } from './helpers.mjs'
  4. import { stringify } from 'svgson'
  5. import prettier from "@prettier/sync"
  6. /**
  7. * Build icons
  8. *
  9. * @param name
  10. * @param componentTemplate
  11. * @param indexIconTemplate
  12. * @param typeDefinitionsTemplate
  13. * @param indexTypeTemplate
  14. * @param extension
  15. * @param pretty
  16. */
  17. export const buildIcons = ({
  18. name,
  19. componentTemplate,
  20. indexItemTemplate,
  21. typeDefinitionsTemplate,
  22. indexTypeTemplate,
  23. aliasTemplate,
  24. extension = 'js',
  25. pretty = true,
  26. key = true,
  27. pascalCase = false,
  28. pascalName = true,
  29. indexFile = 'icons.js'
  30. }) => {
  31. const DIST_DIR = path.resolve(PACKAGES_DIR, name);
  32. const svgFiles = readSvgs(),
  33. aliases = readAliases()
  34. let index = []
  35. let typings = []
  36. svgFiles.forEach((svgFile, i) => {
  37. const children = svgFile.obj.children
  38. .map(({
  39. name,
  40. attributes
  41. }, i) => {
  42. if (key) {
  43. attributes.key = `svg-${i}`
  44. }
  45. if (pascalCase) {
  46. attributes.strokeWidth = attributes['stroke-width']
  47. delete attributes['stroke-width']
  48. }
  49. return [name, attributes]
  50. })
  51. .filter((i) => {
  52. const [name, attributes] = i
  53. return !attributes.d || attributes.d !== 'M0 0h24v24H0z'
  54. })
  55. let component = componentTemplate({
  56. name: svgFile.name,
  57. namePascal: svgFile.namePascal,
  58. children,
  59. stringify,
  60. svg: svgFile
  61. })
  62. // Format component
  63. const output = pretty ? prettier.format(component, {
  64. singleQuote: true,
  65. trailingComma: 'all',
  66. parser: 'babel'
  67. }) : component
  68. let filePath = path.resolve(DIST_DIR, 'src/icons', `${pascalName ? svgFile.namePascal : svgFile.name}.${extension}`)
  69. fs.writeFileSync(filePath, output, 'utf-8')
  70. index.push(indexItemTemplate({
  71. name: svgFile.name,
  72. namePascal: svgFile.namePascal
  73. }))
  74. if (indexTypeTemplate) {
  75. typings.push(indexTypeTemplate({
  76. name: svgFile.name,
  77. namePascal: svgFile.namePascal
  78. }))
  79. }
  80. })
  81. // Write aliases
  82. if (aliases && aliasTemplate) {
  83. let aliasesStr = '';
  84. Object.entries(aliases).forEach(([from, to]) => {
  85. aliasesStr += aliasTemplate({
  86. from, to,
  87. fromPascal: toPascalCase(from),
  88. toPascal: toPascalCase(to)
  89. })
  90. })
  91. fs.writeFileSync(path.resolve(DIST_DIR, `./src/aliases.ts`), aliasesStr || `export {};`, 'utf-8')
  92. } else {
  93. fs.writeFileSync(path.resolve(DIST_DIR, `./src/aliases.ts`), `export {};`, 'utf-8')
  94. }
  95. // Write index file
  96. fs.writeFileSync(path.resolve(DIST_DIR, `./src/${indexFile}`), index.join('\n'), 'utf-8')
  97. // Write type definitions
  98. if (typeDefinitionsTemplate) {
  99. fs.ensureDirSync(path.resolve(DIST_DIR, `./dist/`))
  100. fs.writeFileSync(path.resolve(DIST_DIR, `./dist/tabler-${name}.d.ts`), typeDefinitionsTemplate() + '\n' + typings.join('\n'), 'utf-8')
  101. }
  102. }