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