@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 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
- (text) => console.log('Text copied to clipboard:', text),
641
- (error) => console.error('Failed to copy text:', error)
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 { getFileSuffixIcon, FileSuffixEnum } from '@minto-ai/tools'
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
- } else {
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(function () {
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 { createWorker, closeWorker } from '@minto-ai/tools'
1212
+ import { closeWorker, createWorker } from '@minto-ai/tools'
1329
1213
 
1330
- const myWorker = createWorker(function () {
1214
+ const myWorker = createWorker(() => {
1331
1215
  console.log('Hello from the Web Worker!')
1332
1216
  })
1333
1217
  // 当不再需要 Worker 时
@@ -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, isAndroid };
6
+ export { copyText, isAndroid, isIos, isMobile, isPc };
@@ -4,5 +4,5 @@
4
4
  * @param value 输入值。
5
5
  * @returns 转换后的数字值,如果无法解析则返回 `NaN`。
6
6
  */
7
- declare function beParsedAsNumber(value: never): number;
7
+ declare function beParsedAsNumber(value: number | string): number;
8
8
  export default beParsedAsNumber;
@@ -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, canBeParsedAsNumber, isUndefined, isNullOrUndefined, beParsedAsNumber };
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 fileSuffixRegex: RegExp;
2
- declare const fileNameRegex: RegExp;
3
- export { fileSuffixRegex, fileNameRegex };
1
+ declare const filePathRegex: RegExp;
2
+ export { filePathRegex };
@@ -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, FileItemFeedTypeEnum, ImageFileSuffixEnum } from './extends/enum';
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
- import { IFileItem, FileSuffix, FileItemFeedType, ImageFileSuffix, VideoFileSuffix, PptFileSuffix, DocumentFileSuffix } from './types';
18
- export type { IFileItem, FileSuffix, FileItemFeedType, ImageFileSuffix, VideoFileSuffix, PptFileSuffix, DocumentFileSuffix };
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, };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 判断是否是有效的文档文件路径(包含doc、docx、pdf、txt、xls、xlsx)
3
+ *
4
+ * @param filePath 文件路径
5
+ * @returns 是否是有效的文档文件路径
6
+ */
7
+ declare function isMusicFilePath(filePath: string): boolean;
8
+ export default isMusicFilePath;
@@ -1,18 +1,7 @@
1
- import { FileSuffixEnum, FileItemFeedTypeEnum, ImageFileSuffixEnum, VideoFileSuffixEnum, PptFileSuffixEnum, DocumentFileSuffixEnum } from '../extends/enum';
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 FileItemFeedType = (typeof FileItemFeedTypeEnum)[keyof typeof FileItemFeedTypeEnum];
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
- type DebouncedFunction<T extends (...args: any[]) => any> = {
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
  * 防抖函数的作用是限制一个函数在短时间内频繁触发的次数,直到指定的延迟时间结束后才执行。
@@ -1,3 +1,3 @@
1
1
  import { default as debounce } from './debounce';
2
2
  import { default as throttle } from './throttle';
3
- export { throttle, debounce };
3
+ export { debounce, throttle };
@@ -2,7 +2,7 @@
2
2
  * 节流函数的类型定义
3
3
  * @template T - 原始函数的类型
4
4
  */
5
- type ThrottledFunction<T extends (...args: any[]) => any> = {
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 /^-?\d+(\.\d+)?$/.test(String(value));
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 FileItemFeedTypeEnum = {
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
- const matchResult = filePath.match(fileSuffixRegex);
217
- return matchResult ? matchResult[1].toLowerCase() : "";
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(fileNameRegex);
221
- return matchResult ? matchResult[1].replace(fileSuffixRegex, "") : "";
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 (error) {
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 getFileItemSuffix(fileItem) {
344
- const { title, viewUrl } = fileItem;
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 fileSuffix;
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) return false;
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) return false;
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) return false;
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) return false;
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,
@@ -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, getDecimalPlaces };
6
+ export { add, divide, getDecimalPlaces, multiply, subtract };
@@ -1,3 +1,3 @@
1
1
  import { default as deepFreeze } from './deep-freeze';
2
2
  import { default as pickObject } from './pick-object';
3
- export { pickObject, deepFreeze };
3
+ export { deepFreeze, pickObject };
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "@minto-ai/tools",
3
- "version": "1.0.2",
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;
@@ -1,9 +0,0 @@
1
- import { IFileItem } from './types';
2
- /**
3
- * 根据文件的后缀文件类型获取文件类型图标
4
- *
5
- * @param fileItem 文件实例
6
- * @returns 文件图标
7
- */
8
- declare function getFileItemIcon(fileItem: IFileItem): string;
9
- export default getFileItemIcon;
@@ -1,9 +0,0 @@
1
- import { FileSuffix, IFileItem } from './types';
2
- /**
3
- * 获取文件类型后缀,内部包含各种逻辑,可直接调用和修改
4
- *
5
- * @param fileItem 文件实例
6
- * @returns 文件类型后缀
7
- */
8
- declare function getFileItemSuffix(fileItem: IFileItem): FileSuffix;
9
- export default getFileItemSuffix;