files.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. const config = require('./figma-import.config')
  2. const path = require('path')
  3. const fs = require('fs').promises
  4. const { kebabCase } = require('lodash')
  5. const { getImageContent, getNodeChildren, getSvgImageUrl } = require('./utils/api')
  6. const type = process.argv.slice(2)[0] === '--icons' ? 'icons' : 'illustrations'
  7. const filesDir = path.resolve(`src/components/_${type}/svgs`)
  8. let counter = 0
  9. /**
  10. * clear files dir
  11. *
  12. */
  13. const clearFilesDir = async () => {
  14. try {
  15. await fs.rm(filesDir, { recursive: true })
  16. console.log(`${filesDir} successfully deleted!`)
  17. } catch (err) {
  18. console.error(`Error while deleting ${filesDir}`)
  19. }
  20. }
  21. /**
  22. * generate icon/illustration content
  23. * [fileName].svg files
  24. *
  25. * @param {object} svgNode
  26. * @param {number} total
  27. * @return {Promise<void>}
  28. */
  29. const generateIconOrIllustration = async (svgNode, total) => {
  30. const fileUrl = await getSvgImageUrl(svgNode.id)
  31. const fileName = kebabCase(svgNode.name)
  32. try {
  33. await fs.access(filesDir)
  34. } catch (error) {
  35. await fs.mkdir(filesDir)
  36. }
  37. const { data: fileContent } = await getImageContent(fileUrl)
  38. await Promise.all([await fs.writeFile(path.resolve(filesDir, `${fileName}.svg`), fileContent, 'utf-8')])
  39. counter++
  40. process.stdout.write(` ${counter}/${total} files has been saved\r`)
  41. if (counter === total) {
  42. console.info('All svgs has been saved')
  43. }
  44. }
  45. /**
  46. * generate icons/illustrations components
  47. *
  48. * @param {[Object]} svgNodesArr - array of svgs from frame
  49. * @return {Promise<void>}
  50. */
  51. const generateIconsOrIllustrations = async (svgNodesArr) => {
  52. await Promise.all(
  53. svgNodesArr.map((item, index) => {
  54. setTimeout(() => generateIconOrIllustration(item, svgNodesArr.length), 1000 * index)
  55. })
  56. )
  57. }
  58. const main = async () => {
  59. try {
  60. await clearFilesDir()
  61. const filesNodesArr = await getNodeChildren(
  62. type === 'icons' ? config.FRAME_WITH_ICONS_ID : config.FRAME_WITH_ILLUSTRATIONS_ID
  63. )
  64. if (!filesNodesArr) {
  65. console.error('No nodes found')
  66. return
  67. }
  68. await generateIconsOrIllustrations(filesNodesArr)
  69. } catch (e) {
  70. console.error('Unhandled error', e)
  71. }
  72. }
  73. module.exports = main