build-icons.mjs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import fs from 'fs-extra'
  2. import path from 'path'
  3. import { PACKAGES_DIR, getAliases, toPascalCase, getAllIcons } 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 indexTypeTemplate
  13. * @param extension
  14. * @param pretty
  15. */
  16. export const buildJsIcons = ({
  17. name,
  18. componentTemplate,
  19. indexItemTemplate,
  20. aliasTemplate,
  21. extension = 'js',
  22. pretty = true,
  23. key = true,
  24. pascalCase = false,
  25. pascalName = true,
  26. indexFile = 'icons.ts'
  27. }) => {
  28. const DIST_DIR = path.resolve(PACKAGES_DIR, name);
  29. const aliases = getAliases(),
  30. allIcons = getAllIcons(false, true)
  31. let index = []
  32. Object.entries(allIcons).forEach(([type, icons]) => {
  33. icons.forEach((icon, i) => {
  34. process.stdout.write(`Building \`${name}\` ${type} ${i}/${icons.length}: ${icon.name.padEnd(42)}\r`)
  35. const children = icon.obj.children
  36. .map(({
  37. name,
  38. attributes
  39. }, i) => {
  40. if (key) {
  41. attributes.key = `svg-${i}`
  42. }
  43. if (pascalCase) {
  44. attributes.strokeWidth = attributes['stroke-width']
  45. delete attributes['stroke-width']
  46. }
  47. return [name, attributes]
  48. })
  49. .filter((i) => {
  50. const [name, attributes] = i
  51. return !attributes.d || attributes.d !== 'M0 0h24v24H0z'
  52. })
  53. const iconName = `${icon.name}${type !== 'outline' ? `-${type}` : ''}`,
  54. iconNamePascal = `${icon.namePascal}${type !== 'outline' ? toPascalCase(type) : ''}`
  55. let component = componentTemplate({
  56. type,
  57. name: iconName,
  58. namePascal: iconNamePascal,
  59. children,
  60. stringify,
  61. svg: icon.content
  62. })
  63. // Format component
  64. const output = pretty ? prettier.format(component, {
  65. singleQuote: true,
  66. trailingComma: 'all',
  67. parser: 'babel'
  68. }) : component
  69. let filePath = path.resolve(DIST_DIR, 'src/icons', `${pascalName ? iconNamePascal : iconName}.${extension}`)
  70. fs.writeFileSync(filePath, output, 'utf-8')
  71. index.push(indexItemTemplate({
  72. type,
  73. name: iconName,
  74. namePascal: iconNamePascal
  75. }))
  76. })
  77. })
  78. fs.writeFileSync(path.resolve(DIST_DIR, `src/icons/${indexFile}`), index.join('\n'), 'utf-8')
  79. // Write aliases
  80. let aliasesStr = '';
  81. if (aliases && aliasTemplate) {
  82. Object.entries(aliases).forEach(([from, to]) => {
  83. aliasesStr += aliasTemplate({
  84. from,
  85. to,
  86. fromPascal: toPascalCase(from),
  87. toPascal: toPascalCase(to)
  88. })
  89. })
  90. }
  91. fs.writeFileSync(path.resolve(DIST_DIR, `./src/aliases.ts`), aliasesStr || `export {};`, 'utf-8')
  92. }