UNPKG

18 kBJavaScriptView Raw
1"use strict";
2const fs = require('fs');
3const path = require('path');
4const commander = require('commander');
5const ejs = require('ejs');
6const inflector = require('./lib/inflector');
7var pkg = require('../package.json');
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 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}
109catch (e) {
110 console.error(e);
111 process.exit(2);
112}
113function init() {
114 commander.dist = !commander.dist ? 'app' : commander.dist;
115 if (!fs.existsSync(commander.dist)) {
116 fs.mkdirSync(commander.dist);
117 }
118}
119function initSwagger() {
120 if (!fs.existsSync('swagger')) {
121 fs.mkdirSync('swagger');
122 }
123}
124function makeDir(dirpath, newpath) {
125 const dist = path.resolve(dirpath, newpath);
126 if (!fs.existsSync(dist)) {
127 fs.mkdirSync(dist);
128 }
129 return dist;
130}
131function 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}
142function 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}
150function 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}
157function 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}
182function 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}
192function 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}
209function 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}
222function 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}
238function 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}
265function 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}
292function 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}
306function 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}
320function 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}
347function 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//# sourceMappingURL=index.js.map
\No newline at end of file