nhanh-pure-function 1.3.14 → 1.3.16
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/lib/Utility/Utility.d.ts +65 -3
- package/lib/Utility/Utility.js +146 -1
- package/package.json +1 -1
package/lib/Utility/Utility.d.ts
CHANGED
|
@@ -84,7 +84,7 @@ export function _ReadFile(src: string): Promise<string>;
|
|
|
84
84
|
* @param {string} [defaultName="file"] - 默认的文件名,当无法提取时使用
|
|
85
85
|
* @returns {string} 提取到的文件名或默认的文件名
|
|
86
86
|
*/
|
|
87
|
-
export function _GetHrefName(href: string, defaultName
|
|
87
|
+
export function _GetHrefName(href: string, defaultName?: string): string;
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
90
|
* 下载文件
|
|
@@ -155,7 +155,7 @@ export function _GenerateUUID(prefix?: string): string;
|
|
|
155
155
|
* @param {number} delay
|
|
156
156
|
* @returns {Function}
|
|
157
157
|
*/
|
|
158
|
-
export function _Debounce<T extends
|
|
158
|
+
export function _Debounce<T extends (...args: any) => any>(
|
|
159
159
|
fn: T,
|
|
160
160
|
delay: number
|
|
161
161
|
): (...args: Parameters<T>) => void;
|
|
@@ -166,7 +166,7 @@ export function _Debounce<T extends Function>(
|
|
|
166
166
|
* @param {number} delay
|
|
167
167
|
* @returns {Function}
|
|
168
168
|
*/
|
|
169
|
-
export function _Throttle<T extends
|
|
169
|
+
export function _Throttle<T extends (...args: any) => any>(
|
|
170
170
|
fn: T,
|
|
171
171
|
delay: number
|
|
172
172
|
): (...args: Parameters<T>) => void;
|
|
@@ -258,3 +258,65 @@ export function _CheckConnectionWithXHR(url: string): Promise<any>;
|
|
|
258
258
|
* @returns {boolean} - 如果URL指向安全上下文,则返回true;否则返回false
|
|
259
259
|
*/
|
|
260
260
|
export function _IsSecureContext(url: string): boolean;
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* 文件类型检查器类
|
|
264
|
+
* 用于检查和验证文件的类型
|
|
265
|
+
*/
|
|
266
|
+
export class _FileTypeChecker {
|
|
267
|
+
// 定义每种文件类型的扩展名数组
|
|
268
|
+
private static fileExtensions: {
|
|
269
|
+
image: string[];
|
|
270
|
+
ppt: string[];
|
|
271
|
+
word: string[];
|
|
272
|
+
excel: string[];
|
|
273
|
+
pdf: string[];
|
|
274
|
+
text: string[];
|
|
275
|
+
audio: string[];
|
|
276
|
+
video: string[];
|
|
277
|
+
archive: string[];
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* 检查文件是否符合某种类型
|
|
282
|
+
*
|
|
283
|
+
* @param url 文件的URL或路径,用于检查文件类型
|
|
284
|
+
* @param type 文件类型,必须是fileExtensions属性中定义的键之一
|
|
285
|
+
* @returns 如果文件符合指定类型,则返回true;否则返回false
|
|
286
|
+
*/
|
|
287
|
+
static check(
|
|
288
|
+
url: string,
|
|
289
|
+
type: keyof typeof _FileTypeChecker.fileExtensions
|
|
290
|
+
): boolean;
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* 内部方法:检查文件扩展名
|
|
294
|
+
*
|
|
295
|
+
* @param url 文件的URL或路径,用于提取文件扩展名
|
|
296
|
+
* @param validExtensions 有效的文件扩展名数组,用于比较
|
|
297
|
+
* @returns 如果文件扩展名在有效扩展名列表中,则返回true;否则返回false
|
|
298
|
+
*/
|
|
299
|
+
private static _checkExtension(
|
|
300
|
+
url: string,
|
|
301
|
+
validExtensions: string[]
|
|
302
|
+
): boolean;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* 旋转列表函数
|
|
307
|
+
*
|
|
308
|
+
* 该函数接受一个列表作为参数,并返回一个二维数组,其中每个内部数组都是原列表的一种旋转形式
|
|
309
|
+
* 旋转列表的原理是将原列表分割成两部分,并将这两部分重新组合,形成一个新的列表
|
|
310
|
+
*
|
|
311
|
+
* @param list T[] - 需要旋转的列表,列表元素类型为泛型T
|
|
312
|
+
* @returns T[][] - 返回一个二维数组,每个内部数组代表原列表的一种旋转形式
|
|
313
|
+
*/
|
|
314
|
+
export function _RotateList<T>(list: T[]): T[][];
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* 克隆给定值的函数
|
|
318
|
+
* 该函数尝试使用window.structuredClone方法进行深克隆,如果失败则使用自定义方法
|
|
319
|
+
* @param {any} val - 需要克隆的值
|
|
320
|
+
* @returns {any} - 克隆后的值
|
|
321
|
+
*/
|
|
322
|
+
export function _Clone<T>(val: T): T;
|
package/lib/Utility/Utility.js
CHANGED
|
@@ -93,7 +93,7 @@ export function _MergeObjects(
|
|
|
93
93
|
outTime = +new Date()
|
|
94
94
|
) {
|
|
95
95
|
/** 疑似死循环 */
|
|
96
|
-
if (outTime < +new Date() -
|
|
96
|
+
if (outTime < +new Date() - 300) {
|
|
97
97
|
console.error("_MergeObjects 合并异常:疑似死循环");
|
|
98
98
|
return null;
|
|
99
99
|
}
|
|
@@ -583,3 +583,148 @@ export function _IsSecureContext(url) {
|
|
|
583
583
|
// 如果找到匹配的安全协议前缀,则返回true,表示URL指向安全上下文;否则返回false
|
|
584
584
|
return secureProtocols.some((protocol) => url.startsWith(protocol));
|
|
585
585
|
}
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* 文件类型检查器类
|
|
589
|
+
* 用于检查和验证文件的类型
|
|
590
|
+
*/
|
|
591
|
+
export class _FileTypeChecker {
|
|
592
|
+
static fileExtensions = {
|
|
593
|
+
// 图片文件
|
|
594
|
+
image: [
|
|
595
|
+
".jpg",
|
|
596
|
+
".jpeg",
|
|
597
|
+
".png",
|
|
598
|
+
".gif",
|
|
599
|
+
".bmp",
|
|
600
|
+
".webp",
|
|
601
|
+
".tiff",
|
|
602
|
+
".svg",
|
|
603
|
+
".heif",
|
|
604
|
+
".heic",
|
|
605
|
+
".ico",
|
|
606
|
+
".raw",
|
|
607
|
+
".jfif",
|
|
608
|
+
],
|
|
609
|
+
// 演示文稿文件(PPT)
|
|
610
|
+
ppt: [".ppt", ".pptx"],
|
|
611
|
+
// Word 文件
|
|
612
|
+
word: [".doc", ".docx"],
|
|
613
|
+
// Excel 文件
|
|
614
|
+
excel: [".xls", ".xlsx"],
|
|
615
|
+
// PDF 文件
|
|
616
|
+
pdf: [".pdf"],
|
|
617
|
+
// 文本文件
|
|
618
|
+
text: [".txt", ".csv"],
|
|
619
|
+
// 音频文件
|
|
620
|
+
audio: [
|
|
621
|
+
".mp3",
|
|
622
|
+
".wav",
|
|
623
|
+
".ogg",
|
|
624
|
+
".flac",
|
|
625
|
+
".aac",
|
|
626
|
+
".wma",
|
|
627
|
+
".m4a",
|
|
628
|
+
".alac",
|
|
629
|
+
".ape",
|
|
630
|
+
".opus",
|
|
631
|
+
".amr",
|
|
632
|
+
".ra",
|
|
633
|
+
],
|
|
634
|
+
// 视频文件
|
|
635
|
+
video: [
|
|
636
|
+
".mp4",
|
|
637
|
+
".avi",
|
|
638
|
+
".mkv",
|
|
639
|
+
".mov",
|
|
640
|
+
".wmv",
|
|
641
|
+
".flv",
|
|
642
|
+
".webm",
|
|
643
|
+
".mpg",
|
|
644
|
+
".mpeg",
|
|
645
|
+
".3gp",
|
|
646
|
+
".vob",
|
|
647
|
+
".ogv",
|
|
648
|
+
".m4v",
|
|
649
|
+
".ts",
|
|
650
|
+
".rm",
|
|
651
|
+
".rmvb",
|
|
652
|
+
],
|
|
653
|
+
// 压缩包文件
|
|
654
|
+
archive: [
|
|
655
|
+
".zip",
|
|
656
|
+
".rar",
|
|
657
|
+
".tar",
|
|
658
|
+
".gz",
|
|
659
|
+
".bz2",
|
|
660
|
+
".xz",
|
|
661
|
+
".7z",
|
|
662
|
+
".tar.gz",
|
|
663
|
+
".tar.bz2",
|
|
664
|
+
".tar.xz",
|
|
665
|
+
],
|
|
666
|
+
};
|
|
667
|
+
|
|
668
|
+
// 判断文件类型
|
|
669
|
+
static check(url, type) {
|
|
670
|
+
const extensions = FileTypeChecker.fileExtensions[type];
|
|
671
|
+
return FileTypeChecker._checkExtension(url, extensions);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
// 通用的检查扩展名的函数
|
|
675
|
+
static _checkExtension(url, validExtensions) {
|
|
676
|
+
const lowerCaseUrl = url.toLowerCase();
|
|
677
|
+
return validExtensions.some((extension) =>
|
|
678
|
+
lowerCaseUrl.endsWith(extension)
|
|
679
|
+
);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* 旋转列表函数
|
|
685
|
+
*
|
|
686
|
+
* 该函数接受一个列表作为参数,并返回一个二维数组,其中每个内部数组都是原列表的一种旋转形式
|
|
687
|
+
* 旋转列表的原理是将原列表分割成两部分,并将这两部分重新组合,形成一个新的列表
|
|
688
|
+
*
|
|
689
|
+
* @param list T[] - 需要旋转的列表,列表元素类型为泛型T
|
|
690
|
+
* @returns T[][] - 返回一个二维数组,每个内部数组代表原列表的一种旋转形式
|
|
691
|
+
*/
|
|
692
|
+
export function _RotateList(list) {
|
|
693
|
+
// 使用map函数遍历列表,对于列表中的每个元素(这里不需要元素本身,所以用_表示)
|
|
694
|
+
// i表示当前元素的索引,利用这个索引对列表进行分割和重组
|
|
695
|
+
return list.map((_, i) => {
|
|
696
|
+
// 将当前索引i之后的元素与从列表开头到索引i之前的元素拼接成一个新的列表
|
|
697
|
+
// 这样做可以实现列表的旋转效果
|
|
698
|
+
return list.slice(i).concat(list.slice(0, i));
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* 克隆给定值的函数
|
|
704
|
+
* 该函数尝试使用window.structuredClone方法进行深克隆,如果失败则使用自定义方法
|
|
705
|
+
* @param {any} val - 需要克隆的值
|
|
706
|
+
* @returns {any} - 克隆后的值
|
|
707
|
+
*/
|
|
708
|
+
export function _Clone(val) {
|
|
709
|
+
// 保存原始的structuredClone方法引用
|
|
710
|
+
const oldClone = window.structuredClone;
|
|
711
|
+
|
|
712
|
+
// 定义一个新的克隆方法,用于处理非对象或null值,以及对象的合并
|
|
713
|
+
const newClone = (val) => {
|
|
714
|
+
// 如果val为null或不是对象,则直接返回val
|
|
715
|
+
if (val === null || typeof val !== "object") return val;
|
|
716
|
+
// 使用_MergeObjects函数合并对象,如果是数组则传递空数组作为第一个参数,否则传递空对象
|
|
717
|
+
return _MergeObjects(Array.isArray(val) ? [] : {}, val);
|
|
718
|
+
};
|
|
719
|
+
|
|
720
|
+
// 尝试使用原始的structuredClone方法或自定义的newClone方法进行克隆
|
|
721
|
+
try {
|
|
722
|
+
// 如果oldClone存在,则使用oldClone方法进行克隆,否则使用newClone方法
|
|
723
|
+
return oldClone ? oldClone(val) : newClone(val);
|
|
724
|
+
} catch (error) {
|
|
725
|
+
// 使用日志系统或其他方式记录错误信息
|
|
726
|
+
console.error("structuredClone error:", error);
|
|
727
|
+
// 如果oldClone存在且之前的尝试失败,则再次使用newClone方法尝试克隆
|
|
728
|
+
return oldClone && newClone(val);
|
|
729
|
+
}
|
|
730
|
+
}
|