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 @@
1
+ {"version":3,"sources":["../../src/universalFile/constants.ts","../../src/universalFile/utils.ts","../../src/universalFile/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * 通用文件服务常量定义\n */\n\n// ============= 版本信息 =============\n\n/** 模块版本 */\nexport const UNIVERSAL_FILE_VERSION = '1.0.0';\n\n/** 模块名称 */\nexport const UNIVERSAL_FILE_NAME = '@qhr123/sa2kit/universalFile';\n\n// ============= 文件大小限制 =============\n\n/** 默认最大文件大小(字节) - 100MB */\nexport const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;\n\n/** 默认最大图片大小(字节) - 10MB */\nexport const DEFAULT_MAX_IMAGE_SIZE = 10 * 1024 * 1024;\n\n/** 默认最大视频大小(字节) - 500MB */\nexport const DEFAULT_MAX_VIDEO_SIZE = 500 * 1024 * 1024;\n\n/** 默认最大音频大小(字节) - 50MB */\nexport const DEFAULT_MAX_AUDIO_SIZE = 50 * 1024 * 1024;\n\n/** 默认最大文档大小(字节) - 20MB */\nexport const DEFAULT_MAX_DOCUMENT_SIZE = 20 * 1024 * 1024;\n\n// ============= MIME类型 =============\n\n/** 图片MIME类型 */\nexport const IMAGE_MIME_TYPES = [\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n];\n\n/** 视频MIME类型 */\nexport const VIDEO_MIME_TYPES = [\n 'video/mp4',\n 'video/mpeg',\n 'video/quicktime',\n 'video/x-msvideo',\n 'video/webm',\n];\n\n/** 音频MIME类型 */\nexport const AUDIO_MIME_TYPES = ['audio/mpeg', 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/aac'];\n\n/** 文档MIME类型 */\nexport const DOCUMENT_MIME_TYPES = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/plain',\n];\n\n/** 所有支持的MIME类型 */\nexport const ALL_SUPPORTED_MIME_TYPES = [\n ...IMAGE_MIME_TYPES,\n ...VIDEO_MIME_TYPES,\n ...AUDIO_MIME_TYPES,\n ...DOCUMENT_MIME_TYPES,\n];\n\n// ============= 文件扩展名 =============\n\n/** 图片扩展名 */\nexport const IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg'];\n\n/** 视频扩展名 */\nexport const VIDEO_EXTENSIONS = ['.mp4', '.mpeg', '.mov', '.avi', '.webm'];\n\n/** 音频扩展名 */\nexport const AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.aac'];\n\n/** 文档扩展名 */\nexport const DOCUMENT_EXTENSIONS = [\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n];\n\n// ============= API端点 =============\n\n/** API基础路径 */\nexport const API_BASE_PATH = '/api/universal-file';\n\n/** API端点 */\nexport const API_ENDPOINTS = {\n /** 上传文件 */\n UPLOAD: `${API_BASE_PATH}/upload`,\n /** 获取文件URL */\n GET_URL: (fileId: string) => `${API_BASE_PATH}/files/${fileId}/url`,\n /** 获取文件元数据 */\n GET_METADATA: (fileId: string) => `${API_BASE_PATH}/files/${fileId}`,\n /** 删除文件 */\n DELETE: (fileId: string) => `${API_BASE_PATH}/files/${fileId}`,\n /** 查询文件列表 */\n QUERY: `${API_BASE_PATH}/files`,\n /** 批量删除 */\n BATCH_DELETE: `${API_BASE_PATH}/files/batch-delete`,\n /** 获取上传进度 */\n GET_PROGRESS: (fileId: string) => `${API_BASE_PATH}/upload/${fileId}/progress`,\n} as const;\n\n// ============= 错误代码 =============\n\n/** 错误代码 */\nexport const ERROR_CODES = {\n /** 文件上传错误 */\n FILE_UPLOAD_ERROR: 'FILE_UPLOAD_ERROR',\n /** 文件大小超限 */\n FILE_SIZE_EXCEEDED: 'FILE_SIZE_EXCEEDED',\n /** 文件类型不支持 */\n FILE_TYPE_NOT_SUPPORTED: 'FILE_TYPE_NOT_SUPPORTED',\n /** 文件不存在 */\n FILE_NOT_FOUND: 'FILE_NOT_FOUND',\n /** 文件处理错误 */\n FILE_PROCESSING_ERROR: 'FILE_PROCESSING_ERROR',\n /** 存储提供者错误 */\n STORAGE_PROVIDER_ERROR: 'STORAGE_PROVIDER_ERROR',\n /** CDN提供者错误 */\n CDN_PROVIDER_ERROR: 'CDN_PROVIDER_ERROR',\n /** 网络错误 */\n NETWORK_ERROR: 'NETWORK_ERROR',\n /** 超时错误 */\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n /** 未授权 */\n UNAUTHORIZED: 'UNAUTHORIZED',\n /** 权限不足 */\n FORBIDDEN: 'FORBIDDEN',\n /** 服务器错误 */\n SERVER_ERROR: 'SERVER_ERROR',\n} as const;\n\n// ============= 默认配置 =============\n\n/** 默认分页大小 */\nexport const DEFAULT_PAGE_SIZE = 20;\n\n/** 默认请求超时时间(毫秒) - 30秒 */\nexport const DEFAULT_REQUEST_TIMEOUT = 30000;\n\n/** 默认上传超时时间(毫秒) - 5分钟 */\nexport const DEFAULT_UPLOAD_TIMEOUT = 300000;\n\n/** 默认分片上传大小(字节) - 5MB */\nexport const DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;\n","/**\n * 通用文件服务工具函数\n */\n\nimport {\n IMAGE_MIME_TYPES,\n VIDEO_MIME_TYPES,\n AUDIO_MIME_TYPES,\n DOCUMENT_MIME_TYPES,\n} from './constants';\n\n// ============= 文件大小处理 =============\n\n/**\n * 格式化文件大小\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${units[i]}`;\n}\n\n/**\n * 解析文件大小字符串\n */\nexport function parseFileSize(sizeStr: string): number {\n const match = sizeStr.match(/^(\\d+(?:\\.\\d+)?)\\s*([KMGT]?B)$/i);\n if (!match || !match[1] || !match[2]) return 0;\n\n const value = parseFloat(match[1]);\n const unit = match[2].toUpperCase();\n\n const units: Record<string, number> = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n TB: 1024 * 1024 * 1024 * 1024,\n };\n\n return value * (units[unit] || 1);\n}\n\n// ============= MIME类型处理 =============\n\n/**\n * 获取文件扩展名\n */\nexport function getFileExtension(fileName: string): string {\n const lastDot = fileName.lastIndexOf('.');\n if (lastDot === -1) return '';\n return fileName.substring(lastDot).toLowerCase();\n}\n\n/**\n * 根据文件名获取MIME类型\n */\nexport function getMimeTypeFromFileName(fileName: string): string {\n const ext = getFileExtension(fileName);\n\n const mimeMap: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.mp4': 'video/mp4',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n };\n\n return mimeMap[ext] || 'application/octet-stream';\n}\n\n/**\n * 检查MIME类型是否支持\n */\nexport function isMimeTypeSupported(mimeType: string, allowedTypes?: string[]): boolean {\n if (allowedTypes && allowedTypes.length > 0) {\n return allowedTypes.includes(mimeType);\n }\n\n return (\n IMAGE_MIME_TYPES.includes(mimeType) ||\n VIDEO_MIME_TYPES.includes(mimeType) ||\n AUDIO_MIME_TYPES.includes(mimeType) ||\n DOCUMENT_MIME_TYPES.includes(mimeType)\n );\n}\n\n/**\n * 判断是否为图片类型\n */\nexport function isImageFile(mimeType: string): boolean {\n return IMAGE_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为视频类型\n */\nexport function isVideoFile(mimeType: string): boolean {\n return VIDEO_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为音频类型\n */\nexport function isAudioFile(mimeType: string): boolean {\n return AUDIO_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为文档类型\n */\nexport function isDocumentFile(mimeType: string): boolean {\n return DOCUMENT_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 获取文件类型类别\n */\nexport function getFileCategory(\n mimeType: string\n): 'image' | 'video' | 'audio' | 'document' | 'other' {\n if (isImageFile(mimeType)) return 'image';\n if (isVideoFile(mimeType)) return 'video';\n if (isAudioFile(mimeType)) return 'audio';\n if (isDocumentFile(mimeType)) return 'document';\n return 'other';\n}\n\n// ============= 文件名处理 =============\n\n/**\n * 验证文件名是否合法\n */\nexport function validateFileName(fileName: string): boolean {\n // 检查是否包含非法字符\n const invalidChars = /[<>:\"|?*\\/\\\\]/;\n if (invalidChars.test(fileName)) {\n return false;\n }\n\n // 检查长度\n if (fileName.length === 0 || fileName.length > 255) {\n return false;\n }\n\n // 检查是否以点开头\n if (fileName.startsWith('.')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 清理文件名,移除非法字符\n */\nexport function sanitizeFileName(fileName: string): string {\n return fileName\n .replace(/[<>:\"|?*\\/\\\\]/g, '_')\n .replace(/^\\.+/, '')\n .substring(0, 255);\n}\n\n/**\n * 生成唯一文件名\n */\nexport function generateUniqueFileName(originalName: string, fileId: string): string {\n const ext = getFileExtension(originalName);\n return `${fileId}${ext}`;\n}\n\n// ============= 存储路径处理 =============\n\n/**\n * 生成存储路径\n */\nexport function generateStoragePath(\n moduleId: string,\n fileName: string,\n options?: {\n businessId?: string;\n useDate?: boolean;\n customPrefix?: string;\n }\n): string {\n const parts: string[] = [];\n\n // 添加自定义前缀\n if (options?.customPrefix) {\n parts.push(options.customPrefix);\n }\n\n // 添加模块标识\n parts.push(moduleId);\n\n // 添加业务标识\n if (options?.businessId) {\n parts.push(options.businessId);\n }\n\n // 添加日期路径\n if (options?.useDate !== false) {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n parts.push(String(year), month, day);\n }\n\n // 添加文件名\n parts.push(fileName);\n\n return parts.join('/');\n}\n\n/**\n * 解析存储路径\n */\nexport function parseStoragePath(path: string): {\n moduleId?: string;\n businessId?: string;\n year?: string;\n month?: string;\n day?: string;\n fileName: string;\n} {\n const parts = path.split('/');\n const fileName = parts[parts.length - 1] || '';\n\n return {\n moduleId: parts[0] || undefined,\n businessId: parts.length > 5 ? parts[1] : undefined,\n year: parts.length > 3 ? parts[parts.length - 4] : undefined,\n month: parts.length > 2 ? parts[parts.length - 3] : undefined,\n day: parts.length > 1 ? parts[parts.length - 2] : undefined,\n fileName,\n };\n}\n\n// ============= 文件验证 =============\n\n/**\n * 验证文件大小\n */\nexport function validateFileSize(file: File, maxSize: number): { valid: boolean; error?: string } {\n if (file.size > maxSize) {\n return {\n valid: false,\n error: `文件大小超过限制: ${formatFileSize(file.size)} > ${formatFileSize(maxSize)}`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * 验证文件类型\n */\nexport function validateFileType(\n file: File,\n allowedTypes?: string[]\n): { valid: boolean; error?: string } {\n const mimeType = file.type || getMimeTypeFromFileName(file.name);\n\n if (!isMimeTypeSupported(mimeType, allowedTypes)) {\n return {\n valid: false,\n error: `不支持的文件类型: ${mimeType}`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * 验证文件\n */\nexport function validateFile(\n file: File,\n options?: {\n maxSize?: number;\n allowedTypes?: string[];\n }\n): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 验证文件名\n if (!validateFileName(file.name)) {\n errors.push('文件名包含非法字符或长度不合法');\n }\n\n // 验证文件大小\n if (options?.maxSize) {\n const sizeResult = validateFileSize(file, options.maxSize);\n if (!sizeResult.valid && sizeResult.error) {\n errors.push(sizeResult.error);\n }\n }\n\n // 验证文件类型\n if (options?.allowedTypes) {\n const typeResult = validateFileType(file, options.allowedTypes);\n if (!typeResult.valid && typeResult.error) {\n errors.push(typeResult.error);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n// ============= URL处理 =============\n\n/**\n * 构建查询字符串\n */\nexport function buildQueryString(params: Record<string, any>): string {\n const searchParams = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((v) => searchParams.append(key, String(v)));\n } else {\n searchParams.append(key, String(value));\n }\n }\n });\n\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : '';\n}\n\n/**\n * 解析URL查询参数\n */\nexport function parseQueryString(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n const urlObj = new URL(url, window.location.origin);\n\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\n// ============= 进度计算 =============\n\n/**\n * 计算上传进度\n */\nexport function calculateProgress(uploadedBytes: number, totalBytes: number): number {\n if (totalBytes === 0) return 0;\n return Math.min(Math.round((uploadedBytes / totalBytes) * 100), 100);\n}\n\n/**\n * 计算上传速度\n */\nexport function calculateSpeed(uploadedBytes: number, elapsedTime: number): number {\n if (elapsedTime === 0) return 0;\n return uploadedBytes / (elapsedTime / 1000); // 字节/秒\n}\n\n/**\n * 计算剩余时间\n */\nexport function calculateRemainingTime(\n uploadedBytes: number,\n totalBytes: number,\n speed: number\n): number {\n if (speed === 0) return 0;\n const remainingBytes = totalBytes - uploadedBytes;\n return Math.round(remainingBytes / speed); // 秒\n}\n\n// ============= 错误处理 =============\n\n/**\n * 创建文件错误对象\n */\nexport function createFileError(\n code: string,\n message: string,\n details?: Record<string, any>\n): { code: string; message: string; details?: Record<string, any>; timestamp: Date } {\n return {\n code,\n message,\n details,\n timestamp: new Date(),\n };\n}\n\n/**\n * 格式化错误消息\n */\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n\n return '未知错误';\n}\n\n// ============= 文件读取 =============\n\n/**\n * 读取文件为Base64\n */\nexport function readFileAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n const result = reader.result as string;\n // 移除Data URL前缀\n const base64 = result.split(',')[1] || '';\n resolve(base64);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * 读取文件为ArrayBuffer\n */\nexport function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as ArrayBuffer);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsArrayBuffer(file);\n });\n}\n\n/**\n * 读取文件为文本\n */\nexport function readFileAsText(file: File, encoding: string = 'UTF-8'): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as string);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsText(file, encoding);\n });\n}\n","/**\n * 通用文件服务客户端SDK\n *\n * 提供文件上传、下载、查询等功能的客户端接口\n */\n\nimport type {\n FileMetadata,\n UploadFileInfo,\n UploadProgress,\n FileQueryOptions,\n PaginatedResult,\n BatchOperationResult,\n} from './types';\nimport {\n API_ENDPOINTS,\n ERROR_CODES,\n DEFAULT_REQUEST_TIMEOUT,\n DEFAULT_UPLOAD_TIMEOUT,\n} from './constants';\nimport { createFileError, formatErrorMessage, buildQueryString } from './utils';\n\n// ============= 配置类型 =============\n\nexport interface UniversalFileClientConfig {\n /** API基础URL */\n baseUrl?: string;\n /** 请求超时时间(毫秒) */\n timeout?: number;\n /** 上传超时时间(毫秒) */\n uploadTimeout?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\n// ============= 客户端类 =============\n\n/**\n * 通用文件服务客户端\n */\nexport class UniversalFileClient {\n private config: Required<UniversalFileClientConfig>;\n\n constructor(config: UniversalFileClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || '',\n timeout: config.timeout || DEFAULT_REQUEST_TIMEOUT,\n uploadTimeout: config.uploadTimeout || DEFAULT_UPLOAD_TIMEOUT,\n headers: config.headers || {},\n };\n }\n\n // ============= 文件上传API =============\n\n /**\n * 上传文件\n */\n async uploadFile(\n fileInfo: UploadFileInfo,\n onProgress?: (progress: UploadProgress) => void\n ): Promise<FileMetadata> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.UPLOAD}`;\n const startTime = Date.now();\n\n // 创建FormData\n const formData = new FormData();\n formData.append('file', fileInfo.file);\n formData.append('moduleId', fileInfo.moduleId);\n\n if (fileInfo.businessId) {\n formData.append('businessId', fileInfo.businessId);\n }\n\n if (fileInfo.permission) {\n formData.append('permission', fileInfo.permission);\n }\n\n if (fileInfo.customPath) {\n formData.append('customPath', fileInfo.customPath);\n }\n\n if (fileInfo.metadata) {\n formData.append('metadata', JSON.stringify(fileInfo.metadata));\n }\n\n if (fileInfo.needsProcessing !== undefined) {\n formData.append('needsProcessing', String(fileInfo.needsProcessing));\n }\n\n if (fileInfo.processingOptions) {\n formData.append('processingOptions', JSON.stringify(fileInfo.processingOptions));\n }\n\n try {\n // 创建XMLHttpRequest以支持上传进度\n return await new Promise<FileMetadata>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n // 监听上传进度\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable && onProgress) {\n const elapsedTime = Date.now() - startTime;\n const speed = event.loaded / (elapsedTime / 1000);\n const remainingBytes = event.total - event.loaded;\n const remainingTime = speed > 0 ? remainingBytes / speed : 0;\n\n const progress: UploadProgress = {\n fileId: '', // 暂时为空,上传完成后会有\n status: 'uploading',\n progress: Math.round((event.loaded / event.total) * 100),\n uploadedBytes: event.loaded,\n totalBytes: event.total,\n speed,\n remainingTime,\n };\n\n onProgress(progress);\n }\n });\n\n // 监听上传完成\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n const fileMetadata = this.transformFileMetadataFromAPI(response.file);\n\n if (onProgress) {\n onProgress({\n fileId: fileMetadata.id,\n status: 'completed',\n progress: 100,\n uploadedBytes: fileInfo.file.size,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n });\n }\n\n resolve(fileMetadata);\n } catch (error) {\n reject(new Error('解析响应失败'));\n }\n } else {\n reject(new Error(`上传失败: ${xhr.statusText}`));\n }\n });\n\n // 监听错误\n xhr.addEventListener('error', () => {\n if (onProgress) {\n onProgress({\n fileId: '',\n status: 'failed',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n error: '网络错误',\n });\n }\n reject(new Error('上传失败'));\n });\n\n // 监听超时\n xhr.addEventListener('timeout', () => {\n if (onProgress) {\n onProgress({\n fileId: '',\n status: 'failed',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n error: '上传超时',\n });\n }\n reject(new Error('上传超时'));\n });\n\n // 配置请求\n xhr.open('POST', url);\n xhr.timeout = this.config.uploadTimeout;\n\n // 设置请求头\n Object.entries(this.config.headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n\n // 发送请求\n xhr.send(formData);\n });\n } catch (error) {\n throw createFileError(\n ERROR_CODES.FILE_UPLOAD_ERROR,\n `文件上传失败: ${formatErrorMessage(error)}`,\n { fileInfo, originalError: error }\n );\n }\n }\n\n // ============= 文件查询API =============\n\n /**\n * 获取文件访问URL\n */\n async getFileUrl(fileId: string, expiresIn?: number): Promise<string> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_URL(fileId)}${\n expiresIn ? `?expiresIn=${expiresIn}` : ''\n }`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`获取文件URL失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.url;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n `获取文件URL失败: ${formatErrorMessage(error)}`,\n { fileId, expiresIn, originalError: error }\n );\n }\n }\n\n /**\n * 获取文件元数据\n */\n async getFileMetadata(fileId: string): Promise<FileMetadata> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_METADATA(fileId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw createFileError(ERROR_CODES.FILE_NOT_FOUND, '文件不存在', { fileId });\n }\n throw new Error(`获取文件元数据失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return this.transformFileMetadataFromAPI(data.file);\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n `获取文件元数据失败: ${formatErrorMessage(error)}`,\n { fileId, originalError: error }\n );\n }\n }\n\n /**\n * 查询文件列表\n */\n async queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>> {\n const queryString = buildQueryString({\n moduleId: options.moduleId,\n businessId: options.businessId,\n uploaderId: options.uploaderId,\n mimeType: options.mimeType,\n minSize: options.minSize,\n maxSize: options.maxSize,\n startTime: options.startTime?.toISOString(),\n endTime: options.endTime?.toISOString(),\n keyword: options.keyword,\n tags: options.tags,\n sortBy: options.sortBy,\n sortOrder: options.sortOrder,\n page: options.page,\n pageSize: options.pageSize,\n });\n\n const url = `${this.config.baseUrl}${API_ENDPOINTS.QUERY}${queryString}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`查询文件列表失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return {\n items: data.items.map((item: any) => this.transformFileMetadataFromAPI(item)),\n total: data.total,\n page: data.page,\n pageSize: data.pageSize,\n totalPages: data.totalPages,\n hasNext: data.hasNext,\n hasPrev: data.hasPrev,\n };\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n `查询文件列表失败: ${formatErrorMessage(error)}`,\n { options, originalError: error }\n );\n }\n }\n\n // ============= 文件删除API =============\n\n /**\n * 删除文件\n */\n async deleteFile(fileId: string): Promise<void> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.DELETE(fileId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw createFileError(ERROR_CODES.FILE_NOT_FOUND, '文件不存在', { fileId });\n }\n throw new Error(`删除文件失败: ${response.statusText}`);\n }\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n `删除文件失败: ${formatErrorMessage(error)}`,\n { fileId, originalError: error }\n );\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDeleteFiles(fileIds: string[]): Promise<BatchOperationResult> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.BATCH_DELETE}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ fileIds }),\n });\n\n if (!response.ok) {\n throw new Error(`批量删除文件失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.result;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n `批量删除文件失败: ${formatErrorMessage(error)}`,\n { fileIds, originalError: error }\n );\n }\n }\n\n // ============= 上传进度API =============\n\n /**\n * 获取上传进度\n */\n async getUploadProgress(fileId: string): Promise<UploadProgress> {\n const url = `${this.config.baseUrl}${API_ENDPOINTS.GET_PROGRESS(fileId)}`;\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(`获取上传进度失败: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.progress;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n `获取上传进度失败: ${formatErrorMessage(error)}`,\n { fileId, originalError: error }\n );\n }\n }\n\n // ============= 私有辅助方法 =============\n\n /**\n * 获取请求头\n */\n private getHeaders(): Record<string, string> {\n return {\n ...this.config.headers,\n };\n }\n\n /**\n * 带超时的fetch请求\n */\n private async fetchWithTimeout(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createFileError(ERROR_CODES.TIMEOUT_ERROR, '请求超时', {\n url,\n timeout: this.config.timeout,\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 转换API返回的文件元数据\n */\n private transformFileMetadataFromAPI(apiData: any): FileMetadata {\n return {\n id: apiData.id,\n originalName: apiData.originalName,\n storageName: apiData.storageName || apiData.storedName,\n size: apiData.size,\n mimeType: apiData.mimeType,\n extension: apiData.extension,\n hash: apiData.hash || apiData.md5Hash || apiData.sha256Hash,\n uploadTime: new Date(apiData.uploadTime),\n permission: apiData.permission || 'public',\n uploaderId: apiData.uploaderId,\n moduleId: apiData.moduleId,\n businessId: apiData.businessId,\n storageProvider: apiData.storageProvider || 'local',\n storagePath: apiData.storagePath,\n cdnUrl: apiData.cdnUrl,\n accessCount: apiData.accessCount,\n lastAccessTime: apiData.lastAccessTime ? new Date(apiData.lastAccessTime) : undefined,\n expiresAt: apiData.expiresAt ? new Date(apiData.expiresAt) : undefined,\n metadata: apiData.metadata,\n };\n }\n}\n\n// ============= 单例导出 =============\n\n/**\n * 默认客户端实例\n */\nexport const universalFileClient = new UniversalFileClient();\n\n/**\n * 创建自定义客户端实例\n */\nexport function createFileClient(config?: UniversalFileClientConfig): UniversalFileClient {\n return new UniversalFileClient(config);\n}\n"]}