sa2kit 3.1.0 → 3.2.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 (712) hide show
  1. package/README.md +5 -5
  2. package/dist/AliyunOSSProvider-7IOT5U6M.js +15 -0
  3. package/dist/{AliyunOSSProvider-4GRL2FJB.js.map → AliyunOSSProvider-7IOT5U6M.js.map} +1 -1
  4. package/dist/AliyunOSSProvider-ZXZM7OQA.mjs +6 -0
  5. package/dist/{AliyunOSSProvider-QNVFIZ7Q.mjs.map → AliyunOSSProvider-ZXZM7OQA.mjs.map} +1 -1
  6. package/dist/LocalStorageProvider-KJKRCKBS.js +15 -0
  7. package/dist/{LocalStorageProvider-PFA2DMIJ.js.map → LocalStorageProvider-KJKRCKBS.js.map} +1 -1
  8. package/dist/LocalStorageProvider-O22465NY.mjs +6 -0
  9. package/dist/{LocalStorageProvider-J5RHV37G.mjs.map → LocalStorageProvider-O22465NY.mjs.map} +1 -1
  10. package/dist/{chunk-SLKOEYFH.js → chunk-2234T4A6.js} +5 -5
  11. package/dist/chunk-2234T4A6.js.map +1 -0
  12. package/dist/{chunk-HQLKOXG7.js → chunk-36KGNXKW.js} +3 -3
  13. package/dist/{chunk-HQLKOXG7.js.map → chunk-36KGNXKW.js.map} +1 -1
  14. package/dist/{chunk-BCE6RUZV.js → chunk-375C7WL7.js} +19 -19
  15. package/dist/chunk-375C7WL7.js.map +1 -0
  16. package/dist/{chunk-VMTEDX5H.js → chunk-3J24Z4MB.js} +34 -318
  17. package/dist/chunk-3J24Z4MB.js.map +1 -0
  18. package/dist/{chunk-PBI7FKMB.js → chunk-3QCATFQV.js} +3 -3
  19. package/dist/chunk-3QCATFQV.js.map +1 -0
  20. package/dist/{chunk-FXQOXLDE.js → chunk-3R6JHA6D.js} +4 -4
  21. package/dist/chunk-3R6JHA6D.js.map +1 -0
  22. package/dist/{chunk-ZRAW3HXA.js → chunk-4OXKHV7J.js} +3 -3
  23. package/dist/chunk-4OXKHV7J.js.map +1 -0
  24. package/dist/chunk-4PJM4752.js +4 -0
  25. package/dist/{chunk-5USIS3UM.js.map → chunk-4PJM4752.js.map} +1 -1
  26. package/dist/{chunk-3Z43XGA4.mjs → chunk-65JRVC3F.mjs} +4 -4
  27. package/dist/{chunk-3Z43XGA4.mjs.map → chunk-65JRVC3F.mjs.map} +1 -1
  28. package/dist/{chunk-Q5EDCKQA.js → chunk-6HL54I2B.js} +16 -16
  29. package/dist/chunk-6HL54I2B.js.map +1 -0
  30. package/dist/chunk-6V2MIQPF.mjs +77 -0
  31. package/dist/chunk-6V2MIQPF.mjs.map +1 -0
  32. package/dist/{chunk-C6KV7VTZ.mjs → chunk-7CRU2Y5X.mjs} +5 -5
  33. package/dist/chunk-7CRU2Y5X.mjs.map +1 -0
  34. package/dist/chunk-7PMT4L4I.js +324 -0
  35. package/dist/chunk-7PMT4L4I.js.map +1 -0
  36. package/dist/{chunk-XJ7ZAGC5.js → chunk-7VVZHFEM.js} +3 -3
  37. package/dist/chunk-7VVZHFEM.js.map +1 -0
  38. package/dist/chunk-AWHGIKTQ.js +56 -0
  39. package/dist/{chunk-FHLTPXAR.js.map → chunk-AWHGIKTQ.js.map} +1 -1
  40. package/dist/chunk-B3GYF6TY.js +37 -0
  41. package/dist/{chunk-2Y7BKFKZ.js.map → chunk-B3GYF6TY.js.map} +1 -1
  42. package/dist/{chunk-5FUAQLGC.mjs → chunk-BDBJFOXM.mjs} +3 -3
  43. package/dist/{chunk-5FUAQLGC.mjs.map → chunk-BDBJFOXM.mjs.map} +1 -1
  44. package/dist/{chunk-ZGVB35L2.mjs → chunk-BTW3SWQN.mjs} +3 -3
  45. package/dist/chunk-BTW3SWQN.mjs.map +1 -0
  46. package/dist/{chunk-I5ZPEDNR.mjs → chunk-CHYSSZ4E.mjs} +10 -10
  47. package/dist/chunk-CHYSSZ4E.mjs.map +1 -0
  48. package/dist/{chunk-FIUBFREP.mjs → chunk-DO6QYAZV.mjs} +5 -5
  49. package/dist/chunk-DO6QYAZV.mjs.map +1 -0
  50. package/dist/{chunk-MBANGIG3.mjs → chunk-DTR53LQO.mjs} +6 -6
  51. package/dist/chunk-DTR53LQO.mjs.map +1 -0
  52. package/dist/{chunk-EQXPL7TN.mjs → chunk-EI2S4XDG.mjs} +16 -5
  53. package/dist/chunk-EI2S4XDG.mjs.map +1 -0
  54. package/dist/{chunk-GSNGCENJ.js → chunk-EOZHUI46.js} +16 -4
  55. package/dist/chunk-EOZHUI46.js.map +1 -0
  56. package/dist/{chunk-25OFOKNF.js → chunk-F2BZIU67.js} +18 -5
  57. package/dist/chunk-F2BZIU67.js.map +1 -0
  58. package/dist/{chunk-AQPU2AXH.js → chunk-F2TEJSCP.js} +10 -10
  59. package/dist/chunk-F2TEJSCP.js.map +1 -0
  60. package/dist/{chunk-UCOE6SET.js → chunk-FCLS5R24.js} +3 -3
  61. package/dist/chunk-FCLS5R24.js.map +1 -0
  62. package/dist/{chunk-3NHAT7D4.mjs → chunk-FUA6ZGMI.mjs} +27 -12
  63. package/dist/chunk-FUA6ZGMI.mjs.map +1 -0
  64. package/dist/chunk-FY2X3LYR.mjs +3 -0
  65. package/dist/{chunk-VRN76M56.mjs.map → chunk-FY2X3LYR.mjs.map} +1 -1
  66. package/dist/{chunk-V7EVKD5G.mjs → chunk-GS4SAW25.mjs} +4 -4
  67. package/dist/chunk-GS4SAW25.mjs.map +1 -0
  68. package/dist/chunk-H56ICWUO.js +321 -0
  69. package/dist/chunk-H56ICWUO.js.map +1 -0
  70. package/dist/{chunk-HDMIOOZY.mjs → chunk-HG34SGMN.mjs} +4 -4
  71. package/dist/chunk-HG34SGMN.mjs.map +1 -0
  72. package/dist/chunk-HL4H2HF6.js +279 -0
  73. package/dist/chunk-HL4H2HF6.js.map +1 -0
  74. package/dist/chunk-IJIQUMAK.mjs +272 -0
  75. package/dist/chunk-IJIQUMAK.mjs.map +1 -0
  76. package/dist/{imageCrop/index.mjs → chunk-KEZFTDZT.mjs} +24 -6
  77. package/dist/chunk-KEZFTDZT.mjs.map +1 -0
  78. package/dist/{chunk-KQ643L7Z.js → chunk-KHOVC2KL.js} +3 -3
  79. package/dist/chunk-KHOVC2KL.js.map +1 -0
  80. package/dist/{chunk-6PMXAK7F.js → chunk-KRBSTLKC.js} +57 -57
  81. package/dist/chunk-KRBSTLKC.js.map +1 -0
  82. package/dist/chunk-KVYHCGRY.js +2011 -0
  83. package/dist/chunk-KVYHCGRY.js.map +1 -0
  84. package/dist/{chunk-G7UBMCUT.mjs → chunk-LZ5YTMMP.mjs} +3 -3
  85. package/dist/chunk-LZ5YTMMP.mjs.map +1 -0
  86. package/dist/{chunk-WW4GE6CZ.js → chunk-MJ6XJGAL.js} +23 -119
  87. package/dist/chunk-MJ6XJGAL.js.map +1 -0
  88. package/dist/{chunk-NCRP2YHY.mjs → chunk-MKLXCV4Z.mjs} +8 -96
  89. package/dist/chunk-MKLXCV4Z.mjs.map +1 -0
  90. package/dist/chunk-MMDSZIXD.mjs +286 -0
  91. package/dist/chunk-MMDSZIXD.mjs.map +1 -0
  92. package/dist/{chunk-TC5YU6A4.mjs → chunk-N2O3OX5Y.mjs} +3 -3
  93. package/dist/chunk-N2O3OX5Y.mjs.map +1 -0
  94. package/dist/{chunk-3FRAIS4T.mjs → chunk-O6NNSPWD.mjs} +5 -5
  95. package/dist/{chunk-3FRAIS4T.mjs.map → chunk-O6NNSPWD.mjs.map} +1 -1
  96. package/dist/chunk-OIRZXSYM.js +80 -0
  97. package/dist/chunk-OIRZXSYM.js.map +1 -0
  98. package/dist/{chunk-Q5VFBPMG.mjs → chunk-P7JQRNBJ.mjs} +3 -3
  99. package/dist/chunk-P7JQRNBJ.mjs.map +1 -0
  100. package/dist/{chunk-BIHYZA67.mjs → chunk-PLIG5257.mjs} +18 -18
  101. package/dist/chunk-PLIG5257.mjs.map +1 -0
  102. package/dist/chunk-QIF4MG5V.mjs +283 -0
  103. package/dist/chunk-QIF4MG5V.mjs.map +1 -0
  104. package/dist/{chunk-4OOANEJV.mjs → chunk-RHECN4E2.mjs} +21 -21
  105. package/dist/chunk-RHECN4E2.mjs.map +1 -0
  106. package/dist/{chunk-YOTQG4NP.mjs → chunk-RHHTZTIN.mjs} +4 -4
  107. package/dist/chunk-RHHTZTIN.mjs.map +1 -0
  108. package/dist/{chunk-G6NSKJMH.js → chunk-RRQ2X26Z.js} +4 -4
  109. package/dist/chunk-RRQ2X26Z.js.map +1 -0
  110. package/dist/{chunk-4WBCWJSN.js → chunk-RST2T54Y.js} +7 -7
  111. package/dist/chunk-RST2T54Y.js.map +1 -0
  112. package/dist/{chunk-R2DXTE2L.js → chunk-RVNQI6BI.js} +4 -4
  113. package/dist/chunk-RVNQI6BI.js.map +1 -0
  114. package/dist/{chunk-SKFEJPMJ.mjs → chunk-S3K4LTRI.mjs} +6 -6
  115. package/dist/chunk-S3K4LTRI.mjs.map +1 -0
  116. package/dist/{chunk-ZM2SZJTZ.js → chunk-SWZ5XNF6.js} +9 -9
  117. package/dist/chunk-SWZ5XNF6.js.map +1 -0
  118. package/dist/{chunk-QSKLQX6H.js → chunk-U7HNBCBS.js} +16 -16
  119. package/dist/chunk-U7HNBCBS.js.map +1 -0
  120. package/dist/{chunk-CIVO4R6N.mjs → chunk-UJS3YSD3.mjs} +3 -3
  121. package/dist/chunk-UJS3YSD3.mjs.map +1 -0
  122. package/dist/{chunk-G6HXNQ2U.mjs → chunk-UJUWDF7M.mjs} +8 -8
  123. package/dist/chunk-UJUWDF7M.mjs.map +1 -0
  124. package/dist/{chunk-CAYOQDBR.js → chunk-UR5NENGE.js} +3 -3
  125. package/dist/chunk-UR5NENGE.js.map +1 -0
  126. package/dist/{chunk-QXAOXBVB.mjs → chunk-V7HGBDCB.mjs} +3 -3
  127. package/dist/chunk-V7HGBDCB.mjs.map +1 -0
  128. package/dist/{chunk-ATUCZXJY.js → chunk-V7RLIZMN.js} +14 -4
  129. package/dist/chunk-V7RLIZMN.js.map +1 -0
  130. package/dist/{chunk-ACUFEDVQ.js → chunk-VCKXK6V5.js} +9 -9
  131. package/dist/chunk-VCKXK6V5.js.map +1 -0
  132. package/dist/{chunk-XUS5ACKR.mjs → chunk-VIEXDTNF.mjs} +3 -3
  133. package/dist/chunk-VIEXDTNF.mjs.map +1 -0
  134. package/dist/{imageCrop/index.js → chunk-VN2DULIA.js} +24 -5
  135. package/dist/chunk-VN2DULIA.js.map +1 -0
  136. package/dist/{chunk-S6YSGVWD.js → chunk-VNWMRUY6.js} +31 -87
  137. package/dist/chunk-VNWMRUY6.js.map +1 -0
  138. package/dist/{chunk-3DXPQ4YV.mjs → chunk-VYK4M2D6.mjs} +18 -6
  139. package/dist/chunk-VYK4M2D6.mjs.map +1 -0
  140. package/dist/{chunk-WEEXCPSE.mjs → chunk-WB4H6ZUW.mjs} +3 -3
  141. package/dist/chunk-WB4H6ZUW.mjs.map +1 -0
  142. package/dist/{chunk-GWNBVGDT.mjs → chunk-WM3AEJ2E.mjs} +6 -257
  143. package/dist/chunk-WM3AEJ2E.mjs.map +1 -0
  144. package/dist/{chunk-CX2GHCAI.mjs → chunk-X5GINUGI.mjs} +26 -81
  145. package/dist/chunk-X5GINUGI.mjs.map +1 -0
  146. package/dist/{chunk-DIF5VRL3.mjs → chunk-XB7GUEHZ.mjs} +14 -5
  147. package/dist/chunk-XB7GUEHZ.mjs.map +1 -0
  148. package/dist/{chunk-ZLYPALF3.js → chunk-XE5RGZ3B.js} +11 -11
  149. package/dist/chunk-XE5RGZ3B.js.map +1 -0
  150. package/dist/{chunk-WJ7IMUEJ.mjs → chunk-XNTIMVSL.mjs} +7 -7
  151. package/dist/chunk-XNTIMVSL.mjs.map +1 -0
  152. package/dist/{chunk-ZWQJSZEY.js → chunk-Y7WHUKJF.js} +28 -12
  153. package/dist/chunk-Y7WHUKJF.js.map +1 -0
  154. package/dist/{components/index.mjs → chunk-YIRPPMCN.mjs} +305 -785
  155. package/dist/chunk-YIRPPMCN.mjs.map +1 -0
  156. package/dist/{chunk-KH6RQ4J5.js → chunk-Z2SNB5LJ.js} +3 -3
  157. package/dist/chunk-Z2SNB5LJ.js.map +1 -0
  158. package/dist/{chunk-HJ6MH7J7.js → chunk-ZOP7YIVX.js} +17 -17
  159. package/dist/chunk-ZOP7YIVX.js.map +1 -0
  160. package/dist/{chunk-HJZHQW5R.mjs → chunk-ZUZLWHH5.mjs} +3 -3
  161. package/dist/chunk-ZUZLWHH5.mjs.map +1 -0
  162. package/dist/{ai → common/ai}/llm/core/index.d.mts +3 -3
  163. package/dist/{ai → common/ai}/llm/core/index.d.ts +3 -3
  164. package/dist/{ai/llm → common/ai/llm/core}/index.js +14 -14
  165. package/dist/{ai/llm → common/ai/llm/core}/index.mjs +3 -3
  166. package/dist/{ai → common/ai}/llm/electron/index.d.mts +3 -3
  167. package/dist/{ai/llm/web → common/ai/llm/electron}/index.d.ts +3 -3
  168. package/dist/common/ai/llm/electron/index.js +67 -0
  169. package/dist/common/ai/llm/electron/index.mjs +10 -0
  170. package/dist/{ai → common/ai}/llm/index.d.mts +2 -2
  171. package/dist/{ai → common/ai}/llm/index.d.ts +2 -2
  172. package/dist/{ai/llm/core → common/ai/llm}/index.js +13 -13
  173. package/dist/{ai/llm/core → common/ai/llm}/index.mjs +2 -2
  174. package/dist/{ai → common/ai}/llm/miniapp/index.d.mts +3 -3
  175. package/dist/{ai → common/ai}/llm/miniapp/index.d.ts +3 -3
  176. package/dist/{ai/llm/rn → common/ai/llm/miniapp}/index.js +16 -16
  177. package/dist/{ai/llm/rn → common/ai/llm/miniapp}/index.mjs +4 -4
  178. package/dist/{ai → common/ai}/llm/rn/index.d.mts +3 -3
  179. package/dist/{ai → common/ai}/llm/rn/index.d.ts +3 -3
  180. package/dist/{ai/llm/miniapp → common/ai/llm/rn}/index.js +16 -16
  181. package/dist/{ai/llm/miniapp → common/ai/llm/rn}/index.mjs +4 -4
  182. package/dist/common/ai/llm/ui/electron/index.d.mts +5 -0
  183. package/dist/common/ai/llm/ui/electron/index.d.ts +5 -0
  184. package/dist/common/ai/llm/ui/electron/index.js +22 -0
  185. package/dist/common/ai/llm/ui/electron/index.mjs +9 -0
  186. package/dist/common/ai/llm/ui/miniapp/index.d.mts +9 -0
  187. package/dist/common/ai/llm/ui/miniapp/index.d.ts +9 -0
  188. package/dist/common/ai/llm/ui/miniapp/index.js +14 -0
  189. package/dist/common/ai/llm/ui/miniapp/index.mjs +5 -0
  190. package/dist/common/ai/llm/ui/rn/index.d.mts +9 -0
  191. package/dist/common/ai/llm/ui/rn/index.d.ts +9 -0
  192. package/dist/common/ai/llm/ui/rn/index.js +14 -0
  193. package/dist/common/ai/llm/ui/rn/index.mjs +5 -0
  194. package/dist/{ai → common/ai}/llm/ui/web/index.d.mts +7 -7
  195. package/dist/{ai → common/ai}/llm/ui/web/index.d.ts +7 -7
  196. package/dist/common/ai/llm/ui/web/index.js +21 -0
  197. package/dist/common/ai/llm/ui/web/index.mjs +8 -0
  198. package/dist/{ai → common/ai}/llm/web/index.d.mts +3 -3
  199. package/dist/{ai/llm/electron → common/ai/llm/web}/index.d.ts +3 -3
  200. package/dist/common/ai/llm/web/index.js +66 -0
  201. package/dist/common/ai/llm/web/index.mjs +9 -0
  202. package/dist/{analytics → common/analytics}/index.d.mts +1 -1
  203. package/dist/{analytics → common/analytics}/index.d.ts +1 -1
  204. package/dist/{analytics → common/analytics}/index.js +79 -79
  205. package/dist/{analytics → common/analytics}/index.mjs +3 -3
  206. package/dist/{analytics → common/analytics}/server/index.js +2 -2
  207. package/dist/common/analytics/server/index.js.map +1 -0
  208. package/dist/{analytics → common/analytics}/server/index.mjs +2 -2
  209. package/dist/common/analytics/server/index.mjs.map +1 -0
  210. package/dist/{api → common/api}/index.d.mts +3 -3
  211. package/dist/{api → common/api}/index.d.ts +3 -3
  212. package/dist/common/api/index.js +21 -0
  213. package/dist/common/api/index.mjs +4 -0
  214. package/dist/common/auth/components/index.d.mts +9 -9
  215. package/dist/common/auth/components/index.d.ts +9 -9
  216. package/dist/common/auth/index.js +6 -6
  217. package/dist/common/auth/index.mjs +2 -2
  218. package/dist/common/auth/react/index.d.mts +3 -3
  219. package/dist/common/auth/react/index.d.ts +3 -3
  220. package/dist/common/auth/rn/index.d.mts +2 -2
  221. package/dist/common/auth/rn/index.d.ts +2 -2
  222. package/dist/common/auth/rn/index.js +2 -2
  223. package/dist/common/auth/rn/index.js.map +1 -1
  224. package/dist/common/auth/rn/index.mjs +1 -1
  225. package/dist/common/auth/rn/index.mjs.map +1 -1
  226. package/dist/common/components/index.d.mts +4 -0
  227. package/dist/common/components/index.d.ts +4 -0
  228. package/dist/common/components/index.js +414 -0
  229. package/dist/common/components/index.mjs +9 -0
  230. package/dist/{config → common/config}/index.d.mts +1 -1
  231. package/dist/{config → common/config}/index.d.ts +1 -1
  232. package/dist/common/config/index.js +21 -0
  233. package/dist/common/config/index.mjs +4 -0
  234. package/dist/{config → common/config}/server/index.js +5 -5
  235. package/dist/common/config/server/index.js.map +1 -0
  236. package/dist/{config → common/config}/server/index.mjs +5 -5
  237. package/dist/common/config/server/index.mjs.map +1 -0
  238. package/dist/common/export/index.d.mts +2 -2
  239. package/dist/common/export/index.d.ts +2 -2
  240. package/dist/common/export/index.js +67 -67
  241. package/dist/common/export/index.mjs +3 -3
  242. package/dist/common/export/server/index.d.mts +2 -2
  243. package/dist/common/export/server/index.d.ts +2 -2
  244. package/dist/common/export/server/index.js +76 -48
  245. package/dist/common/export/server/index.mjs +3 -3
  246. package/dist/common/file/index.d.mts +2 -2
  247. package/dist/common/file/index.d.ts +2 -2
  248. package/dist/common/file/index.js +27 -27
  249. package/dist/common/file/index.mjs +5 -5
  250. package/dist/common/file/server/index.d.mts +2 -2
  251. package/dist/common/file/server/index.d.ts +2 -2
  252. package/dist/common/file/server/index.js +58 -50
  253. package/dist/common/file/server/index.mjs +8 -8
  254. package/dist/{i18n → common/i18n}/index.d.mts +1 -1
  255. package/dist/{i18n → common/i18n}/index.d.ts +1 -1
  256. package/dist/{i18n → common/i18n}/index.js +18 -18
  257. package/dist/{i18n → common/i18n}/index.mjs +2 -2
  258. package/dist/common/imageCrop/index.d.mts +2 -0
  259. package/dist/common/imageCrop/index.d.ts +2 -0
  260. package/dist/common/imageCrop/index.js +61 -0
  261. package/dist/common/imageCrop/index.mjs +4 -0
  262. package/dist/common/index.d.mts +16 -16
  263. package/dist/common/index.d.ts +16 -16
  264. package/dist/common/index.js +75 -67
  265. package/dist/common/index.mjs +26 -26
  266. package/dist/common/logger/index.d.mts +1 -1
  267. package/dist/common/logger/index.d.ts +1 -1
  268. package/dist/common/logger/index.js +6 -7
  269. package/dist/common/logger/index.mjs +1 -2
  270. package/dist/{ossFile → common/ossFile}/index.d.mts +6 -6
  271. package/dist/{ossFile → common/ossFile}/index.d.ts +6 -6
  272. package/dist/{ossFile → common/ossFile}/index.js +26 -26
  273. package/dist/{ossFile → common/ossFile}/index.mjs +5 -5
  274. package/dist/{ossFile/server/index.d.ts → common/ossFile/server/index.d.mts} +7 -7
  275. package/dist/{ossFile/server/index.d.mts → common/ossFile/server/index.d.ts} +7 -7
  276. package/dist/{ossFile → common/ossFile}/server/index.js +60 -52
  277. package/dist/{ossFile → common/ossFile}/server/index.mjs +10 -10
  278. package/dist/common/platform/index.js +8 -8
  279. package/dist/common/platform/index.mjs +4 -4
  280. package/dist/common/request/index.d.mts +1 -1
  281. package/dist/common/request/index.d.ts +1 -1
  282. package/dist/common/request/index.js +5 -6
  283. package/dist/common/request/index.mjs +2 -3
  284. package/dist/common/storage/index.d.mts +1 -1
  285. package/dist/common/storage/index.d.ts +1 -1
  286. package/dist/common/storage/index.js +17 -17
  287. package/dist/common/storage/index.mjs +5 -5
  288. package/dist/{universalExport → common/universalExport}/index.d.mts +6 -86
  289. package/dist/{universalExport → common/universalExport}/index.d.ts +6 -86
  290. package/dist/{universalExport → common/universalExport}/index.js +67 -67
  291. package/dist/common/universalExport/index.mjs +5 -0
  292. package/dist/{universalExport → common/universalExport}/server/index.d.mts +3 -84
  293. package/dist/{universalExport → common/universalExport}/server/index.d.ts +3 -84
  294. package/dist/common/universalExport/server/index.js +151 -0
  295. package/dist/common/universalExport/server/index.mjs +6 -0
  296. package/dist/{universalFile/index.d.ts → common/universalFile/index.d.mts} +9 -9
  297. package/dist/{universalFile/index.d.mts → common/universalFile/index.d.ts} +9 -9
  298. package/dist/{universalFile → common/universalFile}/index.js +63 -63
  299. package/dist/common/universalFile/index.js.map +1 -0
  300. package/dist/{universalFile → common/universalFile}/index.mjs +4 -4
  301. package/dist/common/universalFile/index.mjs.map +1 -0
  302. package/dist/{universalFile → common/universalFile}/server/index.d.mts +5 -5
  303. package/dist/{universalFile → common/universalFile}/server/index.d.ts +5 -5
  304. package/dist/{universalFile → common/universalFile}/server/index.js +68 -68
  305. package/dist/{universalFile → common/universalFile}/server/index.mjs +8 -8
  306. package/dist/common/utils/index.d.mts +1 -1
  307. package/dist/common/utils/index.d.ts +1 -1
  308. package/dist/common/utils/index.js +11 -12
  309. package/dist/common/utils/index.mjs +2 -3
  310. package/dist/{index-WrR57hKT.d.ts → index-BRLygK4h.d.ts} +2 -2
  311. package/dist/{request/index.d.mts → index-BWNK5mH2.d.ts} +19 -2
  312. package/dist/{utils/index.d.mts → index-BiCK6gg6.d.mts} +19 -1
  313. package/dist/{utils/index.d.ts → index-BiCK6gg6.d.ts} +19 -1
  314. package/dist/{index-DoUo8IrU.d.mts → index-BxZauNN_.d.mts} +8 -8
  315. package/dist/{index-DoUo8IrU.d.ts → index-BxZauNN_.d.ts} +8 -8
  316. package/dist/{request/index.d.ts → index-C-P2yBTH.d.mts} +19 -2
  317. package/dist/{index-D0cqaQEH.d.mts → index-CLB80GCP.d.mts} +5 -5
  318. package/dist/{index-D0cqaQEH.d.ts → index-CLB80GCP.d.ts} +5 -5
  319. package/dist/{index-2G9Dxjvt.d.ts → index-CT4K2z-O.d.ts} +2 -2
  320. package/dist/{index-qcOvRVuN.d.mts → index-D6RJTGce.d.mts} +2 -2
  321. package/dist/{storage/index.d.ts → index-DA7L9JlE.d.mts} +26 -3
  322. package/dist/{imageCrop/index.d.mts → index-DXVph21C.d.mts} +40 -4
  323. package/dist/{imageCrop/index.d.ts → index-DXVph21C.d.ts} +40 -4
  324. package/dist/{index-CYuUB8aF.d.mts → index-DzyK789B.d.mts} +2 -2
  325. package/dist/{logger/index.d.mts → index-FVJZCEtm.d.mts} +21 -1
  326. package/dist/{logger/index.d.ts → index-FVJZCEtm.d.ts} +21 -1
  327. package/dist/{storage/index.d.mts → index-nD9vPCZT.d.ts} +26 -3
  328. package/dist/{components/index.d.mts → index-nOmIv2BG.d.mts} +159 -5
  329. package/dist/{components/index.d.ts → index-nOmIv2BG.d.ts} +159 -5
  330. package/dist/{path-qjVnH8qU.d.ts → path-Bzc7hj1N.d.ts} +5 -1
  331. package/dist/{path-DkaHQSyW.d.mts → path-DN_65vhO.d.mts} +5 -1
  332. package/dist/{types-3ujSNAXb.d.mts → utils-Dm3O1rAa.d.mts} +81 -1
  333. package/dist/{types-3ujSNAXb.d.ts → utils-Dm3O1rAa.d.ts} +81 -1
  334. package/package.json +292 -312
  335. package/dist/AliyunOSSProvider-4GRL2FJB.js +0 -15
  336. package/dist/AliyunOSSProvider-QNVFIZ7Q.mjs +0 -6
  337. package/dist/CollisionBalls-BpHufX3H.d.mts +0 -41
  338. package/dist/CollisionBalls-BpHufX3H.d.ts +0 -41
  339. package/dist/ConfigService-BxK06xP6.d.mts +0 -262
  340. package/dist/ConfigService-BxK06xP6.d.ts +0 -262
  341. package/dist/LocalStorageProvider-J5RHV37G.mjs +0 -6
  342. package/dist/LocalStorageProvider-PFA2DMIJ.js +0 -15
  343. package/dist/UniversalFileService-CC4d3wkc.d.ts +0 -139
  344. package/dist/UniversalFileService-CzAE_G4V.d.mts +0 -139
  345. package/dist/ai/llm/electron/index.js +0 -66
  346. package/dist/ai/llm/electron/index.mjs +0 -9
  347. package/dist/ai/llm/ui/electron/index.d.mts +0 -5
  348. package/dist/ai/llm/ui/electron/index.d.ts +0 -5
  349. package/dist/ai/llm/ui/electron/index.js +0 -21
  350. package/dist/ai/llm/ui/electron/index.mjs +0 -8
  351. package/dist/ai/llm/ui/miniapp/index.d.mts +0 -9
  352. package/dist/ai/llm/ui/miniapp/index.d.ts +0 -9
  353. package/dist/ai/llm/ui/miniapp/index.js +0 -14
  354. package/dist/ai/llm/ui/miniapp/index.mjs +0 -5
  355. package/dist/ai/llm/ui/rn/index.d.mts +0 -9
  356. package/dist/ai/llm/ui/rn/index.d.ts +0 -9
  357. package/dist/ai/llm/ui/rn/index.js +0 -14
  358. package/dist/ai/llm/ui/rn/index.mjs +0 -5
  359. package/dist/ai/llm/ui/web/index.js +0 -20
  360. package/dist/ai/llm/ui/web/index.mjs +0 -7
  361. package/dist/ai/llm/web/index.js +0 -65
  362. package/dist/ai/llm/web/index.mjs +0 -8
  363. package/dist/analytics/server/index.js.map +0 -1
  364. package/dist/analytics/server/index.mjs.map +0 -1
  365. package/dist/api/index.js +0 -21
  366. package/dist/api/index.mjs +0 -4
  367. package/dist/audioDetection/index.d.mts +0 -449
  368. package/dist/audioDetection/index.d.ts +0 -449
  369. package/dist/audioDetection/index.js +0 -1244
  370. package/dist/audioDetection/index.js.map +0 -1
  371. package/dist/audioDetection/index.mjs +0 -1227
  372. package/dist/audioDetection/index.mjs.map +0 -1
  373. package/dist/boothVaultService-Cn4WPhjg.d.mts +0 -83
  374. package/dist/boothVaultService-Cn4WPhjg.d.ts +0 -83
  375. package/dist/business/index.d.mts +0 -2
  376. package/dist/business/index.d.ts +0 -2
  377. package/dist/business/index.js +0 -581
  378. package/dist/business/index.js.map +0 -1
  379. package/dist/business/index.mjs +0 -575
  380. package/dist/business/index.mjs.map +0 -1
  381. package/dist/calendar/index.d.mts +0 -1325
  382. package/dist/calendar/index.d.ts +0 -1325
  383. package/dist/calendar/index.js +0 -5964
  384. package/dist/calendar/index.js.map +0 -1
  385. package/dist/calendar/index.mjs +0 -5878
  386. package/dist/calendar/index.mjs.map +0 -1
  387. package/dist/calendar/routes/index.d.mts +0 -191
  388. package/dist/calendar/routes/index.d.ts +0 -191
  389. package/dist/calendar/routes/index.js +0 -844
  390. package/dist/calendar/routes/index.js.map +0 -1
  391. package/dist/calendar/routes/index.mjs +0 -826
  392. package/dist/calendar/routes/index.mjs.map +0 -1
  393. package/dist/chunk-25OFOKNF.js.map +0 -1
  394. package/dist/chunk-2Y7BKFKZ.js +0 -37
  395. package/dist/chunk-3CSCIRQY.js +0 -17
  396. package/dist/chunk-3CSCIRQY.js.map +0 -1
  397. package/dist/chunk-3DXPQ4YV.mjs.map +0 -1
  398. package/dist/chunk-3NHAT7D4.mjs.map +0 -1
  399. package/dist/chunk-4FDUURSD.js +0 -22
  400. package/dist/chunk-4FDUURSD.js.map +0 -1
  401. package/dist/chunk-4OOANEJV.mjs.map +0 -1
  402. package/dist/chunk-4WBCWJSN.js.map +0 -1
  403. package/dist/chunk-5GBDDXYL.mjs +0 -23
  404. package/dist/chunk-5GBDDXYL.mjs.map +0 -1
  405. package/dist/chunk-5USIS3UM.js +0 -4
  406. package/dist/chunk-6PMXAK7F.js.map +0 -1
  407. package/dist/chunk-7B5SI4OF.mjs +0 -15
  408. package/dist/chunk-7B5SI4OF.mjs.map +0 -1
  409. package/dist/chunk-ACUFEDVQ.js.map +0 -1
  410. package/dist/chunk-AQPU2AXH.js.map +0 -1
  411. package/dist/chunk-ATUCZXJY.js.map +0 -1
  412. package/dist/chunk-BCE6RUZV.js.map +0 -1
  413. package/dist/chunk-BIHYZA67.mjs.map +0 -1
  414. package/dist/chunk-C6KV7VTZ.mjs.map +0 -1
  415. package/dist/chunk-CAYOQDBR.js.map +0 -1
  416. package/dist/chunk-CIVO4R6N.mjs.map +0 -1
  417. package/dist/chunk-CX2GHCAI.mjs.map +0 -1
  418. package/dist/chunk-DIF5VRL3.mjs.map +0 -1
  419. package/dist/chunk-EQXPL7TN.mjs.map +0 -1
  420. package/dist/chunk-FCEBAWN6.js +0 -18
  421. package/dist/chunk-FCEBAWN6.js.map +0 -1
  422. package/dist/chunk-FHIE5MTC.mjs +0 -541
  423. package/dist/chunk-FHIE5MTC.mjs.map +0 -1
  424. package/dist/chunk-FHLTPXAR.js +0 -56
  425. package/dist/chunk-FIUBFREP.mjs.map +0 -1
  426. package/dist/chunk-FXQOXLDE.js.map +0 -1
  427. package/dist/chunk-G6HXNQ2U.mjs.map +0 -1
  428. package/dist/chunk-G6NSKJMH.js.map +0 -1
  429. package/dist/chunk-G7UBMCUT.mjs.map +0 -1
  430. package/dist/chunk-GSNGCENJ.js.map +0 -1
  431. package/dist/chunk-GWNBVGDT.mjs.map +0 -1
  432. package/dist/chunk-HDMIOOZY.mjs.map +0 -1
  433. package/dist/chunk-HJ6MH7J7.js.map +0 -1
  434. package/dist/chunk-HJZHQW5R.mjs.map +0 -1
  435. package/dist/chunk-I5ZPEDNR.mjs.map +0 -1
  436. package/dist/chunk-KH6RQ4J5.js.map +0 -1
  437. package/dist/chunk-KQ643L7Z.js.map +0 -1
  438. package/dist/chunk-LFB5EIIM.mjs +0 -31
  439. package/dist/chunk-LFB5EIIM.mjs.map +0 -1
  440. package/dist/chunk-MBANGIG3.mjs.map +0 -1
  441. package/dist/chunk-NCRP2YHY.mjs.map +0 -1
  442. package/dist/chunk-NDGHXVGS.js +0 -25
  443. package/dist/chunk-NDGHXVGS.js.map +0 -1
  444. package/dist/chunk-NDPO5OMC.js +0 -563
  445. package/dist/chunk-NDPO5OMC.js.map +0 -1
  446. package/dist/chunk-PBI7FKMB.js.map +0 -1
  447. package/dist/chunk-Q5EDCKQA.js.map +0 -1
  448. package/dist/chunk-Q5VFBPMG.mjs.map +0 -1
  449. package/dist/chunk-QSKLQX6H.js.map +0 -1
  450. package/dist/chunk-QXAOXBVB.mjs.map +0 -1
  451. package/dist/chunk-R2DXTE2L.js.map +0 -1
  452. package/dist/chunk-RTD2WHQQ.mjs +0 -16
  453. package/dist/chunk-RTD2WHQQ.mjs.map +0 -1
  454. package/dist/chunk-S6YSGVWD.js.map +0 -1
  455. package/dist/chunk-SKFEJPMJ.mjs.map +0 -1
  456. package/dist/chunk-SLKOEYFH.js.map +0 -1
  457. package/dist/chunk-TC5YU6A4.mjs.map +0 -1
  458. package/dist/chunk-UCOE6SET.js.map +0 -1
  459. package/dist/chunk-UIYKZ73N.js +0 -36
  460. package/dist/chunk-UIYKZ73N.js.map +0 -1
  461. package/dist/chunk-V7EVKD5G.mjs.map +0 -1
  462. package/dist/chunk-VMTEDX5H.js.map +0 -1
  463. package/dist/chunk-VRN76M56.mjs +0 -3
  464. package/dist/chunk-VXFUXZN5.mjs +0 -20
  465. package/dist/chunk-VXFUXZN5.mjs.map +0 -1
  466. package/dist/chunk-WEEXCPSE.mjs.map +0 -1
  467. package/dist/chunk-WJ7IMUEJ.mjs.map +0 -1
  468. package/dist/chunk-WW4GE6CZ.js.map +0 -1
  469. package/dist/chunk-XJ7ZAGC5.js.map +0 -1
  470. package/dist/chunk-XUS5ACKR.mjs.map +0 -1
  471. package/dist/chunk-YOTQG4NP.mjs.map +0 -1
  472. package/dist/chunk-ZGVB35L2.mjs.map +0 -1
  473. package/dist/chunk-ZLYPALF3.js.map +0 -1
  474. package/dist/chunk-ZM2SZJTZ.js.map +0 -1
  475. package/dist/chunk-ZRAW3HXA.js.map +0 -1
  476. package/dist/chunk-ZWQJSZEY.js.map +0 -1
  477. package/dist/components/index.js +0 -2516
  478. package/dist/components/index.js.map +0 -1
  479. package/dist/components/index.mjs.map +0 -1
  480. package/dist/config/index.js +0 -21
  481. package/dist/config/index.mjs +0 -4
  482. package/dist/config/server/index.js.map +0 -1
  483. package/dist/config/server/index.mjs.map +0 -1
  484. package/dist/drizzle-schema-BNhqj2AZ.d.mts +0 -1114
  485. package/dist/drizzle-schema-BNhqj2AZ.d.ts +0 -1114
  486. package/dist/festivalCard/index.d.mts +0 -76
  487. package/dist/festivalCard/index.d.ts +0 -76
  488. package/dist/festivalCard/index.js +0 -1492
  489. package/dist/festivalCard/index.js.map +0 -1
  490. package/dist/festivalCard/index.mjs +0 -1475
  491. package/dist/festivalCard/index.mjs.map +0 -1
  492. package/dist/festivalCard/routes/index.d.mts +0 -42
  493. package/dist/festivalCard/routes/index.d.ts +0 -42
  494. package/dist/festivalCard/routes/index.js +0 -361
  495. package/dist/festivalCard/routes/index.js.map +0 -1
  496. package/dist/festivalCard/routes/index.mjs +0 -356
  497. package/dist/festivalCard/routes/index.mjs.map +0 -1
  498. package/dist/festivalCard/server/index.d.mts +0 -120
  499. package/dist/festivalCard/server/index.d.ts +0 -120
  500. package/dist/festivalCard/server/index.js +0 -272
  501. package/dist/festivalCard/server/index.js.map +0 -1
  502. package/dist/festivalCard/server/index.mjs +0 -265
  503. package/dist/festivalCard/server/index.mjs.map +0 -1
  504. package/dist/festivalCardService-B3GsnNpV.d.ts +0 -13
  505. package/dist/festivalCardService-CWhrLNE9.d.mts +0 -13
  506. package/dist/imageCrop/index.js.map +0 -1
  507. package/dist/imageCrop/index.mjs.map +0 -1
  508. package/dist/index-Bjem5rWn.d.mts +0 -17
  509. package/dist/index-C5U-2hJq.d.ts +0 -23
  510. package/dist/index-CifSBBP2.d.ts +0 -17
  511. package/dist/index-D0K4ehme.d.mts +0 -20
  512. package/dist/index-DLnfKN-a.d.mts +0 -23
  513. package/dist/index-DSel44Ke.d.mts +0 -93
  514. package/dist/index-DSel44Ke.d.ts +0 -93
  515. package/dist/index-DZ5iJtNO.d.mts +0 -102
  516. package/dist/index-DZ5iJtNO.d.ts +0 -102
  517. package/dist/index-Da7qdkgW.d.ts +0 -20
  518. package/dist/index-DrPcMJPc.d.mts +0 -250
  519. package/dist/index-DrPcMJPc.d.ts +0 -250
  520. package/dist/index-oLUvfqT8.d.ts +0 -20
  521. package/dist/index-pe38RDgC.d.mts +0 -20
  522. package/dist/index.d.mts +0 -11611
  523. package/dist/index.d.ts +0 -11611
  524. package/dist/index.js +0 -17230
  525. package/dist/index.js.map +0 -1
  526. package/dist/index.mjs +0 -16954
  527. package/dist/index.mjs.map +0 -1
  528. package/dist/logger/index.js +0 -29
  529. package/dist/logger/index.mjs +0 -4
  530. package/dist/mikuContest/ui/web/index.d.mts +0 -2
  531. package/dist/mikuContest/ui/web/index.d.ts +0 -2
  532. package/dist/mikuContest/ui/web/index.js +0 -353
  533. package/dist/mikuContest/ui/web/index.js.map +0 -1
  534. package/dist/mikuContest/ui/web/index.mjs +0 -343
  535. package/dist/mikuContest/ui/web/index.mjs.map +0 -1
  536. package/dist/mikuFireworks3D/index.d.mts +0 -268
  537. package/dist/mikuFireworks3D/index.d.ts +0 -268
  538. package/dist/mikuFireworks3D/index.js +0 -1267
  539. package/dist/mikuFireworks3D/index.js.map +0 -1
  540. package/dist/mikuFireworks3D/index.mjs +0 -1228
  541. package/dist/mikuFireworks3D/index.mjs.map +0 -1
  542. package/dist/mikuFusionGame/index.d.mts +0 -117
  543. package/dist/mikuFusionGame/index.d.ts +0 -117
  544. package/dist/mikuFusionGame/index.js +0 -1208
  545. package/dist/mikuFusionGame/index.js.map +0 -1
  546. package/dist/mikuFusionGame/index.mjs +0 -1195
  547. package/dist/mikuFusionGame/index.mjs.map +0 -1
  548. package/dist/mmd/admin/index.d.mts +0 -487
  549. package/dist/mmd/admin/index.d.ts +0 -487
  550. package/dist/mmd/admin/index.js +0 -1058
  551. package/dist/mmd/admin/index.js.map +0 -1
  552. package/dist/mmd/admin/index.mjs +0 -1027
  553. package/dist/mmd/admin/index.mjs.map +0 -1
  554. package/dist/mmd/index.d.mts +0 -2467
  555. package/dist/mmd/index.d.ts +0 -2467
  556. package/dist/mmd/index.js +0 -10119
  557. package/dist/mmd/index.js.map +0 -1
  558. package/dist/mmd/index.mjs +0 -10028
  559. package/dist/mmd/index.mjs.map +0 -1
  560. package/dist/mmd/server/index.d.mts +0 -139
  561. package/dist/mmd/server/index.d.ts +0 -139
  562. package/dist/mmd/server/index.js +0 -424
  563. package/dist/mmd/server/index.js.map +0 -1
  564. package/dist/mmd/server/index.mjs +0 -404
  565. package/dist/mmd/server/index.mjs.map +0 -1
  566. package/dist/music/index.d.mts +0 -74
  567. package/dist/music/index.d.ts +0 -74
  568. package/dist/music/index.js +0 -830
  569. package/dist/music/index.js.map +0 -1
  570. package/dist/music/index.mjs +0 -809
  571. package/dist/music/index.mjs.map +0 -1
  572. package/dist/music/server/index.d.mts +0 -1
  573. package/dist/music/server/index.d.ts +0 -1
  574. package/dist/music/server/index.js +0 -194
  575. package/dist/music/server/index.js.map +0 -1
  576. package/dist/music/server/index.mjs +0 -182
  577. package/dist/music/server/index.mjs.map +0 -1
  578. package/dist/navigation/index.d.mts +0 -93
  579. package/dist/navigation/index.d.ts +0 -93
  580. package/dist/navigation/index.js +0 -453
  581. package/dist/navigation/index.js.map +0 -1
  582. package/dist/navigation/index.mjs +0 -443
  583. package/dist/navigation/index.mjs.map +0 -1
  584. package/dist/portfolio/index.d.mts +0 -66
  585. package/dist/portfolio/index.d.ts +0 -66
  586. package/dist/portfolio/index.js +0 -736
  587. package/dist/portfolio/index.js.map +0 -1
  588. package/dist/portfolio/index.mjs +0 -724
  589. package/dist/portfolio/index.mjs.map +0 -1
  590. package/dist/qqbot/server/index.d.mts +0 -216
  591. package/dist/qqbot/server/index.d.ts +0 -216
  592. package/dist/qqbot/server/index.js +0 -394
  593. package/dist/qqbot/server/index.js.map +0 -1
  594. package/dist/qqbot/server/index.mjs +0 -385
  595. package/dist/qqbot/server/index.mjs.map +0 -1
  596. package/dist/qqbot/ui/web/index.d.mts +0 -10
  597. package/dist/qqbot/ui/web/index.d.ts +0 -10
  598. package/dist/qqbot/ui/web/index.js +0 -105
  599. package/dist/qqbot/ui/web/index.js.map +0 -1
  600. package/dist/qqbot/ui/web/index.mjs +0 -99
  601. package/dist/qqbot/ui/web/index.mjs.map +0 -1
  602. package/dist/request/index.js +0 -22
  603. package/dist/request/index.mjs +0 -5
  604. package/dist/screenReceiver/index.d.mts +0 -86
  605. package/dist/screenReceiver/index.d.ts +0 -86
  606. package/dist/screenReceiver/index.js +0 -281
  607. package/dist/screenReceiver/index.js.map +0 -1
  608. package/dist/screenReceiver/index.mjs +0 -273
  609. package/dist/screenReceiver/index.mjs.map +0 -1
  610. package/dist/storage/index.js +0 -48
  611. package/dist/storage/index.mjs +0 -7
  612. package/dist/testYourself/admin/index.d.mts +0 -58
  613. package/dist/testYourself/admin/index.d.ts +0 -58
  614. package/dist/testYourself/admin/index.js +0 -1009
  615. package/dist/testYourself/admin/index.js.map +0 -1
  616. package/dist/testYourself/admin/index.mjs +0 -1002
  617. package/dist/testYourself/admin/index.mjs.map +0 -1
  618. package/dist/testYourself/index.d.mts +0 -53
  619. package/dist/testYourself/index.d.ts +0 -53
  620. package/dist/testYourself/index.js +0 -2551
  621. package/dist/testYourself/index.js.map +0 -1
  622. package/dist/testYourself/index.mjs +0 -2531
  623. package/dist/testYourself/index.mjs.map +0 -1
  624. package/dist/testYourself/server/index.d.mts +0 -1029
  625. package/dist/testYourself/server/index.d.ts +0 -1029
  626. package/dist/testYourself/server/index.js +0 -825
  627. package/dist/testYourself/server/index.js.map +0 -1
  628. package/dist/testYourself/server/index.mjs +0 -816
  629. package/dist/testYourself/server/index.mjs.map +0 -1
  630. package/dist/types-B6B210gX.d.mts +0 -270
  631. package/dist/types-B6B210gX.d.ts +0 -270
  632. package/dist/types-Bdnte5EN.d.mts +0 -292
  633. package/dist/types-Cs0CLvrH.d.mts +0 -70
  634. package/dist/types-Cs0CLvrH.d.ts +0 -70
  635. package/dist/types-HorDyIRv.d.mts +0 -303
  636. package/dist/types-HorDyIRv.d.ts +0 -303
  637. package/dist/types-_rFX1atk.d.ts +0 -292
  638. package/dist/universalExport/index.mjs +0 -5
  639. package/dist/universalExport/server/index.js +0 -123
  640. package/dist/universalExport/server/index.mjs +0 -6
  641. package/dist/universalFile/index.js.map +0 -1
  642. package/dist/universalFile/index.mjs.map +0 -1
  643. package/dist/universalFile/server/index.js.map +0 -1
  644. package/dist/universalFile/server/index.mjs.map +0 -1
  645. package/dist/utils/index.js +0 -46
  646. package/dist/utils/index.js.map +0 -1
  647. package/dist/utils/index.mjs +0 -5
  648. package/dist/utils/index.mjs.map +0 -1
  649. package/dist/vocaloidBooth/index.d.mts +0 -64
  650. package/dist/vocaloidBooth/index.d.ts +0 -64
  651. package/dist/vocaloidBooth/index.js +0 -376
  652. package/dist/vocaloidBooth/index.js.map +0 -1
  653. package/dist/vocaloidBooth/index.mjs +0 -362
  654. package/dist/vocaloidBooth/index.mjs.map +0 -1
  655. package/dist/vocaloidBooth/server/index.d.mts +0 -111
  656. package/dist/vocaloidBooth/server/index.d.ts +0 -111
  657. package/dist/vocaloidBooth/server/index.js +0 -247
  658. package/dist/vocaloidBooth/server/index.js.map +0 -1
  659. package/dist/vocaloidBooth/server/index.mjs +0 -237
  660. package/dist/vocaloidBooth/server/index.mjs.map +0 -1
  661. package/dist/vocaloidBooth/web/index.d.mts +0 -3
  662. package/dist/vocaloidBooth/web/index.d.ts +0 -3
  663. package/dist/vocaloidBooth/web/index.js +0 -376
  664. package/dist/vocaloidBooth/web/index.js.map +0 -1
  665. package/dist/vocaloidBooth/web/index.mjs +0 -362
  666. package/dist/vocaloidBooth/web/index.mjs.map +0 -1
  667. /package/dist/{ai → common/ai}/llm/core/index.js.map +0 -0
  668. /package/dist/{ai → common/ai}/llm/core/index.mjs.map +0 -0
  669. /package/dist/{ai → common/ai}/llm/electron/index.js.map +0 -0
  670. /package/dist/{ai → common/ai}/llm/electron/index.mjs.map +0 -0
  671. /package/dist/{ai → common/ai}/llm/index.js.map +0 -0
  672. /package/dist/{ai → common/ai}/llm/index.mjs.map +0 -0
  673. /package/dist/{ai → common/ai}/llm/miniapp/index.js.map +0 -0
  674. /package/dist/{ai → common/ai}/llm/miniapp/index.mjs.map +0 -0
  675. /package/dist/{ai → common/ai}/llm/rn/index.js.map +0 -0
  676. /package/dist/{ai → common/ai}/llm/rn/index.mjs.map +0 -0
  677. /package/dist/{ai → common/ai}/llm/ui/electron/index.js.map +0 -0
  678. /package/dist/{ai → common/ai}/llm/ui/electron/index.mjs.map +0 -0
  679. /package/dist/{ai → common/ai}/llm/ui/miniapp/index.js.map +0 -0
  680. /package/dist/{ai → common/ai}/llm/ui/miniapp/index.mjs.map +0 -0
  681. /package/dist/{ai → common/ai}/llm/ui/rn/index.js.map +0 -0
  682. /package/dist/{ai → common/ai}/llm/ui/rn/index.mjs.map +0 -0
  683. /package/dist/{ai → common/ai}/llm/ui/web/index.js.map +0 -0
  684. /package/dist/{ai → common/ai}/llm/ui/web/index.mjs.map +0 -0
  685. /package/dist/{ai → common/ai}/llm/web/index.js.map +0 -0
  686. /package/dist/{ai → common/ai}/llm/web/index.mjs.map +0 -0
  687. /package/dist/{analytics → common/analytics}/index.js.map +0 -0
  688. /package/dist/{analytics → common/analytics}/index.mjs.map +0 -0
  689. /package/dist/{analytics → common/analytics}/server/index.d.mts +0 -0
  690. /package/dist/{analytics → common/analytics}/server/index.d.ts +0 -0
  691. /package/dist/{api → common/api}/index.js.map +0 -0
  692. /package/dist/{api → common/api}/index.mjs.map +0 -0
  693. /package/dist/{config → common/components}/index.js.map +0 -0
  694. /package/dist/{config → common/components}/index.mjs.map +0 -0
  695. /package/dist/{i18n → common/config}/index.js.map +0 -0
  696. /package/dist/{i18n → common/config}/index.mjs.map +0 -0
  697. /package/dist/{config → common/config}/server/index.d.mts +0 -0
  698. /package/dist/{config → common/config}/server/index.d.ts +0 -0
  699. /package/dist/{logger → common/i18n}/index.js.map +0 -0
  700. /package/dist/{logger → common/i18n}/index.mjs.map +0 -0
  701. /package/dist/{ossFile → common/imageCrop}/index.js.map +0 -0
  702. /package/dist/{ossFile → common/imageCrop}/index.mjs.map +0 -0
  703. /package/dist/{ossFile/server → common/ossFile}/index.js.map +0 -0
  704. /package/dist/{ossFile/server → common/ossFile}/index.mjs.map +0 -0
  705. /package/dist/{request → common/ossFile/server}/index.js.map +0 -0
  706. /package/dist/{request → common/ossFile/server}/index.mjs.map +0 -0
  707. /package/dist/{storage → common/universalExport}/index.js.map +0 -0
  708. /package/dist/{storage → common/universalExport}/index.mjs.map +0 -0
  709. /package/dist/{universalExport → common/universalExport/server}/index.js.map +0 -0
  710. /package/dist/{universalExport → common/universalExport/server}/index.mjs.map +0 -0
  711. /package/dist/{universalExport → common/universalFile}/server/index.js.map +0 -0
  712. /package/dist/{universalExport → common/universalFile}/server/index.mjs.map +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/file/index.ts"],"names":["__export","STANDARD_ALIYUN_OSS_KEYS","UniversalFileClient","buildModuleUploadPath","clearConfigCache","clearOssFileConfigCache","configureOssFileFromPlatform","configureOssFileHttp","createFileClient","createOssFileFetchFromAdapter","getArtworkImageUrl","getModuleFileAccessUrl","getOssStorageModeDisplayName","getStorageModeDisplayName","parseAliyunOssConfigFromMap","refreshFileServiceConfig","refreshOssFileConfigCache","resolveUploadFolderPath","shouldUseOssFileService","shouldUseUniversalFileService","universalFileClient","uploadArtworkImage","uploadModuleFile"],"mappings":";;;;;;;;AAAA,IAAA,YAAA,GAAA;AAAAA,yBAAA,CAAA,YAAA,EAAA;AAAA,EAAA,wBAAA,EAAA,MAAAC,yCAAA;AAAA,EAAA,mBAAA,EAAA,MAAAC,oCAAA;AAAA,EAAA,qBAAA,EAAA,MAAAC,sCAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC,iCAAA;AAAA,EAAA,uBAAA,EAAA,MAAAC,wCAAA;AAAA,EAAA,4BAAA,EAAA,MAAAC,6CAAA;AAAA,EAAA,oBAAA,EAAA,MAAAC,qCAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC,iCAAA;AAAA,EAAA,6BAAA,EAAA,MAAAC,8CAAA;AAAA,EAAA,kBAAA,EAAA,MAAAC,mCAAA;AAAA,EAAA,sBAAA,EAAA,MAAAC,uCAAA;AAAA,EAAA,4BAAA,EAAA,MAAAC,6CAAA;AAAA,EAAA,yBAAA,EAAA,MAAAC,0CAAA;AAAA,EAAA,2BAAA,EAAA,MAAAC,4CAAA;AAAA,EAAA,wBAAA,EAAA,MAAAC,yCAAA;AAAA,EAAA,yBAAA,EAAA,MAAAC,0CAAA;AAAA,EAAA,uBAAA,EAAA,MAAAC,wCAAA;AAAA,EAAA,uBAAA,EAAA,MAAAC,wCAAA;AAAA,EAAA,6BAAA,EAAA,MAAAC,8CAAA;AAAA,EAAA,mBAAA,EAAA,MAAAC,oCAAA;AAAA,EAAA,kBAAA,EAAA,MAAAC,mCAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC;AAAA,CAAA,CAAA","file":"chunk-2Y7BKFKZ.js","sourcesContent":["/**\n * @package sa2kit/common/file\n *\n * 2.0 文件能力 SSOT:优先使用 ossFile;universalFile 客户端保留兼容导出。\n */\nexport * from '../../ossFile';\nexport {\n UniversalFileClient,\n universalFileClient,\n createFileClient,\n} from '../../universalFile/client';\nexport type * from '../../universalFile/types';\n"]}
