-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathgenerateReactClassComponent.js
More file actions
99 lines (86 loc) · 2.87 KB
/
Copy pathgenerateReactClassComponent.js
File metadata and controls
99 lines (86 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 componentFile = `${name}/${componentName}.tsx`
const propsInterfaceFile = `${name}/I${componentName}Props.ts`
const stateInterfaceFile = `${name}/I${componentName}State.ts`
const stylesFile = `${name}/${componentName}.module.scss`
const styleDeclarationsFile = `${name}/${componentName}.module.scss.ts`
fs.appendFile(componentFile, component(componentName), (err) => {
if (err)
errorLog(err.message)
else
successLog(`'${componentFile}' created.`)
})
fs.appendFile(stateInterfaceFile, stateInterface(componentName), (err) => {
if (err)
errorLog(err.message)
else
successLog(`'${stateInterfaceFile}' 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 component = (componentName) =>
`import * as React from 'react';
import { I${componentName}State } from './I${componentName}State';
import { I${componentName}Props } from './I${componentName}Props';
import styles from './${componentName}.module.scss';
class ${componentName} extends React.Component<I${componentName}Props, I${componentName}State> {
constructor(props) {
super(props);
this.state = {};
}
public render(): JSX.Element {
return (
<div className={\`\${styles.${toCamelCase(componentName)}}\`}>
<h3>${componentName} Component!</h3>
</div>
);
}
}
export default ${componentName};
`
const stateInterface = (componentName) =>
`export interface I${componentName}State {}
`
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 */
`