@hzab/utils 1.1.2 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +9 -54
- package/package.json +1 -1
- package/src/array.ts +8 -8
- package/src/base64Str.ts +49 -49
- package/src/blob.ts +42 -42
- package/src/color.ts +302 -302
- package/src/empty-val.ts +40 -40
- package/src/file/file.ts +37 -37
- package/src/file/fileName.ts +98 -98
- package/src/formily/cloneSchema.ts +63 -63
- package/src/formily/global-components.ts +48 -48
- package/src/formily/schema-merge.ts +68 -68
- package/src/locationUtils.ts +26 -26
- package/src/options.ts +226 -226
- package/src/string.ts +31 -31
- package/src/upload/OfflineUpload.ts +342 -342
- package/src/upload/fileDataNormalization.ts +281 -281
- package/src/upload/ossUpload.ts +23 -23
- package/src/upload/uploadUtils.ts +112 -42
- package/src/url.ts +145 -134
|
@@ -6,21 +6,69 @@ import { isBase64Str } from "../base64Str";
|
|
|
6
6
|
import { mergeFileName, getFileName, getFileNameExt } from "../file/fileName";
|
|
7
7
|
import { getFileTypeExt } from "../file/fileType";
|
|
8
8
|
import { nanoidNumALetters } from "../nanoid";
|
|
9
|
+
import { addQuery, searchToObj } from "../url";
|
|
10
|
+
|
|
11
|
+
/** 预览配置(旧版 getPreviewUrl) */
|
|
12
|
+
export interface IPreviewConfig {
|
|
13
|
+
/** 预览域名或路径前缀 */
|
|
14
|
+
url?: string;
|
|
15
|
+
/** 额外 query(不含 ?) */
|
|
16
|
+
query?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** getFileNameByFileObj 入参文件对象 */
|
|
20
|
+
export interface IFileNameSource {
|
|
21
|
+
name?: string;
|
|
22
|
+
type?: string;
|
|
23
|
+
url?: string;
|
|
24
|
+
createTime?: string | number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** getFileNameByFileObj 配置项 */
|
|
28
|
+
export interface IGetFileNameByFileObjOpt {
|
|
29
|
+
/** 是否开启 Hash 命名 */
|
|
30
|
+
useHashName?: boolean;
|
|
31
|
+
params?: {
|
|
32
|
+
/** 指定文件名 */
|
|
33
|
+
fileName?: string;
|
|
34
|
+
[key: string]: any;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** 含 previewUrl / url 的文件类对象 */
|
|
39
|
+
export interface IPreviewFileLike {
|
|
40
|
+
previewUrl?: string;
|
|
41
|
+
url?: string;
|
|
42
|
+
[key: string]: any;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** mergePreviewConfig 配置项 */
|
|
46
|
+
export interface IMergePreviewConfig {
|
|
47
|
+
/** 预览域名或路径前缀(有值才拼接) */
|
|
48
|
+
url?: string;
|
|
49
|
+
/** url 别名 */
|
|
50
|
+
baseUrl?: string;
|
|
51
|
+
/** query 对象,优先推荐 */
|
|
52
|
+
query?: Record<string, any>;
|
|
53
|
+
/** `?` 后的原始字符串(不含 ?),会先解析再与 query 合并;同名键以 query 为准 */
|
|
54
|
+
search?: string;
|
|
55
|
+
}
|
|
9
56
|
|
|
10
57
|
/**
|
|
11
58
|
* 格式化 dir 字符串,必须为非 / 开头, / 结尾。如: test/
|
|
12
|
-
* @param
|
|
59
|
+
* @param dir
|
|
13
60
|
* @returns
|
|
14
61
|
*/
|
|
15
|
-
export const formatDirStr = function (dir) {
|
|
62
|
+
export const formatDirStr = function (dir?: string | null): string | undefined {
|
|
16
63
|
return dir?.replace(/^\/(.*)\/*$/, "$1").replace(/(.?=*)\/*$/, "$1/");
|
|
17
64
|
};
|
|
18
65
|
|
|
19
66
|
/**
|
|
20
67
|
* 合并 dir 字符串
|
|
21
|
-
* @param
|
|
68
|
+
* @param dir1
|
|
69
|
+
* @param dir2
|
|
22
70
|
*/
|
|
23
|
-
export const mergeDirStr = function (dir1, dir2) {
|
|
71
|
+
export const mergeDirStr = function (dir1?: string | null, dir2?: string | null): string {
|
|
24
72
|
return `${formatDirStr(dir1 || "")}${formatDirStr(dir2 || "")}`;
|
|
25
73
|
};
|
|
26
74
|
|
|
@@ -30,8 +78,8 @@ export const mergeDirStr = function (dir1, dir2) {
|
|
|
30
78
|
* @param maxCount
|
|
31
79
|
* @returns
|
|
32
80
|
*/
|
|
33
|
-
export function handleMaxCount(fileList, maxCount) {
|
|
34
|
-
let list = getArr(fileList);
|
|
81
|
+
export function handleMaxCount<T>(fileList: T | T[] | null | undefined, maxCount?: number): T[] {
|
|
82
|
+
let list = getArr(fileList) as T[];
|
|
35
83
|
if (maxCount > 0 && list.length > maxCount) {
|
|
36
84
|
list = list.slice(0, maxCount);
|
|
37
85
|
}
|
|
@@ -40,11 +88,11 @@ export function handleMaxCount(fileList, maxCount) {
|
|
|
40
88
|
|
|
41
89
|
/**
|
|
42
90
|
* 获取预览 url
|
|
43
|
-
* @param
|
|
44
|
-
* @param
|
|
91
|
+
* @param uri
|
|
92
|
+
* @param previewConfig
|
|
45
93
|
* @returns
|
|
46
94
|
*/
|
|
47
|
-
export function getPreviewUrl(uri, previewConfig) {
|
|
95
|
+
export function getPreviewUrl(uri: string, previewConfig?: IPreviewConfig): string {
|
|
48
96
|
const isUriPattern = /http[s]?:\/\/[^\s]+/.test(uri);
|
|
49
97
|
const query = previewConfig?.query ? "?" + previewConfig?.query : "";
|
|
50
98
|
|
|
@@ -60,8 +108,9 @@ export function getPreviewUrl(uri, previewConfig) {
|
|
|
60
108
|
* 数据存储格式 ~k[key]-[data]~ 如: ~ktime-1743649562530~
|
|
61
109
|
* key、data 中的 ~ 转为 _
|
|
62
110
|
* @param file
|
|
111
|
+
* @param opt
|
|
63
112
|
*/
|
|
64
|
-
export const getFileNameByFileObj = (file, opt
|
|
113
|
+
export const getFileNameByFileObj = (file: IFileNameSource, opt?: IGetFileNameByFileObjOpt): string => {
|
|
65
114
|
const {
|
|
66
115
|
useHashName = true,
|
|
67
116
|
params: { fileName = "" } = {}, // 给 params 加默认空对象
|
|
@@ -75,8 +124,6 @@ export const getFileNameByFileObj = (file, opt: any) => {
|
|
|
75
124
|
const _fileName = mainPart || _fullFileName || getFileName(file.url) || "file";
|
|
76
125
|
const _ext = ext || getFileTypeExt(file.type);
|
|
77
126
|
|
|
78
|
-
|
|
79
|
-
|
|
80
127
|
const hashStr = useHashName ? nanoidNumALetters() : "";
|
|
81
128
|
const nm = mergeFileName(_fileName + "." + _ext, (_fileName.indexOf("~kid-") < 0 ? `~kid-${hashStr}-${file.createTime || dayjs().valueOf()}-${ext}` : ""));
|
|
82
129
|
|
|
@@ -84,13 +131,13 @@ export const getFileNameByFileObj = (file, opt: any) => {
|
|
|
84
131
|
};
|
|
85
132
|
|
|
86
133
|
/**
|
|
87
|
-
*
|
|
134
|
+
* 解析文件名中的 ~k[key]-[data]~ 键值对
|
|
88
135
|
* @param url
|
|
89
136
|
* @returns
|
|
90
137
|
*/
|
|
91
|
-
export const getFileNameObj = function (url):
|
|
138
|
+
export const getFileNameObj = function (url: string): Record<string, string> {
|
|
92
139
|
const list = url.match(/~k([^-~]+)-([^~]*)~/g);
|
|
93
|
-
const res = {};
|
|
140
|
+
const res: Record<string, string> = {};
|
|
94
141
|
list?.forEach((it) => {
|
|
95
142
|
const arr = it?.match(/~k([^-~]+)-([^~]*)~/);
|
|
96
143
|
if (arr?.length >= 3) {
|
|
@@ -101,11 +148,11 @@ export const getFileNameObj = function (url): any {
|
|
|
101
148
|
};
|
|
102
149
|
|
|
103
150
|
/**
|
|
104
|
-
*
|
|
105
|
-
* @param
|
|
151
|
+
* 将对象序列化为 ~k[key]-[data]~ 字符串
|
|
152
|
+
* @param obj
|
|
106
153
|
* @returns
|
|
107
154
|
*/
|
|
108
|
-
export function setFileNameObj(obj) {
|
|
155
|
+
export function setFileNameObj(obj: Record<string, any>): string {
|
|
109
156
|
return Object.keys(obj)
|
|
110
157
|
.map((key) => {
|
|
111
158
|
return `~k${key?.replace(/~/g, "_")}-${obj[key]?.toString()?.replace(/~/g, "_")}~`;
|
|
@@ -119,44 +166,67 @@ export function setFileNameObj(obj) {
|
|
|
119
166
|
* @param key
|
|
120
167
|
* @returns
|
|
121
168
|
*/
|
|
122
|
-
export const getValByKey = function (url, key) {
|
|
169
|
+
export const getValByKey = function (url: string, key: string): string | undefined {
|
|
123
170
|
const reg = new RegExp(`~k${key?.replace(/~/g, "_")}-\([^~]*\)~`);
|
|
124
171
|
return url.match(reg)?.[1];
|
|
125
172
|
};
|
|
126
173
|
|
|
127
174
|
/**
|
|
128
|
-
*
|
|
129
|
-
* @param
|
|
130
|
-
|
|
175
|
+
* 是否为无需再拼前缀的绝对/特殊地址
|
|
176
|
+
* @param uri
|
|
177
|
+
*/
|
|
178
|
+
function isAbsoluteOrSpecialUrl(uri?: string | null): boolean {
|
|
179
|
+
if (!uri) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
if (isBase64Str(uri)) {
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
// http(s)://、协议相对 //、data:、blob:
|
|
186
|
+
if (/^(https?:)?\/\//i.test(uri) || /^(data|blob):/i.test(uri)) {
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* 预览 url 添加前缀(仅用于预览展示,不应用于表单提交值)
|
|
194
|
+
* @param uri 相对路径、完整 url,或含 previewUrl/url 的文件对象
|
|
195
|
+
* @param conf
|
|
196
|
+
* - url / baseUrl: 预览域名或路径前缀(有值才拼接)
|
|
197
|
+
* - query: query 对象,优先推荐
|
|
198
|
+
* - search: `?` 后的原始字符串(不含 ?),会先解析再与 query 合并;同名键以 query 为准
|
|
131
199
|
* @returns
|
|
132
200
|
*/
|
|
133
|
-
export function mergePreviewConfig(
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
201
|
+
export function mergePreviewConfig(
|
|
202
|
+
uri: string | IPreviewFileLike | null | undefined,
|
|
203
|
+
conf?: IMergePreviewConfig,
|
|
204
|
+
): string | undefined {
|
|
205
|
+
let _uri: string | undefined = typeof uri === "string" ? uri : undefined;
|
|
206
|
+
if (typeof uri === "object" && uri) {
|
|
207
|
+
_uri = uri.previewUrl || uri.url;
|
|
139
208
|
}
|
|
140
209
|
if (typeof _uri !== "string") {
|
|
141
210
|
return _uri;
|
|
142
211
|
}
|
|
143
|
-
_uri = _uri
|
|
144
|
-
|
|
145
|
-
if (isBase64Str(_uri)) {
|
|
212
|
+
_uri = _uri.trim();
|
|
213
|
+
if (!_uri) {
|
|
146
214
|
return _uri;
|
|
147
215
|
}
|
|
148
|
-
const isUriPattern = /http[s]?:\/\/[^\s]+/.test(_uri);
|
|
149
|
-
const query = conf?.query?.trim() ? "?" + conf?.query?.trim() : "";
|
|
150
|
-
|
|
151
|
-
if (isUriPattern) {
|
|
152
|
-
// 源地址为 http 地址,直接拼接 query 参数
|
|
153
|
-
return `${_uri}${query}`;
|
|
154
|
-
}
|
|
155
216
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
217
|
+
const baseUrl = (conf?.url ?? conf?.baseUrl)?.trim?.() || "";
|
|
218
|
+
const searchStr = conf?.search?.trim() || "";
|
|
219
|
+
const searchParams = searchStr ? searchToObj(`?${searchStr}`) || {} : {};
|
|
220
|
+
const query = conf?.query && typeof conf.query === "object" ? conf.query : {};
|
|
221
|
+
const queryParams = { ...searchParams, ...query };
|
|
222
|
+
const hasQuery = Object.keys(queryParams).length > 0;
|
|
223
|
+
|
|
224
|
+
let result = _uri;
|
|
225
|
+
// 已是完整/特殊地址:不二次拼前缀,仅按需挂 query
|
|
226
|
+
if (!isAbsoluteOrSpecialUrl(_uri) && baseUrl) {
|
|
227
|
+
// 仅当配置了有效前缀时才拼接,避免 conf 为空对象时拼出 "undefined/xxx"
|
|
228
|
+
result = `${baseUrl.replace(/\/$/, "")}/${_uri.replace(/^\//, "")}`.trim();
|
|
159
229
|
}
|
|
160
230
|
|
|
161
|
-
return
|
|
231
|
+
return hasQuery ? addQuery(result, queryParams) : result;
|
|
162
232
|
}
|
package/src/url.ts
CHANGED
|
@@ -1,134 +1,145 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 替换 search 字符串
|
|
3
|
-
* @param url
|
|
4
|
-
* @param search
|
|
5
|
-
* @returns
|
|
6
|
-
*/
|
|
7
|
-
export function replaceSearch(url, search) {
|
|
8
|
-
if (!url || typeof url !== "string") {
|
|
9
|
-
console.warn("Warn
|
|
10
|
-
return url;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const hashIdx = _url.indexOf("#");
|
|
15
|
-
const queryIdx = _url.indexOf("?");
|
|
16
|
-
let hash = "";
|
|
17
|
-
let resUrl = _url;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (hashIdx >= 0) {
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
search
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
*
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 替换 search 字符串
|
|
3
|
+
* @param url
|
|
4
|
+
* @param search
|
|
5
|
+
* @returns
|
|
6
|
+
*/
|
|
7
|
+
export function replaceSearch(url: string, search: string) {
|
|
8
|
+
if (!url || typeof url !== "string") {
|
|
9
|
+
console.warn("Warn replaceSearch: 请传入正确的 url 字符串");
|
|
10
|
+
return url;
|
|
11
|
+
}
|
|
12
|
+
const _url = fixUrlQuery(url);
|
|
13
|
+
|
|
14
|
+
const hashIdx = _url.indexOf("#");
|
|
15
|
+
const queryIdx = _url.indexOf("?");
|
|
16
|
+
let hash = "";
|
|
17
|
+
let resUrl = _url;
|
|
18
|
+
// 无 query 时也要截掉 hash,否则后面再拼 hash 会重复
|
|
19
|
+
if (queryIdx >= 0) {
|
|
20
|
+
resUrl = _url.slice(0, queryIdx);
|
|
21
|
+
} else if (hashIdx >= 0) {
|
|
22
|
+
resUrl = _url.slice(0, hashIdx);
|
|
23
|
+
}
|
|
24
|
+
if (hashIdx >= 0) {
|
|
25
|
+
hash = _url.slice(hashIdx);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
resUrl += search?.indexOf("?") >= 0 ? "" : "?";
|
|
29
|
+
resUrl += search;
|
|
30
|
+
resUrl += hash;
|
|
31
|
+
|
|
32
|
+
return resUrl;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 把对象转为 query 参数
|
|
37
|
+
* @param query
|
|
38
|
+
*/
|
|
39
|
+
export function objToSearch(query, hasQuery) {
|
|
40
|
+
if (!query || typeof query !== "object") {
|
|
41
|
+
console.warn("Warn objToSearch: 请传入正确的对象");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
let search = hasQuery ? "?" : "";
|
|
45
|
+
Object.keys(query).forEach((key) => {
|
|
46
|
+
if (search && search != "?") {
|
|
47
|
+
search += "&";
|
|
48
|
+
}
|
|
49
|
+
search += key;
|
|
50
|
+
search += "=";
|
|
51
|
+
search += query[key];
|
|
52
|
+
});
|
|
53
|
+
return search;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 修复 query,解决 query 在 hash 后面的情况
|
|
58
|
+
* @param url
|
|
59
|
+
* @returns
|
|
60
|
+
* 源数据:/#/login?a=1&b=2
|
|
61
|
+
* 结果:/?a=1&b=2#/login
|
|
62
|
+
*/
|
|
63
|
+
export function fixUrlQuery(url) {
|
|
64
|
+
if (!url || typeof url !== "string") {
|
|
65
|
+
console.warn("Warn handleUrlQuery: 请传入正确的 url 字符串");
|
|
66
|
+
return url;
|
|
67
|
+
}
|
|
68
|
+
const hashIdx = url.indexOf("#");
|
|
69
|
+
const queryIdx = url.indexOf("?");
|
|
70
|
+
|
|
71
|
+
// 双 query 情况
|
|
72
|
+
if (queryIdx < hashIdx) {
|
|
73
|
+
let hash = url.slice(hashIdx);
|
|
74
|
+
const hashQueryIdx = hash.indexOf("?");
|
|
75
|
+
if (hashQueryIdx >= 0) {
|
|
76
|
+
const _url = url.slice(0, queryIdx);
|
|
77
|
+
const urlQuery = url.slice(queryIdx, hashIdx)?.replace(/\/$/, "");
|
|
78
|
+
const hashQuery = hash.slice(hashQueryIdx)?.replace("?", "")?.replace(/\/$/, "");
|
|
79
|
+
hash = hash.slice(0, hashQueryIdx);
|
|
80
|
+
return `${_url}${urlQuery}&${hashQuery}${hash}`;
|
|
81
|
+
}
|
|
82
|
+
return url;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// query 在 hash # 之后
|
|
86
|
+
if (queryIdx >= 0 && hashIdx >= 0 && queryIdx > hashIdx) {
|
|
87
|
+
const hash = url.slice(hashIdx, queryIdx);
|
|
88
|
+
const search = url.slice(queryIdx);
|
|
89
|
+
return `${url.slice(0, hashIdx)}${search}${hash}`;
|
|
90
|
+
}
|
|
91
|
+
return url;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* 获取 url 中的 query 值的对象
|
|
96
|
+
* @param query
|
|
97
|
+
*/
|
|
98
|
+
export function searchToObj(url) {
|
|
99
|
+
if (!url || typeof url !== "string") {
|
|
100
|
+
console.warn("Warn getSearchParams: 请传入正确的 url 字符串.");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
let _url = fixUrlQuery(url)
|
|
104
|
+
// 解决 query 在 /# 之前导致 query 参数多了 / 的问题
|
|
105
|
+
.replace("/#", "#");
|
|
106
|
+
const queryIdx = _url.indexOf("?");
|
|
107
|
+
const hashIdx = _url.indexOf("#");
|
|
108
|
+
if (queryIdx < 0) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// 去除 hash 相关数据及 query 的 "?"
|
|
112
|
+
if (hashIdx >= 0 && queryIdx >= 0) {
|
|
113
|
+
_url = _url.slice(queryIdx + 1, hashIdx);
|
|
114
|
+
} else if (queryIdx >= 0) {
|
|
115
|
+
_url = _url.slice(queryIdx + 1);
|
|
116
|
+
}
|
|
117
|
+
const res = {};
|
|
118
|
+
_url.split("&")?.forEach((it) => {
|
|
119
|
+
const arr = it.split("=");
|
|
120
|
+
res[arr[0]] = arr[1];
|
|
121
|
+
});
|
|
122
|
+
return res;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* 添加 url 中的 query 的参数
|
|
127
|
+
* @param url
|
|
128
|
+
* @param params
|
|
129
|
+
* @returns url string
|
|
130
|
+
*/
|
|
131
|
+
export function addQuery(url, params) {
|
|
132
|
+
const newObj = { ...searchToObj(url), ...params };
|
|
133
|
+
return replaceSearch(url, objToSearch(newObj, !!params));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 添加 url 中的 query 参数,返回 search
|
|
138
|
+
* @param url
|
|
139
|
+
* @param params
|
|
140
|
+
* @returns search string
|
|
141
|
+
*/
|
|
142
|
+
export function addSearch(url: string, params: Record<string, unknown>) {
|
|
143
|
+
const newObj = { ...searchToObj(url), ...params };
|
|
144
|
+
return objToSearch(newObj, !!params);
|
|
145
|
+
}
|