You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
421 lines
11 KiB
421 lines
11 KiB
"use strict"; |
|
var es5 = require("./es5"); |
|
var canEvaluate = typeof navigator == "undefined"; |
|
|
|
var errorObj = {e: {}}; |
|
var tryCatchTarget; |
|
var globalObject = typeof self !== "undefined" ? self : |
|
typeof window !== "undefined" ? window : |
|
typeof global !== "undefined" ? global : |
|
this !== undefined ? this : null; |
|
|
|
function tryCatcher() { |
|
try { |
|
var target = tryCatchTarget; |
|
tryCatchTarget = null; |
|
return target.apply(this, arguments); |
|
} catch (e) { |
|
errorObj.e = e; |
|
return errorObj; |
|
} |
|
} |
|
function tryCatch(fn) { |
|
tryCatchTarget = fn; |
|
return tryCatcher; |
|
} |
|
|
|
var inherits = function(Child, Parent) { |
|
var hasProp = {}.hasOwnProperty; |
|
|
|
function T() { |
|
this.constructor = Child; |
|
this.constructor$ = Parent; |
|
for (var propertyName in Parent.prototype) { |
|
if (hasProp.call(Parent.prototype, propertyName) && |
|
propertyName.charAt(propertyName.length-1) !== "$" |
|
) { |
|
this[propertyName + "$"] = Parent.prototype[propertyName]; |
|
} |
|
} |
|
} |
|
T.prototype = Parent.prototype; |
|
Child.prototype = new T(); |
|
return Child.prototype; |
|
}; |
|
|
|
|
|
function isPrimitive(val) { |
|
return val == null || val === true || val === false || |
|
typeof val === "string" || typeof val === "number"; |
|
|
|
} |
|
|
|
function isObject(value) { |
|
return typeof value === "function" || |
|
typeof value === "object" && value !== null; |
|
} |
|
|
|
function maybeWrapAsError(maybeError) { |
|
if (!isPrimitive(maybeError)) return maybeError; |
|
|
|
return new Error(safeToString(maybeError)); |
|
} |
|
|
|
function withAppended(target, appendee) { |
|
var len = target.length; |
|
var ret = new Array(len + 1); |
|
var i; |
|
for (i = 0; i < len; ++i) { |
|
ret[i] = target[i]; |
|
} |
|
ret[i] = appendee; |
|
return ret; |
|
} |
|
|
|
function getDataPropertyOrDefault(obj, key, defaultValue) { |
|
if (es5.isES5) { |
|
var desc = Object.getOwnPropertyDescriptor(obj, key); |
|
|
|
if (desc != null) { |
|
return desc.get == null && desc.set == null |
|
? desc.value |
|
: defaultValue; |
|
} |
|
} else { |
|
return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined; |
|
} |
|
} |
|
|
|
function notEnumerableProp(obj, name, value) { |
|
if (isPrimitive(obj)) return obj; |
|
var descriptor = { |
|
value: value, |
|
configurable: true, |
|
enumerable: false, |
|
writable: true |
|
}; |
|
es5.defineProperty(obj, name, descriptor); |
|
return obj; |
|
} |
|
|
|
function thrower(r) { |
|
throw r; |
|
} |
|
|
|
var inheritedDataKeys = (function() { |
|
var excludedPrototypes = [ |
|
Array.prototype, |
|
Object.prototype, |
|
Function.prototype |
|
]; |
|
|
|
var isExcludedProto = function(val) { |
|
for (var i = 0; i < excludedPrototypes.length; ++i) { |
|
if (excludedPrototypes[i] === val) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
}; |
|
|
|
if (es5.isES5) { |
|
var getKeys = Object.getOwnPropertyNames; |
|
return function(obj) { |
|
var ret = []; |
|
var visitedKeys = Object.create(null); |
|
while (obj != null && !isExcludedProto(obj)) { |
|
var keys; |
|
try { |
|
keys = getKeys(obj); |
|
} catch (e) { |
|
return ret; |
|
} |
|
for (var i = 0; i < keys.length; ++i) { |
|
var key = keys[i]; |
|
if (visitedKeys[key]) continue; |
|
visitedKeys[key] = true; |
|
var desc = Object.getOwnPropertyDescriptor(obj, key); |
|
if (desc != null && desc.get == null && desc.set == null) { |
|
ret.push(key); |
|
} |
|
} |
|
obj = es5.getPrototypeOf(obj); |
|
} |
|
return ret; |
|
}; |
|
} else { |
|
var hasProp = {}.hasOwnProperty; |
|
return function(obj) { |
|
if (isExcludedProto(obj)) return []; |
|
var ret = []; |
|
|
|
/*jshint forin:false */ |
|
enumeration: for (var key in obj) { |
|
if (hasProp.call(obj, key)) { |
|
ret.push(key); |
|
} else { |
|
for (var i = 0; i < excludedPrototypes.length; ++i) { |
|
if (hasProp.call(excludedPrototypes[i], key)) { |
|
continue enumeration; |
|
} |
|
} |
|
ret.push(key); |
|
} |
|
} |
|
return ret; |
|
}; |
|
} |
|
|
|
})(); |
|
|
|
var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/; |
|
function isClass(fn) { |
|
try { |
|
if (typeof fn === "function") { |
|
var keys = es5.names(fn.prototype); |
|
|
|
var hasMethods = es5.isES5 && keys.length > 1; |
|
var hasMethodsOtherThanConstructor = keys.length > 0 && |
|
!(keys.length === 1 && keys[0] === "constructor"); |
|
var hasThisAssignmentAndStaticMethods = |
|
thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0; |
|
|
|
if (hasMethods || hasMethodsOtherThanConstructor || |
|
hasThisAssignmentAndStaticMethods) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
} catch (e) { |
|
return false; |
|
} |
|
} |
|
|
|
function toFastProperties(obj) { |
|
/*jshint -W027,-W055,-W031*/ |
|
function FakeConstructor() {} |
|
FakeConstructor.prototype = obj; |
|
var receiver = new FakeConstructor(); |
|
function ic() { |
|
return typeof receiver.foo; |
|
} |
|
ic(); |
|
ic(); |
|
return obj; |
|
eval(obj); |
|
} |
|
|
|
var rident = /^[a-z$_][a-z$_0-9]*$/i; |
|
function isIdentifier(str) { |
|
return rident.test(str); |
|
} |
|
|
|
function filledRange(count, prefix, suffix) { |
|
var ret = new Array(count); |
|
for(var i = 0; i < count; ++i) { |
|
ret[i] = prefix + i + suffix; |
|
} |
|
return ret; |
|
} |
|
|
|
function safeToString(obj) { |
|
try { |
|
return obj + ""; |
|
} catch (e) { |
|
return "[no string representation]"; |
|
} |
|
} |
|
|
|
function isError(obj) { |
|
return obj instanceof Error || |
|
(obj !== null && |
|
typeof obj === "object" && |
|
typeof obj.message === "string" && |
|
typeof obj.name === "string"); |
|
} |
|
|
|
function markAsOriginatingFromRejection(e) { |
|
try { |
|
notEnumerableProp(e, "isOperational", true); |
|
} |
|
catch(ignore) {} |
|
} |
|
|
|
function originatesFromRejection(e) { |
|
if (e == null) return false; |
|
return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) || |
|
e["isOperational"] === true); |
|
} |
|
|
|
function canAttachTrace(obj) { |
|
return isError(obj) && es5.propertyIsWritable(obj, "stack"); |
|
} |
|
|
|
var ensureErrorObject = (function() { |
|
if (!("stack" in new Error())) { |
|
return function(value) { |
|
if (canAttachTrace(value)) return value; |
|
try {throw new Error(safeToString(value));} |
|
catch(err) {return err;} |
|
}; |
|
} else { |
|
return function(value) { |
|
if (canAttachTrace(value)) return value; |
|
return new Error(safeToString(value)); |
|
}; |
|
} |
|
})(); |
|
|
|
function classString(obj) { |
|
return {}.toString.call(obj); |
|
} |
|
|
|
function copyDescriptors(from, to, filter) { |
|
var keys = es5.names(from); |
|
for (var i = 0; i < keys.length; ++i) { |
|
var key = keys[i]; |
|
if (filter(key)) { |
|
try { |
|
es5.defineProperty(to, key, es5.getDescriptor(from, key)); |
|
} catch (ignore) {} |
|
} |
|
} |
|
} |
|
|
|
var asArray = function(v) { |
|
if (es5.isArray(v)) { |
|
return v; |
|
} |
|
return null; |
|
}; |
|
|
|
if (typeof Symbol !== "undefined" && Symbol.iterator) { |
|
var ArrayFrom = typeof Array.from === "function" ? function(v) { |
|
return Array.from(v); |
|
} : function(v) { |
|
var ret = []; |
|
var it = v[Symbol.iterator](); |
|
var itResult; |
|
while (!((itResult = it.next()).done)) { |
|
ret.push(itResult.value); |
|
} |
|
return ret; |
|
}; |
|
|
|
asArray = function(v) { |
|
if (es5.isArray(v)) { |
|
return v; |
|
} else if (v != null && typeof v[Symbol.iterator] === "function") { |
|
return ArrayFrom(v); |
|
} |
|
return null; |
|
}; |
|
} |
|
|
|
var isNode = typeof process !== "undefined" && |
|
classString(process).toLowerCase() === "[object process]"; |
|
|
|
var hasEnvVariables = typeof process !== "undefined" && |
|
typeof process.env !== "undefined"; |
|
|
|
function env(key) { |
|
return hasEnvVariables ? process.env[key] : undefined; |
|
} |
|
|
|
function getNativePromise() { |
|
if (typeof Promise === "function") { |
|
try { |
|
var promise = new Promise(function(){}); |
|
if (classString(promise) === "[object Promise]") { |
|
return Promise; |
|
} |
|
} catch (e) {} |
|
} |
|
} |
|
|
|
var reflectHandler; |
|
function contextBind(ctx, cb) { |
|
if (ctx === null || |
|
typeof cb !== "function" || |
|
cb === reflectHandler) { |
|
return cb; |
|
} |
|
|
|
if (ctx.domain !== null) { |
|
cb = ctx.domain.bind(cb); |
|
} |
|
|
|
var async = ctx.async; |
|
if (async !== null) { |
|
var old = cb; |
|
cb = function() { |
|
var $_len = arguments.length + 2;var args = new Array($_len); for(var $_i = 2; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i - 2];}; |
|
args[0] = old; |
|
args[1] = this; |
|
return async.runInAsyncScope.apply(async, args); |
|
}; |
|
} |
|
return cb; |
|
} |
|
|
|
var ret = { |
|
setReflectHandler: function(fn) { |
|
reflectHandler = fn; |
|
}, |
|
isClass: isClass, |
|
isIdentifier: isIdentifier, |
|
inheritedDataKeys: inheritedDataKeys, |
|
getDataPropertyOrDefault: getDataPropertyOrDefault, |
|
thrower: thrower, |
|
isArray: es5.isArray, |
|
asArray: asArray, |
|
notEnumerableProp: notEnumerableProp, |
|
isPrimitive: isPrimitive, |
|
isObject: isObject, |
|
isError: isError, |
|
canEvaluate: canEvaluate, |
|
errorObj: errorObj, |
|
tryCatch: tryCatch, |
|
inherits: inherits, |
|
withAppended: withAppended, |
|
maybeWrapAsError: maybeWrapAsError, |
|
toFastProperties: toFastProperties, |
|
filledRange: filledRange, |
|
toString: safeToString, |
|
canAttachTrace: canAttachTrace, |
|
ensureErrorObject: ensureErrorObject, |
|
originatesFromRejection: originatesFromRejection, |
|
markAsOriginatingFromRejection: markAsOriginatingFromRejection, |
|
classString: classString, |
|
copyDescriptors: copyDescriptors, |
|
isNode: isNode, |
|
hasEnvVariables: hasEnvVariables, |
|
env: env, |
|
global: globalObject, |
|
getNativePromise: getNativePromise, |
|
contextBind: contextBind |
|
}; |
|
ret.isRecentNode = ret.isNode && (function() { |
|
var version; |
|
if (process.versions && process.versions.node) { |
|
version = process.versions.node.split(".").map(Number); |
|
} else if (process.version) { |
|
version = process.version.split(".").map(Number); |
|
} |
|
return (version[0] === 0 && version[1] > 10) || (version[0] > 0); |
|
})(); |
|
ret.nodeSupportsAsyncResource = ret.isNode && (function() { |
|
var supportsAsync = false; |
|
try { |
|
var res = require("async_hooks").AsyncResource; |
|
supportsAsync = typeof res.prototype.runInAsyncScope === "function"; |
|
} catch (e) { |
|
supportsAsync = false; |
|
} |
|
return supportsAsync; |
|
})(); |
|
|
|
if (ret.isNode) ret.toFastProperties(process); |
|
|
|
try {throw new Error(); } catch (e) {ret.lastLineError = e;} |
|
module.exports = ret;
|
|
|