1 | const fs = require('fs')
|
2 | const path = require('path')
|
3 | const commander = require('commander')
|
4 | const ejs = require('ejs')
|
5 | const inflector = require('./lib/inflector')
|
6 | var pkg = require('../package.json');
|
7 |
|
8 | try {
|
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 |
|
127 | function init() {
|
128 | commander.dist = !commander.dist ? 'app' : commander.dist
|
129 | if (!fs.existsSync(commander.dist)) {
|
130 | fs.mkdirSync(commander.dist)
|
131 | }
|
132 | }
|
133 |
|
134 | function initSwagger() {
|
135 | if (!fs.existsSync('swagger')) {
|
136 | fs.mkdirSync('swagger')
|
137 | }
|
138 | }
|
139 |
|
140 | function 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 |
|
148 | function 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 |
|
160 | function 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 |
|
169 | function 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 |
|
177 | function 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 |
|
207 | function 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 |
|
219 | function 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 |
|
239 | function 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 |
|
254 | function 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 |
|
274 | function 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 |
|
305 | function 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 |
|
338 | function 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 |
|
357 | function 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 |
|
375 | function 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 |
|
407 | function 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 |