From 9096d34186d5a5148f06c07854b21d6cc8035e96 Mon Sep 17 00:00:00 2001 From: Matt Zabriskie Date: Wed, 27 Aug 2014 01:06:19 -0600 Subject: [PATCH] Breaking up complexity of main axios file --- dist/axios.amd.js | 378 +++++++++++++++++++++++++------------ dist/axios.amd.min.js | 340 ++++++++++++++++++++++----------- dist/axios.js | 361 ++++++++++++++++++++++------------- dist/axios.min.js | 340 ++++++++++++++++++++++----------- lib/axios.js | 160 ++++++---------- lib/defaults.js | 42 +++++ lib/forEach.js | 34 ++++ lib/merge.js | 28 +++ lib/transformData.js | 23 +++ test/unit/forEach.js | 33 ++++ test/unit/merge.js | 28 +++ test/unit/transformData.js | 31 +++ 12 files changed, 1233 insertions(+), 565 deletions(-) create mode 100644 lib/defaults.js create mode 100644 lib/forEach.js create mode 100644 lib/merge.js create mode 100644 lib/transformData.js create mode 100644 test/unit/forEach.js create mode 100644 test/unit/merge.js create mode 100644 test/unit/transformData.js diff --git a/dist/axios.amd.js b/dist/axios.amd.js index b9966d3553..1c3562949a 100644 --- a/dist/axios.amd.js +++ b/dist/axios.amd.js @@ -50,63 +50,80 @@ define("axios", [], function() { return /******/ (function(modules) { // webpack /* 1 */ /***/ function(module, exports, __webpack_require__) { - var Promise = __webpack_require__(2).Promise; + var Promise = __webpack_require__(6).Promise; + var defaults = __webpack_require__(2); + var forEach = __webpack_require__(3); + var merge = __webpack_require__(4); + var transformData = __webpack_require__(5); - function axios(options) { + var axios = module.exports = function axios(options) { options = merge({ - method: 'get' + method: 'get', + transformRequest: defaults.transformRequest, + transformResponse: defaults.transformResponse }, options); var promise = new Promise(function (resolve, reject) { - var request = new(XMLHttpRequest || ActiveXObject)('MSXML2.XMLHTTP.3.0'); - - function onload() { - if (request.status >= 200 && request.status < 300) { - resolve(parse(request.responseText)); - } else { - onerror(); - } - } - - function onerror() { - reject(new Error('Can\'t connect to ' + JSON.stringify(options.url))); - } + var request = new(XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP'); + var data = transformData(options.data, options.headers, options.transformRequest); + + // Open request and listen for ready state + request.open(options.method, options.url, true); + request.onreadystatechange = function () { + if (request && request.readyState === 4) { + // Prepare the response + var response = { + data: transformData(request.responseText, options.headers, options.transformResponse), + status: request.status, + headers: headers, + config: options + }; - try { - request.open(options.method, options.url, true); - request.onreadystatechange = function () { - if (request.readyState === 4) { - onload(); + // Resolve or reject the Promise based on the status + if (request.status >= 200 && request.status < 300) { + resolve(response); + } else { + reject(response); } - }; - - request.onload = request.load = onload; - request.onerror = request.error = onerror; - var headers = merge( - defaults.headers.common, - defaults.headers[options.method] || {}, - options.headers || {} - ); + // Clean up request + request = null; + } + }; - for (var key in headers) { - request.setRequestHeader(key, headers[key]); + // Merge headers and add to request + var headers = merge( + defaults.headers.common, + defaults.headers[options.method] || {}, + options.headers || {} + ); + + forEach(headers, function (val, key) { + // Remove Content-Type if data is undefined + if (typeof data === 'undefined' && + key.toLowerCase() === 'content-type') { + delete headers[key]; } - } catch (e) { - reject(e); - } + // Otherwise add header to the request + else { + request.setRequestHeader(key, val); + } + }); - request.send(options.data || null); + // Send the request + request.send(data); }); - promise.success = function (fn) { + // Provide alias for success + promise.success = function success(fn) { promise.then(function(response) { fn(response); }); return promise; }; - promise.error = function(fn) { + // Provide alias for error + promise.error = function error(fn) { promise.then(null, function(response) { fn(response); }); @@ -114,43 +131,14 @@ define("axios", [], function() { return /******/ (function(modules) { // webpack }; return promise; - } - - var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'}; - var defaults = axios.defaults = { - headers: { - common: {'Accept': 'application/json, text/plain, */*'}, - patch: merge(CONTENT_TYPE_APPLICATION_JSON), - post: merge(CONTENT_TYPE_APPLICATION_JSON), - put: merge(CONTENT_TYPE_APPLICATION_JSON) - } }; - function parse(response) { - try { - return JSON.parse(response); - } catch(e) { - return response; - } - } - - function merge() { - var result = {}; - forEach(arguments, function (obj) { - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - result[key] = obj[key]; - } - } - }); - return result; - } + // Expose defaults + axios.defaults = defaults; - function forEach(arr, fn) { - for (var i=0, l=arr.length; i= 200 && request.status < 300) { - resolve(parse(request.responseText)); - } else { - onerror(); - } - } - - function onerror() { - reject(new Error('Can\'t connect to ' + JSON.stringify(options.url))); - } + var request = new(XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP'); + var data = transformData(options.data, options.headers, options.transformRequest); + + // Open request and listen for ready state + request.open(options.method, options.url, true); + request.onreadystatechange = function () { + if (request && request.readyState === 4) { + // Prepare the response + var response = { + data: transformData(request.responseText, options.headers, options.transformResponse), + status: request.status, + headers: headers, + config: options + }; - try { - request.open(options.method, options.url, true); - request.onreadystatechange = function () { - if (request.readyState === 4) { - onload(); + // Resolve or reject the Promise based on the status + if (request.status >= 200 && request.status < 300) { + resolve(response); + } else { + reject(response); } - }; - - request.onload = request.load = onload; - request.onerror = request.error = onerror; - var headers = merge( - defaults.headers.common, - defaults.headers[options.method] || {}, - options.headers || {} - ); + // Clean up request + request = null; + } + }; - for (var key in headers) { - request.setRequestHeader(key, headers[key]); + // Merge headers and add to request + var headers = merge( + defaults.headers.common, + defaults.headers[options.method] || {}, + options.headers || {} + ); + + forEach(headers, function (val, key) { + // Remove Content-Type if data is undefined + if (typeof data === 'undefined' && + key.toLowerCase() === 'content-type') { + delete headers[key]; } - } catch (e) { - reject(e); - } + // Otherwise add header to the request + else { + request.setRequestHeader(key, val); + } + }); - request.send(options.data || null); + // Send the request + request.send(data); }); - promise.success = function (fn) { + // Provide alias for success + promise.success = function success(fn) { promise.then(function(response) { fn(response); }); return promise; }; - promise.error = function(fn) { + // Provide alias for error + promise.error = function error(fn) { promise.then(null, function(response) { fn(response); }); @@ -114,43 +131,14 @@ define("axios", [], function() { return /******/ (function(modules) { // webpack }; return promise; - } - - var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'}; - var defaults = axios.defaults = { - headers: { - common: {'Accept': 'application/json, text/plain, */*'}, - patch: merge(CONTENT_TYPE_APPLICATION_JSON), - post: merge(CONTENT_TYPE_APPLICATION_JSON), - put: merge(CONTENT_TYPE_APPLICATION_JSON) - } }; - function parse(response) { - try { - return JSON.parse(response); - } catch(e) { - return response; - } - } + // Expose defaults + axios.defaults = defaults; - function merge() { - var result = {}; - forEach(arguments, function (obj) { - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - result[key] = obj[key]; - } - } - }); - return result; - } - - function forEach(arr, fn) { - for (var i=0, l=arr.length; i= 200 && request.status < 300) { - resolve(transformData(request.responseText, options.headers, options.transformResponse)); - } else { - onerror(); - } - } - - function onerror() { - reject( - parse(request.responseText) || - new Error('Can\'t connect to ' + JSON.stringify(options.url)) - ); - } + var request = new(XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP'); + var data = transformData(options.data, options.headers, options.transformRequest); + + // Open request and listen for ready state + request.open(options.method, options.url, true); + request.onreadystatechange = function () { + if (request && request.readyState === 4) { + // Prepare the response + var response = { + data: transformData(request.responseText, options.headers, options.transformResponse), + status: request.status, + headers: headers, + config: options + }; - try { - request.open(options.method, options.url, true); - request.onreadystatechange = function () { - if (request.readyState === 4) { - onload(); + // Resolve or reject the Promise based on the status + if (request.status >= 200 && request.status < 300) { + resolve(response); + } else { + reject(response); } - }; - - request.onload = request.load = onload; - request.onerror = request.error = onerror; - var headers = merge( - defaults.headers.common, - defaults.headers[options.method] || {}, - options.headers || {} - ); + // Clean up request + request = null; + } + }; - for (var key in headers) { - if (headers.hasOwnProperty(key)) { - request.setRequestHeader(key, headers[key]); - } + // Merge headers and add to request + var headers = merge( + defaults.headers.common, + defaults.headers[options.method] || {}, + options.headers || {} + ); + + forEach(headers, function (val, key) { + // Remove Content-Type if data is undefined + if (typeof data === 'undefined' && + key.toLowerCase() === 'content-type') { + delete headers[key]; } - } catch (e) { - reject(e); - } + // Otherwise add header to the request + else { + request.setRequestHeader(key, val); + } + }); - request.send(transformData(options.data, options.headers, options.transformRequest)); + // Send the request + request.send(data); }); - promise.success = function (fn) { + // Provide alias for success + promise.success = function success(fn) { promise.then(function(response) { fn(response); }); return promise; }; - promise.error = function(fn) { + // Provide alias for error + promise.error = function error(fn) { promise.then(null, function(response) { fn(response); }); @@ -122,63 +132,14 @@ var axios = }; return promise; - } - - var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'}; - var defaults = axios.defaults = { - transformRequest: [function (data) { - return data ? JSON.stringify(data) : null; - }], - - transformResponse: [function (data) { - return parse(data); - }], - - headers: { - common: {'Accept': 'application/json, text/plain, */*'}, - patch: merge(CONTENT_TYPE_APPLICATION_JSON), - post: merge(CONTENT_TYPE_APPLICATION_JSON), - put: merge(CONTENT_TYPE_APPLICATION_JSON) - } }; - function transformData(data, headers, fns) { - if (typeof fns === 'function') { - return fns(data, headers); - } + // Expose defaults + axios.defaults = defaults; - forEach(fns, function (fn) { - data = fn(data, headers); - }); - - return data; - } - - function parse(response) { - try { - return JSON.parse(response); - } catch(e) { - return response; - } - } - - function merge() { - var result = {}; - forEach(arguments, function (obj) { - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - result[key] = obj[key]; - } - } - }); - return result; - } - - function forEach(arr, fn) { - for (var i=0, l=arr.length; i= 200 && request.status < 300) { - resolve(parse(request.responseText)); - } else { - onerror(); - } - } - - function onerror() { - reject(new Error('Can\'t connect to ' + JSON.stringify(options.url))); - } + var request = new(XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP'); + var data = transformData(options.data, options.headers, options.transformRequest); + + // Open request and listen for ready state + request.open(options.method, options.url, true); + request.onreadystatechange = function () { + if (request && request.readyState === 4) { + // Prepare the response + var response = { + data: transformData(request.responseText, options.headers, options.transformResponse), + status: request.status, + headers: headers, + config: options + }; - try { - request.open(options.method, options.url, true); - request.onreadystatechange = function () { - if (request.readyState === 4) { - onload(); + // Resolve or reject the Promise based on the status + if (request.status >= 200 && request.status < 300) { + resolve(response); + } else { + reject(response); } - }; - - request.onload = request.load = onload; - request.onerror = request.error = onerror; - var headers = merge( - defaults.headers.common, - defaults.headers[options.method] || {}, - options.headers || {} - ); + // Clean up request + request = null; + } + }; - for (var key in headers) { - request.setRequestHeader(key, headers[key]); + // Merge headers and add to request + var headers = merge( + defaults.headers.common, + defaults.headers[options.method] || {}, + options.headers || {} + ); + + forEach(headers, function (val, key) { + // Remove Content-Type if data is undefined + if (typeof data === 'undefined' && + key.toLowerCase() === 'content-type') { + delete headers[key]; } - } catch (e) { - reject(e); - } + // Otherwise add header to the request + else { + request.setRequestHeader(key, val); + } + }); - request.send(options.data || null); + // Send the request + request.send(data); }); - promise.success = function (fn) { + // Provide alias for success + promise.success = function success(fn) { promise.then(function(response) { fn(response); }); return promise; }; - promise.error = function(fn) { + // Provide alias for error + promise.error = function error(fn) { promise.then(null, function(response) { fn(response); }); @@ -115,43 +132,14 @@ var axios = }; return promise; - } - - var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'}; - var defaults = axios.defaults = { - headers: { - common: {'Accept': 'application/json, text/plain, */*'}, - patch: merge(CONTENT_TYPE_APPLICATION_JSON), - post: merge(CONTENT_TYPE_APPLICATION_JSON), - put: merge(CONTENT_TYPE_APPLICATION_JSON) - } }; - function parse(response) { - try { - return JSON.parse(response); - } catch(e) { - return response; - } - } + // Expose defaults + axios.defaults = defaults; - function merge() { - var result = {}; - forEach(arguments, function (obj) { - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - result[key] = obj[key]; - } - } - }); - return result; - } - - function forEach(arr, fn) { - for (var i=0, l=arr.length; i= 200 && request.status < 300) { - resolve(transformData(request.responseText, options.headers, options.transformResponse)); - } else { - onerror(); - } - } - - function onerror() { - reject( - parse(request.responseText) || - new Error('Can\'t connect to ' + JSON.stringify(options.url)) - ); - } - - try { - request.open(options.method, options.url, true); - request.onreadystatechange = function () { - if (request.readyState === 4) { - onload(); + var request = new(XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP'); + var data = transformData(options.data, options.headers, options.transformRequest); + + // Open request and listen for ready state + request.open(options.method, options.url, true); + request.onreadystatechange = function () { + if (request && request.readyState === 4) { + // Prepare the response + var response = { + data: transformData(request.responseText, options.headers, options.transformResponse), + status: request.status, + headers: headers, + config: options + }; + + // Resolve or reject the Promise based on the status + if (request.status >= 200 && request.status < 300) { + resolve(response); + } else { + reject(response); } - }; - request.onload = request.load = onload; - request.onerror = request.error = onerror; - - var headers = merge( - defaults.headers.common, - defaults.headers[options.method] || {}, - options.headers || {} - ); + // Clean up request + request = null; + } + }; - for (var key in headers) { - if (headers.hasOwnProperty(key)) { - request.setRequestHeader(key, headers[key]); - } + // Merge headers and add to request + var headers = merge( + defaults.headers.common, + defaults.headers[options.method] || {}, + options.headers || {} + ); + + forEach(headers, function (val, key) { + // Remove Content-Type if data is undefined + if (typeof data === 'undefined' && + key.toLowerCase() === 'content-type') { + delete headers[key]; } - } catch (e) { - reject(e); - } + // Otherwise add header to the request + else { + request.setRequestHeader(key, val); + } + }); - request.send(transformData(options.data, options.headers, options.transformRequest)); + // Send the request + request.send(data); }); - promise.success = function (fn) { + // Provide alias for success + promise.success = function success(fn) { promise.then(function(response) { fn(response); }); return promise; }; - promise.error = function(fn) { + // Provide alias for error + promise.error = function error(fn) { promise.then(null, function(response) { fn(response); }); @@ -69,63 +79,14 @@ function axios(options) { }; return promise; -} - -var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'}; -var defaults = axios.defaults = { - transformRequest: [function (data) { - return data ? JSON.stringify(data) : null; - }], - - transformResponse: [function (data) { - return parse(data); - }], - - headers: { - common: {'Accept': 'application/json, text/plain, */*'}, - patch: merge(CONTENT_TYPE_APPLICATION_JSON), - post: merge(CONTENT_TYPE_APPLICATION_JSON), - put: merge(CONTENT_TYPE_APPLICATION_JSON) - } }; -function transformData(data, headers, fns) { - if (typeof fns === 'function') { - return fns(data, headers); - } - - forEach(fns, function (fn) { - data = fn(data, headers); - }); - - return data; -} - -function parse(response) { - try { - return JSON.parse(response); - } catch(e) { - return response; - } -} - -function merge() { - var result = {}; - forEach(arguments, function (obj) { - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - result[key] = obj[key]; - } - } - }); - return result; -} +// Expose defaults +axios.defaults = defaults; -function forEach(arr, fn) { - for (var i=0, l=arr.length; i