sa2kit 1.6.52 → 1.6.58

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 (195) hide show
  1. package/dist/AliyunOSSProvider-KSYW2IOG.js +15 -0
  2. package/dist/{AliyunOSSProvider-2FARPAQD.js.map → AliyunOSSProvider-KSYW2IOG.js.map} +1 -1
  3. package/dist/AliyunOSSProvider-TBK3G7YK.mjs +6 -0
  4. package/dist/{AliyunOSSProvider-UMVGVBDJ.mjs.map → AliyunOSSProvider-TBK3G7YK.mjs.map} +1 -1
  5. package/dist/LocalStorageProvider-2DGYRQAB.mjs +6 -0
  6. package/dist/{LocalStorageProvider-PYOHETJV.mjs.map → LocalStorageProvider-2DGYRQAB.mjs.map} +1 -1
  7. package/dist/LocalStorageProvider-SSRW3ZJW.js +15 -0
  8. package/dist/{LocalStorageProvider-JQF5WK5H.js.map → LocalStorageProvider-SSRW3ZJW.js.map} +1 -1
  9. package/dist/UniversalFileService-336GFY6N.mjs +6 -0
  10. package/dist/{UniversalFileService-TNYKO6JN.mjs.map → UniversalFileService-336GFY6N.mjs.map} +1 -1
  11. package/dist/UniversalFileService-J6ET6KZK.js +15 -0
  12. package/dist/{UniversalFileService-RBV6EN5J.js.map → UniversalFileService-J6ET6KZK.js.map} +1 -1
  13. package/dist/booking-BXtkG2ns.d.mts +386 -0
  14. package/dist/booking-BXtkG2ns.d.ts +386 -0
  15. package/dist/bookingAdminService-B2QDjSHJ.d.ts +193 -0
  16. package/dist/bookingAdminService-Dmg7dC6V.d.mts +193 -0
  17. package/dist/calendar/index.js +11 -11
  18. package/dist/calendar/index.mjs +4 -4
  19. package/dist/cart-CcZ7rQyG.d.mts +176 -0
  20. package/dist/cart-D3o67Q3H.d.ts +176 -0
  21. package/dist/chunk-25OFOKNF.js +171 -0
  22. package/dist/chunk-25OFOKNF.js.map +1 -0
  23. package/dist/chunk-3DXPQ4YV.mjs +165 -0
  24. package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
  25. package/dist/{chunk-4VJQZSPU.mjs → chunk-3NHAT7D4.mjs} +3 -4
  26. package/dist/chunk-3NHAT7D4.mjs.map +1 -0
  27. package/dist/{chunk-3JW4X3AC.mjs → chunk-622Y6LTH.mjs} +3 -3
  28. package/dist/{chunk-3JW4X3AC.mjs.map → chunk-622Y6LTH.mjs.map} +1 -1
  29. package/dist/chunk-ANKVXRPY.mjs +30 -0
  30. package/dist/chunk-ANKVXRPY.mjs.map +1 -0
  31. package/dist/chunk-CIVO4R6N.mjs +37 -0
  32. package/dist/chunk-CIVO4R6N.mjs.map +1 -0
  33. package/dist/{chunk-IZOIVYOW.js → chunk-DENROXAE.js} +2 -2
  34. package/dist/{chunk-IZOIVYOW.js.map → chunk-DENROXAE.js.map} +1 -1
  35. package/dist/{chunk-6BJ76BYC.mjs → chunk-EGJPS7OL.mjs} +3 -3
  36. package/dist/{chunk-6BJ76BYC.mjs.map → chunk-EGJPS7OL.mjs.map} +1 -1
  37. package/dist/chunk-EKIOJEJK.js +2719 -0
  38. package/dist/chunk-EKIOJEJK.js.map +1 -0
  39. package/dist/chunk-EOWTOG7Y.js +119 -0
  40. package/dist/chunk-EOWTOG7Y.js.map +1 -0
  41. package/dist/chunk-HDMIOOZY.mjs +546 -0
  42. package/dist/chunk-HDMIOOZY.mjs.map +1 -0
  43. package/dist/{chunk-MZKATHB7.js → chunk-HHVDOIPV.js} +4 -4
  44. package/dist/{chunk-MZKATHB7.js.map → chunk-HHVDOIPV.js.map} +1 -1
  45. package/dist/chunk-HJ6MH7J7.js +552 -0
  46. package/dist/chunk-HJ6MH7J7.js.map +1 -0
  47. package/dist/chunk-KH6RQ4J5.js +28 -0
  48. package/dist/chunk-KH6RQ4J5.js.map +1 -0
  49. package/dist/{chunk-GFVAIT6Y.mjs → chunk-MFG2Y6UR.mjs} +2 -2
  50. package/dist/{chunk-GFVAIT6Y.mjs.map → chunk-MFG2Y6UR.mjs.map} +1 -1
  51. package/dist/{chunk-35CXIK5Y.js → chunk-NCOXT7SK.js} +11 -11
  52. package/dist/{chunk-35CXIK5Y.js.map → chunk-NCOXT7SK.js.map} +1 -1
  53. package/dist/chunk-NZZZUMMX.mjs +784 -0
  54. package/dist/chunk-NZZZUMMX.mjs.map +1 -0
  55. package/dist/{chunk-OBIPI4GU.mjs → chunk-OFYBMMWT.mjs} +4 -4
  56. package/dist/{chunk-OBIPI4GU.mjs.map → chunk-OFYBMMWT.mjs.map} +1 -1
  57. package/dist/chunk-PVLLRDUT.js +6944 -0
  58. package/dist/chunk-PVLLRDUT.js.map +1 -0
  59. package/dist/chunk-Q5EDCKQA.js +336 -0
  60. package/dist/chunk-Q5EDCKQA.js.map +1 -0
  61. package/dist/{chunk-SHY424RZ.mjs → chunk-SNBILYSH.mjs} +6 -6
  62. package/dist/{chunk-SHY424RZ.mjs.map → chunk-SNBILYSH.mjs.map} +1 -1
  63. package/dist/chunk-TJZDPOO7.js +34 -0
  64. package/dist/chunk-TJZDPOO7.js.map +1 -0
  65. package/dist/{chunk-7JN25DJB.js → chunk-UVHPCLP6.js} +14 -14
  66. package/dist/{chunk-7JN25DJB.js.map → chunk-UVHPCLP6.js.map} +1 -1
  67. package/dist/chunk-WGD2NBVR.mjs +6904 -0
  68. package/dist/chunk-WGD2NBVR.mjs.map +1 -0
  69. package/dist/chunk-WS3QZYBI.mjs +2701 -0
  70. package/dist/chunk-WS3QZYBI.mjs.map +1 -0
  71. package/dist/chunk-XLR6QUDR.mjs +113 -0
  72. package/dist/chunk-XLR6QUDR.mjs.map +1 -0
  73. package/dist/chunk-YMS6BPXS.js +807 -0
  74. package/dist/chunk-YMS6BPXS.js.map +1 -0
  75. package/dist/chunk-YOTQG4NP.mjs +314 -0
  76. package/dist/chunk-YOTQG4NP.mjs.map +1 -0
  77. package/dist/chunk-ZGVB35L2.mjs +25 -0
  78. package/dist/chunk-ZGVB35L2.mjs.map +1 -0
  79. package/dist/chunk-ZRAW3HXA.js +43 -0
  80. package/dist/chunk-ZRAW3HXA.js.map +1 -0
  81. package/dist/{chunk-4XXIBWCO.js → chunk-ZRWED7Q6.js} +66 -66
  82. package/dist/{chunk-4XXIBWCO.js.map → chunk-ZRWED7Q6.js.map} +1 -1
  83. package/dist/{chunk-DVENFCQY.js → chunk-ZWQJSZEY.js} +4 -5
  84. package/dist/chunk-ZWQJSZEY.js.map +1 -0
  85. package/dist/components/index.js +104 -104
  86. package/dist/components/index.mjs +4 -4
  87. package/dist/index.js +146 -148
  88. package/dist/index.js.map +1 -1
  89. package/dist/index.mjs +8 -11
  90. package/dist/index.mjs.map +1 -1
  91. package/dist/logger/index.js +7 -7
  92. package/dist/logger/index.mjs +1 -4
  93. package/dist/mikuFusionGame/index.js +4 -4
  94. package/dist/mikuFusionGame/index.mjs +3 -3
  95. package/dist/portfolio/index.js +10 -10
  96. package/dist/portfolio/index.mjs +5 -5
  97. package/dist/showmasterpiece/db/index.d.mts +3028 -0
  98. package/dist/showmasterpiece/db/index.d.ts +3028 -0
  99. package/dist/showmasterpiece/db/index.js +179 -0
  100. package/dist/showmasterpiece/db/index.js.map +1 -0
  101. package/dist/showmasterpiece/db/index.mjs +6 -0
  102. package/dist/showmasterpiece/db/index.mjs.map +1 -0
  103. package/dist/showmasterpiece/index.d.mts +10 -1729
  104. package/dist/showmasterpiece/index.d.ts +10 -1729
  105. package/dist/showmasterpiece/index.js +439 -9659
  106. package/dist/showmasterpiece/index.js.map +1 -1
  107. package/dist/showmasterpiece/index.mjs +12 -9633
  108. package/dist/showmasterpiece/index.mjs.map +1 -1
  109. package/dist/showmasterpiece/logic/index.d.mts +372 -0
  110. package/dist/showmasterpiece/logic/index.d.ts +372 -0
  111. package/dist/showmasterpiece/logic/index.js +91 -0
  112. package/dist/showmasterpiece/logic/index.js.map +1 -0
  113. package/dist/showmasterpiece/logic/index.mjs +6 -0
  114. package/dist/showmasterpiece/logic/index.mjs.map +1 -0
  115. package/dist/showmasterpiece/server/index.d.mts +3 -2704
  116. package/dist/showmasterpiece/server/index.d.ts +3 -2704
  117. package/dist/showmasterpiece/server/index.js +43 -43
  118. package/dist/showmasterpiece/server/index.mjs +2 -2
  119. package/dist/showmasterpiece/ui/miniapp/index.d.mts +86 -0
  120. package/dist/showmasterpiece/ui/miniapp/index.d.ts +86 -0
  121. package/dist/showmasterpiece/ui/miniapp/index.js +196 -0
  122. package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -0
  123. package/dist/showmasterpiece/ui/miniapp/index.mjs +183 -0
  124. package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -0
  125. package/dist/showmasterpiece/ui/web/index.d.mts +600 -0
  126. package/dist/showmasterpiece/ui/web/index.d.ts +600 -0
  127. package/dist/showmasterpiece/ui/web/index.js +131 -0
  128. package/dist/showmasterpiece/ui/web/index.js.map +1 -0
  129. package/dist/showmasterpiece/ui/web/index.mjs +14 -0
  130. package/dist/showmasterpiece/ui/web/index.mjs.map +1 -0
  131. package/dist/universalExport/server/index.js +2 -4
  132. package/dist/universalExport/server/index.js.map +1 -1
  133. package/dist/universalExport/server/index.mjs +1 -3
  134. package/dist/universalExport/server/index.mjs.map +1 -1
  135. package/dist/universalFile/index.js +6 -9
  136. package/dist/universalFile/index.js.map +1 -1
  137. package/dist/universalFile/index.mjs +1 -5
  138. package/dist/universalFile/index.mjs.map +1 -1
  139. package/dist/universalFile/server/index.js +5852 -291
  140. package/dist/universalFile/server/index.js.map +1 -1
  141. package/dist/universalFile/server/index.mjs +5764 -8
  142. package/dist/universalFile/server/index.mjs.map +1 -1
  143. package/dist/utils/index.js +11 -11
  144. package/dist/utils/index.mjs +2 -2
  145. package/package.json +26 -1
  146. package/dist/AliyunOSSProvider-2FARPAQD.js +0 -15
  147. package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +0 -9
  148. package/dist/LocalStorageProvider-JQF5WK5H.js +0 -15
  149. package/dist/LocalStorageProvider-PYOHETJV.mjs +0 -9
  150. package/dist/UniversalFileService-RBV6EN5J.js +0 -15
  151. package/dist/UniversalFileService-TNYKO6JN.mjs +0 -9
  152. package/dist/chunk-4NFOSCM6.js +0 -34
  153. package/dist/chunk-4NFOSCM6.js.map +0 -1
  154. package/dist/chunk-4VJQZSPU.mjs.map +0 -1
  155. package/dist/chunk-6AHYPPUP.js +0 -344
  156. package/dist/chunk-6AHYPPUP.js.map +0 -1
  157. package/dist/chunk-76V7EKBX.mjs +0 -796
  158. package/dist/chunk-76V7EKBX.mjs.map +0 -1
  159. package/dist/chunk-ACLOJXXE.js +0 -195
  160. package/dist/chunk-ACLOJXXE.js.map +0 -1
  161. package/dist/chunk-AEXPAH7Z.mjs +0 -32
  162. package/dist/chunk-AEXPAH7Z.mjs.map +0 -1
  163. package/dist/chunk-CFGX3EKK.js +0 -560
  164. package/dist/chunk-CFGX3EKK.js.map +0 -1
  165. package/dist/chunk-D2HXMGXS.js +0 -46
  166. package/dist/chunk-D2HXMGXS.js.map +0 -1
  167. package/dist/chunk-DVENFCQY.js.map +0 -1
  168. package/dist/chunk-K7WNCB4V.mjs +0 -554
  169. package/dist/chunk-K7WNCB4V.mjs.map +0 -1
  170. package/dist/chunk-L4ZYBFB2.mjs +0 -44
  171. package/dist/chunk-L4ZYBFB2.mjs.map +0 -1
  172. package/dist/chunk-M4HGHTIC.js +0 -820
  173. package/dist/chunk-M4HGHTIC.js.map +0 -1
  174. package/dist/chunk-PKKIDPXE.mjs +0 -5797
  175. package/dist/chunk-PKKIDPXE.mjs.map +0 -1
  176. package/dist/chunk-PXWDQFWV.mjs +0 -192
  177. package/dist/chunk-PXWDQFWV.mjs.map +0 -1
  178. package/dist/chunk-TSTBLX6B.js +0 -5888
  179. package/dist/chunk-TSTBLX6B.js.map +0 -1
  180. package/dist/chunk-VTGPHE4Z.mjs +0 -322
  181. package/dist/chunk-VTGPHE4Z.mjs.map +0 -1
  182. package/dist/popupConfig-BznThU1O.d.mts +0 -330
  183. package/dist/popupConfig-BznThU1O.d.ts +0 -330
  184. package/dist/showmasterpiece/migration/index.d.mts +0 -120
  185. package/dist/showmasterpiece/migration/index.d.ts +0 -120
  186. package/dist/showmasterpiece/migration/index.js +0 -595
  187. package/dist/showmasterpiece/migration/index.js.map +0 -1
  188. package/dist/showmasterpiece/migration/index.mjs +0 -589
  189. package/dist/showmasterpiece/migration/index.mjs.map +0 -1
  190. package/dist/showmasterpiece/scripts/index.d.mts +0 -28
  191. package/dist/showmasterpiece/scripts/index.d.ts +0 -28
  192. package/dist/showmasterpiece/scripts/index.js +0 -327
  193. package/dist/showmasterpiece/scripts/index.js.map +0 -1
  194. package/dist/showmasterpiece/scripts/index.mjs +0 -325
  195. package/dist/showmasterpiece/scripts/index.mjs.map +0 -1
