OSDN Git Service

Merge pull request #7 from Bytom/electron
[bytom/bytom-electron.git] / bin / generate.js
1 import { cd, mkdir, echo, ShellString, cat, test } from 'shelljs'
2 import commandLineCommands from 'command-line-commands'
3 import commandLineArgs from 'command-line-args'
4
5 const validCommands = [ 'component' ]
6 const { command, argv } = commandLineCommands(validCommands)
7
8 function template(strings, ...keys) {
9   return (function(...values) {
10     var dict = values[values.length - 1] || {}
11     var result = [strings[0]]
12     keys.forEach(function(key, i) {
13       var value = Number.isInteger(key) ? values[key] : dict[key]
14       result.push(value, strings[i + 1])
15     })
16     return result.join('')
17   })
18 }
19
20 const baseJsx =
21 template`import React from 'react'
22 import styles from './${0}.scss'
23
24 class ${0} extends React.Component {
25   render() {
26     return (
27       <div className={styles.base}>
28         <p>This is a ${0}</p>
29       </div>
30     )
31   }
32 }
33
34 export default ${0}
35 `
36
37 const baseScss =
38 `.base {
39   background: red;
40 }
41 `
42
43 switch (command) {
44   case 'component': {
45
46     let optionDefinitions = [
47       { name: 'path', type: String, defaultOption: true }
48     ]
49
50     let options = commandLineArgs(optionDefinitions, argv)
51
52     let path = options.path
53     if (path === undefined) {
54       echo('No component name specified.\nUsage: `npm run generate-component My/Name`')
55       break
56     }
57
58     cd('src')
59     mkdir('-p', path)
60
61     let name = path.split('/').pop()
62     ShellString(baseJsx(name)).to(path + `/${name}.jsx`)
63     ShellString(baseScss).to(path + `/${name}.scss`)
64
65     let indexPath = path.split('/').slice(0,-1).join('/') + '/index.js'
66     if (test('-f', indexPath)) {
67       let contents = cat(indexPath)
68
69       let importString = `import ${name} from './${name}/${name}'`
70       let exportString = `  ${name},\n`
71
72       if (contents.indexOf(importString) < 0) {
73         contents = `${importString}\n${contents}`
74       }
75       if (contents.indexOf(exportString) < 0) {
76         let exportTarget = 'export {\n'
77         let position = contents.indexOf(exportTarget)  + exportTarget.length
78
79         contents = contents.slice(0, position)
80           + exportString
81           + contents.slice(position)
82       }
83
84       ShellString(contents).to(indexPath)
85     }
86     break
87   }
88   default: {
89     echo(`Unknown command: ${command}`)
90     break
91   }
92 }