1
+ {"version":3,"sources":["../src/common/file/index.ts"],"names":["__export","STANDARD_ALIYUN_OSS_KEYS","UniversalFileClient","buildModuleUploadPath","clearConfigCache","clearOssFileConfigCache","configureOssFileFromPlatform","configureOssFileHttp","createFileClient","createOssFileFetchFromAdapter","getArtworkImageUrl","getModuleFileAccessUrl","getOssStorageModeDisplayName","getStorageModeDisplayName","parseAliyunOssConfigFromMap","refreshFileServiceConfig","refreshOssFileConfigCache","resolveUploadFolderPath","shouldUseOssFileService","shouldUseUniversalFileService","universalFileClient","uploadArtworkImage","uploadModuleFile"],"mappings":";;;;;;;;AAAA,IAAA,YAAA,GAAA;AAAAA,yBAAA,CAAA,YAAA,EAAA;AAAA,EAAA,wBAAA,EAAA,MAAAC,yCAAA;AAAA,EAAA,mBAAA,EAAA,MAAAC,oCAAA;AAAA,EAAA,qBAAA,EAAA,MAAAC,sCAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC,iCAAA;AAAA,EAAA,uBAAA,EAAA,MAAAC,wCAAA;AAAA,EAAA,4BAAA,EAAA,MAAAC,6CAAA;AAAA,EAAA,oBAAA,EAAA,MAAAC,qCAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC,iCAAA;AAAA,EAAA,6BAAA,EAAA,MAAAC,8CAAA;AAAA,EAAA,kBAAA,EAAA,MAAAC,mCAAA;AAAA,EAAA,sBAAA,EAAA,MAAAC,uCAAA;AAAA,EAAA,4BAAA,EAAA,MAAAC,6CAAA;AAAA,EAAA,yBAAA,EAAA,MAAAC,0CAAA;AAAA,EAAA,2BAAA,EAAA,MAAAC,4CAAA;AAAA,EAAA,wBAAA,EAAA,MAAAC,yCAAA;AAAA,EAAA,yBAAA,EAAA,MAAAC,0CAAA;AAAA,EAAA,uBAAA,EAAA,MAAAC,wCAAA;AAAA,EAAA,uBAAA,EAAA,MAAAC,wCAAA;AAAA,EAAA,6BAAA,EAAA,MAAAC,8CAAA;AAAA,EAAA,mBAAA,EAAA,MAAAC,oCAAA;AAAA,EAAA,kBAAA,EAAA,MAAAC,mCAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC;AAAA,CAAA,CAAA","file":"chunk-B3GYF6TY.js","sourcesContent":["/**\n * @package sa2kit/common/file\n *\n * 2.0 文件能力 SSOT:优先使用 ossFile;universalFile 客户端保留兼容导出。\n */\nexport * from '../ossFile';\nexport {\n UniversalFileClient,\n universalFileClient,\n createFileClient,\n} from '../universalFile/client';\nexport type * from '../universalFile/types';\n"]}
@@ -1,5 +1,5 @@
1
- import { useSession } from './chunk-6YLCRWKM.mjs';
2
1
  import { createSa2kitAuthClient } from './chunk-TNJ6LYX7.mjs';
