Skip to content
Snippets Groups Projects
index.js 8.81 MiB
Newer Older
  • Learn to ignore specific revisions
  •     if (async.haveItemsQueued() && !config.longStackTraces) {
            throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
        }
        if (!config.longStackTraces && longStackTracesIsSupported()) {
            var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
            var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
            var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
            config.longStackTraces = true;
            disableLongStackTraces = function() {
                if (async.haveItemsQueued() && !config.longStackTraces) {
                    throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
                }
                Promise.prototype._captureStackTrace = Promise_captureStackTrace;
                Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
                Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
                Context.deactivateLongStackTraces();
                config.longStackTraces = false;
            };
            Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
            Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
            Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
            Context.activateLongStackTraces();
        }
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    Promise.hasLongStackTraces = function () {
        return config.longStackTraces && longStackTracesIsSupported();
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    
    var legacyHandlers = {
        unhandledrejection: {
            before: function() {
                var ret = util.global.onunhandledrejection;
                util.global.onunhandledrejection = null;
                return ret;
            },
            after: function(fn) {
                util.global.onunhandledrejection = fn;
            }
        },
        rejectionhandled: {
            before: function() {
                var ret = util.global.onrejectionhandled;
                util.global.onrejectionhandled = null;
                return ret;
            },
            after: function(fn) {
                util.global.onrejectionhandled = fn;
            }
        }
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    var fireDomEvent = (function() {
        var dispatch = function(legacy, e) {
            if (legacy) {
                var fn;
                try {
                    fn = legacy.before();
                    return !util.global.dispatchEvent(e);
                } finally {
                    legacy.after(fn);
                }
            } else {
                return !util.global.dispatchEvent(e);
            }
        };
        try {
            if (typeof CustomEvent === "function") {
                var event = new CustomEvent("CustomEvent");
                util.global.dispatchEvent(event);
                return function(name, event) {
                    name = name.toLowerCase();
                    var eventData = {
                        detail: event,
                        cancelable: true
                    };
                    var domEvent = new CustomEvent(name, eventData);
                    es5.defineProperty(
                        domEvent, "promise", {value: event.promise});
                    es5.defineProperty(
                        domEvent, "reason", {value: event.reason});
    
    Romain CREY's avatar
    Romain CREY committed
    
    
                    return dispatch(legacyHandlers[name], domEvent);
                };
            } else if (typeof Event === "function") {
                var event = new Event("CustomEvent");
                util.global.dispatchEvent(event);
                return function(name, event) {
                    name = name.toLowerCase();
                    var domEvent = new Event(name, {
                        cancelable: true
                    });
                    domEvent.detail = event;
                    es5.defineProperty(domEvent, "promise", {value: event.promise});
                    es5.defineProperty(domEvent, "reason", {value: event.reason});
                    return dispatch(legacyHandlers[name], domEvent);
                };
            } else {
                var event = document.createEvent("CustomEvent");
                event.initCustomEvent("testingtheevent", false, true, {});
                util.global.dispatchEvent(event);
                return function(name, event) {
                    name = name.toLowerCase();
                    var domEvent = document.createEvent("CustomEvent");
                    domEvent.initCustomEvent(name, false, true,
                        event);
                    return dispatch(legacyHandlers[name], domEvent);
                };
            }
        } catch (e) {}
        return function() {
            return false;
        };
    })();
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    var fireGlobalEvent = (function() {
        if (util.isNode) {
            return function() {
                return process.emit.apply(process, arguments);
            };
        } else {
            if (!util.global) {
                return function() {
                    return false;
                };
            }
            return function(name) {
                var methodName = "on" + name.toLowerCase();
                var method = util.global[methodName];
                if (!method) return false;
                method.apply(util.global, [].slice.call(arguments, 1));
                return true;
            };
        }
    })();
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function generatePromiseLifecycleEventObject(name, promise) {
        return {promise: promise};
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    var eventToObjectGenerator = {
        promiseCreated: generatePromiseLifecycleEventObject,
        promiseFulfilled: generatePromiseLifecycleEventObject,
        promiseRejected: generatePromiseLifecycleEventObject,
        promiseResolved: generatePromiseLifecycleEventObject,
        promiseCancelled: generatePromiseLifecycleEventObject,
        promiseChained: function(name, promise, child) {
            return {promise: promise, child: child};
        },
        warning: function(name, warning) {
            return {warning: warning};
        },
        unhandledRejection: function (name, reason, promise) {
            return {reason: reason, promise: promise};
        },
        rejectionHandled: generatePromiseLifecycleEventObject
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    var activeFireEvent = function (name) {
        var globalEventFired = false;
        try {
            globalEventFired = fireGlobalEvent.apply(null, arguments);
        } catch (e) {
            async.throwLater(e);
            globalEventFired = true;
        }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
        var domEventFired = false;
        try {
            domEventFired = fireDomEvent(name,
                        eventToObjectGenerator[name].apply(null, arguments));
        } catch (e) {
            async.throwLater(e);
            domEventFired = true;
        }
    
        return domEventFired || globalEventFired;
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    Promise.config = function(opts) {
        opts = Object(opts);
        if ("longStackTraces" in opts) {
            if (opts.longStackTraces) {
                Promise.longStackTraces();
            } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
                disableLongStackTraces();
            }
        }
        if ("warnings" in opts) {
            var warningsOption = opts.warnings;
            config.warnings = !!warningsOption;
            wForgottenReturn = config.warnings;
    
    Romain CREY's avatar
    Romain CREY committed
    
    
            if (util.isObject(warningsOption)) {
                if ("wForgottenReturn" in warningsOption) {
                    wForgottenReturn = !!warningsOption.wForgottenReturn;
                }
            }
        }
        if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
            if (async.haveItemsQueued()) {
                throw new Error(
                    "cannot enable cancellation after promises are in use");
            }
            Promise.prototype._clearCancellationData =
                cancellationClearCancellationData;
            Promise.prototype._propagateFrom = cancellationPropagateFrom;
            Promise.prototype._onCancel = cancellationOnCancel;
            Promise.prototype._setOnCancel = cancellationSetOnCancel;
            Promise.prototype._attachCancellationCallback =
                cancellationAttachCancellationCallback;
            Promise.prototype._execute = cancellationExecute;
            propagateFromFunction = cancellationPropagateFrom;
            config.cancellation = true;
        }
        if ("monitoring" in opts) {
            if (opts.monitoring && !config.monitoring) {
                config.monitoring = true;
                Promise.prototype._fireEvent = activeFireEvent;
            } else if (!opts.monitoring && config.monitoring) {
                config.monitoring = false;
                Promise.prototype._fireEvent = defaultFireEvent;
            }
        }
        if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
            var prev = config.asyncHooks;
            var cur = !!opts.asyncHooks;
            if (prev !== cur) {
                config.asyncHooks = cur;
                if (cur) {
                    enableAsyncHooks();
                } else {
                    disableAsyncHooks();
                }
            }
        }
        return Promise;
    };
    
    function defaultFireEvent() { return false; }
    
    Promise.prototype._fireEvent = defaultFireEvent;
    Promise.prototype._execute = function(executor, resolve, reject) {
        try {
            executor(resolve, reject);
        } catch (e) {
            return e;
        }
    };
    Promise.prototype._onCancel = function () {};
    Promise.prototype._setOnCancel = function (handler) { ; };
    Promise.prototype._attachCancellationCallback = function(onCancel) {
        ;
    };
    Promise.prototype._captureStackTrace = function () {};
    Promise.prototype._attachExtraTrace = function () {};
    Promise.prototype._dereferenceTrace = function () {};
    Promise.prototype._clearCancellationData = function() {};
    Promise.prototype._propagateFrom = function (parent, flags) {
        ;
        ;
    };
    
    function cancellationExecute(executor, resolve, reject) {
        var promise = this;
        try {
            executor(resolve, reject, function(onCancel) {
                if (typeof onCancel !== "function") {
                    throw new TypeError("onCancel must be a function, got: " +
                                        util.toString(onCancel));
                }
                promise._attachCancellationCallback(onCancel);
            });
        } catch (e) {
            return e;
        }
    
    function cancellationAttachCancellationCallback(onCancel) {
        if (!this._isCancellable()) return this;
    
        var previousOnCancel = this._onCancel();
        if (previousOnCancel !== undefined) {
            if (util.isArray(previousOnCancel)) {
                previousOnCancel.push(onCancel);
            } else {
                this._setOnCancel([previousOnCancel, onCancel]);
            }
        } else {
            this._setOnCancel(onCancel);
        }
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function cancellationOnCancel() {
        return this._onCancelField;
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function cancellationSetOnCancel(onCancel) {
        this._onCancelField = onCancel;
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function cancellationClearCancellationData() {
        this._cancellationParent = undefined;
        this._onCancelField = undefined;
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function cancellationPropagateFrom(parent, flags) {
        if ((flags & 1) !== 0) {
            this._cancellationParent = parent;
            var branchesRemainingToCancel = parent._branchesRemainingToCancel;
            if (branchesRemainingToCancel === undefined) {
                branchesRemainingToCancel = 0;
            }
            parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
        }
        if ((flags & 2) !== 0 && parent._isBound()) {
            this._setBoundTo(parent._boundTo);
        }
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function bindingPropagateFrom(parent, flags) {
        if ((flags & 2) !== 0 && parent._isBound()) {
            this._setBoundTo(parent._boundTo);
        }
    }
    var propagateFromFunction = bindingPropagateFrom;
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function boundValueFunction() {
        var ret = this._boundTo;
        if (ret !== undefined) {
            if (ret instanceof Promise) {
                if (ret.isFulfilled()) {
                    return ret.value();
                } else {
                    return undefined;
                }
            }
        }
        return ret;
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function longStackTracesCaptureStackTrace() {
        this._trace = new CapturedTrace(this._peekContext());
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function longStackTracesAttachExtraTrace(error, ignoreSelf) {
        if (canAttachTrace(error)) {
            var trace = this._trace;
            if (trace !== undefined) {
                if (ignoreSelf) trace = trace._parent;
            }
            if (trace !== undefined) {
                trace.attachExtraTrace(error);
            } else if (!error.__stackCleaned__) {
                var parsed = parseStackAndMessage(error);
                util.notEnumerableProp(error, "stack",
                    parsed.message + "\n" + parsed.stack.join("\n"));
                util.notEnumerableProp(error, "__stackCleaned__", true);
            }
        }
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function longStackTracesDereferenceTrace() {
        this._trace = undefined;
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                                   parent) {
        if (returnValue === undefined && promiseCreated !== null &&
            wForgottenReturn) {
            if (parent !== undefined && parent._returnedNonUndefined()) return;
            if ((promise._bitField & 65535) === 0) return;
    
    Romain CREY's avatar
    Romain CREY committed
    
    
            if (name) name = name + " ";
            var handlerLine = "";
            var creatorLine = "";
            if (promiseCreated._trace) {
                var traceLines = promiseCreated._trace.stack.split("\n");
                var stack = cleanStack(traceLines);
                for (var i = stack.length - 1; i >= 0; --i) {
                    var line = stack[i];
                    if (!nodeFramePattern.test(line)) {
                        var lineMatches = line.match(parseLinePattern);
                        if (lineMatches) {
                            handlerLine  = "at " + lineMatches[1] +
                                ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                        }
                        break;
                    }
                }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
                if (stack.length > 0) {
                    var firstUserLine = stack[0];
                    for (var i = 0; i < traceLines.length; ++i) {
    
    Romain CREY's avatar
    Romain CREY committed
    
    
                        if (traceLines[i] === firstUserLine) {
                            if (i > 0) {
                                creatorLine = "\n" + traceLines[i - 1];
                            }
                            break;
                        }
                    }
    
                }
            }
            var msg = "a promise was created in a " + name +
                "handler " + handlerLine + "but was not returned from it, " +
                "see http://goo.gl/rRqMUw" +
                creatorLine;
            promise._warn(msg, true, promiseCreated);
        }
    
    Romain CREY's avatar
    Romain CREY committed
    }
    
    
    function deprecated(name, replacement) {
        var message = name +
            " is deprecated and will be removed in a future version.";
        if (replacement) message += " Use " + replacement + " instead.";
        return warn(message);
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function warn(message, shouldUseOwnTrace, promise) {
        if (!config.warnings) return;
        var warning = new Warning(message);
        var ctx;
        if (shouldUseOwnTrace) {
            promise._attachExtraTrace(warning);
        } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
            ctx.attachExtraTrace(warning);
        } else {
            var parsed = parseStackAndMessage(warning);
            warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
        }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
        if (!activeFireEvent("warning", warning)) {
            formatAndLogError(warning, "", true);
        }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function reconstructStack(message, stacks) {
        for (var i = 0; i < stacks.length - 1; ++i) {
            stacks[i].push("From previous event:");
            stacks[i] = stacks[i].join("\n");
        }
        if (i < stacks.length) {
            stacks[i] = stacks[i].join("\n");
        }
        return message + "\n" + stacks.join("\n");
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function removeDuplicateOrEmptyJumps(stacks) {
        for (var i = 0; i < stacks.length; ++i) {
            if (stacks[i].length === 0 ||
                ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
                stacks.splice(i, 1);
                i--;
            }
        }
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function removeCommonRoots(stacks) {
        var current = stacks[0];
        for (var i = 1; i < stacks.length; ++i) {
            var prev = stacks[i];
            var currentLastIndex = current.length - 1;
            var currentLastLine = current[currentLastIndex];
            var commonRootMeetPoint = -1;
    
    Romain CREY's avatar
    Romain CREY committed
    
    
            for (var j = prev.length - 1; j >= 0; --j) {
                if (prev[j] === currentLastLine) {
                    commonRootMeetPoint = j;
                    break;
                }
            }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
            for (var j = commonRootMeetPoint; j >= 0; --j) {
                var line = prev[j];
                if (current[currentLastIndex] === line) {
                    current.pop();
                    currentLastIndex--;
                } else {
                    break;
                }
            }
            current = prev;
        }
    
    Romain CREY's avatar
    Romain CREY committed
    }
    
    
    function cleanStack(stack) {
        var ret = [];
        for (var i = 0; i < stack.length; ++i) {
            var line = stack[i];
            var isTraceLine = "    (No stack trace)" === line ||
                stackFramePattern.test(line);
            var isInternalFrame = isTraceLine && shouldIgnore(line);
            if (isTraceLine && !isInternalFrame) {
                if (indentStackFrames && line.charAt(0) !== " ") {
                    line = "    " + line;
                }
                ret.push(line);
            }
        }
        return ret;
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function stackFramesAsArray(error) {
        var stack = error.stack.replace(/\s+$/g, "").split("\n");
        for (var i = 0; i < stack.length; ++i) {
            var line = stack[i];
            if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
                break;
            }
        }
        if (i > 0 && error.name != "SyntaxError") {
            stack = stack.slice(i);
        }
        return stack;
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function parseStackAndMessage(error) {
        var stack = error.stack;
        var message = error.toString();
        stack = typeof stack === "string" && stack.length > 0
                    ? stackFramesAsArray(error) : ["    (No stack trace)"];
        return {
            message: message,
            stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
        };
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function formatAndLogError(error, title, isSoft) {
        if (typeof console !== "undefined") {
            var message;
            if (util.isObject(error)) {
                var stack = error.stack;
                message = title + formatStack(stack, error);
            } else {
                message = title + String(error);
            }
            if (typeof printWarning === "function") {
                printWarning(message, isSoft);
            } else if (typeof console.log === "function" ||
                typeof console.log === "object") {
                console.log(message);
            }
        }
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function fireRejectionEvent(name, localHandler, reason, promise) {
        var localEventFired = false;
        try {
            if (typeof localHandler === "function") {
                localEventFired = true;
                if (name === "rejectionHandled") {
                    localHandler(promise);
                } else {
                    localHandler(reason, promise);
                }
            }
        } catch (e) {
            async.throwLater(e);
        }
    
        if (name === "unhandledRejection") {
            if (!activeFireEvent(name, reason, promise) && !localEventFired) {
                formatAndLogError(reason, "Unhandled rejection ");
            }
        } else {
            activeFireEvent(name, promise);
        }
    
    Romain CREY's avatar
    Romain CREY committed
    }
    
    
    function formatNonError(obj) {
        var str;
        if (typeof obj === "function") {
            str = "[function " +
                (obj.name || "anonymous") +
                "]";
        } else {
            str = obj && typeof obj.toString === "function"
                ? obj.toString() : util.toString(obj);
            var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
            if (ruselessToString.test(str)) {
                try {
                    var newStr = JSON.stringify(obj);
                    str = newStr;
                }
                catch(e) {
    
    Romain CREY's avatar
    Romain CREY committed
    
    
                }
            }
            if (str.length === 0) {
                str = "(empty array)";
            }
        }
        return ("(<" + snip(str) + ">, no stack trace)");
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function snip(str) {
        var maxChars = 41;
        if (str.length < maxChars) {
            return str;
        }
        return str.substr(0, maxChars - 3) + "...";
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function longStackTracesIsSupported() {
        return typeof captureStackTrace === "function";
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    var shouldIgnore = function() { return false; };
    var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
    function parseLineInfo(line) {
        var matches = line.match(parseLineInfoRegex);
        if (matches) {
            return {
                fileName: matches[1],
                line: parseInt(matches[2], 10)
            };
        }
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function setBounds(firstLineError, lastLineError) {
        if (!longStackTracesIsSupported()) return;
        var firstStackLines = (firstLineError.stack || "").split("\n");
        var lastStackLines = (lastLineError.stack || "").split("\n");
        var firstIndex = -1;
        var lastIndex = -1;
        var firstFileName;
        var lastFileName;
        for (var i = 0; i < firstStackLines.length; ++i) {
            var result = parseLineInfo(firstStackLines[i]);
            if (result) {
                firstFileName = result.fileName;
                firstIndex = result.line;
                break;
            }
        }
        for (var i = 0; i < lastStackLines.length; ++i) {
            var result = parseLineInfo(lastStackLines[i]);
            if (result) {
                lastFileName = result.fileName;
                lastIndex = result.line;
                break;
            }
        }
        if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
            firstFileName !== lastFileName || firstIndex >= lastIndex) {
            return;
        }
    
        shouldIgnore = function(line) {
            if (bluebirdFramePattern.test(line)) return true;
            var info = parseLineInfo(line);
            if (info) {
                if (info.fileName === firstFileName &&
                    (firstIndex <= info.line && info.line <= lastIndex)) {
                    return true;
                }
            }
            return false;
        };
    }
    
    function CapturedTrace(parent) {
        this._parent = parent;
        this._promisesCreated = 0;
        var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
        captureStackTrace(this, CapturedTrace);
        if (length > 32) this.uncycle();
    }
    util.inherits(CapturedTrace, Error);
    Context.CapturedTrace = CapturedTrace;
    
    CapturedTrace.prototype.uncycle = function() {
        var length = this._length;
        if (length < 2) return;
        var nodes = [];
        var stackToIndex = {};
    
        for (var i = 0, node = this; node !== undefined; ++i) {
            nodes.push(node);
            node = node._parent;
        }
        length = this._length = i;
        for (var i = length - 1; i >= 0; --i) {
            var stack = nodes[i].stack;
            if (stackToIndex[stack] === undefined) {
                stackToIndex[stack] = i;
            }
        }
        for (var i = 0; i < length; ++i) {
            var currentStack = nodes[i].stack;
            var index = stackToIndex[currentStack];
            if (index !== undefined && index !== i) {
                if (index > 0) {
                    nodes[index - 1]._parent = undefined;
                    nodes[index - 1]._length = 1;
                }
                nodes[i]._parent = undefined;
                nodes[i]._length = 1;
                var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;
    
                if (index < length - 1) {
                    cycleEdgeNode._parent = nodes[index + 1];
                    cycleEdgeNode._parent.uncycle();
                    cycleEdgeNode._length =
                        cycleEdgeNode._parent._length + 1;
                } else {
                    cycleEdgeNode._parent = undefined;
                    cycleEdgeNode._length = 1;
                }
                var currentChildLength = cycleEdgeNode._length + 1;
                for (var j = i - 2; j >= 0; --j) {
                    nodes[j]._length = currentChildLength;
                    currentChildLength++;
                }
                return;
            }
        }
    
    Romain CREY's avatar
    Romain CREY committed
    };
    
    
    CapturedTrace.prototype.attachExtraTrace = function(error) {
        if (error.__stackCleaned__) return;
        this.uncycle();
        var parsed = parseStackAndMessage(error);
        var message = parsed.message;
        var stacks = [parsed.stack];
    
    Romain CREY's avatar
    Romain CREY committed
    
    
        var trace = this;
        while (trace !== undefined) {
            stacks.push(cleanStack(trace.stack.split("\n")));
            trace = trace._parent;
        }
        removeCommonRoots(stacks);
        removeDuplicateOrEmptyJumps(stacks);
        util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
        util.notEnumerableProp(error, "__stackCleaned__", true);
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    var captureStackTrace = (function stackDetection() {
        var v8stackFramePattern = /^\s*at\s*/;
        var v8stackFormatter = function(stack, error) {
            if (typeof stack === "string") return stack;
    
    Romain CREY's avatar
    Romain CREY committed
    
    
            if (error.name !== undefined &&
                error.message !== undefined) {
                return error.toString();
            }
            return formatNonError(error);
        };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
        if (typeof Error.stackTraceLimit === "number" &&
            typeof Error.captureStackTrace === "function") {
            Error.stackTraceLimit += 6;
            stackFramePattern = v8stackFramePattern;
            formatStack = v8stackFormatter;
            var captureStackTrace = Error.captureStackTrace;
    
            shouldIgnore = function(line) {
                return bluebirdFramePattern.test(line);
            };
            return function(receiver, ignoreUntil) {
                Error.stackTraceLimit += 6;
                captureStackTrace(receiver, ignoreUntil);
                Error.stackTraceLimit -= 6;
            };
        }
        var err = new Error();
    
        if (typeof err.stack === "string" &&
            err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
            stackFramePattern = /@/;
            formatStack = v8stackFormatter;
            indentStackFrames = true;
            return function captureStackTrace(o) {
                o.stack = new Error().stack;
            };
        }
    
        var hasStackAfterThrow;
        try { throw new Error(); }
        catch(e) {
            hasStackAfterThrow = ("stack" in e);
        }
        if (!("stack" in err) && hasStackAfterThrow &&
            typeof Error.stackTraceLimit === "number") {
            stackFramePattern = v8stackFramePattern;
            formatStack = v8stackFormatter;
            return function captureStackTrace(o) {
                Error.stackTraceLimit += 6;
                try { throw new Error(); }
                catch(e) { o.stack = e.stack; }
                Error.stackTraceLimit -= 6;
            };
        }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
        formatStack = function(stack, error) {
            if (typeof stack === "string") return stack;
    
    Romain CREY's avatar
    Romain CREY committed
    
    
            if ((typeof error === "object" ||
                typeof error === "function") &&
                error.name !== undefined &&
                error.message !== undefined) {
                return error.toString();
            }
            return formatNonError(error);
        };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
        printWarning = function (message) {
            console.warn(message);
    
        if (util.isNode && process.stderr.isTTY) {
            printWarning = function(message, isSoft) {
                var color = isSoft ? "\u001b[33m" : "\u001b[31m";
                console.warn(color + message + "\u001b[0m\n");
            };
        } else if (!util.isNode && typeof (new Error().stack) === "string") {
            printWarning = function(message, isSoft) {
                console.warn("%c" + message,
                            isSoft ? "color: darkorange" : "color: red");
            };
        }
    
    Romain CREY's avatar
    Romain CREY committed
    }
    
    
    var config = {
        warnings: warnings,
        longStackTraces: false,
        cancellation: false,
        monitoring: false,
        asyncHooks: false
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    if (longStackTraces) Promise.longStackTraces();
    
    return {
        asyncHooks: function() {
            return config.asyncHooks;
        },
        longStackTraces: function() {
            return config.longStackTraces;
        },
        warnings: function() {
            return config.warnings;
        },
        cancellation: function() {
            return config.cancellation;
        },
        monitoring: function() {
            return config.monitoring;
        },
        propagateFromFunction: function() {
            return propagateFromFunction;
        },
        boundValueFunction: function() {
            return boundValueFunction;
        },
        checkForgottenReturns: checkForgottenReturns,
        setBounds: setBounds,
        warn: warn,
        deprecated: deprecated,
        CapturedTrace: CapturedTrace,
        fireDomEvent: fireDomEvent,
        fireGlobalEvent: fireGlobalEvent
    };
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    
    /***/ }),
    /* 18 */
    /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
    
    module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
    var util = __webpack_require__(7);
    var CancellationError = Promise.CancellationError;
    var errorObj = util.errorObj;
    var catchFilter = __webpack_require__(19)(NEXT_FILTER);
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function PassThroughHandlerContext(promise, type, handler) {
        this.promise = promise;
        this.type = type;
        this.handler = handler;
        this.called = false;
        this.cancelPromise = null;
    }
    
    PassThroughHandlerContext.prototype.isFinallyHandler = function() {
        return this.type === 0;
    };
    
    function FinallyHandlerCancelReaction(finallyHandler) {
        this.finallyHandler = finallyHandler;
    
    FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
        checkCancel(this.finallyHandler);
    };
    
    function checkCancel(ctx, reason) {
        if (ctx.cancelPromise != null) {
            if (arguments.length > 1) {
                ctx.cancelPromise._reject(reason);
            } else {
                ctx.cancelPromise._cancel();
            }
            ctx.cancelPromise = null;
            return true;
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    function succeed() {
        return finallyHandler.call(this, this.promise._target()._settledValue());
    }
    function fail(reason) {
        if (checkCancel(this, reason)) return;
        errorObj.e = reason;
        return errorObj;
    }
    function finallyHandler(reasonOrValue) {
        var promise = this.promise;
        var handler = this.handler;
    
    Romain CREY's avatar
    Romain CREY committed
    
    
        if (!this.called) {
            this.called = true;
            var ret = this.isFinallyHandler()
                ? handler.call(promise._boundValue())
                : handler.call(promise._boundValue(), reasonOrValue);
            if (ret === NEXT_FILTER) {
                return ret;
            } else if (ret !== undefined) {
                promise._setReturnedNonUndefined();
                var maybePromise = tryConvertToPromise(ret, promise);
                if (maybePromise instanceof Promise) {
                    if (this.cancelPromise != null) {
                        if (maybePromise._isCancelled()) {
                            var reason =
                                new CancellationError("late cancellation observer");
                            promise._attachExtraTrace(reason);
                            errorObj.e = reason;
                            return errorObj;
                        } else if (maybePromise.isPending()) {
                            maybePromise._attachCancellationCallback(
                                new FinallyHandlerCancelReaction(this));
                        }
                    }
                    return maybePromise._then(
                        succeed, fail, undefined, this, undefined);
                }
            }
        }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
        if (promise.isRejected()) {
            checkCancel(this);
            errorObj.e = reasonOrValue;
            return errorObj;
        } else {
            checkCancel(this);
            return reasonOrValue;
        }
    }
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    Promise.prototype._passThrough = function(handler, type, success, fail) {
        if (typeof handler !== "function") return this.then();
        return this._then(success,
                          fail,
                          undefined,
                          new PassThroughHandlerContext(this, type, handler),
                          undefined);
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    Promise.prototype.lastly =
    Promise.prototype["finally"] = function (handler) {
        return this._passThrough(handler,
                                 0,
                                 finallyHandler,
                                 finallyHandler);
    };
    
    Romain CREY's avatar
    Romain CREY committed
    
    
    Promise.prototype.tap = function (handler) {
        return this._passThrough(handler, 1, finallyHandler);
    };
    
    Promise.prototype.tapCatch = function (handlerOrPredicate) {
        var len = arguments.length;
        if(len === 1) {
            return this._passThrough(handlerOrPredicate,
                                     1,
                                     undefined,
                                     finallyHandler);
        } else {
             var catchInstances = new Array(len - 1),