/
util.js
131 lines (111 loc) · 2.81 KB
/
util.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
* @file utils
* @author chris<wfsr@foxmail.com>
*/
'use strict';
var merge = require('merge');
var toString = Object.prototype.toString;
var hasOwnProperty = Object.prototype.hasOwnProperty;
/**
* 对象属性拷贝
*
* @param {Object} target 目标对象
* @param {...Object} source 源对象
* @return {Object} 返回目标对象
*/
exports.extend = function (target) {
for (var i = 1; i < arguments.length; i++) {
var src = arguments[i];
if (src == null) {
continue;
}
target = merge.recursive(true, target, src);
}
return target;
};
exports.merge = merge;
/**
* 混合对象
*
* @param {...Object} source 要混合的对象
* @return {Object} 混合后的对象
*/
exports.mix = function () {
var o = Object.create(null);
var src = Array.prototype.slice.call(arguments);
return exports.extend.apply(this, [o].concat(src));
};
/**
* 挑选第一个非空的对象
*
* @param {Objects[]} objs 对象集合
* @return {Object}
*/
exports.pick = function (objs) {
for (var i = 0, obj; obj = objs[i++];) {
if (Object.keys(obj).length > 0) {
return obj;
}
}
return Object.create(null);
};
/**
* Get type of target
*
* @param {*} target target need to get type
* @return {string}
*/
exports.typeOf = function (target) {
return toString.call(target).slice(8, -1).toLowerCase();
};
/**
* Get user's home directory
*
* @param {Object} processObj an object like process
* @return {string}
*/
exports.getHome = function (processObj) {
processObj = processObj || process;
var env = processObj.env;
var home = env.HOME;
var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME;
return {
win32: function () {
return env.USERPROFILE || env.HOMEDRIVE + env.HOMEPATH || home;
},
darwin: function () {
return home || user && ('/Users/' + user);
},
linux: function () {
return home || user && (processObj.getuid() === 0 ? '/root' : '/home/' + user);
}
}[processObj.platform]();
};
/**
* User's home directory
*
* @type {string}
*/
exports.homeDirectory = exports.getHome();
var yaml = require('js-yaml');
var stripJSONComment = require('strip-json-comments');
/**
* Default loader
*
* @param {string} content string to be parsed
* @param {string} path config file path
* @param {?Object} options options for yaml.safeLoad
* @return {Object}
*/
exports.loader = function (content, path, options) {
if (/\.js$/.test(path)) {
return require(path);
}
try {
return yaml.safeLoad(stripJSONComment(content), options || {filename: path, json: true});
}
catch (e) {
e.message = 'Cannot read config file: ' + path + '\nError: ' + e.message;
throw e;
}
};