2
+ import { useSession } from './chunk-6YLCRWKM.mjs';
3
3
  import { __export } from './chunk-MAI35PU6.mjs';
4
4
 
5
5
  // src/common/auth/index.ts
@@ -10,5 +10,5 @@ __export(auth_exports, {
10
10
  });
11
11
 
12
12
  export { auth_exports };
13
- //# sourceMappingURL=chunk-5FUAQLGC.mjs.map
14
- //# sourceMappingURL=chunk-5FUAQLGC.mjs.map
13
+ //# sourceMappingURL=chunk-BDBJFOXM.mjs.map
14
+ //# sourceMappingURL=chunk-BDBJFOXM.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/auth/index.ts"],"names":[],"mappings":";;;;;AAAA,IAAA,YAAA,GAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,UAAA,EAAA,MAAA;AAAA,CAAA,CAAA","file":"chunk-5FUAQLGC.mjs","sourcesContent":["/**\n * @package sa2kit/common/auth\n *\n * Browser / client 安全入口(Better Auth 3.0)\n */\nexport {\n createSa2kitAuthClient,\n type Sa2kitAuthClient,\n type Sa2kitAuthClientOptions,\n} from './client';\nexport { useSession, type UseSessionReturn } from './hooks/useSession';\n\nexport * from './types';\n"]}
1
+ {"version":3,"sources":["../src/common/auth/index.ts"],"names":[],"mappings":";;;;;AAAA,IAAA,YAAA,GAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,UAAA,EAAA,MAAA;AAAA,CAAA,CAAA","file":"chunk-BDBJFOXM.mjs","sourcesContent":["/**\n * @package sa2kit/common/auth\n *\n * Browser / client 安全入口(Better Auth 3.0)\n */\nexport {\n createSa2kitAuthClient,\n type Sa2kitAuthClient,\n type Sa2kitAuthClientOptions,\n} from './client';\nexport { useSession, type UseSessionReturn } from './hooks/useSession';\n\nexport * from './types';\n"]}
@@ -1,4 +1,4 @@
1
- // src/universalFile/server/types.ts
1
+ // src/common/universalFile/server/types.ts
2
2
  var FileServiceError = class extends Error {
3
3
  constructor(message, code, details) {
4
4
  super(message);
@@ -21,5 +21,5 @@ var CDNProviderError = class extends FileServiceError {
21
21
  };
22
22
 
23
23
  export { CDNProviderError, StorageProviderError };
24
- //# sourceMappingURL=chunk-ZGVB35L2.mjs.map
25
- //# sourceMappingURL=chunk-ZGVB35L2.mjs.map
24
+ //# sourceMappingURL=chunk-BTW3SWQN.mjs.map
25
+ //# sourceMappingURL=chunk-BTW3SWQN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/universalFile/server/types.ts"],"names":[],"mappings":";AA8cO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,WAAA,CACE,OAAA,EACgB,IAAA,EACA,OAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF,CAAA;AAmBO,IAAM,oBAAA,GAAN,cAAmC,gBAAA,CAAiB;AAAA,EACzD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,0BAA0B,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAGO,IAAM,gBAAA,GAAN,cAA+B,gBAAA,CAAiB;AAAA,EACrD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,sBAAsB,OAAO,CAAA;AAC5C,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF","file":"chunk-BTW3SWQN.mjs","sourcesContent":["/**\n * UniversalFile Server 端类型定义\n */\n\nimport type {\n StorageType as _StorageType,\n CDNType as _CDNType,\n ProcessorType as _ProcessorType,\n FileMetadata,\n UploadStatus,\n AccessPermission,\n UploadFileInfo as _UploadFileInfo,\n ProcessingOptions as _ProcessingOptions,\n} from '../types';\n\n// Re-export client types for server use\nexport type StorageType = _StorageType;\nexport type CDNType = _CDNType;\nexport type ProcessorType = _ProcessorType;\nexport type UploadFileInfo = _UploadFileInfo;\nexport type ProcessingOptions = _ProcessingOptions;\n\n// ============= Provider 接口 =============\n\n/** 存储提供者接口 */\nexport interface IStorageProvider {\n /** 提供者类型 */\n readonly type: StorageType;\n\n /** 初始化 */\n initialize(config: StorageConfig): Promise<void>;\n\n /** 上传文件 */\n upload(fileInfo: UploadFileInfo, path: string): Promise<StorageResult>;\n\n /** 下载文件 */\n download(path: string): Promise<Buffer>;\n\n /** 删除文件 */\n delete(path: string): Promise<StorageResult>;\n\n /** 获取文件信息 */\n getFileInfo(path: string): Promise<StorageResult>;\n\n /** 生成访问URL */\n getAccessUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 生成预签名上传URL */\n getUploadUrl(path: string, expiresIn?: number): Promise<string>;\n\n /** 检查文件是否存在 */\n exists(path: string): Promise<boolean>;\n\n /** 列出文件 */\n list(prefix: string, maxKeys?: number): Promise<string[]>;\n}\n\n/** CDN 提供者接口 */\nexport interface ICDNProvider {\n /** 提供者类型 */\n readonly type: CDNType;\n\n /** 初始化 */\n initialize(config: CDNConfig): Promise<void>;\n\n /** 生成CDN URL */\n generateUrl(originalUrl: string): Promise<string>;\n\n /** 刷新缓存 */\n refreshCache(urls: string[]): Promise<CDNResult>;\n\n /** 预热缓存 */\n preheatCache(urls: string[]): Promise<CDNResult>;\n\n /** 获取访问统计 */\n getAccessStats(startTime: Date, endTime: Date): Promise<CDNResult>;\n}\n\n/** 文件处理器接口 */\nexport interface IFileProcessor {\n /** 处理器类型 */\n readonly type: ProcessorType;\n\n /** 初始化 */\n initialize(): Promise<void>;\n\n /** 处理文件 */\n process(\n inputPath: string,\n outputPath: string,\n options: ProcessingOptions\n ): Promise<ProcessingResult>;\n\n /** 检查文件是否支持处理 */\n supports(mimeType: string): boolean;\n\n /** 获取文件信息 */\n getFileInfo(filePath: string): Promise<Record<string, any>>;\n}\n\n// ============= 配置接口 =============\n\n/** 存储配置基础接口 */\nexport interface StorageConfig {\n /** 存储类型 */\n type: StorageType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 本地存储配置 */\nexport interface LocalStorageConfig extends StorageConfig {\n type: 'local';\n /** 存储根目录 */\n rootPath: string;\n /** 基础URL */\n baseUrl: string;\n}\n\n/** 阿里云 OSS 配置 */\nexport interface AliyunOSSConfig extends StorageConfig {\n type: 'aliyun-oss';\n /** 地域 */\n region: string;\n /** 存储桶名称 */\n bucket: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 自定义域名 */\n customDomain?: string;\n /** 是否使用HTTPS */\n secure?: boolean;\n /** 是否使用内网访问 */\n internal?: boolean;\n}\n\n/** CDN配置基础接口 */\nexport interface CDNConfig {\n /** CDN类型 */\n type: CDNType;\n /** 是否启用 */\n enabled: boolean;\n}\n\n/** 阿里云 CDN 配置 */\nexport interface AliyunCDNConfig extends CDNConfig {\n type: 'aliyun-cdn';\n /** CDN域名 */\n domain: string;\n /** 访问密钥ID */\n accessKeyId: string;\n /** 访问密钥密码 */\n accessKeySecret: string;\n /** 地域 */\n region?: string;\n}\n\n/** 缓存配置 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 最大缓存大小 */\n maxSize?: number;\n /** 缓存 TTL(秒) */\n ttl?: number;\n /** 是否使用 Redis */\n useRedis?: boolean;\n /** Redis 配置 */\n redisConfig?: {\n host: string;\n port: number;\n password?: string;\n db?: number;\n };\n}\n\n/** 文件服务配置 */\n/** 缓存配置扩展 */\nexport interface CacheConfig {\n /** 是否启用缓存 */\n enabled: boolean;\n /** 元数据缓存TTL(秒) */\n metadataTTL?: number;\n /** URL缓存TTL(秒) */\n urlTTL?: number;\n /** 最大缓存条目数 */\n maxSize?: number;\n}\n\nexport interface UniversalFileServiceConfig {\n /** 存储配置 */\n storage: StorageConfig;\n /** CDN 配置(可选) */\n cdn?: CDNConfig;\n /** 缓存配置(可选) */\n cache?: CacheConfig;\n /** 数据库持久化配置(可选) */\n persistence?: FileServicePersistenceConfig;\n /** 启用的处理器 */\n processors?: ProcessorType[];\n /** 数据库连接(可选) @deprecated 使用 persistence.repository 代替 */\n db?: any;\n /** 最大文件大小(字节) */\n maxFileSize?: number;\n /** 允许的文件类型 */\n allowedMimeTypes?: string[];\n /** 是否启用监控 */\n enableMonitoring?: boolean;\n\n // 运行时字段(由服务类内部管理)\n /** 存储提供者映射(内部使用) */\n storageProviders?: Map<StorageType, IStorageProvider>;\n /** 默认存储类型 */\n defaultStorage?: StorageType;\n /** 默认CDN类型 */\n defaultCDN?: CDNType;\n}\n\n// ============= 结果类型 =============\n\n/** 存储结果 */\n/** 存储操作结果 */\nexport interface StorageResult {\n /** 是否成功 */\n success: boolean;\n /** 存储路径 */\n path?: string;\n /** 访问URL */\n url?: string;\n /** 文件大小 */\n size?: number;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 存储元数据 */\nexport interface StorageMetadata {\n /** 文件大小 */\n size: number;\n /** MIME 类型 */\n mimeType: string;\n /** 最后修改时间 */\n lastModified: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** CDN 结果 */\n/** CDN操作结果 */\nexport interface CDNResult {\n /** 是否成功 */\n success: boolean;\n /** CDN URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** CDN 统计信息 */\nexport interface CDNStats {\n /** 带宽(字节/秒) */\n bandwidth: number;\n /** 请求数 */\n requests: number;\n /** 流量(字节) */\n traffic: number;\n /** 统计时间范围 */\n timeRange: {\n start: Date;\n end: Date;\n };\n}\n\n/** 处理结果 */\nexport interface ProcessingResult {\n /** 是否成功 */\n success: boolean;\n /** 处理后的文件路径 */\n processedPath?: string;\n /** 处理后的文件大小 */\n processedSize?: number;\n /** 缩略图路径 */\n thumbnailPath?: string;\n /** 错误信息 */\n error?: string;\n /** 处理耗时(毫秒) */\n processingTime?: number;\n /** 额外数据 */\n data?: Record<string, any>;\n}\n\n/** 处理器信息 */\nexport interface ProcessorInfo {\n /** 处理器名称 */\n name: string;\n /** 处理器版本 */\n version: string;\n /** 支持的格式 */\n supportedFormats: string[];\n /** 支持的操作 */\n supportedOperations: string[];\n}\n\n// ============= 数据库相关类型 =============\n\n/** 文件数据库记录 */\nexport interface FileRecord extends FileMetadata {\n /** 创建时间 */\n createdAt: Date | string;\n /** 更新时间 */\n updatedAt: Date | string;\n}\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块 ID */\n moduleId?: string;\n /** 业务 ID */\n businessId?: string;\n /** 上传者 ID */\n uploaderId?: string;\n /** 文件类型 */\n mimeType?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 状态 */\n status?: UploadStatus;\n /** 分页 */\n page?: number;\n pageSize?: number;\n /** 排序 */\n orderBy?: string;\n orderDirection?: 'asc' | 'desc';\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\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 | 'delete:error'\n | 'process:start'\n | 'process:complete'\n | 'process:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件 ID */\n fileId: string;\n /** 事件数据 */\n data?: any;\n /** 时间戳 */\n timestamp: Date;\n}\n\n/** 事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 数据库持久化接口 =============\n\n/**\n * 文件元数据数据库持久化接口\n *\n * 实现此接口以提供自定义的数据库持久化支持\n *\n * @example\n * ```typescript\n * // Drizzle ORM 实现\n * class DrizzleFileRepository implements IFileMetadataRepository {\n * async save(metadata: FileMetadata): Promise<void> {\n * await db.insert(fileMetadata).values(metadata);\n * }\n * // ... 其他方法\n * }\n * ```\n */\nexport interface IFileMetadataRepository {\n /**\n * 保存文件元数据到数据库\n */\n save(metadata: FileMetadata): Promise<void>;\n\n /**\n * 从数据库获取文件元数据\n */\n get(fileId: string): Promise<FileMetadata | null>;\n\n /**\n * 查询文件列表\n */\n query(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>>;\n\n /**\n * 从数据库删除文件元数据\n */\n delete(fileId: string): Promise<void>;\n\n /**\n * 批量删除文件元数据\n */\n batchDelete(fileIds: string[]): Promise<void>;\n}\n\n/**\n * 数据库持久化配置\n */\nexport interface FileServicePersistenceConfig {\n /**\n * 是否启用持久化\n */\n enabled: boolean;\n\n /**\n * 持久化仓储实现\n */\n repository: IFileMetadataRepository;\n\n /**\n * 是否自动持久化(默认 true)\n * 如果为 true,文件上传完成后自动保存到数据库\n */\n autoPersist?: boolean;\n\n /**\n * 是否优先使用缓存(默认 false)\n * 如果为 true,查询时优先从缓存获取\n */\n cacheFirst?: boolean;\n}\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"]}
@@ -2,7 +2,7 @@ import { __export, __require } from './chunk-MAI35PU6.mjs';
2
2
  import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';
3
3
  import { clsx } from 'clsx';
4
4
 
5
- // src/i18n/index.ts
5
+ // src/common/i18n/index.ts
6
6
  var i18n_exports = {};
7
7
  __export(i18n_exports, {
8
8
  ElectronI18nAdapter: () => ElectronI18nAdapter,
@@ -23,7 +23,7 @@ __export(i18n_exports, {
23
23
  zhCN: () => zh_CN_default
24
24
  });
25
25
 
26
- // src/i18n/i18n.ts
26
+ // src/common/i18n/i18n.ts
27
27
  function defaultInterpolate(template, data) {
28
28
  return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
29
29
  return data[key]?.toString() ?? match;
@@ -161,7 +161,7 @@ function useLocale() {
161
161
  };
162
162
  }
163
163
 
164
- // src/i18n/locales/zh-CN.ts
164
+ // src/common/i18n/locales/zh-CN.ts
165
165
  var zh_CN_default = {
166
166
  // ==================== 应用信息 ====================
167
167
  app: {
@@ -281,7 +281,7 @@ var zh_CN_default = {
281
281
  }
282
282
  };
283
283
 
284
- // src/i18n/locales/en-US.ts
284
+ // src/common/i18n/locales/en-US.ts
285
285
  var en_US_default = {
286
286
  // ==================== App Information ====================
287
287
  app: {
@@ -401,7 +401,7 @@ var en_US_default = {
401
401
  }
402
402
  };
403
403
 
404
- // src/i18n/adapters/web.ts
404
+ // src/common/i18n/adapters/web.ts
405
405
  var WebI18nAdapter = class {
406
406
  constructor() {
407
407
  this.storageKey = "app_locale";
@@ -436,7 +436,7 @@ var WebI18nAdapter = class {
436
436
  }
437
437
  };
438
438
 
439
- // src/i18n/adapters/mobile.ts
439
+ // src/common/i18n/adapters/mobile.ts
440
440
  var ReactNativeI18nAdapter = class {
441
441
  constructor() {
442
442
  this.storageKey = "@app_locale";
@@ -489,7 +489,7 @@ var ReactNativeI18nAdapter = class {
489
489
  }
490
490
  };
491
491
 
492
- // src/i18n/adapters/miniapp.ts
492
+ // src/common/i18n/adapters/miniapp.ts
493
493
  var TaroI18nAdapter = class {
494
494
  constructor() {
495
495
  this.storageKey = "app_locale";
@@ -540,7 +540,7 @@ var TaroI18nAdapter = class {
540
540
  }
541
541
  };
542
542
 
543
- // src/i18n/adapters/desktop.ts
543
+ // src/common/i18n/adapters/desktop.ts
544
544
  var ElectronI18nAdapter = class {
545
545
  constructor() {
546
546
  this.storageKey = "app_locale";
@@ -730,5 +730,5 @@ function LanguageSwitcher({
730
730
  }
731
731
 
732
732
  export { ElectronI18nAdapter, LanguageSwitcher, LanguageSwitcherButtons, LanguageSwitcherDropdown, LanguageSwitcherIcon, ReactNativeI18nAdapter, TaroI18nAdapter, WebI18nAdapter, createI18n, en_US_default, getI18n, i18n_exports, initI18n, t, useLocale, useTranslation, zh_CN_default };
733
- //# sourceMappingURL=chunk-I5ZPEDNR.mjs.map
734
- //# sourceMappingURL=chunk-I5ZPEDNR.mjs.map
733
+ //# sourceMappingURL=chunk-CHYSSZ4E.mjs.map
734
+ //# sourceMappingURL=chunk-CHYSSZ4E.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/i18n/index.ts","../src/common/i18n/i18n.ts","../src/common/i18n/hooks.ts","../src/common/i18n/locales/zh-CN.ts","../src/common/i18n/locales/en-US.ts","../src/common/i18n/adapters/web.ts","../src/common/i18n/adapters/mobile.ts","../src/common/i18n/adapters/miniapp.ts","../src/common/i18n/adapters/desktop.ts","../src/common/i18n/components/LanguageSwitcher.tsx"],"names":["t","useState","useEffect"],"mappings":"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","file":"chunk-CHYSSZ4E.mjs","sourcesContent":["/**\n * i18n 国际化模块\n *\n * 提供完整的国际化解决方案,支持多语言切换、动态加载、React Hooks 和 UI 组件\n */\n\n// 核心功能\nexport { createI18n, initI18n, getI18n, t } from './i18n';\n\n// 类型定义\nexport type {\n Locale,\n TranslationKey,\n TranslationValue,\n Translations,\n LocaleResources,\n TranslateOptions,\n I18nConfig,\n I18nInstance,\n I18nAdapter,\n} from './types';\n\n// React Hooks\nexport { useTranslation, useLocale } from './hooks';\n\n// 示例翻译资源\nexport { default as zhCN } from './locales/zh-CN';\nexport { default as enUS } from './locales/en-US';\n\n// 平台适配器\nexport * from './adapters';\n\n// UI 组件(Tailwind CSS)\nexport * from './components';\n","/**\n * 轻量级 i18n 核心实现\n * 支持:翻译、插值、复数、嵌套键、类型安全\n */\n\nimport type {\n Locale,\n Translations,\n LocaleResources,\n TranslateOptions,\n I18nConfig,\n I18nInstance,\n} from './types';\n\n/**\n * 默认插值函数\n * 支持 {{key}} 格式的变量替换\n */\nfunction defaultInterpolate(template: string, data: Record<string, any>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n return data[key]?.toString() ?? match;\n });\n}\n\n/**\n * 从嵌套对象中获取值\n * 支持 \"user.name\" 这样的路径\n */\nfunction getNestedValue(obj: any, path: string): any {\n const keys = path.split('.');\n let result = obj;\n\n for (const key of keys) {\n if (result && typeof result === 'object' && key in result) {\n result = result[key];\n } else {\n return undefined;\n }\n }\n\n return result;\n}\n\n/**\n * 创建 i18n 实例\n */\nexport function createI18n(config: I18nConfig): I18nInstance {\n let currentLocale: Locale = config.locale;\n const fallbackLocale: Locale = config.fallbackLocale || 'zh-CN';\n const resources: LocaleResources = config.resources || {};\n const interpolate = config.interpolate || defaultInterpolate;\n\n /**\n * 翻译函数\n * @param key 翻译键,支持嵌套 \"common.hello\"\n * @param options 选项\n */\n function t(key: string, options: TranslateOptions = {}): string {\n const { defaultValue, count, context = {} } = options;\n\n // 获取当前语言的翻译\n let translation = getNestedValue(resources[currentLocale], key);\n\n // 如果没有找到,尝试使用 fallback 语言\n if (translation === undefined && currentLocale !== fallbackLocale) {\n translation = getNestedValue(resources[fallbackLocale], key);\n }\n\n // 如果还是没有找到,使用默认值或键名\n if (translation === undefined) {\n return defaultValue || key;\n }\n\n // 如果不是字符串,返回 JSON 字符串\n if (typeof translation !== 'string') {\n return JSON.stringify(translation);\n }\n\n // 处理复数\n if (count !== undefined) {\n const pluralKey = count === 1 ? (key) + '_one' : (key) + '_other';\n const pluralTranslation = getNestedValue(resources[currentLocale], pluralKey);\n if (pluralTranslation && typeof pluralTranslation === 'string') {\n translation = pluralTranslation;\n }\n }\n\n // 插值\n const data = { ...context, count };\n return interpolate(translation, data);\n }\n\n /**\n * 设置当前语言\n */\n function setLocale(locale: Locale): void {\n currentLocale = locale;\n }\n\n /**\n * 添加翻译资源\n */\n function addResources(locale: Locale, newResources: Translations): void {\n if (!resources[locale]) {\n resources[locale] = {};\n }\n resources[locale] = {\n ...resources[locale],\n ...newResources,\n };\n }\n\n /**\n * 获取当前语言\n */\n function getLocale(): Locale {\n return currentLocale;\n }\n\n return {\n locale: currentLocale,\n t,\n setLocale,\n addResources,\n getLocale,\n };\n}\n\n/**\n * 全局 i18n 实例(可选)\n */\nlet globalI18n: I18nInstance | null = null;\n\n/**\n * 初始化全局 i18n\n */\nexport function initI18n(config: I18nConfig): I18nInstance {\n globalI18n = createI18n(config);\n return globalI18n;\n}\n\n/**\n * 获取全局 i18n 实例\n */\nexport function getI18n(): I18nInstance {\n if (!globalI18n) {\n throw new Error('i18n not initialized. Call initI18n() first.');\n }\n return globalI18n;\n}\n\n/**\n * 快捷翻译函数\n */\nexport function t(key: string, options?: TranslateOptions): string {\n return getI18n().t(key, options);\n}\n","/**\n * React hooks for i18n\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { getI18n } from './i18n';\nimport type { Locale, TranslateOptions } from './types';\n\n/**\n * useTranslation Hook\n * React 组件中使用翻译\n * 支持 SSR 环境,在 i18n 未初始化时安全降级\n */\nexport function useTranslation() {\n const [locale, setLocaleState] = useState<Locale>('zh-CN');\n const [i18nInstance, setI18nInstance] = useState<any>(null);\n\n useEffect(() => {\n // 仅在客户端尝试获取 i18n 实例\n if (typeof window !== 'undefined') {\n try {\n const i18n = getI18n();\n setI18nInstance(i18n);\n setLocaleState(i18n.getLocale());\n } catch {\n // i18n 未初始化,保持 null\n console.warn('i18n not initialized. Some translations may not work.');\n }\n }\n }, []);\n\n // 翻译函数\n const t = useCallback(\n (key: string, options?: TranslateOptions): string => {\n if (i18nInstance) {\n return i18nInstance.t(key, options);\n }\n // 未初始化时返回 key 作为后备\n return key;\n },\n [i18nInstance]\n );\n\n // 切换语言\n const setLocale = useCallback(\n (newLocale: Locale) => {\n if (i18nInstance) {\n i18nInstance.setLocale(newLocale);\n setLocaleState(newLocale);\n } else {\n console.warn('i18n not initialized. Cannot change locale.');\n }\n },\n [i18nInstance]\n );\n\n return useMemo(\n () => ({\n t,\n locale,\n setLocale,\n }),\n [t, locale, setLocale]\n );\n}\n\n/**\n * useLocale Hook\n * 只获取和设置语言,不包含翻译函数\n */\nexport function useLocale() {\n const i18n = getI18n();\n const [locale, setLocaleState] = useState<Locale>(i18n.getLocale());\n\n const setLocale = useCallback((newLocale: Locale) => {\n i18n.setLocale(newLocale);\n setLocaleState(newLocale);\n }, []);\n\n return {\n locale,\n setLocale,\n };\n}\n","/**\n * 简体中文翻译\n */\n\nexport default {\n // ==================== 应用信息 ====================\n app: {\n name: 'LyricNote',\n fullName: 'LyricNote - 歌词笔记',\n icon: '🎵',\n description: '一个强大的歌词和笔记管理应用',\n author: 'LyricNote Team',\n copyright: '© ' + (new Date().getFullYear()) + ' LyricNote',\n version: '1.0.0',\n },\n\n // ==================== 应用标题 ====================\n titles: {\n main: '🎵 LyricNote',\n admin: 'LyricNote 管理后台',\n withVersion: 'LyricNote v1.0.0',\n welcome: '欢迎使用 LyricNote',\n about: '关于 LyricNote',\n },\n\n // ==================== 通用文案 ====================\n common: {\n hello: '你好',\n welcome: '欢迎',\n confirm: '确认',\n cancel: '取消',\n save: '保存',\n delete: '删除',\n edit: '编辑',\n back: '返回',\n next: '下一步',\n submit: '提交',\n finish: '完成',\n loading: '加载中...',\n success: '操作成功',\n error: '操作失败',\n retry: '重试',\n empty: '暂无数据',\n },\n\n // ==================== 导航菜单 ====================\n nav: {\n home: '首页',\n lyrics: '歌词',\n create: '创作',\n collection: '收藏',\n profile: '我的',\n settings: '设置',\n history: '历史',\n logout: '退出登录',\n },\n\n // ==================== 用户相关 ====================\n user: {\n login: '登录',\n register: '注册',\n username: '用户名',\n password: '密码',\n email: '邮箱',\n phone: '手机号',\n nickname: '昵称',\n },\n\n // ==================== 页面标题和描述 ====================\n pages: {\n home: {\n title: '首页',\n description: '一个强大的歌词和笔记管理应用',\n },\n profile: {\n title: '个人中心',\n description: '管理您的个人信息和偏好设置',\n },\n admin: {\n title: 'LyricNote 管理后台',\n description: '系统管理和数据统计',\n },\n login: {\n title: '登录',\n description: '登录到 LyricNote',\n },\n },\n\n // ==================== 表单验证 ====================\n validation: {\n required: '{{field}}不能为空',\n invalid_email: '邮箱格式不正确',\n password_too_short: '密码至少需要{{count}}个字符',\n password_weak: '密码强度不够',\n passwords_not_match: '两次密码不一致',\n },\n\n // ==================== 状态提示 ====================\n status: {\n loading: '加载中...',\n success: '操作成功',\n error: '操作失败',\n empty: '暂无数据',\n network_error: '网络错误,请稍后重试',\n },\n\n // ==================== 错误消息 ====================\n errors: {\n network: '网络错误,请稍后重试',\n server: '服务器错误',\n unauthorized: '未授权,请先登录',\n not_found: '未找到相关内容',\n unknown: '未知错误',\n },\n\n // ==================== 成功消息 ====================\n success: {\n saved: '保存成功',\n deleted: '删除成功',\n updated: '更新成功',\n created: '创建成功',\n },\n\n // ==================== 语言设置 ====================\n language: {\n label: '语言',\n zh_cn: '简体中文',\n zh_tw: '繁體中文',\n en_us: 'English',\n ja_jp: '日本語',\n },\n} as const;\n","/**\n * English translations\n */\n\nexport default {\n // ==================== App Information ====================\n app: {\n name: 'LyricNote',\n fullName: 'LyricNote - Lyrics & Notes',\n icon: '🎵',\n description: 'A powerful lyrics and notes management app',\n author: 'LyricNote Team',\n copyright: '© ' + (new Date().getFullYear()) + ' LyricNote',\n version: '1.0.0',\n },\n\n // ==================== App Titles ====================\n titles: {\n main: '🎵 LyricNote',\n admin: 'LyricNote Admin',\n withVersion: 'LyricNote v1.0.0',\n welcome: 'Welcome to LyricNote',\n about: 'About LyricNote',\n },\n\n // ==================== Common ====================\n common: {\n hello: 'Hello',\n welcome: 'Welcome',\n confirm: 'Confirm',\n cancel: 'Cancel',\n save: 'Save',\n delete: 'Delete',\n edit: 'Edit',\n back: 'Back',\n next: 'Next',\n submit: 'Submit',\n finish: 'Finish',\n loading: 'Loading...',\n success: 'Success',\n error: 'Error',\n retry: 'Retry',\n empty: 'No data',\n },\n\n // ==================== Navigation ====================\n nav: {\n home: 'Home',\n lyrics: 'Lyrics',\n create: 'Create',\n collection: 'Collection',\n profile: 'Profile',\n settings: 'Settings',\n history: 'History',\n logout: 'Logout',\n },\n\n // ==================== User ====================\n user: {\n login: 'Login',\n register: 'Register',\n username: 'Username',\n password: 'Password',\n email: 'Email',\n phone: 'Phone',\n nickname: 'Nickname',\n },\n\n // ==================== Pages ====================\n pages: {\n home: {\n title: 'Home',\n description: 'A powerful lyrics and notes management app',\n },\n profile: {\n title: 'Profile',\n description: 'Manage your personal information and preferences',\n },\n admin: {\n title: 'LyricNote Admin',\n description: 'System management and data statistics',\n },\n login: {\n title: 'Login',\n description: 'Login to LyricNote',\n },\n },\n\n // ==================== Form Validation ====================\n validation: {\n required: '{{field}} is required',\n invalid_email: 'Invalid email format',\n password_too_short: 'Password must be at least {{count}} characters',\n password_weak: 'Password is too weak',\n passwords_not_match: 'Passwords do not match',\n },\n\n // ==================== Status Messages ====================\n status: {\n loading: 'Loading...',\n success: 'Success',\n error: 'Error',\n empty: 'No data',\n network_error: 'Network error, please try again later',\n },\n\n // ==================== Error Messages ====================\n errors: {\n network: 'Network error, please try again later',\n server: 'Server error',\n unauthorized: 'Unauthorized, please login first',\n not_found: 'Not found',\n unknown: 'Unknown error',\n },\n\n // ==================== Success Messages ====================\n success: {\n saved: 'Saved successfully',\n deleted: 'Deleted successfully',\n updated: 'Updated successfully',\n created: 'Created successfully',\n },\n\n // ==================== Language Settings ====================\n language: {\n label: 'Language',\n zh_cn: '简体中文',\n zh_tw: '繁體中文',\n en_us: 'English',\n ja_jp: '日本語',\n },\n} as const;\n","/**\n * Web 平台适配器\n * 用于浏览器环境的语言检测和存储\n */\n\nimport type { Locale, I18nAdapter } from '../types';\n\n/**\n * Web 平台适配器\n * 使用 localStorage 存储语言偏好\n */\nexport class WebI18nAdapter implements I18nAdapter {\n private storageKey = 'app_locale';\n\n getSystemLocale(): Locale {\n if (typeof navigator === 'undefined') return 'zh-CN';\n const browserLocale = navigator.language;\n return this.normalizeLocale(browserLocale);\n }\n\n async saveLocale(locale: Locale): Promise<void> {\n if (typeof localStorage === 'undefined') return;\n localStorage.setItem(this.storageKey, locale);\n }\n\n async loadLocale(): Promise<Locale | null> {\n if (typeof localStorage === 'undefined') return null;\n const stored = localStorage.getItem(this.storageKey);\n return stored as Locale | null;\n }\n\n private normalizeLocale(locale: string): Locale {\n const map: Record<string, Locale> = {\n 'zh-CN': 'zh-CN',\n 'zh-TW': 'zh-TW',\n 'zh-HK': 'zh-TW',\n zh: 'zh-CN',\n 'en-US': 'en-US',\n 'en-GB': 'en-US',\n en: 'en-US',\n 'ja-JP': 'ja-JP',\n ja: 'ja-JP',\n };\n return map[locale] || 'zh-CN';\n }\n}\n\n","/**\n * React Native 平台适配器\n * 用于 React Native 应用的语言检测和存储\n */\n\nimport type { Locale, I18nAdapter } from '../types';\n\n/**\n * React Native 平台适配器\n * 使用 AsyncStorage 存储语言偏好\n *\n * 注意:需要安装 @react-native-async-storage/async-storage\n */\nexport class ReactNativeI18nAdapter implements I18nAdapter {\n private storageKey = '@app_locale';\n\n getSystemLocale(): Locale {\n // 需要导入 react-native 的 Platform 和 NativeModules\n try {\n // @ts-ignore - react-native 在运行时动态加载\n const { Platform, NativeModules } = require('react-native');\n const locale =\n Platform.OS === 'ios'\n ? NativeModules.SettingsManager.settings.AppleLocale ||\n NativeModules.SettingsManager.settings.AppleLanguages[0]\n : NativeModules.I18nManager.localeIdentifier;\n\n return this.normalizeLocale(locale);\n } catch {\n return 'zh-CN';\n }\n }\n\n async saveLocale(locale: Locale): Promise<void> {\n try {\n // @ts-ignore - AsyncStorage 在运行时动态加载\n const AsyncStorage = require('@react-native-async-storage/async-storage').default;\n await AsyncStorage.setItem(this.storageKey, locale);\n } catch (error) {\n console.error('Failed to save locale:', error);\n }\n }\n\n async loadLocale(): Promise<Locale | null> {\n try {\n // @ts-ignore - AsyncStorage 在运行时动态加载\n const AsyncStorage = require('@react-native-async-storage/async-storage').default;\n const stored = await AsyncStorage.getItem(this.storageKey);\n return stored as Locale | null;\n } catch (error) {\n console.error('Failed to load locale:', error);\n return null;\n }\n }\n\n private normalizeLocale(locale: string): Locale {\n const map: Record<string, Locale> = {\n 'zh-CN': 'zh-CN',\n zh_CN: 'zh-CN',\n 'zh-Hans': 'zh-CN',\n zh_Hans_CN: 'zh-CN',\n 'zh-TW': 'zh-TW',\n zh_TW: 'zh-TW',\n 'zh-Hant': 'zh-TW',\n zh_Hant_TW: 'zh-TW',\n 'en-US': 'en-US',\n en_US: 'en-US',\n en: 'en-US',\n 'ja-JP': 'ja-JP',\n ja_JP: 'ja-JP',\n ja: 'ja-JP',\n };\n return map[locale] || 'zh-CN';\n }\n}\n\n","/**\n * Taro (小程序) 平台适配器\n * 用于微信小程序、支付宝小程序等通过 Taro 开发的应用\n */\n\nimport type { Locale, I18nAdapter } from '../types';\n\n/**\n * Taro (小程序) 平台适配器\n * 使用 Taro.storage API 存储语言偏好\n *\n * 注意:需要安装 @tarojs/taro\n */\nexport class TaroI18nAdapter implements I18nAdapter {\n private storageKey = 'app_locale';\n\n getSystemLocale(): Locale {\n try {\n // @ts-ignore - Taro 在运行时动态加载\n const Taro = require('@tarojs/taro').default;\n const systemInfo = Taro.getSystemInfoSync();\n return this.normalizeLocale(systemInfo.language);\n } catch {\n return 'zh-CN';\n }\n }\n\n async saveLocale(locale: Locale): Promise<void> {\n try {\n // @ts-ignore - Taro 在运行时动态加载\n const Taro = require('@tarojs/taro').default;\n await Taro.setStorage({\n key: this.storageKey,\n data: locale,\n });\n } catch (error) {\n console.error('Failed to save locale:', error);\n }\n }\n\n async loadLocale(): Promise<Locale | null> {\n try {\n // @ts-ignore - Taro 在运行时动态加载\n const Taro = require('@tarojs/taro').default;\n const res = await Taro.getStorage({\n key: this.storageKey,\n });\n return res.data as Locale | null;\n } catch (error) {\n return null;\n }\n }\n\n private normalizeLocale(locale: string): Locale {\n const map: Record<string, Locale> = {\n zh_CN: 'zh-CN',\n 'zh-CN': 'zh-CN',\n zh_TW: 'zh-TW',\n 'zh-TW': 'zh-TW',\n en: 'en-US',\n 'en-US': 'en-US',\n ja: 'ja-JP',\n 'ja-JP': 'ja-JP',\n };\n return map[locale] || 'zh-CN';\n }\n}\n\n","/**\n * Electron 平台适配器\n * 用于 Electron 桌面应用的语言检测和存储\n */\n\nimport type { Locale, I18nAdapter } from '../types';\n\n/**\n * Electron 平台适配器\n * 使用 localStorage 存储语言偏好\n *\n * 注意:Electron 渲染进程支持 Web API\n */\nexport class ElectronI18nAdapter implements I18nAdapter {\n private storageKey = 'app_locale';\n\n getSystemLocale(): Locale {\n if (typeof navigator === 'undefined') return 'zh-CN';\n const browserLocale = navigator.language;\n return this.normalizeLocale(browserLocale);\n }\n\n async saveLocale(locale: Locale): Promise<void> {\n if (typeof localStorage === 'undefined') return;\n localStorage.setItem(this.storageKey, locale);\n }\n\n async loadLocale(): Promise<Locale | null> {\n if (typeof localStorage === 'undefined') return null;\n const stored = localStorage.getItem(this.storageKey);\n return stored as Locale | null;\n }\n\n private normalizeLocale(locale: string): Locale {\n const map: Record<string, Locale> = {\n 'zh-CN': 'zh-CN',\n 'zh-TW': 'zh-TW',\n 'zh-HK': 'zh-TW',\n zh: 'zh-CN',\n 'en-US': 'en-US',\n 'en-GB': 'en-US',\n en: 'en-US',\n 'ja-JP': 'ja-JP',\n ja: 'ja-JP',\n };\n return map[locale] || 'zh-CN';\n }\n}\n\n","'use client';\n\n/**\n * 语言切换组件\n * 支持多种样式:按钮组、下拉菜单、图标按钮\n * 使用 Tailwind CSS 样式,支持暗色模式\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useTranslation } from '../hooks';\nimport type { Locale } from '../types';\nimport { clsx } from 'clsx';\n\n// ==================== 类型定义 ====================\n\nexport interface LanguageSwitcherProps {\n variant?: 'buttons' | 'dropdown' | 'icon';\n className?: string;\n onLanguageChange?: (locale: Locale) => void;\n}\n\nexport interface LanguageOption {\n locale: Locale;\n label: string;\n flag: string;\n}\n\n// ==================== 语言选项配置 ====================\n\nconst LANGUAGE_OPTIONS: LanguageOption[] = [\n { locale: 'zh-CN', label: '简体中文', flag: '🇨🇳' },\n { locale: 'zh-TW', label: '繁體中文', flag: '🇹🇼' },\n { locale: 'en-US', label: 'English', flag: '🇺🇸' },\n { locale: 'ja-JP', label: '日本語', flag: '🇯🇵' },\n];\n\n// ==================== 按钮组样式 ====================\n\n/**\n * 按钮组语言切换器\n */\nexport function LanguageSwitcherButtons({\n className = '',\n onLanguageChange,\n}: LanguageSwitcherProps) {\n const { locale, setLocale } = useTranslation();\n\n const handleChange = (newLocale: Locale) => {\n setLocale(newLocale);\n onLanguageChange?.(newLocale);\n };\n\n return (\n <div\n className={clsx('inline-flex items-center gap-1 p-1 bg-gray-100 dark:bg-gray-800 rounded-lg', className)}\n >\n {LANGUAGE_OPTIONS.map((option) => (\n <button\n key={option.locale}\n onClick={() => handleChange(option.locale)}\n className={clsx(\n 'inline-flex items-center gap-2 px-3 py-1.5 rounded-md text-sm font-medium transition-all duration-200',\n locale === option.locale\n ? 'bg-white dark:bg-gray-700 text-blue-600 dark:text-blue-400 shadow-sm'\n : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700/50'\n )}\n aria-label={option.label}\n >\n <span className=\"text-base leading-none\">{option.flag}</span>\n <span className=\"hidden sm:inline\">{option.label}</span>\n </button>\n ))}\n </div>\n );\n}\n\n// ==================== 下拉菜单样式 ====================\n\n/**\n * 下拉菜单语言切换器\n */\nexport function LanguageSwitcherDropdown({\n className = '',\n onLanguageChange,\n}: LanguageSwitcherProps) {\n const { locale, setLocale, t } = useTranslation();\n\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newLocale = e.target.value as Locale;\n setLocale(newLocale);\n onLanguageChange?.(newLocale);\n };\n\n return (\n <div className={clsx('inline-flex flex-col gap-2', className)}>\n <label\n htmlFor=\"language-select\"\n className=\"text-sm font-medium text-gray-700 dark:text-gray-300\"\n >\n {t('language.label')}\n </label>\n <select\n id=\"language-select\"\n value={locale}\n onChange={handleChange}\n className=\"\n min-w-[160px] px-3 py-2 pr-8\n bg-white dark:bg-gray-800\n border border-gray-300 dark:border-gray-600\n rounded-lg text-sm\n text-gray-900 dark:text-gray-100\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n cursor-pointer\n appearance-none\n bg-[url('data:image/svg+xml;charset=UTF-8,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27currentColor%27 stroke-width=%272%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3e%3cpolyline points=%276 9 12 15 18 9%27%3e%3c/polyline%3e%3c/svg%3e')]\n bg-[length:1rem] bg-[right_0.5rem_center] bg-no-repeat\n \"\n aria-label={t('language.label')}\n >\n {LANGUAGE_OPTIONS.map((option) => (\n <option key={option.locale} value={option.locale}>\n {option.flag} {option.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\n// ==================== 图标按钮样式 ====================\n\n/**\n * 图标按钮语言切换器(带下拉菜单)\n */\nexport function LanguageSwitcherIcon({ className = '', onLanguageChange }: LanguageSwitcherProps) {\n const { locale, setLocale } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const currentOption = LANGUAGE_OPTIONS.find((opt) => opt.locale === locale);\n\n const handleSelect = (newLocale: Locale) => {\n setLocale(newLocale);\n setIsOpen(false);\n onLanguageChange?.(newLocale);\n };\n\n // 点击外部关闭下拉菜单\n useEffect(() => {\n if (!isOpen) return;\n\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n return (\n <div className={clsx('relative', className)} ref={dropdownRef}>\n <button\n onClick={() => setIsOpen(!isOpen)}\n className=\"\n inline-flex items-center gap-1.5 px-3 py-2\n bg-white dark:bg-gray-800\n border border-gray-300 dark:border-gray-600\n rounded-lg\n hover:bg-gray-50 dark:hover:bg-gray-700\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n transition-all duration-200\n \"\n aria-label=\"Switch Language\"\n >\n <span className=\"text-lg leading-none\">{currentOption?.flag}</span>\n <svg\n className={clsx('w-4 h-4 text-gray-600 dark:text-gray-400 transition-transform duration-200', isOpen ? 'rotate-180' : '')}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {isOpen && (\n <div\n className=\"\n absolute top-full right-0 mt-2 min-w-[180px]\n bg-white dark:bg-gray-800\n border border-gray-200 dark:border-gray-700\n rounded-lg shadow-lg\n py-1\n z-50\n animate-in fade-in slide-in-from-top-2 duration-200\n \"\n >\n {LANGUAGE_OPTIONS.map((option) => (\n <button\n key={option.locale}\n onClick={() => handleSelect(option.locale)}\n className={clsx(\n 'w-full flex items-center gap-3 px-4 py-2.5 text-sm transition-colors duration-150',\n locale === option.locale\n ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700/50'\n )}\n >\n <span className=\"text-lg leading-none\">{option.flag}</span>\n <span className=\"flex-1 text-left\">{option.label}</span>\n {locale === option.locale && (\n <svg\n className=\"w-4 h-4 text-blue-600 dark:text-blue-400\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ==================== 主组件 ====================\n\n/**\n * 语言切换器主组件\n * 根据 variant 自动选择样式\n */\nexport function LanguageSwitcher({\n variant = 'icon',\n className,\n onLanguageChange,\n}: LanguageSwitcherProps) {\n switch (variant) {\n case 'buttons':\n return <LanguageSwitcherButtons className={className} onLanguageChange={onLanguageChange} />;\n case 'dropdown':\n return <LanguageSwitcherDropdown className={className} onLanguageChange={onLanguageChange} />;\n case 'icon':\n default:\n return <LanguageSwitcherIcon className={className} onLanguageChange={onLanguageChange} />;\n }\n}\n\n// ==================== 默认导出 ====================\n\nexport default LanguageSwitcher;\n"]}
@@ -1,6 +1,6 @@
1
1
  import { __export } from './chunk-MAI35PU6.mjs';
2
2
 
3
- // src/api/index.ts
3
+ // src/common/api/index.ts
4
4
  var api_exports = {};
5
5
  __export(api_exports, {
6
6
  BaseApiClient: () => BaseApiClient,
@@ -8,7 +8,7 @@ __export(api_exports, {
8
8
  DEFAULT_STORAGE_KEYS: () => DEFAULT_STORAGE_KEYS
9
9
  });
10
10
 
11
- // src/api/types.ts
11
+ // src/common/api/types.ts
12
12
  var DEFAULT_STORAGE_KEYS = {
13
13
  AUTH_TOKEN: "auth_token",
14
14
  USER_DATA: "user_data",
@@ -29,7 +29,7 @@ var DEFAULT_API_ROUTES = {
29
29
  }
30
30
  };
31
31
 
32
- // src/api/BaseApiClient.ts
32
+ // src/common/api/BaseApiClient.ts
33
33
  var BaseApiClient = class {
34
34
  constructor(config) {
35
35
  this.token = null;
@@ -294,5 +294,5 @@ var BaseApiClient = class {
294
294
  };
295
295
 
296
296
  export { BaseApiClient, DEFAULT_API_ROUTES, DEFAULT_STORAGE_KEYS, api_exports };
297
- //# sourceMappingURL=chunk-FIUBFREP.mjs.map
298
- //# sourceMappingURL=chunk-FIUBFREP.mjs.map
297
+ //# sourceMappingURL=chunk-DO6QYAZV.mjs.map
298
+ //# sourceMappingURL=chunk-DO6QYAZV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/api/index.ts","../src/common/api/types.ts","../src/common/api/BaseApiClient.ts"],"names":[],"mappings":";;;AAAA,IAAA,WAAA,GAAA;AAAA,QAAA,CAAA,WAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACkDO,IAAM,oBAAA,GAAuB;AAAA,EAClC,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,aAAA,EAAe;AACjB;AAkCO,IAAM,kBAAA,GAAgC;AAAA,EAC3C,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,QAAA,EAAU,gBAAA;AAAA,IACV,EAAA,EAAI;AAAA,GACN;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,CAAC,EAAA,KAAe,SAAA,GAAa,EAAA;AAAA,IACrC,MAAA,EAAQ,CAAC,EAAA,KAAe,SAAA,GAAa,EAAA;AAAA,IACrC,MAAA,EAAQ,CAAC,EAAA,KAAe,SAAA,GAAa;AAAA;AAEzC;;;ACpEO,IAAM,gBAAN,MAAiC;AAAA,EAStC,YAAY,MAAA,EAA6B;AARzC,IAAA,IAAA,CAAU,KAAA,GAAuB,IAAA;AACjC,IAAA,IAAA,CAAU,IAAA,GAAqB,IAAA;AAQ7B,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,WAAA,GAAc;AAAA,MACjB,GAAG,oBAAA;AAAA,MACH,GAAI,MAAA,CAAO,WAAA,IAAe;AAAC,KAC7B;AACA,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,kBAAA;AAAA,MACH,GAAI,MAAA,CAAO,MAAA,IAAU,EAAC;AAAA,MACtB,IAAA,EAAM;AAAA,QACJ,GAAG,kBAAA,CAAmB,IAAA;AAAA,QACtB,GAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,IAAQ;AAAC,OAC9B;AAAA,MACA,KAAA,EAAO;AAAA,QACL,GAAG,kBAAA,CAAmB,KAAA;AAAA,QACtB,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAA,IAAS;AAAC;AAC/B,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,QAAQ,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA,CAAK,YAAY,UAAU,CAAA;AACnE,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA,CAAK,YAAY,SAAS,CAAA;AACtE,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,MACjC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,KAAA,EAAqC;AAClD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,YAAY,KAAK,CAAA;AAAA,IAC/D,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,YAAY,UAAU,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,IAAA,EAAmC;AAC/C,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA,CAAK,YAAY,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAC7E,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAoC;AACxC,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAA+B;AACnC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,YAAY,UAAU,CAAA;AACzD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,YAAY,SAAS,CAAA;AACxD,IAAA,IAAI,IAAA,CAAK,YAAY,aAAA,EAAe;AAClC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,YAAY,aAAa,CAAA;AAAA,IAC9D;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,YAAqB,MAAA,EAAgD;AACnF,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,MAAA,CAAO,OAAA,IAAW;AAAC,OACzB;AAGA,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,SAAA,GAAa,IAAA,CAAK,KAAA;AAAA,MAC/C;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAwB;AAAA,QAC1D,GAAG,MAAA;AAAA,QACH,GAAA,EAAM,IAAA,CAAK,OAAA,GAAY,MAAA,CAAO,GAAA;AAAA,QAC9B;AAAA,OACD,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAa,GAAA,EAAa,MAAA,EAAuD;AACrF,IAAA,OAAO,KAAK,WAAA,CAAY,EAAE,KAAK,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAc,GAAA,EAAa,IAAA,EAAqC;AACpE,IAAA,OAAO,KAAK,WAAA,CAAY,EAAE,KAAK,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAa,GAAA,EAAa,IAAA,EAAqC;AACnE,IAAA,OAAO,KAAK,WAAA,CAAY,EAAE,KAAK,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAe,GAAA,EAAa,IAAA,EAAqC;AACrE,IAAA,OAAO,KAAK,WAAA,CAAY,EAAE,KAAK,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAgB,GAAA,EAAsC;AAC1D,IAAA,OAAO,KAAK,WAAA,CAAY,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAA,CACJ,KAAA,EACA,QAAA,EACA,QAAA,EAC2C;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU;AAC/B,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAA0B,IAAA,CAAK,MAAA,CAAO,KAAK,QAAA,EAAU;AAAA,MAC/E,KAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,IAAA,EAAM;AACrC,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACvC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACrC,MAAA,MAAM,KAAK,aAAA,GAAgB,QAAA,CAAS,KAAK,IAAA,EAAM,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACpE,CAAA,MAAA,IAAW,CAAC,QAAA,CAAS,OAAA,EAAS;AAC5B,MAAA,MAAM,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,KAAA,IAAS,qBAAqB,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,KAAA,EAAe,QAAA,EAA6D;AACtF,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO;AAC5B,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAA0B,IAAA,CAAK,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MAC5E,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,IAAA,EAAM;AACrC,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACvC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACrC,MAAA,MAAM,KAAK,aAAA,GAAgB,QAAA,CAAS,KAAK,IAAA,EAAM,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACpE,CAAA,MAAA,IAAW,CAAC,QAAA,CAAS,OAAA,EAAS;AAC5B,MAAA,MAAM,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,KAAA,IAAS,cAAc,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,GAAwB;AAC5B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAA,CAAK,IAAA,CAAW,IAAA,CAAK,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,KAAK,aAAA,EAAc;AACzB,IAAA,MAAM,KAAK,QAAA,IAAW;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,GAA8C;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,EAAA,EAAI;AACzB,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAS,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,CAAA;AAGxD,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,IAAA,EAAM;AAErC,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,IAAA,IAAQ,QAAA,CAAS,IAAA;AAEhD,MAAA,MAAM,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAE3B,MAAA,OAAO;AAAA,QACL,GAAG,QAAA;AAAA,QACH,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,MAAA,EAI6C;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM;AAC5B,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAM,MAAM,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,MAAA,EAA6C;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ;AAC9B,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,OAAO,KAAA,CAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,CAAW,MAAA,EAAgB,IAAA,EAAmD;AAClF,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ;AAC9B,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,CAAO,MAAM,MAAA,CAAO,MAAM,GAAG,IAAI,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,MAAA,EAA4C;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ;AAC9B,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAK,OAAO,KAAA,CAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EACrD;AAiCF","file":"chunk-DO6QYAZV.mjs","sourcesContent":["/**\n * API 模块\n * API Module\n *\n * 提供通用的 API 客户端基类和类型定义\n */\n\nexport * from './types';\nexport * from './BaseApiClient';\n\n// 重新导出依赖的适配器类型,方便使用\nexport type { StorageAdapter } from '../storage';\nexport type { RequestAdapter, RequestConfig } from '../request';\n\n// 导出常用的默认配置\nexport { DEFAULT_STORAGE_KEYS, DEFAULT_API_ROUTES } from './types';\n\n","/**\n * API 通用类型定义\n * Common API Types\n */\n\n/**\n * API 响应类型\n * Generic API Response Format\n */\nexport interface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n meta?: {\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n [key: string]: any;\n };\n}\n\n/**\n * 分页参数类型\n * Pagination Parameters\n */\nexport interface PaginationParams {\n page?: number;\n limit?: number;\n search?: string;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * 认证响应类型(泛型)\n * Generic Auth Response\n */\nexport interface AuthResponse<TUser = any> {\n user: TUser;\n token: string;\n}\n\n/**\n * 默认存储键常量\n * Default Storage Keys\n */\nexport const DEFAULT_STORAGE_KEYS = {\n AUTH_TOKEN: 'auth_token',\n USER_DATA: 'user_data',\n REFRESH_TOKEN: 'refresh_token',\n} as const;\n\n/**\n * 存储键类型(可扩展)\n * Storage Keys Type\n */\nexport type StorageKeys = typeof DEFAULT_STORAGE_KEYS;\n\n/**\n * API 路由配置\n * API Routes Configuration\n */\nexport interface ApiRoutes {\n /** 认证相关路由 */\n auth?: {\n login?: string;\n logout?: string;\n register?: string;\n me?: string;\n };\n /** 用户相关路由 */\n users?: {\n list?: string;\n detail?: (id: string) => string;\n update?: (id: string) => string;\n delete?: (id: string) => string;\n };\n /** 自定义路由 */\n [key: string]: any;\n}\n\n/**\n * 默认 API 路由\n */\nexport const DEFAULT_API_ROUTES: ApiRoutes = {\n auth: {\n login: '/auth/login',\n logout: '/auth/logout',\n register: '/auth/register',\n me: '/auth/me',\n },\n users: {\n list: '/users',\n detail: (id: string) => '/users/' + (id),\n update: (id: string) => '/users/' + (id),\n delete: (id: string) => '/users/' + (id),\n },\n};\n","/**\n * 基础 API 客户端(泛型)\n * Base API Client (Generic)\n *\n * 提供统一的 API 调用逻辑,通过适配器模式支持多平台\n * 使用泛型 TUser 支持不同项目的用户类型\n */\n\nimport type { StorageAdapter } from '../storage';\nimport type { RequestAdapter, RequestConfig } from '../request';\nimport type { ApiResponse, AuthResponse, StorageKeys, ApiRoutes } from './types';\nimport { DEFAULT_STORAGE_KEYS, DEFAULT_API_ROUTES } from './types';\n\n/**\n * 基础 API 客户端配置\n */\nexport interface BaseApiClientConfig {\n /** 基础 URL */\n baseUrl: string;\n /** 存储适配器 */\n storage: StorageAdapter;\n /** 请求适配器 */\n request: RequestAdapter;\n /** 自定义存储键(可选) */\n storageKeys?: Partial<StorageKeys>;\n /** API 路由配置(可选) */\n routes?: ApiRoutes;\n}\n\n/**\n * 基础 API 客户端\n * @template TUser 用户类型(泛型)\n */\nexport class BaseApiClient<TUser = any> {\n protected token: string | null = null;\n protected user: TUser | null = null;\n protected baseUrl: string;\n protected storage: StorageAdapter;\n protected request: RequestAdapter;\n protected storageKeys: StorageKeys;\n protected routes: ApiRoutes;\n\n constructor(config: BaseApiClientConfig) {\n this.baseUrl = config.baseUrl;\n this.storage = config.storage;\n this.request = config.request;\n this.storageKeys = {\n ...DEFAULT_STORAGE_KEYS,\n ...(config.storageKeys || {}),\n };\n this.routes = {\n ...DEFAULT_API_ROUTES,\n ...(config.routes || {}),\n auth: {\n ...DEFAULT_API_ROUTES.auth,\n ...(config.routes?.auth || {}),\n },\n users: {\n ...DEFAULT_API_ROUTES.users,\n ...(config.routes?.users || {}),\n },\n };\n }\n\n /**\n * 初始化 - 从存储中加载 token 和用户信息\n */\n async init(): Promise<void> {\n try {\n this.token = await this.storage.getItem(this.storageKeys.AUTH_TOKEN);\n const userData = await this.storage.getItem(this.storageKeys.USER_DATA);\n if (userData) {\n this.user = JSON.parse(userData) as TUser;\n }\n } catch (error) {\n console.error('Failed to load auth data:', error);\n }\n }\n\n /**\n * 设置认证 token\n */\n async setToken(token: string | null): Promise<void> {\n this.token = token;\n if (token) {\n await this.storage.setItem(this.storageKeys.AUTH_TOKEN, token);\n } else {\n await this.storage.removeItem(this.storageKeys.AUTH_TOKEN);\n }\n }\n\n /**\n * 设置用户信息\n */\n async setUser(user: TUser | null): Promise<void> {\n this.user = user;\n if (user) {\n await this.storage.setItem(this.storageKeys.USER_DATA, JSON.stringify(user));\n } else {\n await this.storage.removeItem(this.storageKeys.USER_DATA);\n }\n }\n\n /**\n * 获取当前 token\n */\n getToken(): string | null {\n return this.token;\n }\n\n /**\n * 获取当前用户\n */\n getUser(): TUser | null {\n return this.user;\n }\n\n /**\n * 检查是否已登录\n */\n async isAuthenticated(): Promise<boolean> {\n return !!this.token;\n }\n\n /**\n * 清除用户数据\n */\n async clearUserData(): Promise<void> {\n await this.storage.removeItem(this.storageKeys.AUTH_TOKEN);\n await this.storage.removeItem(this.storageKeys.USER_DATA);\n if (this.storageKeys.REFRESH_TOKEN) {\n await this.storage.removeItem(this.storageKeys.REFRESH_TOKEN);\n }\n this.token = null;\n this.user = null;\n }\n\n /**\n * 发送请求的通用方法\n */\n protected async sendRequest<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n };\n\n // 添加认证 token\n if (this.token) {\n headers['Authorization'] = 'Bearer ' + (this.token);\n }\n\n const response = await this.request.request<ApiResponse<T>>({\n ...config,\n url: (this.baseUrl) + (config.url),\n headers,\n });\n\n return response;\n } catch (error) {\n console.error('API request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络错误,请重试',\n };\n }\n }\n\n /**\n * 发送 GET 请求\n */\n async get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'GET', params });\n }\n\n /**\n * 发送 POST 请求\n */\n async post<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'POST', body });\n }\n\n /**\n * 发送 PUT 请求\n */\n async put<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PUT', body });\n }\n\n /**\n * 发送 PATCH 请求\n */\n async patch<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PATCH', body });\n }\n\n /**\n * 发送 DELETE 请求\n */\n async delete<T = any>(url: string): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'DELETE' });\n }\n\n // ==================== 默认认证方法(子类可重写) ====================\n\n /**\n * 用户注册\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async register(\n email: string,\n password: string,\n username: string\n ): Promise<ApiResponse<AuthResponse<TUser>>> {\n if (!this.routes.auth?.register) {\n throw new Error('Register route is not configured');\n }\n\n const response = await this.post<AuthResponse<TUser>>(this.routes.auth.register, {\n email,\n password,\n username,\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n await this.onAuthSuccess?.(response.data.user, response.data.token);\n } else if (!response.success) {\n await this.onAuthError?.(response.error || 'Registration failed');\n }\n\n return response;\n }\n\n /**\n * 用户登录\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async login(email: string, password: string): Promise<ApiResponse<AuthResponse<TUser>>> {\n if (!this.routes.auth?.login) {\n throw new Error('Login route is not configured');\n }\n\n const response = await this.post<AuthResponse<TUser>>(this.routes.auth.login, {\n email,\n password,\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n await this.onAuthSuccess?.(response.data.user, response.data.token);\n } else if (!response.success) {\n await this.onAuthError?.(response.error || 'Login failed');\n }\n\n return response;\n }\n\n /**\n * 用户退出登录\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async logout(): Promise<void> {\n if (this.routes.auth?.logout) {\n await this.post<void>(this.routes.auth.logout);\n }\n\n // 无论请求成功与否,都清除本地数据\n await this.clearUserData();\n await this.onLogout?.();\n }\n\n /**\n * 获取当前用户信息\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async getCurrentUser(): Promise<ApiResponse<TUser>> {\n if (!this.routes.auth?.me) {\n throw new Error('Current user route is not configured');\n }\n\n const response = await this.get<any>(this.routes.auth.me);\n\n // 统一处理响应格式:自动展开 response.data.user 为 response.data\n if (response.success && response.data) {\n // 如果 data 是嵌套的 {user: {...}, session: {...}} 格式,提取 user\n const userData = response.data.user || response.data;\n\n await this.setUser(userData);\n\n return {\n ...response,\n data: userData,\n };\n }\n\n return response;\n }\n\n // ==================== 默认用户管理方法(子类可重写) ====================\n\n /**\n * 获取用户列表\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async getUsers(params?: {\n page?: number;\n limit?: number;\n search?: string;\n }): Promise<ApiResponse<{ users: TUser[]; total: number }>> {\n if (!this.routes.users?.list) {\n throw new Error('Users list route is not configured');\n }\n\n return this.get(this.routes.users.list, params);\n }\n\n /**\n * 获取用户详情\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async getUserById(userId: string): Promise<ApiResponse<TUser>> {\n if (!this.routes.users?.detail) {\n throw new Error('User detail route is not configured');\n }\n\n return this.get(this.routes.users.detail(userId));\n }\n\n /**\n * 更新用户信息\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async updateUser(userId: string, data: Partial<TUser>): Promise<ApiResponse<TUser>> {\n if (!this.routes.users?.update) {\n throw new Error('User update route is not configured');\n }\n\n return this.put(this.routes.users.update(userId), data);\n }\n\n /**\n * 删除用户\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async deleteUser(userId: string): Promise<ApiResponse<void>> {\n if (!this.routes.users?.delete) {\n throw new Error('User delete route is not configured');\n }\n\n return this.delete(this.routes.users.delete(userId));\n }\n\n // ==================== 子类可重写的钩子方法 ====================\n\n /**\n * 请求前钩子(子类可重写)\n */\n protected async onBeforeRequest?(config: RequestConfig): Promise<RequestConfig>;\n\n /**\n * 请求后钩子(子类可重写)\n */\n protected async onAfterRequest?<T>(response: ApiResponse<T>): Promise<ApiResponse<T>>;\n\n /**\n * 请求错误钩子(子类可重写)\n */\n protected async onRequestError?(error: Error): Promise<void>;\n\n /**\n * 认证成功钩子(子类可重写)\n */\n protected async onAuthSuccess?(user: TUser, token: string): Promise<void>;\n\n /**\n * 认证失败钩子(子类可重写)\n */\n protected async onAuthError?(error: string): Promise<void>;\n\n /**\n * 登出钩子(子类可重写)\n */\n protected async onLogout?(): Promise<void>;\n}\n\n"]}
@@ -1,6 +1,6 @@
1
- import { createLogger } from './chunk-3DXPQ4YV.mjs';
1
+ import { createLogger } from './chunk-VYK4M2D6.mjs';
2
2
 
3
- // src/universalFile/constants.ts
3
+ // src/common/universalFile/constants.ts
4
4
  var UNIVERSAL_FILE_VERSION = "1.0.0";
5
5
  var UNIVERSAL_FILE_NAME = "@qhr123/sa2kit/universalFile";
6
6
  var DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;
@@ -101,7 +101,7 @@ var DEFAULT_REQUEST_TIMEOUT = 3e4;
101
101
  var DEFAULT_UPLOAD_TIMEOUT = 3e5;
102
102
  var DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;
103
103
 
104
- // src/universalFile/utils.ts
104
+ // src/common/universalFile/utils.ts
105
105
  function formatFileSize(bytes) {
106
106
  if (bytes === 0) return "0 B";
107
107
  const units = ["B", "KB", "MB", "GB", "TB"];
@@ -363,7 +363,7 @@ function readFileAsText(file, encoding = "UTF-8") {
363
363
  });
364
364
  }
365
365
 
366
- // src/universalFile/client.ts
366
+ // src/common/universalFile/client.ts
367
367
  var clientLogger = createLogger("UniversalFileClient");
368
368
  var UniversalFileClient = class {
369
369
  constructor(config = {}) {
@@ -777,5 +777,5 @@ function createFileClient(config) {
777
777
  }
778
778
 
779
779
  export { ALL_SUPPORTED_MIME_TYPES, API_BASE_PATH, API_ENDPOINTS, AUDIO_EXTENSIONS, AUDIO_MIME_TYPES, DEFAULT_CHUNK_SIZE, DEFAULT_MAX_AUDIO_SIZE, DEFAULT_MAX_DOCUMENT_SIZE, DEFAULT_MAX_FILE_SIZE, DEFAULT_MAX_IMAGE_SIZE, DEFAULT_MAX_VIDEO_SIZE, DEFAULT_PAGE_SIZE, DEFAULT_REQUEST_TIMEOUT, DEFAULT_UPLOAD_TIMEOUT, DOCUMENT_EXTENSIONS, DOCUMENT_MIME_TYPES, ERROR_CODES, IMAGE_EXTENSIONS, IMAGE_MIME_TYPES, UNIVERSAL_FILE_NAME, UNIVERSAL_FILE_VERSION, UniversalFileClient, VIDEO_EXTENSIONS, VIDEO_MIME_TYPES, buildQueryString, calculateProgress, calculateRemainingTime, calculateSpeed, createFileClient, createFileError, formatErrorMessage, formatFileSize, generateStoragePath, generateUniqueFileName, getFileCategory, getFileExtension, getMimeTypeFromFileName, isAudioFile, isDocumentFile, isImageFile, isMimeTypeSupported, isVideoFile, parseFileSize, parseQueryString, parseStoragePath, readFileAsArrayBuffer, readFileAsBase64, readFileAsText, sanitizeFileName, universalFileClient, validateFile, validateFileName, validateFileSize, validateFileType };
780
- //# sourceMappingURL=chunk-MBANGIG3.mjs.map
781
- //# sourceMappingURL=chunk-MBANGIG3.mjs.map
780
+ //# sourceMappingURL=chunk-DTR53LQO.mjs.map
781
+ //# sourceMappingURL=chunk-DTR53LQO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/universalFile/constants.ts","../src/common/universalFile/utils.ts","../src/common/universalFile/client.ts"],"names":[],"mappings":"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","file":"chunk-DTR53LQO.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';\nimport { createLogger } from '../logger';\n\nconst clientLogger = createLogger('UniversalFileClient');\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 clientLogger.debug('开始上传文件', {\n url,\n fileName: fileInfo.file.name,\n fileSize: fileInfo.file.size,\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId,\n });\n\n // 创建XMLHttpRequest以支持上传进度\n return await new Promise<FileMetadata>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n \n // 重要:启用 credentials 以携带 cookie\n xhr.withCredentials = true;\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 clientLogger.debug('上传响应', {\n status: xhr.status,\n statusText: xhr.statusText,\n responseLength: xhr.responseText?.length,\n });\n \n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n clientLogger.debug('解析响应成功', response);\n \n // 支持多种响应格式\n const fileData = response.file || response.data || response;\n const fileMetadata = this.transformFileMetadataFromAPI(fileData);\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 clientLogger.error('解析响应失败', { error, responseText: xhr.responseText });\n reject(new Error('解析响应失败'));\n }\n } else {\n clientLogger.error('上传失败', {\n status: xhr.status,\n statusText: xhr.statusText,\n responseText: xhr.responseText,\n });\n reject(new Error('上传失败: ' + (xhr.statusText)));\n }\n });\n\n // 监听错误\n xhr.addEventListener('error', (event) => {\n clientLogger.error('网络错误', event);\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) + (expiresIn ? `?expiresIn=${expiresIn}` : '');\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 clientLogger.error('查询文件列表失败', {\n status: response.status,\n statusText: response.statusText,\n });\n throw new Error('查询文件列表失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n clientLogger.debug('查询文件列表响应', {\n itemsCount: data.items?.length,\n total: data.total,\n page: data.page,\n });\n \n // 防御性检查\n if (!data.items || !Array.isArray(data.items)) {\n clientLogger.error('响应格式错误: items 不是数组', data);\n return {\n items: [],\n total: 0,\n page: 1,\n pageSize: 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n };\n }\n \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 credentials: 'include', // 携带 cookie 用于授权\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"]}
@@ -1,4 +1,15 @@
1
- // src/request/adapters/miniapp-adapter.ts
1
+ import { WebRequestAdapter } from './chunk-LZ5YTMMP.mjs';
2
+ import { __export } from './chunk-MAI35PU6.mjs';
3
+
4
+ // src/common/request/index.ts
5
+ var request_exports = {};
6
+ __export(request_exports, {
7
+ MiniappRequestAdapter: () => MiniappRequestAdapter,
8
+ ReactNativeRequestAdapter: () => ReactNativeRequestAdapter,
9
+ WebRequestAdapter: () => WebRequestAdapter
10
+ });
11
+
12
+ // src/common/request/adapters/miniapp-adapter.ts
2
13
  var MiniappRequestAdapter = class {
3
14
  constructor(taro) {
4
15
  if (!taro) {
@@ -37,7 +48,7 @@ var MiniappRequestAdapter = class {
37
48
  }
38
49
  };
39
50
 
40
- // src/request/adapters/react-native-adapter.ts
51
+ // src/common/request/adapters/react-native-adapter.ts
41
52
  var ReactNativeRequestAdapter = class {
42
53
  async request(config) {
43
54
  const { url, method = "GET", headers = {}, body, params } = config;
@@ -73,6 +84,6 @@ var ReactNativeRequestAdapter = class {
73
84
  }
74
85
  };
75
86
 
76
- export { MiniappRequestAdapter, ReactNativeRequestAdapter };
77
- //# sourceMappingURL=chunk-EQXPL7TN.mjs.map
78
- //# sourceMappingURL=chunk-EQXPL7TN.mjs.map
87
+ export { MiniappRequestAdapter, ReactNativeRequestAdapter, request_exports };
88
+ //# sourceMappingURL=chunk-EI2S4XDG.mjs.map
89
+ //# sourceMappingURL=chunk-EI2S4XDG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/request/index.ts","../src/common/request/adapters/miniapp-adapter.ts","../src/common/request/adapters/react-native-adapter.ts"],"names":[],"mappings":"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","file":"chunk-EI2S4XDG.mjs","sourcesContent":["/**\n * @package sa2kit/common/request\n * 跨平台网络请求适配器\n */\nexport type { RequestAdapter, RequestConfig } from './types/types';\nexport * from './adapters';\n","import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * Taro Request 接口定义\n * 兼容 @tarojs/taro request API\n */\ninterface TaroRequestStatic {\n request<T = any>(options: {\n url: string;\n method?: string;\n header?: Record<string, string>;\n data?: any;\n }): Promise<{\n statusCode: number;\n data: T;\n }>;\n}\n\n/**\n * Miniapp 平台请求适配器\n * 基于 Taro.request API\n *\n * 使用方式:\n * ```typescript\n * import Taro from '@tarojs/taro'\n * const adapter = new MiniappRequestAdapter(Taro)\n * ```\n *\n * 适用平台:\n * - WeChat Miniapp\n * - Other Taro-based miniapps\n */\nexport class MiniappRequestAdapter implements RequestAdapter {\n private taro: TaroRequestStatic;\n\n constructor(taro: TaroRequestStatic) {\n if (!taro) {\n throw new Error('MiniappRequestAdapter requires Taro instance');\n }\n this.taro = taro;\n }\n\n async request<T = any>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n try {\n const response = await this.taro.request({\n url,\n method: method as any,\n header: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n data: method === 'GET' ? params : body,\n });\n\n const data = response.data as any;\n\n // 统一返回格式\n if (response.statusCode >= 200 && response.statusCode < 300) {\n return data;\n } else {\n return {\n success: false,\n error: data.error || '请求失败: ' + (response.statusCode),\n } as T;\n }\n } catch (error) {\n console.error('[MiniappRequestAdapter] request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络请求失败',\n } as T;\n }\n }\n}\n\n","import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * React Native 请求适配器(fetch,不携带 Cookie)\n * 与 WebRequestAdapter 的区别:RN 跨域场景下 credentials:include 无效且易误导\n */\nexport class ReactNativeRequestAdapter implements RequestAdapter {\n async request<T = unknown>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n let fullUrl = url;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const qs = searchParams.toString();\n if (qs) {\n fullUrl += url.includes('?') ? `&${qs}` : `?${qs}`;\n }\n }\n\n const response = await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = (await response.json()) as T & { error?: string };\n if (!response.ok) {\n return {\n success: false,\n error:\n (data as { error?: string }).error ??\n `请求失败 (${response.status})`,\n } as T;\n }\n return data;\n }\n}\n"]}