UNPKG

@inventorjs/api-service

Version:
165 lines (164 loc) 4.7 kB
import { v4 } from 'uuid'; export function mergeConfig(...configList) { const mergedConfig = configList.reduce((result, config) => { if (!config) return result; let baseURL = result.baseURL ?? ''; if (isRootURL(config.baseURL) || isURL(config.baseURL)) { baseURL = config.baseURL ?? ''; } else { baseURL += config.baseURL ?? ''; } const extConfig = { ...(result?.$ext ?? {}), ...(config?.$ext ?? {}), }; const headers = lowercaseKey({ ...(result?.headers ?? {}), ...(config?.headers ?? {}), }); let logger = result.$ext?.logger ?? {}; const configLogger = config.$ext?.logger; if (isObject(logger) && isObject(configLogger)) { logger = { ...logger, ...configLogger, }; } else { if (configLogger === false) { logger = configLogger; } } const requestInterceptors = (result.$ext?.requestInterceptors ?? []).concat(config.$ext?.requestInterceptors ?? []); const responseInterceptors = (result.$ext?.responseInterceptors ?? []).concat(config.$ext?.responseInterceptors ?? []); return { ...result, ...config, baseURL, headers, $ext: { ...extConfig, logger, requestInterceptors, responseInterceptors, }, }; }, {}); return mergedConfig; } function processUrlParams(config) { let url = config?.url ?? ''; const extConfig = config.$ext; if (extConfig?.params && Object.keys(extConfig.params).length > 0) { const { params } = extConfig; Object.keys(params).forEach((key) => { url = url?.replace(`:${key}`, String(params[key])); }); } return url; } function processRootUrl(url = '') { return url.replace('^', ''); } export function processConfig(config, data) { const url = processUrlParams(config); const baseURL = processRootUrl(config.baseURL); const method = config?.method ? config?.method.toLowerCase() : 'get'; const params = ['get', 'delete'].includes(method) && isObject(data) && Object.keys(data).length > 0 ? data : config.params; let { signal, timeout } = config; // node 端连接超时需要特殊处理,默认TCP连接超时(timeout 参数为连接后超时)无法修改(约2分钟) if (!isBrowser() && !signal && config.timeout && typeof AbortSignal !== 'undefined') { signal = AbortSignal.timeout(config.timeout); timeout = 0; } let retry = config.$ext?.retry; if (!retry || config?.method !== 'get') { retry = 0; } return [config].reduce((result) => { return { ...result, url, baseURL, method, params, signal, timeout, data, $ext: { ...config.$ext, retry, }, }; }, config); } export function lowercaseKey(obj) { if (!obj) return obj; return Object.keys(obj).reduce((result, key) => { return { ...result, [String(key).toLowerCase()]: obj[key], }; }, {}); } export function uuid() { return v4(); } export function wrapReturn(data) { return [data].reduce((_, data) => data); } export function isObject(obj) { return !!obj && typeof obj === 'object'; } export function isBrowser() { return typeof window !== 'undefined' && typeof document !== 'undefined'; } export function isURL(url = '') { return url?.startsWith('http') || url?.startsWith('//'); } export function isRootURL(url = '') { return url.startsWith('^'); } export function getProtocolURL(url) { if (url?.startsWith('//')) { if (isBrowser()) { return `${location.protocol}${url}`; } else { return `http:${url}`; } } return url; } export function getOriginURL(url) { if (isBrowser()) { return `${location.origin}${url}`; } else { return `http://127.0.0.1${url}`; } } export function getFinalURL(config) { const { url = '', baseURL = '' } = config; if (isURL(url)) { return getProtocolURL(url); } else { if (isURL(baseURL)) { return `${getProtocolURL(baseURL)}${url}`; } else { return `${getOriginURL(baseURL)}${url}`; } } }