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 element.'); } headOrBody.appendChild(script); return script; }; var registerWrapper = function registerWrapper(stripe, startTime) { if (!stripe || !stripe._registerWrapper) { return; } stripe._registerWrapper({ name: 'stripe-js', version: "4.6.0", startTime: startTime }); }; var stripePromise = null; var onErrorListener = null; var onLoadListener = null; var onError = function onError(reject) { return function () { reject(new Error('Failed to load Stripe.js')); }; }; var onLoad = function onLoad(resolve, reject) { return function () { if (window.Stripe) { resolve(window.Stripe); } else { reject(new Error('Stripe.js not available')); } }; }; 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' || typeof document === '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); } else if (script && onLoadListener !== null && onErrorListener !== null) { var _script$parentNode; // remove event listeners script.removeEventListener('load', onLoadListener); script.removeEventListener('error', onErrorListener); // if script exists, but we are reloading due to an error, // reload script to trigger 'load' event (_script$parentNode = script.parentNode) === null || _script$parentNode === void 0 ? void 0 : _script$parentNode.removeChild(script); script = injectScript(params); } onLoadListener = onLoad(resolve, reject); onErrorListener = onError(reject); script.addEventListener('load', onLoadListener); script.addEventListener('error', onErrorListener); } catch (error) { reject(error); return; } }); // Resets stripePromise on error return stripePromise["catch"](function (error) { stripePromise = null; return Promise.reject(error); }); }; var initStripe = function initStripe(maybeStripe, args, startTime) { if (maybeStripe === null) { return null; } var stripe = maybeStripe.apply(undefined, args); registerWrapper(stripe, startTime); return stripe; }; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types var stripePromise$1; var loadCalled = false; var getStripePromise = function getStripePromise() { if (stripePromise$1) { return stripePromise$1; } stripePromise$1 = loadScript(null)["catch"](function (error) { // clear cache on error stripePromise$1 = null; return Promise.reject(error); }); return stripePromise$1; }; // Execute our own script injection after a tick to give users time to do their // own script injection. Promise.resolve().then(function () { return getStripePromise(); })["catch"](function (error) { if (!loadCalled) { console.warn(error); } }); var loadStripe = function loadStripe() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } loadCalled = true; var startTime = Date.now(); // if previous attempts are unsuccessful, will re-load script return getStripePromise().then(function (maybeStripe) { return initStripe(maybeStripe, args, startTime); }); }; export { loadStripe };