UNPKG

9.48 kBJavaScriptView Raw
1/**
2 * Created by Rodey on 2017/8/14.
3 * 模块生成器
4 */
5
6'use strict';
7
8const
9 T = require('../lib/tools');
10
11const
12 args = T.argv._.slice(1),
13 strictDef = '\'use strict\';\n';
14
15let type = args[0],
16 name = args[1];
17if(!type){
18 T.log.red('× 请指定需要生成的模块类型');
19 process.exit(1);
20}
21// if(!name){
22// name = type;
23 // T.log.red('× 请指定需要生成的模块名称');
24 // process.exit(1);
25// }
26
27let instance;
28
29class Generator {
30
31 constructor(){}
32
33 generate(){
34 switch(type){
35 case 'view':
36 this.createView();
37 break;
38 case 'service':
39 this.createService();
40 break;
41 case 'component':
42 this.createComponent();
43 break;
44 case 'spec':
45 this.createSpec();
46 break;
47 default:
48 T.log.red('× 请指定需要生成的模块类型( view、service、component )');
49 process.exit(1);
50 }
51 }
52
53 generateView(){
54 if(!name) name = type;
55 this.createView();
56 }
57
58 generateService(){
59 if(!name) name = type;
60 this.createService();
61 }
62
63 generateSpec(){
64 if(!name) name = type;
65 this.createSpec();
66 }
67
68 generateComponent(){
69 switch(type){
70 case 'default':
71 this.createComponent(); break;
72 case 'vue':
73 this.createVueComponent();
74 break;
75 case 'react':
76 this.createReactComponent();
77 break;
78 case 'angular' || 'ng':
79 this.createAngularComponent();
80 break;
81 default:
82 T.log.red('× 请指定需要生成的组件类型( vue、react、angular )');
83 process.exit(1);
84 }
85 }
86
87 createView(){
88 let isNg = type === 'angular' || type === 'ng';
89 let mp = T.Path.resolve(process.cwd(), `src/modules/${ Generator.getNamePath(name) }`),
90 fn = Generator.getName(name),
91 mpf = T.Path.join(mp, `${ fn }View.${ isNg ? 'ts' : 'js'}`);
92 T.fsa.mkdirpSync(mp);
93 let str = `${ strictDef }\n\nexport default class ${ Generator.toFirstUpper(fn) }View{\n\tconstructor(){}\n\n}`;
94 T.fsa.writeFileSync(mpf, isNg ? this.getAngularViewCode() : str, 'utf8');
95 T.log.green(`\n√ mkdir '${mp}' successfully \n√ create file '${mp}' successfully `);
96 process.exit(1);
97 }
98
99 getAngularViewCode(){
100 let str = '';
101 str += `
102import {NgModule, enableProdMode} from "@angular/core";
103import {BrowserModule} from "@angular/platform-browser";
104import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
105import {App} from "../../config/app-config";\n\n
106@NgModule({
107 imports: [ BrowserModule],
108 declarations: [ ],
109 providers: [ ],
110 bootstrap: [ ]
111})
112export class ${name}Module{}\n
113if(App.env === 'prd'){
114 enableProdMode();
115}
116platformBrowserDynamic().bootstrapModule(${name}Module);
117 `;
118 return str;
119 }
120
121 createService(){
122 console.log(type, name);
123 let isNg = type === 'angular' || type === 'ng';
124 let mp = T.Path.resolve(process.cwd(), `src/services/${ Generator.getNamePath(name) }`),
125 fn = Generator.getName(name),
126 mpf = T.Path.join(mp, `${fn}.service.${ isNg ? 'ts' : 'js'}`);
127 T.fsa.mkdirpSync(mp);
128 let str = strictDef;
129 str += `\nconst\n\tAppService = require('./app.service');\n`;
130 str += `\nexport default class ${ Generator.toFirstUpper(fn) }Service{\n\tconstructor(){}\n\n}`;
131 T.fsa.writeFileSync(mpf, isNg ? this.getAngularServiceCode() : str, 'utf8');
132 T.log.green(`\n√ create file '${mpf}' successfully `);
133 process.exit(1);
134 }
135
136 getAngularServiceCode(){
137 let str = '';
138 str += `
139import {Injectable} from "@angular/core";
140import {Http} from "@angular/http";
141import 'rxjs/add/operator/toPromise';
142import {App} from '../config/app-config';\n
143@Injectable()
144export class ${ Generator.toFirstUpper(name) }Service{\n
145 url: string = App.getWebServiceUrl('${ name }');
146 constructor(private http: Http){}\n
147 getData(){
148 return this.http.post(this.url, { })
149 .toPromise()
150 .then(res => res.json())
151 .catch(this.handlerError);
152 }\n
153 handlerError(err){
154 console.log(err);
155 }\n
156}`;
157 return str;
158 }
159
160 createComponent(){
161 let mp = T.Path.resolve(process.cwd(), `src/components/${name}`),
162 mphtml = T.Path.join(mp, `${name}.html`),
163 mpjs = T.Path.join(mp, `${name}.js`),
164 mpcss = T.Path.join(mp, `${name}.css`);
165 T.fsa.mkdirpSync(mp);
166 T.log.green(`\n√ mkdir '${mp}' successfully`);
167 T.fsa.writeFileSync(mphtml, `<incluede src="./${name}.css"></incluede><div class="${name}-component"></div>`, 'utf8');
168 T.log.green(`√ create file '${mphtml}' successfully `);
169 T.fsa.writeFileSync(mpjs, `${strictDef}\nexport default class ${name}Component{\nconstructor(){}\n}`, 'utf8');
170 T.log.green(`√ create file '${mpjs}' successfully `);
171 T.fsa.writeFileSync(mpcss, '', 'utf8');
172 T.log.green(`√ create file '${mpcss}' successfully `);
173 process.exit(1);
174 }
175
176 createVueComponent(){
177 let mp = T.Path.resolve(process.cwd(), `src/components/${ Generator.getNamePath(name) }`),
178 fn = Generator.getName(name),
179 mpvue = T.Path.join(mp, `${fn}.vue`),
180 mpcss = T.Path.join(mp, `${fn}.css`);
181 let str = `<style src="./${fn}.css" scoped></style>\n<template>\n\n</template>\n\n<script>\n\texport default {\n\t\tname: '${fn}',\n\t\tdata () {\n\t\t\treturn {}\n\t\t},\n\t\tcomponents: {}\n\t}\n</script>`;
182 T.fsa.mkdirpSync(mp);
183 T.fsa.writeFileSync(mpvue, str, 'utf8');
184 T.log.green(`√ create file '${mpvue}' successfully `);
185 T.fsa.writeFileSync(mpcss, '', 'utf8');
186 T.log.green(`√ create file '${mpcss}' successfully `);
187 process.exit(1);
188 }
189
190 createReactComponent(){
191 let mp = T.Path.resolve(process.cwd(), `src/components/${ Generator.getNamePath(name) }`),
192 fn = Generator.getName(name),
193 mpreact = T.Path.join(mp, `${fn}.js`),
194 mpcss = T.Path.join(mp, `${fn}.css`);
195 let str = `\n\nclass ${ Generator.toFirstUpper(fn) } extends React.Component {\n\trender() {}\n}\n\nmodule.exports = ${ Generator.toFirstUpper(fn) };`;
196 T.fsa.mkdirpSync(mp);
197 T.fsa.writeFileSync(mpreact, str, 'utf8');
198 T.log.green(`√ create file '${mpreact}' successfully `);
199 T.fsa.writeFileSync(mpcss, '', 'utf8');
200 T.log.green(`√ create file '${mpcss}' successfully `);
201 process.exit(1);
202 }
203
204 createAngularComponent(){
205 let mp = T.Path.resolve(process.cwd(), `src/components/${ name }`),
206 fn = Generator.getName(name),
207 fnc = fn + '.component',
208 mpts = T.Path.join(mp, `${fnc}.ts`),
209 mphtml = T.Path.join(mp, `${fnc}.html`),
210 mpcss = T.Path.join(mp, `${fnc}.css`);
211
212 let str = `import { Component } from '@angular/core';\n\n@Component({\n\tselector: '${fn}',\n\ttemplateUrl: './${fnc}.html',\n\tentryComponents: [ ]\n})\nexport class ${ Generator.toFirstUpper(fn) }Component{\n\n\tconstructor(){}\n\n}`;
213
214 T.fsa.mkdirpSync(mp);
215 T.fsa.writeFileSync(mpts, str, 'utf8');
216 T.log.green(`√ create file '${mpts}' successfully `);
217 T.fsa.writeFileSync(mphtml, '', 'utf8');
218 T.log.green(`√ create file '${mphtml}' successfully `);
219 T.fsa.writeFileSync(mpcss, '', 'utf8');
220 T.log.green(`√ create file '${mpcss}' successfully `);
221 process.exit(1);
222 }
223
224 createSpec(){
225 let isNg = type === 'angular' || type === 'ng';
226 let mp = T.Path.resolve(process.cwd(), `test/${ Generator.getNamePath(name) }`),
227 fn = Generator.getName(name),
228 mpf = T.Path.join(mp, `${fn}.spec.${ isNg ? 'ts' : 'js'}`);
229 T.fsa.mkdirpSync(mp);
230 let str = this.strictDef;
231 str += `\nconst\n\tassert = require('assert');\n`;
232 str += `\ndescribe('#${fn}()', function() {\n\tit('should message', function() {\n\t\t// TODO... \n\t}); \n});`;
233 T.fsa.writeFileSync(mpf, str, 'utf8');
234 T.log.green(`\n√ create file '${mpf}' successfully `);
235 process.exit(1);
236 }
237
238 static toFirstUpper(str){
239 return str.replace(/^([a-z]{1}?)/i, (m, $1) =>{
240 return $1.toLocaleUpperCase();
241 });
242 }
243
244 static getName(name){
245 let ns = name.split(/[\/\.]/i);
246 return ns[ns.length - 1];
247 }
248
249 static getNamePath(name){
250 let ns = name.split(/[\/\.]/i);
251 ns.splice(-1, 1);
252 return ns.join('/');
253 }
254
255 static getInstance(){
256 if(!instance || (!instance instanceof Generator)){
257 instance = new Generator();
258 }
259 return instance;
260 }
261
262}
263
264module.exports = Generator.getInstance();
265
266
267
268