import { ContentGenerator, Modes } from '../models'; export const generateIndex = (componentName: string): string => `export { ${componentName} } from './${componentName}';\n`; // eslint-disable-next-line prettier/prettier export const getImports = (mode: Modes, styleFile?: string): string => `import React, { ${mode === 'class' ? 'Component' : 'FunctionComponent'} } from 'react'; ${!!styleFile ? "import './" + styleFile + "';\n" : ''}`; export const getClass = (componentName: string, styleFile?: string): string => `${getImports('class', styleFile)} interface ${componentName}State { message: string; } interface ${componentName}Props { showMessage: boolean; } export class ${componentName} extends Component<${componentName}Props, ${componentName}State> { state = { message: 'Hello', }; render(): JSX.Element { const { showMessage } = this.props; const { message } = this.state; return (
{showMessage && message}
); } }; `; export const getFunc = (componentName: string, styleFile?: string): string => `${getImports('function', styleFile)} interface ${componentName}Props { message?: string; } export const ${componentName}: FunctionComponent<${componentName}Props> = ({ message = 'Hello' }): JSX.Element => { return (
{message}
); }; `; export const generateComponentTs = (componentName: string, mode: Modes, styleFile?: string): string => mode === 'class' ? getClass(componentName, styleFile) : getFunc(componentName, styleFile); export const generateTestTs = (componentName: string): string => `import { ${componentName} } from './${componentName}';\n\ndescribe('${componentName}', () => {\n\n});\n`; export const getNull = (): null => null; export const tsGenerator: ContentGenerator = { index: generateIndex, component: generateComponentTs, style: getNull, test: generateTestTs, };