UNPKG

react-braintree-fields

Version:
1,483 lines (1,292 loc) 1.73 MB
/******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./demo/demo-class.jsx": /*!*****************************!*\ !*** ./demo/demo-class.jsx ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _src_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../src/index */ "./src/index.js"); class Demo extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) { constructor(props) { super(props); this.state = {}; this.state = { numberFocused: false }; this.numberField = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createRef(); this.braintree = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createRef(); ['onError', 'getToken', 'onCardTypeChange', 'onAuthorizationSuccess'].forEach(prop => this[prop] = this[prop].bind(this)); } onError(error) { this.setState({ error: error.message || String(error) }); } getToken() { this.tokenize().then(token => this.setState({ token, error: null })).catch(error => this.onError(error)); } onCardTypeChange(_ref) { var { cards } = _ref; if (1 === cards.length) { var [card] = cards; this.setState({ card: card.type }); if (card.code && card.code.name) { this.cvvField.setPlaceholder(card.code.name); } else { this.cvvField.setPlaceholder('CVV'); } } else { this.setState({ card: '' }); this.cvvField.setPlaceholder('CVV'); } } componentDidMount() { this.setState({ authorization: 'sandbox_g42y39zw_348pk9cgf3bgyw2b' }); } renderResult(title, obj) { if (!obj) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("b", null, title, ":"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("pre", null, JSON.stringify(obj, null, 4))); } onAuthorizationSuccess() { this.numberField.current.focus(); } render() { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h1", null, "Braintree Hosted Fields Demo"), this.renderResult('Error', this.state.error), this.renderResult('Token', this.state.token), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_src_index__WEBPACK_IMPORTED_MODULE_1__.Braintree, { ref: this.braintree, authorization: this.state.authorization, onAuthorizationSuccess: this.onAuthorizationSuccess, onError: this.onError, getTokenRef: t => this.tokenize = t, onCardTypeChange: this.onCardTypeChange, styles: { input: { 'font-size': '14px', 'font-family': 'helvetica, tahoma, calibri, sans-serif', color: '#7d6b6b' }, ':focus': { color: 'black' } } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Number:", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_src_index__WEBPACK_IMPORTED_MODULE_1__.HostedField, { type: "number", onBlur: () => this.setState({ numberFocused: false }), onFocus: () => this.setState({ numberFocused: true }), className: this.state.numberFocused ? 'focused' : '', prefill: "4111 1111 1111 1111", ref: this.numberField }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Card type: ", this.state.card), "Name:", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_src_index__WEBPACK_IMPORTED_MODULE_1__.HostedField, { type: "cardholderName" }), "Date:", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_src_index__WEBPACK_IMPORTED_MODULE_1__.HostedField, { type: "expirationDate" }), "Month:", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_src_index__WEBPACK_IMPORTED_MODULE_1__.HostedField, { type: "expirationMonth" }), "Year:", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_src_index__WEBPACK_IMPORTED_MODULE_1__.HostedField, { type: "expirationYear", options: { maskInput: { character: 'X' } } }), "CVV:", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_src_index__WEBPACK_IMPORTED_MODULE_1__.HostedField, { type: "cvv", placeholder: "CVV", ref: cvvField => { this.cvvField = cvvField; } }), "Zip:", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_src_index__WEBPACK_IMPORTED_MODULE_1__.HostedField, { type: "postalCode" }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "footer" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { onClick: this.getToken }, "Get nonce token"))); } } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Demo); /***/ }), /***/ "./src/api.js": /*!********************!*\ !*** ./src/api.js ***! \********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ BraintreeClientApi) /* harmony export */ }); /* harmony import */ var braintree_web_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! braintree-web/client */ "./node_modules/braintree-web/dist/browser/client.js"); /* harmony import */ var braintree_web_client__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(braintree_web_client__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var braintree_web_hosted_fields__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! braintree-web/hosted-fields */ "./node_modules/braintree-web/dist/browser/hosted-fields.js"); /* harmony import */ var braintree_web_hosted_fields__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(braintree_web_hosted_fields__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var braintree_web_data_collector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! braintree-web/data-collector */ "./node_modules/braintree-web/dist/browser/data-collector.js"); /* harmony import */ var braintree_web_data_collector__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(braintree_web_data_collector__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var braintree_web_three_d_secure__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! braintree-web/three-d-secure */ "./node_modules/braintree-web/dist/browser/three-d-secure.js"); /* harmony import */ var braintree_web_three_d_secure__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(braintree_web_three_d_secure__WEBPACK_IMPORTED_MODULE_3__); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function cap(string) { return string.charAt(0).toUpperCase() + string.slice(1); } class BraintreeClientApi { constructor(_ref) { var { authorization, styles, onAuthorizationSuccess } = _ref, callbacks = _objectWithoutPropertiesLoose(_ref, ["authorization", "styles", "onAuthorizationSuccess"]); this.fields = Object.create(null); this._nextFieldId = 0; this.fieldHandlers = Object.create(null); this.styles = styles || {}; this.wrapperHandlers = callbacks || {}; this.setAuthorization(authorization, onAuthorizationSuccess); } setAuthorization(authorization, onAuthorizationSuccess) { if (!authorization && this.authorization) { this.teardown(); } else if (authorization && authorization !== this.authorization) { // fields have not yet checked in, delay setting so they can register if (0 === Object.keys(this.fields).length && !this.pendingAuthTimer) { this.pendingAuthTimer = setTimeout(() => { this.pendingAuthTimer = null; this.setAuthorization(authorization, onAuthorizationSuccess); }, 5); return; } if (this.authorization) { this.teardown(); } this.authorization = authorization; braintree_web_client__WEBPACK_IMPORTED_MODULE_0___default().create({ authorization }, (err, clientInstance) => { if (err) { this.onError(err); } else { this.create(clientInstance, onAuthorizationSuccess); if (this.wrapperHandlers.onThreeDSecureReady) { braintree_web_three_d_secure__WEBPACK_IMPORTED_MODULE_3___default().create({ client: clientInstance, version: 2 }, this.wrapperHandlers.onThreeDSecureReady); } if (this.wrapperHandlers.onDataCollectorInstanceReady) { braintree_web_data_collector__WEBPACK_IMPORTED_MODULE_2___default().create({ client: clientInstance, kount: true }, this.wrapperHandlers.onDataCollectorInstanceReady); } } }); } } nextFieldId() { this._nextFieldId += 1; return this._nextFieldId; } onError(err) { if (!err) { return; } if (this.wrapperHandlers.onError) { this.wrapperHandlers.onError(err); } } create(client, onAuthorizationSuccess) { this.client = client; braintree_web_hosted_fields__WEBPACK_IMPORTED_MODULE_1___default().create({ client, styles: this.styles, fields: this.fields }, (err, hostedFields) => { if (err) { this.onError(err); return; } this.hostedFields = hostedFields; ['blur', 'focus', 'empty', 'notEmpty', 'cardTypeChange', 'validityChange'].forEach(eventName => { hostedFields.on(eventName, ev => this.onFieldEvent("on" + cap(eventName), ev)); }); this.onError(err); if (onAuthorizationSuccess) { onAuthorizationSuccess(); } }); } teardown() { if (this.hostedFields) { this.hostedFields.teardown(); } if (this.pendingAuthTimer) { clearTimeout(this.pendingAuthTimer); this.pendingAuthTimer = null; } } checkInField(_ref2) { var { formatInput, maxlength, minlength, placeholder, select, type, prefill, rejectUnsupportedCards, id = "braintree-field-wrapper-" + this.nextFieldId(), options = {} } = _ref2, handlers = _objectWithoutPropertiesLoose(_ref2, ["formatInput", "maxlength", "minlength", "placeholder", "select", "type", "prefill", "rejectUnsupportedCards", "id", "options"]); var onRenderComplete = () => { this.fieldHandlers[type] = handlers; this.fields[type] = _extends({ formatInput, maxlength, minlength, placeholder, select, prefill, selector: "#" + id }, options); if ('number' === type && rejectUnsupportedCards) { this.fields.number.rejectUnsupportedCards = true; } }; return [id, onRenderComplete]; } focusField(fieldType, cb) { this.hostedFields.focus(fieldType, cb); } clearField(fieldType, cb) { this.hostedFields.clear(fieldType, cb); } setAttribute(fieldType, name, value) { this.hostedFields.setAttribute({ field: fieldType, attribute: name, value }); } onFieldEvent(eventName, event) { var fieldHandlers = this.fieldHandlers[event.emittedBy]; if (fieldHandlers && fieldHandlers[eventName]) { fieldHandlers[eventName](event.fields[event.emittedBy], event); } if (this.wrapperHandlers[eventName]) { this.wrapperHandlers[eventName](event); } } tokenize(options) { if (options === void 0) { options = {}; } return new Promise((resolve, reject) => { // eslint-disable-line no-undef this.hostedFields.tokenize(options, (err, payload) => { if (err) { this.onError(err); reject(err); } else { resolve(payload); } }); }); } } /***/ }), /***/ "./src/braintree.jsx": /*!***************************!*\ !*** ./src/braintree.jsx ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ Braintree) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./api */ "./src/api.js"); /* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context */ "./src/context.js"); class Braintree extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) { constructor(props) { super(props); this.api = new _api__WEBPACK_IMPORTED_MODULE_1__.default(props); this.contextValue = { braintreeApi: this.api }; } componentDidMount() { this.api.setAuthorization(this.props.authorization, this.props.onAuthorizationSuccess); if (this.props.getTokenRef) { this.props.getTokenRef(this.api.tokenize.bind(this.api)); } } componentWillUnmount() { this.api.teardown(); } componentDidUpdate() { this.api.setAuthorization(this.props.authorization, this.props.onAuthorizationSuccess); } tokenize(options) { return this.api.tokenize(options); } render() { var { className: providedClass, tagName: Tag } = this.props; var className = 'braintree-hosted-fields-wrapper'; if (providedClass) { className += " " + providedClass; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_context__WEBPACK_IMPORTED_MODULE_2__.Context.Provider, { value: this.contextValue }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Tag, { className: className }, this.props.children)); } } Braintree.propTypes = { children: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().node.isRequired), onAuthorizationSuccess: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func), authorization: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string), getTokenRef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func), onValidityChange: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func), onCardTypeChange: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func), onError: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func), styles: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object), className: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string), tagName: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string) }; Braintree.defaultProps = { tagName: 'div' }; /***/ }), /***/ "./src/context.js": /*!************************!*\ !*** ./src/context.js ***! \************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Context": () => (/* binding */ Context) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); var Context = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createContext({ braintreeApi: null }); /***/ }), /***/ "./src/field.jsx": /*!***********************!*\ !*** ./src/field.jsx ***! \***********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ BraintreeHostedField) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context */ "./src/context.js"); class BraintreeHostedField extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) { constructor() { super(...arguments); this.state = {}; } focus() { this.context.braintreeApi.focusField(this.props.type); } clear() { this.context.braintreeApi.clearField(this.props.type); } setPlaceholder(text) { this.context.braintreeApi.setAttribute(this.props.type, 'placeholder', text); } componentDidMount() { var [fieldId, onRenderComplete] = this.context.braintreeApi.checkInField(this.props); this.setState({ fieldId }, onRenderComplete); } get className() { var list = ['braintree-hosted-field']; if (this.props.className) { list.push(this.props.className); } return list.join(' '); } render() { var { fieldId } = this.state; if (!fieldId) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { id: fieldId, className: this.className }); } } BraintreeHostedField.propTypes = { type: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOf(['number', 'expirationDate', 'expirationMonth', 'expirationYear', 'cvv', 'postalCode', 'cardholderName']).isRequired, id: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number)]), placeholder: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), className: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), onCardTypeChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), onValidityChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), onNotEmpty: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), onFocus: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), onEmpty: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), onBlur: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), prefill: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string) }; BraintreeHostedField.contextType = _context__WEBPACK_IMPORTED_MODULE_1__.Context; /***/ }), /***/ "./src/index.js": /*!**********************!*\ !*** ./src/index.js ***! \**********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Braintree": () => (/* reexport safe */ _braintree_jsx__WEBPACK_IMPORTED_MODULE_0__.default), /* harmony export */ "HostedField": () => (/* reexport safe */ _field_jsx__WEBPACK_IMPORTED_MODULE_1__.default) /* harmony export */ }); /* harmony import */ var _braintree_jsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./braintree.jsx */ "./src/braintree.jsx"); /* harmony import */ var _field_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./field.jsx */ "./src/field.jsx"); /***/ }), /***/ "./node_modules/braintree-web/dist/browser/client.js": /*!***********************************************************!*\ !*** ./node_modules/braintree-web/dist/browser/client.js ***! \***********************************************************/ /***/ ((module) => { (function(f){if(true){module.exports=f()}else { var g; }})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=undefined;if(!f&&c)return require(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=undefined,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(_dereq_,module,exports){ "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PromiseGlobal = void 0; var promise_polyfill_1 = __importDefault(_dereq_("promise-polyfill")); var PromiseGlobal = // eslint-disable-next-line no-undef typeof Promise !== "undefined" ? Promise : promise_polyfill_1.default; exports.PromiseGlobal = PromiseGlobal; },{"promise-polyfill":15}],2:[function(_dereq_,module,exports){ "use strict"; var promise_1 = _dereq_("./lib/promise"); var scriptPromiseCache = {}; function loadScript(options) { var scriptLoadPromise; var stringifiedOptions = JSON.stringify(options); if (!options.forceScriptReload) { scriptLoadPromise = scriptPromiseCache[stringifiedOptions]; if (scriptLoadPromise) { return scriptLoadPromise; } } var script = document.createElement("script"); var attrs = options.dataAttributes || {}; var container = options.container || document.head; script.src = options.src; script.id = options.id || ""; script.async = true; if (options.crossorigin) { script.setAttribute("crossorigin", "" + options.crossorigin); } Object.keys(attrs).forEach(function (key) { script.setAttribute("data-" + key, "" + attrs[key]); }); scriptLoadPromise = new promise_1.PromiseGlobal(function (resolve, reject) { script.addEventListener("load", function () { resolve(script); }); script.addEventListener("error", function () { reject(new Error(options.src + " failed to load.")); }); script.addEventListener("abort", function () { reject(new Error(options.src + " has aborted.")); }); container.appendChild(script); }); scriptPromiseCache[stringifiedOptions] = scriptLoadPromise; return scriptLoadPromise; } loadScript.clearCache = function () { scriptPromiseCache = {}; }; module.exports = loadScript; },{"./lib/promise":1}],3:[function(_dereq_,module,exports){ module.exports = _dereq_("./dist/load-script"); },{"./dist/load-script":2}],4:[function(_dereq_,module,exports){ "use strict"; var isIE11 = _dereq_("./is-ie11"); module.exports = function isIE(ua) { ua = ua || window.navigator.userAgent; return ua.indexOf("MSIE") !== -1 || isIE11(ua); }; },{"./is-ie11":5}],5:[function(_dereq_,module,exports){ "use strict"; module.exports = function isIe11(ua) { ua = ua || window.navigator.userAgent; return ua.indexOf("Trident/7") !== -1; }; },{}],6:[function(_dereq_,module,exports){ "use strict"; module.exports = function isIe9(ua) { ua = ua || window.navigator.userAgent; return ua.indexOf("MSIE 9") !== -1; }; },{}],7:[function(_dereq_,module,exports){ module.exports = _dereq_("./dist/is-ie"); },{"./dist/is-ie":4}],8:[function(_dereq_,module,exports){ module.exports = _dereq_("./dist/is-ie9"); },{"./dist/is-ie9":6}],9:[function(_dereq_,module,exports){ "use strict"; var GlobalPromise = (typeof Promise !== "undefined" ? Promise // eslint-disable-line no-undef : null); var ExtendedPromise = /** @class */ (function () { function ExtendedPromise(options) { var _this = this; if (typeof options === "function") { this._promise = new ExtendedPromise.Promise(options); return; } this._promise = new ExtendedPromise.Promise(function (resolve, reject) { _this._resolveFunction = resolve; _this._rejectFunction = reject; }); options = options || {}; this._onResolve = options.onResolve || ExtendedPromise.defaultOnResolve; this._onReject = options.onReject || ExtendedPromise.defaultOnReject; if (ExtendedPromise.shouldCatchExceptions(options)) { this._promise.catch(function () { // prevents unhandled promise rejection warning // in the console for extended promises that // that catch the error in an asynchronous manner }); } this._resetState(); } ExtendedPromise.defaultOnResolve = function (result) { return ExtendedPromise.Promise.resolve(result); }; ExtendedPromise.defaultOnReject = function (err) { return ExtendedPromise.Promise.reject(err); }; ExtendedPromise.setPromise = function (PromiseClass) { ExtendedPromise.Promise = PromiseClass; }; ExtendedPromise.shouldCatchExceptions = function (options) { if (options.hasOwnProperty("suppressUnhandledPromiseMessage")) { return Boolean(options.suppressUnhandledPromiseMessage); } return Boolean(ExtendedPromise.suppressUnhandledPromiseMessage); }; // start Promise methods documented in: // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#Methods ExtendedPromise.all = function (args) { return ExtendedPromise.Promise.all(args); }; ExtendedPromise.allSettled = function (args) { return ExtendedPromise.Promise.allSettled(args); }; ExtendedPromise.race = function (args) { return ExtendedPromise.Promise.race(args); }; ExtendedPromise.reject = function (arg) { return ExtendedPromise.Promise.reject(arg); }; ExtendedPromise.resolve = function (arg) { return ExtendedPromise.Promise.resolve(arg); }; ExtendedPromise.prototype.then = function () { var _a; var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return (_a = this._promise).then.apply(_a, args); }; ExtendedPromise.prototype.catch = function () { var _a; var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return (_a = this._promise).catch.apply(_a, args); }; ExtendedPromise.prototype.resolve = function (arg) { var _this = this; if (this.isFulfilled) { return this; } this._setResolved(); ExtendedPromise.Promise.resolve() .then(function () { return _this._onResolve(arg); }) .then(function (argForResolveFunction) { _this._resolveFunction(argForResolveFunction); }) .catch(function (err) { _this._resetState(); _this.reject(err); }); return this; }; ExtendedPromise.prototype.reject = function (arg) { var _this = this; if (this.isFulfilled) { return this; } this._setRejected(); ExtendedPromise.Promise.resolve() .then(function () { return _this._onReject(arg); }) .then(function (result) { _this._setResolved(); _this._resolveFunction(result); }) .catch(function (err) { return _this._rejectFunction(err); }); return this; }; ExtendedPromise.prototype._resetState = function () { this.isFulfilled = false; this.isResolved = false; this.isRejected = false; }; ExtendedPromise.prototype._setResolved = function () { this.isFulfilled = true; this.isResolved = true; this.isRejected = false; }; ExtendedPromise.prototype._setRejected = function () { this.isFulfilled = true; this.isResolved = false; this.isRejected = true; }; ExtendedPromise.Promise = GlobalPromise; return ExtendedPromise; }()); module.exports = ExtendedPromise; },{}],10:[function(_dereq_,module,exports){ 'use strict'; function uuid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0; var v = c === 'x' ? r : r & 0x3 | 0x8; return v.toString(16); }); } module.exports = uuid; },{}],11:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function deferred(fn) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } setTimeout(function () { try { fn.apply(void 0, args); } catch (err) { /* eslint-disable no-console */ console.log("Error in callback function"); console.log(err); /* eslint-enable no-console */ } }, 1); }; } exports.deferred = deferred; },{}],12:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function once(fn) { var called = false; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (!called) { called = true; fn.apply(void 0, args); } }; } exports.once = once; },{}],13:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable consistent-return */ function promiseOrCallback(promise, callback) { if (!callback) { return promise; } promise.then(function (data) { return callback(null, data); }).catch(function (err) { return callback(err); }); } exports.promiseOrCallback = promiseOrCallback; },{}],14:[function(_dereq_,module,exports){ "use strict"; var deferred_1 = _dereq_("./lib/deferred"); var once_1 = _dereq_("./lib/once"); var promise_or_callback_1 = _dereq_("./lib/promise-or-callback"); function wrapPromise(fn) { // eslint-disable-next-line @typescript-eslint/no-explicit-any return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var callback; var lastArg = args[args.length - 1]; if (typeof lastArg === "function") { callback = args.pop(); callback = once_1.once(deferred_1.deferred(callback)); } // I know, I know, this looks bad. But it's a quirk of the library that // we need to allow passing the this context to the original function // eslint-disable-next-line @typescript-eslint/ban-ts-ignore // @ts-ignore: this has an implicit any return promise_or_callback_1.promiseOrCallback(fn.apply(this, args), callback); // eslint-disable-line no-invalid-this }; } wrapPromise.wrapPrototype = function (target, options) { if (options === void 0) { options = {}; } var ignoreMethods = options.ignoreMethods || []; var includePrivateMethods = options.transformPrivateMethods === true; var methods = Object.getOwnPropertyNames(target.prototype).filter(function (method) { var isNotPrivateMethod; var isNonConstructorFunction = method !== "constructor" && typeof target.prototype[method] === "function"; var isNotAnIgnoredMethod = ignoreMethods.indexOf(method) === -1; if (includePrivateMethods) { isNotPrivateMethod = true; } else { isNotPrivateMethod = method.charAt(0) !== "_"; } return (isNonConstructorFunction && isNotPrivateMethod && isNotAnIgnoredMethod); }); methods.forEach(function (method) { var original = target.prototype[method]; target.prototype[method] = wrapPromise(original); }); return target; }; module.exports = wrapPromise; },{"./lib/deferred":11,"./lib/once":12,"./lib/promise-or-callback":13}],15:[function(_dereq_,module,exports){ 'use strict'; /** * @this {Promise} */ function finallyConstructor(callback) { var constructor = this.constructor; return this.then( function(value) { // @ts-ignore return constructor.resolve(callback()).then(function() { return value; }); }, function(reason) { // @ts-ignore return constructor.resolve(callback()).then(function() { // @ts-ignore return constructor.reject(reason); }); } ); } function allSettled(arr) { var P = this; return new P(function(resolve, reject) { if (!(arr && typeof arr.length !== 'undefined')) { return reject( new TypeError( typeof arr + ' ' + arr + ' is not iterable(cannot read property Symbol(Symbol.iterator))' ) ); } var args = Array.prototype.slice.call(arr); if (args.length === 0) return resolve([]); var remaining = args.length; function res(i, val) { if (val && (typeof val === 'object' || typeof val === 'function')) { var then = val.then; if (typeof then === 'function') { then.call( val, function(val) { res(i, val); }, function(e) { args[i] = { status: 'rejected', reason: e }; if (--remaining === 0) { resolve(args); } } ); return; } } args[i] = { status: 'fulfilled', value: val }; if (--remaining === 0) { resolve(args); } } for (var i = 0; i < args.length; i++) { res(i, args[i]); } }); } // Store setTimeout reference so promise-polyfill will be unaffected by // other code modifying setTimeout (like sinon.useFakeTimers()) var setTimeoutFunc = setTimeout; function isArray(x) { return Boolean(x && typeof x.length !== 'undefined'); } function noop() {} // Polyfill for Function.prototype.bind function bind(fn, thisArg) { return function() { fn.apply(thisArg, arguments); }; } /** * @constructor * @param {Function} fn */ function Promise(fn) { if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new'); if (typeof fn !== 'function') throw new TypeError('not a function'); /** @type {!number} */ this._state = 0; /** @type {!boolean} */ this._handled = false; /** @type {Promise|undefined} */ this._value = undefined; /** @type {!Array<!Function>} */ this._deferreds = []; doResolve(fn, this); } function handle(self, deferred) { while (self._state === 3) { self = self._value; } if (self._state === 0) { self._deferreds.push(deferred); return; } self._handled = true; Promise._immediateFn(function() { var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; if (cb === null) { (self._state === 1 ? resolve : reject)(deferred.promise, self._value); return; } var ret; try { ret = cb(self._value); } catch (e) { reject(deferred.promise, e); return; } resolve(deferred.promise, ret); }); } function resolve(self, newValue) { try { // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); if ( newValue && (typeof newValue === 'object' || typeof newValue === 'function') ) { var then = newValue.then; if (newValue instanceof Promise) { self._state = 3; self._value = newValue; finale(self); return; } else if (typeof then === 'function') { doResolve(bind(then, newValue), self); return; } } self._state = 1; self._value = newValue; finale(self); } catch (e) { reject(self, e); } } function reject(self, newValue) { self._state = 2; self._value = newValue; finale(self); } function finale(self) { if (self._state === 2 && self._deferreds.length === 0) { Promise._immediateFn(function() { if (!self._handled) { Promise._unhandledRejectionFn(self._value); } }); } for (var i = 0, len = self._deferreds.length; i < len; i++) { handle(self, self._deferreds[i]); } self._deferreds = null; } /** * @constructor */ function Handler(onFulfilled, onRejected, promise) { this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; this.onRejected = typeof onRejected === 'function' ? onRejected : null; this.promise = promise; } /** * Take a potentially misbehaving resolver function and make sure * onFulfilled and onRejected are only called once. * * Makes no guarantees about asynchrony. */ function doResolve(fn, self) { var done = false; try { fn( function(value) { if (done) return; done = true; resolve(self, value); }, function(reason) { if (done) return; done = true; reject(self, reason); } ); } catch (ex) { if (done) return; done = true; reject(self, ex); } } Promise.prototype['catch'] = function(onRejected) { return this.then(null, onRejected); }; Promise.prototype.then = function(onFulfilled, onRejected) { // @ts-ignore var prom = new this.constructor(noop); handle(this, new Handler(onFulfilled, onRejected, prom)); return prom; }; Promise.prototype['finally'] = finallyConstructor; Promise.all = function(arr) { return new Promise(function(resolve, reject) { if (!isArray(arr)) { return reject(new TypeError('Promise.all accepts an array')); } var args = Array.prototype.slice.call(arr); if (args.length === 0) return resolve([]); var remaining = args.length; function res(i, val) { try { if (val && (typeof val === 'object' || typeof val === 'function')) { var then = val.then; if (typeof then === 'function') { then.call( val, function(val) { res(i, val); }, reject ); return; } } args[i] = val; if (--remaining === 0) { resolve(args); } } catch (ex) { reject(ex); } } for (var i = 0; i < args.length; i++) { res(i, args[i]); } }); }; Promise.allSettled = allSettled; Promise.resolve = function(value) { if (value && typeof value === 'object' && value.constructor === Promise) { return value; } return new Promise(function(resolve) { resolve(value); }); }; Promise.reject = function(value) { return new Promise(function(resolve, reject) { reject(value); }); }; Promise.race = function(arr) { return new Promise(function(resolve, reject) { if (!isArray(arr)) { return reject(new TypeError('Promise.race accepts an array')); } for (var i = 0, len = arr.length; i < len; i++) { Promise.resolve(arr[i]).then(resolve, reject); } }); }; // Use polyfill for setImmediate for performance gains Promise._immediateFn = // @ts-ignore (typeof setImmediate === 'function' && function(fn) { // @ts-ignore setImmediate(fn); }) || function(fn) { setTimeoutFunc(fn, 0); }; Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { if (typeof console !== 'undefined' && console) { console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console } }; module.exports = Promise; },{}],16:[function(_dereq_,module,exports){ "use strict"; var isIe = _dereq_("@braintree/browser-detection/is-ie"); var isIe9 = _dereq_("@braintree/browser-detection/is-ie9"); module.exports = { isIe: isIe, isIe9: isIe9, }; },{"@braintree/browser-detection/is-ie":7,"@braintree/browser-detection/is-ie9":8}],17:[function(_dereq_,module,exports){ "use strict"; var BRAINTREE_VERSION = _dereq_("./constants").BRAINTREE_VERSION; var GraphQL = _dereq_("./request/graphql"); var request = _dereq_("./request"); var isVerifiedDomain = _dereq_("../lib/is-verified-domain"); var BraintreeError = _dereq_("../lib/braintree-error"); var convertToBraintreeError = _dereq_("../lib/convert-to-braintree-error"); var getGatewayConfiguration = _dereq_("./get-configuration").getConfiguration; var createAuthorizationData = _dereq_("../lib/create-authorization-data"); var addMetadata = _dereq_("../lib/add-metadata"); var Promise = _dereq_("../lib/promise"); var wrapPromise = _dereq_("@braintree/wrap-promise"); var once = _dereq_("../lib/once"); var deferred = _dereq_("../lib/deferred"); var assign = _dereq_("../lib/assign").assign; var analytics = _dereq_("../lib/analytics"); var errors = _dereq_("./errors"); var VERSION = _dereq_("../lib/constants").VERSION; var GRAPHQL_URLS = _dereq_("../lib/constants").GRAPHQL_URLS; var methods = _dereq_("../lib/methods"); var convertMethodsToError = _dereq_("../lib/convert-methods-to-error"); var assets = _dereq_("../lib/assets"); var FRAUDNET_FNCLS = _dereq_("../lib/constants").FRAUDNET_FNCLS; var FRAUDNET_SOURCE = _dereq_("../lib/constants").FRAUDNET_SOURCE; var FRAUDNET_URL = _dereq_("../lib/constants").FRAUDNET_URL; var cachedClients = {}; /** * This object is returned by {@link Client#getConfiguration|getConfiguration}. This information is used extensively by other Braintree modules to properly configure themselves. * @typedef {object} Client~configuration * @property {object} client The braintree-web/client parameters. * @property {string} client.authorization A tokenizationKey or clientToken. * @property {object} gatewayConfiguration Gateway-supplied configuration. * @property {object} analyticsMetadata Analytics-specific data. * @property {string} analyticsMetadata.sessionId Uniquely identifies a browsing session. * @property {string} analyticsMetadata.sdkVersion The braintree.js version. * @property {string} analyticsMetadata.merchantAppId Identifies the merchant's web app. */ /** * @class * @param {Client~configuration} configuration Options * @description <strong>Do not use this constructor directly. Use {@link module:braintree-web/client.create|braintree.client.create} instead.</strong> * @classdesc This class is required by many other Braintree components. It serves as the base API layer that communicates with our servers. It is also capable of being used to formulate direct calls to our servers, such as direct credit card tokenization. See {@link Client#request}. */ function Client(configuration) { var configurationJSON, gatewayConfiguration; configuration = configuration || {}; configurationJSON = JSON.stringify(configuration); gatewayConfiguration = configuration.gatewayConfiguration; if (!gatewayConfiguration) { throw new BraintreeError(errors.CLIENT_MISSING_GATEWAY_CONFIGURATION); } ["assetsUrl", "clientApiUrl", "configUrl"].forEach(function (property) { if ( property in gatewayConfiguration && !isVerifiedDomain(gatewayConfiguration[property]) ) { throw new BraintreeError({ type: errors.CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN.type, code: errors.CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN.code, message: property + " property is on an invalid domain.", }); } }); /** * Returns a copy of the configuration values. * @public * @returns {Client~configuration} configuration */ this.getConfiguration = function () { return JSON.parse(configurationJSON); }; this._request = request; this._configuration = this.getConfiguration(); this._clientApiBaseUrl = gatewayConfiguration.clientApiUrl + "/v1/"; if (gatewayConfiguration.graphQL) { if (!isVerifiedDomain(gatewayConfiguration.graphQL.url)) { throw new BraintreeError({ type: errors.CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN.type, code: errors.CLIENT_GATEWAY_CONFIGURATION_INVALID_DOMAIN.code, message: "graphQL.url property is on an invalid domain.", }); } this._graphQL = new GraphQL({ graphQL: gatewayConfiguration.graphQL, }); } } Client.initialize = function (options) { var clientInstance, authData; var promise = cachedClients[options.authorization]; if (promise) { analytics.sendEvent(promise, "custom.client.load.cached"); return promise; } try { authData = createAuthorizationData(options.authorization); } catch (err) { return Promise.reject( new BraintreeError(errors.CLIENT_INVALID_AUTHORIZATION) ); } promise = getGatewayConfiguration(authData).then(function (configuration) { if (options.debug) { configuration.isDebug = true; } configuration.authorization = options.authorization; clientInstance = new Client(configuration); return clientInstance; }); cachedClients[options.authorization] = promise; analytics.sendEvent(promise, "custom.client.load.initialized"); return promise .then(function (client) { analytics.sendEvent(clientInstance, "custom.client.load.succeeded"); return client; }) .catch(function (err) { delete cachedClients[options.authorization]; return Promise.reject(err); }); }; // Primarily used for testing the client initalization call Client.clearCache = function () { cachedClients = {}; }; Client.prototype._findOrCreateFraudnetJSON = function (clientMetadataId) { var el = document.querySelector('script[fncls="' + FRAUDNET_FNCLS + '"]'); var config, additionalData, authorizationFingerprint, parameters; if (!el) { el = document.body.appendChild(document.createElement("script")); el.type = "application/json"; el.setAttribute("fncls", FRAUDNET_FNCLS); } config = this.getConfiguration(); additionalData = { rda_tenant: "bt_card", // eslint-disable-line camelcase mid: config.gatewayConfiguration.merchantId, }; authorizationFingerprint = config.authorizationFingerprint; if (authorizationFingerprint) { authorizationFingerprint.split("&").forEach(function (pieces) { var component = pieces.split("="); if (component[0] === "customer_id" && component.length > 1) { additionalData.cid = component[1]; } }); } parameters = { f: clientMetadataId.substr(0, 32), fp: additionalData, bu: false, s: FRAUDNET_SOURCE, }; el.text = JSON.stringify(parameters); }; /** * Used by other modules to formulate all network requests to the Braintree gateway. It is also capable of being used directly from your own form to tokenize credit card information. However, be sure to satisfy PCI compliance if you use direct card tokenization. * @public * @param {object} options Request options: * @param {string} options.method HTTP method, e.g. "get" or "post". * @param {string} options.endpoint Endpoint path, e.g. "payment_methods". * @param {object} options.data Data to send with the request. * @param {number} [options.timeout=60000] Set a timeout (in milliseconds) for the request. * @param {callback} [callback] The second argument, <code>data</code>, is the returned server data. * @example * <caption>Direct Credit Card Tokenization</caption> * var createClient = require('braintree-web/client').create; * * createClient({ * authorization: CLIENT_AUTHORIZATION * }, function (createErr, clientInstance