codekingpro/portable-devtools
114k
1import utils from '../utils.js';2import httpAdapter from './http.js';3import xhrAdapter from './xhr.js';4import AxiosError from "../core/AxiosError.js";5 6const knownAdapters = {7 http: httpAdapter,8 xhr: xhrAdapter9}10 11utils.forEach(knownAdapters, (fn, value) => {12 if (fn) {13 try {14 Object.defineProperty(fn, 'name', {value});15 } catch (e) {16 // eslint-disable-next-line no-empty17 }18 Object.defineProperty(fn, 'adapterName', {value});19 }20});21 22const renderReason = (reason) => `- ${reason}`;23 24const isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;25 26export default {27 getAdapter: (adapters) => {28 adapters = utils.isArray(adapters) ? adapters : [adapters];29 30 const {length} = adapters;31 let nameOrAdapter;32 let adapter;33 34 const rejectedReasons = {};35 36 for (let i = 0; i < length; i++) {37 nameOrAdapter = adapters[i];38 let id;39 40 adapter = nameOrAdapter;41 42 if (!isResolvedHandle(nameOrAdapter)) {43 adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];44 45 if (adapter === undefined) {46 throw new AxiosError(`Unknown adapter '${id}'`);47 }48 }49 50 if (adapter) {51 break;52 }53 54 rejectedReasons[id || '#' + i] = adapter;55 }56 57 if (!adapter) {58 59 const reasons = Object.entries(rejectedReasons)60 .map(([id, state]) => `adapter ${id} ` +61 (state === false ? 'is not supported by the environment' : 'is not available in the build')62 );63 64 let s = length ?65 (reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) :66 'as no adapter specified';67 68 throw new AxiosError(69 `There is no suitable adapter to dispatch the request ` + s,70 'ERR_NOT_SUPPORT'71 );72 }73 74 return adapter;75 },76 adapters: knownAdapters77}78 