var dwollaCards = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { /*** IMPORTS FROM imports-loader ***/ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var __VERSION__ = '1.0.0'; var __BUILD_TAG__ = '1'; window.dwolla = { config: __webpack_require__(1), configure: __webpack_require__(2), cards: __webpack_require__(3), version: __VERSION__, buildTag: __BUILD_TAG__ }; exports['default'] = window.dwolla; module.exports = exports['default']; /***/ }, /* 1 */ /***/ function(module, exports) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); exports['default'] = { dwollaUrl: 'https://www.dwolla.com', apiUrl: 'https://api.dwolla.com', finixEnv: 'live' }; module.exports = exports['default']; /***/ }, /* 2 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _config = __webpack_require__(1); var _config2 = _interopRequireDefault(_config); function configure(fn) { if (fn === 'sandbox') fn = 'uat'; if (typeof fn === 'string') configure.CONFIGS[fn.toLowerCase()](_config2['default']);else fn(_config2['default']); } configure.CONFIGS = { uat: function uat(cfg) { cfg.dwollaUrl = 'https://sandbox.dwolla.com'; cfg.apiUrl = 'https://api-sandbox.dwolla.com'; cfg.finixEnv = 'sandbox'; }, prod: function prod(cfg) { cfg.dwollaUrl = 'https://www.dwolla.com'; cfg.apiUrl = 'https://api.dwolla.com'; cfg.finixEnv = 'live'; } }; exports['default'] = configure; module.exports = exports['default']; /***/ }, /* 3 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _api = __webpack_require__(4); var _api2 = _interopRequireDefault(_api); var _config = __webpack_require__(1); var _config2 = _interopRequireDefault(_config); var _cardsValidator = __webpack_require__(11); var _cardsValidator2 = _interopRequireDefault(_cardsValidator); function hex2String(hex) { var string = ''; for (var i = 0; i < hex.length; i += 2) { string += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); } return string; } function addFinixForm(encodedToken, callback, styles) { var script = document.createElement('script'); var authToken = hex2String(encodedToken).split(":")[0]; var applicationId = hex2String(encodedToken).split(":")[1]; script.type = "text/javascript"; script.onload = function () { var formState = {}; var form = window.PaymentForm.card(function (state, binInformation) { formState = state; // just for debugging: if (state === undefined) { document.getElementById('brand').innerHTML = binInformation.cardBrand; document.getElementById('bin').innerHTML = JSON.stringify(binInformation, null, ' '); } else { document.getElementById('preview').innerHTML = JSON.stringify(state, null, ' '); } }); function defineField(elementId, type, placeholder, validations, styles) { var f = form.field(type, { validations: validations, placeholder: placeholder, styles: styles }); document.getElementById(elementId).appendChild(f); } defineField("field-wrapper-number", "number", 'Card Number', 'cardNumber', styles); defineField("field-wrapper-name", "name", 'Cardholder Name', 'required', styles); defineField("field-wrapper-expiration_date", "expiration_date", 'MM/YYYY', 'cardExpiry', styles); defineField("field-wrapper-security_code", "security_code", 'CVV', 'cardCVC', styles); defineField("field-wrapper-address_line1", "address.line1", 'Street Address', 'required', styles); defineField("field-wrapper-address_line2", "address.line2", 'Address 2', '', styles); defineField("field-wrapper-address_region", "address.region", 'State', 'required', styles); defineField("field-wrapper-address_postal_code", "address.postal_code", 'Zip', 'required', styles); defineField("field-wrapper-address_city", "address.city", 'City', 'required', styles); function submitForm() { document.getElementById('cards-error-message').style.display = 'none'; var cardNickname = document.getElementById("card-name-input").value; var errorMessage = _cardsValidator2['default'].validate(formState, cardNickname); if (errorMessage) { document.getElementById('cards-error-message').textContent = errorMessage; document.getElementById('cards-error-message').style.display = ''; return; } form.submit(_config2['default'].finixEnv, applicationId, function (err, res) { if (err) { console.log("There was an error"); } else { var token = res.data.id; var body = { cardName: cardNickname, cardToken: token, cardFingerprint: res.data.fingerprint }; _api2['default'].post(authToken, '/funding-sources', body, callback); } var preview = document.getElementById('preview'); if (preview) preview.innerHTML = JSON.stringify(res, null, ' '); }); } document.getElementById('submit-form-button').addEventListener('click', function (e) { e.preventDefault(); submitForm(); }); form.onSubmit(submitForm); // for when the user hits 'enter' instead of clicking the button }; script.src = "https://forms.finixpymnts.com/finix.js"; document.head.appendChild(script); } function addStylesheets(stylesheets) { if (stylesheets && stylesheets.length > 0) { stylesheets.forEach(function (href) { var link = document.createElement('link'); link.setAttribute('rel', 'stylesheet'); link.setAttribute('type', 'text/css'); link.setAttribute('href', href); document.head.appendChild(link); }); } } function addFakeFields(container, styles) { container.innerHTML = '\n
\n '; } function getContainerOrThrow(containerId) { var container = document.getElementById(containerId); if (container === null) throw new Error('[dwolla.cards.start] Element not found with id: ' + containerId);else return container; } function throwIfTokenInvalid(token) { if (typeof token !== 'string' || hex2String(token).split(":").length !== 2) throw new Error('[dwolla.cards.start] Invalid token: ' + token); } function throwIfCallbackInvalid(callback) { if (typeof callback !== 'function') throw new Error('[dwolla.cards.start] Invalid callback: ' + callback); } var start = function start(containerId, token) { var opts = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; return function (callback) { var container = getContainerOrThrow(containerId); throwIfTokenInvalid(token); throwIfCallbackInvalid(callback); addFakeFields(container, opts.styles); addStylesheets(opts.stylesheets); addFinixForm(token, callback, opts.styles); }; }; var cards = { start: start }; exports['default'] = cards; module.exports = exports['default']; /***/ }, /* 4 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _xhr = __webpack_require__(5); var _xhr2 = _interopRequireDefault(_xhr); var _config = __webpack_require__(1); var _config2 = _interopRequireDefault(_config); var DWOLLA_CONTENT_TYPE = 'application/vnd.dwolla.v1.hal+json', UNKNOWN_ERROR = { code: 'UnknownError', message: 'Could not connect to server.' }; var api = { post: function post(token, url, body, callback) { var fullUrl = _config2['default'].apiUrl + url, options = { headers: { Authorization: 'Bearer ' + token, Accept: DWOLLA_CONTENT_TYPE, 'Content-Type': DWOLLA_CONTENT_TYPE }, body: JSON.stringify(body), useXDR: true }; _xhr2['default'].post(fullUrl, options, responseHandler(callback)); } }; function responseHandler(callback) { return function (err, res, body) { body = tryParseJson(body); if (res.statusCode >= 400) callback(body);else if (res.statusCode === 201) callback(null, transformCreated(res));else if (res.statusCode >= 200) callback(null, body);else callback(UNKNOWN_ERROR); }; } function transformCreated(res) { return { _links: { 'funding-source': { href: res.headers.location } } }; } function tryParseJson(body) { try { body = JSON.parse(body); } catch (e) { if (true) console.warn('Could not parse json: ' + body); } return body; } exports['default'] = api; module.exports = exports['default']; /***/ }, /* 5 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var window = __webpack_require__(6); var once = __webpack_require__(7); var isFunction = __webpack_require__(8); var parseHeaders = __webpack_require__(9); var xtend = __webpack_require__(10); module.exports = createXHR; createXHR.XMLHttpRequest = window.XMLHttpRequest || noop; createXHR.XDomainRequest = "withCredentials" in new createXHR.XMLHttpRequest() ? createXHR.XMLHttpRequest : window.XDomainRequest; forEachArray(["get", "put", "post", "patch", "head", "delete"], function (method) { createXHR[method === "delete" ? "del" : method] = function (uri, options, callback) { options = initParams(uri, options, callback); options.method = method.toUpperCase(); return _createXHR(options); }; }); function forEachArray(array, iterator) { for (var i = 0; i < array.length; i++) { iterator(array[i]); } } function isEmpty(obj) { for (var i in obj) { if (obj.hasOwnProperty(i)) return false; } return true; } function initParams(uri, options, callback) { var params = uri; if (isFunction(options)) { callback = options; if (typeof uri === "string") { params = { uri: uri }; } } else { params = xtend(options, { uri: uri }); } params.callback = callback; return params; } function createXHR(uri, options, callback) { options = initParams(uri, options, callback); return _createXHR(options); } function _createXHR(options) { var callback = options.callback; if (typeof callback === "undefined") { throw new Error("callback argument missing"); } callback = once(callback); function readystatechange() { if (xhr.readyState === 4) { loadFunc(); } } function getBody() { // Chrome with requestType=blob throws errors arround when even testing access to responseText var body = undefined; if (xhr.response) { body = xhr.response; } else if (xhr.responseType === "text" || !xhr.responseType) { body = xhr.responseText || xhr.responseXML; } if (isJson) { try { body = JSON.parse(body); } catch (e) {} } return body; } var failureResponse = { body: undefined, headers: {}, statusCode: 0, method: method, url: uri, rawRequest: xhr }; function errorFunc(evt) { clearTimeout(timeoutTimer); if (!(evt instanceof Error)) { evt = new Error("" + (evt || "Unknown XMLHttpRequest Error")); } evt.statusCode = 0; callback(evt, failureResponse); } // will load the data & process the response in a special response object function loadFunc() { if (aborted) return; var status; clearTimeout(timeoutTimer); if (options.useXDR && xhr.status === undefined) { //IE8 CORS GET successful response doesn't have a status field, but body is fine status = 200; } else { status = xhr.status === 1223 ? 204 : xhr.status; } var response = failureResponse; var err = null; if (status !== 0) { response = { body: getBody(), statusCode: status, method: method, headers: {}, url: uri, rawRequest: xhr }; if (xhr.getAllResponseHeaders) { //remember xhr can in fact be XDR for CORS in IE response.headers = parseHeaders(xhr.getAllResponseHeaders()); } } else { err = new Error("Internal XMLHttpRequest Error"); } callback(err, response, response.body); } var xhr = options.xhr || null; if (!xhr) { if (options.cors || options.useXDR) { xhr = new createXHR.XDomainRequest(); } else { xhr = new createXHR.XMLHttpRequest(); } } var key; var aborted; var uri = xhr.url = options.uri || options.url; var method = xhr.method = options.method || "GET"; var body = options.body || options.data || null; var headers = xhr.headers = options.headers || {}; var sync = !!options.sync; var isJson = false; var timeoutTimer; if ("json" in options) { isJson = true; headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json"); //Don't override existing accept header declared by user if (method !== "GET" && method !== "HEAD") { headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json"); //Don't override existing accept header declared by user body = JSON.stringify(options.json); } } xhr.onreadystatechange = readystatechange; xhr.onload = loadFunc; xhr.onerror = errorFunc; // IE9 must have onprogress be set to a unique function. xhr.onprogress = function () { // IE must die }; xhr.ontimeout = errorFunc; xhr.open(method, uri, !sync, options.username, options.password); //has to be after open if (!sync) { xhr.withCredentials = !!options.withCredentials; } // Cannot set timeout with sync request // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent if (!sync && options.timeout > 0) { timeoutTimer = setTimeout(function () { aborted = true; //IE9 may still call readystatechange xhr.abort("timeout"); var e = new Error("XMLHttpRequest timeout"); e.code = "ETIMEDOUT"; errorFunc(e); }, options.timeout); } if (xhr.setRequestHeader) { for (key in headers) { if (headers.hasOwnProperty(key)) { xhr.setRequestHeader(key, headers[key]); } } } else if (options.headers && !isEmpty(options.headers)) { throw new Error("Headers cannot be set on an XDomainRequest object"); } if ("responseType" in options) { xhr.responseType = options.responseType; } if ("beforeSend" in options && typeof options.beforeSend === "function") { options.beforeSend(xhr); } xhr.send(body); return xhr; } function noop() {} /***/ }, /* 6 */ /***/ function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {"use strict"; var win; if (typeof window !== "undefined") { win = window; } else if (typeof global !== "undefined") { win = global; } else if (typeof self !== "undefined") { win = self; } else { win = {}; } module.exports = win; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 7 */ /***/ function(module, exports) { 'use strict'; module.exports = once; once.proto = once(function () { Object.defineProperty(Function.prototype, 'once', { value: function value() { return once(this); }, configurable: true }); }); function once(fn) { var called = false; return function () { if (called) return; called = true; return fn.apply(this, arguments); }; } /***/ }, /* 8 */ /***/ function(module, exports) { 'use strict'; module.exports = isFunction; var toString = Object.prototype.toString; function isFunction(fn) { if (!fn) { return false; } var string = toString.call(fn); return string === '[object Function]' || typeof fn === 'function' && string !== '[object RegExp]' || typeof window !== 'undefined' && ( // IE8 and below fn === window.setTimeout || fn === window.alert || fn === window.confirm || fn === window.prompt); }; /***/ }, /* 9 */ /***/ function(module, exports) { 'use strict'; var trim = function trim(string) { return string.replace(/^\s+|\s+$/g, ''); }, isArray = function isArray(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; module.exports = function (headers) { if (!headers) return {}; var result = {}; var headersArr = trim(headers).split('\n'); for (var i = 0; i < headersArr.length; i++) { var row = headersArr[i]; var index = row.indexOf(':'), key = trim(row.slice(0, index)).toLowerCase(), value = trim(row.slice(index + 1)); if (typeof result[key] === 'undefined') { result[key] = value; } else if (isArray(result[key])) { result[key].push(value); } else { result[key] = [result[key], value]; } } return result; }; /***/ }, /* 10 */ /***/ function(module, exports) { "use strict"; module.exports = extend; var hasOwnProperty = Object.prototype.hasOwnProperty; function extend() { var target = {}; for (var i = 0; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; } /***/ }, /* 11 */ /***/ function(module, exports) { 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var errorMessageMap = { 'number': 'Invalid card number', 'expiration_date': 'Invalid expiration date', 'security_code': 'Invalid CVV', 'name': 'Cardholder Name is required', 'address.line1': 'Street Address is required', 'address.region': 'State is required', 'address.city': 'City is required', 'address.postal_code': 'Zip code is required' }; var cardNicknameRequired = 'Card Nickname is required'; var validator = { validate: function validate(formState, cardNickname) { for (var field in errorMessageMap) { if (formState[field].errorMessages && formState[field].errorMessages.length > 0) { return errorMessageMap[field]; } } if (!cardNickname || cardNickname.length === 0) { return cardNicknameRequired; } return null; } }; exports['default'] = validator; module.exports = exports['default']; /***/ } /******/ ]); //# sourceMappingURL=dwolla-cards.js.map