UNPKG

her-promise

Version:

This is a polyfill of the ES6/ES9/ES11/ES12 Promise.

682 lines (637 loc) 23.1 kB
/******/ (() => { // 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__) => { "use strict"; __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__) => { "use strict"; __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__) => { "use strict"; __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__) => { "use strict"; __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__) => { "use strict"; __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. (() => { "use strict"; /*!**********************!*\ !*** ./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