text: 'use strict';
  
  Object.defineProperty(exports, '__esModule', { value: true });
  
  function _typeof(obj) {
    "@babel/helpers - typeof";
  
    if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
      _typeof = function (obj) {
        return typeof obj;
      };
    } else {
      _typeof = function (obj) {
        return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
      };
    }
  
    return _typeof(obj);
  }
  
  var V3_URL = 'https://js.stripe.com/v3';
  var V3_URL_REGEX = /^https:\/\/js\.stripe\.com\/v3\/?(\?.*)?$/;
  var EXISTING_SCRIPT_MESSAGE = 'loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used';
  var findScript = function findScript() {
    var scripts = document.querySelectorAll("script[src^=\"".concat(V3_URL, "\"]"));
  
    for (var i = 0; i < scripts.length; i++) {
      var script = scripts[i];
  
      if (!V3_URL_REGEX.test(script.src)) {
        continue;
      }
  
      return script;
    }
  
    return null;
  };
  
  var injectScript = function injectScript(params) {
    var queryString = params && !params.advancedFraudSignals ? '?advancedFraudSignals=false' : '';
    var script = document.createElement('script');
    script.src = "".concat(V3_URL).concat(queryString);
    var headOrBody = document.head || document.body;
  
    if (!headOrBody) {
      throw new Error('Expected document.body not to be null. Stripe.js requires a <body> element.');
    }
  
    headOrBody.appendChild(script);
    return script;
  };
  
  var registerWrapper = function registerWrapper(stripe, startTime) {
    if (!stripe || !stripe._registerWrapper) {
      return;
    }
  
    stripe._registerWrapper({
      name: 'stripe-js',
      version: "1.19.1",
      startTime: startTime
    });
  };
  
  var stripePromise = null;
  var loadScript = function loadScript(params) {
    // Ensure that we only attempt to load Stripe.js at most once
    if (stripePromise !== null) {
      return stripePromise;
    }
  
    stripePromise = new Promise(function (resolve, reject) {
      if (typeof window === 'undefined') {
        // Resolve to null when imported server side. This makes the module
        // safe to import in an isomorphic code base.
        resolve(null);
        return;
      }
  
      if (window.Stripe && params) {
        console.warn(EXISTING_SCRIPT_MESSAGE);
      }
  
      if (window.Stripe) {
        resolve(window.Stripe);
        return;
      }
  
      try {
        var script = findScript();
  
        if (script && params) {
          console.warn(EXISTING_SCRIPT_MESSAGE);
        } else if (!script) {
          script = injectScript(params);
        }
  
        script.addEventListener('load', function () {
          if (window.Stripe) {
            resolve(window.Stripe);
          } else {
            reject(new Error('Stripe.js not available'));
          }
        });
        script.addEventListener('error', function () {
          reject(new Error('Failed to load Stripe.js'));
        });
      } catch (error) {
        reject(error);
        return;
      }
    });
    return stripePromise;
  };
  var initStripe = function initStripe(maybeStripe, args, startTime) {
    if (maybeStripe === null) {
      return null;
    }
  
    var stripe = maybeStripe.apply(undefined, args);
    registerWrapper(stripe, startTime);
    return stripe;
  };
  var validateLoadParams = function validateLoadParams(params) {
    var errorMessage = "invalid load parameters; expected object of shape\n\n    {advancedFraudSignals: boolean}\n\nbut received\n\n    ".concat(JSON.stringify(params), "\n");
  
    if (params === null || _typeof(params) !== 'object') {
      throw new Error(errorMessage);
    }
  
    if (Object.keys(params).length === 1 && typeof params.advancedFraudSignals === 'boolean') {
      return params;
    }
  
    throw new Error(errorMessage);
  };
  
  var loadParams;
  var loadStripeCalled = false;
  var loadStripe = function loadStripe() {
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }
  
    loadStripeCalled = true;
    var startTime = Date.now();
    return loadScript(loadParams).then(function (maybeStripe) {
      return initStripe(maybeStripe, args, startTime);
    });
  };
  
  loadStripe.setLoadParameters = function (params) {
    if (loadStripeCalled) {
      throw new Error('You cannot change load parameters after calling loadStripe');
    }
  
    loadParams = validateLoadParams(params);
  };
  
  exports.loadStripe = loadStripe;
  