scripts/generate-react-components.js (65 lines of code) (raw):

const Path = require('path'); const { promisify } = require('util'); const glob = promisify(require('glob-all')); const { readFile, outputFile } = require('fs-extra'); const { optimize, loadConfig } = require('svgo'); const svgr = require('@svgr/core'); const Case = require('case'); const buble = require('buble'); const reactUtils = `// use \`var\` and \`function\` construction for a correct work this code in IE 11 import { createContext, useContext, useState } from 'react'; var uniqueIdPrefixContext = createContext('__GeneratedJBProductLogos__'); export var UniqueLogosIdPrefixProvider = uniqueIdPrefixContext.Provider; var i = 0; export var useUniqueId = function(){ var prefix = useContext(uniqueIdPrefixContext); var id = useState(function(){return prefix + i++})[0]; return id; };`; (async () => { const LOGOS_DIR = Path.resolve(__dirname, '../dist/web'); const svgoConfig = await loadConfig(); const svgrConfig = { dimensions: false, plugins: ['@svgr/plugin-jsx', '@svgr/plugin-prettier'], jsx: { babelConfig: { // plugins: ['react-inline-svg-unique-id'] plugins: ['./lib/react-inline-svg-unique-id-babel-plugin.js'] } } }; const paths = await glob(`${LOGOS_DIR}/*/*.svg`, { ignore: [] }); const imports = []; for (const svgPath of paths) { const basename = Path.basename(svgPath, Path.extname(svgPath)); if (basename === 'icon') { // Don't generate react versions for "icon", which is effectively a favicon continue; } const componentName = `${Case.pascal(basename)}Logo`; const sourceSvg = (await readFile(svgPath)).toString(); const { data: svg } = optimize(sourceSvg, { path: svgPath, ...svgoConfig }); const jsx = await svgr.transform(svg, svgrConfig, { componentName }); const { code: js } = buble.transform(jsx, { objectAssign: 'Object.assign', transforms: { modules: false } }); const outputPath = Path.resolve(Path.dirname(svgPath), `${basename}.js`); const relativePath = Path.relative(LOGOS_DIR, outputPath); imports.push( `export { default as ${componentName} } from "./${relativePath}"` ); await outputFile(outputPath, js); } await outputFile( Path.resolve(LOGOS_DIR, 'react-unique-logos-ids.js'), reactUtils ); await outputFile( Path.resolve(LOGOS_DIR, 'react.js'), imports.join(';\n') + ';\nexport { UniqueLogosIdPrefixProvider } from \'./react-unique-logos-ids.js\'' ); })();