@x-9lab/xlab 1.0.0-alpha.1
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/LICENSE +21 -0
- package/README.md +182 -0
- package/dist/@config/config.dev.js +13 -0
- package/dist/@config/config.js +25 -0
- package/dist/@config/config.sand.js +10 -0
- package/dist/bin/watch.js +145 -0
- package/dist/bin/xlab +49 -0
- package/dist/business/utils/cookie/1.1.0/clean/index.js +35 -0
- package/dist/business/utils/cookie/1.1.0/clean/js/@tpls/js.tpl +32 -0
- package/dist/business/utils/cookie/1.1.0/clean/js/index.js +30 -0
- package/dist/cluster.js +120 -0
- package/dist/components/assets/index.js +31 -0
- package/dist/components/cache/index.js +9 -0
- package/dist/components/cache/lru.js +75 -0
- package/dist/components/cluster/index.js +40 -0
- package/dist/components/combo/index.js +170 -0
- package/dist/components/common.js +324 -0
- package/dist/components/cron.js +117 -0
- package/dist/components/header/index.js +74 -0
- package/dist/components/header/time.js +37 -0
- package/dist/components/html-processor/index.js +95 -0
- package/dist/components/injection/index.js +83 -0
- package/dist/components/js-processor/index.js +65 -0
- package/dist/components/log.js +112 -0
- package/dist/components/md5/index.js +19 -0
- package/dist/components/mime/index.js +18 -0
- package/dist/components/platform/index.js +103 -0
- package/dist/components/proxy/index.js +62 -0
- package/dist/components/querystring/index.js +60 -0
- package/dist/components/redirect/index.js +79 -0
- package/dist/components/return-code.js +117 -0
- package/dist/components/uuid/index.js +33 -0
- package/dist/components/version/index.js +96 -0
- package/dist/config/getEnv.js +61 -0
- package/dist/config/index.js +137 -0
- package/dist/config/process-custom-config-files.js +67 -0
- package/dist/config/process-def-config-file.js +29 -0
- package/dist/custom.js +44 -0
- package/dist/global.js +67 -0
- package/dist/middleware/@bin/html-filter.js +94 -0
- package/dist/middleware/bad-request.js +36 -0
- package/dist/middleware/combo.js +13 -0
- package/dist/middleware/compress.js +36 -0
- package/dist/middleware/cors.js +66 -0
- package/dist/middleware/fresh-filter.js +63 -0
- package/dist/middleware/handle-pre-dir.js +25 -0
- package/dist/middleware/request-filter.js +144 -0
- package/dist/middleware/service-mark.js +30 -0
- package/dist/middlewares.js +40 -0
- package/dist/package.json +61 -0
- package/dist/router.js +101 -0
- package/dist/server.js +132 -0
- package/package.json +59 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "get", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>get
|
|
8
|
+
});
|
|
9
|
+
const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
|
|
10
|
+
const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
|
|
11
|
+
function _interopRequireDefault(obj) {
|
|
12
|
+
return obj && obj.__esModule ? obj : {
|
|
13
|
+
default: obj
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 资源储存对象
|
|
18
|
+
*/ const ASSETS = {};
|
|
19
|
+
const pagePath = _path.default.resolve(__dirname, "./pages");
|
|
20
|
+
try {
|
|
21
|
+
_fs.default.readdirSync(pagePath).forEach((name)=>{
|
|
22
|
+
ASSETS[name.replace(".html", "")] = _fs.default.readFileSync(`${pagePath}/${name}`, "utf-8");
|
|
23
|
+
});
|
|
24
|
+
} catch (_) {}
|
|
25
|
+
/**
|
|
26
|
+
* 获取资源
|
|
27
|
+
* @param name 资源名称
|
|
28
|
+
* @return 资源
|
|
29
|
+
*/ function get(name) {
|
|
30
|
+
return ASSETS[name] || null;
|
|
31
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
create: ()=>create,
|
|
13
|
+
len: ()=>len
|
|
14
|
+
});
|
|
15
|
+
const _lruCache = /*#__PURE__*/ _interopRequireDefault(require("lru-cache"));
|
|
16
|
+
function _interopRequireDefault(obj) {
|
|
17
|
+
return obj && obj.__esModule ? obj : {
|
|
18
|
+
default: obj
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const maxCache = 100;
|
|
22
|
+
const maxAge = 60 * 60 * 1000;
|
|
23
|
+
const MAX_NUM = 20;
|
|
24
|
+
var NOW_NUM = 0;
|
|
25
|
+
const CACHE_LIST = [];
|
|
26
|
+
/**
|
|
27
|
+
* LRU-CACHE实例缓存对象
|
|
28
|
+
*/ var LRU_CACHES = {};
|
|
29
|
+
/**
|
|
30
|
+
* 初始化缓存实例
|
|
31
|
+
* @param cacheName 缓存名称
|
|
32
|
+
* @param conf 缓存配置
|
|
33
|
+
* @return 缓存实例
|
|
34
|
+
*/ function init(cacheName, conf) {
|
|
35
|
+
if (NOW_NUM >= MAX_NUM) {
|
|
36
|
+
var cache;
|
|
37
|
+
var deadName;
|
|
38
|
+
deadName = CACHE_LIST.shift();
|
|
39
|
+
cache = LRU_CACHES[deadName];
|
|
40
|
+
if (cache) {
|
|
41
|
+
cache.reset();
|
|
42
|
+
cache = null;
|
|
43
|
+
LRU_CACHES[deadName] = null;
|
|
44
|
+
NOW_NUM -= 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
conf = conf || {};
|
|
48
|
+
conf.max = conf.max || maxCache;
|
|
49
|
+
conf.maxAge = conf.maxAge || maxAge;
|
|
50
|
+
LRU_CACHES[cacheName] = new _lruCache.default(conf);
|
|
51
|
+
NOW_NUM += 1;
|
|
52
|
+
CACHE_LIST.push(cacheName);
|
|
53
|
+
return LRU_CACHES[cacheName];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 生成或获取一个缓存实例
|
|
57
|
+
* @param cacheName 实例名称
|
|
58
|
+
* @param conf 缓存配置,仅在生成的时候有效
|
|
59
|
+
* @return 缓存实例
|
|
60
|
+
*/ function create(cacheName, conf) {
|
|
61
|
+
cacheName = cacheName || "DEFAULT";
|
|
62
|
+
if (!LRU_CACHES[cacheName]) {
|
|
63
|
+
if (LRU_CACHES[cacheName] === null) {
|
|
64
|
+
console.log(`${cacheName} 为已被回收的缓存实例,重新生成新实例对象`);
|
|
65
|
+
}
|
|
66
|
+
init(cacheName, conf);
|
|
67
|
+
}
|
|
68
|
+
return LRU_CACHES[cacheName];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 获取当前缓存实例数量
|
|
72
|
+
* @return 缓存数量
|
|
73
|
+
*/ function len() {
|
|
74
|
+
return CACHE_LIST.length;
|
|
75
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get: ()=>get,
|
|
13
|
+
add: ()=>add,
|
|
14
|
+
del: ()=>del
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* 消息注册存储对象
|
|
18
|
+
*/ const MSG_HANDLERS = {};
|
|
19
|
+
/**
|
|
20
|
+
* 获取一个消息处理函数
|
|
21
|
+
* @param cmd 消息名称
|
|
22
|
+
* @return 消息对应处理函数
|
|
23
|
+
*/ function get(cmd) {
|
|
24
|
+
return MSG_HANDLERS[cmd];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 添加一个消息处理函数
|
|
28
|
+
* @param cmd 消息名称
|
|
29
|
+
* @param cb 消息处理函数
|
|
30
|
+
*/ function add(cmd, cb) {
|
|
31
|
+
if (!MSG_HANDLERS[cmd] && cb) {
|
|
32
|
+
MSG_HANDLERS[cmd] = cb;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 删除一个消息处理函数
|
|
37
|
+
* @param {String} cmd 消息名称
|
|
38
|
+
*/ function del(cmd) {
|
|
39
|
+
delete MSG_HANDLERS[cmd];
|
|
40
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "init", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>init
|
|
8
|
+
});
|
|
9
|
+
const _cache = require("../cache");
|
|
10
|
+
const _header = /*#__PURE__*/ _interopRequireWildcard(require("../header"));
|
|
11
|
+
const _mime = require("../mime");
|
|
12
|
+
const _md5 = require("../md5");
|
|
13
|
+
const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
|
|
14
|
+
const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
|
|
15
|
+
function _interopRequireDefault(obj) {
|
|
16
|
+
return obj && obj.__esModule ? obj : {
|
|
17
|
+
default: obj
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
21
|
+
if (typeof WeakMap !== "function") return null;
|
|
22
|
+
var cacheBabelInterop = new WeakMap();
|
|
23
|
+
var cacheNodeInterop = new WeakMap();
|
|
24
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
25
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
26
|
+
})(nodeInterop);
|
|
27
|
+
}
|
|
28
|
+
function _interopRequireWildcard(obj, nodeInterop) {
|
|
29
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
30
|
+
return obj;
|
|
31
|
+
}
|
|
32
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
33
|
+
return {
|
|
34
|
+
default: obj
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
38
|
+
if (cache && cache.has(obj)) {
|
|
39
|
+
return cache.get(obj);
|
|
40
|
+
}
|
|
41
|
+
var newObj = {};
|
|
42
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
43
|
+
for(var key in obj){
|
|
44
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
45
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
46
|
+
if (desc && (desc.get || desc.set)) {
|
|
47
|
+
Object.defineProperty(newObj, key, desc);
|
|
48
|
+
} else {
|
|
49
|
+
newObj[key] = obj[key];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
newObj.default = obj;
|
|
54
|
+
if (cache) {
|
|
55
|
+
cache.set(obj, newObj);
|
|
56
|
+
}
|
|
57
|
+
return newObj;
|
|
58
|
+
}
|
|
59
|
+
var conf;
|
|
60
|
+
// combo 文件缓存时间单位
|
|
61
|
+
// 默认一周
|
|
62
|
+
// @todo 上 cdn 的话需要根据 cdn 的情况调整这个时间
|
|
63
|
+
const COMBO_CACHE_TIME = 1000 * 60 * 60 * 24 * 7;
|
|
64
|
+
// combo 组合缓存
|
|
65
|
+
const comboCache = (0, _cache.local)("JS_CACHE", {
|
|
66
|
+
"maxAge": COMBO_CACHE_TIME,
|
|
67
|
+
"max": 200
|
|
68
|
+
});
|
|
69
|
+
// 单独的文件缓存
|
|
70
|
+
// 因为会存在大量公共组件,且有多个入口,当用户从不同的入口进来时会因为组合问题多次调用文件读取
|
|
71
|
+
// 增加单独缓存用于减少应用启动初期或 dns 回源时的瞬间压力
|
|
72
|
+
const fileCache = (0, _cache.local)("JS_FILE_CACHE", {
|
|
73
|
+
"maxAge": COMBO_CACHE_TIME,
|
|
74
|
+
"max": 500
|
|
75
|
+
});
|
|
76
|
+
var logger;
|
|
77
|
+
// 扩展名对应的 mime 头
|
|
78
|
+
const extMap = {};
|
|
79
|
+
Object.keys(_mime.MIME).forEach((ext)=>{
|
|
80
|
+
extMap["." + ext] = _mime.MIME[ext];
|
|
81
|
+
});
|
|
82
|
+
// 处理合并请求,合并请求以两个问号开头
|
|
83
|
+
// 请求示例:http://127.0.0.1:5000/??page-manager/1.0.0/page-manager.js,router/1.0.0/router.js,event/1.0.0/event.js,mobile/1.0.0/message/message.js,envi/1.0.0/envi.js,underscore/1.5.2/underscore.js
|
|
84
|
+
async function handle(ctx, next) {
|
|
85
|
+
let parsedUrl = ctx.url;
|
|
86
|
+
let search = ctx.query;
|
|
87
|
+
// combo 请求对应的缓存 key
|
|
88
|
+
let cacheKey;
|
|
89
|
+
// combo 返回内入
|
|
90
|
+
let content;
|
|
91
|
+
// 如果不是合并请求,则不进行处理,交给下一步
|
|
92
|
+
if (!search || parsedUrl.indexOf("??") < 0) {
|
|
93
|
+
await next();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
let filesStr = Object.keys(search)[0].substr(1);
|
|
97
|
+
// 设置文件类型,以便正确返回
|
|
98
|
+
if (filesStr.indexOf(".js") > -1) {
|
|
99
|
+
ctx.set("Content-Type", extMap[".js"]);
|
|
100
|
+
} else {
|
|
101
|
+
for(let ext in extMap){
|
|
102
|
+
if (filesStr.indexOf(ext) > -1) {
|
|
103
|
+
ctx.set("Content-Type", extMap[ext]);
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// 生成缓存 key
|
|
109
|
+
cacheKey = (0, _md5.md5)(filesStr);
|
|
110
|
+
// 检查是否有缓存
|
|
111
|
+
content = comboCache.get(cacheKey);
|
|
112
|
+
// 没有缓存内容,需要读取并且拼接
|
|
113
|
+
if (!content) {
|
|
114
|
+
// 按照逗号拆分成模块 uri
|
|
115
|
+
let uris = filesStr.split(",");
|
|
116
|
+
uris = uris.map((uri)=>{
|
|
117
|
+
let searchIndex = uri.indexOf("?");
|
|
118
|
+
if (searchIndex > -1) {
|
|
119
|
+
uri = uri.substring(0, searchIndex);
|
|
120
|
+
}
|
|
121
|
+
return uri;
|
|
122
|
+
});
|
|
123
|
+
// 根据 uri 查找文件并拼合
|
|
124
|
+
var files = [];
|
|
125
|
+
// 读取相关文件
|
|
126
|
+
uris.forEach((uri)=>{
|
|
127
|
+
// 优先从文件缓存中读
|
|
128
|
+
let file = fileCache.get(uri);
|
|
129
|
+
if (file) {
|
|
130
|
+
files.push(file);
|
|
131
|
+
} else {
|
|
132
|
+
try {
|
|
133
|
+
file = _fs.default.readFileSync(_path.default.resolve(conf.root, "c", uri), "utf8");
|
|
134
|
+
} catch (e) {
|
|
135
|
+
logger.error("READ COMBO FILE ERROR", uri, e);
|
|
136
|
+
}
|
|
137
|
+
if (file) {
|
|
138
|
+
files.push(file);
|
|
139
|
+
fileCache.set(uri, file);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
// 合并文件
|
|
144
|
+
content = files.join("\n");
|
|
145
|
+
// 设置缓存
|
|
146
|
+
comboCache.set(cacheKey, content);
|
|
147
|
+
} else {
|
|
148
|
+
ctx.set("Hit-Combo", cacheKey);
|
|
149
|
+
}
|
|
150
|
+
// 无法正确读取文件
|
|
151
|
+
// 交给后续的 404 处理
|
|
152
|
+
if (content === undefined || content === null) {
|
|
153
|
+
await next();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (conf.enableComboCache) {
|
|
157
|
+
// 生产环境默认开启缓存
|
|
158
|
+
// 缓存时间固定为 6 天
|
|
159
|
+
_header.cacheControl("6d", ctx);
|
|
160
|
+
_header.expire("6d", ctx);
|
|
161
|
+
_header.lastModified(null, ctx);
|
|
162
|
+
}
|
|
163
|
+
// 返回数据
|
|
164
|
+
ctx.body = content;
|
|
165
|
+
}
|
|
166
|
+
function init() {
|
|
167
|
+
conf = getSysConfig();
|
|
168
|
+
logger = log.getLogger("common");
|
|
169
|
+
return handle;
|
|
170
|
+
}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
asciiTobase64: ()=>asciiTobase64,
|
|
13
|
+
base64Toascii: ()=>base64Toascii,
|
|
14
|
+
params: ()=>params,
|
|
15
|
+
numberFormat: ()=>numberFormat,
|
|
16
|
+
labelReplace: ()=>labelReplace,
|
|
17
|
+
fix0: ()=>fix0,
|
|
18
|
+
date: ()=>date,
|
|
19
|
+
responseResult: ()=>responseResult,
|
|
20
|
+
getMD5: ()=>getMD5,
|
|
21
|
+
object2Array: ()=>object2Array,
|
|
22
|
+
defPromiseHandler: ()=>defPromiseHandler,
|
|
23
|
+
promiseWapper: ()=>promiseWapper,
|
|
24
|
+
requestWapper: ()=>requestWapper,
|
|
25
|
+
formatJson: ()=>formatJson,
|
|
26
|
+
toJsonp: ()=>toJsonp,
|
|
27
|
+
walk: ()=>walk,
|
|
28
|
+
checkFileStat: ()=>checkFileStat,
|
|
29
|
+
getRealDefaultMod: ()=>getRealDefaultMod
|
|
30
|
+
});
|
|
31
|
+
const _returnCode = require("./return-code");
|
|
32
|
+
const _querystring = /*#__PURE__*/ _interopRequireDefault(require("querystring"));
|
|
33
|
+
const _request = /*#__PURE__*/ _interopRequireDefault(require("request"));
|
|
34
|
+
const _crypto = /*#__PURE__*/ _interopRequireDefault(require("crypto"));
|
|
35
|
+
const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
|
|
36
|
+
const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
|
|
37
|
+
function _interopRequireDefault(obj) {
|
|
38
|
+
return obj && obj.__esModule ? obj : {
|
|
39
|
+
default: obj
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
var logger;
|
|
43
|
+
/**
|
|
44
|
+
* ascii字符串转为base64字符串
|
|
45
|
+
* @param str 要转化的字符串
|
|
46
|
+
* @return 转化后的字符串
|
|
47
|
+
*/ function asciiTobase64(str) {
|
|
48
|
+
if (typeof str === "string") {
|
|
49
|
+
return new Buffer(str).toString("base64");
|
|
50
|
+
}
|
|
51
|
+
return "";
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* base64字符串转为ascii字符串
|
|
55
|
+
* @param str 要转化的字符串
|
|
56
|
+
* @return 转化后的字符串
|
|
57
|
+
*/ function base64Toascii(str) {
|
|
58
|
+
if (typeof str === "string") {
|
|
59
|
+
return new Buffer(str, "base64").toString();
|
|
60
|
+
}
|
|
61
|
+
return "";
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 序列化请求参数
|
|
65
|
+
* @param dat 请求参数对象
|
|
66
|
+
* @param url 要附加请求参数的URL
|
|
67
|
+
* @return 序列化完的参数
|
|
68
|
+
*/ function params(dat, url) {
|
|
69
|
+
var data = dat ? _querystring.default.stringify(dat) : "";
|
|
70
|
+
if (typeof url === "string") {
|
|
71
|
+
data = data ? url + "?" + data : url;
|
|
72
|
+
}
|
|
73
|
+
return data;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 按位数格式化数字
|
|
77
|
+
* @param val 要格式化的数字
|
|
78
|
+
* @param separator 分割符
|
|
79
|
+
* @param size 分割位数间隔
|
|
80
|
+
* @return 格式化完的字符串
|
|
81
|
+
*/ function numberFormat(val, separator, size) {
|
|
82
|
+
if (typeof val !== "number") {
|
|
83
|
+
return "0";
|
|
84
|
+
}
|
|
85
|
+
if (!separator) {
|
|
86
|
+
separator = ",";
|
|
87
|
+
}
|
|
88
|
+
if (!size) {
|
|
89
|
+
size = 3;
|
|
90
|
+
}
|
|
91
|
+
var last = size;
|
|
92
|
+
const valStr = val.toString();
|
|
93
|
+
var pos = valStr.indexOf(".");
|
|
94
|
+
var res = "";
|
|
95
|
+
if (pos === -1) {
|
|
96
|
+
pos = valStr.length;
|
|
97
|
+
} else {
|
|
98
|
+
res = valStr.substr(pos);
|
|
99
|
+
}
|
|
100
|
+
if (valStr.charAt(0) === "-") {
|
|
101
|
+
last++;
|
|
102
|
+
}
|
|
103
|
+
while(pos > last){
|
|
104
|
+
pos -= size;
|
|
105
|
+
res = separator + valStr.substr(pos, size) + res;
|
|
106
|
+
}
|
|
107
|
+
if (pos) {
|
|
108
|
+
res = valStr.substr(0, pos) + res;
|
|
109
|
+
}
|
|
110
|
+
return res;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 带花括号标签检测正则
|
|
114
|
+
*/ const labelReplaceExp = /\{(\w+)\}/g;
|
|
115
|
+
/**
|
|
116
|
+
* 批量替换字符串中带花括号标签为指定数据
|
|
117
|
+
* @param tpl 待处理的字符串
|
|
118
|
+
* @param data 替换数据
|
|
119
|
+
* @return 替换后端字符串
|
|
120
|
+
*/ function labelReplace(tpl, data) {
|
|
121
|
+
return tpl.replace(labelReplaceExp, function(label, key) {
|
|
122
|
+
return typeof data === "object" ? data[key] : data;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 格式化数字, 自动补0前续
|
|
127
|
+
* @param number 要格式化的数字
|
|
128
|
+
* @param size 格式化后出来的数字位数
|
|
129
|
+
* @return 格式化结果
|
|
130
|
+
*/ function fix0(number, size) {
|
|
131
|
+
var num = number.toString();
|
|
132
|
+
while(num.length < size){
|
|
133
|
+
num = "0" + num;
|
|
134
|
+
}
|
|
135
|
+
return num;
|
|
136
|
+
}
|
|
137
|
+
const format_exp = /[YymndjNwaAghGHis]/g;
|
|
138
|
+
/**
|
|
139
|
+
* 格式化时间
|
|
140
|
+
* @param format 日期格式
|
|
141
|
+
* @param date 日期数据(时间戳, 字符串)
|
|
142
|
+
* @return 格式化后的时间
|
|
143
|
+
*/ function date(format, ts) {
|
|
144
|
+
ts = new Date(ts);
|
|
145
|
+
return format.replace(format_exp, function(tag) {
|
|
146
|
+
switch(tag){
|
|
147
|
+
case "Y":
|
|
148
|
+
return ts.getFullYear();
|
|
149
|
+
case "y":
|
|
150
|
+
return ts.getFullYear() % 100;
|
|
151
|
+
case "m":
|
|
152
|
+
return fix0(ts.getMonth() + 1, 2);
|
|
153
|
+
case "n":
|
|
154
|
+
return ts.getMonth() + 1;
|
|
155
|
+
case "d":
|
|
156
|
+
return fix0(ts.getDate(), 2);
|
|
157
|
+
case "j":
|
|
158
|
+
return ts.getDate();
|
|
159
|
+
case "N":
|
|
160
|
+
return ts.getDay();
|
|
161
|
+
case "w":
|
|
162
|
+
return ts.getDay() % 7;
|
|
163
|
+
case "a":
|
|
164
|
+
return ts.getHours() < 12 ? "am" : "pm";
|
|
165
|
+
case "A":
|
|
166
|
+
return ts.getHours() < 12 ? "AM" : "PM";
|
|
167
|
+
case "g":
|
|
168
|
+
return ts.getHours() % 12 + 1;
|
|
169
|
+
case "h":
|
|
170
|
+
return fix0(ts.getHours() % 12 + 1, 2);
|
|
171
|
+
case "G":
|
|
172
|
+
return ts.getHours();
|
|
173
|
+
case "H":
|
|
174
|
+
return fix0(ts.getHours(), 2);
|
|
175
|
+
case "i":
|
|
176
|
+
return fix0(ts.getMinutes(), 2);
|
|
177
|
+
case "s":
|
|
178
|
+
return fix0(ts.getSeconds(), 2);
|
|
179
|
+
}
|
|
180
|
+
return tag;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 生成操作结果数据对象
|
|
185
|
+
* @param status 布尔,操作结果
|
|
186
|
+
* @param result 返回的数据,数据格式根据具体模块而定
|
|
187
|
+
* @param msg 返回的提示性信息
|
|
188
|
+
* @return 数据对象
|
|
189
|
+
*/ function responseResult(status, result, msg) {
|
|
190
|
+
var code = (0, _returnCode.getReturnCode)(status);
|
|
191
|
+
var dat = {
|
|
192
|
+
"success": code.errorcode === 0,
|
|
193
|
+
"code": code.errorcode,
|
|
194
|
+
"msg": msg || code.msg
|
|
195
|
+
};
|
|
196
|
+
dat.result = result || null;
|
|
197
|
+
return dat;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* 根据传入的参数生成一个 MD5 值
|
|
201
|
+
*/ function getMD5(...args) {
|
|
202
|
+
const conditions = {};
|
|
203
|
+
args.forEach(function(item, index) {
|
|
204
|
+
conditions[index] = item;
|
|
205
|
+
});
|
|
206
|
+
return _crypto.default.createHash("md5").update(JSON.stringify(conditions), "utf8").digest("hex");
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* 对象值转化为数组
|
|
210
|
+
* @param obj 待转的对象
|
|
211
|
+
* @return 转化后的数组
|
|
212
|
+
*/ function object2Array(obj) {
|
|
213
|
+
var arr = [];
|
|
214
|
+
Object.keys(obj).forEach(function(key) {
|
|
215
|
+
arr.push(obj[key]);
|
|
216
|
+
});
|
|
217
|
+
return arr;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* 默认 Promise 处理函数
|
|
221
|
+
* @param resolve Promise 成功处理函数
|
|
222
|
+
* @param reject Promise 异常处理函数
|
|
223
|
+
*/ function defPromiseHandler(resolve, reject) {
|
|
224
|
+
return function(err, re) {
|
|
225
|
+
if (err) {
|
|
226
|
+
console.error(err);
|
|
227
|
+
reject(err);
|
|
228
|
+
} else if (re) {
|
|
229
|
+
resolve(re);
|
|
230
|
+
} else {
|
|
231
|
+
reject("No result.");
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**Promise 包装函数 */ function promiseWapper(...args) {
|
|
236
|
+
var handler = args.pop();
|
|
237
|
+
handler = handler;
|
|
238
|
+
var p = new Promise(handler);
|
|
239
|
+
return p;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* 封装一个 promise 形式的 request 方法
|
|
243
|
+
*/ function requestWapper(...args) {
|
|
244
|
+
return new Promise(function(resolve, reject) {
|
|
245
|
+
args.push(function(err, res, body) {
|
|
246
|
+
if (err) {
|
|
247
|
+
reject(err);
|
|
248
|
+
} else {
|
|
249
|
+
resolve(body);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
_request.default.apply(_request.default, args);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* 格式化 JSON 数据
|
|
257
|
+
* @param data 原始数据字符串
|
|
258
|
+
* @return 格式化后的数据
|
|
259
|
+
*/ function formatJson(data) {
|
|
260
|
+
var re;
|
|
261
|
+
try {
|
|
262
|
+
re = JSON.parse(data);
|
|
263
|
+
} catch (err) {
|
|
264
|
+
if (!logger) {
|
|
265
|
+
log.getLogger("common");
|
|
266
|
+
}
|
|
267
|
+
logger.error("Pares create menu return data fail.", data);
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
return re;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* 输出 sjonp 格式
|
|
274
|
+
* @param data 待处理数据
|
|
275
|
+
* @param jsonp jsonp 回调函数名称
|
|
276
|
+
* @return 当是 jsonp 格式时返回 String, 不是时返回原始数据
|
|
277
|
+
*/ function toJsonp(data, jsonp) {
|
|
278
|
+
return jsonp ? jsonp + "(" + JSON.stringify(data) + ")" : data;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 递归处理文件夹
|
|
282
|
+
* @param path 文件目录
|
|
283
|
+
* @param floor 层级
|
|
284
|
+
* @param callback 查找到文件时的处理函数
|
|
285
|
+
*/ function walk(path, floor, callback) {
|
|
286
|
+
floor++;
|
|
287
|
+
var files = _fs.default.readdirSync(path);
|
|
288
|
+
files.forEach(function(item) {
|
|
289
|
+
if (!item.startsWith(".") && !item.endsWith(".d.ts")) {
|
|
290
|
+
var tmpPath = path + "/" + item;
|
|
291
|
+
var stats = _fs.default.statSync(tmpPath);
|
|
292
|
+
if (stats.isDirectory() && item.indexOf("@") === -1) {
|
|
293
|
+
walk(tmpPath, floor, callback);
|
|
294
|
+
} else if (!stats.isDirectory()) {
|
|
295
|
+
callback(tmpPath, item);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* 检测指定文件是否存在
|
|
302
|
+
* @param pathStr 文件路径
|
|
303
|
+
* @param resolve 是否使用 path 模块重新处理路径
|
|
304
|
+
* @return 文件信息,文件不存在为 null
|
|
305
|
+
*/ function checkFileStat(pathStr, resolve) {
|
|
306
|
+
if (resolve) {
|
|
307
|
+
pathStr = _path.default.resolve(__dirname, pathStr);
|
|
308
|
+
}
|
|
309
|
+
var stat;
|
|
310
|
+
try {
|
|
311
|
+
stat = _fs.default.statSync(pathStr);
|
|
312
|
+
} catch (e) {
|
|
313
|
+
stat = null;
|
|
314
|
+
}
|
|
315
|
+
return stat;
|
|
316
|
+
}
|
|
317
|
+
/**获取真正可执行的模块 */ function getRealDefaultMod(mod) {
|
|
318
|
+
if (mod) {
|
|
319
|
+
if (mod.__esModule && mod.default || mod.default) {
|
|
320
|
+
return mod.default;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return mod;
|
|
324
|
+
}
|