UNPKG

gerco

Version:

Easy way to generate the React component

93 lines (81 loc) 2.91 kB
const fs = require('fs'); const path = require('path'); const validateType = (types, type) => { if (!types.includes(type)) { throw new Error(`Incorrect type '${type}'! Check your config file`); } }; const validateName = name => { if (!name) { throw new Error('Name can`t be empty') } } const kebabize = str => { return str.split('').map((letter, idx) => { return letter.toUpperCase() === letter ? `${idx !== 0 ? '-' : ''}${letter.toLowerCase()}` : letter; }).join(''); } const replaceName = (data, name, styleName, styleImportsName) => { switch (true) { case data.includes('%name%'): return data.replace(/%name%/g, name); case data.includes('%style-name%'): return data.replace(/%style-name%/g, styleName); case styleImportsName && data.includes('%style-imports-name%'): return data.replace(/%style-imports-name%/g, styleImportsName); case !styleImportsName && data.includes('%style-imports-name%'): return ''; default: return data; } } const getFileStringData = (fileData, name, styleName, styleImportsName) => { let data = ''; Object.keys(fileData).forEach(segment => { let temp = ''; fileData[segment].forEach(item => { const replacedString = replaceName(item, name, styleName, styleImportsName); temp = replacedString === '' ? temp : `${temp}${replacedString}\n`; }); data = temp === '' ? data : `${data}${temp}\n`; }); return data.slice(0, -1); } const createFiles = (files, pathName, name, styleImportsName, needIndex, indexName, indexData) => { const styleName = kebabize(name); Object.keys(files).forEach(ext => { const fileName = ext.includes('.') ? `${name}${ext.split('.')[0]}.${ext.split('.')[1]}` : `${name}.${ext}`; fs.writeFile( path.join(pathName, fileName), getFileStringData(files[ext], name, styleName, styleImportsName), (err) => { if (err) console.log(err); } ) }) if (needIndex && indexData) { const indexStringData = indexData.reduce((data, current) => `${data}${replaceName(current, name)}\n`, ''); fs.writeFile( path.join(pathName, indexName), indexStringData, (err) => { if (err) console.log(err); } ) } } function gen (config, type, name, styleImportsName) { const types = Object.keys(config); validateType(types, type); validateName(name); const currentPath = path.resolve(process.cwd()); fs.mkdirSync(path.join(currentPath, name)); const componentPath = path.join(currentPath, name); createFiles( config[type].files, componentPath, name, styleImportsName, config[type].includeIndex, config[type].indexData.filename, config[type].indexData.data, ) console.log(`Successful creation of component '${name}' with type '${type}'`) } module.exports = gen;