@disaythis/gen-rtsc
Version:
Component generator for typescript based react aaplication
90 lines (71 loc) • 2.77 kB
JavaScript
const fs = require("fs");
const chalk = require("chalk");
const { toCamelCase, errorLog, warningLog, successLog, infoLog } = require("./helpers");
module.exports = (name) => {
fs.mkdir(name, (err) => {
if (err && err.code !== "EEXIST") {
errorLog(err.message);
} else {
if (err && err.code === "EEXIST") warningLog(err.message);
else successLog(`Directory '${chalk.italic(name)}' created.`);
const componentName = name.slice(name.lastIndexOf("/") + 1);
const indexFile = `${name}/index.ts`;
const componentFile = `${name}/${componentName}.tsx`;
const propsInterfaceFile = `${name}/I${componentName}Props.ts`;
const stylesFile = `${name}/${componentName}.module.scss`;
// const styleDeclarationsFile = `${name}/${componentName}.module.scss.ts`;
fs.appendFile(indexFile, index(componentName), (err) => {
if (err) errorLog(err.message);
else successLog(`'${componentFile}' created.`);
});
fs.appendFile(componentFile, component(componentName), (err) => {
if (err) errorLog(err.message);
else successLog(`'${componentFile}' created.`);
});
fs.appendFile(propsInterfaceFile, propsInterface(componentName), (err) => {
if (err) errorLog(err.message);
else successLog(`'${propsInterfaceFile}' created.`);
});
fs.appendFile(stylesFile, styles(componentName), (err) => {
if (err) {
errorLog(err.message);
} else {
successLog(`'${stylesFile}' created.`);
// fs.appendFile(styleDeclarationsFile, styleDeclarations(componentName), (err) => {});
}
});
}
});
};
const index = (componentName) => `export { default } from './${componentName}';
`;
const component = (componentName) =>
`import { FC } from 'react';
import styles from './${componentName}.module.scss';
import { I${componentName}Props } from './I${componentName}Props';
const ${componentName}: FC<I${componentName}Props> = (props) => {
return (
<div className={\`\${styles.${toCamelCase(componentName)}}\`}>
<h3>${componentName} Stateless Component!</h3>
</div>
);
};
export default ${componentName};
`;
const propsInterface = (componentName) =>
`export interface I${componentName}Props {}
`;
const styles = (componentName) =>
`.${toCamelCase(componentName)} {
display: block;
}
`;
// const styleDeclarations = (componentName) =>
// `/* tslint:disable */
// require('./${componentName}.module.scss');
// const styles = {
// ${toCamelCase(componentName)}: '${toCamelCase(componentName)}_613d8040',
// };
// export default styles;
// /* tslint:enable */
// `;