react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / har-validator / node_modules / bluebird / js / main / promise.js
81160 views"use strict";1module.exports = function() {2var makeSelfResolutionError = function () {3return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/LhFpo0\u000a");4};5var reflect = function() {6return new Promise.PromiseInspection(this._target());7};8var apiRejection = function(msg) {9return Promise.reject(new TypeError(msg));10};11var util = require("./util.js");12var async = require("./async.js");13var errors = require("./errors.js");14var TypeError = Promise.TypeError = errors.TypeError;15Promise.RangeError = errors.RangeError;16Promise.CancellationError = errors.CancellationError;17Promise.TimeoutError = errors.TimeoutError;18Promise.OperationalError = errors.OperationalError;19Promise.RejectionError = errors.OperationalError;20Promise.AggregateError = errors.AggregateError;21var INTERNAL = function(){};22var APPLY = {};23var NEXT_FILTER = {e: null};24var tryConvertToPromise = require("./thenables.js")(Promise, INTERNAL);25var PromiseArray =26require("./promise_array.js")(Promise, INTERNAL,27tryConvertToPromise, apiRejection);28var CapturedTrace = require("./captured_trace.js")();29var isDebugging = require("./debuggability.js")(Promise, CapturedTrace);30/*jshint unused:false*/31var createContext =32require("./context.js")(Promise, CapturedTrace, isDebugging);33var CatchFilter = require("./catch_filter.js")(NEXT_FILTER);34var PromiseResolver = require("./promise_resolver.js");35var nodebackForPromise = PromiseResolver._nodebackForPromise;36var errorObj = util.errorObj;37var tryCatch = util.tryCatch;38function Promise(resolver) {39if (typeof resolver !== "function") {40throw new TypeError("the promise constructor requires a resolver function\u000a\u000a See http://goo.gl/EC22Yn\u000a");41}42if (this.constructor !== Promise) {43throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/KsIlge\u000a");44}45this._bitField = 0;46this._fulfillmentHandler0 = undefined;47this._rejectionHandler0 = undefined;48this._progressHandler0 = undefined;49this._promise0 = undefined;50this._receiver0 = undefined;51this._settledValue = undefined;52if (resolver !== INTERNAL) this._resolveFromResolver(resolver);53}5455Promise.prototype.toString = function () {56return "[object Promise]";57};5859Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {60var len = arguments.length;61if (len > 1) {62var catchInstances = new Array(len - 1),63j = 0, i;64for (i = 0; i < len - 1; ++i) {65var item = arguments[i];66if (typeof item === "function") {67catchInstances[j++] = item;68} else {69return Promise.reject(70new TypeError("Catch filter must inherit from Error or be a simple predicate function\u000a\u000a See http://goo.gl/o84o68\u000a"));71}72}73catchInstances.length = j;74fn = arguments[i];75var catchFilter = new CatchFilter(catchInstances, fn, this);76return this._then(undefined, catchFilter.doFilter, undefined,77catchFilter, undefined);78}79return this._then(undefined, fn, undefined, undefined, undefined);80};8182Promise.prototype.reflect = function () {83return this._then(reflect, reflect, undefined, this, undefined);84};8586Promise.prototype.then = function (didFulfill, didReject, didProgress) {87if (isDebugging() && arguments.length > 0 &&88typeof didFulfill !== "function" &&89typeof didReject !== "function") {90var msg = ".then() only accepts functions but was passed: " +91util.classString(didFulfill);92if (arguments.length > 1) {93msg += ", " + util.classString(didReject);94}95this._warn(msg);96}97return this._then(didFulfill, didReject, didProgress,98undefined, undefined);99};100101Promise.prototype.done = function (didFulfill, didReject, didProgress) {102var promise = this._then(didFulfill, didReject, didProgress,103undefined, undefined);104promise._setIsFinal();105};106107Promise.prototype.spread = function (didFulfill, didReject) {108return this.all()._then(didFulfill, didReject, undefined, APPLY, undefined);109};110111Promise.prototype.isCancellable = function () {112return !this.isResolved() &&113this._cancellable();114};115116Promise.prototype.toJSON = function () {117var ret = {118isFulfilled: false,119isRejected: false,120fulfillmentValue: undefined,121rejectionReason: undefined122};123if (this.isFulfilled()) {124ret.fulfillmentValue = this.value();125ret.isFulfilled = true;126} else if (this.isRejected()) {127ret.rejectionReason = this.reason();128ret.isRejected = true;129}130return ret;131};132133Promise.prototype.all = function () {134return new PromiseArray(this).promise();135};136137Promise.prototype.error = function (fn) {138return this.caught(util.originatesFromRejection, fn);139};140141Promise.is = function (val) {142return val instanceof Promise;143};144145Promise.fromNode = function(fn) {146var ret = new Promise(INTERNAL);147var result = tryCatch(fn)(nodebackForPromise(ret));148if (result === errorObj) {149ret._rejectCallback(result.e, true, true);150}151return ret;152};153154Promise.all = function (promises) {155return new PromiseArray(promises).promise();156};157158Promise.defer = Promise.pending = function () {159var promise = new Promise(INTERNAL);160return new PromiseResolver(promise);161};162163Promise.cast = function (obj) {164var ret = tryConvertToPromise(obj);165if (!(ret instanceof Promise)) {166var val = ret;167ret = new Promise(INTERNAL);168ret._fulfillUnchecked(val);169}170return ret;171};172173Promise.resolve = Promise.fulfilled = Promise.cast;174175Promise.reject = Promise.rejected = function (reason) {176var ret = new Promise(INTERNAL);177ret._captureStackTrace();178ret._rejectCallback(reason, true);179return ret;180};181182Promise.setScheduler = function(fn) {183if (typeof fn !== "function") throw new TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");184var prev = async._schedule;185async._schedule = fn;186return prev;187};188189Promise.prototype._then = function (190didFulfill,191didReject,192didProgress,193receiver,194internalData195) {196var haveInternalData = internalData !== undefined;197var ret = haveInternalData ? internalData : new Promise(INTERNAL);198199if (!haveInternalData) {200ret._propagateFrom(this, 4 | 1);201ret._captureStackTrace();202}203204var target = this._target();205if (target !== this) {206if (receiver === undefined) receiver = this._boundTo;207if (!haveInternalData) ret._setIsMigrated();208}209210var callbackIndex =211target._addCallbacks(didFulfill, didReject, didProgress, ret, receiver);212213if (target._isResolved() && !target._isSettlePromisesQueued()) {214async.invoke(215target._settlePromiseAtPostResolution, target, callbackIndex);216}217218return ret;219};220221Promise.prototype._settlePromiseAtPostResolution = function (index) {222if (this._isRejectionUnhandled()) this._unsetRejectionIsUnhandled();223this._settlePromiseAt(index);224};225226Promise.prototype._length = function () {227return this._bitField & 131071;228};229230Promise.prototype._isFollowingOrFulfilledOrRejected = function () {231return (this._bitField & 939524096) > 0;232};233234Promise.prototype._isFollowing = function () {235return (this._bitField & 536870912) === 536870912;236};237238Promise.prototype._setLength = function (len) {239this._bitField = (this._bitField & -131072) |240(len & 131071);241};242243Promise.prototype._setFulfilled = function () {244this._bitField = this._bitField | 268435456;245};246247Promise.prototype._setRejected = function () {248this._bitField = this._bitField | 134217728;249};250251Promise.prototype._setFollowing = function () {252this._bitField = this._bitField | 536870912;253};254255Promise.prototype._setIsFinal = function () {256this._bitField = this._bitField | 33554432;257};258259Promise.prototype._isFinal = function () {260return (this._bitField & 33554432) > 0;261};262263Promise.prototype._cancellable = function () {264return (this._bitField & 67108864) > 0;265};266267Promise.prototype._setCancellable = function () {268this._bitField = this._bitField | 67108864;269};270271Promise.prototype._unsetCancellable = function () {272this._bitField = this._bitField & (~67108864);273};274275Promise.prototype._setIsMigrated = function () {276this._bitField = this._bitField | 4194304;277};278279Promise.prototype._unsetIsMigrated = function () {280this._bitField = this._bitField & (~4194304);281};282283Promise.prototype._isMigrated = function () {284return (this._bitField & 4194304) > 0;285};286287Promise.prototype._receiverAt = function (index) {288var ret = index === 0289? this._receiver0290: this[291index * 5 - 5 + 4];292if (ret === undefined && this._isBound()) {293return this._boundTo;294}295return ret;296};297298Promise.prototype._promiseAt = function (index) {299return index === 0300? this._promise0301: this[index * 5 - 5 + 3];302};303304Promise.prototype._fulfillmentHandlerAt = function (index) {305return index === 0306? this._fulfillmentHandler0307: this[index * 5 - 5 + 0];308};309310Promise.prototype._rejectionHandlerAt = function (index) {311return index === 0312? this._rejectionHandler0313: this[index * 5 - 5 + 1];314};315316Promise.prototype._migrateCallbacks = function (follower, index) {317var fulfill = follower._fulfillmentHandlerAt(index);318var reject = follower._rejectionHandlerAt(index);319var progress = follower._progressHandlerAt(index);320var promise = follower._promiseAt(index);321var receiver = follower._receiverAt(index);322if (promise instanceof Promise) promise._setIsMigrated();323this._addCallbacks(fulfill, reject, progress, promise, receiver);324};325326Promise.prototype._addCallbacks = function (327fulfill,328reject,329progress,330promise,331receiver332) {333var index = this._length();334335if (index >= 131071 - 5) {336index = 0;337this._setLength(0);338}339340if (index === 0) {341this._promise0 = promise;342if (receiver !== undefined) this._receiver0 = receiver;343if (typeof fulfill === "function" && !this._isCarryingStackTrace())344this._fulfillmentHandler0 = fulfill;345if (typeof reject === "function") this._rejectionHandler0 = reject;346if (typeof progress === "function") this._progressHandler0 = progress;347} else {348var base = index * 5 - 5;349this[base + 3] = promise;350this[base + 4] = receiver;351if (typeof fulfill === "function")352this[base + 0] = fulfill;353if (typeof reject === "function")354this[base + 1] = reject;355if (typeof progress === "function")356this[base + 2] = progress;357}358this._setLength(index + 1);359return index;360};361362Promise.prototype._setProxyHandlers = function (receiver, promiseSlotValue) {363var index = this._length();364365if (index >= 131071 - 5) {366index = 0;367this._setLength(0);368}369if (index === 0) {370this._promise0 = promiseSlotValue;371this._receiver0 = receiver;372} else {373var base = index * 5 - 5;374this[base + 3] = promiseSlotValue;375this[base + 4] = receiver;376}377this._setLength(index + 1);378};379380Promise.prototype._proxyPromiseArray = function (promiseArray, index) {381this._setProxyHandlers(promiseArray, index);382};383384Promise.prototype._resolveCallback = function(value, shouldBind) {385if (this._isFollowingOrFulfilledOrRejected()) return;386if (value === this)387return this._rejectCallback(makeSelfResolutionError(), false, true);388var maybePromise = tryConvertToPromise(value, this);389if (!(maybePromise instanceof Promise)) return this._fulfill(value);390391var propagationFlags = 1 | (shouldBind ? 4 : 0);392this._propagateFrom(maybePromise, propagationFlags);393var promise = maybePromise._target();394if (promise._isPending()) {395var len = this._length();396for (var i = 0; i < len; ++i) {397promise._migrateCallbacks(this, i);398}399this._setFollowing();400this._setLength(0);401this._setFollowee(promise);402} else if (promise._isFulfilled()) {403this._fulfillUnchecked(promise._value());404} else {405this._rejectUnchecked(promise._reason(),406promise._getCarriedStackTrace());407}408};409410Promise.prototype._rejectCallback =411function(reason, synchronous, shouldNotMarkOriginatingFromRejection) {412if (!shouldNotMarkOriginatingFromRejection) {413util.markAsOriginatingFromRejection(reason);414}415var trace = util.ensureErrorObject(reason);416var hasStack = trace === reason;417this._attachExtraTrace(trace, synchronous ? hasStack : false);418this._reject(reason, hasStack ? undefined : trace);419};420421Promise.prototype._resolveFromResolver = function (resolver) {422var promise = this;423this._captureStackTrace();424this._pushContext();425var synchronous = true;426var r = tryCatch(resolver)(function(value) {427if (promise === null) return;428promise._resolveCallback(value);429promise = null;430}, function (reason) {431if (promise === null) return;432promise._rejectCallback(reason, synchronous);433promise = null;434});435synchronous = false;436this._popContext();437438if (r !== undefined && r === errorObj && promise !== null) {439promise._rejectCallback(r.e, true, true);440promise = null;441}442};443444Promise.prototype._settlePromiseFromHandler = function (445handler, receiver, value, promise446) {447if (promise._isRejected()) return;448promise._pushContext();449var x;450if (receiver === APPLY && !this._isRejected()) {451x = tryCatch(handler).apply(this._boundTo, value);452} else {453x = tryCatch(handler).call(receiver, value);454}455promise._popContext();456457if (x === errorObj || x === promise || x === NEXT_FILTER) {458var err = x === promise ? makeSelfResolutionError() : x.e;459promise._rejectCallback(err, false, true);460} else {461promise._resolveCallback(x);462}463};464465Promise.prototype._target = function() {466var ret = this;467while (ret._isFollowing()) ret = ret._followee();468return ret;469};470471Promise.prototype._followee = function() {472return this._rejectionHandler0;473};474475Promise.prototype._setFollowee = function(promise) {476this._rejectionHandler0 = promise;477};478479Promise.prototype._cleanValues = function () {480if (this._cancellable()) {481this._cancellationParent = undefined;482}483};484485Promise.prototype._propagateFrom = function (parent, flags) {486if ((flags & 1) > 0 && parent._cancellable()) {487this._setCancellable();488this._cancellationParent = parent;489}490if ((flags & 4) > 0 && parent._isBound()) {491this._setBoundTo(parent._boundTo);492}493};494495Promise.prototype._fulfill = function (value) {496if (this._isFollowingOrFulfilledOrRejected()) return;497this._fulfillUnchecked(value);498};499500Promise.prototype._reject = function (reason, carriedStackTrace) {501if (this._isFollowingOrFulfilledOrRejected()) return;502this._rejectUnchecked(reason, carriedStackTrace);503};504505Promise.prototype._settlePromiseAt = function (index) {506var promise = this._promiseAt(index);507var isPromise = promise instanceof Promise;508509if (isPromise && promise._isMigrated()) {510promise._unsetIsMigrated();511return async.invoke(this._settlePromiseAt, this, index);512}513var handler = this._isFulfilled()514? this._fulfillmentHandlerAt(index)515: this._rejectionHandlerAt(index);516517var carriedStackTrace =518this._isCarryingStackTrace() ? this._getCarriedStackTrace() : undefined;519var value = this._settledValue;520var receiver = this._receiverAt(index);521522523this._clearCallbackDataAtIndex(index);524525if (typeof handler === "function") {526if (!isPromise) {527handler.call(receiver, value, promise);528} else {529this._settlePromiseFromHandler(handler, receiver, value, promise);530}531} else if (receiver instanceof PromiseArray) {532if (!receiver._isResolved()) {533if (this._isFulfilled()) {534receiver._promiseFulfilled(value, promise);535}536else {537receiver._promiseRejected(value, promise);538}539}540} else if (isPromise) {541if (this._isFulfilled()) {542promise._fulfill(value);543} else {544promise._reject(value, carriedStackTrace);545}546}547548if (index >= 4 && (index & 31) === 4)549async.invokeLater(this._setLength, this, 0);550};551552Promise.prototype._clearCallbackDataAtIndex = function(index) {553if (index === 0) {554if (!this._isCarryingStackTrace()) {555this._fulfillmentHandler0 = undefined;556}557this._rejectionHandler0 =558this._progressHandler0 =559this._receiver0 =560this._promise0 = undefined;561} else {562var base = index * 5 - 5;563this[base + 3] =564this[base + 4] =565this[base + 0] =566this[base + 1] =567this[base + 2] = undefined;568}569};570571Promise.prototype._isSettlePromisesQueued = function () {572return (this._bitField &573-1073741824) === -1073741824;574};575576Promise.prototype._setSettlePromisesQueued = function () {577this._bitField = this._bitField | -1073741824;578};579580Promise.prototype._unsetSettlePromisesQueued = function () {581this._bitField = this._bitField & (~-1073741824);582};583584Promise.prototype._queueSettlePromises = function() {585async.settlePromises(this);586this._setSettlePromisesQueued();587};588589Promise.prototype._fulfillUnchecked = function (value) {590if (value === this) {591var err = makeSelfResolutionError();592this._attachExtraTrace(err);593return this._rejectUnchecked(err, undefined);594}595this._setFulfilled();596this._settledValue = value;597this._cleanValues();598599if (this._length() > 0) {600this._queueSettlePromises();601}602};603604Promise.prototype._rejectUncheckedCheckError = function (reason) {605var trace = util.ensureErrorObject(reason);606this._rejectUnchecked(reason, trace === reason ? undefined : trace);607};608609Promise.prototype._rejectUnchecked = function (reason, trace) {610if (reason === this) {611var err = makeSelfResolutionError();612this._attachExtraTrace(err);613return this._rejectUnchecked(err);614}615this._setRejected();616this._settledValue = reason;617this._cleanValues();618619if (this._isFinal()) {620async.throwLater(function(e) {621if ("stack" in e) {622async.invokeFirst(623CapturedTrace.unhandledRejection, undefined, e);624}625throw e;626}, trace === undefined ? reason : trace);627return;628}629630if (trace !== undefined && trace !== reason) {631this._setCarriedStackTrace(trace);632}633634if (this._length() > 0) {635this._queueSettlePromises();636} else {637this._ensurePossibleRejectionHandled();638}639};640641Promise.prototype._settlePromises = function () {642this._unsetSettlePromisesQueued();643var len = this._length();644for (var i = 0; i < len; i++) {645this._settlePromiseAt(i);646}647};648649Promise._makeSelfResolutionError = makeSelfResolutionError;650require("./progress.js")(Promise, PromiseArray);651require("./method.js")(Promise, INTERNAL, tryConvertToPromise, apiRejection);652require("./bind.js")(Promise, INTERNAL, tryConvertToPromise);653require("./finally.js")(Promise, NEXT_FILTER, tryConvertToPromise);654require("./direct_resolve.js")(Promise);655require("./synchronous_inspection.js")(Promise);656require("./join.js")(Promise, PromiseArray, tryConvertToPromise, INTERNAL);657Promise.Promise = Promise;658require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);659require('./cancel.js')(Promise);660require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext);661require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise);662require('./nodeify.js')(Promise);663require('./call_get.js')(Promise);664require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);665require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);666require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);667require('./settle.js')(Promise, PromiseArray);668require('./some.js')(Promise, PromiseArray, apiRejection);669require('./promisify.js')(Promise, INTERNAL);670require('./any.js')(Promise);671require('./each.js')(Promise, INTERNAL);672require('./timers.js')(Promise, INTERNAL);673require('./filter.js')(Promise, INTERNAL);674675util.toFastProperties(Promise);676util.toFastProperties(Promise.prototype);677function fillTypes(value) {678var p = new Promise(INTERNAL);679p._fulfillmentHandler0 = value;680p._rejectionHandler0 = value;681p._progressHandler0 = value;682p._promise0 = value;683p._receiver0 = value;684p._settledValue = value;685}686// Complete slack tracking, opt out of field-type tracking and687// stabilize map688fillTypes({a: 1});689fillTypes({b: 2});690fillTypes({c: 3});691fillTypes(1);692fillTypes(function(){});693fillTypes(undefined);694fillTypes(false);695fillTypes(new Promise(INTERNAL));696CapturedTrace.setBounds(async.firstLineError, util.lastLineError);697return Promise;698699};700701702