@inventorjs/api-service
Version:
Api service manager base on axios
165 lines (164 loc) • 4.7 kB
JavaScript
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}`;
}
}
}