sa2kit 1.0.0

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.
Files changed (218) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +298 -0
  3. package/dist/AliyunOSSProvider-7JLMJDXK.js +15 -0
  4. package/dist/AliyunOSSProvider-7JLMJDXK.js.map +1 -0
  5. package/dist/AliyunOSSProvider-GQMSDJGZ.mjs +6 -0
  6. package/dist/AliyunOSSProvider-GQMSDJGZ.mjs.map +1 -0
  7. package/dist/LocalStorageProvider-FVLLHBHO.mjs +6 -0
  8. package/dist/LocalStorageProvider-FVLLHBHO.mjs.map +1 -0
  9. package/dist/LocalStorageProvider-NBNHHWLY.js +15 -0
  10. package/dist/LocalStorageProvider-NBNHHWLY.js.map +1 -0
  11. package/dist/analytics/index.d.mts +1084 -0
  12. package/dist/analytics/index.d.ts +1084 -0
  13. package/dist/analytics/index.js +2595 -0
  14. package/dist/analytics/index.js.map +1 -0
  15. package/dist/analytics/index.mjs +2518 -0
  16. package/dist/analytics/index.mjs.map +1 -0
  17. package/dist/analytics/server/index.d.mts +499 -0
  18. package/dist/analytics/server/index.d.ts +499 -0
  19. package/dist/analytics/server/index.js +529 -0
  20. package/dist/analytics/server/index.js.map +1 -0
  21. package/dist/analytics/server/index.mjs +525 -0
  22. package/dist/analytics/server/index.mjs.map +1 -0
  23. package/dist/auth/client/index.d.mts +104 -0
  24. package/dist/auth/client/index.d.ts +104 -0
  25. package/dist/auth/client/index.js +21 -0
  26. package/dist/auth/client/index.js.map +1 -0
  27. package/dist/auth/client/index.mjs +4 -0
  28. package/dist/auth/client/index.mjs.map +1 -0
  29. package/dist/auth/components/index.d.mts +82 -0
  30. package/dist/auth/components/index.d.ts +82 -0
  31. package/dist/auth/components/index.js +93 -0
  32. package/dist/auth/components/index.js.map +1 -0
  33. package/dist/auth/components/index.mjs +86 -0
  34. package/dist/auth/components/index.mjs.map +1 -0
  35. package/dist/auth/hooks/index.d.mts +2 -0
  36. package/dist/auth/hooks/index.d.ts +2 -0
  37. package/dist/auth/hooks/index.js +17 -0
  38. package/dist/auth/hooks/index.js.map +1 -0
  39. package/dist/auth/hooks/index.mjs +4 -0
  40. package/dist/auth/hooks/index.mjs.map +1 -0
  41. package/dist/auth/index.d.mts +15 -0
  42. package/dist/auth/index.d.ts +15 -0
  43. package/dist/auth/index.js +110 -0
  44. package/dist/auth/index.js.map +1 -0
  45. package/dist/auth/index.mjs +9 -0
  46. package/dist/auth/index.mjs.map +1 -0
  47. package/dist/auth/middleware/index.d.mts +75 -0
  48. package/dist/auth/middleware/index.d.ts +75 -0
  49. package/dist/auth/middleware/index.js +15 -0
  50. package/dist/auth/middleware/index.js.map +1 -0
  51. package/dist/auth/middleware/index.mjs +6 -0
  52. package/dist/auth/middleware/index.mjs.map +1 -0
  53. package/dist/auth/routes/index.d.mts +163 -0
  54. package/dist/auth/routes/index.d.ts +163 -0
  55. package/dist/auth/routes/index.js +27 -0
  56. package/dist/auth/routes/index.js.map +1 -0
  57. package/dist/auth/routes/index.mjs +6 -0
  58. package/dist/auth/routes/index.mjs.map +1 -0
  59. package/dist/auth/schema/index.d.mts +789 -0
  60. package/dist/auth/schema/index.d.ts +789 -0
  61. package/dist/auth/schema/index.js +41 -0
  62. package/dist/auth/schema/index.js.map +1 -0
  63. package/dist/auth/schema/index.mjs +4 -0
  64. package/dist/auth/schema/index.mjs.map +1 -0
  65. package/dist/auth/services/index.d.mts +47 -0
  66. package/dist/auth/services/index.d.ts +47 -0
  67. package/dist/auth/services/index.js +34 -0
  68. package/dist/auth/services/index.js.map +1 -0
  69. package/dist/auth/services/index.mjs +5 -0
  70. package/dist/auth/services/index.mjs.map +1 -0
  71. package/dist/chunk-3RFBUDRA.js +507 -0
  72. package/dist/chunk-3RFBUDRA.js.map +1 -0
  73. package/dist/chunk-3XG5OHFD.mjs +37 -0
  74. package/dist/chunk-3XG5OHFD.mjs.map +1 -0
  75. package/dist/chunk-6BL3AZGD.js +285 -0
  76. package/dist/chunk-6BL3AZGD.js.map +1 -0
  77. package/dist/chunk-6FNUWAIV.js +394 -0
  78. package/dist/chunk-6FNUWAIV.js.map +1 -0
  79. package/dist/chunk-6PRFP5EG.js +171 -0
  80. package/dist/chunk-6PRFP5EG.js.map +1 -0
  81. package/dist/chunk-6VHWOPRR.mjs +90 -0
  82. package/dist/chunk-6VHWOPRR.mjs.map +1 -0
  83. package/dist/chunk-AIKEVVDR.mjs +122 -0
  84. package/dist/chunk-AIKEVVDR.mjs.map +1 -0
  85. package/dist/chunk-APY57REU.js +300 -0
  86. package/dist/chunk-APY57REU.js.map +1 -0
  87. package/dist/chunk-BJTO5JO5.mjs +10 -0
  88. package/dist/chunk-BJTO5JO5.mjs.map +1 -0
  89. package/dist/chunk-C64RY2OW.mjs +295 -0
  90. package/dist/chunk-C64RY2OW.mjs.map +1 -0
  91. package/dist/chunk-DGUM43GV.js +12 -0
  92. package/dist/chunk-DGUM43GV.js.map +1 -0
  93. package/dist/chunk-FV3FNHQY.js +92 -0
  94. package/dist/chunk-FV3FNHQY.js.map +1 -0
  95. package/dist/chunk-GSTLV3MB.mjs +316 -0
  96. package/dist/chunk-GSTLV3MB.mjs.map +1 -0
  97. package/dist/chunk-HEMA7SWK.mjs +212 -0
  98. package/dist/chunk-HEMA7SWK.mjs.map +1 -0
  99. package/dist/chunk-HWJ34NL6.js +43 -0
  100. package/dist/chunk-HWJ34NL6.js.map +1 -0
  101. package/dist/chunk-HXFFYNIF.mjs +385 -0
  102. package/dist/chunk-HXFFYNIF.mjs.map +1 -0
  103. package/dist/chunk-KGRQNEIR.mjs +183 -0
  104. package/dist/chunk-KGRQNEIR.mjs.map +1 -0
  105. package/dist/chunk-KH6RQ4J5.js +28 -0
  106. package/dist/chunk-KH6RQ4J5.js.map +1 -0
  107. package/dist/chunk-KQGP6BTS.mjs +165 -0
  108. package/dist/chunk-KQGP6BTS.mjs.map +1 -0
  109. package/dist/chunk-NMF4ANIC.js +365 -0
  110. package/dist/chunk-NMF4ANIC.js.map +1 -0
  111. package/dist/chunk-O26VCNS3.js +216 -0
  112. package/dist/chunk-O26VCNS3.js.map +1 -0
  113. package/dist/chunk-OLHGZXN3.mjs +86 -0
  114. package/dist/chunk-OLHGZXN3.mjs.map +1 -0
  115. package/dist/chunk-QU5OT4DF.js +88 -0
  116. package/dist/chunk-QU5OT4DF.js.map +1 -0
  117. package/dist/chunk-RCNNVNLT.mjs +356 -0
  118. package/dist/chunk-RCNNVNLT.mjs.map +1 -0
  119. package/dist/chunk-ROEYW4A7.js +186 -0
  120. package/dist/chunk-ROEYW4A7.js.map +1 -0
  121. package/dist/chunk-SVWQN2LR.js +131 -0
  122. package/dist/chunk-SVWQN2LR.js.map +1 -0
  123. package/dist/chunk-TKCYPDWU.js +338 -0
  124. package/dist/chunk-TKCYPDWU.js.map +1 -0
  125. package/dist/chunk-U2L6V7KD.mjs +273 -0
  126. package/dist/chunk-U2L6V7KD.mjs.map +1 -0
  127. package/dist/chunk-YVBU7QDJ.mjs +505 -0
  128. package/dist/chunk-YVBU7QDJ.mjs.map +1 -0
  129. package/dist/chunk-ZGVB35L2.mjs +25 -0
  130. package/dist/chunk-ZGVB35L2.mjs.map +1 -0
  131. package/dist/config/index.d.mts +64 -0
  132. package/dist/config/index.d.ts +64 -0
  133. package/dist/config/index.js +136 -0
  134. package/dist/config/index.js.map +1 -0
  135. package/dist/config/index.mjs +128 -0
  136. package/dist/config/index.mjs.map +1 -0
  137. package/dist/drizzle-auth-service-Bxlovhv8.d.ts +145 -0
  138. package/dist/drizzle-auth-service-DZY2F1sv.d.mts +145 -0
  139. package/dist/enums-Dume-V5Y.d.mts +16 -0
  140. package/dist/enums-Dume-V5Y.d.ts +16 -0
  141. package/dist/i18n/index.d.mts +416 -0
  142. package/dist/i18n/index.d.ts +416 -0
  143. package/dist/i18n/index.js +671 -0
  144. package/dist/i18n/index.js.map +1 -0
  145. package/dist/i18n/index.mjs +650 -0
  146. package/dist/i18n/index.mjs.map +1 -0
  147. package/dist/index-8VoHap_4.d.mts +105 -0
  148. package/dist/index-8VoHap_4.d.ts +105 -0
  149. package/dist/index.d.mts +4 -0
  150. package/dist/index.d.ts +4 -0
  151. package/dist/index.js +84 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/index.mjs +7 -0
  154. package/dist/index.mjs.map +1 -0
  155. package/dist/logger/index.d.mts +125 -0
  156. package/dist/logger/index.d.ts +125 -0
  157. package/dist/logger/index.js +29 -0
  158. package/dist/logger/index.js.map +1 -0
  159. package/dist/logger/index.mjs +4 -0
  160. package/dist/logger/index.mjs.map +1 -0
  161. package/dist/request/index.d.mts +51 -0
  162. package/dist/request/index.d.ts +51 -0
  163. package/dist/request/index.js +85 -0
  164. package/dist/request/index.js.map +1 -0
  165. package/dist/request/index.mjs +82 -0
  166. package/dist/request/index.mjs.map +1 -0
  167. package/dist/storage/index.d.mts +74 -0
  168. package/dist/storage/index.d.ts +74 -0
  169. package/dist/storage/index.js +46 -0
  170. package/dist/storage/index.js.map +1 -0
  171. package/dist/storage/index.mjs +5 -0
  172. package/dist/storage/index.mjs.map +1 -0
  173. package/dist/types-BINlP9MK.d.mts +286 -0
  174. package/dist/types-BINlP9MK.d.ts +286 -0
  175. package/dist/types-BaZccpvk.d.mts +48 -0
  176. package/dist/types-BaZccpvk.d.ts +48 -0
  177. package/dist/types-CbTsi9CZ.d.mts +31 -0
  178. package/dist/types-CbTsi9CZ.d.ts +31 -0
  179. package/dist/types-CoGG1rNV.d.mts +258 -0
  180. package/dist/types-CoGG1rNV.d.ts +258 -0
  181. package/dist/types-DAxQ1MeY.d.ts +70 -0
  182. package/dist/types-DT8LVCvE.d.mts +70 -0
  183. package/dist/types-DW9qar-w.d.mts +52 -0
  184. package/dist/types-DW9qar-w.d.ts +52 -0
  185. package/dist/universalExport/index.d.mts +235 -0
  186. package/dist/universalExport/index.d.ts +235 -0
  187. package/dist/universalExport/index.js +621 -0
  188. package/dist/universalExport/index.js.map +1 -0
  189. package/dist/universalExport/index.mjs +580 -0
  190. package/dist/universalExport/index.mjs.map +1 -0
  191. package/dist/universalExport/server/index.d.mts +429 -0
  192. package/dist/universalExport/server/index.d.ts +429 -0
  193. package/dist/universalExport/server/index.js +263 -0
  194. package/dist/universalExport/server/index.js.map +1 -0
  195. package/dist/universalExport/server/index.mjs +242 -0
  196. package/dist/universalExport/server/index.mjs.map +1 -0
  197. package/dist/universalFile/index.d.mts +310 -0
  198. package/dist/universalFile/index.d.ts +310 -0
  199. package/dist/universalFile/index.js +811 -0
  200. package/dist/universalFile/index.js.map +1 -0
  201. package/dist/universalFile/index.mjs +736 -0
  202. package/dist/universalFile/index.mjs.map +1 -0
  203. package/dist/universalFile/server/index.d.mts +2428 -0
  204. package/dist/universalFile/server/index.d.ts +2428 -0
  205. package/dist/universalFile/server/index.js +4578 -0
  206. package/dist/universalFile/server/index.js.map +1 -0
  207. package/dist/universalFile/server/index.mjs +4518 -0
  208. package/dist/universalFile/server/index.mjs.map +1 -0
  209. package/dist/useElectronStorage-Dj0rcorG.d.mts +65 -0
  210. package/dist/useElectronStorage-DwnNfIhl.d.ts +65 -0
  211. package/dist/utils/index.d.mts +188 -0
  212. package/dist/utils/index.d.ts +188 -0
  213. package/dist/utils/index.js +42 -0
  214. package/dist/utils/index.js.map +1 -0
  215. package/dist/utils/index.mjs +5 -0
  216. package/dist/utils/index.mjs.map +1 -0
  217. package/package.json +220 -0
  218. package/tailwind.animations.js +34 -0
