|
import utils from '../utils.js'; |
|
import httpAdapter from './http.js'; |
|
import xhrAdapter from './xhr.js'; |
|
import AxiosError from "../core/AxiosError.js"; |
|
|
|
const knownAdapters = { |
|
http: httpAdapter, |
|
xhr: xhrAdapter |
|
} |
|
|
|
utils.forEach(knownAdapters, (fn, value) => { |
|
if (fn) { |
|
try { |
|
Object.defineProperty(fn, 'name', {value}); |
|
} catch (e) { |
|
|
|
} |
|
Object.defineProperty(fn, 'adapterName', {value}); |
|
} |
|
}); |
|
|
|
const renderReason = (reason) => `- ${reason}`; |
|
|
|
const isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false; |
|
|
|
export default { |
|
getAdapter: (adapters) => { |
|
adapters = utils.isArray(adapters) ? adapters : [adapters]; |
|
|
|
const {length} = adapters; |
|
let nameOrAdapter; |
|
let adapter; |
|
|
|
const rejectedReasons = {}; |
|
|
|
for (let i = 0; i < length; i++) { |
|
nameOrAdapter = adapters[i]; |
|
let id; |
|
|
|
adapter = nameOrAdapter; |
|
|
|
if (!isResolvedHandle(nameOrAdapter)) { |
|
adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()]; |
|
|
|
if (adapter === undefined) { |
|
throw new AxiosError(`Unknown adapter '${id}'`); |
|
} |
|
} |
|
|
|
if (adapter) { |
|
break; |
|
} |
|
|
|
rejectedReasons[id || '#' + i] = adapter; |
|
} |
|
|
|
if (!adapter) { |
|
|
|
const reasons = Object.entries(rejectedReasons) |
|
.map(([id, state]) => `adapter ${id} ` + |
|
(state === false ? 'is not supported by the environment' : 'is not available in the build') |
|
); |
|
|
|
let s = length ? |
|
(reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) : |
|
'as no adapter specified'; |
|
|
|
throw new AxiosError( |
|
`There is no suitable adapter to dispatch the request ` + s, |
|
'ERR_NOT_SUPPORT' |
|
); |
|
} |
|
|
|
return adapter; |
|
}, |
|
adapters: knownAdapters |
|
} |
|
|