crabatool 1.0.21 → 1.0.25
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.
- package/index.js +24 -0
- package/lib/stringBuilder.js +81 -0
- package/lib/utils.js +29 -0
- package/package.json +2 -2
- package/test/checkjs.bat +1 -0
- package/test/run.bat +1 -0
- package/test/test.js +3 -1
- package/tool/checkjs.js +68 -16
package/index.js
CHANGED
|
@@ -6,15 +6,39 @@ var path = require('path');
|
|
|
6
6
|
var readline = require('readline');
|
|
7
7
|
|
|
8
8
|
module.exports.run = function(options) {
|
|
9
|
+
//console.log(process.argv);
|
|
9
10
|
console.log('当前环境:' + process.platform);
|
|
10
11
|
console.log('平台助手启动参数:', options);
|
|
11
12
|
|
|
12
13
|
Object.assign(config, options);
|
|
13
14
|
checkConfig();
|
|
15
|
+
|
|
16
|
+
// 1. 服务端构建环境,自动化,根据命令行参数,直接调用脚手架功能
|
|
17
|
+
if (process.argv.length > 2) {
|
|
18
|
+
var arr = [...process.argv];
|
|
19
|
+
if (arr.includes('-checkjs')) {
|
|
20
|
+
return checkAllJs();
|
|
21
|
+
} else if (arr.includes('-run')) {
|
|
22
|
+
return start();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// 2. 开发环境让开发选择功能
|
|
14
27
|
waitInput();
|
|
15
28
|
}
|
|
16
29
|
|
|
17
30
|
function checkConfig() {
|
|
31
|
+
if (process.argv.length > 2) {
|
|
32
|
+
var arr = [...process.argv];
|
|
33
|
+
// 支持根据参数传入web地址,开发环境是地址1,构建环境是地址2,而配置是写死的,通过参数灵活指定
|
|
34
|
+
if (arr.includes('-webPath')) {
|
|
35
|
+
var index = arr.indexOf('-webPath');
|
|
36
|
+
var webPath = arr[index + 1];
|
|
37
|
+
if (!webPath) throw new Error('-webPath参数缺少参数值');
|
|
38
|
+
config.webPath = webPath;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
18
42
|
if (!config.webPath) {
|
|
19
43
|
throw new Error('请检查craba.js,必须告诉工具当前项目的前端路径地址,填绝对路径哦');
|
|
20
44
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* apracjs
|
|
3
|
+
* Copyright(c) 2017 by wssf
|
|
4
|
+
* 2017-04-26
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strick'
|
|
8
|
+
var utils = require('./utils.js');
|
|
9
|
+
|
|
10
|
+
class StringBuilder {
|
|
11
|
+
constructor(initialText) {
|
|
12
|
+
this._parts = (typeof (initialText) !== 'undefined' && initialText !== null && initialText !== '') ?
|
|
13
|
+
[initialText.toString()] : [];
|
|
14
|
+
this._value = {};
|
|
15
|
+
this._len = 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
push(text) {
|
|
19
|
+
this.append(text);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
append(text) {
|
|
23
|
+
this._parts[this._parts.length] = text;
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
appendFormat() {
|
|
28
|
+
var text = utils.format.apply(this, arguments);
|
|
29
|
+
this._parts[this._parts.length] = text;
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
appendLine(text) {
|
|
34
|
+
this._parts[this._parts.length] =
|
|
35
|
+
((typeof (text) === 'undefined') || (text === null) || (text === '')) ?
|
|
36
|
+
'\r\n' : text + '\r\n';
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
length() {
|
|
41
|
+
return this.toString(null).length;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
clear() {
|
|
45
|
+
this._parts = [];
|
|
46
|
+
this._value = {};
|
|
47
|
+
this._len = 0;
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
isEmpty() {
|
|
52
|
+
return this._parts.length === 0;
|
|
53
|
+
}
|
|
54
|
+
join(separator) {
|
|
55
|
+
return this.toString(separator);
|
|
56
|
+
}
|
|
57
|
+
toString(separator) {
|
|
58
|
+
separator = separator || '';
|
|
59
|
+
var parts = this._parts;
|
|
60
|
+
if (this._len !== parts.length) {
|
|
61
|
+
this._value = {};
|
|
62
|
+
this._len = parts.length;
|
|
63
|
+
}
|
|
64
|
+
var val = this._value;
|
|
65
|
+
if (typeof (val[separator]) === 'undefined') {
|
|
66
|
+
if (separator !== '') {
|
|
67
|
+
for (var i = 0; i < parts.length;) {
|
|
68
|
+
if ((typeof (parts[i]) === 'undefined') || (parts[i] === '') || (parts[i] === null)) {
|
|
69
|
+
parts.splice(i, 1);
|
|
70
|
+
} else {
|
|
71
|
+
i++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
val[separator] = this._parts.join(separator);
|
|
76
|
+
}
|
|
77
|
+
return val[separator];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
module.exports = StringBuilder;
|
package/lib/utils.js
CHANGED
|
@@ -38,6 +38,35 @@ class Utils {
|
|
|
38
38
|
this.cryptoKey = '$wssf20119@.Z+Q$';
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
format() {
|
|
42
|
+
// 字符串参数化
|
|
43
|
+
var args = new Array(arguments.length);
|
|
44
|
+
for (var i = 0; i < args.length; i++) {
|
|
45
|
+
args[i] = arguments[i];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if ('string' !== typeof args[0]) {
|
|
49
|
+
args.unshift('{0}');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
var text = args[0];
|
|
53
|
+
text = text.replace(/{-?[0-9]+}/g, function(match, format) {
|
|
54
|
+
var intVal = parseInt(match.substring(1, match.length - 1));
|
|
55
|
+
var replace;
|
|
56
|
+
if (intVal >= 0) {
|
|
57
|
+
replace = args[intVal + 1];
|
|
58
|
+
} else if (intVal === -1) {
|
|
59
|
+
replace = "{";
|
|
60
|
+
} else if (intVal === -2) {
|
|
61
|
+
replace = "}";
|
|
62
|
+
} else {
|
|
63
|
+
replace = "";
|
|
64
|
+
}
|
|
65
|
+
return replace;
|
|
66
|
+
});
|
|
67
|
+
return text;
|
|
68
|
+
}
|
|
69
|
+
|
|
41
70
|
getHashCode(str) {
|
|
42
71
|
// 获取字符串的hash值
|
|
43
72
|
var h = 0;
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crabatool",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.25",
|
|
4
4
|
"description": "crabatool",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"start": "node index.js",
|
|
8
|
-
"test": "node ./test/test.js"
|
|
8
|
+
"test": "node ./test/test.js -checkjs -webPath f:\\newcrabadoc\\www"
|
|
9
9
|
},
|
|
10
10
|
"author": "wssf",
|
|
11
11
|
"dependencies": {
|
package/test/checkjs.bat
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
node test.js -checkjs
|
package/test/run.bat
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
node test.js -run
|
package/test/test.js
CHANGED
|
@@ -31,8 +31,10 @@ var config = {
|
|
|
31
31
|
|
|
32
32
|
// 【不是必填】
|
|
33
33
|
// 上一步中打包后的文件是否压缩, true为忽略【不压缩】,false为【要压缩】,各组按需修改
|
|
34
|
-
ignoreCompress: true
|
|
34
|
+
ignoreCompress: true,
|
|
35
35
|
|
|
36
|
+
// 配置js语法检测报告推送地址
|
|
37
|
+
webhooks: 'https://oapi.dingtalk.com/robot/send?access_token=ce27b1b1540881540d44c0bd05ba738d865363758892ede137dc1020bd36bd5a' //'https://oapi.dingtalk.com/robot/send?access_token=37279df60e03ebf25e8eb71230ddb93fe74de99951a8d635d0458e60bfcd44d8'
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
crabaTool.run(config); // 传入配置参数,启动工具
|
package/tool/checkjs.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
var utils = require('../lib/utils.js');
|
|
2
|
+
var StringBuilder = require("../lib/stringBuilder.js");
|
|
2
3
|
var config = require('../lib/config.js');
|
|
3
4
|
var fs = require('fs');
|
|
4
5
|
var ProgressBar = require('./progressbar.js');
|
|
5
6
|
var jschardet = require('iconv-jschardet');
|
|
6
7
|
var path = require('path');
|
|
8
|
+
var axios = require('axios');
|
|
7
9
|
|
|
8
10
|
module.exports.start = function() {
|
|
9
11
|
var jsFiles = utils.getFiles({ source: config.webPath, exts: '.js' });
|
|
@@ -28,7 +30,7 @@ module.exports.start = function() {
|
|
|
28
30
|
var stats = fs.statSync(filePath);
|
|
29
31
|
if (stats.size / 1024 > fileSize) { // 大于300k的js视为大文件
|
|
30
32
|
if (!blackList.includes(path.basename(filePath))) {
|
|
31
|
-
bigList.push(
|
|
33
|
+
bigList.push(`${filePath} ${parseInt(stats.size / 1024)}kb`);
|
|
32
34
|
}
|
|
33
35
|
}
|
|
34
36
|
|
|
@@ -52,42 +54,92 @@ module.exports.start = function() {
|
|
|
52
54
|
|
|
53
55
|
var nreg = new RegExp(dangerousJs.join('|'), 'ig');
|
|
54
56
|
var all = content.matchAll(nreg);
|
|
55
|
-
var
|
|
57
|
+
var list = [];
|
|
56
58
|
var v = all.next()
|
|
57
59
|
while (!v.done) {
|
|
58
|
-
|
|
60
|
+
list.push({ "char": v.value[0], "index": v.value.index });
|
|
59
61
|
v = all.next()
|
|
60
62
|
}
|
|
61
63
|
|
|
62
|
-
errRegList.push({
|
|
64
|
+
errRegList.push({ list: list });
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
});
|
|
66
68
|
pb.clear('检验完成');
|
|
67
69
|
|
|
68
|
-
var
|
|
69
|
-
info
|
|
70
|
-
info.push(
|
|
71
|
-
info.push(
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
//var sb = new StringBuilder();
|
|
71
|
+
var info = new StringBuilder();
|
|
72
|
+
info.push(`# ${config.modName}代码检测报告`);
|
|
73
|
+
info.push("");
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
info.push(`**一共检查${jsFiles.length}个js文件**`);
|
|
77
|
+
info.push("| 类型 | 数量 |");
|
|
78
|
+
info.push("| ----- | ------ |");
|
|
79
|
+
info.push(`| 语法异常文件数 | ${errList.length}个 |`);
|
|
80
|
+
if (notUtf8List.length > 0) info.push(`| 非utf8文件数 | ${notUtf8List.length}个 |`);
|
|
81
|
+
|
|
74
82
|
|
|
75
83
|
if (errList.length > 0) {
|
|
76
|
-
|
|
84
|
+
info.push("");
|
|
85
|
+
info.push('**语法异常文件清单如下**');
|
|
77
86
|
errList.forEach((s, index) => {
|
|
78
87
|
|
|
79
|
-
|
|
88
|
+
info.push(`# ${s}`);
|
|
80
89
|
|
|
81
|
-
var
|
|
82
|
-
|
|
90
|
+
var err = errRegList[index];
|
|
91
|
+
info.push("| 异常字符 | 字符位置 |");
|
|
92
|
+
info.push("| ----- | ------ |");
|
|
93
|
+
err.list.forEach((item) => {
|
|
94
|
+
info.push(`| ${item.char} | ${item.index} |`);
|
|
95
|
+
});
|
|
83
96
|
});
|
|
84
97
|
}
|
|
85
98
|
|
|
86
99
|
if (notUtf8List.length > 0) {
|
|
87
|
-
|
|
100
|
+
info.push("");
|
|
101
|
+
info.push('**非utf8文件清单如下**');
|
|
102
|
+
notUtf8List.forEach((s, index) => {
|
|
103
|
+
info.push(`# ${s}`);
|
|
104
|
+
});
|
|
88
105
|
}
|
|
89
106
|
|
|
90
107
|
if (bigList.length > 0) {
|
|
91
|
-
|
|
108
|
+
info.push("");
|
|
109
|
+
info.push(`**超过${fileSize}kb的文件清单如下**`);
|
|
110
|
+
bigList.forEach((s, index) => {
|
|
111
|
+
info.push(`# ${s}`);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//console.log(info.join('\r\n'));
|
|
116
|
+
|
|
117
|
+
if (!config.webhooks) {
|
|
118
|
+
config.log("::: craba.js里面配置config.webhooks,用于语法检测报告推送地址");
|
|
119
|
+
return;
|
|
92
120
|
}
|
|
121
|
+
|
|
122
|
+
var data = {
|
|
123
|
+
"msgtype": "markdown",
|
|
124
|
+
"markdown": {
|
|
125
|
+
"title": "代码检测报告",
|
|
126
|
+
"text": info.join(' \n')
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
console.log(info.join(' \n'));
|
|
130
|
+
//data.markdown.text = data.markdown.text.replaceAll('\\n', '\n');
|
|
131
|
+
//console.log(data);
|
|
132
|
+
|
|
133
|
+
axios({
|
|
134
|
+
method: 'post',
|
|
135
|
+
url: config.webhooks,
|
|
136
|
+
data: data,
|
|
137
|
+
headers: { 'Content-Type': 'application/json' }
|
|
138
|
+
}).then(function(response) {
|
|
139
|
+
console.log("推送代码检测状态");
|
|
140
|
+
console.log(response.data);
|
|
141
|
+
}).catch(function(error) {
|
|
142
|
+
console.log("推送代码检测失败");
|
|
143
|
+
console.log(error);
|
|
144
|
+
});
|
|
93
145
|
}
|