nhanh-pure-function 1.3.13 → 1.3.15
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/User/User.d.ts +2 -2
- package/lib/User/User.js +11 -10
- package/lib/Utility/Utility.d.ts +64 -2
- package/lib/Utility/Utility.js +184 -22
- package/package.json +1 -1
package/lib/User/User.d.ts
CHANGED
|
@@ -184,9 +184,9 @@ export class _LocalDrag {
|
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
/** 进入全屏模式 */
|
|
187
|
-
export function _EnterFullscreen(content: HTMLElement): void
|
|
187
|
+
export function _EnterFullscreen(content: HTMLElement): Promise<void>;
|
|
188
188
|
/** 退出全屏模式 */
|
|
189
|
-
export function _ExitFullscreen(): void
|
|
189
|
+
export function _ExitFullscreen(): Promise<void>;
|
|
190
190
|
/** 判断是否处于全屏模式 */
|
|
191
191
|
export function _IsFullscreen(): HTMLElement | undefined;
|
|
192
192
|
|
package/lib/User/User.js
CHANGED
|
@@ -485,33 +485,34 @@ export class _LocalDrag {
|
|
|
485
485
|
|
|
486
486
|
/** 进入全屏模式 */
|
|
487
487
|
export function _EnterFullscreen(content) {
|
|
488
|
-
if (!content)
|
|
489
|
-
|
|
490
|
-
|
|
488
|
+
if (!content) {
|
|
489
|
+
return Promise.reject("No DOM: ", content);
|
|
490
|
+
} else if (content.requestFullscreen) {
|
|
491
|
+
return content.requestFullscreen();
|
|
491
492
|
} else if (content.mozRequestFullScreen) {
|
|
492
493
|
// Firefox
|
|
493
|
-
content.mozRequestFullScreen();
|
|
494
|
+
return content.mozRequestFullScreen();
|
|
494
495
|
} else if (content.webkitRequestFullscreen) {
|
|
495
496
|
// Chrome, Safari and Opera
|
|
496
|
-
content.webkitRequestFullscreen();
|
|
497
|
+
return content.webkitRequestFullscreen();
|
|
497
498
|
} else if (content.msRequestFullscreen) {
|
|
498
499
|
// IE/Edge
|
|
499
|
-
content.msRequestFullscreen();
|
|
500
|
+
return content.msRequestFullscreen();
|
|
500
501
|
}
|
|
501
502
|
}
|
|
502
503
|
/** 退出全屏模式 */
|
|
503
504
|
export function _ExitFullscreen() {
|
|
504
505
|
if (document.exitFullscreen) {
|
|
505
|
-
document.exitFullscreen();
|
|
506
|
+
return document.exitFullscreen();
|
|
506
507
|
} else if (document.mozCancelFullScreen) {
|
|
507
508
|
// Firefox
|
|
508
|
-
document.mozCancelFullScreen();
|
|
509
|
+
return document.mozCancelFullScreen();
|
|
509
510
|
} else if (document.webkitExitFullscreen) {
|
|
510
511
|
// Chrome, Safari and Opera
|
|
511
|
-
document.webkitExitFullscreen();
|
|
512
|
+
return document.webkitExitFullscreen();
|
|
512
513
|
} else if (document.msExitFullscreen) {
|
|
513
514
|
// IE/Edge
|
|
514
|
-
document.msExitFullscreen();
|
|
515
|
+
return document.msExitFullscreen();
|
|
515
516
|
}
|
|
516
517
|
}
|
|
517
518
|
/** 判断是否处于全屏模式 */
|
package/lib/Utility/Utility.d.ts
CHANGED
|
@@ -65,7 +65,7 @@ export function _MergeObjects<T, T1>(A: T, B: T1): T & T1;
|
|
|
65
65
|
*/
|
|
66
66
|
export function _TimeTransition(
|
|
67
67
|
time: number | Date,
|
|
68
|
-
template
|
|
68
|
+
template?: string,
|
|
69
69
|
pad?: boolean
|
|
70
70
|
): string;
|
|
71
71
|
|
|
@@ -91,7 +91,7 @@ export function _GetHrefName(href: string, defaultName = "file"): string;
|
|
|
91
91
|
* @param {string} href 文件路径
|
|
92
92
|
* @param {string} fileName 导出文件名
|
|
93
93
|
*/
|
|
94
|
-
export function _DownloadFile(href: string, fileName?: string): void
|
|
94
|
+
export function _DownloadFile(href: string, fileName?: string): Promise<void>;
|
|
95
95
|
|
|
96
96
|
/**
|
|
97
97
|
* 获取帧率
|
|
@@ -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
|
@@ -86,34 +86,47 @@ export function _CapitalizeFirstLetter(string) {
|
|
|
86
86
|
* @param {Object | Array} B
|
|
87
87
|
* @returns A&B || B
|
|
88
88
|
*/
|
|
89
|
-
export function _MergeObjects(
|
|
89
|
+
export function _MergeObjects(
|
|
90
|
+
A,
|
|
91
|
+
B,
|
|
92
|
+
visitedObjects = [],
|
|
93
|
+
outTime = +new Date()
|
|
94
|
+
) {
|
|
95
|
+
/** 疑似死循环 */
|
|
96
|
+
if (outTime < +new Date() - 300) {
|
|
97
|
+
console.error("_MergeObjects 合并异常:疑似死循环");
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
|
|
90
101
|
const getType = (v) => (Array.isArray(v) ? "array" : typeof v);
|
|
91
102
|
const TA = getType(A);
|
|
92
103
|
const TB = getType(B);
|
|
93
104
|
|
|
94
105
|
if (TA != TB) return B;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
visitedObjects.push(A, B);
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
106
|
+
|
|
107
|
+
if (TA == "object" || TA == "array") {
|
|
108
|
+
if (visitedObjects.some(([a, b]) => a == A && b == B)) return A;
|
|
109
|
+
visitedObjects.push([A, B]);
|
|
110
|
+
|
|
111
|
+
if (TA == "object") {
|
|
112
|
+
for (const key in B) {
|
|
113
|
+
if (Object.prototype.hasOwnProperty.call(B, key)) {
|
|
114
|
+
const BC = B[key];
|
|
115
|
+
const AC = A[key];
|
|
116
|
+
const fianlValue = _MergeObjects(AC, BC, visitedObjects, outTime);
|
|
117
|
+
A[key] = fianlValue;
|
|
118
|
+
}
|
|
105
119
|
}
|
|
120
|
+
return A;
|
|
121
|
+
} else if (TA == "array") {
|
|
122
|
+
B.forEach((item, index) => {
|
|
123
|
+
const BC = item;
|
|
124
|
+
const AC = A[index];
|
|
125
|
+
const fianlValue = _MergeObjects(AC, BC, visitedObjects, outTime);
|
|
126
|
+
A[index] = fianlValue;
|
|
127
|
+
});
|
|
128
|
+
return A;
|
|
106
129
|
}
|
|
107
|
-
return A;
|
|
108
|
-
} else if (TA == "array") {
|
|
109
|
-
visitedObjects.push(A, B);
|
|
110
|
-
B.forEach((item, index) => {
|
|
111
|
-
const BC = item;
|
|
112
|
-
const AC = A[index];
|
|
113
|
-
const fianlValue = _MergeObjects(AC, BC, visitedObjects);
|
|
114
|
-
A[index] = fianlValue;
|
|
115
|
-
});
|
|
116
|
-
return A;
|
|
117
130
|
} else return B;
|
|
118
131
|
}
|
|
119
132
|
|
|
@@ -123,7 +136,11 @@ export function _MergeObjects(A, B, visitedObjects = []) {
|
|
|
123
136
|
* @param {String} template 完整模板 --> YYYY MM DD hh mm ss ms
|
|
124
137
|
* @param {Boolean} pad 补0
|
|
125
138
|
*/
|
|
126
|
-
export function _TimeTransition(
|
|
139
|
+
export function _TimeTransition(
|
|
140
|
+
time,
|
|
141
|
+
template = "YYYY-MM-DD hh:mm:ss",
|
|
142
|
+
pad = true
|
|
143
|
+
) {
|
|
127
144
|
try {
|
|
128
145
|
time = new Date(time);
|
|
129
146
|
} catch (error) {
|
|
@@ -566,3 +583,148 @@ export function _IsSecureContext(url) {
|
|
|
566
583
|
// 如果找到匹配的安全协议前缀,则返回true,表示URL指向安全上下文;否则返回false
|
|
567
584
|
return secureProtocols.some((protocol) => url.startsWith(protocol));
|
|
568
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
|
+
}
|