@@ -0,0 +1,736 @@
1
+ export { CDNProviderError, FileProcessingError, FileServiceError, FileUploadError, StorageProviderError } from '../chunk-3XG5OHFD.mjs';
2
+ import '../chunk-BJTO5JO5.mjs';
3
+
4
+ // src/universalFile/constants.ts
5
+ var UNIVERSAL_FILE_VERSION = "1.0.0";
6
+ var UNIVERSAL_FILE_NAME = "@qhr123/sa2kit/universalFile";
7
+ var DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;
8
+ var DEFAULT_MAX_IMAGE_SIZE = 10 * 1024 * 1024;
9
+ var DEFAULT_MAX_VIDEO_SIZE = 500 * 1024 * 1024;
10
+ var DEFAULT_MAX_AUDIO_SIZE = 50 * 1024 * 1024;
11
+ var DEFAULT_MAX_DOCUMENT_SIZE = 20 * 1024 * 1024;
12
+ var IMAGE_MIME_TYPES = [
13
+ "image/jpeg",
14
+ "image/jpg",
15
+ "image/png",
16
+ "image/gif",
17
+ "image/webp",
18
+ "image/svg+xml"
19
+ ];
20
+ var VIDEO_MIME_TYPES = [
21
+ "video/mp4",
22
+ "video/mpeg",
23
+ "video/quicktime",
24
+ "video/x-msvideo",
25
+ "video/webm"
26
+ ];
27
+ var AUDIO_MIME_TYPES = ["audio/mpeg", "audio/mp3", "audio/wav", "audio/ogg", "audio/aac"];
28
+ var DOCUMENT_MIME_TYPES = [
29
+ "application/pdf",
30
+ "application/msword",
31
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
32
+ "application/vnd.ms-excel",
33
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
34
+ "application/vnd.ms-powerpoint",
35
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation",
36
+ "text/plain"
37
+ ];
38
+ var ALL_SUPPORTED_MIME_TYPES = [
39
+ ...IMAGE_MIME_TYPES,
40
+ ...VIDEO_MIME_TYPES,
41
+ ...AUDIO_MIME_TYPES,
42
+ ...DOCUMENT_MIME_TYPES
43
+ ];
44
+ var IMAGE_EXTENSIONS = [".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg"];
45
+ var VIDEO_EXTENSIONS = [".mp4", ".mpeg", ".mov", ".avi", ".webm"];
46
+ var AUDIO_EXTENSIONS = [".mp3", ".wav", ".ogg", ".aac"];
47
+ var DOCUMENT_EXTENSIONS = [
48
+ ".pdf",
49
+ ".doc",
50
+ ".docx",
51
+ ".xls",
52
+ ".xlsx",
53
+ ".ppt",
54
+ ".pptx",
55
+ ".txt"
56
+ ];
57
+ var API_BASE_PATH = "/api/universal-file";
58
+ var API_ENDPOINTS = {
59
+ /** 上传文件 */
60
+ UPLOAD: `${API_BASE_PATH}/upload`,
61
+ /** 获取文件URL */
62
+ GET_URL: (fileId) => `${API_BASE_PATH}/files/${fileId}/url`,
63
+ /** 获取文件元数据 */
64
+ GET_METADATA: (fileId) => `${API_BASE_PATH}/files/${fileId}`,
65
+ /** 删除文件 */
66
+ DELETE: (fileId) => `${API_BASE_PATH}/files/${fileId}`,
67
+ /** 查询文件列表 */
68
+ QUERY: `${API_BASE_PATH}/files`,
69
+ /** 批量删除 */
70
+ BATCH_DELETE: `${API_BASE_PATH}/files/batch-delete`,
71
+ /** 获取上传进度 */
72
+ GET_PROGRESS: (fileId) => `${API_BASE_PATH}/upload/${fileId}/progress`
73
+ };
74
+ var ERROR_CODES = {
75
+ /** 文件上传错误 */
76
+ FILE_UPLOAD_ERROR: "FILE_UPLOAD_ERROR",
77
+ /** 文件大小超限 */
78
+ FILE_SIZE_EXCEEDED: "FILE_SIZE_EXCEEDED",
79
+ /** 文件类型不支持 */
80
+ FILE_TYPE_NOT_SUPPORTED: "FILE_TYPE_NOT_SUPPORTED",
81
+ /** 文件不存在 */
82
+ FILE_NOT_FOUND: "FILE_NOT_FOUND",
83
+ /** 文件处理错误 */
84
+ FILE_PROCESSING_ERROR: "FILE_PROCESSING_ERROR",
85
+ /** 存储提供者错误 */
86
+ STORAGE_PROVIDER_ERROR: "STORAGE_PROVIDER_ERROR",
87
+ /** CDN提供者错误 */
88
+ CDN_PROVIDER_ERROR: "CDN_PROVIDER_ERROR",
89
+ /** 网络错误 */
90
+ NETWORK_ERROR: "NETWORK_ERROR",
91
+ /** 超时错误 */
92
+ TIMEOUT_ERROR: "TIMEOUT_ERROR",
93
+ /** 未授权 */
94
+ UNAUTHORIZED: "UNAUTHORIZED",
95
+ /** 权限不足 */
96
+ FORBIDDEN: "FORBIDDEN",
97
+ /** 服务器错误 */
98
+ SERVER_ERROR: "SERVER_ERROR"
99
+ };
100
+ var DEFAULT_PAGE_SIZE = 20;
101
+ var DEFAULT_REQUEST_TIMEOUT = 3e4;
102
+ var DEFAULT_UPLOAD_TIMEOUT = 3e5;
103
+ var DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;
104
+
105
+ // src/universalFile/utils.ts
106
+ function formatFileSize(bytes) {
107
+ if (bytes === 0) return "0 B";
108
+ const units = ["B", "KB", "MB", "GB", "TB"];
109
+ const k = 1024;
110
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
111
+ return `${(bytes / Math.pow(k, i)).toFixed(2)} ${units[i]}`;
112
+ }
113
+ function parseFileSize(sizeStr) {
114
+ const match = sizeStr.match(/^(\d+(?:\.\d+)?)\s*([KMGT]?B)$/i);
115
+ if (!match || !match[1] || !match[2]) return 0;
116
+ const value = parseFloat(match[1]);
117
+ const unit = match[2].toUpperCase();
118
+ const units = {
119
+ B: 1,
120
+ KB: 1024,
121
+ MB: 1024 * 1024,
122
+ GB: 1024 * 1024 * 1024,
123
+ TB: 1024 * 1024 * 1024 * 1024
124
+ };
125
+ return value * (units[unit] || 1);
126
+ }
127
+ function getFileExtension(fileName) {
128
+ const lastDot = fileName.lastIndexOf(".");
129
+ if (lastDot === -1) return "";
130
+ return fileName.substring(lastDot).toLowerCase();
131
+ }
132
+ function getMimeTypeFromFileName(fileName) {
133
+ const ext = getFileExtension(fileName);
134
+ const mimeMap = {
135
+ ".jpg": "image/jpeg",
136
+ ".jpeg": "image/jpeg",
137
+ ".png": "image/png",
138
+ ".gif": "image/gif",
139
+ ".webp": "image/webp",
140
+ ".svg": "image/svg+xml",
141
+ ".pdf": "application/pdf",
142
+ ".txt": "text/plain",
143
+ ".mp4": "video/mp4",
144
+ ".avi": "video/x-msvideo",
145
+ ".mov": "video/quicktime",
146
+ ".mp3": "audio/mpeg",
147
+ ".wav": "audio/wav",
148
+ ".ogg": "audio/ogg",
149
+ ".doc": "application/msword",
150
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
151
+ ".xls": "application/vnd.ms-excel",
152
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
153
+ };
154
+ return mimeMap[ext] || "application/octet-stream";
155
+ }
156
+ function isMimeTypeSupported(mimeType, allowedTypes) {
157
+ if (allowedTypes && allowedTypes.length > 0) {
158
+ return allowedTypes.includes(mimeType);
159
+ }
160
+ return IMAGE_MIME_TYPES.includes(mimeType) || VIDEO_MIME_TYPES.includes(mimeType) || AUDIO_MIME_TYPES.includes(mimeType) || DOCUMENT_MIME_TYPES.includes(mimeType);
161
+ }
162
+ function isImageFile(mimeType) {
163
+ return IMAGE_MIME_TYPES.includes(mimeType);
164
+ }
165
+ function isVideoFile(mimeType) {
166
+ return VIDEO_MIME_TYPES.includes(mimeType);
167
+ }
168
+ function isAudioFile(mimeType) {
169
+ return AUDIO_MIME_TYPES.includes(mimeType);
170
+ }
171
+ function isDocumentFile(mimeType) {
172
+ return DOCUMENT_MIME_TYPES.includes(mimeType);
173
+ }
174
+ function getFileCategory(mimeType) {
175
+ if (isImageFile(mimeType)) return "image";
176
+ if (isVideoFile(mimeType)) return "video";
177
+ if (isAudioFile(mimeType)) return "audio";
178
+ if (isDocumentFile(mimeType)) return "document";
179
+ return "other";
180
+ }
181
+ function validateFileName(fileName) {
182
+ const invalidChars = /[<>:"|?*\/\\]/;
183
+ if (invalidChars.test(fileName)) {
184
+ return false;
185
+ }
186
+ if (fileName.length === 0 || fileName.length > 255) {
187
+ return false;
188
+ }
189
+ if (fileName.startsWith(".")) {
190
+ return false;
191
+ }
192
+ return true;
193
+ }
194
+ function sanitizeFileName(fileName) {
195
+ return fileName.replace(/[<>:"|?*\/\\]/g, "_").replace(/^\.+/, "").substring(0, 255);
196
+ }
197
+ function generateUniqueFileName(originalName, fileId) {
198
+ const ext = getFileExtension(originalName);
199
+ return `${fileId}${ext}`;
200
+ }
201
+ function generateStoragePath(moduleId, fileName, options) {
202
+ const parts = [];
203
+ if (options?.customPrefix) {
204
+ parts.push(options.customPrefix);
205
+ }
206
+ parts.push(moduleId);
207
+ if (options?.businessId) {
208
+ parts.push(options.businessId);
209
+ }
210
+ if (options?.useDate !== false) {
211
+ const date = /* @__PURE__ */ new Date();
212
+ const year = date.getFullYear();
213
+ const month = String(date.getMonth() + 1).padStart(2, "0");
214
+ const day = String(date.getDate()).padStart(2, "0");
215
+ parts.push(String(year), month, day);
216
+ }
217
+ parts.push(fileName);
218
+ return parts.join("/");
219
+ }
220
+ function parseStoragePath(path) {
221
+ const parts = path.split("/");
222
+ const fileName = parts[parts.length - 1] || "";
223
+ return {
224
+ moduleId: parts[0] || void 0,
225
+ businessId: parts.length > 5 ? parts[1] : void 0,
226
+ year: parts.length > 3 ? parts[parts.length - 4] : void 0,
227
+ month: parts.length > 2 ? parts[parts.length - 3] : void 0,
228
+ day: parts.length > 1 ? parts[parts.length - 2] : void 0,
229
+ fileName
230
+ };
231
+ }
232
+ function validateFileSize(file, maxSize) {
233
+ if (file.size > maxSize) {
234
+ return {
235
+ valid: false,
236
+ error: `\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u9650\u5236: ${formatFileSize(file.size)} > ${formatFileSize(maxSize)}`
237
+ };
238
+ }
239
+ return { valid: true };
240
+ }
241
+ function validateFileType(file, allowedTypes) {
242
+ const mimeType = file.type || getMimeTypeFromFileName(file.name);
243
+ if (!isMimeTypeSupported(mimeType, allowedTypes)) {
244
+ return {
245
+ valid: false,
246
+ error: `\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B: ${mimeType}`
247
+ };
248
+ }
249
+ return { valid: true };
250
+ }
251
+ function validateFile(file, options) {
252
+ const errors = [];
253
+ if (!validateFileName(file.name)) {
254
+ errors.push("\u6587\u4EF6\u540D\u5305\u542B\u975E\u6CD5\u5B57\u7B26\u6216\u957F\u5EA6\u4E0D\u5408\u6CD5");
255
+ }
256
+ if (options?.maxSize) {
257
+ const sizeResult = validateFileSize(file, options.maxSize);
258
+ if (!sizeResult.valid && sizeResult.error) {
259
+ errors.push(sizeResult.error);
260
+ }
261
+ }
262
+ if (options?.allowedTypes) {
263
+ const typeResult = validateFileType(file, options.allowedTypes);
264
+ if (!typeResult.valid && typeResult.error) {
265
+ errors.push(typeResult.error);
266
+ }
267
+ }
268
+ return {
269
+ valid: errors.length === 0,
270
+ errors
271
+ };
272
+ }
273
+ function buildQueryString(params) {
274
+ const searchParams = new URLSearchParams();
275
+ Object.entries(params).forEach(([key, value]) => {
276
+ if (value !== void 0 && value !== null) {
277
+ if (Array.isArray(value)) {
278
+ value.forEach((v) => searchParams.append(key, String(v)));
279
+ } else {
280
+ searchParams.append(key, String(value));
281
+ }
282
+ }
283
+ });
284
+ const queryString = searchParams.toString();
285
+ return queryString ? `?${queryString}` : "";
286
+ }
287
+ function parseQueryString(url) {
288
+ const params = {};
289
+ const urlObj = new URL(url, window.location.origin);
290
+ urlObj.searchParams.forEach((value, key) => {
291
+ params[key] = value;
292
+ });
293
+ return params;
294
+ }
295
+ function calculateProgress(uploadedBytes, totalBytes) {
296
+ if (totalBytes === 0) return 0;
297
+ return Math.min(Math.round(uploadedBytes / totalBytes * 100), 100);
298
+ }
299
+ function calculateSpeed(uploadedBytes, elapsedTime) {
300
+ if (elapsedTime === 0) return 0;
301
+ return uploadedBytes / (elapsedTime / 1e3);
302
+ }
303
+ function calculateRemainingTime(uploadedBytes, totalBytes, speed) {
304
+ if (speed === 0) return 0;
305
+ const remainingBytes = totalBytes - uploadedBytes;
306
+ return Math.round(remainingBytes / speed);
307
+ }
308
+ function createFileError(code, message, details) {
309
+ return {
310
+ code,
311
+ message,
312
+ details,
313
+ timestamp: /* @__PURE__ */ new Date()
314
+ };
315
+ }
316
+ function formatErrorMessage(error) {
317
+ if (error instanceof Error) {
318
+ return error.message;
319
+ }
320
+ if (typeof error === "string") {
321
+ return error;
322
+ }
323
+ if (error && typeof error === "object" && "message" in error) {
324
+ return String(error.message);
325
+ }
326
+ return "\u672A\u77E5\u9519\u8BEF";
327
+ }
328
+ function readFileAsBase64(file) {
329
+ return new Promise((resolve, reject) => {
330
+ const reader = new FileReader();
331
+ reader.onload = () => {
332
+ const result = reader.result;
333
+ const base64 = result.split(",")[1] || "";
334
+ resolve(base64);
335
+ };
336
+ reader.onerror = () => {
337
+ reject(new Error("\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25"));
338
+ };
339
+ reader.readAsDataURL(file);
340
+ });
341
+ }
342
+ function readFileAsArrayBuffer(file) {
343
+ return new Promise((resolve, reject) => {
344
+ const reader = new FileReader();
345
+ reader.onload = () => {
346
+ resolve(reader.result);
347
+ };
348
+ reader.onerror = () => {
349
+ reject(new Error("\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25"));
350
+ };
351
+ reader.readAsArrayBuffer(file);
352
+ });
353
+ }
354
+ function readFileAsText(file, encoding = "UTF-8") {
355
+ return new Promise((resolve, reject) => {
356
+ const reader = new FileReader();
357
+ reader.onload = () => {
358
+ resolve(reader.result);
359
+ };
360
+ reader.onerror = () => {
361
+ reject(new Error("\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25"));
362
+ };
363
+ reader.readAsText(file, encoding);
364
+ });
365
+ }
366
+
367
+ // src/universalFile/client.ts
368
+ var UniversalFileClient = class {
369
+ constructor(config = {}) {
370
+ this.config = {
371
+ baseUrl: config.baseUrl || "",
372
+ timeout: config.timeout || DEFAULT_REQUEST_TIMEOUT,
373
+ uploadTimeout: config.uploadTimeout || DEFAULT_UPLOAD_TIMEOUT,
374
+ headers: config.headers || {}
375
+ };
376
+ }
377
+ // ============= 文件上传API =============
378
+ /**
379
+ * 上传文件
380
+ */
381
+ async uploadFile(fileInfo, onProgress) {
382
+ const url = `${this.config.baseUrl}${API_ENDPOINTS.UPLOAD}`;
383
+ const startTime = Date.now();
384
+ const formData = new FormData();
385
+ formData.append("file", fileInfo.file);
386
+ formData.append("moduleId", fileInfo.moduleId);
387
+ if (fileInfo.businessId) {
388
+ formData.append("businessId", fileInfo.businessId);
389
+ }
390
+ if (fileInfo.permission) {
391
+ formData.append("permission", fileInfo.permission);
392
+ }
393
+ if (fileInfo.customPath) {
394
+ formData.append("customPath", fileInfo.customPath);
395
+ }
396
+ if (fileInfo.metadata) {
397
+ formData.append("metadata", JSON.stringify(fileInfo.metadata));
398
+ }
399
+ if (fileInfo.needsProcessing !== void 0) {
400
+ formData.append("needsProcessing", String(fileInfo.needsProcessing));
401
+ }
402
+ if (fileInfo.processingOptions) {
403
+ formData.append("processingOptions", JSON.stringify(fileInfo.processingOptions));
404
+ }
405
+ try {
406
+ return await new Promise((resolve, reject) => {
407
+ const xhr = new XMLHttpRequest();
408
+ xhr.upload.addEventListener("progress", (event) => {
409
+ if (event.lengthComputable && onProgress) {
410
+ const elapsedTime = Date.now() - startTime;
411
+ const speed = event.loaded / (elapsedTime / 1e3);
412
+ const remainingBytes = event.total - event.loaded;
413
+ const remainingTime = speed > 0 ? remainingBytes / speed : 0;
414
+ const progress = {
415
+ fileId: "",
416
+ // 暂时为空,上传完成后会有
417
+ status: "uploading",
418
+ progress: Math.round(event.loaded / event.total * 100),
419
+ uploadedBytes: event.loaded,
420
+ totalBytes: event.total,
421
+ speed,
422
+ remainingTime
423
+ };
424
+ onProgress(progress);
425
+ }
426
+ });
427
+ xhr.addEventListener("load", () => {
428
+ if (xhr.status >= 200 && xhr.status < 300) {
429
+ try {
430
+ const response = JSON.parse(xhr.responseText);
431
+ const fileMetadata = this.transformFileMetadataFromAPI(response.file);
432
+ if (onProgress) {
433
+ onProgress({
434
+ fileId: fileMetadata.id,
435
+ status: "completed",
436
+ progress: 100,
437
+ uploadedBytes: fileInfo.file.size,
438
+ totalBytes: fileInfo.file.size,
439
+ speed: 0,
440
+ remainingTime: 0
441
+ });
442
+ }
443
+ resolve(fileMetadata);
444
+ } catch (error) {
445
+ reject(new Error("\u89E3\u6790\u54CD\u5E94\u5931\u8D25"));
446
+ }
447
+ } else {
448
+ reject(new Error(`\u4E0A\u4F20\u5931\u8D25: ${xhr.statusText}`));
449
+ }
450
+ });
451
+ xhr.addEventListener("error", () => {
452
+ if (onProgress) {
453
+ onProgress({
454
+ fileId: "",
455
+ status: "failed",
456
+ progress: 0,
457
+ uploadedBytes: 0,
458
+ totalBytes: fileInfo.file.size,
459
+ speed: 0,
460
+ remainingTime: 0,
461
+ error: "\u7F51\u7EDC\u9519\u8BEF"
462
+ });
463
+ }
464
+ reject(new Error("\u4E0A\u4F20\u5931\u8D25"));
465
+ });
466
+ xhr.addEventListener("timeout", () => {
467
+ if (onProgress) {
468
+ onProgress({
469
+ fileId: "",
470
+ status: "failed",
471
+ progress: 0,
472
+ uploadedBytes: 0,
473
+ totalBytes: fileInfo.file.size,
474
+ speed: 0,
475
+ remainingTime: 0,
476
+ error: "\u4E0A\u4F20\u8D85\u65F6"
477
+ });
478
+ }
479
+ reject(new Error("\u4E0A\u4F20\u8D85\u65F6"));
480
+ });
481
+ xhr.open("POST", url);
482
+ xhr.timeout = this.config.uploadTimeout;
483
+ Object.entries(this.config.headers).forEach(([key, value]) => {
484
+ xhr.setRequestHeader(key, value);
485
+ });
486
+ xhr.send(formData);
487
+ });
488
+ } catch (error) {
489
+ throw createFileError(
490
+ ERROR_CODES.FILE_UPLOAD_ERROR,
491
+ `\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25: ${formatErrorMessage(error)}`,
492
+ { fileInfo, originalError: error }
493
+ );
494
+ }
495
+ }
496
+ // ============= 文件查询API =============
497
+ /**
498
+ * 获取文件访问URL
499
+ */
500
+ async getFileUrl(fileId, expiresIn) {
501
+ const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_URL(fileId)}${expiresIn ? `?expiresIn=${expiresIn}` : ""}`;
502
+ try {
503
+ const response = await this.fetchWithTimeout(url, {
504
+ method: "GET",
505
+ headers: this.getHeaders()
506
+ });
507
+ if (!response.ok) {
508
+ throw new Error(`\u83B7\u53D6\u6587\u4EF6URL\u5931\u8D25: ${response.statusText}`);
509
+ }
510
+ const data = await response.json();
511
+ return data.url;
512
+ } catch (error) {
513
+ throw createFileError(
514
+ ERROR_CODES.NETWORK_ERROR,
515
+ `\u83B7\u53D6\u6587\u4EF6URL\u5931\u8D25: ${formatErrorMessage(error)}`,
516
+ { fileId, expiresIn, originalError: error }
517
+ );
518
+ }
519
+ }
520
+ /**
521
+ * 获取文件元数据
522
+ */
523
+ async getFileMetadata(fileId) {
524
+ const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_METADATA(fileId)}`;
525
+ try {
526
+ const response = await this.fetchWithTimeout(url, {
527
+ method: "GET",
528
+ headers: this.getHeaders()
529
+ });
530
+ if (!response.ok) {
531
+ if (response.status === 404) {
532
+ throw createFileError(ERROR_CODES.FILE_NOT_FOUND, "\u6587\u4EF6\u4E0D\u5B58\u5728", { fileId });
533
+ }
534
+ throw new Error(`\u83B7\u53D6\u6587\u4EF6\u5143\u6570\u636E\u5931\u8D25: ${response.statusText}`);
535
+ }
536
+ const data = await response.json();
537
+ return this.transformFileMetadataFromAPI(data.file);
538
+ } catch (error) {
539
+ throw createFileError(
540
+ ERROR_CODES.NETWORK_ERROR,
541
+ `\u83B7\u53D6\u6587\u4EF6\u5143\u6570\u636E\u5931\u8D25: ${formatErrorMessage(error)}`,
542
+ { fileId, originalError: error }
543
+ );
544
+ }
545
+ }
546
+ /**
547
+ * 查询文件列表
548
+ */
549
+ async queryFiles(options) {
550
+ const queryString = buildQueryString({
551
+ moduleId: options.moduleId,
552
+ businessId: options.businessId,
553
+ uploaderId: options.uploaderId,
554
+ mimeType: options.mimeType,
555
+ minSize: options.minSize,
556
+ maxSize: options.maxSize,
557
+ startTime: options.startTime?.toISOString(),
558
+ endTime: options.endTime?.toISOString(),
559
+ keyword: options.keyword,
560
+ tags: options.tags,
561
+ sortBy: options.sortBy,
562
+ sortOrder: options.sortOrder,
563
+ page: options.page,
564
+ pageSize: options.pageSize
565
+ });
566
+ const url = `${this.config.baseUrl}${API_ENDPOINTS.QUERY}${queryString}`;
567
+ try {
568
+ const response = await this.fetchWithTimeout(url, {
569
+ method: "GET",
570
+ headers: this.getHeaders()
571
+ });
572
+ if (!response.ok) {
573
+ throw new Error(`\u67E5\u8BE2\u6587\u4EF6\u5217\u8868\u5931\u8D25: ${response.statusText}`);
574
+ }
575
+ const data = await response.json();
576
+ return {
577
+ items: data.items.map((item) => this.transformFileMetadataFromAPI(item)),
578
+ total: data.total,
579
+ page: data.page,
580
+ pageSize: data.pageSize,
581
+ totalPages: data.totalPages,
582
+ hasNext: data.hasNext,
583
+ hasPrev: data.hasPrev
584
+ };
585
+ } catch (error) {
586
+ throw createFileError(
587
+ ERROR_CODES.NETWORK_ERROR,
588
+ `\u67E5\u8BE2\u6587\u4EF6\u5217\u8868\u5931\u8D25: ${formatErrorMessage(error)}`,
589
+ { options, originalError: error }
590
+ );
591
+ }
592
+ }
593
+ // ============= 文件删除API =============
594
+ /**
595
+ * 删除文件
596
+ */
597
+ async deleteFile(fileId) {
598
+ const url = `${this.config.baseUrl}${API_ENDPOINTS.DELETE(fileId)}`;
599
+ try {
600
+ const response = await this.fetchWithTimeout(url, {
601
+ method: "DELETE",
602
+ headers: this.getHeaders()
603
+ });
604
+ if (!response.ok) {
605
+ if (response.status === 404) {
606
+ throw createFileError(ERROR_CODES.FILE_NOT_FOUND, "\u6587\u4EF6\u4E0D\u5B58\u5728", { fileId });
607
+ }
608
+ throw new Error(`\u5220\u9664\u6587\u4EF6\u5931\u8D25: ${response.statusText}`);
609
+ }
610
+ } catch (error) {
611
+ throw createFileError(
612
+ ERROR_CODES.NETWORK_ERROR,
613
+ `\u5220\u9664\u6587\u4EF6\u5931\u8D25: ${formatErrorMessage(error)}`,
614
+ { fileId, originalError: error }
615
+ );
616
+ }
617
+ }
618
+ /**
619
+ * 批量删除文件
620
+ */
621
+ async batchDeleteFiles(fileIds) {
622
+ const url = `${this.config.baseUrl}${API_ENDPOINTS.BATCH_DELETE}`;
623
+ try {
624
+ const response = await this.fetchWithTimeout(url, {
625
+ method: "POST",
626
+ headers: {
627
+ ...this.getHeaders(),
628
+ "Content-Type": "application/json"
629
+ },
630
+ body: JSON.stringify({ fileIds })
631
+ });
632
+ if (!response.ok) {
633
+ throw new Error(`\u6279\u91CF\u5220\u9664\u6587\u4EF6\u5931\u8D25: ${response.statusText}`);
634
+ }
635
+ const data = await response.json();
636
+ return data.result;
637
+ } catch (error) {
638
+ throw createFileError(
639
+ ERROR_CODES.NETWORK_ERROR,
640
+ `\u6279\u91CF\u5220\u9664\u6587\u4EF6\u5931\u8D25: ${formatErrorMessage(error)}`,
641
+ { fileIds, originalError: error }
642
+ );
643
+ }
644
+ }
645
+ // ============= 上传进度API =============
646
+ /**
647
+ * 获取上传进度
648
+ */
649
+ async getUploadProgress(fileId) {
650
+ const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_PROGRESS(fileId)}`;
651
+ try {
652
+ const response = await this.fetchWithTimeout(url, {
653
+ method: "GET",
654
+ headers: this.getHeaders()
655
+ });
656
+ if (!response.ok) {
657
+ throw new Error(`\u83B7\u53D6\u4E0A\u4F20\u8FDB\u5EA6\u5931\u8D25: ${response.statusText}`);
658
+ }
659
+ const data = await response.json();
660
+ return data.progress;
661
+ } catch (error) {
662
+ throw createFileError(
663
+ ERROR_CODES.NETWORK_ERROR,
664
+ `\u83B7\u53D6\u4E0A\u4F20\u8FDB\u5EA6\u5931\u8D25: ${formatErrorMessage(error)}`,
665
+ { fileId, originalError: error }
666
+ );
667
+ }
668
+ }
669
+ // ============= 私有辅助方法 =============
670
+ /**
671
+ * 获取请求头
672
+ */
673
+ getHeaders() {
674
+ return {
675
+ ...this.config.headers
676
+ };
677
+ }
678
+ /**
679
+ * 带超时的fetch请求
680
+ */
681
+ async fetchWithTimeout(url, options) {
682
+ const controller = new AbortController();
683
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
684
+ try {
685
+ const response = await fetch(url, {
686
+ ...options,
687
+ signal: controller.signal
688
+ });
689
+ return response;
690
+ } catch (error) {
691
+ if (error instanceof Error && error.name === "AbortError") {
692
+ throw createFileError(ERROR_CODES.TIMEOUT_ERROR, "\u8BF7\u6C42\u8D85\u65F6", {
693
+ url,
694
+ timeout: this.config.timeout
695
+ });
696
+ }
697
+ throw error;
698
+ } finally {
699
+ clearTimeout(timeoutId);
700
+ }
701
+ }
702
+ /**
703
+ * 转换API返回的文件元数据
704
+ */
705
+ transformFileMetadataFromAPI(apiData) {
706
+ return {
707
+ id: apiData.id,
708
+ originalName: apiData.originalName,
709
+ storageName: apiData.storageName || apiData.storedName,
710
+ size: apiData.size,
711
+ mimeType: apiData.mimeType,
712
+ extension: apiData.extension,
713
+ hash: apiData.hash || apiData.md5Hash || apiData.sha256Hash,
714
+ uploadTime: new Date(apiData.uploadTime),
715
+ permission: apiData.permission || "public",
716
+ uploaderId: apiData.uploaderId,
717
+ moduleId: apiData.moduleId,
718
+ businessId: apiData.businessId,
719
+ storageProvider: apiData.storageProvider || "local",
720
+ storagePath: apiData.storagePath,
721
+ cdnUrl: apiData.cdnUrl,
722
+ accessCount: apiData.accessCount,
723
+ lastAccessTime: apiData.lastAccessTime ? new Date(apiData.lastAccessTime) : void 0,
724
+ expiresAt: apiData.expiresAt ? new Date(apiData.expiresAt) : void 0,
725
+ metadata: apiData.metadata
726
+ };
727
+ }
728
+ };
729
+ var universalFileClient = new UniversalFileClient();
730
+ function createFileClient(config) {
731
+ return new UniversalFileClient(config);
732
+ }
733
+
734
+ export { ALL_SUPPORTED_MIME_TYPES, API_BASE_PATH, API_ENDPOINTS, AUDIO_EXTENSIONS, AUDIO_MIME_TYPES, DEFAULT_CHUNK_SIZE, DEFAULT_MAX_AUDIO_SIZE, DEFAULT_MAX_DOCUMENT_SIZE, DEFAULT_MAX_FILE_SIZE, DEFAULT_MAX_IMAGE_SIZE, DEFAULT_MAX_VIDEO_SIZE, DEFAULT_PAGE_SIZE, DEFAULT_REQUEST_TIMEOUT, DEFAULT_UPLOAD_TIMEOUT, DOCUMENT_EXTENSIONS, DOCUMENT_MIME_TYPES, ERROR_CODES, IMAGE_EXTENSIONS, IMAGE_MIME_TYPES, UNIVERSAL_FILE_NAME, UNIVERSAL_FILE_VERSION, UniversalFileClient, VIDEO_EXTENSIONS, VIDEO_MIME_TYPES, buildQueryString, calculateProgress, calculateRemainingTime, calculateSpeed, createFileClient, createFileError, formatErrorMessage, formatFileSize, generateStoragePath, generateUniqueFileName, getFileCategory, getFileExtension, getMimeTypeFromFileName, isAudioFile, isDocumentFile, isImageFile, isMimeTypeSupported, isVideoFile, parseFileSize, parseQueryString, parseStoragePath, readFileAsArrayBuffer, readFileAsBase64, readFileAsText, sanitizeFileName, universalFileClient, validateFile, validateFileName, validateFileSize, validateFileType };
735
+ //# sourceMappingURL=index.mjs.map
736
+ //# sourceMappingURL=index.mjs.map