@minto-ai/tools 1.0.2 → 1.0.33
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/README.md +8 -124
- package/dist/browser/index.d.ts +1 -1
- package/dist/core/be-parsed-as-number.d.ts +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/file/__test__/get-file-suffix.test.d.ts +1 -0
- package/dist/file/__test__/is-file-path.test.d.ts +1 -0
- package/dist/file/extends/enum.d.ts +1 -19
- package/dist/file/extends/regex.d.ts +2 -3
- package/dist/file/index.d.ts +5 -8
- package/dist/file/is-music-file-path.d.ts +8 -0
- package/dist/file/types/index.d.ts +2 -13
- package/dist/function/debounce.d.ts +2 -2
- package/dist/function/index.d.ts +1 -1
- package/dist/function/throttle.d.ts +2 -2
- package/dist/index.d.ts +4 -4
- package/dist/index.js +74 -121
- package/dist/math/index.d.ts +1 -1
- package/dist/object/index.d.ts +1 -1
- package/package.json +6 -6
- package/dist/file/get-file-feed-type.d.ts +0 -9
- package/dist/file/get-file-item-icon.d.ts +0 -9
- package/dist/file/get-file-item-suffix.d.ts +0 -9
package/README.md
CHANGED
|
@@ -637,8 +637,8 @@ console.log(divide(100.001, 0.001)) // 100001
|
|
|
637
637
|
import { copyText } from '@minto-ai/tools'
|
|
638
638
|
|
|
639
639
|
copyText('Hello, World!').then(
|
|
640
|
-
|
|
641
|
-
|
|
640
|
+
text => console.log('Text copied to clipboard:', text),
|
|
641
|
+
error => console.error('Failed to copy text:', error)
|
|
642
642
|
)
|
|
643
643
|
```
|
|
644
644
|
|
|
@@ -806,37 +806,8 @@ console.log(uuid) // 输出类似于 "1gann4cq9b6r"
|
|
|
806
806
|
| `XLS` | `xls` | Excel 工作簿 |
|
|
807
807
|
| `XLSX` | `xlsx` | Excel 工作簿 (XML 格式) |
|
|
808
808
|
|
|
809
|
-
#### `FileItemFeedTypeEnum`
|
|
810
|
-
|
|
811
|
-
一个枚举类型,用于表示文件喂养类型
|
|
812
|
-
|
|
813
|
-
| 枚举键名 | 值 | 描述 |
|
|
814
|
-
| ------------- | ---- | ----------------------------- |
|
|
815
|
-
| `ALL` | ` ` | 所有类型内容 |
|
|
816
|
-
| `DOCUMENT` | `0` | 文档类型内容 |
|
|
817
|
-
| `TEXT` | `1` | 纯文本内容 |
|
|
818
|
-
| `IMG` | `2` | 图片类型内容 |
|
|
819
|
-
| `VIDEO` | `3` | 视频类型内容 |
|
|
820
|
-
| `PPT` | `4` | 幻灯片(PPT)类型内容 |
|
|
821
|
-
| `QA` | `5` | 问答(QA)类型内容 |
|
|
822
|
-
| `AUDIO` | `6` | 音频类型内容 |
|
|
823
|
-
| `MUSIC` | `7` | 音乐类型内容 |
|
|
824
|
-
| `AUTOHTML` | `8` | 自动生成的 HTML 内容 |
|
|
825
|
-
| `TWEET` | `9` | 社交媒体推文(Tweet)类型内容 |
|
|
826
|
-
| `COMIC_STRIP` | `10` | 漫画(Comic Strip)类型内容 |
|
|
827
|
-
|
|
828
809
|
### 类型
|
|
829
810
|
|
|
830
|
-
#### `IFileItem`
|
|
831
|
-
|
|
832
|
-
`IFileItem` 是一个用于描述文件信息的接口,包含文件的基本信息和相关 URL。
|
|
833
|
-
| 属性名 | 类型 | 描述 |
|
|
834
|
-
|----------|-----------|---------------------|
|
|
835
|
-
| `title` | `string` | 文件的标题或名称,用于显示。 |
|
|
836
|
-
| `viewUrl` | `string` | 文件在Obs服务器上原始地址 |
|
|
837
|
-
|`createTime`|`string`|文件创建时间|
|
|
838
|
-
|`feedType`|`FileItemFeedType`|文件喂养类型|
|
|
839
|
-
|
|
840
811
|
#### `FileSuffix`
|
|
841
812
|
|
|
842
813
|
`FileSuffix` 是一个基于 `FileSuffixEnum` 枚举的类型别名,用于表示文件后缀。
|
|
@@ -857,10 +828,6 @@ console.log(uuid) // 输出类似于 "1gann4cq9b6r"
|
|
|
857
828
|
|
|
858
829
|
`DocumentFileSuffix` 是一个基于 `DocumentFileSuffixEnum` 枚举的类型别名,用于表示文档文件后缀。
|
|
859
830
|
|
|
860
|
-
#### `FileItemFeedType`
|
|
861
|
-
|
|
862
|
-
`FileItemFeedType` 是一个基于 `FileItemFeedTypeEnum` 枚举的类型别名,用于表示文件类型。
|
|
863
|
-
|
|
864
831
|
### `getFileSuffix`
|
|
865
832
|
|
|
866
833
|
> `function getFileSuffix(filePath: string): FileSuffix`
|
|
@@ -1069,7 +1036,7 @@ console.log(isDocumentFilePath('/path/to/document.doc')) // true
|
|
|
1069
1036
|
#### 示例
|
|
1070
1037
|
|
|
1071
1038
|
```typescript
|
|
1072
|
-
import {
|
|
1039
|
+
import { FileSuffixEnum, getFileSuffixIcon } from '@minto-ai/tools'
|
|
1073
1040
|
|
|
1074
1041
|
console.log(getFileSuffixIcon(FileSuffixEnum.PDF)) // 返回 pdfIcon 的路径
|
|
1075
1042
|
console.log(getFileSuffixIcon(FileSuffixEnum.JPG)) // 返回 imageIcon 的路径
|
|
@@ -1099,90 +1066,6 @@ console.log(getFileIcon('/path/to/file.pdf')) // 返回 pdfIcon 的路径
|
|
|
1099
1066
|
console.log(getFileIcon('/path/to/file.txt')) // 返回 txtIcon 的路径
|
|
1100
1067
|
```
|
|
1101
1068
|
|
|
1102
|
-
### `getFileItemSuffix`
|
|
1103
|
-
|
|
1104
|
-
> `function getFileItemSuffix(fileItem: IFileItem): FileSuffix`
|
|
1105
|
-
|
|
1106
|
-
从文件实例中提取文件类型后缀。该函数内部包含多种逻辑,可以直接调用或根据需求进行修改。
|
|
1107
|
-
|
|
1108
|
-
#### 参数
|
|
1109
|
-
|
|
1110
|
-
- `fileItem(IFileItem)`: 文件实例,包含文件的基本信息和路径。
|
|
1111
|
-
|
|
1112
|
-
#### 返回
|
|
1113
|
-
|
|
1114
|
-
`(FileSuffix)`: 文件类型后缀。如果无法提取有效后缀,则返回空字符串。
|
|
1115
|
-
|
|
1116
|
-
#### 示例
|
|
1117
|
-
|
|
1118
|
-
```typescript
|
|
1119
|
-
import { getFileItemSuffix } from '@minto-ai/tools'
|
|
1120
|
-
|
|
1121
|
-
console.log(
|
|
1122
|
-
getFileItemSuffix({
|
|
1123
|
-
title: 'pdf文件',
|
|
1124
|
-
viewUrl: '/path/to/file.pdf',
|
|
1125
|
-
createTime: '2024-03-19 20:37:30'
|
|
1126
|
-
})
|
|
1127
|
-
) // 返回 "pdf"
|
|
1128
|
-
```
|
|
1129
|
-
|
|
1130
|
-
### `getFileItemIcon`
|
|
1131
|
-
|
|
1132
|
-
> `function getFileItemIcon(fileItem: IFileItem): string`
|
|
1133
|
-
|
|
1134
|
-
从文件实例中提取文件类型图标。该函数通过文件实例的后缀获取对应的图标。
|
|
1135
|
-
|
|
1136
|
-
#### 参数
|
|
1137
|
-
|
|
1138
|
-
- `fileItem (IFileItem)`: 文件实例,包含文件的基本信息和路径。
|
|
1139
|
-
|
|
1140
|
-
#### 返回
|
|
1141
|
-
|
|
1142
|
-
`(string)`: 文件类型的图标路径。如果无法提取有效后缀,则返回默认图标路径。
|
|
1143
|
-
|
|
1144
|
-
#### 示例
|
|
1145
|
-
|
|
1146
|
-
```typescript
|
|
1147
|
-
import { getFileItemIcon } from '@minto-ai/tools'
|
|
1148
|
-
|
|
1149
|
-
console.log(
|
|
1150
|
-
getFileItemIcon({
|
|
1151
|
-
title: 'image文件',
|
|
1152
|
-
viewUrl: '/path/to/image.jpg',
|
|
1153
|
-
createTime: '2024-03-19 20:37:30'
|
|
1154
|
-
})
|
|
1155
|
-
) // image图标
|
|
1156
|
-
```
|
|
1157
|
-
|
|
1158
|
-
### `getFileFeedType`
|
|
1159
|
-
|
|
1160
|
-
> `function getFileFeedType(filePath: string): FileItemFeedType | undefined`
|
|
1161
|
-
|
|
1162
|
-
根据文件路径获取`feedType`。该函数通过文件路径提取文件后缀,并根据预定义的映射关系返回对应的`feedType`(`FileItemFeedTypeEnum`)。
|
|
1163
|
-
|
|
1164
|
-
#### 参数
|
|
1165
|
-
|
|
1166
|
-
- `filePath (string)`: 文件路径,例如 `/path/to/file.txt`。
|
|
1167
|
-
|
|
1168
|
-
#### 返回
|
|
1169
|
-
|
|
1170
|
-
`(FileItemFeedType | undefined)`: 如果文件后缀无法识别,则返回 `undefined`。
|
|
1171
|
-
|
|
1172
|
-
#### 例子
|
|
1173
|
-
|
|
1174
|
-
```typescript
|
|
1175
|
-
import { getFileFeedType } from '@minto-ai/tools'
|
|
1176
|
-
|
|
1177
|
-
const filePath1 = 'https://example.com/image.jpg'
|
|
1178
|
-
const filePath2 = 'https://example.com/document.pdf'
|
|
1179
|
-
const filePath3 = 'https://example.com/unknown.file'
|
|
1180
|
-
|
|
1181
|
-
console.log(getFileFeedType(filePath1)) // 输出: FileItemFeedTypeEnum.IMG
|
|
1182
|
-
console.log(getFileFeedType(filePath2)) // 输出: FileItemFeedTypeEnum.TEXT
|
|
1183
|
-
console.log(getFileFeedType(filePath3)) // 输出: undefined
|
|
1184
|
-
```
|
|
1185
|
-
|
|
1186
1069
|
### `singleDownloadFile`
|
|
1187
1070
|
|
|
1188
1071
|
> `function singleDownloadFile(filePath: string, fileName?: string): Promise<void>`
|
|
@@ -1258,7 +1141,8 @@ import { isWebSocketSupported } from '@minto-ai/tools'
|
|
|
1258
1141
|
|
|
1259
1142
|
if (isWebSocketSupported()) {
|
|
1260
1143
|
console.log('WebSocket is supported!')
|
|
1261
|
-
}
|
|
1144
|
+
}
|
|
1145
|
+
else {
|
|
1262
1146
|
console.log('WebSocket is not supported!')
|
|
1263
1147
|
}
|
|
1264
1148
|
```
|
|
@@ -1307,7 +1191,7 @@ const socket = createWebSocket('ws://example.com')
|
|
|
1307
1191
|
```typescript
|
|
1308
1192
|
import { createWorker } from '@minto-ai/tools'
|
|
1309
1193
|
|
|
1310
|
-
const myWorker = createWorker(
|
|
1194
|
+
const myWorker = createWorker(() => {
|
|
1311
1195
|
console.log('Hello from the Web Worker!')
|
|
1312
1196
|
})
|
|
1313
1197
|
```
|
|
@@ -1325,9 +1209,9 @@ const myWorker = createWorker(function () {
|
|
|
1325
1209
|
#### 例子
|
|
1326
1210
|
|
|
1327
1211
|
```typescript
|
|
1328
|
-
import {
|
|
1212
|
+
import { closeWorker, createWorker } from '@minto-ai/tools'
|
|
1329
1213
|
|
|
1330
|
-
const myWorker = createWorker(
|
|
1214
|
+
const myWorker = createWorker(() => {
|
|
1331
1215
|
console.log('Hello from the Web Worker!')
|
|
1332
1216
|
})
|
|
1333
1217
|
// 当不再需要 Worker 时
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ import { default as isAndroid } from './is-android';
|
|
|
3
3
|
import { default as isIos } from './is-ios';
|
|
4
4
|
import { default as isMobile } from './is-mobile';
|
|
5
5
|
import { default as isPc } from './is-pc';
|
|
6
|
-
export { copyText, isIos, isMobile, isPc
|
|
6
|
+
export { copyText, isAndroid, isIos, isMobile, isPc };
|
package/dist/core/index.d.ts
CHANGED
|
@@ -10,4 +10,4 @@ import { default as isNumber } from './is-number';
|
|
|
10
10
|
import { default as isObject } from './is-object';
|
|
11
11
|
import { default as isString } from './is-string';
|
|
12
12
|
import { default as isUndefined } from './is-undefined';
|
|
13
|
-
export { checkArrayEmpty, checkEmpty, checkEmptyNotZero, checkObjectEmpty, isArray, isNumber, isObject, isString,
|
|
13
|
+
export { beParsedAsNumber, canBeParsedAsNumber, checkArrayEmpty, checkEmpty, checkEmptyNotZero, checkObjectEmpty, isArray, isNullOrUndefined, isNumber, isObject, isString, isUndefined, };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -22,7 +22,6 @@ declare const FileSuffixEnum: {
|
|
|
22
22
|
readonly WAV: "wav";
|
|
23
23
|
readonly TXT: "txt";
|
|
24
24
|
readonly HTML: "html";
|
|
25
|
-
readonly NULL: "";
|
|
26
25
|
};
|
|
27
26
|
/**
|
|
28
27
|
* 图片后缀类型枚举
|
|
@@ -61,21 +60,4 @@ declare const DocumentFileSuffixEnum: {
|
|
|
61
60
|
readonly XLS: "xls";
|
|
62
61
|
readonly XLSX: "xlsx";
|
|
63
62
|
};
|
|
64
|
-
|
|
65
|
-
* feedType类型枚举
|
|
66
|
-
*/
|
|
67
|
-
declare const FileItemFeedTypeEnum: {
|
|
68
|
-
readonly ALL: "";
|
|
69
|
-
readonly DOCUMENT: 0;
|
|
70
|
-
readonly TEXT: 1;
|
|
71
|
-
readonly IMG: 2;
|
|
72
|
-
readonly VIDEO: 3;
|
|
73
|
-
readonly PPT: 4;
|
|
74
|
-
readonly QA: 5;
|
|
75
|
-
readonly AUDIO: 6;
|
|
76
|
-
readonly MUSIC: 7;
|
|
77
|
-
readonly AUTOHTML: 8;
|
|
78
|
-
readonly TWEET: 9;
|
|
79
|
-
readonly COMIC_STRIP: 10;
|
|
80
|
-
};
|
|
81
|
-
export { FileSuffixEnum, FileItemFeedTypeEnum, ImageFileSuffixEnum, VideoFileSuffixEnum, PptFileSuffixEnum, DocumentFileSuffixEnum };
|
|
63
|
+
export { DocumentFileSuffixEnum, FileSuffixEnum, ImageFileSuffixEnum, PptFileSuffixEnum, VideoFileSuffixEnum, };
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
declare const
|
|
2
|
-
|
|
3
|
-
export { fileSuffixRegex, fileNameRegex };
|
|
1
|
+
declare const filePathRegex: RegExp;
|
|
2
|
+
export { filePathRegex };
|
package/dist/file/index.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
+
import { DocumentFileSuffix, FileSuffix, ImageFileSuffix, PptFileSuffix, VideoFileSuffix } from './types';
|
|
1
2
|
import { default as batchDownloadFile } from './batch-download-file';
|
|
2
|
-
import { FileSuffixEnum,
|
|
3
|
-
import { default as getFileFeedType } from './get-file-feed-type';
|
|
3
|
+
import { FileSuffixEnum, ImageFileSuffixEnum } from './extends/enum';
|
|
4
4
|
import { default as getFileIcon } from './get-file-icon';
|
|
5
|
-
import { default as getFileSuffixIcon } from './get-file-suffix-icon';
|
|
6
|
-
import { default as getFileItemIcon } from './get-file-item-icon';
|
|
7
|
-
import { default as getFileItemSuffix } from './get-file-item-suffix';
|
|
8
5
|
import { default as getFileName } from './get-file-name';
|
|
9
6
|
import { default as getFileSuffix } from './get-file-suffix';
|
|
7
|
+
import { default as getFileSuffixIcon } from './get-file-suffix-icon';
|
|
10
8
|
import { default as getFileTitle } from './get-file-title';
|
|
11
9
|
import { default as isDocumentFilePath } from './is-document-file-path';
|
|
12
10
|
import { default as isFilePath } from './is-file-path';
|
|
@@ -14,6 +12,5 @@ import { default as isImageFilePath } from './is-image-file-path';
|
|
|
14
12
|
import { default as isPptFilePath } from './is-ppt-file-path';
|
|
15
13
|
import { default as isVideoFilePath } from './is-video-file-path';
|
|
16
14
|
import { default as singleDownloadFile } from './single-download-file';
|
|
17
|
-
|
|
18
|
-
export
|
|
19
|
-
export { getFileName, getFileTitle, getFileSuffix, isFilePath, getFileIcon, getFileItemIcon, getFileSuffixIcon, getFileItemSuffix, singleDownloadFile, batchDownloadFile, FileSuffixEnum, FileItemFeedTypeEnum, ImageFileSuffixEnum, getFileFeedType, isImageFilePath, isVideoFilePath, isDocumentFilePath, isPptFilePath };
|
|
15
|
+
export type { DocumentFileSuffix, FileSuffix, ImageFileSuffix, PptFileSuffix, VideoFileSuffix, };
|
|
16
|
+
export { batchDownloadFile, FileSuffixEnum, getFileIcon, getFileName, getFileSuffix, getFileSuffixIcon, getFileTitle, ImageFileSuffixEnum, isDocumentFilePath, isFilePath, isImageFilePath, isPptFilePath, isVideoFilePath, singleDownloadFile, };
|
|
@@ -1,18 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DocumentFileSuffixEnum, FileSuffixEnum, ImageFileSuffixEnum, PptFileSuffixEnum, VideoFileSuffixEnum } from '../extends/enum';
|
|
2
2
|
type FileSuffix = (typeof FileSuffixEnum)[keyof typeof FileSuffixEnum];
|
|
3
3
|
type ImageFileSuffix = (typeof ImageFileSuffixEnum)[keyof typeof ImageFileSuffixEnum];
|
|
4
4
|
type VideoFileSuffix = (typeof VideoFileSuffixEnum)[keyof typeof VideoFileSuffixEnum];
|
|
5
5
|
type PptFileSuffix = (typeof PptFileSuffixEnum)[keyof typeof PptFileSuffixEnum];
|
|
6
6
|
type DocumentFileSuffix = (typeof DocumentFileSuffixEnum)[keyof typeof DocumentFileSuffixEnum];
|
|
7
|
-
type
|
|
8
|
-
/**
|
|
9
|
-
* 明塗内部文件对象
|
|
10
|
-
*/
|
|
11
|
-
interface IFileItem {
|
|
12
|
-
title: string;
|
|
13
|
-
viewUrl?: string;
|
|
14
|
-
previewUrl?: string;
|
|
15
|
-
createTime?: string;
|
|
16
|
-
feedType?: FileItemFeedType;
|
|
17
|
-
}
|
|
18
|
-
export type { IFileItem, FileSuffix, FileItemFeedType, ImageFileSuffix, VideoFileSuffix, PptFileSuffix, DocumentFileSuffix };
|
|
7
|
+
export type { DocumentFileSuffix, FileSuffix, ImageFileSuffix, PptFileSuffix, VideoFileSuffix, };
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 防抖函数的类型定义
|
|
3
3
|
* @template T - 原始函数的类型
|
|
4
4
|
*/
|
|
5
|
-
|
|
5
|
+
interface DebouncedFunction<T extends (...args: any[]) => any> {
|
|
6
6
|
/**
|
|
7
7
|
* 防抖后的函数,参数类型与原函数一致
|
|
8
8
|
*/
|
|
@@ -11,7 +11,7 @@ type DebouncedFunction<T extends (...args: any[]) => any> = {
|
|
|
11
11
|
* 取消防抖函数的未执行部分
|
|
12
12
|
*/
|
|
13
13
|
cancel: () => void;
|
|
14
|
-
}
|
|
14
|
+
}
|
|
15
15
|
/**
|
|
16
16
|
* 创建一个防抖函数。
|
|
17
17
|
* 防抖函数的作用是限制一个函数在短时间内频繁触发的次数,直到指定的延迟时间结束后才执行。
|
package/dist/function/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* 节流函数的类型定义
|
|
3
3
|
* @template T - 原始函数的类型
|
|
4
4
|
*/
|
|
5
|
-
|
|
5
|
+
interface ThrottledFunction<T extends (...args: any[]) => any> {
|
|
6
6
|
/**
|
|
7
7
|
* 节流后的函数,参数类型与原函数一致
|
|
8
8
|
*/
|
|
@@ -11,7 +11,7 @@ type ThrottledFunction<T extends (...args: any[]) => any> = {
|
|
|
11
11
|
* 取消节流函数的未执行部分
|
|
12
12
|
*/
|
|
13
13
|
cancel: () => void;
|
|
14
|
-
}
|
|
14
|
+
}
|
|
15
15
|
/**
|
|
16
16
|
* 创建一个节流函数。
|
|
17
17
|
* 节流函数的作用是限制一个函数在一定时间内最多执行一次,避免高频触发导致的性能问题。
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export * from './array';
|
|
2
2
|
export * from './browser';
|
|
3
3
|
export * from './core';
|
|
4
|
-
export * from './object';
|
|
5
|
-
export * from './supply';
|
|
6
|
-
export * from './web-socket';
|
|
7
|
-
export * from './wrker';
|
|
8
4
|
export * from './file';
|
|
9
5
|
export * from './function';
|
|
10
6
|
export * from './math';
|
|
7
|
+
export * from './object';
|
|
11
8
|
export * from './string';
|
|
9
|
+
export * from './supply';
|
|
10
|
+
export * from './web-socket';
|
|
11
|
+
export * from './wrker';
|
package/dist/index.js
CHANGED
|
@@ -67,7 +67,7 @@ function beParsedAsNumber(value) {
|
|
|
67
67
|
return Number.NaN;
|
|
68
68
|
}
|
|
69
69
|
function canBeParsedAsNumber(value) {
|
|
70
|
-
return
|
|
70
|
+
return !Number.isNaN(Number.parseFloat(String(value))) && Number.isFinite(Number(value));
|
|
71
71
|
}
|
|
72
72
|
function isArray(value) {
|
|
73
73
|
return Array.isArray(value);
|
|
@@ -100,54 +100,6 @@ function isNullOrUndefined(value) {
|
|
|
100
100
|
function isUndefined(value) {
|
|
101
101
|
return value === void 0;
|
|
102
102
|
}
|
|
103
|
-
function deepFreeze(obj) {
|
|
104
|
-
if (isObject(obj)) {
|
|
105
|
-
Object.keys(obj).forEach((key) => {
|
|
106
|
-
const prop = obj[key];
|
|
107
|
-
if (prop && typeof prop === "object") {
|
|
108
|
-
deepFreeze(prop);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
return Object.freeze(obj);
|
|
113
|
-
}
|
|
114
|
-
function pickObject(obj, keys) {
|
|
115
|
-
const result = {};
|
|
116
|
-
keys.forEach((key) => {
|
|
117
|
-
if (key in obj) {
|
|
118
|
-
result[key] = obj[key];
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
return result;
|
|
122
|
-
}
|
|
123
|
-
function getUuid() {
|
|
124
|
-
return window.crypto.getRandomValues(new Uint32Array(1))[0].toString(36);
|
|
125
|
-
}
|
|
126
|
-
function timeDelay(delay) {
|
|
127
|
-
if (typeof delay !== "number" || delay < 0) {
|
|
128
|
-
throw new Error("延迟时间必须是非负数");
|
|
129
|
-
}
|
|
130
|
-
return new Promise((resolve) => {
|
|
131
|
-
setTimeout(resolve, delay);
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
function createWebSocket(url) {
|
|
135
|
-
return new WebSocket(url);
|
|
136
|
-
}
|
|
137
|
-
function isWebSocketSupported() {
|
|
138
|
-
return ["WebSocket", "MozWebSocket"].some((key) => key in window);
|
|
139
|
-
}
|
|
140
|
-
function closeWorker(worker) {
|
|
141
|
-
if (!worker) return;
|
|
142
|
-
worker.terminate();
|
|
143
|
-
}
|
|
144
|
-
function createWorker(fun) {
|
|
145
|
-
const blob = new Blob([`(${fun.toString()})()`]);
|
|
146
|
-
const url = window.URL.createObjectURL(blob);
|
|
147
|
-
const worker = new Worker(url);
|
|
148
|
-
window.URL.revokeObjectURL(url);
|
|
149
|
-
return worker;
|
|
150
|
-
}
|
|
151
103
|
const FileSuffixEnum = {
|
|
152
104
|
DOC: "doc",
|
|
153
105
|
DOCX: "docx",
|
|
@@ -168,8 +120,7 @@ const FileSuffixEnum = {
|
|
|
168
120
|
MP3: "mp3",
|
|
169
121
|
WAV: "wav",
|
|
170
122
|
TXT: "txt",
|
|
171
|
-
HTML: "html"
|
|
172
|
-
NULL: ""
|
|
123
|
+
HTML: "html"
|
|
173
124
|
};
|
|
174
125
|
const ImageFileSuffixEnum = {
|
|
175
126
|
JPG: FileSuffixEnum.JPG,
|
|
@@ -196,29 +147,15 @@ const DocumentFileSuffixEnum = {
|
|
|
196
147
|
XLS: FileSuffixEnum.XLS,
|
|
197
148
|
XLSX: FileSuffixEnum.XLSX
|
|
198
149
|
};
|
|
199
|
-
const
|
|
200
|
-
ALL: "",
|
|
201
|
-
DOCUMENT: 0,
|
|
202
|
-
TEXT: 1,
|
|
203
|
-
IMG: 2,
|
|
204
|
-
VIDEO: 3,
|
|
205
|
-
PPT: 4,
|
|
206
|
-
QA: 5,
|
|
207
|
-
AUDIO: 6,
|
|
208
|
-
MUSIC: 7,
|
|
209
|
-
AUTOHTML: 8,
|
|
210
|
-
TWEET: 9,
|
|
211
|
-
COMIC_STRIP: 10
|
|
212
|
-
};
|
|
213
|
-
const fileSuffixRegex = new RegExp(`\\.(${Object.values(FileSuffixEnum).join("|")})$`, "i");
|
|
214
|
-
const fileNameRegex = /([^/]*)$/;
|
|
150
|
+
const filePathRegex = new RegExp(`(.*?)([^/.]*?)(\\.(${Object.values(FileSuffixEnum).join("|")}))?$`, "i");
|
|
215
151
|
function getFileSuffix(filePath) {
|
|
216
|
-
|
|
217
|
-
|
|
152
|
+
var _a, _b;
|
|
153
|
+
const matchResult = filePath.match(filePathRegex);
|
|
154
|
+
return ((_b = (_a = matchResult == null ? void 0 : matchResult[4]) == null ? void 0 : _a.toLowerCase) == null ? void 0 : _b.call(_a)) ?? "";
|
|
218
155
|
}
|
|
219
156
|
function getFileTitle(filePath) {
|
|
220
|
-
const matchResult = filePath.match(
|
|
221
|
-
return matchResult ? matchResult[
|
|
157
|
+
const matchResult = filePath.match(filePathRegex);
|
|
158
|
+
return matchResult ? matchResult[3] : "";
|
|
222
159
|
}
|
|
223
160
|
function getFileName(filePath) {
|
|
224
161
|
const fileTitle = getFileTitle(filePath);
|
|
@@ -253,7 +190,7 @@ async function batchDownloadFile(fileList, zipName) {
|
|
|
253
190
|
});
|
|
254
191
|
})
|
|
255
192
|
);
|
|
256
|
-
} catch
|
|
193
|
+
} catch {
|
|
257
194
|
throw new Error("批量下载失败,部分文件下载出错。");
|
|
258
195
|
}
|
|
259
196
|
const zipData = await zip.generateAsync({
|
|
@@ -269,29 +206,6 @@ async function batchDownloadFile(fileList, zipName) {
|
|
|
269
206
|
const hasZip = zipName.lastIndexOf(".zip") === zipName.length - 4;
|
|
270
207
|
FileSaver.saveAs(zipData, `${hasZip ? zipName : `${zipName}.zip`}`);
|
|
271
208
|
}
|
|
272
|
-
const FILE_SUFFIX_TO_FEED_TYPE_MAPPING = [
|
|
273
|
-
{
|
|
274
|
-
suffixes: Object.values(ImageFileSuffixEnum),
|
|
275
|
-
feedType: FileItemFeedTypeEnum.IMG
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
suffixes: Object.values(VideoFileSuffixEnum),
|
|
279
|
-
feedType: FileItemFeedTypeEnum.VIDEO
|
|
280
|
-
},
|
|
281
|
-
{
|
|
282
|
-
suffixes: Object.values(PptFileSuffixEnum),
|
|
283
|
-
feedType: FileItemFeedTypeEnum.PPT
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
suffixes: Object.values(DocumentFileSuffixEnum),
|
|
287
|
-
feedType: FileItemFeedTypeEnum.TEXT
|
|
288
|
-
}
|
|
289
|
-
];
|
|
290
|
-
function getFileFeedType(filePath) {
|
|
291
|
-
var _a;
|
|
292
|
-
const fileSuffix = getFileSuffix(filePath);
|
|
293
|
-
return (_a = FILE_SUFFIX_TO_FEED_TYPE_MAPPING.find(({ suffixes }) => suffixes.includes(fileSuffix))) == null ? void 0 : _a.feedType;
|
|
294
|
-
}
|
|
295
209
|
const defaultIcon = "data:image/png;base64,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";
|
|
296
210
|
const excelIcon = "data:image/png;base64,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";
|
|
297
211
|
const htmlIcon = "data:image/png;base64,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";
|
|
@@ -340,43 +254,37 @@ function getFileIcon(filePath) {
|
|
|
340
254
|
const fileSuffix = getFileSuffix(filePath);
|
|
341
255
|
return getFileSuffixIcon(fileSuffix);
|
|
342
256
|
}
|
|
343
|
-
function
|
|
344
|
-
|
|
345
|
-
let fileSuffix = "";
|
|
346
|
-
[title, viewUrl].filter(Boolean).some((path) => {
|
|
347
|
-
if (!checkEmpty(getFileSuffix(path))) {
|
|
348
|
-
fileSuffix += `${getFileSuffix(path)}`;
|
|
349
|
-
return true;
|
|
350
|
-
}
|
|
257
|
+
function isFilePath(filePath) {
|
|
258
|
+
if (checkEmpty(filePath)) {
|
|
351
259
|
return false;
|
|
352
|
-
}
|
|
353
|
-
return
|
|
354
|
-
}
|
|
355
|
-
function getFileItemIcon(fileItem) {
|
|
356
|
-
const fileSuffix = getFileItemSuffix(fileItem);
|
|
357
|
-
const fileIcon = getFileSuffixIcon(fileSuffix);
|
|
358
|
-
return fileIcon;
|
|
260
|
+
}
|
|
261
|
+
return !!filePathRegex.test(filePath);
|
|
359
262
|
}
|
|
360
263
|
function isDocumentFilePath(filePath) {
|
|
361
|
-
if (!filePath)
|
|
264
|
+
if (!isFilePath(filePath)) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
362
267
|
const fileSuffix = getFileSuffix(filePath);
|
|
363
268
|
return Object.values(DocumentFileSuffixEnum).includes(fileSuffix);
|
|
364
269
|
}
|
|
365
|
-
function isFilePath(filePath) {
|
|
366
|
-
return !!getFileSuffix(filePath);
|
|
367
|
-
}
|
|
368
270
|
function isImageFilePath(filePath) {
|
|
369
|
-
if (!filePath)
|
|
271
|
+
if (!isFilePath(filePath)) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
370
274
|
const fileSuffix = getFileSuffix(filePath);
|
|
371
275
|
return Object.values(ImageFileSuffixEnum).includes(fileSuffix);
|
|
372
276
|
}
|
|
373
277
|
function isPptFilePath(filePath) {
|
|
374
|
-
if (!filePath)
|
|
278
|
+
if (!isFilePath(filePath)) {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
375
281
|
const fileSuffix = getFileSuffix(filePath);
|
|
376
282
|
return Object.values(PptFileSuffixEnum).includes(fileSuffix);
|
|
377
283
|
}
|
|
378
284
|
function isVideoFilePath(filePath) {
|
|
379
|
-
if (!filePath)
|
|
285
|
+
if (!isFilePath(filePath)) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
380
288
|
const fileSuffix = getFileSuffix(filePath);
|
|
381
289
|
return Object.values(VideoFileSuffixEnum).includes(fileSuffix);
|
|
382
290
|
}
|
|
@@ -484,6 +392,26 @@ function subtract(minuend, subtrahend) {
|
|
|
484
392
|
const difference = scaledMinuend - scaledSubtrahend;
|
|
485
393
|
return difference / scalingFactor;
|
|
486
394
|
}
|
|
395
|
+
function deepFreeze(obj) {
|
|
396
|
+
if (isObject(obj)) {
|
|
397
|
+
Object.keys(obj).forEach((key) => {
|
|
398
|
+
const prop = obj[key];
|
|
399
|
+
if (prop && typeof prop === "object") {
|
|
400
|
+
deepFreeze(prop);
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
return Object.freeze(obj);
|
|
405
|
+
}
|
|
406
|
+
function pickObject(obj, keys) {
|
|
407
|
+
const result = {};
|
|
408
|
+
keys.forEach((key) => {
|
|
409
|
+
if (key in obj) {
|
|
410
|
+
result[key] = obj[key];
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
return result;
|
|
414
|
+
}
|
|
487
415
|
function chunkString(str, chunkSize = str.length) {
|
|
488
416
|
if (chunkSize === 0) {
|
|
489
417
|
throw new Error("块大小不能为 0");
|
|
@@ -500,8 +428,36 @@ function chunkString(str, chunkSize = str.length) {
|
|
|
500
428
|
}
|
|
501
429
|
return chunks;
|
|
502
430
|
}
|
|
431
|
+
function getUuid() {
|
|
432
|
+
return window.crypto.getRandomValues(new Uint32Array(1))[0].toString(36);
|
|
433
|
+
}
|
|
434
|
+
function timeDelay(delay) {
|
|
435
|
+
if (typeof delay !== "number" || delay < 0) {
|
|
436
|
+
throw new Error("延迟时间必须是非负数");
|
|
437
|
+
}
|
|
438
|
+
return new Promise((resolve) => {
|
|
439
|
+
setTimeout(resolve, delay);
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
function createWebSocket(url) {
|
|
443
|
+
return new WebSocket(url);
|
|
444
|
+
}
|
|
445
|
+
function isWebSocketSupported() {
|
|
446
|
+
return ["WebSocket", "MozWebSocket"].some((key) => key in window);
|
|
447
|
+
}
|
|
448
|
+
function closeWorker(worker) {
|
|
449
|
+
if (!worker)
|
|
450
|
+
return;
|
|
451
|
+
worker.terminate();
|
|
452
|
+
}
|
|
453
|
+
function createWorker(fun) {
|
|
454
|
+
const blob = new Blob([`(${fun.toString()})()`]);
|
|
455
|
+
const url = window.URL.createObjectURL(blob);
|
|
456
|
+
const worker = new Worker(url);
|
|
457
|
+
window.URL.revokeObjectURL(url);
|
|
458
|
+
return worker;
|
|
459
|
+
}
|
|
503
460
|
export {
|
|
504
|
-
FileItemFeedTypeEnum,
|
|
505
461
|
FileSuffixEnum,
|
|
506
462
|
ImageFileSuffixEnum,
|
|
507
463
|
add,
|
|
@@ -522,10 +478,7 @@ export {
|
|
|
522
478
|
deepFreeze,
|
|
523
479
|
divide,
|
|
524
480
|
getDecimalPlaces,
|
|
525
|
-
getFileFeedType,
|
|
526
481
|
getFileIcon,
|
|
527
|
-
getFileItemIcon,
|
|
528
|
-
getFileItemSuffix,
|
|
529
482
|
getFileName,
|
|
530
483
|
getFileSuffix,
|
|
531
484
|
getFileSuffixIcon,
|
package/dist/math/index.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ import { default as divide } from './divide';
|
|
|
3
3
|
import { default as getDecimalPlaces } from './get-decimal-places';
|
|
4
4
|
import { default as multiply } from './multiply';
|
|
5
5
|
import { default as subtract } from './subtract';
|
|
6
|
-
export { add, divide, multiply, subtract
|
|
6
|
+
export { add, divide, getDecimalPlaces, multiply, subtract };
|
package/dist/object/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@minto-ai/tools",
|
|
3
|
-
"
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "1.0.33",
|
|
4
5
|
"description": "明途公共工具库",
|
|
6
|
+
"author": "hcc",
|
|
7
|
+
"license": "ISC",
|
|
5
8
|
"keywords": [
|
|
6
9
|
"ts",
|
|
7
10
|
"tools"
|
|
8
11
|
],
|
|
9
|
-
"author": "hcc",
|
|
10
|
-
"license": "ISC",
|
|
11
12
|
"publishConfig": {
|
|
12
13
|
"access": "public"
|
|
13
14
|
},
|
|
15
|
+
"module": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
14
17
|
"files": [
|
|
15
18
|
"dist"
|
|
16
19
|
],
|
|
17
|
-
"type": "module",
|
|
18
|
-
"module": "./dist/index.js",
|
|
19
|
-
"types": "./dist/index.d.ts",
|
|
20
20
|
"scripts": {
|
|
21
21
|
"build": "vite build",
|
|
22
22
|
"up": "gulp --gulpfile ../../gulpfile.cjs --cwd ./"
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { FileItemFeedType } from './types';
|
|
2
|
-
/**
|
|
3
|
-
* 根据文件路径获取文件类型
|
|
4
|
-
*
|
|
5
|
-
* @param filePath 文件路径
|
|
6
|
-
* @returns 文件类型(FileItemFeedTypeEnum)或 undefined(如果无法识别)
|
|
7
|
-
*/
|
|
8
|
-
declare function getFileFeedType(filePath: string): FileItemFeedType | undefined;
|
|
9
|
-
export default getFileFeedType;
|