Source: polyfill-service/modules/polyfill/index.js

/**
 * @summary polyfill
 * @version 3.0.0
 * @since 1.0.0
 * @author Arian Khosravi <arian.khosravi@aofl.com>
 */
import promiscuous from '../promiscuous-polyfill';
import webcomponentsLoader from '../webcomponents-loader';

/* istanbul ignore next */
if (typeof window.Promise === 'undefined') {
  window.Promise = promiscuous;
}

/* eslint-disable */
/* istanbul ignore next */
if (typeof process !== 'undefined' && typeof process.env !== 'undefined' &&
typeof process.env.PUBLIC_PATH !== 'undefined') {
  __webpack_public_path__ = process.env.PUBLIC_PATH;
}
/* eslint-enable */

/**
 * Used to polyfill missing browser features.
 *
 * @example
 * await Polyfill.loadAll({
 *   'fetch': () => import('isomorphic-fetch'),
 *   'Reflect': () => import('harmony-reflect'),
 *   'Array.prototype.find': () => import('array.prototype.find'),
 *   'html-imports': {
 *     test() {
 *       return !('import' in document.createElement('link'));
 *     },
 *     load: () => import('@webcomponents/webcomponentsjs/webcomponents-bundle')
 *   }
 * });
 *
 * @memberof module:@aofl/polyfill-service
 * @class
 */
class Polyfill {
  /**
   * test if property is supported by browser/window.
   *
   * @param {String} property dot notation path of a nested window property.
   * @return {Boolean}
   */
  static supported(property) {
    const modulePath = property.split('.');
    let obj = window;
    for (let i = 0; i < modulePath.length; i++) {
      if (typeof obj[modulePath[i]] === 'undefined') { return false; }
      obj = obj[modulePath[i]];
    }
    return true;
  }

  /**
   * load polyfill
   *
   * @param {String} polyfillId id of polyfill to load
   * @param {Object} polyfillConfig polyfills config object
   * @return {Promise}
   */
  static load(polyfillId, polyfillConfig) {
    if (typeof polyfillConfig.load === 'function' && typeof polyfillConfig.test === 'function'
    && !polyfillConfig.test()) {
      return polyfillConfig.load();
    } else if (typeof polyfillConfig === 'function' && !Polyfill.supported(polyfillId)) {
      return polyfillConfig();
    }
    return Promise.resolve();
  }

  /**
   * load all polyfills
   *
   * @param {Object} polyfills polyfills config object
   * @return {Promis}
   */
  static loadAll(polyfills) {
    const promises = [];

    for (const key in polyfills) {
      /* istanbul ignore next */
      if (Object.hasOwnProperty.call(polyfills, key)) {
        promises.push(Polyfill.load(key, polyfills[key]));
      }
    }

    return webcomponentsLoader()
      .then(Promise.all(promises))
      .then(/* istanbul ignore next */() => {
        document.dispatchEvent(new CustomEvent('WebComponentsReady', {
          bubbles: true
        }));
      });
  }
}

export {
  Polyfill
};