Axios
function Axios(instanceConfig){
this.defaults = instanceConfig
this.interceptors = {
request: new InterceptorManager(),
respons: new InterceptorManager()
}
}
Axios.prototype.request = function request(config){
if(typeof config === 'string'){
config = arguments[1] || {}
config.url = arguments[0]
}else{
config = config || {}
}
config = mergeConfig(this.default,config)
if(config.method){
config.method = config.method.toLowerCase()
}else if(this.defaults.method){
config.method = this.defaults.method.toLowerCase()
}else{
config.method = 'get'
}
var transitional = config.transitional
if(transitional !== undefined){
validator.assertOptions(transitional,{
slientJSONParsing: validators.transitional(validators.boolean,'1.0.0'),
forcedJSONParsing: validators.transitional(validators.boolean,'1.0.0'),
clarifyTimeoutError:validators.transitional(validators.boolean,'1.0.0')
},false)
}
var requestInterceptorChain = []
var synchronousRequestInterceptors = true
this.interceptors.request.forEach(function(interceptor){
if(typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false){
return
}
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous
requestInterceptorChain.unshift(interceptor.fulfilled,interceptor.rejected)
})
var responseInterceptorChain = []
this.interceptors.response.forEach(function(interceptor){
responseInterceptorChain.push(interceptor.fulfilled,interceptor.rejected)
})
var promise
if(!synchronousRequestInterceptors){
var chain = [dispatchRequest,undefined]
Array.prototype.unshift.apply(chain,requestInterceptorChain)
chain.conat(responseInterceptorChain)
primise = Promise.resolve(config)
while(chain.length){
promise = promise.then(chain.shift(),chain.shift())
}
return promise
}
var newConfig = config
while(requestInterceptorChain.length){
var onFulfilled = requestInterceptorChain.shift()
var onRejected = requestInterceptorChain.shift()
try{
newConfig = onFulfilled(config)
}catch(error){
onRejected(err)
break
}
}
try{
promise = dispatchRequest(newConfig)
}catch(error){
return Promise.reject(error)
}
while(responseInterceptorChain.length){
promise = promise.then(responseInterceptorChain.shift(),responseInterceptorChian.shift())
}
return promise
}
Axios.prototype.getUri = function getUri(config){
config = mergeConfig(this.defaults,config)
return buildURL(config.url,config.params,config.paramsSerializer).replace(/^\?/,'')
}
utils.forEach(['delete','get','head','options'],function(method){
Axios.prototype[method] = function(url,config){
return this.request(mergeConfig(config||{},{
method,
url,
data:(config || {}).data
}))
}
})
utils.forEach(['post','put','patch'],function(method){
Axios.prototype[method] = function(url,data,config){
return this.request(mergeConfig(config || {},{
method,url,data
}))
}
})
InterceptorManager
function InterceptorManager(){
this.handlers = []
}
InterceptorManager.prototype.use = function use(fulfilled,rejected,options){
this.handlers.push({
fulfilled:fulfilled,
rejcted:rejected,
synchronous: options ? options.synchronous : false,
runWhen: options ? options.runWhen : null
})
return this.handlers.length - 1
}
InterceptorManager.prototype.eject = function eject(id){
if(this.handlers[id]){
this.handlers[id] = null
}
}
InterceptorManager.prototype.forEach = function forEach(fn){
utils.forEach(this.handlers,function forEachHandler(h){
if(h !== null){
fn(h)
}
})
}
mergeConfig
function mergeConfig(config1,config2){
config2 = config2 || {}
var config = {}
var valueFromConfig2Keys = ['url','method','data']
var mergeDeepPropertiesKeys = ['headers','auth','proxy','params']
var defaultToConfig2Keys = ['baseURL','transformRequest','transformResponse','paramsSerializer','timeout','timeoutMessage','withCredentials','adapter','responseType','xsrfCookieName','xsrfHeaderName','onUploadProgress','onDownloadProgress','decompress','maxContentLength','maxBodyLength','maxRedirects','transport','httpAgent','httpsAgent','cancelToken','socketPath','responseEncoding']
var directMergeKeys = ['validateStatus']
function getMergedValue(target,source){
if(utils.isPlainObject(target) && utils.isPlainObject(source)){
return utils.merge(target,source)
}else if(utils.isPlainObject(source)){
return utils.merge({},source)
}else if(utils.isArray(source)){
return source.slice()
}
return source
}
function mergeDeepProperties(prop){
if(!utils.isUndefined(config2[prop])){
config[prop] = getMergedValue(config1[prop],config2[prop])
}else if(!utils.isUndefined(config1[prop])){
config[prop] = getMergedValue(undefined,config1[prop])
}
}
utils.forEach(valueFromConfig2Keys,function(prop){
if(!utils.isUndefined(conifg2[prop])){
config[prop] = getMergedValue(undefined,config2[prop])
}
})
utils.forEach(mergeDeepPropertiesKeys,mergeDeepProperties)
utils.forEach(defaultToConfig2Keys.function(prop){
if(!utils.isUndefined(config2[prop])){
conifg[prop] = getMergedValue(undefined,config2[prop])
}else if(!utils.isUndefined(config1[prop])){
config[prop] = getMergedValue(undefined,config1[prop])
}
})
utils.forEach(directMergeKeys,function(prop){
if(prop in config2){
config[prop] = getMergedValue(config1[prop],config2[prop])
}else if(prop in config1){
config[prop] = getMergedValue(undefined,config1[prop])
}
})
var axiosKeys = valueFromConfig2Keys.concat(mergeDeepPropertiesKeys).concat(defaultToConfig2Keys).concat(directMergeKeys)
const otherKeys = Object.keys(config1).concat(Object.keys(config2)).filter(function filterAxiosKeys(key) {
return axiosKeys.indexOf(key) === -1
})
utils.forEach(otherKeys,mergeDeepProperties)
return config
}
buildURL
function buildURL(url,params,paramsSerializer){
if(!params){
return url
}
var serializedParams
if(paramsSerializer){
serializedParams = paramsSerializer(params)
} else if(utils.isURLSearchParams(params)){
serializedParams = params.toString()
}else{
var parts = []
utils.forEach(params,function(val,key){
if(val === null|| typeof val === 'undefined'){
return
}
if(utils.isArray(val)){
key = key + '[]'
}else{
val = [val]
}
utils.forEach(val,function(v){
if(utils.isDate(v)){
v = v.toISOString()
}else if(utils.isObject(v)){
v = JSON.stringify(v)
}
parts.push(encode(key)+'='+ encode(v))
})
})
serializedParams = parts.join("&")
}
if(serializedParams){
var hashmarkIndex = url.indexOf('#')
if(hashmarkIndex !== -1){
url = url.slice(0,hashmarkIndex)
}
url = (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
}
return url
}
encode
function encode(val){
return encodeURIComponent(val).replace(/%3A/gi,':').relace(/%24/g,'&').replace(/%2C/gi,',').replace(/%20/g,'+').relace(/%5B/gi,'[').relace(/%5D/gi,']')
}
validator
var pkg = require('../../../package.json')
var validators = {}
['object','boolean','number','function','string','symbol'].forEach(function(type,i){
validators[type] = function(thing){
return typeof thing === type || 'a' + (i < 1 ? 'n' : ' ') + type
}
})
var deprecateWarnings = {}
var currentVerArr = pkg.version.split('.')
function isOlderVersion(version,thanVersion){
var pkgVersionArr = thanVersion ? thanVersion.split('.') : currentVerArr
var destVer = version.split('.')
for(var i = 0; i < 3; i ++){
if(pkgVersionArr[i] > destVer[i]){
return true
}else if(pkgVersionArr[i] < destVer[i]){
reurn false
}
}
return false
}
assetOptions
function assetOptions(option,schema,allowUnKonwn){
if(typeof options !== 'object'){
throw new TypeError('options must be an object')
}
var keys = Object.keys(options)
var i = keys.length
while(i -- > 0){
var opt = keys[i]
var validator = schema[opt]
if(validator){
const value = options[opt]
var result = value === undefined || validator(value,opt,options)
if(result !== true){
throw new Error('option'+opt+'must be'+result)
}
continue
}
if(allowUnKnown !== true){
throw new Error('unKnown option:'+opt)
}
}
}
transitional
validators.transitional = function (validator,version,message){
var isDeprecated = version && isOlderVersion(version)
function formatMessage(opt,desc){
return '[Axios v'+pkg.version+'] Transitional Option\''+opt+'\''+desc+(message ? '.' + message : '')
}
return function(value,opt,opts){
if(validator === false){
throw new Error(formatMessage(opt,'has been removed in'+ version))
}
if(isDeprecated && !deprecatedWarnings[opt]){
deprecatedWarnings[opt] = true
console.warn(formatMessage(opt,'has been deprecated since v '+ version + 'and will be removed in the near future'))
}
return validator ? validator(value,opt,opts) : true
}
}