mirror of
https://github.com/tenrok/axios.git
synced 2026-06-23 20:40:40 +03:00
Breaking up complexity of main axios file
This commit is contained in:
Vendored
+257
-127
File diff suppressed because one or more lines are too long
Vendored
+238
-108
File diff suppressed because one or more lines are too long
Vendored
+235
-132
File diff suppressed because one or more lines are too long
Vendored
+238
-108
File diff suppressed because one or more lines are too long
+57
-101
@@ -1,6 +1,10 @@
|
|||||||
var Promise = require('es6-promise').Promise;
|
var Promise = require('es6-promise').Promise;
|
||||||
|
var defaults = require('./defaults');
|
||||||
|
var forEach = require('./forEach');
|
||||||
|
var merge = require('./merge');
|
||||||
|
var transformData = require('./transformData');
|
||||||
|
|
||||||
function axios(options) {
|
var axios = module.exports = function axios(options) {
|
||||||
options = merge({
|
options = merge({
|
||||||
method: 'get',
|
method: 'get',
|
||||||
transformRequest: defaults.transformRequest,
|
transformRequest: defaults.transformRequest,
|
||||||
@@ -8,60 +12,66 @@ function axios(options) {
|
|||||||
}, options);
|
}, options);
|
||||||
|
|
||||||
var promise = new Promise(function (resolve, reject) {
|
var promise = new Promise(function (resolve, reject) {
|
||||||
var request = new(XMLHttpRequest || ActiveXObject)('MSXML2.XMLHTTP.3.0');
|
var request = new(XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP');
|
||||||
|
var data = transformData(options.data, options.headers, options.transformRequest);
|
||||||
|
|
||||||
function onload() {
|
// Open request and listen for ready state
|
||||||
if (request.status >= 200 && request.status < 300) {
|
request.open(options.method, options.url, true);
|
||||||
resolve(transformData(request.responseText, options.headers, options.transformResponse));
|
request.onreadystatechange = function () {
|
||||||
} else {
|
if (request && request.readyState === 4) {
|
||||||
onerror();
|
// Prepare the response
|
||||||
}
|
var response = {
|
||||||
}
|
data: transformData(request.responseText, options.headers, options.transformResponse),
|
||||||
|
status: request.status,
|
||||||
|
headers: headers,
|
||||||
|
config: options
|
||||||
|
};
|
||||||
|
|
||||||
function onerror() {
|
// Resolve or reject the Promise based on the status
|
||||||
reject(
|
if (request.status >= 200 && request.status < 300) {
|
||||||
parse(request.responseText) ||
|
resolve(response);
|
||||||
new Error('Can\'t connect to ' + JSON.stringify(options.url))
|
} else {
|
||||||
);
|
reject(response);
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
request.open(options.method, options.url, true);
|
|
||||||
request.onreadystatechange = function () {
|
|
||||||
if (request.readyState === 4) {
|
|
||||||
onload();
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
request.onload = request.load = onload;
|
// Clean up request
|
||||||
request.onerror = request.error = onerror;
|
request = null;
|
||||||
|
|
||||||
var headers = merge(
|
|
||||||
defaults.headers.common,
|
|
||||||
defaults.headers[options.method] || {},
|
|
||||||
options.headers || {}
|
|
||||||
);
|
|
||||||
|
|
||||||
for (var key in headers) {
|
|
||||||
if (headers.hasOwnProperty(key)) {
|
|
||||||
request.setRequestHeader(key, headers[key]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
};
|
||||||
reject(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
request.send(transformData(options.data, options.headers, options.transformRequest));
|
// 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];
|
||||||
|
}
|
||||||
|
// Otherwise add header to the request
|
||||||
|
else {
|
||||||
|
request.setRequestHeader(key, val);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Send the request
|
||||||
|
request.send(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
promise.success = function (fn) {
|
// Provide alias for success
|
||||||
|
promise.success = function success(fn) {
|
||||||
promise.then(function(response) {
|
promise.then(function(response) {
|
||||||
fn(response);
|
fn(response);
|
||||||
});
|
});
|
||||||
return promise;
|
return promise;
|
||||||
};
|
};
|
||||||
|
|
||||||
promise.error = function(fn) {
|
// Provide alias for error
|
||||||
|
promise.error = function error(fn) {
|
||||||
promise.then(null, function(response) {
|
promise.then(null, function(response) {
|
||||||
fn(response);
|
fn(response);
|
||||||
});
|
});
|
||||||
@@ -69,63 +79,14 @@ function axios(options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return promise;
|
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) {
|
// Expose defaults
|
||||||
if (typeof fns === 'function') {
|
axios.defaults = defaults;
|
||||||
return fns(data, headers);
|
|
||||||
}
|
|
||||||
|
|
||||||
forEach(fns, function (fn) {
|
// Provide aliases for supported request methods
|
||||||
data = fn(data, headers);
|
createShortMethods('delete', 'get', 'head');
|
||||||
});
|
createShortMethodsWithData('post', 'put', 'patch');
|
||||||
|
|
||||||
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<l; i++) {
|
|
||||||
fn.call(null, arr[i], i, arr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function createShortMethods() {
|
function createShortMethods() {
|
||||||
forEach(arguments, function (method) {
|
forEach(arguments, function (method) {
|
||||||
@@ -148,9 +109,4 @@ function createShortMethodsWithData() {
|
|||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
createShortMethods('delete', 'get', 'head');
|
|
||||||
createShortMethodsWithData('post', 'put', 'patch');
|
|
||||||
|
|
||||||
module.exports = axios;
|
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var merge = require('./merge');
|
||||||
|
|
||||||
|
var toString = Object.prototype.toString;
|
||||||
|
var JSON_START = /^\s*(\[|\{[^\{])/;
|
||||||
|
var JSON_END = /[\}\]]\s*$/;
|
||||||
|
var PROTECTION_PREFIX = /^\)\]\}',?\n/;
|
||||||
|
var CONTENT_TYPE_APPLICATION_JSON = {
|
||||||
|
'Content-Type': 'application/json;charset=utf-8'
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
transformRequest: [function (data) {
|
||||||
|
return data !== null && typeof data === 'object' &&
|
||||||
|
toString.call(data) !== '[object File]' &&
|
||||||
|
toString.call(data) !== '[object Blob]' ?
|
||||||
|
JSON.stringify(data) : null;
|
||||||
|
}],
|
||||||
|
|
||||||
|
transformResponse: [function (data) {
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
data = data.replace(PROTECTION_PREFIX, '');
|
||||||
|
if (JSON_START.test(data) && JSON_END.test(data)) {
|
||||||
|
data = JSON.parse(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 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)
|
||||||
|
},
|
||||||
|
|
||||||
|
xsrfCookiName: 'XSRF-TOKEN',
|
||||||
|
xsrfHeaderName: 'X-XSRF-TOKEN'
|
||||||
|
};
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate over an Array or an Object invoking a function for each item.
|
||||||
|
*
|
||||||
|
* If `obj` is an Array or arguments callback will be called passing
|
||||||
|
* the value, index, and complete array for each item.
|
||||||
|
*
|
||||||
|
* If 'obj' is an Object callback will be called passing
|
||||||
|
* the value, key, and complete object for each property.
|
||||||
|
*
|
||||||
|
* @param {Object|Array} obj The object to iterate
|
||||||
|
* @param {Function} fn The callback to invoke for each item
|
||||||
|
*/
|
||||||
|
module.exports = function forEach(obj, fn) {
|
||||||
|
if (typeof obj !== 'object') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate over array values
|
||||||
|
if (obj.constructor === Array || typeof obj.callee === 'function') {
|
||||||
|
for (var i=0, l=obj.length; i<l; i++) {
|
||||||
|
fn.call(null, obj[i], i, obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Iterate over object keys
|
||||||
|
else {
|
||||||
|
for (var key in obj) {
|
||||||
|
if (obj.hasOwnProperty(key)) {
|
||||||
|
fn.call(null, obj[key], key, obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
var forEach = require('./forEach');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accepts varargs expecting each argument to be an object, then
|
||||||
|
* immutably merges the properties of each object and returns result.
|
||||||
|
*
|
||||||
|
* When multiple objects contain the same key the later object in
|
||||||
|
* the arguments list will take precedence.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* ```js
|
||||||
|
* var result = merge({foo: 123}, {foo: 456});
|
||||||
|
* console.log(result.foo); // outputs 456
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @param {Object} obj1 Object to merge
|
||||||
|
* @returns {Object} Result of all merge properties
|
||||||
|
*/
|
||||||
|
module.exports = function merge(obj1/*, obj2, obj3, ...*/) {
|
||||||
|
var result = {};
|
||||||
|
forEach(arguments, function (obj) {
|
||||||
|
forEach(obj, function (val, key) {
|
||||||
|
result[key] = val;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
};
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var forEach = require('./forEach');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform the data for a request or a response
|
||||||
|
*
|
||||||
|
* @param {Object|String} data The data to be transformed
|
||||||
|
* @param {Array} headers The headers for the request or response
|
||||||
|
* @param {Array|Function} fns A single function or Array of functions
|
||||||
|
* @returns {*} The resulting transformed data
|
||||||
|
*/
|
||||||
|
module.exports = function transformData(data, headers, fns) {
|
||||||
|
if (typeof fns === 'function') {
|
||||||
|
return fns(data, headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
forEach(fns, function (fn) {
|
||||||
|
data = fn(data, headers);
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
};
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
var forEach = require('../../lib/forEach');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
testArray: function (test) {
|
||||||
|
var sum = 0;
|
||||||
|
|
||||||
|
forEach([1, 2, 3, 4, 5], function (val) {
|
||||||
|
sum += val;
|
||||||
|
});
|
||||||
|
|
||||||
|
test.equal(sum, 15);
|
||||||
|
test.done();
|
||||||
|
},
|
||||||
|
|
||||||
|
testObject: function (test) {
|
||||||
|
var keys = '';
|
||||||
|
var vals = 0;
|
||||||
|
var obj = {
|
||||||
|
b: 1,
|
||||||
|
a: 2,
|
||||||
|
r: 3
|
||||||
|
};
|
||||||
|
|
||||||
|
forEach(obj, function (v, k) {
|
||||||
|
keys += k;
|
||||||
|
vals += v;
|
||||||
|
});
|
||||||
|
|
||||||
|
test.equal(keys, 'bar');
|
||||||
|
test.equal(vals, 6);
|
||||||
|
test.done();
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
var merge = require('../../lib/merge');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
testImmutability: function (test) {
|
||||||
|
var a = {};
|
||||||
|
var b = {foo: 123};
|
||||||
|
var c = {bar: 456};
|
||||||
|
|
||||||
|
merge(a, b, c);
|
||||||
|
|
||||||
|
test.equals(typeof a.foo, 'undefined');
|
||||||
|
test.equals(typeof a.bar, 'undefined');
|
||||||
|
test.equals(typeof b.bar, 'undefined');
|
||||||
|
test.equals(typeof c.foo, 'undefined');
|
||||||
|
test.done();
|
||||||
|
},
|
||||||
|
|
||||||
|
testMerge: function (test) {
|
||||||
|
var a = {foo: 123};
|
||||||
|
var b = {bar: 456};
|
||||||
|
var c = {foo: 789};
|
||||||
|
var d = merge(a, b, c);
|
||||||
|
|
||||||
|
test.equals(d.foo, 789);
|
||||||
|
test.equals(d.bar, 456);
|
||||||
|
test.done();
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
var transformData = require('../../lib/transformData');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
testSingleFunction: function (test) {
|
||||||
|
var data;
|
||||||
|
data = transformData(data, null, function (data) {
|
||||||
|
data = 'foo';
|
||||||
|
return data;
|
||||||
|
});
|
||||||
|
|
||||||
|
test.equals(data, 'foo');
|
||||||
|
test.done();
|
||||||
|
},
|
||||||
|
|
||||||
|
testFunctionArray: function (test) {
|
||||||
|
var data = '';
|
||||||
|
data = transformData(data, null, [function (data) {
|
||||||
|
data += 'f';
|
||||||
|
return data;
|
||||||
|
}, function (data) {
|
||||||
|
data += 'o';
|
||||||
|
return data;
|
||||||
|
}, function (data) {
|
||||||
|
data += 'o';
|
||||||
|
return data;
|
||||||
|
}]);
|
||||||
|
|
||||||
|
test.equals(data, 'foo');
|
||||||
|
test.done();
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user