-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
222 lines (186 loc) · 6.09 KB
/
index.js
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#!/usr/bin/env node
let shell = require('shelljs')
let colors = require('colors')
let fs = require('fs') //fs already comes included with node.
let appName = process.argv[2]
let appDirectory = `${process.cwd()}/${appName}`
let templates = require('./Templates/templates.js')
let firebase = require('./Templates/FirebaseTemplate.js')
let actions = require('./Templates/ActionsTemplate.js')
let home = require('./Templates/HomeTemplate.js')
let reducers = require('./Templates/ReducersTemplate.js')
const installCreateReactApp = () => {
return new Promise(resolve=>{
shell.exec(`npm install -g create-react-app`, () => {
console.log("Installed create-react-app".cyan)
resolve(true)
})
})
}
const createReactApp = () => {
return new Promise(resolve=>{
if(appName){
shell.exec(`create-react-app ${appName}`, () => {
console.log("Created react app, installing other dependencies.".green)
resolve(true)
})
}else{
console.log("\nNo app name was provided.".red)
console.log("\nProvide an app name in the following format: ")
console.log("\ncreate-react-redux-router-app ", "app-name\n".cyan)
resolve(false)
}
})
}
const createComponentsFolder = () => {
return fs.mkdirSync(`${appDirectory}/src/Components`)
}
const createPagesFolder = () => {
return fs.mkdirSync(`${appDirectory}/src/Components/Pages`)
}
const createActionsFolder = () => {
return fs.mkdirSync(`${appDirectory}/src/Actions`)
}
const createFirebaseFolder = () => {
return fs.mkdirSync(`${appDirectory}/src/Firebase`)
}
const createReducersFolder = () => {
return fs.mkdirSync(`${appDirectory}/src/Reducers`)
}
const createHomeFolder = () => {
return fs.mkdirSync(`${appDirectory}/src/Components/Pages/Home`)
}
const createImagesFolder = () => {
return fs.mkdirSync(`${appDirectory}/src/Images`)
}
const cdIntoNewApp = () => {
return new Promise(resolve=>{
shell.exec(`cd ${appName}`, ()=>{
console.log("cd into newapp.".cyan)
resolve()})
})
}
const cdUpLevel = () => {
return new Promise(resolve=>{
shell.exec(`cd ../`, ()=>{resolve()})
})
}
const installPackages = () => {
return new Promise(resolve=>{
console.log("\nInstalling redux, react-router, react-router-dom, react-redux, redux-thunk, firebase, firebase-tools, and firestore\n".cyan)
shell.exec(`npm install --save redux react-router react-redux redux-thunk react-router-dom @firebase/firestore firebase firebase-tools`, () => {
console.log("\nFinished installing packages\n".green)
resolve()
})
})
}
const updateTemplates = () => {
return new Promise(resolve=>{
let promises = []
Object.keys(templates).forEach((fileName, i)=>{
promises[i] = new Promise(res=>{
fs.writeFile(`${appDirectory}/src/${fileName}`, templates[fileName], function(err) {
if(err) { return console.log(err) }
res()
})
})
})
Promise.all(promises).then(()=>{resolve()})
})
}
const addFirebaseTemplate = () => {
return new Promise(resolve=>{
let promises = []
Object.keys(firebase).forEach((fileName, i)=>{
promises[i] = new Promise(res=>{
fs.writeFile(`${appDirectory}/src/Firebase/${fileName}`, firebase[fileName], function(err) {
if(err) { return console.log(err) }
res()
})
})
})
Promise.all(promises).then(()=>{resolve()})
})
}
const addHomeTemplate = () => {
return new Promise(resolve=>{
let promises = []
Object.keys(home).forEach((fileName, i)=>{
promises[i] = new Promise(res=>{
fs.writeFile(`${appDirectory}/src/Components/Pages/Home/${fileName}`, home[fileName], function(err) {
if(err) { return console.log(err) }
res()
})
})
})
Promise.all(promises).then(()=>{resolve()})
})
}
const addActionsTemplate = () => {
return new Promise(resolve=>{
let promises = []
Object.keys(actions).forEach((fileName, i)=>{
promises[i] = new Promise(res=>{
fs.writeFile(`${appDirectory}/src/Actions/${fileName}`, actions[fileName], function(err) {
if(err) { return console.log(err) }
res()
})
})
})
Promise.all(promises).then(()=>{resolve()})
})
}
const addReducersTemplate = () => {
return new Promise(resolve=>{
let promises = []
Object.keys(reducers).forEach((fileName, i)=>{
promises[i] = new Promise(res=>{
fs.writeFile(`${appDirectory}/src/Reducers/${fileName}`, reducers[fileName], function(err) {
if(err) { return console.log(err) }
res()
})
})
})
Promise.all(promises).then(()=>{resolve()})
})
}
const deleteAppTest = () => {
return fs.unlinkSync(`${appDirectory}/src/App.test.js`)
}
const deleteAppCSS = () => {
return fs.unlinkSync(`${appDirectory}/src/App.css`)
}
const deletelogo = () => {
return fs.unlinkSync(`${appDirectory}/src/logo.svg`)
}
const run = async () => {
let installcra = await installCreateReactApp()
let success = await createReactApp()
if(!installcra){
console.log('Could not install create-react-app'.red)
return false
}
if(!success){
console.log('Something went wrong while trying to create a new React app using create-react-app'.red)
return false;
}
await cdIntoNewApp()
await deleteAppTest()
await deleteAppCSS()
await deletelogo()
await createComponentsFolder()
await createPagesFolder()
await createFirebaseFolder()
await createReducersFolder()
await createActionsFolder()
await createHomeFolder()
await createImagesFolder()
await installPackages()
await updateTemplates()
await addReducersTemplate()
await addActionsTemplate()
await addHomeTemplate()
await addFirebaseTemplate()
console.log("All done")
}
run()