UNPKG

@canlooks/ajax

Version:
125 lines (124 loc) 3.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.bodyTransform = bodyTransform; exports.findBodyFiles = findBodyFiles; exports.mergeConfig = mergeConfig; exports.mergeUrl = mergeUrl; exports.mergeParams = mergeParams; exports.mergeHeaders = mergeHeaders; exports.mergeAbortSignal = mergeAbortSignal; exports.catchCommonError = catchCommonError; const error_1 = require("./error"); function bodyTransform(body) { if (typeof body === 'object') { if (!(body instanceof ReadableStream) && !(body instanceof Blob) && !(body instanceof ArrayBuffer) && !(body instanceof FormData) && !(body instanceof URLSearchParams)) { try { return JSON.stringify(body); } catch (e) { } } } return body; } /** * 查找请求体中的Blob对象 * @param body */ function findBodyFiles(body) { if (body instanceof Blob) { return body; } if (typeof body === 'object' && body !== null) { for (const k in body) { const file = findBodyFiles(body[k]); if (file) { return file; } } } return; } /** * 合并配置 * @param config */ function mergeConfig(...config) { return config.reduce((prev, next) => { return { ...prev, ...next, url: mergeUrl(prev?.url, next?.url), params: mergeParams(prev?.params, next?.params), headers: mergeHeaders(prev?.headers, next?.headers), signal: mergeAbortSignal(prev?.signal, next?.signal) }; }); } function mergeUrl(prev, next) { if (prev instanceof URL) { prev = prev.href; } if (next instanceof URL) { next = next.href; } if (!prev) { return next; } if (!next) { return prev; } // next开头带协议,则抛弃prev,直接使用next if (/^([a-z]+:)?\/\//i.test(next)) { return next; } // prev去掉末尾的'/',next去掉开头的'/' prev = prev.replace(/\/+$/, ''); next = next.replace(/^\/+/, ''); return `${prev}/${next}`; } function mergeParams(prev, next) { return mergeParamsOrHeaders(URLSearchParams, prev, next); } function mergeHeaders(prev, next) { return mergeParamsOrHeaders(Headers, prev, next); } function mergeParamsOrHeaders(objectClass, prev, next) { // prev无论如何都要new,避免直接修改prev const obj = new objectClass(prev); if (!next) { return obj; } if (!(next instanceof objectClass)) { next = new objectClass(next); } if (!prev) { return next; } for (const [name, value] of next) { obj.set(name, value); } return obj; } function mergeAbortSignal(prev, next) { if (!prev) { return next; } if (!next) { return prev; } const abortController = new AbortController(); prev.onabort = next.onabort = () => abortController.abort(); return abortController.signal; } function catchCommonError(e, newError) { return e instanceof error_1.AjaxError ? e : newError(e instanceof Error ? e.message : 'toString' in e ? e.toString() : void 0); }