From 6e0c8e76a7efbfe38d7a1b00e99d9dd6cfbaa577 Mon Sep 17 00:00:00 2001 From: Aviraj2929 Date: Sun, 12 Oct 2025 20:08:54 +0530 Subject: [PATCH] docs: add jsdoc to adapters (#7134) * add contributors and documentation * docs(adapters): add JSDoc for adapters module --------- Co-authored-by: Jay --- lib/adapters/adapters.js | 127 ++++++++++++++++++++++++++------------- 1 file changed, 86 insertions(+), 41 deletions(-) diff --git a/lib/adapters/adapters.js b/lib/adapters/adapters.js index 7be725c..2e117db 100644 --- a/lib/adapters/adapters.js +++ b/lib/adapters/adapters.js @@ -4,78 +4,123 @@ import xhrAdapter from './xhr.js'; import * as fetchAdapter from './fetch.js'; import AxiosError from "../core/AxiosError.js"; +/** + * Known adapters mapping. + * Provides environment-specific adapters for Axios: + * - `http` for Node.js + * - `xhr` for browsers + * - `fetch` for fetch API-based requests + * + * @type {Object} + */ const knownAdapters = { http: httpAdapter, xhr: xhrAdapter, fetch: { get: fetchAdapter.getFetch, } -} +}; +// Assign adapter names for easier debugging and identification utils.forEach(knownAdapters, (fn, value) => { if (fn) { try { - Object.defineProperty(fn, 'name', {value}); + Object.defineProperty(fn, 'name', { value }); } catch (e) { // eslint-disable-next-line no-empty } - Object.defineProperty(fn, 'adapterName', {value}); + Object.defineProperty(fn, 'adapterName', { value }); } }); +/** + * Render a rejection reason string for unknown or unsupported adapters + * + * @param {string} reason + * @returns {string} + */ const renderReason = (reason) => `- ${reason}`; +/** + * Check if the adapter is resolved (function, null, or false) + * + * @param {Function|null|false} adapter + * @returns {boolean} + */ const isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false; -export default { - getAdapter: (adapters, config) => { - adapters = utils.isArray(adapters) ? adapters : [adapters]; +/** + * Get the first suitable adapter from the provided list. + * Tries each adapter in order until a supported one is found. + * Throws an AxiosError if no adapter is suitable. + * + * @param {Array|string|Function} adapters - Adapter(s) by name or function. + * @param {Object} config - Axios request configuration + * @throws {AxiosError} If no suitable adapter is available + * @returns {Function} The resolved adapter function + */ +function getAdapter(adapters, config) { + adapters = utils.isArray(adapters) ? adapters : [adapters]; - const {length} = adapters; - let nameOrAdapter; - let adapter; + const { length } = adapters; + let nameOrAdapter; + let adapter; - const rejectedReasons = {}; + const rejectedReasons = {}; - for (let i = 0; i < length; i++) { - nameOrAdapter = adapters[i]; - let id; + for (let i = 0; i < length; i++) { + nameOrAdapter = adapters[i]; + let id; - adapter = nameOrAdapter; + adapter = nameOrAdapter; - if (!isResolvedHandle(nameOrAdapter)) { - adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()]; + if (!isResolvedHandle(nameOrAdapter)) { + adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()]; - if (adapter === undefined) { - throw new AxiosError(`Unknown adapter '${id}'`); - } + if (adapter === undefined) { + throw new AxiosError(`Unknown adapter '${id}'`); } - - if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) { - break; - } - - rejectedReasons[id || '#' + i] = adapter; } - if (!adapter) { + if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) { + break; + } - const reasons = Object.entries(rejectedReasons) - .map(([id, state]) => `adapter ${id} ` + - (state === false ? 'is not supported by the environment' : 'is not available in the build') - ); + rejectedReasons[id || '#' + i] = adapter; + } - 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' + 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') ); - } - return adapter; - }, - adapters: knownAdapters + 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; } + +/** + * Exports Axios adapters and utility to resolve an adapter + */ +export default { + /** + * Resolve an adapter from a list of adapter names or functions. + * @type {Function} + */ + getAdapter, + + /** + * Exposes all known adapters + * @type {Object} + */ + adapters: knownAdapters +};