This commit is contained in:
2025-06-16 10:09:19 +08:00
commit 7a066b3026
428 changed files with 50385 additions and 0 deletions

View File

@ -0,0 +1,83 @@
import { forEach, isArray } from '../utils'
/**
* 根据 baseURL 和 url 拼接
* @param {string} baseURL 请求根地址
* @param {string} relativeURL 请求参数地址
* @returns {string} 拼接后的地址
*/
function combineURL(baseURL = '', relativeURL = '') {
// 判断是否 http:// 或 https:// 开头
if (/^https?:\/\//.test(relativeURL)) return relativeURL
// 去除 baseURL 结尾斜杠,去除 relativeURL 开头斜杠,再判断拼接
return relativeURL ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL
}
function encode(val) {
return encodeURIComponent(val)
.replace(/%3A/gi, ':')
.replace(/%24/g, '$')
.replace(/%2C/gi, ',')
.replace(/%20/g, '+')
.replace(/%5B/gi, '[')
.replace(/%5D/gi, ']')
}
function querystring(url, params) {
let query
const parts = []
forEach(params, (val, key) => {
if (val === null || typeof val === 'undefined') return
if (isArray(val)) key = key + '[]'
else val = [val]
forEach(val, v => {
if (v !== null && typeof v === 'object') {
v = JSON.stringify(v)
}
parts.push(encode(key) + '=' + encode(v))
})
})
query = parts.join('&')
if (query) {
const hashmarkIndex = url.indexOf('#')
hashmarkIndex !== -1 && (url = url.slice(0, hashmarkIndex))
url += (url.indexOf('?') === -1 ? '?' : '&') + query
}
return url
}
/**
* 根据 baseURL、url、params query 编译请求URL
* @returns {string} 处理后的地址
*/
export default function buildURL({ baseURL, url: relativeURL, params, query } = {}) {
let url = combineURL(baseURL, relativeURL)
if (!params && !query) {
return url
}
if (params) {
if (/\/:/.test(url)) {
// 是否是 params 参数地址,并对应设置
forEach(params, (val, key) => {
url = url.replace(`/:${key}`, `/${encode(String(val))}`)
})
} else if (!query) {
// 兼容旧的 params 属性设置 query
url = querystring(url, params)
}
}
// 设置 query 参数
if (query) {
url = querystring(url, query)
}
return url
}

View File

@ -0,0 +1,8 @@
/**
* 判断参数是否含有回调参数 success / fail / complete 之一
* @param {string} field 参数的 Key 值字符串
* @returns {boolean} 返回判断值
*/
export default function isCallback(field) {
return ['success', 'fail', 'complete'].includes(field)
}

View File

@ -0,0 +1,41 @@
import { assign, forEach } from '../utils'
/**
* 深度合并,且不合并 undefined 值
* @param {object} obj1 前对象
* @param {object} obj2 后对象
* @returns {object} 合并后的对象
*/
function merge(obj1 = {}, obj2 = {}) {
const obj = {}
const objKeys = Object.keys({ ...obj1, ...obj2 })
forEach(objKeys, prop => {
if (obj2[prop] !== undefined) {
obj[prop] = assign(obj1[prop], obj2[prop])
} else if (obj1[prop] !== undefined) {
obj[prop] = assign(undefined, obj1[prop])
}
})
return obj
}
/**
* 合并请求配置
* @param {...object|function} args 请求配置
* @returns {object} 合并后的请求配置
*/
export default async function mergeConfig(...args) {
let config = {}
for (let i = 0, l = args.length; i < l; i++) {
const current = typeof args[i] === 'function' ? await args[i]() : args[i]
config = merge(config, current)
}
config.method = config.method.toUpperCase()
return config
}