UNPKG

@stripe/stripe-js

Version:

Stripe.js loading utility

230 lines (182 loc) 7.08 kB
'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 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 = 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 !== 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 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 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) { // we won't throw an error if setLoadParameters is called with the same values as before if (loadStripeCalled && loadParams) { var validatedParams = validateLoadParams(params); var parameterKeys = Object.keys(validatedParams); var sameParameters = parameterKeys.reduce(function (previousValue, currentValue) { var _loadParams; return previousValue && params[currentValue] === ((_loadParams = loadParams) === null || _loadParams === void 0 ? void 0 : _loadParams[currentValue]); }, true); if (sameParameters) { return; } } if (loadStripeCalled) { throw new Error('You cannot change load parameters after calling loadStripe'); } loadParams = validateLoadParams(params); }; exports.loadStripe = loadStripe;