jjb-cmd 2.2.1 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1,340 @@
1
- function a17_0x3e3d(){const _0x5afaba=['2261924vHuEAy','multi','865236hOGwyF','compressing','includes','log','【Error】:安装失败,src目录不存在。','_zip','src','index.js','\x20}\x20from\x20\x27./','readdirSync','exports','installResources','8527490FRfbRR','11pTvvnm','pipe','now','find','installTarget','pure_name','push','4fCXrJN','react-admin-component','node_modules','mkdirSync','export\x20{\x20default\x20as\x20','filter','2809605sDihjS','toString','20tGWOfM','micro-spa','【Error】:安装失败,node_modules目录不存在。','request','1.0.0','createWriteStream','existsSync','8RNDcGL','./config','readFileSync','map','export\x20{\x20default\x20as\x20RouterContainer,\x20PATH\x20as\x20RouterContainerPATH\x20}\x20from\x20\x27./RouterContainer\x27;','.idea','.gitignore','4twjiXF','6809022NaaxNG','name','exit','./tools','length','zip','uncompress','path','forEach','writeFileSync','\x5cindex.js','join','【Error】:执行失败,在您的项目根目录,需要一个jjb.config.json文件。','setting.json','24801756thNDDM','spa','replace','vue-unisass-component','【Warning】:若安装在node_modules中,请确保projectType\x20=\x20micro-spa,并关闭webpack.config.js\x20rules限制。','rmdirSync','jjb-common','460552mOWRnk','importList','RouterContainer','projectType'];a17_0x3e3d=function(){return _0x5afaba;};return a17_0x3e3d();}function a17_0x2467(_0x7cc49a,_0x95e08c){const _0x3e3db6=a17_0x3e3d();return a17_0x2467=function(_0x246756,_0x33c148){_0x246756=_0x246756-0xaa;let _0x9505a4=_0x3e3db6[_0x246756];return _0x9505a4;},a17_0x2467(_0x7cc49a,_0x95e08c);}const a17_0x3eb4cc=a17_0x2467;(function(_0x51add6,_0x2b2c87){const _0x21601c=a17_0x2467,_0x444433=_0x51add6();while(!![]){try{const _0x24e776=parseInt(_0x21601c(0xd2))/0x1*(parseInt(_0x21601c(0xb8))/0x2)+-parseInt(_0x21601c(0xd8))/0x3*(-parseInt(_0x21601c(0xe8))/0x4)+-parseInt(_0x21601c(0xda))/0x5*(parseInt(_0x21601c(0xbe))/0x6)+-parseInt(_0x21601c(0xbc))/0x7*(parseInt(_0x21601c(0xe1))/0x8)+parseInt(_0x21601c(0xe9))/0x9+-parseInt(_0x21601c(0xca))/0xa*(-parseInt(_0x21601c(0xcb))/0xb)+-parseInt(_0x21601c(0xb1))/0xc;if(_0x24e776===_0x2b2c87)break;else _0x444433['push'](_0x444433['shift']());}catch(_0x4947b9){_0x444433['push'](_0x444433['shift']());}}}(a17_0x3e3d,0x7a1d1));const fs=require('fs'),path=require(a17_0x3eb4cc(0xaa)),request=require(a17_0x3eb4cc(0xdd)),compressing=require(a17_0x3eb4cc(0xbf)),{f_rm_rf,f_file_copy,f_content_replace,f_create_package_json,f_pull_git_repository,f_scan_jjb_config_json,f_scan_jjb_config_json_rules,f_update_project_package_json}=require(a17_0x3eb4cc(0xec)),{TEMPLATE_FOLDER,COMMON_CONTENT_SPA_REPLACE,CLI_DVA_ROUTER_PATH,CLI_DVA_REGISTER_PATH,CLI_DVA_ROUTER_SPA,CLI_DVA_REGISTER_SPA,CLI_DVA_ROUTER_SAAS,CLI_DVA_REGISTER_SAAS,COMMON_CONTENT_MICRO_REPLACE,COMMON_CONTENT_NOR_REPLACE,COMPONENTS_CONTENT_REPLACE}=require(a17_0x3eb4cc(0xe2)),start_time=Date[a17_0x3eb4cc(0xcd)]();module[a17_0x3eb4cc(0xc8)]=()=>{const _0x359e27=a17_0x3eb4cc,_0x53466b=path['resolve']('./'),_0x415053=[_0x53466b,'src\x5c'][_0x359e27(0xae)]('\x5c'),_0xec1107=[_0x53466b,_0x359e27(0xd4)][_0x359e27(0xae)]('\x5c'),_0x273f50=[_0x53466b,'package.json'][_0x359e27(0xae)]('\x5c');if(f_scan_jjb_config_json(_0x53466b)){const _0x3954bd=f_scan_jjb_config_json_rules(_0x53466b);_0x3954bd['installTarget']===_0x359e27(0xd4)?!fs['existsSync'](_0xec1107)?(console[_0x359e27(0xc1)](_0x359e27(0xdc)),process[_0x359e27(0xeb)](0x0)):console[_0x359e27(0xc1)](_0x359e27(0xb5)):!fs[_0x359e27(0xe0)](_0x415053)&&(console[_0x359e27(0xc1)](_0x359e27(0xc2)),process[_0x359e27(0xeb)](0x0));fs[_0x359e27(0xd5)](TEMPLATE_FOLDER),f_pull_git_repository(_0x3954bd[_0x359e27(0xc9)])[_0x359e27(0xe4)](_0x566825=>{const _0x1eb1ad=_0x359e27,_0x50d3d9=fs[_0x1eb1ad(0xdf)](_0x566825['path']);request(_0x566825['repository'])[_0x1eb1ad(0xcc)](_0x50d3d9)['on']('close',()=>{const _0x3434d1=_0x1eb1ad;fs[_0x3434d1(0xd5)](_0x566825['compress']),compressing[_0x3434d1(0xee)][_0x3434d1(0xef)](_0x566825[_0x3434d1(0xaa)],_0x566825['compress']);});});const _0x2db15c=setInterval(()=>{const _0xa2ab09=_0x359e27,_0x381a5=fs[_0xa2ab09(0xc7)](TEMPLATE_FOLDER),_0x2dcbac=_0x381a5[_0xa2ab09(0xd7)](_0x5724fd=>_0x3954bd[_0xa2ab09(0xc9)]['map'](_0x44bf52=>_0x44bf52[_0xa2ab09(0xea)]+_0xa2ab09(0xc3))['includes'](_0x5724fd));if(_0x2dcbac[_0xa2ab09(0xed)]===_0x3954bd[_0xa2ab09(0xc9)][_0xa2ab09(0xed)]){clearInterval(_0x2db15c);const _0x104722=[];_0x2dcbac[_0xa2ab09(0xab)](_0x50f1f9=>{const _0x45329c=_0xa2ab09,_0x19a33c=[TEMPLATE_FOLDER,_0x50f1f9]['join']('\x5c');fs[_0x45329c(0xc7)](_0x19a33c)['forEach'](_0x41ba14=>_0x104722[_0x45329c(0xd1)]({'name':_0x50f1f9,'path':[_0x19a33c,_0x41ba14][_0x45329c(0xae)]('\x5c'),'pure_name':_0x50f1f9[_0x45329c(0xb3)](/_zip$/,''),'import_list':_0x3954bd['installResources'][_0x45329c(0xce)](_0x19f7ff=>_0x19f7ff[_0x45329c(0xea)]+_0x45329c(0xc3)===_0x50f1f9)[_0x45329c(0xb9)]}));}),_0x104722['forEach'](_0x4875af=>{const _0x5edde8=_0xa2ab09,_0x2ce22d=_0x4875af[_0x5edde8(0xd0)],_0x13f954=_0x4875af['import_list'],_0x5d870f=[_0x4875af[_0x5edde8(0xaa)],_0x5edde8(0xe6)][_0x5edde8(0xae)]('//'),_0x3d2635=[_0x4875af[_0x5edde8(0xaa)],_0x5edde8(0xe7)][_0x5edde8(0xae)]('//');fs[_0x5edde8(0xe0)](_0x5d870f)&&(f_rm_rf(_0x5d870f),fs['rmdirSync'](_0x5d870f));fs[_0x5edde8(0xe0)](_0x3d2635)&&fs['unlinkSync'](_0x3d2635);if(_0x13f954['length']){fs[_0x5edde8(0xc7)](_0x4875af['path'])[_0x5edde8(0xd7)](_0x563082=>!_0x13f954[_0x5edde8(0xc0)](_0x563082)&&_0x563082!=='index.js'&&_0x563082!==_0x5edde8(0xb0))[_0x5edde8(0xab)](_0x285ff5=>{const _0x297221=_0x5edde8,_0x22693d=_0x4875af[_0x297221(0xaa)]+'\x5c'+_0x285ff5;f_rm_rf(_0x22693d),fs[_0x297221(0xb6)](_0x22693d);});if(_0x2ce22d===_0x5edde8(0xd3)){const _0x5204e2=[];fs[_0x5edde8(0xc7)](_0x4875af[_0x5edde8(0xaa)])['filter'](_0x4cfe57=>_0x4cfe57!==_0x5edde8(0xc5))['forEach'](_0x34b482=>{const _0x39f1f2=_0x5edde8;_0x34b482===_0x39f1f2(0xba)?_0x5204e2[_0x39f1f2(0xd1)](_0x39f1f2(0xe5)):_0x5204e2[_0x39f1f2(0xd1)](_0x39f1f2(0xd6)+_0x34b482+_0x39f1f2(0xc6)+_0x34b482+'\x27;');}),fs['writeFileSync'](_0x4875af[_0x5edde8(0xaa)]+_0x5edde8(0xad),_0x5204e2[_0x5edde8(0xae)]('\x0a'));}}if(_0x2ce22d===_0x5edde8(0xb7)){const _0x3aed29=[_0x4875af[_0x5edde8(0xaa)],'\x5cdva\x5cautomatic'][_0x5edde8(0xae)]('\x5c');if([_0x5edde8(0xb2),_0x5edde8(0xdb)]['includes'](_0x3954bd[_0x5edde8(0xbb)]))fs['existsSync'](_0x3aed29)&&(f_content_replace(_0x3954bd['projectType']===_0x5edde8(0xb2)?COMMON_CONTENT_SPA_REPLACE:[...COMMON_CONTENT_MICRO_REPLACE,...COMMON_CONTENT_NOR_REPLACE],_0x4875af[_0x5edde8(0xaa)]),fs['writeFileSync'](_0x4875af[_0x5edde8(0xaa)]+CLI_DVA_ROUTER_PATH,fs[_0x5edde8(0xe3)](_0x3954bd[_0x5edde8(0xbb)]===_0x5edde8(0xb2)?CLI_DVA_ROUTER_SPA:CLI_DVA_ROUTER_SAAS)[_0x5edde8(0xd9)]()),fs[_0x5edde8(0xac)](_0x4875af[_0x5edde8(0xaa)]+CLI_DVA_REGISTER_PATH,fs[_0x5edde8(0xe3)](_0x3954bd[_0x5edde8(0xbb)]===_0x5edde8(0xb2)?CLI_DVA_REGISTER_SPA:CLI_DVA_REGISTER_SAAS)['toString']()));else _0x3954bd[_0x5edde8(0xbb)]===_0x5edde8(0xbd)&&(fs['existsSync'](_0x3aed29)&&(f_rm_rf(_0x3aed29),fs['rmdirSync'](_0x3aed29)));}else{if(_0x2ce22d===_0x5edde8(0xd3))_0x3954bd[_0x5edde8(0xbb)]===_0x5edde8(0xdb)&&f_content_replace(COMPONENTS_CONTENT_REPLACE,_0x4875af[_0x5edde8(0xaa)]);else{if(_0x2ce22d===_0x5edde8(0xb4)){}}}if(_0x3954bd[_0x5edde8(0xcf)]===_0x5edde8(0xd4)){const _0x246016=_0x2ce22d;fs[_0x5edde8(0xe0)](_0xec1107+'\x5c'+_0x246016)?f_rm_rf(_0xec1107+'\x5c'+_0x246016):fs[_0x5edde8(0xd5)](_0xec1107+'\x5c'+_0x246016),f_file_copy(_0x4875af[_0x5edde8(0xaa)],_0xec1107+'\x5c'+_0x246016),f_create_package_json(_0xec1107+'\x5c'+_0x246016,_0x246016,'1.0.0'),f_update_project_package_json(_0x273f50,_0x246016,_0x5edde8(0xde));}else{if(_0x3954bd['installTarget']===_0x5edde8(0xc4)){const _0x1bb38d=_0x5edde8(0xd3);fs[_0x5edde8(0xe0)](_0x415053+_0x1bb38d)?f_rm_rf(_0x415053+_0x1bb38d):fs[_0x5edde8(0xd5)](_0x415053+_0x1bb38d),f_file_copy(_0x4875af['path'],_0x415053+_0x1bb38d);}}}),setTimeout(()=>{const _0x1799d7=_0xa2ab09;f_rm_rf(TEMPLATE_FOLDER),fs[_0x1799d7(0xb6)](TEMPLATE_FOLDER);const _0x54d4be=Date[_0x1799d7(0xcd)]();console[_0x1799d7(0xc1)]('【jjb-cmd】:install命令执行完成,用时'+(_0x54d4be-start_time)/0x3e8+'s');},0x5dc);}},0x3e8);}else console[_0x359e27(0xc1)](_0x359e27(0xaf));};
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const request = require('request');
4
+ const compressing = require('compressing');
5
+ const {
6
+ f_rm_rf,
7
+ f_file_copy,
8
+ f_content_replace,
9
+ f_create_package_json,
10
+ f_pull_git_repository,
11
+ f_scan_jjb_config_json,
12
+ f_scan_jjb_config_json_rules,
13
+ f_update_project_package_json
14
+ } = require('./tools');
15
+ const {
16
+ TEMPLATE_FOLDER,
17
+ COMMON_CONTENT_SPA_REPLACE,
18
+ CLI_DVA_ROUTER_PATH,
19
+ CLI_DVA_REGISTER_PATH,
20
+ CLI_DVA_ROUTER_SPA,
21
+ CLI_DVA_REGISTER_SPA,
22
+ CLI_DVA_ROUTER_SAAS,
23
+ CLI_DVA_REGISTER_SAAS,
24
+ COMMON_CONTENT_MICRO_REPLACE,
25
+ COMMON_CONTENT_NOR_REPLACE,
26
+ COMPONENTS_CONTENT_REPLACE
27
+ } = require('./config');
28
+ const start_time = Date.now();
29
+
30
+ module.exports = () => {
31
+ /**
32
+ * 下发数据根路径
33
+ * @type {string}
34
+ */
35
+ const root_path = path.resolve('./');
36
+ /**
37
+ * 下发数据src路径
38
+ * @type {string}
39
+ */
40
+ const target_src = [
41
+ root_path,
42
+ 'src\\'
43
+ ].join('\\');
44
+ /**
45
+ * 下发数据node_modules路径
46
+ * @type {string}
47
+ */
48
+ const target_node_modules = [
49
+ root_path,
50
+ 'node_modules'
51
+ ].join('\\');
52
+ /**
53
+ * 下发数据package.json路径
54
+ * @type {string}
55
+ */
56
+ const target_package_json = [
57
+ root_path,
58
+ 'package.json'
59
+ ].join('\\');
60
+ if (f_scan_jjb_config_json(root_path)) {
61
+ /**
62
+ * 检查配置规则
63
+ */
64
+ const jjb_config = f_scan_jjb_config_json_rules(root_path);
65
+ /**
66
+ * 检查项目是否存在node_modules
67
+ */
68
+ if (jjb_config.installTarget === 'node_modules') {
69
+ if (!fs.existsSync(target_node_modules)) {
70
+ console.log('【Error】:安装失败,node_modules目录不存在。');
71
+ process.exit(0);
72
+ } else {
73
+ console.log('【Warning】:若安装在node_modules中,请确保projectType = micro-spa,并关闭webpack.config.js rules限制。');
74
+ }
75
+ } else {
76
+ if (!fs.existsSync(target_src)) {
77
+ console.log('【Error】:安装失败,src目录不存在。');
78
+ process.exit(0);
79
+ }
80
+ }
81
+ /**
82
+ * 文件操作:定义一个临时文件夹
83
+ */
84
+ fs.mkdirSync(TEMPLATE_FOLDER);
85
+ /**
86
+ * 拉取数据
87
+ */
88
+ f_pull_git_repository(jjb_config.installResources).map(item => {
89
+ const stream = fs.createWriteStream(item.path);
90
+ /**
91
+ * 流操作:下载git仓库
92
+ */
93
+ request(item.repository).pipe(stream).on('close', () => {
94
+ fs.mkdirSync(item.compress);
95
+ /**
96
+ * 流操作:解压
97
+ */
98
+ compressing.zip.uncompress(item.path, item.compress);
99
+ });
100
+ });
101
+ const timer = setInterval(() => {
102
+ /**
103
+ * 文件操作:扫描临时文件夹
104
+ */
105
+ const folder_list = fs.readdirSync(TEMPLATE_FOLDER);
106
+ /**
107
+ * 文件操作:抓取临时文件夹中的内容
108
+ */
109
+ const match_folder = folder_list.filter(item => jjb_config.installResources.map(item => `${item.name}_zip`).includes(item));
110
+ /**
111
+ * 文件操作:判断是否已解压完成
112
+ */
113
+ if (match_folder.length === jjb_config.installResources.length) {
114
+ /**
115
+ * 解压完成关闭定时器
116
+ */
117
+ clearInterval(timer);
118
+ const resource_folder = [];
119
+ match_folder.forEach(name => {
120
+ /**
121
+ * 文件操作:定义解压包路径
122
+ */
123
+ const unzip = [
124
+ TEMPLATE_FOLDER,
125
+ name
126
+ ].join('\\');
127
+ /**
128
+ * 文件操作:抓取解压包中的文件
129
+ */
130
+ fs.readdirSync(unzip).forEach(dir => resource_folder.push({
131
+ name: name,
132
+ path: [
133
+ unzip,
134
+ dir
135
+ ].join('\\'),
136
+ pure_name: name.replace(/_zip$/, ''),
137
+ import_list: jjb_config.installResources.find(item => `${item.name}_zip` === name).importList
138
+ }));
139
+ });
140
+ resource_folder.forEach(item => {
141
+ /**
142
+ * 文件操作:依赖名称
143
+ */
144
+ const folder_name = item.pure_name;
145
+ /**
146
+ * 文件操作:按需加载
147
+ */
148
+ const folder_import_list = item.import_list;
149
+ /**
150
+ * 文件操作:组装路径
151
+ */
152
+ const folder_idea_path = [
153
+ item.path,
154
+ '.idea'
155
+ ].join('//');
156
+ /**
157
+ * 文件操作:组装路径
158
+ */
159
+ const folder_git_ignore_path = [
160
+ item.path,
161
+ '.gitignore'
162
+ ].join('//');
163
+ /**
164
+ * 特殊处理:删除.idea文件夹
165
+ */
166
+ if (fs.existsSync(folder_idea_path)) {
167
+ f_rm_rf(folder_idea_path);
168
+ fs.rmdirSync(folder_idea_path);
169
+ }
170
+ /**
171
+ * 特殊处理:删除.gitignore文件
172
+ */
173
+ if (fs.existsSync(folder_git_ignore_path)) {
174
+ fs.unlinkSync(folder_git_ignore_path);
175
+ }
176
+ /**
177
+ * 文件操作:按需加载
178
+ */
179
+ if (folder_import_list.length) {
180
+ /**
181
+ * 文件操作:根据jjb.config.json中的importList获取需要的文件
182
+ */
183
+ fs.readdirSync(item.path).filter(item => !folder_import_list.includes(item) && item !== 'index.js' && item !== 'setting.json').forEach(dir => {
184
+ /**
185
+ * 文件操作:组装路径
186
+ */
187
+ const dirPath = `${item.path}\\${dir}`;
188
+ /**
189
+ * 文件操作:删除不需要的文件夹内容
190
+ */
191
+ f_rm_rf(dirPath);
192
+ /**
193
+ * 文件操作:删除不需要的文件夹
194
+ */
195
+ fs.rmdirSync(dirPath);
196
+ });
197
+ if (folder_name === 'react-admin-component') {
198
+ const codeList = [];
199
+ fs.readdirSync(item.path).filter(dir => dir !== 'index.js').forEach(dir => {
200
+ if (dir === 'RouterContainer') {
201
+ codeList.push(`export { default as RouterContainer, PATH as RouterContainerPATH } from './RouterContainer';`);
202
+ } else {
203
+ codeList.push(`export { default as ${dir} } from './${dir}';`);
204
+ }
205
+ });
206
+ fs.writeFileSync(`${item.path}\\index.js`, codeList.join('\n'));
207
+ }
208
+ }
209
+ if (folder_name === 'jjb-common') {
210
+ /**
211
+ * 组装dva/automatic路径
212
+ */
213
+ const automaticPath = [
214
+ item.path,
215
+ '\\dva\\automatic'
216
+ ].join('\\');
217
+ if ([
218
+ 'spa',
219
+ 'micro-spa'
220
+ ].includes(jjb_config.projectType)) {
221
+ /**
222
+ * 特殊处理:由于micro-spa模式下需要使用react-router-dom自动化技术,spa模式下使用基于dva/router的自动化技术,两者有差异,需要做替换操作
223
+ */
224
+ if (fs.existsSync(automaticPath)) {
225
+ /**
226
+ * 文件操作:常规替换
227
+ */
228
+ f_content_replace(jjb_config.projectType === 'spa'
229
+ ? COMMON_CONTENT_SPA_REPLACE
230
+ : [
231
+ ...COMMON_CONTENT_MICRO_REPLACE,
232
+ ...COMMON_CONTENT_NOR_REPLACE
233
+ ], item.path);
234
+ /**
235
+ * 文件操作:替换dva/automatic/router.js
236
+ */
237
+ fs.writeFileSync(item.path + CLI_DVA_ROUTER_PATH, fs.readFileSync(jjb_config.projectType === 'spa'
238
+ ? CLI_DVA_ROUTER_SPA
239
+ : CLI_DVA_ROUTER_SAAS).toString());
240
+ /**
241
+ * 文件操作:替换dva/automatic/register.js
242
+ */
243
+ fs.writeFileSync(item.path + CLI_DVA_REGISTER_PATH, fs.readFileSync(jjb_config.projectType === 'spa'
244
+ ? CLI_DVA_REGISTER_SPA
245
+ : CLI_DVA_REGISTER_SAAS).toString());
246
+ }
247
+ } else if (jjb_config.projectType === 'multi') {
248
+ /**
249
+ * 特殊处理:由于multi模式下不需要使用自动化技术,需要删除dva/automatic文件夹
250
+ */
251
+ if (fs.existsSync(automaticPath)) {
252
+ f_rm_rf(automaticPath);
253
+ fs.rmdirSync(automaticPath);
254
+ }
255
+ }
256
+ } else if (folder_name === 'react-admin-component') {
257
+ /**
258
+ * 特殊处理:仅限micro-spa模式下允许react-admin-component使用node_modules/jjb-common,其他模式使用src/components,目的是兼容老项目
259
+ */
260
+ if (jjb_config.projectType === 'micro-spa') {
261
+ f_content_replace(COMPONENTS_CONTENT_REPLACE, item.path);
262
+ }
263
+ } else if (folder_name === 'vue-unisass-component') {
264
+
265
+ }
266
+ if (jjb_config.installTarget === 'node_modules') {
267
+ /**
268
+ * 特殊处理:为了避免与node_modules其他依赖重名,添加一个标识符"jjb-"
269
+ */
270
+ const package_name = folder_name;
271
+ /**
272
+ * 文件操作:判断node_modules目录下是否已存在
273
+ */
274
+ if (fs.existsSync(`${target_node_modules}\\${package_name}`)) {
275
+ /**
276
+ * 文件操作:删除node_modules目录下文件内容(保留文件夹)
277
+ */
278
+ f_rm_rf(`${target_node_modules}\\${package_name}`);
279
+ } else {
280
+ /**
281
+ * 文件操作:如果不存在,定义一个新的文件夹
282
+ */
283
+ fs.mkdirSync(`${target_node_modules}\\${package_name}`);
284
+ }
285
+ /**
286
+ * 文件操作:复制文件到node_modules中
287
+ */
288
+ f_file_copy(item.path, `${target_node_modules}\\${package_name}`);
289
+ /**
290
+ * 文件操作:创建package.json
291
+ */
292
+ f_create_package_json(`${target_node_modules}\\${package_name}`, package_name, '1.0.0');
293
+ /**
294
+ * 文件操作:在src/package.json中定义一个组件依赖
295
+ */
296
+ f_update_project_package_json(target_package_json, package_name, '1.0.0');
297
+ } else if (jjb_config.installTarget === 'src') {
298
+ /**
299
+ * 特殊处理:由于老项目问题,此处要将react-admin-component转换为components(仅限src模式)
300
+ */
301
+ const t_name = 'react-admin-component';
302
+ /**
303
+ * 文件操作:判断src目录下是否已存在
304
+ */
305
+ if (fs.existsSync(target_src + t_name)) {
306
+ /**
307
+ * 文件操作:删除src目录下文件内容(保留文件夹)
308
+ */
309
+ f_rm_rf(target_src + t_name);
310
+ } else {
311
+ /**
312
+ * 文件操作:如果不存在,定义一个新的文件夹
313
+ */
314
+ fs.mkdirSync(target_src + t_name);
315
+ }
316
+ /**
317
+ * 文件操作:复制文件到src中
318
+ */
319
+ f_file_copy(item.path, target_src + t_name);
320
+ }
321
+ });
322
+ setTimeout(() => {
323
+ /**
324
+ * 文件操作:删除临时文件夹内容
325
+ */
326
+ f_rm_rf(TEMPLATE_FOLDER);
327
+ /**
328
+ * 文件操作:删除临时文件夹
329
+ */
330
+ fs.rmdirSync(TEMPLATE_FOLDER);
331
+ const end_time = Date.now();
332
+ console.log(`【jjb-cmd】:install命令执行完成,用时${(end_time - start_time) / 1000}s`);
333
+ }, 1500);
334
+ }
335
+ }, 1000);
336
+ } else {
337
+ console.log('【Error】:执行失败,在您的项目根目录,需要一个jjb.config.json文件。');
338
+ }
339
+ };
340
+
@@ -1 +1,230 @@
1
- const a18_0x5aa1c5=a18_0x3d45;function a18_0x3d45(_0x8b727c,_0x5bbdc9){const _0xdebfb1=a18_0xdebf();return a18_0x3d45=function(_0x3d4567,_0x57e935){_0x3d4567=_0x3d4567-0x106;let _0x144e26=_0xdebfb1[_0x3d4567];return _0x144e26;},a18_0x3d45(_0x8b727c,_0x5bbdc9);}function a18_0xdebf(){const _0x2b838e=['jjb-common-lib','toString','44LPCRbR','isArray','multi','stringify','1wqNrTV','\x5cjjb.config.json','installTarget','spa','./config','vue-unisass-component','\x22,\x22version\x22:\x22','string','f_scan_jjb_config_json_rules','f_scan_jjb_config_json','parse','forEach','1098544GZtaIf','readFileSync','writeFileSync','includes','f_rm_rf','499578kiRhQk','length','f_update_project_package_json','statSync','existsSync','3056375OsNpRL','replace','\x5cpackage.json','1090148sKRJXQ','/api/v4/projects/','【Error】:[jjb.config.json.installTarget]类型是一个string。','name','installResources','2069230Xmuovp','【Error】:[jjb.config.json.installResources]无资源。','map','【Error】:[jjb.config.json.installResources]配置无效,有效值<common\x20|\x20react-admin-component\x20|\x20vue-unisass-component\x20|\x20jjb-common-decorator\x20|\x20jjb-dva-runtime\x20|\x20jjb-common-lib>。','log','9LDyTjr','f_content_replace','_zip','dependencies','{\x22name\x22:\x22','projectType','rmdirSync','jjb-common-decorator','3544010pqfLPZ','isDirectory','【Error】:[jjb.config.json.projectType]配置无效,有效值<multi\x20|\x20spa\x20|\x20micro-spa\x20|\x20uniapp>。','f_file_copy','2708670ByznlY','【Error】:[jjb.config.json]文件配置无效,需要projectType属性。','f_create_package_json','uniapp','jjb-dva-runtime','【Error】:[jjb.config.json.node_modules]配置无效,有效值<node_modules\x20|\x20src>。','jjb-common','【Error】:[jjb.config.json.projectType]类型是一个string。','unlinkSync','.zip','exit','f_resolve_install_resources','【Error】:[jjb.config.json]文件配置无效,需要installResources属性。','【Error】:[jjb.config.json]文件配置无效,需要installTarget属性。','/repository/archive.zip?private_token=','【Error】:[jjb.config.json]文件解析失败,请确认是否配置正确。','\x22,\x22main\x22:\x20\x22index.js\x22}','3gMdWmB','node_modules','src','path','push'];a18_0xdebf=function(){return _0x2b838e;};return a18_0xdebf();}(function(_0x2122a9,_0x54dbe5){const _0x14f26a=a18_0x3d45,_0x2c1443=_0x2122a9();while(!![]){try{const _0x5aa371=parseInt(_0x14f26a(0x115))/0x1*(parseInt(_0x14f26a(0x126))/0x2)+parseInt(_0x14f26a(0x10a))/0x3*(parseInt(_0x14f26a(0x12e))/0x4)+parseInt(_0x14f26a(0x133))/0x5+parseInt(_0x14f26a(0x144))/0x6+parseInt(_0x14f26a(0x12b))/0x7+-parseInt(_0x14f26a(0x121))/0x8*(parseInt(_0x14f26a(0x138))/0x9)+-parseInt(_0x14f26a(0x140))/0xa*(parseInt(_0x14f26a(0x111))/0xb);if(_0x5aa371===_0x54dbe5)break;else _0x2c1443['push'](_0x2c1443['shift']());}catch(_0x3a82ab){_0x2c1443['push'](_0x2c1443['shift']());}}}(a18_0xdebf,0x41c08));const fs=require('fs'),os=require('os'),{GIT_HOST,GIT_TEMP_DIR,CLOUD_PROJECT}=require(a18_0x5aa1c5(0x119));exports[a18_0x5aa1c5(0x125)]=function(_0x3c42d7){const _0x236805=a18_0x5aa1c5;if(fs[_0x236805(0x12a)](_0x3c42d7)){const _0xa3d25=fs['readdirSync'](_0x3c42d7);for(let _0x5284b4=0x0;_0x5284b4<_0xa3d25[_0x236805(0x127)];_0x5284b4++){const _0x564958=_0xa3d25[_0x5284b4],_0x290173=_0x3c42d7+'/'+_0x564958;fs['statSync'](_0x290173)[_0x236805(0x141)]()?(exports['f_rm_rf'](_0x290173),fs[_0x236805(0x13e)](_0x290173)):fs[_0x236805(0x14c)](_0x290173);}}},exports['f_pull_git_repository']=function(_0x337e0d=[]){const _0x350979=a18_0x5aa1c5;return _0x337e0d[_0x350979(0x135)](_0x28a4ae=>{const _0x33fa85=_0x350979,_0x21383c=CLOUD_PROJECT[_0x28a4ae['name']]||undefined,_0x126df5=os['tmpdir']();return{'path':_0x126df5+'\x5c'+GIT_TEMP_DIR+'\x5c'+_0x28a4ae[_0x33fa85(0x131)]+_0x33fa85(0x14d),'compress':_0x126df5+'\x5c'+GIT_TEMP_DIR+'\x5c'+_0x28a4ae['name']+_0x33fa85(0x13a),'repository':GIT_HOST+_0x33fa85(0x12f)+_0x21383c['projectId']+_0x33fa85(0x107)+_0x21383c['token']+'&ref=master'};});},exports[a18_0x5aa1c5(0x11e)]=function(_0x44f083){const _0x359286=a18_0x5aa1c5;return fs[_0x359286(0x12a)](_0x44f083+_0x359286(0x116));},exports[a18_0x5aa1c5(0x11d)]=function(_0x35669b){const _0x2a1d70=a18_0x5aa1c5;let _0x5b11f0={};try{_0x5b11f0=JSON[_0x2a1d70(0x11f)](fs[_0x2a1d70(0x122)](_0x35669b+_0x2a1d70(0x116))['toString']());}catch(_0xdd85f2){console[_0x2a1d70(0x137)](_0x2a1d70(0x108)),process[_0x2a1d70(0x14e)](0x0);}!(_0x2a1d70(0x13d)in _0x5b11f0)&&(console[_0x2a1d70(0x137)](_0x2a1d70(0x145)),process[_0x2a1d70(0x14e)](0x0));!('installTarget'in _0x5b11f0)&&(console['log'](_0x2a1d70(0x106)),process[_0x2a1d70(0x14e)](0x0));!(_0x2a1d70(0x132)in _0x5b11f0)&&(console[_0x2a1d70(0x137)](_0x2a1d70(0x150)),process[_0x2a1d70(0x14e)](0x0));typeof _0x5b11f0['projectType']!==_0x2a1d70(0x11c)&&(console[_0x2a1d70(0x137)](_0x2a1d70(0x14b)),process['exit'](0x0));![_0x2a1d70(0x113),_0x2a1d70(0x118),_0x2a1d70(0x147),'micro-spa']['includes'](_0x5b11f0[_0x2a1d70(0x13d)])&&(console[_0x2a1d70(0x137)](_0x2a1d70(0x142)),process[_0x2a1d70(0x14e)](0x0));typeof _0x5b11f0[_0x2a1d70(0x117)]!==_0x2a1d70(0x11c)&&(console[_0x2a1d70(0x137)](_0x2a1d70(0x130)),process['exit'](0x0));![_0x2a1d70(0x10b),_0x2a1d70(0x10c)][_0x2a1d70(0x124)](_0x5b11f0[_0x2a1d70(0x117)])&&(console[_0x2a1d70(0x137)](_0x2a1d70(0x149)),process[_0x2a1d70(0x14e)](0x0));!Array[_0x2a1d70(0x112)](_0x5b11f0[_0x2a1d70(0x132)])&&(console[_0x2a1d70(0x137)]('【Error】:[jjb.config.json.installResources]类型是一个Array<string>。'),process[_0x2a1d70(0x14e)](0x0));_0x5b11f0[_0x2a1d70(0x132)][_0x2a1d70(0x127)]===0x0&&(console[_0x2a1d70(0x137)](_0x2a1d70(0x134)),process[_0x2a1d70(0x14e)](0x0));const _0x5c85a9=exports[_0x2a1d70(0x14f)](_0x5b11f0[_0x2a1d70(0x132)]);return _0x5c85a9[_0x2a1d70(0x135)](_0x27967f=>_0x27967f[_0x2a1d70(0x131)])['filter'](_0x53e152=>![_0x2a1d70(0x14a),_0x2a1d70(0x148),_0x2a1d70(0x10f),_0x2a1d70(0x13f),'react-admin-component',_0x2a1d70(0x11a)][_0x2a1d70(0x124)](_0x53e152))['length']!==0x0&&(console[_0x2a1d70(0x137)](_0x2a1d70(0x136)),process[_0x2a1d70(0x14e)](0x0)),_0x5b11f0[_0x2a1d70(0x132)]=_0x5c85a9,_0x5b11f0;},exports[a18_0x5aa1c5(0x146)]=function(_0x24d9dd,_0x24f950,_0x1e1f70){const _0x4c0ede=a18_0x5aa1c5;fs['writeFileSync'](_0x24d9dd+_0x4c0ede(0x12d),_0x4c0ede(0x13c)+_0x24f950+_0x4c0ede(0x11b)+_0x1e1f70+_0x4c0ede(0x109));},exports['f_resolve_install_resources']=function(_0x312441=[]){const _0xb9d398=a18_0x5aa1c5,_0x10753d=[];return Array['isArray'](_0x312441)&&_0x312441[_0xb9d398(0x120)](_0x872417=>{const _0xbc10d=_0xb9d398;if(Array[_0xbc10d(0x112)](_0x872417)){const [_0x13c654,_0x239fd1=[]]=_0x872417;_0x10753d['push']({'name':_0x13c654,'importList':_0x239fd1});}else _0x10753d[_0xbc10d(0x10e)]({'name':_0x872417,'importList':[]});}),_0x10753d;},exports[a18_0x5aa1c5(0x128)]=function(_0x18ba17,_0x467420,_0x13769a){const _0x5070fa=a18_0x5aa1c5,_0x47d5d7=JSON['parse'](fs[_0x5070fa(0x122)](_0x18ba17)['toString']());_0x47d5d7[_0x5070fa(0x13b)][_0x467420]=_0x13769a,fs[_0x5070fa(0x123)](_0x18ba17,JSON[_0x5070fa(0x114)](_0x47d5d7,null,0x2));},exports[a18_0x5aa1c5(0x143)]=function(_0x1b39bb,_0x3e0738){const _0x2cbd68=a18_0x5aa1c5;fs['readdirSync'](_0x1b39bb)[_0x2cbd68(0x120)](_0x48131c=>{const _0x4b459e=_0x2cbd68,_0x31749e=_0x1b39bb+'\x5c'+_0x48131c,_0x20907f=_0x3e0738+'\x5c'+_0x48131c;fs[_0x4b459e(0x129)](_0x31749e)[_0x4b459e(0x141)]()?(fs['mkdirSync'](_0x20907f),exports[_0x4b459e(0x143)](_0x31749e,_0x20907f)):fs[_0x4b459e(0x123)](_0x20907f,fs[_0x4b459e(0x122)](_0x31749e)[_0x4b459e(0x110)]());});},exports[a18_0x5aa1c5(0x139)]=function(_0xb28bd1=[],_0x37fd35){_0xb28bd1['forEach'](_0x374786=>{const _0x510f87=a18_0x3d45,_0x316a3b=_0x37fd35+_0x374786[_0x510f87(0x10d)];if(fs[_0x510f87(0x12a)](_0x316a3b)){let _0x638d6=fs['readFileSync'](_0x316a3b)[_0x510f87(0x110)]();_0x374786[_0x510f87(0x12c)]['forEach'](_0x24af44=>{_0x638d6=_0x638d6['replace'](_0x24af44[0x0],_0x24af44[0x1]);}),fs[_0x510f87(0x123)](_0x316a3b,_0x638d6);}});};
1
+ const fs = require('fs');
2
+ const os = require('os');
3
+ const {
4
+ GIT_HOST,
5
+ GIT_TEMP_DIR,
6
+ CLOUD_PROJECT
7
+ } = require('./config');
8
+
9
+ /**
10
+ * @description 删除全部
11
+ * @param path {string} 路径
12
+ */
13
+ exports.f_rm_rf = function (path) {
14
+ if (fs.existsSync(path)) {
15
+ const list = fs.readdirSync(path);
16
+ for (let i = 0; i < list.length; i++) {
17
+ const item = list[ i ];
18
+ const vPath = `${path}/${item}`;
19
+ if (fs.statSync(vPath).isDirectory()) {
20
+ exports.f_rm_rf(vPath);
21
+ fs.rmdirSync(vPath);
22
+ } else {
23
+ fs.unlinkSync(vPath);
24
+ }
25
+ }
26
+ }
27
+ };
28
+
29
+ /**
30
+ * @typedef {object} GitResource
31
+ * @property {string} path
32
+ * @property {string} compress
33
+ * @property {string} repository
34
+ */
35
+
36
+ /**
37
+ * @description 拉取git资源
38
+ * @param installResources {Resource[]} 资源名称
39
+ * @return {GitResource[]}
40
+ */
41
+ exports.f_pull_git_repository = function (installResources = []) {
42
+ return installResources.map(item => {
43
+ const resource = CLOUD_PROJECT[ item.name ] || undefined;
44
+ const template = os.tmpdir();
45
+ return {
46
+ path: `${template}\\${GIT_TEMP_DIR}\\${item.name}.zip`,
47
+ compress: `${template}\\${GIT_TEMP_DIR}\\${item.name}_zip`,
48
+ repository: `${GIT_HOST}/api/v4/projects/${resource.projectId}/repository/archive.zip?private_token=${resource.token}&ref=master`
49
+ };
50
+ });
51
+ };
52
+
53
+ /**
54
+ * @description 扫描是否存在jjb.config.json
55
+ * @param root 路径
56
+ * @returns {boolean}
57
+ */
58
+ exports.f_scan_jjb_config_json = function (root) {
59
+ return fs.existsSync(`${root}\\jjb.config.json`);
60
+ };
61
+
62
+ /**
63
+ * @typedef {object} JJB_CONFIG_JSON
64
+ * @property {string} projectType
65
+ * @property {string} installTarget
66
+ * @property {Resource[]} installResources
67
+ */
68
+
69
+ /**
70
+ * @description 验证规则
71
+ * @param root {string} 路径
72
+ * @return {JJB_CONFIG_JSON}
73
+ */
74
+ exports.f_scan_jjb_config_json_rules = function (root) {
75
+ let jjb_config_json = {};
76
+ try {
77
+ jjb_config_json = JSON.parse(fs.readFileSync(`${root}\\jjb.config.json`).toString());
78
+ } catch (e) {
79
+ console.log('【Error】:[jjb.config.json]文件解析失败,请确认是否配置正确。');
80
+ process.exit(0);
81
+ }
82
+ if (!('projectType' in jjb_config_json)) {
83
+ console.log('【Error】:[jjb.config.json]文件配置无效,需要projectType属性。');
84
+ process.exit(0);
85
+ }
86
+ if (!('installTarget' in jjb_config_json)) {
87
+ console.log('【Error】:[jjb.config.json]文件配置无效,需要installTarget属性。');
88
+ process.exit(0);
89
+ }
90
+ if (!('installResources' in jjb_config_json)) {
91
+ console.log('【Error】:[jjb.config.json]文件配置无效,需要installResources属性。');
92
+ process.exit(0);
93
+ }
94
+ if (typeof jjb_config_json.projectType !== 'string') {
95
+ console.log('【Error】:[jjb.config.json.projectType]类型是一个string。');
96
+ process.exit(0);
97
+ }
98
+ if (![
99
+ 'multi',
100
+ 'spa',
101
+ 'uniapp',
102
+ 'micro-spa'
103
+ ].includes(jjb_config_json.projectType)) {
104
+ console.log('【Error】:[jjb.config.json.projectType]配置无效,有效值<multi | spa | micro-spa | uniapp>。');
105
+ process.exit(0);
106
+ }
107
+ if (typeof jjb_config_json.installTarget !== 'string') {
108
+ console.log('【Error】:[jjb.config.json.installTarget]类型是一个string。');
109
+ process.exit(0);
110
+ }
111
+ if (![
112
+ 'node_modules',
113
+ 'src'
114
+ ].includes(jjb_config_json.installTarget)) {
115
+ console.log('【Error】:[jjb.config.json.node_modules]配置无效,有效值<node_modules | src>。');
116
+ process.exit(0);
117
+ }
118
+ if (!Array.isArray(jjb_config_json.installResources)) {
119
+ console.log('【Error】:[jjb.config.json.installResources]类型是一个Array<string>。');
120
+ process.exit(0);
121
+ }
122
+ if (jjb_config_json.installResources.length === 0) {
123
+ console.log('【Error】:[jjb.config.json.installResources]无资源。');
124
+ process.exit(0);
125
+ }
126
+ const resources = exports.f_resolve_install_resources(jjb_config_json.installResources);
127
+ if (resources.map(item => item.name).filter(v => ![
128
+ 'jjb-common',
129
+ 'jjb-dva-runtime',
130
+ 'jjb-common-lib',
131
+ 'jjb-common-decorator',
132
+ 'react-admin-component',
133
+ 'vue-unisass-component'
134
+ ].includes(v)).length !== 0) {
135
+ console.log('【Error】:[jjb.config.json.installResources]配置无效,有效值<common | react-admin-component | vue-unisass-component | jjb-common-decorator | jjb-dva-runtime | jjb-common-lib>。');
136
+ process.exit(0);
137
+ }
138
+ jjb_config_json.installResources = resources;
139
+ return jjb_config_json;
140
+ };
141
+
142
+ /**
143
+ * @description 创建package.json
144
+ * @param path {string} 路径
145
+ * @param name {string} 包名
146
+ * @param version {string} 版本
147
+ */
148
+ exports.f_create_package_json = function (path, name, version) {
149
+ fs.writeFileSync(`${path}\\package.json`, `{"name":"${name}","version":"${version}","main": "index.js"}`);
150
+ };
151
+
152
+ /**
153
+ * @typedef {object} Resource
154
+ * @property {string} name
155
+ * @property {string[]} importList
156
+ */
157
+
158
+ /**
159
+ * @description 分析resources
160
+ * @param installResources
161
+ * @return {Resource[]}
162
+ */
163
+ exports.f_resolve_install_resources = function (installResources = []) {
164
+ const resources = [];
165
+ if (Array.isArray(installResources)) {
166
+ installResources.forEach(resource => {
167
+ if (Array.isArray(resource)) {
168
+ const [ name, importList = [] ] = resource;
169
+ resources.push({
170
+ name,
171
+ importList
172
+ });
173
+ } else {
174
+ resources.push({
175
+ name: resource,
176
+ importList: []
177
+ });
178
+ }
179
+ });
180
+ }
181
+ return resources;
182
+ };
183
+
184
+ /**
185
+ * @description 更新项目package.json文件
186
+ * @param path {string} 路径
187
+ * @param name {string} 包名
188
+ * @param version {string} 版本
189
+ */
190
+ exports.f_update_project_package_json = function (path, name, version) {
191
+ const packageJSONFile = JSON.parse(fs.readFileSync(path).toString());
192
+ packageJSONFile.dependencies[ name ] = version;
193
+ fs.writeFileSync(path, JSON.stringify(packageJSONFile, null, 2));
194
+ };
195
+
196
+ /**
197
+ * @description 复制文件
198
+ * @param originSrc
199
+ * @param targetSrc
200
+ */
201
+ exports.f_file_copy = function (originSrc, targetSrc) {
202
+ fs.readdirSync(originSrc).forEach(dir => {
203
+ const oPath = `${originSrc}\\${dir}`;
204
+ const tPath = `${targetSrc}\\${dir}`;
205
+ if (fs.statSync(oPath).isDirectory()) {
206
+ fs.mkdirSync(tPath);
207
+ exports.f_file_copy(oPath, tPath);
208
+ } else {
209
+ fs.writeFileSync(tPath, fs.readFileSync(oPath).toString());
210
+ }
211
+ });
212
+ };
213
+
214
+ /**
215
+ * @description 替换文件操作
216
+ * @param source {[]} 替换源
217
+ * @param root {string} 路径
218
+ */
219
+ exports.f_content_replace = function (source = [], root) {
220
+ source.forEach(item => {
221
+ const path = root + item.path;
222
+ if (fs.existsSync(path)) {
223
+ let content = fs.readFileSync(path).toString();
224
+ item.replace.forEach(rep => {
225
+ content = content.replace(rep[ 0 ], rep[ 1 ]);
226
+ });
227
+ fs.writeFileSync(path, content);
228
+ }
229
+ });
230
+ };