-
Notifications
You must be signed in to change notification settings - Fork 573
/
utils.ts
78 lines (69 loc) · 2.42 KB
/
utils.ts
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
const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
const ARGUMENT_NAMES = /([^\s,]+)/g;
export function getParamNames(func: () => any): RegExpMatchArray {
const fnStr = func.toString().replace(STRIP_COMMENTS, '');
let result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
if (result === null) {
result = [];
}
return result;
}
/**
* Find methods on a given object
*
* @param {*} obj - object to enumerate on
* @returns {string[]} - method names
*/
export function getMethodNames(obj: object): string[] {
const enumerableOwnKeys: string[] = Object.keys(obj);
const ownKeysOnObjectPrototype = Object.getOwnPropertyNames(Object.getPrototypeOf({}));
// methods on obj itself should be always included
const result = enumerableOwnKeys.filter(k => typeof obj[k] === 'function');
// searching prototype chain for methods
let proto = obj;
do {
proto = Object.getPrototypeOf(proto);
const allOwnKeysOnPrototype: string[] = Object.getOwnPropertyNames(proto);
// get methods from es6 class
allOwnKeysOnPrototype.forEach(k => {
if (typeof obj[k] === 'function' && k !== 'constructor') {
result.push(k);
}
});
}
while (proto && proto !== Object.prototype);
// leave out those methods on Object's prototype
return result.filter(k => {
return ownKeysOnObjectPrototype.indexOf(k) === -1;
});
}
export function isTypeScriptEnvironment(): boolean {
return !!require.extensions['.ts'] || process.env.MIDWAY_TS_MODE === 'true';
}
/**
* safelyGet(['a','b'],{a: {b: 2}}) // => 2
* safelyGet(['a','b'],{c: {b: 2}}) // => undefined
* safelyGet(['a','1'],{a: {"1": 2}}) // => 2
* safelyGet(['a','1'],{a: {b: 2}}) // => undefined
* safelyGet('a.b',{a: {b: 2}}) // => 2
* safelyGet('a.b',{c: {b: 2}}) // => undefined
*/
export function safelyGet(list: string | string[], obj?: object): any {
if (arguments.length === 1) {
return (_obj: object) => safelyGet(list, _obj);
}
if (typeof obj === 'undefined' || typeof obj !== 'object' || obj === null) {
return void 0;
}
const pathArrValue = typeof list === 'string' ? list.split('.') : list;
let willReturn: any = obj;
for (const key of pathArrValue) {
if (typeof willReturn === 'undefined' || willReturn === null) {
return void 0;
} else if (typeof willReturn !== 'object') {
return void 0;
}
willReturn = willReturn[key];
}
return willReturn;
}