UNPKG

17.1 kBPlain TextView Raw
1const fs = require('fs')
2const path = require('path')
3const commander = require('commander')
4const ejs = require('ejs')
5const inflector = require('./lib/inflector')
6var pkg = require('../package.json');
7
8try {
9 commander.version(pkg.version)
10 .option('-d, --dist <dist>', 'output directory')
11 .option('-a, --appname <appname>', 'application name')
12 .option('-j, --japanese <japanese>', 'japanese name')
13 .option('-t, --title <title>', 'title name')
14
15 commander.command('initialize').action(() => {
16 initialize()
17 injector()
18 index()
19 swaggerIndex()
20 })
21
22 commander.command('entity [className]').action((className: string) => {
23 if (!className) {
24 console.error('className is required.')
25 return
26 }
27 entities(className)
28 })
29
30 commander.command('repository [className]').action((className: string) => {
31 if (!className) {
32 console.error('className is required.')
33 return
34 }
35 repositories(className)
36 injector()
37 })
38
39 commander.command('gateway [className]').action((className: string) => {
40 if (!className) {
41 console.error('className is required.')
42 return
43 }
44 gateways(className)
45 })
46
47 commander.command('infra [className]').action((className: string) => {
48 if (!className) {
49 console.error('className is required.')
50 return
51 }
52 infrastructure(className)
53 })
54
55 commander.command('store [className]').action((className: string) => {
56 if (!className) {
57 console.error('className is required.')
58 return
59 }
60 store(className)
61 })
62
63 commander.command('usecase [className]').action((className: string) => {
64 if (!className) {
65 console.error('className is required.')
66 return
67 }
68 usecase(className)
69 })
70
71 commander.command('swagger [className]').action((className: string) => {
72 if (!className) {
73 console.error('className is required.')
74 return
75 }
76 swagger(className)
77 })
78
79 commander.command('components [className]').action((className: string) => {
80 if (!className) {
81 console.error('className is required.')
82 return
83 }
84 components(className)
85 })
86
87 commander.command('injector').action((className: string) => {
88 injector()
89 })
90
91 commander.command('index').action((className: string) => {
92 index()
93 swaggerIndex()
94 })
95
96 commander.command('remove [className]').action((className: string) => {
97 if (!className) {
98 console.error('className is required.')
99 return
100 }
101 remove(className)
102 injector()
103 index()
104 swaggerIndex()
105 })
106
107 commander
108 .command('generate [className]')
109 .action((className: string) => {
110 entities(className)
111 repositories(className)
112 gateways(className)
113 infrastructure(className)
114 store(className)
115 usecase(className)
116 swagger(className)
117 components(className)
118 injector()
119 })
120
121 commander.parse(process.argv)
122} catch (e) {
123 console.error(e)
124 process.exit(2)
125}
126
127function init() {
128 commander.dist = !commander.dist ? 'app' : commander.dist
129 if (!fs.existsSync(commander.dist)) {
130 fs.mkdirSync(commander.dist)
131 }
132}
133
134function initSwagger() {
135 if (!fs.existsSync('swagger')) {
136 fs.mkdirSync('swagger')
137 }
138}
139
140function makeDir(dirpath: string, newpath: string) {
141 const dist = path.resolve(dirpath, newpath)
142 if (!fs.existsSync(dist)) {
143 fs.mkdirSync(dist)
144 }
145 return dist
146}
147
148function generator(params: { type: string; dist: string; filename?: string; name: string; outfile?: string; ext?: string; options: any }) {
149 const { type, dist, filename, outfile, options, name, ext } = params
150 const Ext = !ext ? '.ts' : ext
151 const Filename = !filename ? 'class' : filename
152 const Outfile = !outfile ? name : outfile
153 const template = path.resolve(__dirname, '../templates/' + type + '/' + Filename + '.ejs')
154 const content = ejs.render(fs.readFileSync(template, 'utf-8'), options)
155 const filepath = path.resolve(dist, Outfile + Ext)
156 fs.writeFileSync(filepath, content, { encoding: 'utf-8', flag: 'w+' })
157 console.log('Generated:', filepath)
158}
159
160function entities(className: string) {
161 const type = 'entities'
162 init()
163 const dist = makeDir(commander.dist, type)
164 const name = className.charAt(0).toUpperCase() + className.slice(1)
165 const title = commander.title === undefined ? 'title' : commander.title
166 generator({ type, dist, name, options: { name, title } })
167}
168
169function repositories(className: string) {
170 const type = 'repositories'
171 init()
172 const dist = makeDir(commander.dist, type)
173 const name = className.charAt(0).toUpperCase() + className.slice(1)
174 generator({ type, dist, name, outfile: name + 'Repository', options: { name } })
175}
176
177function gateways(className: string) {
178 let type = 'gateways'
179 commander.appname = commander.appname === undefined ? 'application' : commander.appname
180 const name = className.charAt(0).toUpperCase() + className.slice(1)
181 const names = inflector.pluralize(name)
182 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
183 const title = commander.title === undefined ? 'title' : commander.title
184
185 init()
186 const gateway = makeDir(makeDir(commander.dist, type), appName)
187 const translator = makeDir(gateway, 'translator')
188
189 generator({ type, dist: gateway, name, outfile: name.toLowerCase(), options: { name, names, appName, title } })
190 generator({
191 type,
192 dist: translator,
193 name,
194 outfile: name.toLowerCase(),
195 filename: 'translator',
196 options: { name, names, appName, title }
197 })
198
199 type = 'index'
200 const read = makeDir(makeDir(commander.dist, 'gateways'), appName)
201 const files = fs.readdirSync(read)
202 const dist = read
203 generator({ type, dist, name: '', outfile: 'index', filename: 'gateways', options: { files, appName } })
204
205}
206
207function infrastructure(className: string) {
208 const type = 'infrastructure'
209 commander.appname = !commander.appname ? 'application' : commander.appname
210 const name = className.charAt(0).toUpperCase() + className.slice(1)
211 const names = inflector.pluralize(name)
212 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
213
214 init()
215 const dist = makeDir(makeDir(makeDir(makeDir(commander.dist, type), 'network'), appName), 'requests')
216 generator({ type, dist, name, outfile: name.toLowerCase(), options: { name, names, appName } })
217}
218
219function store(className: string) {
220 let type = 'store'
221 commander.appname = !commander.appname ? 'application' : commander.appname
222 const name = className.charAt(0).toUpperCase() + className.slice(1)
223 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
224
225 init()
226 let dist = makeDir(makeDir(commander.dist, type), name.toLowerCase())
227 generator({ type, dist, name, outfile: 'index', filename: 'index', options: { name } })
228 generator({ type, dist, name, outfile: 'mutations', filename: 'mutations', options: { name } })
229 generator({ type, dist, name, outfile: 'state', filename: 'state', options: { name } })
230 generator({ type, dist, name, outfile: 'types', filename: 'types', options: { name } })
231
232 type = 'index'
233 const read = makeDir(commander.dist, 'store')
234 const files = fs.readdirSync(read)
235 dist = read
236 generator({ type, dist, name: '', outfile: 'index', filename: 'store', options: { files, appName } })
237}
238
239function usecase(className: string) {
240 const type = 'usecases'
241 commander.appname = !commander.appname ? 'application' : commander.appname
242 const name = className.charAt(0).toUpperCase() + className.slice(1)
243 const names = inflector.pluralize(name)
244 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
245
246 init()
247 const dist = makeDir(makeDir(commander.dist, type), name.toLowerCase())
248 generator({ type, dist, name, outfile: 'Delete' + name + 'UseCase', filename: 'delete', options: { name, names, appName } })
249 generator({ type, dist, name, outfile: 'Fetch' + names + 'UseCase', filename: 'fetch', options: { name, names, appName } })
250 generator({ type, dist, name, outfile: 'Save' + name + 'UseCase', filename: 'save', options: { name, names, appName } })
251 generator({ type, dist, name, outfile: 'Update' + names + 'UseCase', filename: 'update', options: { name, names, appName } })
252}
253
254function swagger(className: string) {
255 const type = 'swagger'
256 commander.appname = !commander.appname ? 'application' : commander.appname
257 const name = className.charAt(0).toUpperCase() + className.slice(1)
258 const names = inflector.pluralize(name)
259 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
260 const title = commander.title === undefined ? 'title' : commander.title
261
262 initSwagger()
263 let dist = makeDir(makeDir(makeDir(makeDir(type, 'src'), 'components'), 'schemas'), name.toLowerCase())
264 generator({ ext: '.yml', type, dist, name, outfile: 'index', filename: 'index', options: { name, names, appName, title } })
265 generator({ ext: '.yml', type, dist, name, outfile: 'seed', filename: 'seed', options: { name, names, appName, title } })
266
267 dist = makeDir(makeDir(makeDir(type, 'src'), 'paths'), names.toLowerCase())
268 generator({ ext: '.yml', type, dist, name, outfile: 'path', filename: 'path', options: { name, names, appName } })
269 generator({ ext: '.yml', type, dist, name, outfile: 'paths', filename: 'paths', options: { name, names, appName } })
270
271 swaggerIndex()
272}
273
274function swaggerIndex() {
275
276 const type = 'swagger'
277 commander.appname = !commander.appname ? 'application' : commander.appname
278 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
279
280 let read = makeDir(makeDir(makeDir(type, 'src'), 'components'), 'schemas')
281 let files: string[] = fs.readdirSync(read)
282 let paths = {}
283 files.forEach((file) => {
284 if (file === 'index.yml') return
285 const read = makeDir(makeDir(makeDir(makeDir(type, 'src'), 'components'), 'schemas'), file)
286 paths[file] = fs.readdirSync(read)
287 })
288 let dist = read
289 generator({ ext: '.yml', type, dist, name: '', outfile: 'index', filename: 'schemas.index', options: { paths, appName } })
290
291 read = makeDir(makeDir(type, 'src'), 'paths')
292 files = fs.readdirSync(read)
293 paths = {}
294 files.forEach((file) => {
295 if (file === 'index.yml') return
296 const read = makeDir(makeDir(makeDir(type, 'src'), 'paths'), file)
297 paths[file] = fs.readdirSync(read)
298 })
299 dist = read
300 generator({ ext: '.yml', type, dist, name: '', outfile: 'index', filename: 'paths.index', options: { paths, appName } })
301
302}
303
304
305function components(className: string) {
306 const type = 'components'
307 commander.appname = !commander.appname ? 'application' : commander.appname
308 const name = className.charAt(0).toUpperCase() + className.slice(1)
309 const names = inflector.pluralize(name)
310 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
311 const title = commander.title === undefined ? 'title' : commander.title
312 const japanese = !commander.japanese ? name : commander.japanese
313
314 init()
315 let dist = makeDir(makeDir(makeDir(makeDir(commander.dist, type), 'organisms'), 'Form'), name)
316 generator({ type, dist, name, outfile: 'fixtures', filename: 'fixtures', options: { name, names, appName } })
317 generator({ type, dist, name, outfile: name + '.story', filename: 'form.story', options: { name, names, appName } })
318 generator({ type, dist, name, outfile: 'index', filename: 'index', options: { name, names, appName } })
319 generator({ ext: '.vue', type, dist, name, filename: 'form', options: { name, names, appName, japanese, title } })
320
321 dist = makeDir(makeDir(makeDir(makeDir(commander.dist, type), 'organisms'), 'List'), name)
322 generator({ type, dist, name, outfile: 'fixtures', filename: 'fixtures', options: { name, names, appName } })
323 generator({ type, dist, name, outfile: name + '.story', filename: 'list.story', options: { name, names, appName, title, japanese } })
324 generator({ type, dist, name, outfile: 'index', filename: 'index', options: { name, names, appName } })
325 generator({ ext: '.vue', type, dist, name, filename: 'list', options: { name, names, appName, japanese, title } })
326
327 dist = makeDir(makeDir(makeDir(commander.dist, type), 'templates'), name)
328 generator({ type, dist, name, outfile: 'fixtures', filename: 'fixtures', options: { name, names, appName } })
329 generator({ type, dist, name, outfile: name + '.story', filename: 'templates.story', options: { name, names, appName, title, japanese } })
330 generator({ type, dist, name, outfile: 'index', filename: 'index', options: { name, names, appName } })
331 generator({ ext: '.vue', type, dist, name, filename: 'templates', options: { name, names, appName, japanese } })
332
333 dist = makeDir(makeDir(commander.dist, 'pages'), name.toLowerCase())
334 generator({ ext: '.vue', type, dist, name, outfile: 'index', filename: 'page', options: { name, names, appName, japanese } })
335
336}
337
338function injector() {
339 const type = 'injector'
340 commander.appname = !commander.appname ? 'application' : commander.appname
341 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
342
343 init()
344 const repositories = fs.readdirSync(makeDir(commander.dist, 'repositories'))
345 const gateways = fs.readdirSync(makeDir(commander.dist, 'gateways'))
346
347 let dist = makeDir(commander.dist, 'plugins')
348 generator({ type, dist, name: '', outfile: 'injector', filename: 'plugins', options: { repositories, gateways, appName } })
349
350 dist = makeDir(commander.dist, 'presenter')
351 generator({ type, dist, name: '', outfile: 'injector', filename: 'presenter', options: { repositories, gateways, appName } })
352
353 dist = makeDir(commander.dist, 'types')
354 generator({ type, dist, name: '', outfile: 'nuxt.d', filename: 'types', options: { repositories, gateways, appName } })
355}
356
357function index() {
358 const type = 'index'
359 commander.appname = !commander.appname ? 'application' : commander.appname
360 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
361
362 init()
363 let read = makeDir(makeDir(commander.dist, 'gateways'), appName)
364 let files = fs.readdirSync(read)
365 let dist = read
366 generator({ type, dist, name: '', outfile: 'index', filename: 'gateways', options: { files, appName } })
367
368 read = makeDir(commander.dist, 'store')
369 files = fs.readdirSync(read)
370 dist = read
371 generator({ type, dist, name: '', outfile: 'index', filename: 'store', options: { files, appName } })
372
373}
374
375function initialize() {
376 const type = 'initialize'
377 commander.appname = !commander.appname ? 'application' : commander.appname
378 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
379
380 init()
381 initSwagger()
382 const template = path.resolve(__dirname, '../templates/' + type)
383 let files: string[] = fs.readdirSync(template)
384
385 files.forEach((file) => {
386 const content = ejs.render(fs.readFileSync(template + '/' + file, 'utf-8'), { appName })
387 const items = file.split(':')
388 const filename = items.pop()
389 const path = items.reduce((acc, current) => {
390 const path = acc === 'app' ? commander.dist : acc
391 const dir = current === 'appName' ? appName : current
392 return makeDir(path, dir)
393 })
394 const filepath = path + '/' + filename
395 fs.writeFileSync(filepath, content, { encoding: 'utf-8', flag: 'w+' })
396 console.log('Generated:', filepath)
397 })
398
399 swaggerIndex()
400 const read = makeDir(makeDir(commander.dist, 'gateways'), appName)
401 files = fs.readdirSync(read)
402 const dist = read
403 generator({ type: 'index', dist, name: '', outfile: 'index', filename: 'gateways', options: { files, appName } })
404
405}
406
407function remove(className: string) {
408 const rimraf = require('rimraf');
409 commander.appname = !commander.appname ? 'application' : commander.appname
410 const Name = className.charAt(0).toUpperCase() + className.slice(1)
411 const appName = commander.appname.charAt(0).toUpperCase() + commander.appname.slice(1)
412 const name = Name.toUpperCase()
413 const names = inflector.pluralize(name)
414
415 init()
416 initSwagger()
417 try {
418 rimraf.sync(path.resolve(commander.dist, 'components', 'organisms', 'Form', Name))
419 rimraf.sync(path.resolve(commander.dist, 'components', 'organisms', 'List', Name))
420 rimraf.sync(path.resolve(commander.dist, 'components', 'templates', Name))
421 rimraf.sync(path.resolve(commander.dist, 'entities', name + '.ts'))
422 rimraf.sync(path.resolve(commander.dist, 'gateways', appName, name + '.ts'))
423 rimraf.sync(path.resolve(commander.dist, 'gateways', appName, 'translator', name + '.ts'))
424 rimraf.sync(path.resolve(commander.dist, 'infrastructure', 'network', appName, 'requests', name + '.ts'))
425 rimraf.sync(path.resolve(commander.dist, 'pages', name + '.vue'))
426 rimraf.sync(path.resolve(commander.dist, 'repositories', Name + 'Repository.ts'))
427 rimraf.sync(path.resolve(commander.dist, 'store', name))
428 rimraf.sync(path.resolve(commander.dist, 'usecases', name))
429 rimraf.sync(path.resolve(commander.dist, 'store', name))
430 rimraf.sync(path.resolve('swagger', 'src', 'components', 'schemas', name))
431 rimraf.sync(path.resolve('swagger', 'src', 'paths', names))
432 } catch (e) {
433 console.log(e)
434 }
435}
\No newline at end of file