-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
80 lines (65 loc) · 2.79 KB
/
index.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
'use strict';
var extension = require('es5-ext'),
assign = extension.object.assign,
keys = extension.object.keys,
capitalize = extension.string['#'].capitalize,
objectFilter = extension.object.filter;
var es5ExtProperties = ['array', 'boolean', 'date', 'error', 'function', 'math', 'number', 'object', 'regExp', 'string'];
var extend = function(staticMethods, instanceMethods, defaultNativeObjectKey) {
var availableMethods = keys(staticMethods || {}).concat(keys(instanceMethods) || {});
return function(nativeObject, methods, descriptorOptions) {
var listOfMethods = availableMethods,
globalObject = this;
if (typeof nativeObject === 'undefined') {
nativeObject = globalObject[defaultNativeObjectKey];
}
if (Array.isArray(nativeObject)) {
descriptorOptions = methods;
methods = nativeObject;
nativeObject = globalObject[defaultNativeObjectKey];
}
if (!Array.isArray(methods)) {
descriptorOptions = methods;
methods = undefined;
}
descriptorOptions = assign({
writable: false,
enumerable: false,
configurable: false
}, descriptorOptions || {});
if (methods && methods.length) {
listOfMethods = listOfMethods.filter(function(name) {
return methods.indexOf(name) !== -1;
});
}
listOfMethods.forEach(function(methodName) {
if (methodName in staticMethods) {
descriptorOptions.value = staticMethods[methodName];
Object.defineProperty(nativeObject, methodName, descriptorOptions);
}
if (methodName in instanceMethods) {
descriptorOptions.value = instanceMethods[methodName];
Object.defineProperty(nativeObject.prototype, methodName, descriptorOptions);
}
});
};
},
extractStaticMethods = function(object) {
return objectFilter(object, function(value, key) {
return key !== '#';
}) || {};
},
extractInstanceMethods = function(object) {
return object['#'] || {};
};
var extendAll = module.exports = function(methods, customDescriptor) {
var args = [undefined, methods, customDescriptor];
es5ExtProperties.forEach(function(key) {
extendAll[key].apply(this, args);
}, this);
};
es5ExtProperties.forEach(function(key) {
var methods = extension[key],
nativeObjectName = capitalize.call(key);
extendAll[key] = extend(extractStaticMethods(methods), extractInstanceMethods(methods), nativeObjectName);
});