her-promise
Version:
This is a polyfill of the ES6/ES9/ES11/ES12 Promise.
682 lines (637 loc) • 23.1 kB
JavaScript
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/calllate/index.js":
/*!****************************************!*\
!*** ./node_modules/calllate/index.js ***!
\****************************************/
/***/ ((module) => {
(function (f) {
if (true) {
module.exports = f()
} else { var g; }
})(function () {
var len = 0;
var queue = new Array(1024);
function flush() {
for (var i = 0; i < len; ++i) {
queue[i]();
queue[i] = undefined;
}
len = 0;
}
function usePromise() {
var p = Promise.resolve();
return function () {
// catch in ie<=8 has syntax error
p.then(flush, console.error);
};
}
var MutationObserverCtor;
if (typeof window !== 'undefined') {
MutationObserverCtor = window.MutationObserver || window.WebKitMutationObserver;
}
function useMutationObserver() {
var count = 1;
var observer = new MutationObserverCtor(flush);
var node = document.createTextNode(String(count));
observer.observe(node, {characterData: true});
return function () {
count = (count + 1) % 2;
node.data = String(count);
};
}
function useMessageChannel() {
var channel = new MessageChannel();
channel.port1.onmessage = flush;
return function () {
channel.port2.postMessage(0);
};
}
function useSetImmediate() {
var _setImmediate = setImmediate;
return function () {
_setImmediate(flush);
};
}
function useSetTimeout() {
var _setTimeout = setTimeout;
return function () {
_setTimeout(flush, 0);
};
}
var polyfill;
if (typeof Promise === 'function' && typeof Promise.resolve === 'function') {
polyfill = usePromise();
} else if (MutationObserverCtor) {
polyfill = useMutationObserver();
} else if (typeof importScripts === 'function' && typeof MessageChannel === 'function') {
// web worker
polyfill = useMessageChannel();
} else if (typeof setImmediate === 'function') {
// only ie>=10
polyfill = useSetImmediate();
} else {
polyfill = useSetTimeout();
}
return function (cb) {
queue[len] = cb;
++len;
if (len === 1) {
polyfill();
}
}
});
/***/ }),
/***/ "./src/allSettled.ts":
/*!***************************!*\
!*** ./src/allSettled.ts ***!
\***************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
;
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
(0,_utils__WEBPACK_IMPORTED_MODULE_0__.defineProp)(Promise, 'allSettled', function (values) {
return new Promise(function (resolve, reject) {
if (!(0,_utils__WEBPACK_IMPORTED_MODULE_0__.isArr)(values)) {
reject(new TypeError('The arguments must be Array.'));
return;
}
var length = values.length;
var results = new Array(length);
if (length === 0) {
resolve(results);
return;
}
var count = 0;
function allDone() {
if (++count === length) {
resolve(results);
}
}
var _loop_1 = function (i) {
var p = void 0;
if (values[i] instanceof Promise) {
p = values[i];
}
else {
p = Promise.resolve(values[i]);
}
p.then(function (value) {
results[i] = {
status: 'fulfilled',
value: value
};
allDone();
}, function (reason) {
results[i] = {
status: 'rejected',
reason: reason
};
allDone();
});
};
for (var i = 0; i < length; ++i) {
_loop_1(i);
}
});
});
/***/ }),
/***/ "./src/any.ts":
/*!********************!*\
!*** ./src/any.ts ***!
\********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
;
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "$AggregateError": () => (/* binding */ $AggregateError)
/* harmony export */ });
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
var __extends = (undefined && undefined.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var $AggregateError;
if (typeof AggregateError === 'function') {
$AggregateError = AggregateError;
}
else {
$AggregateError = /** @class */ (function (_super) {
__extends(class_1, _super);
function class_1(errors, message) {
if (message === void 0) { message = 'All promises were rejected.'; }
var _this = _super.call(this, message) || this;
_this.errors = errors;
return _this;
}
return class_1;
}(Error));
}
(0,_utils__WEBPACK_IMPORTED_MODULE_0__.defineProp)(Promise, 'any', function (values) {
return new Promise(function (resolve, reject) {
if (!(0,_utils__WEBPACK_IMPORTED_MODULE_0__.isArr)(values)) {
reject(new TypeError('The arguments must be Array.'));
return;
}
var length = values.length;
var reasons = new Array(0);
if (length === 0) {
reject(new $AggregateError(reasons));
return;
}
var count = 0;
function onReject(reason) {
reasons.push(reason);
if (++count === length) {
reject(new $AggregateError(reasons));
}
}
for (var i = 0; i < length; ++i) {
var p = void 0;
if (values[i] instanceof Promise) {
p = values[i];
}
else {
p = Promise.resolve(values[i]);
}
p.then(resolve, onReject);
}
});
});
/***/ }),
/***/ "./src/finally.ts":
/*!************************!*\
!*** ./src/finally.ts ***!
\************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
;
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
(0,_utils__WEBPACK_IMPORTED_MODULE_0__.defineProp)(Promise.prototype, 'finally', function (onfinally) {
return this.then(function (value) { return Promise.resolve((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isFunc)(onfinally) ? onfinally() : onfinally).then(function () { return value; }); }, function (reason) {
return Promise.resolve((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isFunc)(onfinally) ? onfinally() : onfinally).then(function () {
throw reason;
});
});
});
/***/ }),
/***/ "./src/promise.ts":
/*!************************!*\
!*** ./src/promise.ts ***!
\************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
;
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "Promise": () => (/* binding */ Promise)
/* harmony export */ });
/* harmony import */ var calllate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! calllate */ "./node_modules/calllate/index.js");
/* harmony import */ var calllate__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(calllate__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
/**
* Promise States
* A promise must be in one of three states: pending, fulfilled, or rejected.
*/
var Pending = 'pending';
var Fulfilled = 'fulfilled';
var Rejected = 'rejected';
/* eslint max-params: "off" */
function onThen(func, args, p, resolve, reject, noFunc) {
if (!(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isFunc)(func)) {
if (noFunc === reject) {
console.error("Uncaught (in promise) ".concat(String(args)));
}
// If onFulfilled is not a function, it must be ignored.
// If onRejected is not a function, it must be ignored.
noFunc(args);
return;
}
var arg;
try {
arg = func(args);
}
catch (err) {
reject(err);
return;
}
if (arg === p) {
reject(new TypeError('Chaining cycle detected for promise #<Promise>'));
return;
}
callThen(arg, resolve, reject);
}
function tryThen(then, arg, resolve, reject) {
calllate__WEBPACK_IMPORTED_MODULE_0___default()(function () {
var once = false;
try {
then.call(arg, function (value) {
if (once) {
return;
}
once = true;
callThen(value, resolve, reject);
}, function (reason) {
if (once) {
return;
}
once = true;
reject(reason);
});
}
catch (err) {
if (!once) {
once = true;
reject(err);
}
}
});
}
function callThen(arg, resolve, reject) {
if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isObjOrFunc)(arg)) {
var then = void 0;
try {
// If retrieving the property x.then results in a thrown exception e, reject promise with e as the reason.
then = arg.then;
}
catch (err) {
reject(err);
return;
}
if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isFunc)(then)) {
if (arg instanceof Promise) {
then.call(arg, resolve, reject);
}
else {
// “thenable” is an object or function that defines a then method.
tryThen(then, arg, resolve, reject);
}
return;
}
}
resolve(arg);
}
var Promise = /** @class */ (function () {
function Promise(executor) {
var _this = this;
// When pending, a promise: may transition to either the fulfilled or rejected state.
this._state = Pending;
this._value = undefined;
this._reason = undefined;
this._resolves = [];
this._rejects = [];
var resolves = this._resolves;
var resolve = function (value) {
// When fulfilled, a promise: must not transition to any other state.
if (_this._state === Pending) {
// Must have a value, which must not change.
_this._state = Fulfilled;
_this._value = value;
var length_1 = resolves.length;
if (length_1 === 0) {
return;
}
for (var i = 0; i < length_1; ++i) {
resolves[i]();
}
resolves.length = 0;
}
};
var rejects = this._rejects;
var reject = function (reason) {
// When rejected, a promise: must not transition to any other state.
if (_this._state === Pending) {
// Must have a reason, which must not change.
_this._state = Rejected;
_this._reason = reason;
var length_2 = rejects.length;
if (length_2 === 0) {
return;
}
for (var i = 0; i < length_2; ++i) {
rejects[i]();
}
rejects.length = 0;
}
};
try {
executor(function (value) {
callThen(value, resolve, reject);
}, reject);
}
catch (err) {
reject(err);
}
}
/**
* Creates a Promise that is resolved with an array of results when all of the provided Promises
* resolve, or rejected when any Promise is rejected.
* @param values An array of Promises.
* @returns A new Promise.
*/
Promise.all = function (values) {
return new Promise(function (resolve, reject) {
if (!(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isArr)(values)) {
return reject(new TypeError('The arguments must be Array.'));
}
var length = values.length;
var results = new Array(length);
if (length === 0) {
return resolve(results);
}
var count = 0;
var isReject = false;
function onResolve(value, i) {
if (isReject) {
return;
}
results[i] = value;
if (++count === length) {
resolve(results);
}
}
function onReject(reason) {
if (isReject) {
return;
}
isReject = true;
reject(reason);
}
var _loop_1 = function (i) {
callThen(values[i], function (value) { return onResolve(value, i); }, onReject);
};
for (var i = 0; !isReject && i < length; ++i) {
_loop_1(i);
}
});
};
/**
* Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
* or rejected.
* @param values An array of Promises.
* @returns A new Promise.
*/
Promise.race = function (values) {
return new Promise(function (resolve, reject) {
if (!(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isArr)(values)) {
return reject(new TypeError('The arguments must be Array.'));
}
var length = values.length;
for (var i = 0; i < length; ++i) {
callThen(values[i], resolve, reject);
}
});
};
/**
* Creates a new rejected promise for the provided reason.
* @param reason The reason the promise was rejected.
* @returns A new rejected Promise.
*/
Promise.reject = function (reason) {
return new Promise(function (resolve, reject) { return reject(reason); });
};
/**
* Creates a new resolved promise for the provided value.
* @param value A promise.
* @returns A promise whose internal state matches the provided promise.
*/
Promise.resolve = function (value) {
if (value instanceof Promise) {
return value;
}
return new Promise(function (resolve) { return resolve(value); });
};
/**
* A promise must provide a then method to access its current or eventual value or reason.
* A promise’s then method accepts two arguments: onFulfilled onRejected
* Both onFulfilled and onRejected are optional arguments.
*
* @param {(<T>(value: T) => (PromiseLike<TResult1> | TResult1)) | undefined | null} onFulfilled
* @param {((reason: any) => (PromiseLike<TResult2> | TResult2)) | undefined | null} onRejected
* @returns {Promise<TResult1 | TResult2>} then must return a promise
*/
Promise.prototype.then = function (onFulfilled, onRejected) {
var _this = this;
var p = new Promise(function (resolve, reject) {
switch (_this._state) {
case Fulfilled:
calllate__WEBPACK_IMPORTED_MODULE_0___default()(function () {
onThen(onFulfilled, _this._value, p, resolve, reject, resolve);
});
break;
case Rejected:
calllate__WEBPACK_IMPORTED_MODULE_0___default()(function () {
onThen(onRejected, _this._reason, p, resolve, reject, reject);
});
break;
default:
_this._resolves.push(function () {
calllate__WEBPACK_IMPORTED_MODULE_0___default()(function () {
onThen(onFulfilled, _this._value, p, resolve, reject, resolve);
});
});
_this._rejects.push(function () {
calllate__WEBPACK_IMPORTED_MODULE_0___default()(function () {
onThen(onRejected, _this._reason, p, resolve, reject, reject);
});
});
break;
}
});
return p;
};
Promise.prototype.catch = function (onRejected) {
return this.then(undefined, onRejected);
};
return Promise;
}());
/***/ }),
/***/ "./src/utils.ts":
/*!**********************!*\
!*** ./src/utils.ts ***!
\**********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
;
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "isObjOrFunc": () => (/* binding */ isObjOrFunc),
/* harmony export */ "isFunc": () => (/* binding */ isFunc),
/* harmony export */ "isArr": () => (/* binding */ isArr),
/* harmony export */ "defineProp": () => (/* binding */ defineProp)
/* harmony export */ });
function isObjOrFunc(arg) {
var type = typeof arg;
return arg !== null && (type === 'object' || type === 'function');
}
function isFunc(arg) {
return typeof arg === 'function';
}
var isArray;
if (isFunc(Array.isArray)) {
isArray = Array.isArray;
}
else {
isArray = function (arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
var isArr = isArray;
function defineProp(obj, prop, value) {
if (!isFunc(obj[prop])) {
Object.defineProperty(obj, prop, {
configurable: true,
enumerable: false,
value: value,
writable: true
});
}
}
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/global */
/******/ (() => {
/******/ __webpack_require__.g = (function() {
/******/ if (typeof globalThis === 'object') return globalThis;
/******/ try {
/******/ return this || new Function('return this')();
/******/ } catch (e) {
/******/ if (typeof window === 'object') return window;
/******/ }
/******/ })();
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
;
/*!**********************!*\
!*** ./src/index.ts ***!
\**********************/
var globalObj = typeof window === 'object' ? window : typeof __webpack_require__.g === 'object' ? __webpack_require__.g : self;
if (typeof globalObj.Promise !== 'function') {
globalObj.Promise = (__webpack_require__(/*! ./promise */ "./src/promise.ts").Promise);
}
__webpack_require__(/*! ./finally */ "./src/finally.ts");
__webpack_require__(/*! ./allSettled */ "./src/allSettled.ts");
globalObj.AggregateError = (__webpack_require__(/*! ./any */ "./src/any.ts").$AggregateError);
})();
/******/ })()
;
//# sourceMappingURL=her-promise.js.map