@@ -1,46 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkZ6ZWNWWR_js = require('./chunk-Z6ZWNWWR.js');
4
-
5
- // src/universalFile/types.ts
6
- exports.FileServiceError = void 0; exports.FileUploadError = void 0; exports.FileProcessingError = void 0; exports.StorageProviderError = void 0; exports.CDNProviderError = void 0;
7
- var init_types = chunkZ6ZWNWWR_js.__esm({
8
- "src/universalFile/types.ts"() {
9
- exports.FileServiceError = class extends Error {
10
- constructor(message, code, details) {
11
- super(message);
12
- this.code = code;
13
- this.details = details;
14
- this.name = "FileServiceError";
15
- }
16
- };
17
- exports.FileUploadError = class extends exports.FileServiceError {
18
- constructor(message, details) {
19
- super(message, "FILE_UPLOAD_ERROR", details);
20
- this.name = "FileUploadError";
21
- }
22
- };
23
- exports.FileProcessingError = class extends exports.FileServiceError {
24
- constructor(message, details) {
25
- super(message, "FILE_PROCESSING_ERROR", details);
26
- this.name = "FileProcessingError";
27
- }
28
- };
29
- exports.StorageProviderError = class extends exports.FileServiceError {
30
- constructor(message, details) {
31
- super(message, "STORAGE_PROVIDER_ERROR", details);
32
- this.name = "StorageProviderError";
33
- }
34
- };
35
- exports.CDNProviderError = class extends exports.FileServiceError {
36
- constructor(message, details) {
37
- super(message, "CDN_PROVIDER_ERROR", details);
38
- this.name = "CDNProviderError";
39
- }
40
- };
41
- }
42
- });
43
-
44
- exports.init_types = init_types;
45
- //# sourceMappingURL=chunk-D2HXMGXS.js.map
46
- //# sourceMappingURL=chunk-D2HXMGXS.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/universalFile/types.ts"],"names":["FileServiceError","FileUploadError","FileProcessingError","StorageProviderError","CDNProviderError","__esm"],"mappings":";;;;;AAmSaA,iCAAA,CAAA,CAYAC,gCAAA,CAAA,CAQAC,oCAAA,CAAA,CAQAC,qCAAA,CAAA,CAQAC;AAvUb,IAAA,UAAA,GAAAC,sBAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAmSO,IAAML,wBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,MAC1C,WAAA,CACE,OAAA,EACgB,IAAA,EACA,OAAA,EAChB;AACA,QAAA,KAAA,CAAM,OAAO,CAAA;AAHG,QAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,QAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGhB,QAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,MACd;AAAA,KACF;AAGO,IAAMC,uBAAA,GAAN,cAA8BD,wBAAA,CAAiB;AAAA,MACpD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,QAAA,KAAA,CAAM,OAAA,EAAS,qBAAqB,OAAO,CAAA;AAC3C,QAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,MACd;AAAA,KACF;AAGO,IAAME,2BAAA,GAAN,cAAkCF,wBAAA,CAAiB;AAAA,MACxD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,QAAA,KAAA,CAAM,OAAA,EAAS,yBAAyB,OAAO,CAAA;AAC/C,QAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,MACd;AAAA,KACF;AAGO,IAAMG,4BAAA,GAAN,cAAmCH,wBAAA,CAAiB;AAAA,MACzD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,QAAA,KAAA,CAAM,OAAA,EAAS,0BAA0B,OAAO,CAAA;AAChD,QAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,MACd;AAAA,KACF;AAGO,IAAMI,wBAAA,GAAN,cAA+BJ,wBAAA,CAAiB;AAAA,MACrD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,QAAA,KAAA,CAAM,OAAA,EAAS,sBAAsB,OAAO,CAAA;AAC5C,QAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,MACd;AAAA,KACF;AAAA,EAAA;AAAA,CAAA","file":"chunk-D2HXMGXS.js","sourcesContent":["/**\n * 通用文件服务类型定义\n *\n * 定义了文件存储、上传、下载等核心接口和类型\n */\n\n// ============= 基础类型定义 =============\n\n/** 文件存储类型 */\nexport type StorageType = 'local' | 'aliyun-oss' | 'aws-s3' | 'qcloud-cos';\n\n/** CDN提供者类型 */\nexport type CDNType = 'none' | 'aliyun-cdn' | 'aws-cloudfront' | 'qcloud-cdn';\n\n/** 文件处理类型 */\nexport type ProcessorType = 'image' | 'audio' | 'video' | 'document';\n\n/** 文件上传状态 */\nexport type UploadStatus = 'pending' | 'uploading' | 'processing' | 'completed' | 'failed';\n\n/** 访问权限类型 */\nexport type AccessPermission = 'public' | 'private' | 'authenticated' | 'owner-only';\n\n// ============= 文件元数据接口 =============\n\n/** 文件元数据基础接口 */\nexport interface FileMetadata {\n /** 文件ID */\n id: string;\n /** 原始文件名 */\n originalName: string;\n /** 存储文件名 */\n storageName: string;\n /** 文件大小(字节) */\n size: number;\n /** MIME类型 */\n mimeType: string;\n /** 文件扩展名 */\n extension: string;\n /** 文件哈希值 */\n hash?: string;\n /** 上传时间 */\n uploadTime: Date;\n /** 访问权限 */\n permission: AccessPermission;\n /** 上传者ID */\n uploaderId: string;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 存储提供者 */\n storageProvider: StorageType;\n /** 存储路径 */\n storagePath: string;\n /** CDN URL */\n cdnUrl?: string;\n /** 访问次数 */\n accessCount: number;\n /** 最后访问时间 */\n lastAccessTime?: Date;\n /** 过期时间 */\n expiresAt?: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** 上传文件信息(客户端使用) */\nexport interface UploadFileInfo {\n /** 文件对象 */\n file: File;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 自定义存储路径 */\n customPath?: string;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n /** 是否需要处理 */\n needsProcessing?: boolean;\n /** 处理选项 */\n processingOptions?: ProcessingOptions;\n}\n\n/** 文件处理选项基础接口 */\nexport interface ProcessingOptions {\n /** 处理器类型 */\n type: ProcessorType;\n /** 处理参数 */\n params?: Record<string, any>;\n}\n\n/** 图片处理选项 */\nexport interface ImageProcessingOptions extends ProcessingOptions {\n type: 'image';\n /** 压缩质量 0-100 */\n quality?: number;\n /** 目标宽度 */\n width?: number;\n /** 目标高度 */\n height?: number;\n /** 格式转换 */\n format?: 'jpeg' | 'png' | 'webp' | 'avif';\n /** 是否添加水印 */\n watermark?: boolean;\n /** 水印配置 */\n watermarkOptions?: {\n text?: string;\n image?: string;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'center';\n opacity?: number;\n };\n}\n\n/** 音频处理选项 */\nexport interface AudioProcessingOptions extends ProcessingOptions {\n type: 'audio';\n /** 比特率 */\n bitrate?: number;\n /** 格式转换 */\n format?: 'mp3' | 'wav' | 'ogg' | 'aac';\n /** 采样率 */\n sampleRate?: number;\n /** 声道数 */\n channels?: number;\n}\n\n/** 视频处理选项 */\nexport interface VideoProcessingOptions extends ProcessingOptions {\n type: 'video';\n /** 视频质量 */\n quality?: number;\n /** 格式转换 */\n format?: 'mp4' | 'avi' | 'mov' | 'webm';\n /** 生成缩略图 */\n generateThumbnail?: boolean;\n /** 缩略图时间点(秒) */\n thumbnailTime?: number;\n}\n\n// ============= 上传相关接口 =============\n\n/** 上传进度 */\nexport interface UploadProgress {\n /** 文件ID */\n fileId: string;\n /** 上传状态 */\n status: UploadStatus;\n /** 进度百分比(0-100) */\n progress: number;\n /** 已上传字节数 */\n uploadedBytes: number;\n /** 总字节数 */\n totalBytes: number;\n /** 上传速度(字节/秒) */\n speed: number;\n /** 剩余时间(秒) */\n remainingTime: number;\n /** 错误信息 */\n error?: string;\n}\n\n/** 上传结果 */\nexport interface UploadResult {\n /** 是否成功 */\n success: boolean;\n /** 文件元数据 */\n file?: FileMetadata;\n /** 文件访问URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 查询相关接口 =============\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块标识 */\n moduleId?: string;\n /** 业务标识 */\n businessId?: string;\n /** 上传者ID */\n uploaderId?: string;\n /** MIME类型过滤 */\n mimeType?: string;\n /** 最小文件大小 */\n minSize?: number;\n /** 最大文件大小 */\n maxSize?: number;\n /** 开始时间 */\n startTime?: Date;\n /** 结束时间 */\n endTime?: Date;\n /** 搜索关键词 */\n keyword?: string;\n /** 标签 */\n tags?: string[];\n /** 排序字段 */\n sortBy?: string;\n /** 排序方向 */\n sortOrder?: 'asc' | 'desc';\n /** 页码 */\n page?: number;\n /** 每页数量 */\n pageSize?: number;\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据项 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页码 */\n page: number;\n /** 每页数量 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n /** 是否有下一页 */\n hasNext: boolean;\n /** 是否有上一页 */\n hasPrev: boolean;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 事件相关接口 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'processing:start'\n | 'processing:complete'\n | 'processing:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件ID */\n fileId: string;\n /** 事件时间 */\n timestamp: Date;\n /** 事件数据 */\n data?: Record<string, any>;\n /** 错误信息 */\n error?: string;\n}\n\n/** 文件事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 异常类定义 =============\n\n/** 文件服务基础异常 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传错误 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理错误 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者错误 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者错误 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/time.ts","../src/utils/japanese.ts","../src/utils/validators.ts","../src/utils/file.ts","../src/utils/array.ts","../src/utils/string.ts","../src/utils/debug.ts","../src/utils/error.ts","../src/utils/cn.ts"],"names":["init_logger","logger","twMerge","clsx"],"mappings":";;;;;;;AAIO,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,iBAAiB,OAAA,EAAyB;AACxC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AAChD,IAAA,OAAO,UAAU,GAAA,GAAM,gBAAA,CAAiB,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EACpE,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,OAAA,EAAyB;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,IAAI,CAAA;AACvC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,OAAA,GAAU,OAAQ,EAAE,CAAA;AAChD,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AAEhD,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,OAAO,KAAA,GAAQ,GAAA,GAAM,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,GAAI,MAAM,gBAAA,CAAiB,QAAA,EAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,IAC9G;AACA,IAAA,OAAO,UAAU,GAAA,GAAM,gBAAA,CAAiB,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EACpE,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,IAAA,EAAqB,MAAA,GAAS,OAAA,EAAiB;AACxD,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,IAAI,CAAA;AACvB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,EAAQ,GAAI,EAAE,OAAA,EAAQ;AACzC,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,UAAU,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AAE1D,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,OAAO,MAAA,KAAW,UAAU,cAAA,GAAO,OAAA;AAAA,IACrC,CAAA,MAAA,IAAW,aAAa,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA,KAAW,UAAU,cAAA,GAAO,WAAA;AAAA,IACrC,CAAA,MAAA,IAAW,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,MAAA,KAAW,OAAA,GAAU,QAAA,GAAW,cAAA,GAAO,QAAA,GAAW,WAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,OAAO,CAAA,CAAE,mBAAmB,MAAM,CAAA;AAAA,IACpC;AAAA,EACF;AACF;;;AC3CO,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA,EAI3B,aAAa,IAAA,EAAwB;AACnC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA,IAAK,EAAC;AAAA,EAC5C,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAwB;AAClC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA,IAAK,EAAC;AAAA,EACzD,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAAsB;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,iDAAA,EAAmD,EAAE,CAAA;AAAA,EAC3E;AACF;;;ACrBO,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,aAAa,KAAA,EAAwB;AACnC,IAAA,MAAM,UAAA,GAAa,4BAAA;AACnB,IAAA,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,EAC9B,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAA,EAGd;AACA,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,KAAK,wCAAwC,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,EAAA,EAAI;AACxB,MAAA,MAAA,CAAO,KAAK,wCAAwC,CAAA;AAAA,IACtD;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,KAAK,2CAA2C,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC3B,MAAA,MAAA,CAAO,KAAK,2CAA2C,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,MAC3B;AAAA,KACF;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAA,EAA2B;AACzC,IAAA,MAAM,aAAA,GAAgB,sBAAA;AACtB,IAAA,OAAO,aAAA,CAAc,KAAK,QAAQ,CAAA;AAAA,EACpC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,MAAc,OAAA,EAA0B;AACtD,IAAA,OAAO,IAAA,GAAO,KAAK,IAAA,IAAQ,OAAA;AAAA,EAC7B,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,MAAc,cAAA,EAAmC;AAC/D,IAAA,OAAO,cAAA,CAAe,SAAS,IAAI,CAAA;AAAA,EACrC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAA,EAAsB;AAC/B,IAAA,IAAI;AACF,MAAA,IAAI,IAAI,GAAG,CAAA;AACX,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;;;ACzEO,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA,EAIvB,eAAe,KAAA,EAAuB;AACpC,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,SAAA;AAExB,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,MAAM,QAAQ,CAAC,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC9C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAElD,IAAA,OAAO,UAAA,CAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAI,GAAA,GAAM,MAAM,CAAC,CAAA;AAAA,EACxE,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAA,EAA0B;AACzC,IAAA,OAAO,QAAA,CAAS,OAAQ,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA,GAAI,CAAA,KAAO,KAAK,CAAC,CAAA;AAAA,EACnE,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,YAAA,EAA8B;AACnD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACzD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,YAAY,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,CAAQ,GAAA,GAAO,WAAY,EAAE,CAAA;AAC3D,IAAA,OAAO,SAAA,GAAa,QAAA,GAAY,GAAA,GAAO,SAAA,GAAa,GAAA,GAAO,MAAA,GAAU,GAAA,GAAO,SAAA,GAAc,QAAA,GAAY,GAAA,GAAO,SAAA,GAAa,GAAA,GAAO,MAAA;AAAA,EACnI,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAA,EAA2B;AAEzC,IAAA,MAAM,YAAA,GAAe,wBAAA;AACrB,IAAA,OAAO,CAAC,aAAa,IAAA,CAAK,QAAQ,KAAK,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,MAAA,IAAU,GAAA;AAAA,EACnF;AACF;;;ACxCO,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,OAAU,KAAA,EAAiB;AACzB,IAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EAC3B,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAW,OAAY,GAAA,EAAmC;AACxD,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,MACX,CAAC,QAAQ,IAAA,KAAS;AAChB,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AACjC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAQ,CAAA,IAAK,EAAC;AACnC,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,QAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA;AACnB,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,MACA;AAAC,KACH;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CACE,KAAA,EACA,IAAA,EACA,KAAA,EAQA;AACA,IAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AACrC,IAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,IAAK,KAAA;AAC3B,IAAA,MAAM,MAAM,KAAA,GAAQ,KAAA;AACpB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAEnC,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAS,IAAA,GAAO,KAAA;AAAA,MAChB,SAAS,IAAA,GAAO;AAAA,KAClB;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAW,KAAA,EAAiB;AAC1B,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAK,CAAA;AAC1B,IAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,IAAK,IAAI,CAAA,CAAE,CAAA;AAC5C,MAAA,CAAC,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA,GAAI,CAAC,QAAA,CAAS,CAAC,CAAA,EAAI,QAAA,CAAS,CAAC,CAAE,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;AClEO,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA,EAIzB,QAAA,CAAS,IAAA,EAAc,MAAA,EAAgB,MAAA,GAAS,KAAA,EAAe;AAC7D,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,MAAA,EAAQ,OAAO,IAAA;AAClC,IAAA,OAAO,KAAK,SAAA,CAAU,CAAA,EAAG,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA;AAAA,EACrD,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAAsB;AAC/B,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,EAClE,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAAsB;AACjC,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAU,CAAC,WAAW,GAAA,GAAO,MAAA,CAAO,aAAc,CAAA;AAAA,EACxE,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAAsB;AACjC,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,EAAa,CAAC,GAAG,MAAA,KAAW,MAAA,CAAO,aAAa,CAAA;AAAA,EACtE,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAA,EAAwB;AACrC,IAAA,MAAM,KAAA,GAAQ,gEAAA;AACd,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAA,IAAU,KAAA,CAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;AC1CAA,4BAAA,EAAA;AAGO,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,cAAc,GAAA,EAAkB;AAC9B,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,0CAA2C,KAAA,GAAS,GAAA;AAAA,IAC7D;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAgB;AAC1B,IAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,KAAgB,WAAA,GAAc,YAAY,GAAA,EAAI,GAAI,KAAK,GAAA,EAAI;AAChF,IAAA,OAAO;AAAA,MACL,KAAK,MAAM;AACT,QAAA,MAAM,GAAA,GAAM,OAAO,WAAA,KAAgB,WAAA,GAAc,YAAY,GAAA,EAAI,GAAI,KAAK,GAAA,EAAI;AAC9E,QAAA,MAAM,WAAW,GAAA,GAAM,KAAA;AACvB,QAAA,MAAM,WAAW,KAAA,IAAS,OAAA,IAAW,OAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,GAAK,IAAA;AACpE,QAAAC,uBAAA,CAAO,KAAK,OAAO,CAAA;AACnB,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAgD;AAC9C,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,WAAA,EAAa;AACzD,MAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,SAAA,CAAU,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA;AAAA,QACvC,SAAA,EAAW,SAAA,CAAU,cAAA,CAAe,KAAA,CAAM,SAAS,CAAA;AAAA,QACnD,QAAA,EAAU,SAAA,CAAU,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAA;AAAA,QACjD,QAAA,EAAU,SAAA,CAAU,cAAA,CAAe,KAAA,CAAM,QAAQ;AAAA,OACnD;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC9CO,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,WAAA,CACE,IAAA,EACA,OAAA,EACA,OAAA,EACyC;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAAA,IAClB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,KAAA,EAAwB;AAC1C,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACf;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,aAAa,KAAA,EAAO;AAC5D,MAAA,OAAO,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,eAAA;AAAA,EACT,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAS,EAAA,EAAsB,WAAA,GAAc,CAAA,EAAG,QAAQ,GAAA,EAAkB;AAC9E,IAAA,IAAI,SAAA;AAEJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,WAAA,EAAa,OAAA,EAAA,EAAW;AACvD,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,EAAA,EAAG;AAAA,MAClB,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,QAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,UAAA,MAAM,SAAA;AAAA,QACR;AAGA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAC,CAAC,CAAA;AAAA,MACtF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA;AAAA,EACR;AACF;ACzDO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOC,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B","file":"chunk-DVENFCQY.js","sourcesContent":["/**\n * 时间格式化工具\n */\n\nexport const formatTime = {\n /**\n * 将秒数转换为 MM:SS 格式\n */\n toMinutesSeconds(seconds: number): string {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return minutes + ':' + remainingSeconds.toString().padStart(2, '0');\n },\n\n /**\n * 将秒数转换为 HH:MM:SS 格式\n */\n toHoursMinutesSeconds(seconds: number): string {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n\n if (hours > 0) {\n return hours + ':' + minutes.toString().padStart(2, '0') + ':' + remainingSeconds.toString().padStart(2, '0');\n }\n return minutes + ':' + remainingSeconds.toString().padStart(2, '0');\n },\n\n /**\n * 格式化日期为用户友好的格式\n */\n formatDate(date: string | Date, locale = 'zh-CN'): string {\n const d = new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return locale === 'zh-CN' ? '今天' : 'Today';\n } else if (diffDays === 1) {\n return locale === 'zh-CN' ? '昨天' : 'Yesterday';\n } else if (diffDays < 7) {\n return locale === 'zh-CN' ? diffDays + '天前' : diffDays + ' days ago';\n } else {\n return d.toLocaleDateString(locale);\n }\n },\n};\n\n","/**\n * 日语文本处理工具\n */\n\nexport const japaneseUtils = {\n /**\n * 提取文本中的汉字\n */\n extractKanji(text: string): string[] {\n return text.match(/[\\u4E00-\\u9FAF]/g) || [];\n },\n\n /**\n * 提取文本中的假名\n */\n extractKana(text: string): string[] {\n return text.match(/[\\u3040-\\u309F\\u30A0-\\u30FF]/g) || [];\n },\n\n /**\n * 清理文本,移除特殊字符但保留日语字符\n */\n cleanText(text: string): string {\n return text.replace(/[^\\u3040-\\u309F\\u30A0-\\u30FF\\u4E00-\\u9FAF\\w\\s]/g, '');\n },\n};\n","/**\n * 验证工具\n */\n\nexport const validators = {\n /**\n * 验证邮箱格式\n */\n isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n },\n\n /**\n * 验证密码强度\n */\n isValidPassword(password: string): {\n isValid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (password.length < 6) {\n errors.push('Password must be at least 6 characters');\n }\n\n if (password.length > 50) {\n errors.push('Password must not exceed 50 characters');\n }\n\n if (!/[a-zA-Z]/.test(password)) {\n errors.push('Password must contain at least one letter');\n }\n\n if (!/[0-9]/.test(password)) {\n errors.push('Password must contain at least one number');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * 验证用户名格式\n */\n isValidUsername(username: string): boolean {\n const usernameRegex = /^[a-zA-Z0-9_]{3,20}$/;\n return usernameRegex.test(username);\n },\n\n /**\n * 验证文件大小\n */\n isValidFileSize(size: number, maxSize: number): boolean {\n return size > 0 && size <= maxSize;\n },\n\n /**\n * 验证文件类型\n */\n isValidFileType(type: string, supportedTypes: string[]): boolean {\n return supportedTypes.includes(type);\n },\n\n /**\n * 验证 URL 格式\n */\n isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n },\n};\n\n","/**\n * 文件处理工具\n */\n\nexport const fileUtils = {\n /**\n * 格式化文件大小\n */\n formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n },\n\n /**\n * 获取文件扩展名\n */\n getFileExtension(filename: string): string {\n return filename.slice(((filename.lastIndexOf('.') - 1) >>> 0) + 2);\n },\n\n /**\n * 生成唯一文件名\n */\n generateUniqueFileName(originalName: string): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n const extension = this.getFileExtension(originalName);\n const baseName = originalName.replace('.' + (extension), '');\n return extension ? (baseName) + '_' + (timestamp) + '_' + (random) + '.' + (extension) : (baseName) + '_' + (timestamp) + '_' + (random);\n },\n\n /**\n * 验证文件名是否有效\n */\n isValidFilename(filename: string): boolean {\n // 不允许包含特殊字符\n const invalidChars = /[<>:\"/\\\\|?*\\x00-\\x1F]/g;\n return !invalidChars.test(filename) && filename.length > 0 && filename.length <= 255;\n },\n};\n\n","/**\n * 数组和对象工具\n */\n\nexport const arrayUtils = {\n /**\n * 数组去重\n */\n unique<T>(array: T[]): T[] {\n return [...new Set(array)];\n },\n\n /**\n * 数组分组\n */\n groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\n return array.reduce(\n (groups, item) => {\n const groupKey = String(item[key]);\n const group = groups[groupKey] || [];\n group.push(item);\n groups[groupKey] = group;\n return groups;\n },\n {} as Record<string, T[]>\n );\n },\n\n /**\n * 数组分页\n */\n paginate<T>(\n array: T[],\n page: number,\n limit: number\n ): {\n data: T[];\n total: number;\n page: number;\n pages: number;\n hasNext: boolean;\n hasPrev: boolean;\n } {\n const total = array.length;\n const pages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n const end = start + limit;\n const data = array.slice(start, end);\n\n return {\n data,\n total,\n page,\n pages,\n hasNext: page < pages,\n hasPrev: page > 1,\n };\n },\n\n /**\n * 数组随机排序\n */\n shuffle<T>(array: T[]): T[] {\n const shuffled = [...array];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j]!, shuffled[i]!];\n }\n return shuffled;\n },\n};\n\n","/**\n * 字符串工具\n */\n\nexport const stringUtils = {\n /**\n * 截断文本\n */\n truncate(text: string, length: number, suffix = '...'): string {\n if (text.length <= length) return text;\n return text.substring(0, length - suffix.length) + suffix;\n },\n\n /**\n * 首字母大写\n */\n capitalize(text: string): string {\n if (!text) return '';\n return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n },\n\n /**\n * 驼峰转下划线\n */\n camelToSnake(text: string): string {\n return text.replace(/[A-Z]/g, (letter) => '_' + (letter.toLowerCase()));\n },\n\n /**\n * 下划线转驼峰\n */\n snakeToCamel(text: string): string {\n return text.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n },\n\n /**\n * 生成随机字符串\n */\n generateRandom(length: number): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n },\n};\n\n","/**\n * 调试工具\n */\n\nimport { logger } from '../logger';\nimport { fileUtils } from './file';\n\nexport const debugUtils = {\n /**\n * 安全的 JSON 序列化\n */\n safeStringify(obj: any): string {\n try {\n return JSON.stringify(obj, null, 2);\n } catch (error) {\n return '[Circular Reference or Invalid JSON: ' + (error) + ']';\n }\n },\n\n /**\n * 性能计时器\n */\n createTimer(label?: string) {\n const start = typeof performance !== 'undefined' ? performance.now() : Date.now();\n return {\n end: () => {\n const end = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const duration = end - start;\n const message = (label || 'Timer') + ': ' + (duration.toFixed(2)) + 'ms';\n logger.info(message);\n return duration;\n },\n };\n },\n\n /**\n * 内存使用情况(仅在 Node.js 环境)\n */\n getMemoryUsage(): Record<string, string> | null {\n if (typeof process !== 'undefined' && process.memoryUsage) {\n const usage = process.memoryUsage();\n return {\n rss: fileUtils.formatFileSize(usage.rss),\n heapTotal: fileUtils.formatFileSize(usage.heapTotal),\n heapUsed: fileUtils.formatFileSize(usage.heapUsed),\n external: fileUtils.formatFileSize(usage.external),\n };\n }\n return null;\n },\n};\n\n","/**\n * 错误处理工具\n */\n\nexport const errorUtils = {\n /**\n * 创建标准化的错误对象\n */\n createError(\n code: string,\n message: string,\n details?: any\n ): Error & { code: string; details?: any } {\n const error = new Error(message) as Error & { code: string; details?: any };\n error.code = code;\n if (details) {\n error.details = details;\n }\n return error;\n },\n\n /**\n * 安全的错误信息提取\n */\n extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n return 'Unknown error';\n },\n\n /**\n * 错误重试机制\n */\n async retry<T>(fn: () => Promise<T>, maxAttempts = 3, delay = 1000): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxAttempts) {\n throw lastError;\n }\n\n // 指数退避延迟\n await new Promise((resolve) => setTimeout(resolve, delay * Math.pow(2, attempt - 1)));\n }\n }\n\n throw lastError!;\n },\n};\n\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n"]}
@@ -1,554 +0,0 @@
1
- import { init_types, StorageProviderError } from './chunk-AEXPAH7Z.mjs';
2
- import { init_logger, createLogger } from './chunk-PXWDQFWV.mjs';
3
- import { __esm } from './chunk-WMJKH4XE.mjs';
4
- import OSS from 'ali-oss';
5
-
6
- var logger, AliyunOSSProvider;
7
- var init_AliyunOSSProvider = __esm({
8
- "src/universalFile/server/providers/AliyunOSSProvider.ts"() {
9
- init_logger();
10
- init_types();
11
- logger = createLogger("AliyunOSSProvider");
12
- AliyunOSSProvider = class {
13
- constructor() {
14
- this.type = "aliyun-oss";
15
- this.config = null;
16
- this.client = null;
17
- this.isInitialized = false;
18
- }
19
- /**
20
- * 初始化存储提供者
21
- */
22
- async initialize(config) {
23
- return this.reinitialize(config);
24
- }
25
- /**
26
- * 重新初始化存储提供者(支持配置热更新)
27
- */
28
- async reinitialize(config) {
29
- logger.info("\u{1F504} [AliyunOSSProvider] \u91CD\u65B0\u521D\u59CB\u5316OSS\u5BA2\u6237\u7AEF", config);
30
- if (config.type !== "aliyun-oss") {
31
- throw new StorageProviderError("\u914D\u7F6E\u7C7B\u578B\u4E0D\u5339\u914D\uFF1A\u671F\u671B aliyun-oss");
32
- }
33
- const newConfig = config;
34
- const configChanged = !this.config || this.config.region !== newConfig.region || this.config.bucket !== newConfig.bucket || this.config.accessKeyId !== newConfig.accessKeyId || this.config.accessKeySecret !== newConfig.accessKeySecret || this.config.customDomain !== newConfig.customDomain || this.config.secure !== newConfig.secure || this.config.internal !== newConfig.internal;
35
- if (configChanged) {
36
- logger.info("\u{1F504} [AliyunOSSProvider] \u68C0\u6D4B\u5230\u914D\u7F6E\u53D8\u5316\uFF0C\u91CD\u65B0\u521D\u59CB\u5316OSS\u5BA2\u6237\u7AEF");
37
- logger.info(
38
- "\u2601\uFE0F [AliyunOSSProvider] \u65B0\u914D\u7F6E: bucket=" + newConfig.bucket + ", region=" + newConfig.region
39
- );
40
- } else if (this.isInitialized) {
41
- logger.info("\u2139\uFE0F [AliyunOSSProvider] \u914D\u7F6E\u672A\u53D8\u5316\uFF0C\u8DF3\u8FC7\u91CD\u65B0\u521D\u59CB\u5316");
42
- return;
43
- }
44
- this.config = newConfig;
45
- logger.info("\u2601\uFE0F [AliyunOSSProvider] " + (this.isInitialized ? "\u91CD\u65B0" : "") + "\u521D\u59CB\u5316\u963F\u91CC\u4E91OSS");
46
- logger.info("\u2601\uFE0F [AliyunOSSProvider] " + (this.config ? JSON.stringify(this.config) : ""));
47
- try {
48
- this.validateConfig();
49
- if (!this.config.region || typeof this.config.region !== "string") {
50
- throw new Error("OSS region \u5FC5\u987B\u662F\u6709\u6548\u7684\u5B57\u7B26\u4E32");
51
- }
52
- if (!this.config.bucket || typeof this.config.bucket !== "string") {
53
- throw new Error("OSS bucket \u5FC5\u987B\u662F\u6709\u6548\u7684\u5B57\u7B26\u4E32");
54
- }
55
- if (!this.config.accessKeyId || typeof this.config.accessKeyId !== "string") {
56
- throw new Error("OSS accessKeyId \u5FC5\u987B\u662F\u6709\u6548\u7684\u5B57\u7B26\u4E32");
57
- }
58
- if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== "string") {
59
- throw new Error("OSS accessKeySecret \u5FC5\u987B\u662F\u6709\u6548\u7684\u5B57\u7B26\u4E32");
60
- }
61
- logger.info(`\u2601\uFE0F [AliyunOSSProvider] \u521B\u5EFAOSS\u5BA2\u6237\u7AEF\u914D\u7F6E:`, {
62
- region: this.config.region,
63
- bucket: this.config.bucket,
64
- hasAccessKeyId: !!this.config.accessKeyId,
65
- hasAccessKeySecret: !!this.config.accessKeySecret,
66
- secure: this.config.secure !== false,
67
- internal: this.config.internal || false,
68
- cname: !!this.config.customDomain,
69
- endpoint: this.config.customDomain || "\u9ED8\u8BA4\u7AEF\u70B9"
70
- });
71
- this.client = new OSS({
72
- region: this.config.region,
73
- bucket: this.config.bucket,
74
- accessKeyId: this.config.accessKeyId,
75
- accessKeySecret: this.config.accessKeySecret,
76
- secure: this.config.secure !== false,
77
- // 默认使用HTTPS
78
- internal: this.config.internal || false,
79
- // 默认使用公网
80
- timeout: 3e5,
81
- // 5分钟超时
82
- cname: !!this.config.customDomain,
83
- // 是否使用自定义域名
84
- endpoint: this.config.customDomain || void 0
85
- });
86
- if (!this.client) {
87
- throw new Error("OSS\u5BA2\u6237\u7AEF\u521B\u5EFA\u5931\u8D25");
88
- }
89
- logger.info(`\u2601\uFE0F [AliyunOSSProvider] OSS\u5BA2\u6237\u7AEF\u521B\u5EFA\u6210\u529F`);
90
- this.isInitialized = true;
91
- logger.info("\u2705 [AliyunOSSProvider] \u963F\u91CC\u4E91OSS" + (configChanged ? "\u91CD\u65B0" : "") + "\u521D\u59CB\u5316\u5B8C\u6210");
92
- } catch (error) {
93
- logger.error("\u274C [AliyunOSSProvider] \u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25:", error);
94
- throw new StorageProviderError(`\u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25`);
95
- }
96
- }
97
- /**
98
- * 上传文件
99
- */
100
- async upload(fileInfo, filePath) {
101
- this.ensureInitialized();
102
- const startTime = Date.now();
103
- logger.info("\u{1F4E4} [AliyunOSSProvider] \u5F00\u59CB\u4E0A\u4F20\u6587\u4EF6\u5230OSS: " + filePath);
104
- try {
105
- const buffer = Buffer.from(await fileInfo.file.arrayBuffer());
106
- const options = {
107
- headers: {
108
- "Content-Type": fileInfo.file.type || "application/octet-stream",
109
- "Content-Length": fileInfo.file.size.toString()
110
- },
111
- meta: {
112
- uid: 0,
113
- // 必需字段
114
- pid: 0,
115
- // 必需字段
116
- originalName: encodeURIComponent(fileInfo.file.name),
117
- moduleId: fileInfo.moduleId,
118
- businessId: fileInfo.businessId || "",
119
- uploadTime: (/* @__PURE__ */ new Date()).toISOString(),
120
- // 对元数据进行编码处理,避免中文字符问题
121
- ...this.encodeMetadata(fileInfo.metadata || {})
122
- }
123
- };
124
- let result;
125
- if (fileInfo.file.size > 100 * 1024 * 1024) {
126
- logger.info(
127
- "\u{1F4E6} [AliyunOSSProvider] \u4F7F\u7528\u5206\u7247\u4E0A\u4F20\u5927\u6587\u4EF6: " + filePath + ", \u5927\u5C0F: " + fileInfo.file.size
128
- );
129
- result = await this.multipartUpload(filePath, buffer, options);
130
- } else {
131
- logger.info(
132
- "\u{1F4E4} [AliyunOSSProvider] \u4F7F\u7528\u666E\u901A\u4E0A\u4F20: " + filePath + ", \u5927\u5C0F: " + fileInfo.file.size
133
- );
134
- result = await this.client?.put(filePath, buffer, options);
135
- }
136
- const accessUrl = this.generateAccessUrl(filePath);
137
- const uploadTime = Date.now() - startTime;
138
- logger.info("\u2705 [AliyunOSSProvider] \u6587\u4EF6\u4E0A\u4F20\u5B8C\u6210: " + filePath + ", \u8017\u65F6: " + uploadTime + "ms");
139
- return {
140
- success: true,
141
- path: filePath,
142
- url: accessUrl,
143
- size: fileInfo.file.size,
144
- data: {
145
- etag: result.data ? JSON.stringify(result.data) : "",
146
- requestId: result.res?.rt || 0,
147
- uploadTime,
148
- ossUrl: result.url || result.name
149
- }
150
- };
151
- } catch (error) {
152
- logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u4E0A\u4F20\u5931\u8D25: " + filePath + ":", error);
153
- return {
154
- success: false,
155
- error: this.formatOSSError(error)
156
- };
157
- }
158
- }
159
- /**
160
- * 下载文件
161
- */
162
- async download(filePath) {
163
- this.ensureInitialized();
164
- logger.info("\u{1F4E5} [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u4E0B\u8F7D\u6587\u4EF6: " + filePath);
165
- try {
166
- const result = await this.client?.get(filePath);
167
- if (!result.content || !Buffer.isBuffer(result.content)) {
168
- throw new StorageProviderError("\u4E0B\u8F7D\u7684\u6587\u4EF6\u5185\u5BB9\u683C\u5F0F\u9519\u8BEF");
169
- }
170
- logger.info(
171
- "\u2705 [AliyunOSSProvider] \u6587\u4EF6\u4E0B\u8F7D\u5B8C\u6210: " + filePath + ", \u5927\u5C0F: " + result.content.length
172
- );
173
- return result.content;
174
- } catch (error) {
175
- logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25: " + filePath + ":", error);
176
- if (this.isOSSError(error) && error.code === "NoSuchKey") {
177
- throw new StorageProviderError(`\u6587\u4EF6\u4E0D\u5B58\u5728`);
178
- }
179
- throw new StorageProviderError(`\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25`);
180
- }
181
- }
182
- /**
183
- * 删除文件
184
- */
185
- async delete(filePath) {
186
- this.ensureInitialized();
187
- logger.info("\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u5220\u9664\u6587\u4EF6: " + filePath);
188
- try {
189
- const result = await this.client?.delete(filePath);
190
- logger.info("\u2705 [AliyunOSSProvider] \u6587\u4EF6\u5220\u9664\u5B8C\u6210: " + filePath);
191
- return {
192
- success: true,
193
- data: {
194
- requestId: result?.res?.rt || 0,
195
- deletedPath: filePath
196
- }
197
- };
198
- } catch (error) {
199
- logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u5220\u9664\u5931\u8D25: " + filePath + ":", error);
200
- if (this.isOSSError(error) && error.code === "NoSuchKey") {
201
- logger.warn("\u26A0\uFE0F [AliyunOSSProvider] \u6587\u4EF6\u4E0D\u5B58\u5728: " + filePath);
202
- return {
203
- success: true,
204
- data: { reason: "file_not_exists" }
205
- };
206
- }
207
- return {
208
- success: false,
209
- error: this.formatOSSError(error)
210
- };
211
- }
212
- }
213
- /**
214
- * 获取文件信息
215
- */
216
- async getFileInfo(filePath) {
217
- this.ensureInitialized();
218
- try {
219
- const result = await this.client?.head(filePath);
220
- return {
221
- success: true,
222
- size: parseInt(String(result.meta["content-length"] || "0")),
223
- data: {
224
- etag: result.meta.etag || "",
225
- lastModified: result.meta["last-modified"] || "",
226
- contentType: result.meta["content-type"],
227
- meta: result.meta,
228
- size: parseInt(String(result.meta["content-length"] || "0"))
229
- }
230
- };
231
- } catch (error) {
232
- if (this.isOSSError(error) && error.code === "NoSuchKey") {
233
- return {
234
- success: false,
235
- error: "\u6587\u4EF6\u4E0D\u5B58\u5728"
236
- };
237
- }
238
- return {
239
- success: false,
240
- error: this.formatOSSError(error)
241
- };
242
- }
243
- }
244
- /**
245
- * 生成访问URL
246
- */
247
- async getAccessUrl(filePath, expiresIn) {
248
- this.ensureInitialized();
249
- try {
250
- const isImage = /\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);
251
- if (isImage) {
252
- return this.generateAccessUrl(filePath);
253
- } else {
254
- const expires = expiresIn || 3600;
255
- const signedUrl = this.client?.signatureUrl(filePath, {
256
- expires,
257
- method: "GET"
258
- });
259
- return signedUrl || "";
260
- }
261
- } catch (error) {
262
- logger.error("\u274C [AliyunOSSProvider] \u751F\u6210\u8BBF\u95EEURL\u5931\u8D25: " + filePath + ":", error);
263
- throw new StorageProviderError(`\u751F\u6210\u8BBF\u95EEURL\u5931\u8D25`);
264
- }
265
- }
266
- /**
267
- * 生成预签名上传URL
268
- */
269
- async getUploadUrl(filePath, expiresIn) {
270
- this.ensureInitialized();
271
- try {
272
- const expires = expiresIn || 3600;
273
- const signedUrl = this.client?.signatureUrl(filePath, {
274
- expires,
275
- method: "PUT"
276
- });
277
- return signedUrl || "";
278
- } catch (error) {
279
- logger.error("\u274C [AliyunOSSProvider] \u751F\u6210\u4E0A\u4F20URL\u5931\u8D25: " + filePath + ":", error);
280
- throw new StorageProviderError(`\u751F\u6210\u4E0A\u4F20URL\u5931\u8D25`);
281
- }
282
- }
283
- /**
284
- * 检查文件是否存在
285
- */
286
- async exists(filePath) {
287
- this.ensureInitialized();
288
- try {
289
- await this.client?.head(filePath);
290
- return true;
291
- } catch (error) {
292
- if (this.isOSSError(error) && error.code === "NoSuchKey") {
293
- return false;
294
- }
295
- logger.warn("\u26A0\uFE0F [AliyunOSSProvider] \u68C0\u67E5\u6587\u4EF6\u5B58\u5728\u6027\u65F6\u51FA\u9519: " + filePath + ":", error);
296
- return false;
297
- }
298
- }
299
- /**
300
- * 列出文件(详细信息)
301
- */
302
- async listFiles(prefix, delimiter = "/", maxKeys = 1e3) {
303
- this.ensureInitialized();
304
- try {
305
- const options = {
306
- prefix,
307
- delimiter,
308
- "max-keys": String(maxKeys)
309
- };
310
- const result = await this.client?.list(options, {});
311
- const files = (result.objects || []).map((obj) => ({
312
- name: obj.name,
313
- url: this.generateAccessUrl(obj.name),
314
- size: obj.size,
315
- lastModified: obj.lastModified,
316
- etag: obj.etag,
317
- type: "file"
318
- }));
319
- const folders = result.prefixes || [];
320
- return {
321
- files,
322
- folders,
323
- nextMarker: result.nextMarker
324
- };
325
- } catch (error) {
326
- logger.error("\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: " + prefix + ":", error);
327
- throw new StorageProviderError(`\u5217\u51FA\u6587\u4EF6\u5931\u8D25`);
328
- }
329
- }
330
- /**
331
- * 列出文件
332
- */
333
- async list(prefix, maxKeys) {
334
- this.ensureInitialized();
335
- try {
336
- const options = {
337
- prefix,
338
- "max-keys": String(maxKeys || 1e3)
339
- };
340
- const result = await this.client?.list(options, {});
341
- return result.objects?.map((obj) => obj.name) || [];
342
- } catch (error) {
343
- logger.error("\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: " + prefix + ":", error);
344
- return [];
345
- }
346
- }
347
- // ============= 私有方法 =============
348
- /**
349
- * 确保已初始化
350
- */
351
- ensureInitialized() {
352
- if (!this.isInitialized || !this.client || !this.config) {
353
- throw new StorageProviderError("OSS\u5B58\u50A8\u63D0\u4F9B\u8005\u672A\u521D\u59CB\u5316");
354
- }
355
- }
356
- /**
357
- * 验证配置
358
- */
359
- validateConfig() {
360
- if (!this.config) {
361
- throw new StorageProviderError("OSS\u914D\u7F6E\u4E3A\u7A7A");
362
- }
363
- const required = ["region", "bucket", "accessKeyId", "accessKeySecret"];
364
- const missing = required.filter((key) => !this.config[key]);
365
- if (missing.length > 0) {
366
- throw new StorageProviderError(`OSS\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u9879`);
367
- }
368
- }
369
- /**
370
- * 测试连接
371
- */
372
- async testConnection() {
373
- }
374
- /**
375
- * 分片上传大文件
376
- */
377
- async multipartUpload(filePath, buffer, options) {
378
- logger.info(`\u{1F4E6} [AliyunOSSProvider] \u4F7F\u7528\u591A\u5206\u7247\u4E0A\u4F20`);
379
- const result = await this.client?.multipartUpload(filePath, buffer, {
380
- partSize: 10 * 1024 * 1024,
381
- // 10MB per chunk
382
- parallel: 4,
383
- // 并发数
384
- progress: (p) => {
385
- if (p % 0.1 < 0.01) {
386
- logger.info("\u{1F4E6} [AliyunOSSProvider] \u4E0A\u4F20\u8FDB\u5EA6: " + (p * 100).toFixed(1) + "%");
387
- }
388
- },
389
- meta: options.meta,
390
- headers: options.headers
391
- });
392
- return {
393
- name: result?.name || "",
394
- url: result?.name || "",
395
- // OSS返回的是object名称
396
- data: result?.data || {},
397
- res: result?.res || {}
398
- };
399
- }
400
- /**
401
- * 生成公开访问URL
402
- */
403
- generateAccessUrl(filePath) {
404
- if (!this.config) {
405
- throw new StorageProviderError("OSS\u914D\u7F6E\u4E3A\u7A7A");
406
- }
407
- const normalizedPath = filePath.startsWith("/") ? filePath.substring(1) : filePath;
408
- if (this.config.customDomain) {
409
- const protocol = this.config.secure !== false ? "https" : "http";
410
- const url = protocol + "://" + this.config.customDomain + "/" + normalizedPath;
411
- logger.info("\u{1F517} [AliyunOSSProvider] \u4F7F\u7528\u81EA\u5B9A\u4E49\u57DF\u540D: " + url);
412
- return url;
413
- } else {
414
- const protocol = this.config.secure !== false ? "https" : "http";
415
- const url = protocol + "://" + this.config.bucket + "." + this.config.region + ".aliyuncs.com/" + normalizedPath;
416
- logger.info("\u{1F517} [AliyunOSSProvider] \u4F7F\u7528\u9ED8\u8BA4OSS\u57DF\u540D: " + url);
417
- return url;
418
- }
419
- }
420
- /**
421
- * 判断是否为OSS错误
422
- */
423
- isOSSError(error) {
424
- if (!error || typeof error !== "object") {
425
- return false;
426
- }
427
- return typeof error.code === "string" && typeof (error.name || "") === "string" && typeof (error.message || "") === "string";
428
- }
429
- /**
430
- * 格式化OSS错误信息
431
- */
432
- formatOSSError(error) {
433
- if (error instanceof Error) {
434
- return error.message;
435
- }
436
- if (typeof error === "string") {
437
- return error;
438
- }
439
- return "\u672A\u77E5\u9519\u8BEF";
440
- }
441
- /**
442
- * 流式上传(可选实现)
443
- */
444
- async uploadStream(readableStream, filePath, contentType, contentLength) {
445
- this.ensureInitialized();
446
- const startTime = Date.now();
447
- logger.info("\u{1F4E4} [AliyunOSSProvider] \u5F00\u59CB\u6D41\u5F0F\u4E0A\u4F20\u6587\u4EF6\u5230OSS: " + filePath);
448
- try {
449
- const options = {
450
- timeout: 3e5,
451
- mime: contentType || "application/octet-stream",
452
- meta: { uid: 0, pid: 0 },
453
- callback: { url: "", body: "" },
454
- headers: {}
455
- };
456
- if (contentLength) {
457
- options.headers["Content-Length"] = contentLength.toString();
458
- }
459
- const result = await this.client?.putStream(filePath, readableStream, options);
460
- const accessUrl = this.generateAccessUrl(filePath);
461
- const uploadTime = Date.now() - startTime;
462
- logger.info("\u2705 [AliyunOSSProvider] \u6D41\u5F0F\u4E0A\u4F20\u5B8C\u6210: " + filePath + ", \u8017\u65F6: " + uploadTime + "ms");
463
- return {
464
- success: true,
465
- path: filePath,
466
- url: accessUrl,
467
- size: contentLength,
468
- data: {
469
- name: result.name,
470
- requestId: result.res?.rt || 0,
471
- uploadTime,
472
- ossUrl: result.url || result.name
473
- }
474
- };
475
- } catch (error) {
476
- logger.error("\u274C [AliyunOSSProvider] \u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25: " + filePath + ":", error);
477
- return {
478
- success: false,
479
- error: this.formatOSSError(error)
480
- };
481
- }
482
- }
483
- /**
484
- * 批量删除文件
485
- */
486
- async batchDelete(filePaths) {
487
- this.ensureInitialized();
488
- logger.info("\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u6279\u91CF\u5220\u9664\u6587\u4EF6\uFF0C\u6570\u91CF: " + filePaths.length);
489
- try {
490
- const result = await this.client?.deleteMulti(filePaths, {
491
- quiet: false
492
- // 返回删除结果
493
- });
494
- logger.info("\u2705 [AliyunOSSProvider] \u6279\u91CF\u5220\u9664\u5B8C\u6210\uFF0C\u6210\u529F: " + (result.deleted?.length || 0));
495
- return {
496
- success: true,
497
- data: {
498
- deleted: result.deleted,
499
- requestId: result.res?.rt || 0
500
- }
501
- };
502
- } catch (error) {
503
- logger.error(`\u274C [AliyunOSSProvider] \u6279\u91CF\u5220\u9664\u5931\u8D25:`, error);
504
- return {
505
- success: false,
506
- error: this.formatOSSError(error)
507
- };
508
- }
509
- }
510
- /**
511
- * 复制文件
512
- */
513
- async copy(sourcePath, targetPath) {
514
- this.ensureInitialized();
515
- logger.info("\u{1F4CB} [AliyunOSSProvider] \u5F00\u59CB\u590D\u5236\u6587\u4EF6: " + sourcePath + " -> " + targetPath);
516
- try {
517
- const result = await this.client?.copy(targetPath, sourcePath);
518
- logger.info("\u2705 [AliyunOSSProvider] \u6587\u4EF6\u590D\u5236\u5B8C\u6210: " + sourcePath + " -> " + targetPath);
519
- return {
520
- success: true,
521
- data: {
522
- etag: result.data?.etag,
523
- lastModified: result.data?.lastModified,
524
- requestId: result.res?.rt || 0
525
- }
526
- };
527
- } catch (error) {
528
- logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u590D\u5236\u5931\u8D25: " + sourcePath + " -> " + targetPath + ":", error);
529
- return {
530
- success: false,
531
- error: this.formatOSSError(error)
532
- };
533
- }
534
- }
535
- /**
536
- * 编码元数据,避免中文字符在HTTP头部中的问题
537
- */
538
- encodeMetadata(metadata) {
539
- const encoded = {};
540
- for (const [key, value] of Object.entries(metadata)) {
541
- if (value !== null && value !== void 0) {
542
- const stringValue = String(value);
543
- encoded[key] = encodeURIComponent(stringValue);
544
- }
545
- }
546
- return encoded;
547
- }
548
- };
549
- }
550
- });
551
-
552
- export { AliyunOSSProvider, init_AliyunOSSProvider };
553
- //# sourceMappingURL=chunk-K7WNCB4V.mjs.map
554
- //# sourceMappingURL=chunk-K7WNCB4V.mjs.map