UNPKG

@stripe/stripe-js

Version:

Stripe.js loading utility

201 lines (160 loc) 6.01 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var RELEASE_TRAIN = 'basil'; var runtimeVersionToUrlVersion = function runtimeVersionToUrlVersion(version) { return version === 3 ? 'v3' : version; }; var ORIGIN = 'https://js.stripe.com'; var STRIPE_JS_URL = "".concat(ORIGIN, "/").concat(RELEASE_TRAIN, "/stripe.js"); var V3_URL_REGEX = /^https:\/\/js\.stripe\.com\/v3\/?(\?.*)?$/; var STRIPE_JS_URL_REGEX = /^https:\/\/js\.stripe\.com\/(v3|[a-z]+)\/stripe\.js(\?.*)?$/; 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 isStripeJSURL = function isStripeJSURL(url) { return V3_URL_REGEX.test(url) || STRIPE_JS_URL_REGEX.test(url); }; var findScript = function findScript() { var scripts = document.querySelectorAll("script[src^=\"".concat(ORIGIN, "\"]")); for (var i = 0; i < scripts.length; i++) { var script = scripts[i]; if (!isStripeJSURL(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(STRIPE_JS_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: "7.9.0", startTime: startTime }); }; var stripePromise$1 = null; var onErrorListener = null; var onLoadListener = null; var onError = function onError(reject) { return function (cause) { reject(new Error('Failed to load Stripe.js', { cause: cause })); }; }; 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$1 !== null) { return stripePromise$1; } stripePromise$1 = 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$1["catch"](function (error) { stripePromise$1 = null; return Promise.reject(error); }); }; var initStripe = function initStripe(maybeStripe, args, startTime) { if (maybeStripe === null) { return null; } var pk = args[0]; var isTestKey = pk.match(/^pk_test/); // @ts-expect-error this is not publicly typed var version = runtimeVersionToUrlVersion(maybeStripe.version); var expectedVersion = RELEASE_TRAIN; if (isTestKey && version !== expectedVersion) { console.warn("Stripe.js@".concat(version, " was loaded on the page, but @stripe/stripe-js@").concat("7.9.0", " expected Stripe.js@").concat(expectedVersion, ". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning")); } var stripe = maybeStripe.apply(undefined, args); registerWrapper(stripe, startTime); return stripe; }; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types var stripePromise; var loadCalled = false; var getStripePromise = function getStripePromise() { if (stripePromise) { return stripePromise; } stripePromise = loadScript(null)["catch"](function (error) { // clear cache on error stripePromise = null; return Promise.reject(error); }); return stripePromise; }; // 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); }); }; exports.loadStripe = loadStripe;