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 +0,0 @@
1
- {"version":3,"sources":["../src/universalExport/server/UniversalExportService.ts","../src/universalExport/server/factory.ts","../src/universalExport/server/presets.ts","../src/universalExport/server/validation.ts","../src/universalExport/server/utils/index.ts","../src/universalExport/server/drizzle-schemas/postgres.ts","../src/universalExport/server/drizzle-database.ts"],"names":["createLogger","ExportConfigError","ExportDataError","endTime","duration","ExportFileError","XLSX","timestamp","pgTable","text","jsonb","boolean","integer","sql","relations","eq","and","desc"],"mappings":"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","file":"chunk-WW4GE6CZ.js","sourcesContent":["// @ts-nocheck\n\n/**\n * 通用导出服务\n *\n * 提供统一的导出功能,支持配置化字段选择、格式化和分组\n */\n\nimport type {\n ExportConfig,\n ExportRequest,\n ExportResult,\n ExportProgress,\n ExportError,\n ExportField,\n ExportFormat,\n UniversalExportServiceConfig,\n ExportEvent,\n ExportEventListener,\n FieldMapper,\n DataTransformer,\n Validator,\n Formatter,\n GroupingConfig,\n GroupingField,\n GroupingMode,\n GroupValueProcessing,\n} from '../types';\n\n// Excel导出依赖\nimport * as XLSX from 'xlsx';\n\n// 日志\nimport { createLogger } from '../../logger';\nconst logger = createLogger('UniversalExportService');\n\n// 客户端服务(可选依赖,通过构造函数注入)\n// import { universalExportClient } from './client';\n\nimport {\n ExportServiceError,\n ExportConfigError,\n ExportDataError,\n ExportFileError,\n} from '../types';\n\n// ============= 默认配置 =============\n\nconst DEFAULT_CONFIG: UniversalExportServiceConfig = {\n defaultFormat: 'csv',\n defaultDelimiter: ',',\n defaultEncoding: 'utf-8',\n defaultAddBOM: true,\n maxFileSize: 100 * 1024 * 1024, // 100MB\n maxRowsLimit: 100000,\n maxConcurrentExports: 5,\n exportTimeout: 300000, // 5分钟\n cache: {\n configTTL: 3600, // 1小时\n resultTTL: 1800, // 30分钟\n },\n};\n\n// ============= 内置格式化器 =============\n\nconst DEFAULT_FORMATTERS: Record<string, Formatter> = {\n // 日期格式化\n date: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toISOString().split('T')[0];\n },\n\n // 时间格式化\n datetime: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n\n // 数字格式化\n number: (value: any) => {\n if (value === null || value === undefined) return '';\n return String(value);\n },\n\n // 货币格式化\n currency: (value: any) => {\n if (value === null || value === undefined) return '';\n return '¥' + (Number(value).toFixed(2));\n },\n\n // 百分比格式化\n percentage: (value: any) => {\n if (value === null || value === undefined) return '';\n return ((Number(value) * 100).toFixed(2)) + '%';\n },\n\n // 布尔值格式化\n boolean: (value: any) => {\n if (value === null || value === undefined) return '';\n return value ? '是' : '否';\n },\n\n // 数组格式化\n array: (value: any) => {\n if (!Array.isArray(value)) return '';\n return value.join(', ');\n },\n\n // 对象格式化\n object: (value: any) => {\n if (!value || typeof value !== 'object') return '';\n return JSON.stringify(value);\n },\n};\n\n// ============= 主服务类 =============\n\n/**\n * 导出客户端接口(用于依赖注入)\n */\nexport interface IExportClient {\n createConfig(config: Omit<ExportConfig, 'id' | 'createdAt' | 'updatedAt'>): Promise<ExportConfig>;\n getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]>;\n}\n\nexport class UniversalExportService {\n private config: UniversalExportServiceConfig;\n private eventListeners: Map<string, ExportEventListener[]> = new Map();\n private activeExports: Map<string, ExportProgress> = new Map();\n private configCache: Map<string, { config: ExportConfig; timestamp: number }> = new Map();\n private resultCache: Map<string, { result: ExportResult; timestamp: number }> = new Map();\n private client?: IExportClient;\n\n constructor(\n config?: Partial<UniversalExportServiceConfig>,\n client?: IExportClient\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.client = client;\n }\n\n // ============= 配置管理 =============\n\n /**\n * 创建导出配置\n */\n async createConfig(\n config: Omit<ExportConfig, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<ExportConfig> {\n try {\n // 验证配置\n this.validateConfig({\n ...config,\n id: 'temp',\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n\n // 通过客户端API保存到数据库(如果提供了client)\n if (!this.client) {\n throw new ExportConfigError('未提供导出客户端服务', config);\n }\n const newConfig = await this.client.createConfig(config);\n\n // 保存到缓存\n this.configCache.set(newConfig.id, {\n config: newConfig,\n timestamp: Date.now(),\n });\n\n // 触发事件\n this.emitEvent({\n type: 'config:save',\n exportId: newConfig.id,\n timestamp: new Date(),\n data: { config: newConfig },\n });\n\n return newConfig;\n } catch (error) {\n throw new ExportConfigError(\n '创建导出配置失败: ' + (error instanceof Error ? error.message : '未知错误'),\n { originalError: error }\n );\n }\n }\n\n /**\n * 获取导出配置\n */\n async getConfig(configId: string): Promise<ExportConfig | null> {\n // 先从缓存获取\n const cached = this.configCache.get(configId);\n if (cached && Date.now() - cached.timestamp < this.config.cache.configTTL * 1000) {\n return cached.config;\n }\n\n // 从缓存中获取(暂时不支持从数据库获取单个配置)\n return null;\n }\n\n /**\n * 更新导出配置\n */\n async updateConfig(configId: string, updates: Partial<ExportConfig>): Promise<ExportConfig> {\n const existing = await this.getConfig(configId);\n if (!existing) {\n throw new ExportConfigError('配置不存在: ' + (configId));\n }\n\n const updatedConfig: ExportConfig = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n\n // 验证配置\n this.validateConfig(updatedConfig);\n\n // 更新缓存\n this.configCache.set(configId, {\n config: updatedConfig,\n timestamp: Date.now(),\n });\n\n // 触发事件\n this.emitEvent({\n type: 'config:save',\n exportId: configId,\n timestamp: new Date(),\n data: { config: updatedConfig },\n });\n\n return updatedConfig;\n }\n\n /**\n * 删除导出配置\n */\n async deleteConfig(configId: string): Promise<void> {\n const existing = await this.getConfig(configId);\n if (!existing) {\n throw new ExportConfigError('配置不存在: ' + (configId));\n }\n\n // 从缓存删除\n this.configCache.delete(configId);\n\n // 触发事件\n this.emitEvent({\n type: 'config:delete',\n exportId: configId,\n timestamp: new Date(),\n data: { configId },\n });\n }\n\n /**\n * 获取模块的配置列表\n */\n async getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]> {\n if (!this.client) {\n throw new ExportConfigError('未提供导出客户端服务', { moduleId, businessId });\n }\n return await this.client.getConfigsByModule(moduleId, businessId);\n }\n\n // ============= 导出执行 =============\n\n /**\n * 执行导出\n */\n async export(request: ExportRequest): Promise<ExportResult> {\n const exportId = this.generateId();\n const startTime = new Date();\n\n logger.info('🚀 [UniversalExportService] 开始导出:', {\n exportId,\n configId: request.configId,\n hasDataSource: !!request.dataSource,\n hasCallbacks: !!request.callbacks,\n });\n\n try {\n // 获取配置 - 支持直接传入配置对象或从缓存获取\n let config: ExportConfig;\n if (typeof request.configId === 'object' && request.configId !== null) {\n // 直接传入配置对象\n config = request.configId as ExportConfig;\n logger.info('📋 [UniversalExportService] 使用直接传入的配置:', {\n configId: config.id,\n configName: config.name,\n format: config.format,\n fieldsCount: config.fields.length,\n hasGrouping: !!config.grouping,\n groupingEnabled: config.grouping?.enabled,\n groupingFieldsCount: config.grouping?.fields?.length || 0,\n groupingFields:\n config.grouping?.fields?.map((f) => ({ key: f.key, mergeCells: f.mergeCells })) || [],\n });\n } else {\n // 从缓存获取配置\n logger.info('🔍 [UniversalExportService] 从缓存获取配置:', request.configId);\n const cachedConfig = await this.getConfig(request.configId as string);\n if (!cachedConfig) {\n throw new ExportConfigError('导出配置不存在: ' + (request.configId));\n }\n config = cachedConfig;\n logger.info('✅ [UniversalExportService] 成功获取缓存配置:', {\n configId: config.id,\n configName: config.name,\n });\n }\n\n // 创建进度对象\n const progress: ExportProgress = {\n exportId,\n status: 'pending',\n progress: 0,\n processedRows: 0,\n totalRows: 0,\n startTime,\n };\n\n this.activeExports.set(exportId, progress);\n\n // 触发开始事件\n this.emitEvent({\n type: 'export:start',\n exportId,\n timestamp: startTime,\n data: { config, request },\n });\n\n // 调用进度回调\n if (request.callbacks?.onProgress) {\n logger.info('📞 [UniversalExportService] 调用 onProgress 回调 - 开始');\n request.callbacks.onProgress(progress);\n }\n\n logger.info('📊 [UniversalExportService] 开始获取数据...');\n\n // 获取数据\n const data = await this.getData(request);\n logger.info('✅ [UniversalExportService] 数据获取成功:', {\n dataLength: data.length,\n firstItem: data[0] ? Object.keys(data[0]) : [],\n sampleData: data.slice(0, 2),\n });\n\n progress.totalRows = data.length;\n progress.status = 'processing';\n\n // 更新进度回调\n if (request.callbacks?.onProgress) {\n logger.info('📞 [UniversalExportService] 调用 onProgress 回调 - 数据处理');\n progress.progress = 30;\n request.callbacks.onProgress(progress);\n }\n\n // 过滤和排序数据\n logger.info('🔄 [UniversalExportService] 开始处理数据...');\n const processedData = await this.processData(data, request, config);\n logger.info('✅ [UniversalExportService] 数据处理完成:', {\n originalLength: data.length,\n processedLength: processedData.length,\n });\n\n // 更新进度回调\n if (request.callbacks?.onProgress) {\n logger.info('📞 [UniversalExportService] 调用 onProgress 回调 - 数据完成');\n progress.progress = 60;\n request.callbacks.onProgress(progress);\n }\n\n // 生成文件\n logger.info('📄 [UniversalExportService] 开始生成文件...');\n const result = await this.generateFile(processedData, config, request, exportId);\n logger.info('✅ [UniversalExportService] 文件生成成功:', {\n fileName: result.fileName,\n fileSize: result.fileSize,\n exportedRows: result.exportedRows,\n });\n\n // 更新进度\n progress.status = 'completed';\n progress.progress = 100;\n progress.processedRows = data.length;\n\n // 调用成功回调\n if (request.callbacks?.onSuccess) {\n logger.info('📞 [UniversalExportService] 调用 onSuccess 回调');\n request.callbacks.onSuccess(result);\n }\n\n // 触发完成事件\n this.emitEvent({\n type: 'export:complete',\n exportId,\n timestamp: new Date(),\n data: { result },\n });\n\n // 缓存结果\n this.resultCache.set(exportId, {\n result,\n timestamp: Date.now(),\n });\n\n // 清理进度\n this.activeExports.delete(exportId);\n\n return result;\n } catch (error) {\n const errorObj: ExportError = {\n code: 'EXPORT_FAILED',\n message: error instanceof Error ? error.message : '导出失败',\n details: { originalError: error },\n timestamp: new Date(),\n };\n\n // 更新进度\n const progress = this.activeExports.get(exportId);\n if (progress) {\n progress.status = 'failed';\n progress.error = errorObj.message;\n this.activeExports.delete(exportId);\n }\n\n // 调用错误回调\n if (request.callbacks?.onError) {\n logger.info('📞 [UniversalExportService] 调用 onError 回调');\n request.callbacks.onError(errorObj);\n }\n\n // 触发错误事件\n this.emitEvent({\n type: 'export:error',\n exportId,\n timestamp: new Date(),\n error: errorObj.message,\n data: { error: errorObj },\n });\n\n throw error;\n }\n }\n\n /**\n * 获取导出进度\n */\n getExportProgress(exportId: string): ExportProgress | null {\n return this.activeExports.get(exportId) || null;\n }\n\n /**\n * 取消导出\n */\n cancelExport(exportId: string): boolean {\n const progress = this.activeExports.get(exportId);\n if (!progress) {\n return false;\n }\n\n progress.status = 'cancelled';\n this.activeExports.delete(exportId);\n\n // 触发取消事件\n this.emitEvent({\n type: 'export:cancel',\n exportId,\n timestamp: new Date(),\n data: { progress },\n });\n\n return true;\n }\n\n // ============= 事件管理 =============\n\n /**\n * 添加事件监听器\n */\n addEventListener(type: string, listener: ExportEventListener): void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, []);\n }\n this.eventListeners.get(type)!.push(listener);\n }\n\n /**\n * 移除事件监听器\n */\n removeEventListener(type: string, listener: ExportEventListener): void {\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 生成唯一ID\n */\n private generateId(): string {\n return 'export_' + (Date.now()) + '_' + (Math.random().toString(36).substr(2, 9));\n }\n\n /**\n * 验证配置\n */\n private validateConfig(config: ExportConfig): void {\n if (!config.name || config.name.trim() === '') {\n throw new ExportConfigError('配置名称不能为空');\n }\n\n if (!config.fields || config.fields.length === 0) {\n throw new ExportConfigError('至少需要定义一个字段');\n }\n\n const enabledFields = config.fields.filter((f) => f.enabled);\n if (enabledFields.length === 0) {\n throw new ExportConfigError('至少需要启用一个字段');\n }\n\n // 检查字段键名唯一性\n const keys = config.fields.map((f) => f.key);\n const uniqueKeys = new Set(keys);\n if (keys.length !== uniqueKeys.size) {\n throw new ExportConfigError('字段键名必须唯一');\n }\n }\n\n /**\n * 获取数据\n */\n private async getData(request: ExportRequest): Promise<any[]> {\n logger.info('🔍 [UniversalExportService] getData 开始执行...');\n try {\n // 支持直接传递数据数组(用于客户端直接导出)\n if (Array.isArray(request.dataSource)) {\n logger.info('📦 [UniversalExportService] 使用直接传递的数据数组:', {\n length: request.dataSource.length,\n });\n return request.dataSource;\n }\n\n // 支持数据源函数(用于服务端导出)\n if (typeof request.dataSource === 'function') {\n logger.info('📞 [UniversalExportService] 调用数据源函数...');\n const data = await request.dataSource();\n logger.info('✅ [UniversalExportService] 数据源函数执行成功:', {\n dataType: typeof data,\n isArray: Array.isArray(data),\n length: Array.isArray(data) ? data.length : 'N/A',\n });\n return data;\n }\n\n // 这里可以扩展支持从API获取数据\n console.error('❌ [UniversalExportService] 数据源类型不支持:', typeof request.dataSource);\n throw new ExportDataError('不支持的数据源类型');\n } catch (error) {\n console.error('❌ [UniversalExportService] 获取数据失败:', error);\n throw new ExportDataError(\n '获取数据失败: ' + (error instanceof Error ? error.message : '未知错误'),\n { originalError: error }\n );\n }\n }\n\n /**\n * 处理数据\n */\n private async processData(\n data: any[],\n request: ExportRequest,\n config: ExportConfig\n ): Promise<any[]> {\n logger.info('🔄 [UniversalExportService] processData 开始执行:', {\n dataLength: data.length,\n hasFilters: !!(request.filters && request.filters.length > 0),\n hasSortBy: !!(request.sortBy && request.sortBy.length > 0),\n hasPagination: !!request.pagination,\n hasGrouping: !!(config.grouping && config.grouping.enabled),\n maxRows: config.maxRows,\n });\n\n // 🔍 详细调试分组配置\n logger.info('🔍 [UniversalExportService] 详细分组配置检查:', {\n configGrouping: config.grouping,\n groupingExists: !!config.grouping,\n groupingEnabled: config.grouping?.enabled,\n groupingFields: config.grouping?.fields,\n groupingFieldsLength: config.grouping?.fields?.length,\n });\n\n let processedData = [...data];\n\n // 应用过滤器\n if (request.filters && request.filters.length > 0) {\n logger.info('🔍 [UniversalExportService] 应用过滤器...');\n processedData = this.applyFilters(processedData, request.filters);\n logger.info('✅ [UniversalExportService] 过滤器应用完成:', {\n beforeLength: data.length,\n afterLength: processedData.length,\n });\n }\n\n // 应用排序\n if (request.sortBy && request.sortBy.length > 0) {\n logger.info('📊 [UniversalExportService] 应用排序...');\n processedData = this.applySorting(processedData, request.sortBy);\n logger.info('✅ [UniversalExportService] 排序应用完成');\n }\n\n // 应用分组\n if (config.grouping && config.grouping.enabled) {\n logger.info('📊 [UniversalExportService] 应用分组...');\n processedData = this.applyGrouping(processedData, config.grouping);\n logger.info('✅ [UniversalExportService] 分组应用完成:', {\n groupsCount: this.countGroups(processedData),\n resultLength: processedData.length,\n });\n }\n\n // 应用分页\n if (request.pagination) {\n logger.info('📄 [UniversalExportService] 应用分页...');\n const { page, pageSize } = request.pagination;\n const start = (page - 1) * pageSize;\n const end = start + pageSize;\n processedData = processedData.slice(start, end);\n logger.info('✅ [UniversalExportService] 分页应用完成:', {\n page,\n pageSize,\n start,\n end,\n resultLength: processedData.length,\n });\n }\n\n // 限制行数\n if (config.maxRows && processedData.length > config.maxRows) {\n logger.info('📏 [UniversalExportService] 应用行数限制...');\n processedData = processedData.slice(0, config.maxRows);\n logger.info('✅ [UniversalExportService] 行数限制应用完成:', {\n maxRows: config.maxRows,\n resultLength: processedData.length,\n });\n }\n\n logger.info('✅ [UniversalExportService] processData 执行完成:', {\n originalLength: data.length,\n finalLength: processedData.length,\n });\n\n return processedData;\n }\n\n /**\n * 应用过滤器\n */\n private applyFilters(data: any[], filters: any[]): any[] {\n return data.filter((item) => {\n return filters.every((filter) => {\n const value = this.getNestedValue(item, filter.field);\n\n switch (filter.operator) {\n case 'eq':\n return value === filter.value;\n case 'ne':\n return value !== filter.value;\n case 'gt':\n return value > filter.value;\n case 'gte':\n return value >= filter.value;\n case 'lt':\n return value < filter.value;\n case 'lte':\n return value <= filter.value;\n case 'contains':\n return String(value).includes(String(filter.value));\n case 'startsWith':\n return String(value).startsWith(String(filter.value));\n case 'endsWith':\n return String(value).endsWith(String(filter.value));\n case 'in':\n return Array.isArray(filter.value) && filter.value.includes(value);\n case 'notIn':\n return Array.isArray(filter.value) && !filter.value.includes(value);\n default:\n return true;\n }\n });\n });\n }\n\n /**\n * 应用排序\n */\n private applySorting(data: any[], sortBy: any[]): any[] {\n return data.sort((a, b) => {\n for (const sort of sortBy) {\n const aValue = this.getNestedValue(a, sort.field);\n const bValue = this.getNestedValue(b, sort.field);\n\n if (aValue < bValue) {\n return sort.direction === 'asc' ? -1 : 1;\n }\n if (aValue > bValue) {\n return sort.direction === 'asc' ? 1 : -1;\n }\n }\n return 0;\n });\n }\n\n /**\n * 获取嵌套值\n */\n private getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => {\n return current && current[key] !== undefined ? current[key] : null;\n }, obj);\n }\n\n /**\n * 过滤掉所有行都为空值的字段\n */\n private filterEmptyFields(data: any[], fields: ExportField[]): ExportField[] {\n const filteredFields = fields.filter((field) => {\n // 特殊处理:强制保留某些重要字段,即使所有行都为空值\n const forceKeepFields = ['pickupMethod', 'notes', 'adminNotes'];\n if (forceKeepFields.includes(field.key)) {\n logger.info('🔧 [UniversalExportService] 强制保留字段 \"' + (field.key) + '\" (' + (field.label) + ')');\n return true;\n }\n\n // 检查所有数据行,如果至少有一行该字段有值,则保留该字段\n const hasValue = data.some((item) => {\n const value = this.getNestedValue(item, field.key);\n return value !== null && value !== undefined && value !== '';\n });\n\n if (!hasValue) {\n logger.info(\n '🔍 [UniversalExportService] 字段 \"' + (field.key) + '\" (' + (field.label) + ') 被过滤掉 - 所有行都为空值'\n );\n }\n\n return hasValue;\n });\n\n logger.info('📊 [UniversalExportService] 字段过滤结果:', {\n 原始字段数: fields.length,\n 过滤后字段数: filteredFields.length,\n 被过滤的字段: fields.filter((f) => !filteredFields.includes(f)).map((f) => f.key),\n 保留的字段: filteredFields.map((f) => f.key),\n });\n\n return filteredFields;\n }\n\n /**\n * 生成文件\n */\n private async generateFile(\n data: any[],\n config: ExportConfig,\n request: ExportRequest,\n exportId: string\n ): Promise<ExportResult> {\n const startTime = new Date();\n const enabledFields = config.fields.filter((f) => f.enabled);\n\n logger.info('📄 [UniversalExportService] generateFile 开始执行:', {\n dataLength: data.length,\n enabledFieldsCount: enabledFields.length,\n format: config.format,\n enabledFields: enabledFields.map((f) => ({ key: f.key, label: f.label })),\n });\n\n try {\n let content: string;\n let fileName: string;\n\n switch (config.format) {\n case 'csv':\n logger.info('📊 [UniversalExportService] 生成CSV格式...');\n content = this.generateCSV(data, enabledFields, config);\n fileName = this.generateFileName(\n request.customFileName || config.fileNameTemplate,\n 'csv'\n );\n logger.info('✅ [UniversalExportService] CSV生成完成:', {\n contentLength: content.length,\n fileName,\n });\n break;\n case 'excel':\n logger.info('📊 [UniversalExportService] 生成Excel格式...');\n const excelBuffer = this.generateExcel(data, enabledFields, config);\n fileName = this.generateFileName(\n request.customFileName || config.fileNameTemplate,\n 'xlsx'\n );\n logger.info('✅ [UniversalExportService] Excel生成完成:', {\n bufferLength: excelBuffer.byteLength,\n fileName,\n });\n // 创建Excel Blob\n const excelBlob = new Blob([excelBuffer], { type: this.getMimeType(config.format) });\n const endTime = new Date();\n const duration = endTime.getTime() - startTime.getTime();\n return {\n exportId,\n fileName,\n fileSize: excelBlob.size,\n fileBlob: excelBlob,\n exportedRows: data.length,\n startTime,\n endTime,\n duration,\n statistics: {\n totalRows: data.length,\n filteredRows: data.length,\n exportedRows: data.length,\n skippedRows: 0,\n },\n };\n case 'json':\n logger.info('📄 [UniversalExportService] 生成JSON格式...');\n content = this.generateJSON(data, enabledFields);\n fileName = this.generateFileName(\n request.customFileName || config.fileNameTemplate,\n 'json'\n );\n logger.info('✅ [UniversalExportService] JSON生成完成:', {\n contentLength: content.length,\n fileName,\n });\n break;\n default:\n console.error('❌ [UniversalExportService] 不支持的格式:', config.format);\n throw new ExportFileError('不支持的导出格式: ' + (config.format));\n }\n\n // 创建Blob\n const blob = new Blob([content], { type: this.getMimeType(config.format) });\n\n // 检查文件大小\n if (blob.size > this.config.maxFileSize) {\n throw new ExportFileError('文件大小超过限制: ' + (blob.size) + ' > ' + (this.config.maxFileSize));\n }\n\n const endTime = new Date();\n const duration = endTime.getTime() - startTime.getTime();\n\n return {\n exportId,\n fileName,\n fileSize: blob.size,\n fileBlob: blob,\n exportedRows: data.length,\n startTime,\n endTime,\n duration,\n statistics: {\n totalRows: data.length,\n filteredRows: data.length,\n exportedRows: data.length,\n skippedRows: 0,\n },\n };\n } catch (error) {\n throw new ExportFileError(\n '生成文件失败: ' + (error instanceof Error ? error.message : '未知错误'),\n { originalError: error }\n );\n }\n }\n\n /**\n * 生成CSV内容\n */\n private generateCSV(data: any[], fields: ExportField[], config: ExportConfig): string {\n logger.info('📊 [UniversalExportService] generateCSV 开始执行:', {\n dataLength: data.length,\n fieldsCount: fields.length,\n includeHeader: config.includeHeader,\n delimiter: config.delimiter,\n addBOM: config.addBOM,\n });\n\n const lines: string[] = [];\n\n // 添加BOM\n if (config.addBOM) {\n lines.push('\\uFEFF');\n logger.info('📝 [UniversalExportService] 添加BOM');\n }\n\n // 过滤掉所有行都为空值的字段\n const nonEmptyFields = this.filterEmptyFields(data, fields);\n logger.info('📊 [UniversalExportService] 过滤空字段:', {\n originalFieldsCount: fields.length,\n nonEmptyFieldsCount: nonEmptyFields.length,\n removedFields: fields\n .filter((f: ExportField) => !nonEmptyFields.includes(f))\n .map((f: ExportField) => f.key),\n });\n\n // 添加表头\n if (config.includeHeader) {\n const headers = nonEmptyFields.map((f) => this.escapeCSVField(f.label));\n lines.push(headers.join(config.delimiter));\n logger.info('📋 [UniversalExportService] 添加表头:', headers);\n }\n\n // 添加数据行\n logger.info('📊 [UniversalExportService] 开始处理数据行...');\n for (let i = 0; i < data.length; i++) {\n const item = data[i];\n if (i === 0) {\n logger.info('📊 [UniversalExportService] 第一行数据示例:', item);\n }\n\n const row = nonEmptyFields.map((field) => {\n // 处理分组头行\n if (item.__isGroupHeader) {\n return this.escapeCSVField(item[field.key] || '');\n }\n\n let value = this.getNestedValue(item, field.key);\n\n // 应用格式化器\n if (field.formatter) {\n value = field.formatter(value);\n } else if (DEFAULT_FORMATTERS[field.type]) {\n value = DEFAULT_FORMATTERS[field.type](value);\n } else {\n value = String(value || '');\n }\n\n return this.escapeCSVField(value);\n });\n\n lines.push(row.join(config.delimiter));\n\n if (i === 0) {\n logger.info('📊 [UniversalExportService] 第一行处理结果:', row);\n }\n }\n\n const result = lines.join('\\n');\n logger.info('✅ [UniversalExportService] CSV生成完成:', {\n totalLines: lines.length,\n resultLength: result.length,\n });\n return result;\n }\n\n /**\n * 生成JSON内容\n */\n private generateJSON(data: any[], fields: ExportField[]): string {\n const processedData = data.map((item) => {\n const processed: Record<string, any> = {};\n\n for (const field of fields) {\n let value = this.getNestedValue(item, field.key);\n\n // 应用格式化器\n if (field.formatter) {\n value = field.formatter(value);\n } else if (DEFAULT_FORMATTERS[field.type]) {\n value = DEFAULT_FORMATTERS[field.type](value);\n }\n\n processed[field.key] = value;\n }\n\n return processed;\n });\n\n return JSON.stringify(processedData, null, 2);\n }\n\n /**\n * 转义CSV字段\n */\n private escapeCSVField(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return '\"' + (value.replace(/\"/g, '\"\"')) + '\"';\n }\n return value;\n }\n\n /**\n * 生成文件名\n */\n private generateFileName(template: string, extension: string): string {\n const now = new Date();\n const dateStr = now.toISOString().split('T')[0];\n const timeStr = now.toTimeString().split(' ')[0].replace(/:/g, '-');\n\n return (\n template\n .replace('{date}', dateStr)\n .replace('{time}', timeStr)\n .replace('{timestamp}', now.getTime().toString()) + '.' + (extension)\n );\n }\n\n /**\n * 获取MIME类型\n */\n private getMimeType(format: ExportFormat): string {\n switch (format) {\n case 'csv':\n return 'text/csv; charset=utf-8';\n case 'json':\n return 'application/json; charset=utf-8';\n case 'excel':\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n default:\n return 'application/octet-stream';\n }\n }\n\n /**\n * 触发事件\n */\n private emitEvent(event: ExportEvent): void {\n const listeners = this.eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((listener) => {\n try {\n listener(event);\n } catch (error) {\n console.error('事件监听器执行失败:', error);\n }\n });\n }\n }\n\n // ============= 分组相关方法 =============\n\n /**\n * 应用分组\n */\n private applyGrouping(data: any[], groupingConfig: GroupingConfig): any[] {\n logger.info('📊 [UniversalExportService] applyGrouping 开始执行:', {\n dataLength: data.length,\n groupingFields: groupingConfig.fields.map((f) => f.key),\n preserveOrder: groupingConfig.preserveOrder,\n });\n\n if (!groupingConfig.fields || groupingConfig.fields.length === 0) {\n return data;\n }\n\n // 按分组字段对数据进行分组\n const grouped = this.groupDataByFields(data, groupingConfig);\n\n // 处理分组后的数据\n const result = this.processGroupedData(grouped, groupingConfig);\n\n logger.info('✅ [UniversalExportService] applyGrouping 执行完成:', {\n originalLength: data.length,\n groupedLength: result.length,\n });\n\n return result;\n }\n\n /**\n * 按字段分组数据\n */\n private groupDataByFields(data: any[], groupingConfig: GroupingConfig): Map<string, any[]> {\n const groups = new Map<string, any[]>();\n\n for (const item of data) {\n // 生成分组键\n const groupKey = this.generateGroupKey(item, groupingConfig.fields);\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n }\n\n return groups;\n }\n\n /**\n * 生成分组键\n */\n private generateGroupKey(item: any, groupingFields: GroupingField[]): string {\n const keyParts = groupingFields.map((field) => {\n const value = this.getNestedValue(item, field.key);\n\n // 处理空值\n if (value === null || value === undefined || value === '') {\n return '__NULL__';\n }\n\n return String(value);\n });\n\n return keyParts.join('|');\n }\n\n /**\n * 处理分组后的数据\n */\n private processGroupedData(groups: Map<string, any[]>, groupingConfig: GroupingConfig): any[] {\n const result: any[] = [];\n\n for (const [groupKey, groupItems] of groups) {\n if (groupItems.length === 0) continue;\n\n // 解析分组键\n const groupValues = groupKey.split('|');\n\n // 处理分组\n const processedGroup = this.processGroup(groupItems, groupingConfig, groupValues);\n result.push(...processedGroup);\n }\n\n return result;\n }\n\n /**\n * 处理单个分组\n */\n private processGroup(\n groupItems: any[],\n groupingConfig: GroupingConfig,\n groupValues: string[]\n ): any[] {\n const result: any[] = [];\n\n // 添加分组头行(如果需要)\n const showGroupHeader = groupingConfig.fields.some((f) => f.showGroupHeader);\n if (showGroupHeader) {\n const groupHeader = this.createGroupHeader(groupValues, groupingConfig.fields);\n result.push(groupHeader);\n }\n\n // 处理分组模式 - 对于多字段分组,使用特殊处理\n if (groupingConfig.fields.length > 1) {\n // 多字段合并模式\n result.push(...this.processMultiFieldMergeMode(groupItems, groupingConfig.fields));\n } else {\n // 单字段分组\n const primaryGroupField = groupingConfig.fields[0];\n\n switch (primaryGroupField.mode) {\n case 'merge':\n // 合并模式:第一行显示分组值,其他行为空\n result.push(...this.processMergeMode(groupItems, primaryGroupField));\n break;\n case 'separate':\n // 分离模式:每个分组独立显示\n result.push(...groupItems);\n break;\n case 'nested':\n // 嵌套模式:支持多级分组\n result.push(...this.processNestedMode(groupItems, groupingConfig));\n break;\n default:\n result.push(...groupItems);\n }\n }\n\n return result;\n }\n\n /**\n * 创建分组头行\n */\n private createGroupHeader(groupValues: string[], groupingFields: GroupingField[]): any {\n const header: any = { __isGroupHeader: true };\n\n groupingFields.forEach((field, index) => {\n const value = groupValues[index] === '__NULL__' ? '' : groupValues[index];\n const template = field.groupHeaderTemplate || (field.label) + ': {value}';\n header[field.key] = template.replace('{value}', value);\n });\n\n return header;\n }\n\n /**\n * 处理合并模式\n */\n private processMergeMode(groupItems: any[], groupField: GroupingField): any[] {\n if (groupItems.length === 0) return [];\n\n const result: any[] = [];\n\n // 第一行保持原样\n const firstItem = { ...groupItems[0] };\n firstItem.__groupSize = groupItems.length;\n firstItem.__isGroupFirst = true;\n result.push(firstItem);\n\n // 其他行的分组字段设置为空,用于合并单元格\n for (let i = 1; i < groupItems.length; i++) {\n const item = { ...groupItems[i] };\n item[groupField.key] = ''; // 空值表示需要合并\n item.__isGroupChild = true;\n item.__groupIndex = i;\n result.push(item);\n }\n\n return result;\n }\n\n /**\n * 处理多字段合并模式\n */\n private processMultiFieldMergeMode(groupItems: any[], groupFields: GroupingField[]): any[] {\n if (groupItems.length === 0) return [];\n\n const result: any[] = [];\n\n // 第一行保持原样,添加分组标记\n const firstItem = { ...groupItems[0] };\n firstItem.__groupSize = groupItems.length;\n firstItem.__isGroupFirst = true;\n\n // 为每个分组字段标记\n groupFields.forEach((field) => {\n firstItem['__' + (field.key) + '_groupSize'] = groupItems.length;\n firstItem['__' + (field.key) + '_isGroupFirst'] = true;\n });\n\n result.push(firstItem);\n\n logger.info('🔗 [UniversalExportService] 处理多字段合并模式:', {\n groupItemsLength: groupItems.length,\n groupFields: groupFields.map((f) => f.key),\n firstItem: firstItem,\n });\n\n // 其他行的所有分组字段设置为空,用于合并单元格\n for (let i = 1; i < groupItems.length; i++) {\n const item = { ...groupItems[i] };\n\n // 清空所有分组字段的值,用于单元格合并\n groupFields.forEach((field) => {\n item[field.key] = ''; // 空值表示需要合并\n });\n\n item.__isGroupChild = true;\n item.__groupIndex = i;\n result.push(item);\n }\n\n return result;\n }\n\n /**\n * 处理嵌套模式\n */\n private processNestedMode(groupItems: any[], groupingConfig: GroupingConfig): any[] {\n // 如果只有一个分组字段,按merge模式处理\n if (groupingConfig.fields.length === 1) {\n return this.processMergeMode(groupItems, groupingConfig.fields[0]);\n }\n\n // 多级分组:递归处理下一级\n const subGroupingConfig: GroupingConfig = {\n ...groupingConfig,\n fields: groupingConfig.fields.slice(1),\n };\n\n return this.applyGrouping(groupItems, subGroupingConfig);\n }\n\n /**\n * 统计分组数量\n */\n private countGroups(data: any[]): number {\n const groupHeaders = data.filter((item) => item.__isGroupHeader);\n const groupFirsts = data.filter((item) => item.__isGroupFirst);\n return Math.max(groupHeaders.length, groupFirsts.length);\n }\n\n /**\n * 生成Excel文件\n */\n private generateExcel(data: any[], fields: ExportField[], config: ExportConfig): ArrayBuffer {\n logger.info('📊 [UniversalExportService] generateExcel 开始执行:', {\n dataLength: data.length,\n fieldsCount: fields.length,\n hasGrouping: !!(config.grouping && config.grouping.enabled),\n });\n\n // 创建工作簿\n const workbook = XLSX.utils.book_new();\n\n // 过滤掉所有行都为空值的字段\n const nonEmptyFields = this.filterEmptyFields(data, fields);\n\n // 准备数据\n const worksheetData = this.prepareExcelData(data, nonEmptyFields, config);\n\n // 创建工作表\n const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);\n\n // 应用分组和合并单元格\n if (config.grouping && config.grouping.enabled) {\n this.applyExcelGrouping(\n worksheet,\n data,\n nonEmptyFields,\n config.grouping,\n config.includeHeader\n );\n }\n\n // 设置列宽和样式\n this.setExcelColumnWidths(worksheet, nonEmptyFields);\n\n // 为所有数据单元格添加边框\n this.applyExcelDataStyles(worksheet, config.includeHeader);\n\n // 添加工作表到工作簿\n XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');\n\n // 生成文件\n const excelBuffer = XLSX.write(workbook, {\n bookType: 'xlsx',\n type: 'array',\n cellStyles: true,\n });\n\n logger.info('✅ [UniversalExportService] generateExcel 执行完成');\n return excelBuffer;\n }\n\n /**\n * 准备Excel数据\n */\n private prepareExcelData(data: any[], fields: ExportField[], config: ExportConfig): any[][] {\n const result: any[][] = [];\n\n logger.info('📊 [UniversalExportService] 准备Excel数据:', {\n dataLength: data.length,\n fieldsCount: fields.length,\n includeHeader: config.includeHeader,\n hasGrouping: !!(config.grouping && config.grouping.enabled),\n });\n\n // 添加表头\n if (config.includeHeader) {\n const headers = fields.map((field) => field.label);\n result.push(headers);\n logger.info('📋 [UniversalExportService] 添加表头:', headers);\n }\n\n // 添加数据行\n for (let i = 0; i < data.length; i++) {\n const item = data[i];\n\n const row = fields.map((field) => {\n // 跳过分组头行的处理\n if (item.__isGroupHeader) {\n return item[field.key] || '';\n }\n\n let value = this.getNestedValue(item, field.key);\n\n // 应用格式化器\n if (field.formatter) {\n value = field.formatter(value);\n } else if (DEFAULT_FORMATTERS[field.type]) {\n value = DEFAULT_FORMATTERS[field.type](value);\n } else {\n value = String(value || '');\n }\n\n return value;\n });\n\n result.push(row);\n\n if (i === 0) {\n logger.info('📊 [UniversalExportService] 第一行数据示例:', row);\n }\n }\n\n logger.info('✅ [UniversalExportService] Excel数据准备完成:', {\n totalRows: result.length,\n headerRows: config.includeHeader ? 1 : 0,\n dataRows: result.length - (config.includeHeader ? 1 : 0),\n });\n\n return result;\n }\n\n /**\n * 应用Excel分组和合并单元格\n */\n private applyExcelGrouping(\n worksheet: XLSX.WorkSheet,\n data: any[],\n fields: ExportField[],\n groupingConfig: GroupingConfig,\n includeHeader: boolean = true\n ): void {\n if (!worksheet['!merges']) {\n worksheet['!merges'] = [];\n }\n\n const headerOffset = includeHeader ? 1 : 0; // 是否有表头\n let currentRow = headerOffset;\n\n logger.info('📊 [UniversalExportService] 开始处理Excel分组和合并单元格:', {\n dataLength: data.length,\n headerOffset,\n groupingFields: groupingConfig.fields.map((f) => ({ key: f.key, mergeCells: f.mergeCells })),\n });\n\n for (let i = 0; i < data.length; i++) {\n const item = data[i];\n\n if (item.__isGroupFirst && item.__groupSize > 1) {\n logger.info('🔗 [UniversalExportService] 处理分组合并:', {\n row: currentRow,\n groupSize: item.__groupSize,\n item: item,\n });\n\n // 找到需要合并的分组字段\n groupingConfig.fields.forEach((groupField) => {\n if (groupField.mergeCells) {\n const fieldIndex = fields.findIndex((f) => f.key === groupField.key);\n if (fieldIndex >= 0) {\n // 获取分组大小 - 优先使用字段特定的分组大小\n const groupSize = item['__' + (groupField.key) + '_groupSize'] || item.__groupSize;\n\n // 创建合并区域\n const mergeRange = {\n s: { r: currentRow, c: fieldIndex }, // 开始行列\n e: { r: currentRow + groupSize - 1, c: fieldIndex }, // 结束行列\n };\n\n logger.info('📊 [UniversalExportService] 添加合并区域:', {\n field: groupField.key,\n fieldIndex,\n groupSize,\n mergeRange,\n });\n\n worksheet['!merges']!.push(mergeRange);\n\n // 为合并单元格添加样式\n const startCellAddress = XLSX.utils.encode_cell(mergeRange.s);\n if (worksheet[startCellAddress]) {\n worksheet[startCellAddress].s = {\n ...worksheet[startCellAddress].s,\n alignment: { horizontal: 'center', vertical: 'middle' },\n fill: { fgColor: { rgb: 'F2F2F2' } },\n border: {\n top: { style: 'thin', color: { rgb: '000000' } },\n bottom: { style: 'thin', color: { rgb: '000000' } },\n left: { style: 'thin', color: { rgb: '000000' } },\n right: { style: 'thin', color: { rgb: '000000' } },\n },\n };\n }\n }\n }\n });\n }\n\n currentRow++;\n }\n\n logger.info('✅ [UniversalExportService] Excel分组和合并单元格处理完成:', {\n totalMerges: worksheet['!merges']?.length || 0,\n });\n }\n\n /**\n * 设置Excel列宽和样式\n */\n private setExcelColumnWidths(worksheet: XLSX.WorkSheet, fields: ExportField[]): void {\n const colWidths = fields.map((field) => ({\n wch: field.width || 15, // 默认宽度15字符\n }));\n\n worksheet['!cols'] = colWidths;\n\n // 设置表头样式\n if (worksheet['!ref']) {\n const range = XLSX.utils.decode_range(worksheet['!ref']);\n for (let col = range.s.c; col <= range.e.c; col++) {\n const cellAddress = XLSX.utils.encode_cell({ r: 0, c: col });\n if (worksheet[cellAddress]) {\n // 为表头添加样式\n worksheet[cellAddress].s = {\n font: { bold: true, color: { rgb: 'FFFFFF' } },\n fill: { fgColor: { rgb: '4472C4' } },\n alignment: { horizontal: 'center', vertical: 'center' },\n border: {\n top: { style: 'thin', color: { rgb: '000000' } },\n bottom: { style: 'thin', color: { rgb: '000000' } },\n left: { style: 'thin', color: { rgb: '000000' } },\n right: { style: 'thin', color: { rgb: '000000' } },\n },\n };\n }\n }\n }\n\n logger.info('✅ [UniversalExportService] Excel列宽和样式设置完成:', {\n columnsCount: colWidths.length,\n columnWidths: colWidths.map((col, index) => ({ field: fields[index]?.key, width: col.wch })),\n });\n }\n\n /**\n * 为Excel数据单元格应用样式\n */\n private applyExcelDataStyles(worksheet: XLSX.WorkSheet, includeHeader: boolean = true): void {\n if (!worksheet['!ref']) return;\n\n const range = XLSX.utils.decode_range(worksheet['!ref']);\n const startRow = includeHeader ? 1 : 0; // 跳过表头\n\n logger.info('🎨 [UniversalExportService] 开始应用Excel数据样式:', {\n totalRows: range.e.r + 1,\n totalCols: range.e.c + 1,\n startRow,\n });\n\n // 为数据单元格添加边框和对齐\n for (let row = startRow; row <= range.e.r; row++) {\n for (let col = range.s.c; col <= range.e.c; col++) {\n const cellAddress = XLSX.utils.encode_cell({ r: row, c: col });\n if (worksheet[cellAddress]) {\n // 保留已有样式(如合并单元格的样式)\n const existingStyle = worksheet[cellAddress].s || {};\n\n worksheet[cellAddress].s = {\n ...existingStyle,\n border: {\n top: { style: 'thin', color: { rgb: 'CCCCCC' } },\n bottom: { style: 'thin', color: { rgb: 'CCCCCC' } },\n left: { style: 'thin', color: { rgb: 'CCCCCC' } },\n right: { style: 'thin', color: { rgb: 'CCCCCC' } },\n },\n alignment: {\n ...existingStyle.alignment,\n vertical: 'center',\n },\n };\n }\n }\n }\n\n logger.info('✅ [UniversalExportService] Excel数据样式应用完成');\n }\n}\n","/**\n * UniversalExport Service 工厂函数\n * 提供简化的服务初始化方式\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\n/**\n * 创建导出服务配置(带智能默认值)\n */\nexport function createExportServiceConfig(\n options: Partial<UniversalExportServiceConfig> = {}\n): UniversalExportServiceConfig {\n return {\n db: options.db,\n exportDir: options.exportDir || process.env.EXPORT_DIR || './exports',\n tempDir: options.tempDir || process.env.TEMP_DIR || './temp',\n maxRows: options.maxRows || 100000, // 默认最多导出 10 万行\n enableStreaming: options.enableStreaming !== false, // 默认启用流式导出\n timeout: options.timeout || 300000, // 默认超时 5 分钟\n };\n}\n\n/**\n * 创建导出服务实例(简化版)\n *\n * @example\n * ```typescript\n * // 最简配置\n * const service = createUniversalExportService();\n *\n * // 标准配置\n * const service = createUniversalExportService({\n * db: drizzleDb,\n * exportDir: './exports',\n * maxRows: 50000,\n * });\n * ```\n */\nexport function createUniversalExportService(\n options: Partial<UniversalExportServiceConfig> = {}\n) {\n const config = createExportServiceConfig(options);\n\n // 注意:实际的 UniversalExportService 将在后续 Phase 中迁移\n // 这里先返回一个占位对象,包含基本的类型信息\n console.warn(\n '⚠️ UniversalExportService 的完整实现将在后续 Phase 中迁移到 Sa2kit。\\n' +\n ' 当前版本仅包含类型定义和配置工厂函数。\\n' +\n ' 请暂时继续从 LyricNote 的 lib/universalExport 导入服务类。'\n );\n\n return {\n config,\n // 占位方法\n async export() {\n throw new Error('UniversalExportService 尚未完全迁移,请从 LyricNote 导入');\n },\n async createTask() {\n throw new Error('UniversalExportService 尚未完全迁移,请从 LyricNote 导入');\n },\n };\n}\n\n/**\n * 从环境变量创建配置(便利函数)\n *\n * @example\n * ```typescript\n * // .env\n * // EXPORT_DIR=./exports\n * // EXPORT_MAX_ROWS=50000\n *\n * const service = createExportServiceFromEnv();\n * ```\n */\nexport function createExportServiceFromEnv(db?: any) {\n return createUniversalExportService({\n db,\n exportDir: process.env.EXPORT_DIR,\n tempDir: process.env.TEMP_DIR,\n maxRows: process.env.EXPORT_MAX_ROWS\n ? parseInt(process.env.EXPORT_MAX_ROWS)\n : undefined,\n });\n}\n\n","/**\n * UniversalExport 预设配置\n * 提供常见场景的开箱即用配置\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\n/**\n * 小型应用预设(数据量小)\n */\nexport function createSmallAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 10000, // 1万行\n timeout: 60000, // 1分钟\n enableStreaming: false, // 小数据量不需要流式导出\n };\n}\n\n/**\n * 中型应用预设(默认配置)\n */\nexport function createMediumAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 100000, // 10万行\n timeout: 300000, // 5分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 大型应用预设(数据量大)\n */\nexport function createLargeAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 1000000, // 100万行\n timeout: 600000, // 10分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 实时导出预设(快速响应)\n */\nexport function createRealtimeExportPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 5000, // 5千行\n timeout: 30000, // 30秒\n enableStreaming: false,\n };\n}\n\n/**\n * 批量导出预设(大批量、离线处理)\n */\nexport function createBatchExportPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: Number.MAX_SAFE_INTEGER, // 不限制\n timeout: 1800000, // 30分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 智能预设:根据环境自动选择\n */\nexport function createSmartExportPreset(): Partial<UniversalExportServiceConfig> {\n const envMaxRows = process.env.EXPORT_MAX_ROWS;\n\n if (envMaxRows) {\n const maxRows = parseInt(envMaxRows);\n\n // 根据配置的最大行数自动选择合适的预设\n if (maxRows <= 10000) {\n return createSmallAppPreset();\n } else if (maxRows <= 100000) {\n return createMediumAppPreset();\n } else {\n return createLargeAppPreset();\n }\n }\n\n // 默认使用中型应用预设\n return createMediumAppPreset();\n}\n\n","/**\n * UniversalExport 配置验证\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\nexport class ConfigValidationError extends Error {\n constructor(message: string, public field: string) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\n/**\n * 验证导出服务配置\n */\nexport function validateExportConfig(config: UniversalExportServiceConfig): void {\n // 验证导出目录\n if (!config.exportDir) {\n throw new ConfigValidationError('exportDir is required', 'exportDir');\n }\n\n // 验证临时目录\n if (!config.tempDir) {\n throw new ConfigValidationError('tempDir is required', 'tempDir');\n }\n\n // 验证最大行数\n if (config.maxRows && config.maxRows <= 0) {\n throw new ConfigValidationError(\n 'maxRows must be greater than 0',\n 'maxRows'\n );\n }\n\n // 验证超时时间\n if (config.timeout && config.timeout <= 0) {\n throw new ConfigValidationError(\n 'timeout must be greater than 0',\n 'timeout'\n );\n }\n\n // 安全建议\n if (config.maxRows && config.maxRows > 1000000) {\n console.warn(\n '⚠️ Warning: maxRows (' + (config.maxRows) + ') is very large. ' +\n `Consider using pagination or streaming for better performance.`\n );\n }\n}\n\n/**\n * 验证环境变量\n */\nexport function validateEnvironment(requiredVars: string[]): void {\n const missing: string[] = [];\n\n for (const varName of requiredVars) {\n if (!process.env[varName]) {\n missing.push(varName);\n }\n }\n\n if (missing.length > 0) {\n throw new ConfigValidationError(\n 'Missing required environment variables: ' + (missing.join(', ')),\n 'environment'\n );\n }\n}\n\n","/**\n * UniversalExport Server 工具函数\n */\n\nimport type { ExportField, FieldType } from '../../types';\n\n/**\n * 格式化字段值\n *\n * @param value 原始值\n * @param field 字段定义\n * @returns 格式化后的值\n */\nexport function formatFieldValue(value: any, field: ExportField): string {\n // 如果字段有自定义格式化函数,使用它\n if (field.formatter) {\n return field.formatter(value);\n }\n\n // 空值处理\n if (value === null || value === undefined) {\n return '';\n }\n\n // 根据字段类型进行默认格式化\n switch (field.type) {\n case 'date':\n return value instanceof Date\n ? (value.toISOString().split('T')[0] || '')\n : String(value);\n\n case 'boolean':\n return value ? '是' : '否';\n\n case 'array':\n return Array.isArray(value) ? value.join(', ') : String(value);\n\n case 'object':\n return typeof value === 'object'\n ? JSON.stringify(value)\n : String(value);\n\n case 'number':\n return typeof value === 'number'\n ? value.toLocaleString()\n : String(value);\n\n default:\n return String(value);\n }\n}\n\n/**\n * 验证字段值\n *\n * @param value 字段值\n * @param field 字段定义\n * @returns 是否有效\n */\nexport function validateFieldValue(value: any, field: ExportField): boolean {\n // 必填字段检查\n if (field.required && (value === null || value === undefined || value === '')) {\n return false;\n }\n\n // 类型检查\n switch (field.type) {\n case 'number':\n return typeof value === 'number' || !isNaN(Number(value));\n\n case 'boolean':\n return typeof value === 'boolean';\n\n case 'array':\n return Array.isArray(value);\n\n case 'object':\n return typeof value === 'object';\n\n case 'date':\n return value instanceof Date || !isNaN(Date.parse(value));\n\n default:\n return true;\n }\n}\n\n/**\n * 转换字段类型\n *\n * @param value 原始值\n * @param targetType 目标类型\n * @returns 转换后的值\n */\nexport function convertFieldType(value: any, targetType: FieldType): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n switch (targetType) {\n case 'string':\n return String(value);\n\n case 'number':\n return Number(value);\n\n case 'boolean':\n return Boolean(value);\n\n case 'date':\n return value instanceof Date ? value : new Date(value);\n\n case 'array':\n return Array.isArray(value) ? value : [value];\n\n case 'object':\n return typeof value === 'object' ? value : { value };\n\n default:\n return value;\n }\n}\n\n/**\n * 安全获取嵌套属性值\n *\n * @param obj 对象\n * @param path 属性路径(支持点号分隔)\n * @returns 属性值\n *\n * @example\n * ```typescript\n * const obj = { user: { name: 'John', age: 30 } };\n * getNestedValue(obj, 'user.name') // 'John'\n * getNestedValue(obj, 'user.email') // undefined\n * ```\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n}\n\n/**\n * 转义 CSV 字段值\n *\n * @param value 字段值\n * @returns 转义后的值\n */\nexport function escapeCsvValue(value: string): string {\n // 如果包含逗号、引号或换行符,需要用引号包裹并转义引号\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return '\"' + (value.replace(/\"/g, '\"\"')) + '\"';\n }\n return value;\n}\n\n/**\n * 生成唯一的文件名\n *\n * @param prefix 前缀\n * @param extension 扩展名\n * @returns 唯一文件名\n *\n * @example\n * ```typescript\n * generateUniqueFilename('export', 'xlsx')\n * // 'export_20231111_123456_abc123.xlsx'\n * ```\n */\nexport function generateUniqueFilename(prefix: string, extension: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5);\n const random = Math.random().toString(36).substring(2, 8);\n return (prefix) + '_' + (timestamp) + '_' + (random) + '.' + (extension);\n}\n\n/**\n * 计算导出进度百分比\n *\n * @param processed 已处理行数\n * @param total 总行数\n * @returns 百分比(0-100)\n */\nexport function calculateProgress(processed: number, total: number): number {\n if (total === 0) return 0;\n return Math.min(Math.round((processed / total) * 100), 100);\n}\n\n/**\n * 估算剩余时间(秒)\n *\n * @param processed 已处理行数\n * @param total 总行数\n * @param elapsedMs 已用时间(毫秒)\n * @returns 剩余时间(秒)\n */\nexport function estimateRemainingTime(\n processed: number,\n total: number,\n elapsedMs: number\n): number {\n if (processed === 0) return 0;\n const avgTimePerRow = elapsedMs / processed;\n const remainingRows = total - processed;\n return Math.round((remainingRows * avgTimePerRow) / 1000);\n}\n\n","/**\n * 通用导出服务 - PostgreSQL 数据库表结构定义\n *\n * 提供导出配置和历史记录的数据库表结构。\n *\n * 表结构概览:\n * - export_configs: 导出配置表\n * - export_history: 导出历史记录表\n *\n * 设计特点:\n * - 支持多种导出格式(CSV, Excel, JSON)\n * - 灵活的字段配置和分组\n * - 完整的历史记录追踪\n *\n * @fileoverview 数据库表结构 - 通用导出服务 (PostgreSQL)\n * @package sa2kit/universalExport/server\n */\n\nimport { pgTable, text, boolean, jsonb, timestamp, integer } from 'drizzle-orm/pg-core';\nimport { sql, relations } from 'drizzle-orm';\n\n/**\n * 导出配置表 (ExportConfig)\n *\n * 存储导出任务的配置信息,包括字段选择、格式化、分组等。\n */\nexport const exportConfigs = pgTable('ExportConfig', {\n /** 主键ID */\n id: text('id')\n .primaryKey()\n .$defaultFn(() => 'export_config_' + (Date.now()) + '_' + (Math.random().toString(36).substr(2, 9))),\n\n /** 配置名称 */\n name: text('name').notNull(),\n\n /** 配置描述 */\n description: text('description'),\n\n /** 导出格式:'csv' | 'excel' | 'json' */\n format: text('format').notNull(),\n\n /** 导出字段配置(JSON数组) */\n fields: jsonb('fields').notNull(), // ExportField[]\n\n /** 分组配置 */\n grouping: jsonb('grouping'), // GroupingConfig\n\n /** 文件名模板 */\n fileNameTemplate: text('fileNameTemplate').notNull(),\n\n /** 是否包含表头 */\n includeHeader: boolean('includeHeader').default(true).notNull(),\n\n /** 分隔符(用于CSV格式) */\n delimiter: text('delimiter').default(',').notNull(),\n\n /** 编码格式 */\n encoding: text('encoding').default('utf-8').notNull(),\n\n /** 是否添加BOM(用于Excel打开UTF-8 CSV) */\n addBOM: boolean('addBOM').default(true).notNull(),\n\n /** 最大导出行数 */\n maxRows: integer('maxRows'),\n\n /** 模块ID */\n moduleId: text('moduleId').notNull(),\n\n /** 业务ID */\n businessId: text('businessId'),\n\n /** 创建者ID */\n createdBy: text('createdBy'),\n\n /** 创建时间 */\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n\n /** 更新时间 */\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\n/**\n * 导出历史记录表 (ExportHistory)\n *\n * 记录每次导出任务的执行情况,包括状态、耗时、文件信息等。\n */\nexport const exportHistory = pgTable('ExportHistory', {\n /** 主键ID */\n id: text('id')\n .primaryKey()\n .$defaultFn(() => 'export_history_' + (Date.now()) + '_' + (Math.random().toString(36).substr(2, 9))),\n\n /** 关联的配置ID */\n configId: text('configId').notNull(),\n\n /** 导出的文件名 */\n fileName: text('fileName').notNull(),\n\n /** 文件大小(字节) */\n fileSize: integer('fileSize').notNull(),\n\n /** 导出的行数 */\n exportedRows: integer('exportedRows').notNull(),\n\n /** 导出状态:'pending' | 'processing' | 'completed' | 'failed' */\n status: text('status').notNull(),\n\n /** 错误信息(如果失败) */\n error: text('error'),\n\n /** 导出耗时(毫秒) */\n duration: integer('duration'),\n\n /** 开始时间 */\n startTime: timestamp('startTime', { precision: 3, mode: 'date' }).notNull(),\n\n /** 结束时间 */\n endTime: timestamp('endTime', { precision: 3, mode: 'date' }),\n\n /** 创建者ID */\n createdBy: text('createdBy'),\n\n /** 创建时间 */\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\n// ========== 关系定义 ==========\n\n/**\n * 导出配置表关系\n * 一个配置可以有多个导出历史记录\n */\nexport const exportConfigsRelations = relations(exportConfigs, ({ many }) => ({\n history: many(exportHistory),\n}));\n\n/**\n * 导出历史表关系\n * 每个历史记录关联一个配置\n */\nexport const exportHistoryRelations = relations(exportHistory, ({ one }) => ({\n config: one(exportConfigs, {\n fields: [exportHistory.configId],\n references: [exportConfigs.id],\n }),\n}));\n\n// ========== 导出类型 ==========\n\nexport type ExportConfig = typeof exportConfigs.$inferSelect;\nexport type NewExportConfig = typeof exportConfigs.$inferInsert;\n\nexport type ExportHistory = typeof exportHistory.$inferSelect;\nexport type NewExportHistory = typeof exportHistory.$inferInsert;\n\n","/**\n * 通用导出服务 - Drizzle 数据库操作层\n *\n * 提供导出配置和历史记录的数据库操作接口。\n * 支持任何 Drizzle 数据库实例。\n *\n * @package sa2kit/universalExport/server\n */\n\nimport { eq, and, desc } from 'drizzle-orm';\nimport type {\n ExportConfig,\n NewExportConfig,\n ExportHistory,\n NewExportHistory,\n} from './drizzle-schemas/postgres';\nimport { exportConfigs, exportHistory } from './drizzle-schemas/postgres';\n\n/**\n * Drizzle 数据库实例类型\n */\nexport type DrizzleDb = any; // 支持任何 Drizzle 数据库实例\n\n/**\n * 导出配置数据库服务工厂选项\n */\nexport interface ExportDatabaseServiceOptions {\n /**\n * Drizzle 数据库实例\n */\n db: DrizzleDb;\n}\n\n/**\n * 导出配置数据库服务\n *\n * 提供导出配置的 CRUD 操作\n */\nexport class ExportConfigDatabaseService {\n constructor(private readonly db: DrizzleDb) {}\n\n /**\n * 创建导出配置\n */\n async createConfig(\n config: Omit<NewExportConfig, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<ExportConfig> {\n const id = 'export_config_' + (Date.now()) + '_' + (Math.random().toString(36).substr(2, 9));\n const now = new Date();\n\n const [newConfig] = await this.db\n .insert(exportConfigs)\n .values({\n id,\n ...config,\n createdAt: now,\n updatedAt: now,\n })\n .returning();\n\n return newConfig;\n }\n\n /**\n * 根据ID获取配置\n */\n async getConfigById(id: string): Promise<ExportConfig | null> {\n const [config] = await this.db\n .select()\n .from(exportConfigs)\n .where(eq(exportConfigs.id, id))\n .limit(1);\n\n return config || null;\n }\n\n /**\n * 根据模块和业务ID获取配置列表\n */\n async getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]> {\n const whereConditions = businessId\n ? and(eq(exportConfigs.moduleId, moduleId), eq(exportConfigs.businessId, businessId))\n : eq(exportConfigs.moduleId, moduleId);\n\n return await this.db\n .select()\n .from(exportConfigs)\n .where(whereConditions)\n .orderBy(desc(exportConfigs.updatedAt));\n }\n\n /**\n * 更新配置\n */\n async updateConfig(\n id: string,\n updates: Partial<Omit<ExportConfig, 'id' | 'createdAt'>>\n ): Promise<ExportConfig | null> {\n const [updatedConfig] = await this.db\n .update(exportConfigs)\n .set({\n ...updates,\n updatedAt: new Date(),\n })\n .where(eq(exportConfigs.id, id))\n .returning();\n\n return updatedConfig || null;\n }\n\n /**\n * 删除配置\n */\n async deleteConfig(id: string): Promise<boolean> {\n await this.db.delete(exportConfigs).where(eq(exportConfigs.id, id));\n return true;\n }\n\n /**\n * 根据用户ID获取配置列表\n */\n async getConfigsByUser(userId: string): Promise<ExportConfig[]> {\n return await this.db\n .select()\n .from(exportConfigs)\n .where(eq(exportConfigs.createdBy, userId))\n .orderBy(desc(exportConfigs.updatedAt));\n }\n}\n\n/**\n * 导出历史记录数据库服务\n *\n * 提供导出历史记录的 CRUD 操作\n */\nexport class ExportHistoryDatabaseService {\n constructor(private readonly db: DrizzleDb) {}\n\n /**\n * 创建导出历史记录\n */\n async createHistory(history: Omit<NewExportHistory, 'id' | 'createdAt'>): Promise<ExportHistory> {\n const id = 'export_history_' + (Date.now()) + '_' + (Math.random().toString(36).substr(2, 9));\n\n const [newHistory] = await this.db\n .insert(exportHistory)\n .values({\n id,\n ...history,\n createdAt: new Date(),\n })\n .returning();\n\n return newHistory;\n }\n\n /**\n * 根据配置ID获取历史记录\n */\n async getHistoryByConfigId(configId: string): Promise<ExportHistory[]> {\n return await this.db\n .select()\n .from(exportHistory)\n .where(eq(exportHistory.configId, configId))\n .orderBy(desc(exportHistory.createdAt));\n }\n\n /**\n * 根据用户ID获取历史记录\n */\n async getHistoryByUser(userId: string): Promise<ExportHistory[]> {\n return await this.db\n .select()\n .from(exportHistory)\n .where(eq(exportHistory.createdBy, userId))\n .orderBy(desc(exportHistory.createdAt));\n }\n\n /**\n * 获取最近的导出历史记录\n */\n async getRecentHistory(limit: number = 10): Promise<ExportHistory[]> {\n return await this.db\n .select()\n .from(exportHistory)\n .orderBy(desc(exportHistory.createdAt))\n .limit(limit);\n }\n}\n\n/**\n * 创建导出数据库服务实例\n *\n * @param options - 数据库服务选项\n * @returns 导出配置和历史记录服务实例\n *\n * @example\n * ```typescript\n * import { createExportDatabaseServices } from 'sa2kit/universalExport/server';\n * import { db } from './db';\n *\n * const { configDB, historyDB } = createExportDatabaseServices({ db });\n *\n * // 使用服务\n * const config = await configDB.createConfig({ ... });\n * const history = await historyDB.createHistory({ ... });\n * ```\n */\nexport function createExportDatabaseServices(options: ExportDatabaseServiceOptions) {\n const { db } = options;\n\n return {\n configDB: new ExportConfigDatabaseService(db),\n historyDB: new ExportHistoryDatabaseService(db),\n };\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/storage/adapters/web-adapter.ts"],"names":[],"mappings":"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","file":"chunk-XJ7ZAGC5.js","sourcesContent":["/**\n * Web 平台存储适配器 (localStorage)\n */\n\nimport type { StorageAdapter } from '../types';\n\n/**\n * 检查是否在浏览器环境中\n */\nconst isBrowser = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nexport class WebStorageAdapter implements StorageAdapter {\n async getItem(key: string): Promise<string | null> {\n // SSR 环境下返回 null\n if (!isBrowser) {\n return null;\n }\n\n try {\n return localStorage.getItem(key);\n } catch (error) {\n console.error('[WebStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n try {\n localStorage.setItem(key, value);\n } catch (error) {\n console.error('[WebStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('[WebStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n try {\n localStorage.clear();\n } catch (error) {\n console.error('[WebStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // SSR 环境下返回空函数\n if (!isBrowser) {\n return () => {};\n }\n\n // 监听 storage 事件(跨标签页)\n const handleStorageEvent = (e: StorageEvent) => {\n if (e.key) {\n callback(e.key, e.newValue);\n }\n };\n\n // 监听自定义事件(同标签页)\n const handleCustomEvent = (e: Event) => {\n const customEvent = e as CustomEvent;\n callback(customEvent.detail.key, customEvent.detail.value);\n };\n\n window.addEventListener('storage', handleStorageEvent);\n window.addEventListener('local-storage-change', handleCustomEvent);\n\n // 返回清理函数\n return () => {\n window.removeEventListener('storage', handleStorageEvent);\n window.removeEventListener('local-storage-change', handleCustomEvent);\n };\n }\n\n /**\n * 触发自定义事件,通知同标签页的其他组件\n */\n dispatchChange(key: string, value: string | null): void {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n window.dispatchEvent(\n new CustomEvent('local-storage-change', {\n detail: { key, value },\n })\n );\n }\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ai/llm/ui/miniapp/components/AiChatDialog.tsx"],"names":[],"mappings":";;;;AAKO,IAAM,eAA4C,CAAC;AAAA,EACxD,IAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA,GAAQ,iBAAA;AAAA,EACR,WAAA,GAAc,2DAAA;AAAA,EACd,YAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,SAAA,EAAW,KAAA,KAAU,SAAA,CAAU;AAAA,IAC5D,MAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AAErC,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,OAAO,WAAW,+EAAA,GAA2B,oEAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IACb;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,WAAW,SAAA,EAAW;AAC3B,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,OAAA,EAAS;AAAA,QAC1C,GAAG,cAAA;AAAA,QACH,QAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,UAAA,GAAa,QAAQ,CAAA;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,SAAA,GAAY,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACpE,MAAA,OAAA,GAAU,SAAS,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,2CACG,IAAA,EAAA,EAAK,SAAA,EAAU,sEAAA,EAAA,kBACd,KAAA,CAAA,aAAA,CAAC,QAAK,SAAA,EAAU,yDAAA,EAAA,kBACd,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,WAAU,mCAAA,EAAA,kBACd,KAAA,CAAA,aAAA,CAAC,QAAK,SAAA,EAAU,wCAAA,EAAA,EAA0C,KAAM,CAAA,kBAChE,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,wBAAA;AAAA,MACV,OAAA,EAAS,MAAM,YAAA,GAAe,KAAK;AAAA,KAAA;AAAA,IACpC;AAAA,GAGH,CAAA,kBAEA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAO,IAAA;AAAA,MACP,SAAA,EAAU;AAAA,KAAA;AAAA,IAET,QAAA,CAAS,MAAA,KAAW,CAAA,oBACnB,KAAA,CAAA,aAAA,CAAC,QAAK,SAAA,EAAU,uEAAA,EAAA,kBACd,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,IAAA,EAAK,sCAAM,CAAA,kBACZ,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,IAAA,EAAK,wEAAe,CACvB,CAAA;AAAA,oBAEF,KAAA,CAAA,aAAA,CAAC,QAAK,SAAA,EAAU,qBAAA,EAAA,EACb,SAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAChC,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,KAAS,MAAA;AAChC,MAAA,uBACE,KAAA,CAAA,aAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,CAAA,EAAG,OAAA,CAAQ,IAAI,IAAI,KAAK,CAAA,CAAA;AAAA,UAC7B,SAAA,EAAW,CAAA,0DAAA,EACT,MAAA,GACI,iCAAA,GACA,yDACN,CAAA;AAAA,SAAA;AAAA,wBAEA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,IAAA,EAAM,OAAA,CAAQ,OAAQ;AAAA,OACzB;AAAA,IAEJ,CAAC,CAAA,EACA,SAAA,oBACC,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,mGAAA,EAAA,kBACd,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,IAAA,EAAK,gCAAU,CAClB,CAEJ;AAAA,GACF,kBAEA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,sDAAA,EAAA,kBACd,KAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA;AAAA,MACP,SAAS,CAAC,KAAA,KAAyC,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MAC9E,WAAA;AAAA,MACA,SAAA,EAAU;AAAA;AAAA,GACZ,kBACA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAA,sCACb,IAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAAA,EAA8B,UAAW,CAAA,kBACzD,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAU,yBAAA;AAAA,MACV,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,SAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,KAAA;AAAA,IAER,YAAY,uBAAA,GAAW;AAAA,GAE5B,CAAA,EACC,KAAA,oBACC,KAAA,CAAA,aAAA,CAAC,QAAK,SAAA,EAAU,uFAAA,EAAA,kBACd,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,IAAA,EAAM,MAAM,OAAA,IAAW,wDAAY,CACtC,CAEJ,CACF,CACF,CAAA;AAEJ","file":"chunk-XUS5ACKR.mjs","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, ScrollView, Text, Textarea, View } from '@tarojs/components';\nimport { useAiChat } from '../../../hooks/useAiChat';\nimport type { AiChatDialogProps } from '../../types';\n\nexport const AiChatDialog: React.FC<AiChatDialogProps> = ({\n open,\n onOpenChange,\n client,\n title = 'AI 对话',\n placeholder = '输入你想咨询的问题...',\n systemPrompt,\n template,\n templateVariables,\n initialMessages,\n requestOptions,\n onResponse,\n onError,\n}) => {\n const { messages, sendMessage, isLoading, error } = useAiChat({\n client,\n systemPrompt,\n template,\n initialMessages,\n });\n const [input, setInput] = useState('');\n\n const helperText = useMemo(() => {\n return template ? '模板已启用,支持 {{input}} 变量。' : '直接输入即可开始对话。';\n }, [template]);\n\n useEffect(() => {\n if (!open) {\n setInput('');\n }\n }, [open]);\n\n const handleSend = async () => {\n const content = input.trim();\n if (!content || isLoading) return;\n setInput('');\n try {\n const response = await sendMessage(content, {\n ...requestOptions,\n template,\n variables: templateVariables,\n });\n onResponse?.(response);\n } catch (err) {\n const nextError = err instanceof Error ? err : new Error(String(err));\n onError?.(nextError);\n }\n };\n\n if (!open) {\n return null;\n }\n\n return (\n <View className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/40 px-4\">\n <View className=\"w-full max-w-[640px] rounded-2xl bg-white p-4 shadow-lg\">\n <View className=\"flex items-center justify-between\">\n <Text className=\"text-base font-semibold text-slate-900\">{title}</Text>\n <Text\n className=\"text-xs text-slate-500\"\n onClick={() => onOpenChange?.(false)}\n >\n 关闭\n </Text>\n </View>\n\n <ScrollView\n scrollY\n className=\"mt-3 max-h-[60vh] rounded-xl border border-slate-100 bg-slate-50/60 p-3\"\n >\n {messages.length === 0 && (\n <View className=\"flex flex-col items-center justify-center py-8 text-xs text-slate-400\">\n <Text>暂无对话内容</Text>\n <Text>输入消息开始体验 AI 对话。</Text>\n </View>\n )}\n <View className=\"flex flex-col gap-3\">\n {messages.map((message, index) => {\n const isUser = message.role === 'user';\n return (\n <View\n key={`${message.role}-${index}`}\n className={`max-w-[85%] rounded-2xl px-3 py-2 text-xs leading-relaxed ${\n isUser\n ? 'ml-auto bg-slate-900 text-white'\n : 'mr-auto border border-slate-200 bg-white text-slate-800'\n }`}\n >\n <Text>{message.content}</Text>\n </View>\n );\n })}\n {isLoading && (\n <View className=\"mr-auto max-w-[70%] rounded-2xl border border-slate-200 bg-white px-3 py-2 text-xs text-slate-500\">\n <Text>AI 正在思考...</Text>\n </View>\n )}\n </View>\n </ScrollView>\n\n <View className=\"mt-3 rounded-xl border border-slate-100 bg-white p-3\">\n <Textarea\n value={input}\n onInput={(event: { detail: { value: string } }) => setInput(event.detail.value)}\n placeholder={placeholder}\n className=\"min-h-[88px] w-full rounded-lg border border-slate-200 px-3 py-2 text-xs\"\n />\n <View className=\"mt-2 flex items-center justify-between\">\n <Text className=\"text-[10px] text-slate-400\">{helperText}</Text>\n <Button\n size=\"mini\"\n className=\"bg-slate-900 text-white\"\n disabled={!input.trim() || isLoading}\n onClick={handleSend}\n >\n {isLoading ? '发送中...' : '发送'}\n </Button>\n </View>\n {error && (\n <View className=\"mt-2 rounded-md border border-rose-200 bg-rose-50 px-2 py-1 text-[10px] text-rose-600\">\n <Text>{error.message || '对话出错,请重试。'}</Text>\n </View>\n )}\n </View>\n </View>\n </View>\n );\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/universalFile/server/providers/LocalStorageProvider.ts"],"names":["fs","path"],"mappings":"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","file":"chunk-YOTQG4NP.mjs","sourcesContent":["/**\n * 本地存储提供者实现\n */\n\nimport { promises as fs } from 'fs';\nimport { existsSync, createReadStream, createWriteStream } from 'fs';\nimport * as path from 'path';\nimport { pipeline } from 'stream/promises';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n LocalStorageConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('LocalStorageProvider');\n\n/**\n * 本地文件系统存储提供者\n */\nexport class LocalStorageProvider implements IStorageProvider {\n readonly type: StorageType = 'local';\n\n private config: LocalStorageConfig | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'local') {\n throw new StorageProviderError('配置类型不匹配:期望 local');\n }\n\n this.config = config as LocalStorageConfig;\n\n logger.info('📂 [LocalStorageProvider] 初始化本地存储,根目录: ' + (this.config.rootPath));\n\n try {\n // 确保根目录存在\n await this.ensureDirectoryExists(this.config.rootPath);\n\n // 验证目录访问权限\n await this.validateDirectoryAccess(this.config.rootPath);\n\n this.isInitialized = true;\n logger.info('✅ [LocalStorageProvider] 本地存储初始化完成');\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 本地存储初始化失败:', error);\n throw new StorageProviderError(`本地存储初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始上传文件: ' + (filePath));\n\n try {\n // 生成完整文件路径\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 写入文件\n await fs.writeFile(fullPath, buffer);\n\n // 验证文件写入\n const stats = await fs.stat(fullPath);\n\n if (stats.size !== fileInfo.file.size) {\n throw new StorageProviderError(\n '文件大小不匹配: 期望 ' + (fileInfo.file.size) + ', 实际 ' + (stats.size)\n );\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info('✅ [LocalStorageProvider] 文件上传完成: ' + (filePath) + ', 耗时: ' + (uploadTime) + 'ms');\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '上传失败',\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(path: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info('📥 [LocalStorageProvider] 开始下载文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n // 读取文件\n const buffer = await fs.readFile(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件下载完成: ' + (path) + ', 大小: ' + (buffer.length));\n\n return buffer;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件下载失败: ' + (path) + ':', error);\n throw new StorageProviderError(\n '文件下载失败: ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 删除文件\n */\n async delete(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info('🗑️ [LocalStorageProvider] 开始删除文件: ' + (path));\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n logger.warn('⚠️ [LocalStorageProvider] 文件不存在: ' + (path));\n return {\n success: true, // 文件不存在也视为删除成功\n data: { reason: 'file_not_exists' },\n };\n }\n\n // 删除文件\n await fs.unlink(fullPath);\n\n logger.info('✅ [LocalStorageProvider] 文件删除完成: ' + (path));\n\n return {\n success: true,\n data: { deletedPath: fullPath },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 文件删除失败: ' + (path) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '删除失败',\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n const stats = await fs.stat(fullPath);\n\n return {\n success: true,\n size: stats.size,\n data: {\n fullPath,\n size: stats.size,\n mtime: stats.mtime,\n ctime: stats.ctime,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : '获取文件信息失败',\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持过期时间,忽略expiresIn参数\n return this.generateAccessUrl(path);\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持预签名上传,返回普通访问URL\n logger.warn(`⚠️ [LocalStorageProvider] 本地存储不支持预签名上传URL`);\n return this.generateAccessUrl(path);\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(path: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n return existsSync(fullPath);\n } catch {\n return false;\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const fullPrefix = this.getFullPath(prefix);\n const baseDir = path.dirname(fullPrefix);\n const filePattern = path.basename(fullPrefix);\n\n if (!existsSync(baseDir)) {\n return [];\n }\n\n const entries = await fs.readdir(baseDir, { withFileTypes: true });\n let files = entries\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => name.startsWith(filePattern))\n .map((name) => path.join(path.dirname(prefix), name));\n\n // 限制返回数量\n if (maxKeys && maxKeys > 0) {\n files = files.slice(0, maxKeys);\n }\n\n return files;\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 列出文件失败: ' + (prefix) + ':', error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n }\n\n /**\n * 获取完整文件路径\n */\n private getFullPath(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 防止路径遍历攻击\n const normalizedPath = path.normalize(relativePath);\n if (normalizedPath.includes('..')) {\n throw new StorageProviderError('非法路径:不允许使用父目录引用');\n }\n\n return path.join(this.config.rootPath, normalizedPath);\n }\n\n /**\n * 生成访问URL\n */\n private generateAccessUrl(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 规范化路径分隔符为URL格式\n const urlPath = relativePath.replace(/\\\\/g, '/');\n\n // 确保URL路径以/开头\n const normalizedUrlPath = urlPath.startsWith('/') ? urlPath : '/' + (urlPath);\n\n return (this.config.baseUrl) + (normalizedUrlPath);\n }\n\n /**\n * 确保目录存在\n */\n private async ensureDirectoryExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n // 如果目录已存在,忽略错误\n if (error instanceof Error && 'code' in error && error.code !== 'EEXIST') {\n throw error;\n }\n }\n }\n\n /**\n * 验证目录访问权限\n */\n private async validateDirectoryAccess(dirPath: string): Promise<void> {\n try {\n // 检查读写权限\n await fs.access(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n } catch (error) {\n throw new StorageProviderError(\n '目录访问权限不足: ' + (dirPath) + ', ' + (error instanceof Error ? error.message : '未知错误')\n );\n }\n }\n\n /**\n * 流式上传大文件(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info('📤 [LocalStorageProvider] 开始流式上传文件: ' + (filePath));\n\n try {\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 创建写入流\n const writeStream = createWriteStream(fullPath);\n\n // 使用pipeline进行流式传输\n await pipeline(readableStream, writeStream);\n\n // 获取文件信息\n const stats = await fs.stat(fullPath);\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(\n '✅ [LocalStorageProvider] 流式上传完成: ' + (filePath) + ', 大小: ' + (stats.size) + ', 耗时: ' + (uploadTime) + 'ms'\n );\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 流式上传失败: ' + (filePath) + ':', error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '流式上传失败',\n };\n }\n }\n\n /**\n * 流式下载大文件(可选实现)\n */\n createDownloadStream(path: string): NodeJS.ReadableStream {\n this.ensureInitialized();\n\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n throw new StorageProviderError('文件不存在: ' + (path));\n }\n\n return createReadStream(fullPath);\n }\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/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-ZGVB35L2.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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ossFile/shared/httpClient.ts","../src/ossFile/client.ts"],"names":["API_ENDPOINTS","resolveUploadFolderPath","STANDARD_ALIYUN_OSS_KEYS","parseAliyunOssConfigFromMap","getOssStorageModeLabelFromConfig"],"mappings":";;;;;;AAaA,IAAI,mBAAsC,EAAC;AAEpC,SAAS,qBAAqB,MAAA,EAAiC;AACpE,EAAA,gBAAA,GAAmB,EAAE,GAAG,gBAAA,EAAkB,GAAG,MAAA,EAAO;AACtD;AAOA,SAAS,gBAAgB,IAAA,EAA4C;AACnE,EAAA,OACE,IAAA,YAAgB,QAAA,IAChB,IAAA,YAAgB,IAAA,IAChB,IAAA,YAAgB,eAAA;AAEpB;AAEA,SAAS,gBAAgB,OAAA,EAA+C;AACtE,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC9B,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACb,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACb;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,GAAG,OAAA,EAAQ;AACtB;AAMO,SAAS,8BACd,OAAA,EACgB;AAChB,EAAA,OAAO,OAAO,GAAA,EAAK,IAAA,GAAO,EAAC,KAAM;AAC/B,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAA,IAAQ,IAAI,CAAA,EAAG;AACtC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,MAAA,IAAU,KAAA,EAAO,WAAA,EAAY;AAGlD,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,EAAM;AAC9C,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,IAAA,CAAK,IAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ;AAAA,MACpC,GAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAAA,MACrC;AAAA,KACD,CAAA;AAED,IAAA,MAAM,UAAW,OAAA,EAA0C,OAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,OAAA,KAAY,KAAA,GAAQ,GAAA,GAAM,GAAA;AACzC,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG;AAAA,MAC3C,MAAA;AAAA,MACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC/C,CAAA;AAAA,EACH,CAAA;AACF;AAQO,SAAS,4BAAA,CACd,QAAA,EACA,OAAA,GAEI,EAAC,EACC;AACN,EAAA,MAAM,SAAA,GAAY,6BAAA,CAA8B,QAAA,CAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,WAAA,GACJ,QAAQ,WAAA,KACP,OAAO,UAAU,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA,CAAA;AAE3D,EAAA,oBAAA,CAAqB;AAAA,IACnB,KAAA,EAAO,OAAO,GAAA,EAAK,IAAA,KAAS;AAC1B,MAAA,IAAI,eAAA,CAAgB,IAAA,EAAM,IAAA,IAAQ,IAAI,CAAA,EAAG;AACvC,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAO,YAAY,GAAA,EAAK,EAAE,aAAa,SAAA,EAAW,GAAG,MAAM,CAAA;AAAA,MAC7D;AACA,MAAA,OAAO,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,IAC5B;AAAA,GACD,CAAA;AACH;AAEO,SAAS,gBAAgB,QAAA,EAA2C;AACzE,EAAA,MAAM,EAAA,GAAK,YAAY,gBAAA,CAAiB,KAAA;AACxC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,WAAA,EAAa;AAChC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,UAAU,CAAA;AAC9B;AAEA,eAAsB,YAAA,CACpB,GAAA,EACA,IAAA,EACA,QAAA,EACmB;AACnB,EAAA,OAAO,eAAA,CAAgB,QAAQ,CAAA,CAAE,GAAA,EAAK;AAAA,IACpC,WAAA,EAAa,SAAA;AAAA,IACb,GAAG;AAAA,GACJ,CAAA;AACH;;;ACtFA,eAAsB,iBACpB,OAAA,EACiC;AACjC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAaA,8BAAA,CAAc,MAAA;AACrD,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,YAAgB,IAAA,GAAO,OAAA,CAAQ,KAAK,IAAA,GAAO,YAAA;AACpE,EAAA,MAAM,aAAaC,wCAAA,CAAwB;AAAA,IACzC,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,QAAA;AAAA,IACA,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,YAAY,OAAA,CAAQ;AAAA,GACrB,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,EAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AACpC,EAAA,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAC5C,EAAA,QAAA,CAAS,MAAA,CAAO,YAAA,EAAc,OAAA,CAAQ,UAAA,IAAc,SAAS,CAAA;AAC7D,EAAA,QAAA,CAAS,MAAA,CAAO,cAAc,UAAU,CAAA;AACxC,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,QAAA,CAAS,MAAA,CAAO,YAAA,EAAc,OAAA,CAAQ,UAAU,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,QAAA,CAAS,OAAO,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,IAAI,OAAA,CAAQ,oBAAoB,MAAA,EAAW;AACzC,IAAA,QAAA,CAAS,MAAA,CAAO,iBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9D,MAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,MAAM,YAAA;AAAA,IACrB,SAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACtD,EAAA,IAAI,CAAC,QAAA,CAAS,EAAA,IAAM,OAAA,CAAQ,YAAY,KAAA,EAAO;AAC7C,IAAA,MAAM,IAAI,MAAM,OAAA,CAAQ,KAAA,IAAS,QAAQ,OAAA,IAAW,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/E;AAEA,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,OAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,EAAA;AACnC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,GAAA;AACzC,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,8DAA2B,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAC7B;AAEA,eAAsB,kBAAA,CACpB,MACA,YAAA,EACiC;AACjC,EAAA,OAAO,gBAAA,CAAiB;AAAA,IACtB,IAAA;AAAA,IACA,QAAA,EAAU,iBAAA;AAAA,IACV,UAAA,EAAY,YAAA,GAAe,CAAA,WAAA,EAAc,YAAY,CAAA,CAAA,GAAK,SAAA;AAAA,IAC1D,eAAA,EAAiB;AAAA,GAClB,CAAA;AACH;AAEA,eAAsB,sBAAA,CACpB,MAAA,EACA,OAAA,GAAU,EAAA,EACV,aAAA,EACiB;AACjB,EAAA,MAAM,WAAW,MAAM,YAAA;AAAA,IACrB,CAAA,EAAG,OAAO,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAA;AAAA,IACvC,EAAE,QAAQ,KAAA,EAAM;AAAA,IAChB;AAAA,GACF;AACA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gDAAA,EAAqB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,EAAA,IAAI,OAAA,CAAQ,YAAY,KAAA,EAAO;AAC7B,IAAA,MAAM,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,IAAS,2CAAa,CAAA;AAAA,EAChD;AACA,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,EAAM,SAAA,IAAa,OAAA,CAAQ,SAAA;AAC/C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,oCAAgB,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,GAAA;AACT;AAEO,IAAM,kBAAA,GAAqB;AAElC,IAAI,eAAA,GAAkE,IAAA;AAEtE,eAAe,yBAAA,CACb,aACA,aAAA,EACA;AACA,EAAA,MAAM,OAAO,MAAA,CAAO,MAAA,CAAOC,yCAAwB,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7D,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,WAAW,CAAA,EAAG,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,KAAA,EAAQ,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AAClG,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAA,EAAK,EAAE,MAAA,EAAQ,KAAA,IAAS,aAAa,CAAA;AACzE,EAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,IAAA;AAEzB,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,KAAK,OAAA,IAAW,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,IAAA;AAExD,EAAA,MAAM,YAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,IAAI,IAAA,EAAM,GAAA,IAAO,IAAA,EAAM,KAAA,EAAO;AAC5B,MAAA,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA;AAAA,IAC7B;AAAA,EACF;AACA,EAAA,OAAOC,6CAA4B,SAAS,CAAA;AAC9C;AAEA,eAAe,mBAAmB,WAAA,EAAsB;AACtD,EAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,IAAA,OAAO,eAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,WAAA,EAAa;AAChD,IAAA,eAAA,GAAkB,MAAM,0BAA0B,WAAW,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,eAAA;AACT;AAEA,eAAsB,wBACpB,WAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,mBAAmB,WAAW,CAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAsB,6BACpB,WAAA,EACiB;AACjB,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,WAAW,CAAA;AACnD,EAAA,OAAOC,kDAAiC,MAAM,CAAA;AAChD;AAEO,SAAS,uBAAA,GAAgC;AAC9C,EAAA,eAAA,GAAkB,IAAA;AACpB;AAEA,eAAsB,0BACpB,WAAA,EACe;AACf,EAAA,uBAAA,EAAwB;AACxB,EAAA,MAAM,mBAAmB,WAAW,CAAA;AACtC;AAEO,IAAM,6BAAA,GAAgC;AACtC,IAAM,yBAAA,GAA4B;AAClC,IAAM,gBAAA,GAAmB;AACzB,IAAM,wBAAA,GAA2B","file":"chunk-ZLYPALF3.js","sourcesContent":["import type { RequestAdapter, RequestConfig } from '../../request/types/types';\nimport type { PlatformAdapter } from '../../common/platform/types';\n\n/** 与标准 fetch 兼容,供 ossFile 客户端注入(Taro / Hono SSR 等) */\nexport type OssFileFetchFn = (\n url: string,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport type OssFileHttpConfig = {\n fetch?: OssFileFetchFn;\n};\n\nlet globalHttpConfig: OssFileHttpConfig = {};\n\nexport function configureOssFileHttp(config: OssFileHttpConfig): void {\n globalHttpConfig = { ...globalHttpConfig, ...config };\n}\n\n/** @internal 测试重置 */\nexport function resetOssFileHttpForTesting(): void {\n globalHttpConfig = {};\n}\n\nfunction isMultipartBody(body: BodyInit | null | undefined): boolean {\n return (\n body instanceof FormData ||\n body instanceof Blob ||\n body instanceof URLSearchParams\n );\n}\n\nfunction headersToRecord(headers?: HeadersInit): Record<string, string> {\n const out: Record<string, string> = {};\n if (!headers) {\n return out;\n }\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n out[key] = value;\n });\n return out;\n }\n if (Array.isArray(headers)) {\n for (const [key, value] of headers) {\n out[key] = value;\n }\n return out;\n }\n return { ...headers };\n}\n\n/**\n * 将 RequestAdapter 桥接为 fetch 形态(JSON 请求)。\n * multipart 上传需通过 `configureOssFileHttp({ fetch })` 注入完整 fetch。\n */\nexport function createOssFileFetchFromAdapter(\n adapter: RequestAdapter,\n): OssFileFetchFn {\n return async (url, init = {}) => {\n if (isMultipartBody(init.body ?? null)) {\n throw new Error(\n '[ossFile] RequestAdapter 不支持 multipart;请注入支持 FormData 的 fetch',\n );\n }\n\n const method = (init.method ?? 'GET').toUpperCase() as NonNullable<\n RequestConfig['method']\n >;\n let body: unknown;\n if (typeof init.body === 'string' && init.body) {\n try {\n body = JSON.parse(init.body) as unknown;\n } catch {\n body = init.body;\n }\n }\n\n const payload = await adapter.request({\n url,\n method,\n headers: headersToRecord(init.headers),\n body,\n });\n\n const success = (payload as { success?: boolean } | null)?.success;\n const status = success === false ? 400 : 200;\n return new Response(JSON.stringify(payload), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n };\n}\n\n/**\n * 从 PlatformAdapter 配置 ossFile HTTP(R2-223)\n *\n * - JSON GET/POST:走 `platform.fetch`(RequestAdapter)\n * - FormData 上传:走 `uploadFetch`,默认回退全局 `fetch`\n */\nexport function configureOssFileFromPlatform(\n platform: PlatformAdapter,\n options: {\n uploadFetch?: OssFileFetchFn;\n } = {},\n): void {\n const jsonFetch = createOssFileFetchFromAdapter(platform.fetch);\n const uploadFetch =\n options.uploadFetch ??\n (typeof fetch !== 'undefined' ? fetch.bind(globalThis) : undefined);\n\n configureOssFileHttp({\n fetch: async (url, init) => {\n if (isMultipartBody(init?.body ?? null)) {\n if (!uploadFetch) {\n throw new Error(\n '[ossFile] multipart 上传需要 uploadFetch 或浏览器 fetch 环境',\n );\n }\n return uploadFetch(url, { credentials: 'include', ...init });\n }\n return jsonFetch(url, init);\n },\n });\n}\n\nexport function getOssFileFetch(override?: OssFileFetchFn): OssFileFetchFn {\n const fn = override ?? globalHttpConfig.fetch;\n if (fn) {\n return fn;\n }\n if (typeof fetch === 'undefined') {\n throw new Error(\n '[ossFile] 无可用 fetch;请先调用 configureOssFileHttp 或 configureOssFileFromPlatform',\n );\n }\n return fetch.bind(globalThis);\n}\n\nexport async function ossFileFetch(\n url: string,\n init?: RequestInit,\n override?: OssFileFetchFn,\n): Promise<Response> {\n return getOssFileFetch(override)(url, {\n credentials: 'include',\n ...init,\n });\n}\n","import {\n universalFileClient,\n createFileClient,\n type UniversalFileClientConfig,\n} from '../universalFile/client';\nimport { API_ENDPOINTS } from '../universalFile/constants';\nimport {\n STANDARD_ALIYUN_OSS_KEYS,\n parseAliyunOssConfigFromMap,\n isCompleteOssConfig,\n getOssStorageModeLabelFromConfig,\n} from './shared/ossConfig';\nimport { buildModuleUploadPath, resolveUploadFolderPath } from './shared/path';\nimport {\n configureOssFileFromPlatform,\n configureOssFileHttp,\n createOssFileFetchFromAdapter,\n ossFileFetch,\n type OssFileFetchFn,\n type OssFileHttpConfig,\n} from './shared/httpClient';\n\nexport {\n configureOssFileHttp,\n configureOssFileFromPlatform,\n createOssFileFetchFromAdapter,\n type OssFileFetchFn,\n type OssFileHttpConfig,\n};\n\nexport type { UniversalFileClientConfig };\n\nexport {\n universalFileClient,\n createFileClient,\n STANDARD_ALIYUN_OSS_KEYS,\n parseAliyunOssConfigFromMap,\n buildModuleUploadPath,\n resolveUploadFolderPath,\n};\n\nexport interface UploadModuleFileOptions {\n file: File | Blob;\n moduleId: string;\n businessId?: string;\n uploadUrl?: string;\n /** 与 universalFile 的 customPath 等价 */\n folderPath?: string;\n customPath?: string;\n needsProcessing?: boolean;\n permission?: 'public' | 'private' | 'authenticated' | 'owner-only';\n metadata?: Record<string, unknown>;\n extraFields?: Record<string, string>;\n /** 单次请求覆盖全局注入的 fetch(R2-223) */\n fetch?: OssFileFetchFn;\n}\n\nexport interface UploadModuleFileResult {\n fileId: string;\n accessUrl: string;\n}\n\nexport async function uploadModuleFile(\n options: UploadModuleFileOptions,\n): Promise<UploadModuleFileResult> {\n const uploadUrl = options.uploadUrl ?? API_ENDPOINTS.UPLOAD;\n const fileName = options.file instanceof File ? options.file.name : 'upload.jpg';\n const folderPath = resolveUploadFolderPath({\n moduleId: options.moduleId,\n businessId: options.businessId,\n fileName,\n folderPath: options.folderPath,\n customPath: options.customPath,\n });\n\n const formData = new FormData();\n formData.append('file', options.file);\n formData.append('moduleId', options.moduleId);\n formData.append('businessId', options.businessId ?? 'default');\n formData.append('folderPath', folderPath);\n if (options.permission) {\n formData.append('permission', options.permission);\n }\n if (options.metadata) {\n formData.append('metadata', JSON.stringify(options.metadata));\n }\n if (options.needsProcessing !== undefined) {\n formData.append('needsProcessing', String(options.needsProcessing));\n }\n if (options.extraFields) {\n for (const [key, value] of Object.entries(options.extraFields)) {\n formData.append(key, value);\n }\n }\n\n const response = await ossFileFetch(\n uploadUrl,\n {\n method: 'POST',\n body: formData,\n },\n options.fetch,\n );\n\n const payload = await response.json().catch(() => ({}));\n if (!response.ok || payload.success === false) {\n throw new Error(payload.error || payload.message || `HTTP ${response.status}`);\n }\n\n const data = payload.data ?? payload;\n const fileId = data.fileId ?? data.id;\n const accessUrl = data.accessUrl ?? data.url;\n if (!fileId || !accessUrl) {\n throw new Error('上传响应缺少 fileId 或 accessUrl');\n }\n\n return { fileId, accessUrl };\n}\n\nexport async function uploadArtworkImage(\n file: File,\n collectionId?: number,\n): Promise<UploadModuleFileResult> {\n return uploadModuleFile({\n file,\n moduleId: 'showmasterpiece',\n businessId: collectionId ? `collection-${collectionId}` : 'artwork',\n needsProcessing: true,\n });\n}\n\nexport async function getModuleFileAccessUrl(\n fileId: string,\n apiBase = '',\n fetchOverride?: OssFileFetchFn,\n): Promise<string> {\n const response = await ossFileFetch(\n `${apiBase}/api/universal-file/${fileId}`,\n { method: 'GET' },\n fetchOverride,\n );\n if (!response.ok) {\n throw new Error(`获取文件 URL 失败: HTTP ${response.status}`);\n }\n const payload = await response.json();\n if (payload.success === false) {\n throw new Error(payload.error || '获取文件 URL 失败');\n }\n const url = payload.data?.accessUrl ?? payload.accessUrl;\n if (!url) {\n throw new Error('响应缺少 accessUrl');\n }\n return url;\n}\n\nexport const getArtworkImageUrl = getModuleFileAccessUrl;\n\nlet cachedOssConfig: ReturnType<typeof parseAliyunOssConfigFromMap> = null;\n\nasync function loadOssConfigFromItemsApi(\n itemsApiUrl: string,\n fetchOverride?: OssFileFetchFn,\n) {\n const keys = Object.values(STANDARD_ALIYUN_OSS_KEYS).join(',');\n const url = `${itemsApiUrl}${itemsApiUrl.includes('?') ? '&' : '?'}keys=${encodeURIComponent(keys)}`;\n const response = await ossFileFetch(url, { method: 'GET' }, fetchOverride);\n if (!response.ok) return null;\n\n const data = await response.json();\n if (!data.success || !Array.isArray(data.items)) return null;\n\n const configMap: Record<string, string> = {};\n for (const item of data.items) {\n if (item?.key && item?.value) {\n configMap[item.key] = item.value;\n }\n }\n return parseAliyunOssConfigFromMap(configMap);\n}\n\nasync function getCachedOssConfig(itemsApiUrl?: string) {\n if (cachedOssConfig !== null) {\n return cachedOssConfig;\n }\n if (typeof window !== 'undefined' && itemsApiUrl) {\n cachedOssConfig = await loadOssConfigFromItemsApi(itemsApiUrl);\n }\n return cachedOssConfig;\n}\n\nexport async function shouldUseOssFileService(\n itemsApiUrl?: string,\n): Promise<boolean> {\n try {\n await getCachedOssConfig(itemsApiUrl);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getOssStorageModeDisplayName(\n itemsApiUrl?: string,\n): Promise<string> {\n const config = await getCachedOssConfig(itemsApiUrl);\n return getOssStorageModeLabelFromConfig(config);\n}\n\nexport function clearOssFileConfigCache(): void {\n cachedOssConfig = null;\n}\n\nexport async function refreshOssFileConfigCache(\n itemsApiUrl?: string,\n): Promise<void> {\n clearOssFileConfigCache();\n await getCachedOssConfig(itemsApiUrl);\n}\n\nexport const shouldUseUniversalFileService = shouldUseOssFileService;\nexport const getStorageModeDisplayName = getOssStorageModeDisplayName;\nexport const clearConfigCache = clearOssFileConfigCache;\nexport const refreshFileServiceConfig = refreshOssFileConfigCache;\n\nexport async function fetchOssConfigManagerFromItemsApi(\n itemsApiUrl: string,\n): Promise<ReturnType<typeof parseAliyunOssConfigFromMap>> {\n return loadOssConfigFromItemsApi(itemsApiUrl);\n}\n\nexport function isOssConfigured(config: ReturnType<typeof parseAliyunOssConfigFromMap>): boolean {\n return isCompleteOssConfig(config);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/platform/index.ts","../src/common/platform/adapters/web.ts","../src/common/platform/adapters/taro.ts","../src/common/platform/adapters/electron.ts","../src/common/platform/adapters/node-hono.ts"],"names":["__export","WebStorageAdapter","WebRequestAdapter","ElectronStorageAdapter"],"mappings":"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","file":"chunk-ZM2SZJTZ.js","sourcesContent":["/**\n * @package sa2kit/common/platform\n *\n * 跨平台运行时适配(storage / fetch / filePick)\n */\nexport type {\n PlatformAdapter,\n PlatformId,\n FilePickAdapter,\n FilePickOptions,\n PickedFile,\n} from './types';\n\nexport {\n createWebPlatformAdapter,\n createTaroPlatformAdapter,\n createElectronPlatformAdapter,\n createNodeHonoPlatformAdapter,\n} from './adapters';\n","import { WebRequestAdapter } from '../../../request/adapters/web-adapter';\nimport { WebStorageAdapter } from '../../../storage/adapters/web-adapter';\nimport type {\n FilePickAdapter,\n FilePickOptions,\n PlatformAdapter,\n PickedFile,\n} from '../types';\n\nfunction createWebFilePickAdapter(): FilePickAdapter {\n return {\n async pickFiles(options?: FilePickOptions): Promise<PickedFile[]> {\n if (typeof document === 'undefined') {\n throw new Error('[PlatformAdapter:web] filePick 需要浏览器 document');\n }\n\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n if (options?.accept) {\n input.accept = options.accept;\n }\n if (options?.multiple) {\n input.multiple = true;\n }\n\n input.onchange = () => {\n const files = Array.from(input.files ?? []);\n input.remove();\n resolve(\n files.map(file => ({\n name: file.name,\n mimeType: file.type || undefined,\n size: file.size,\n blob: file,\n })),\n );\n };\n\n input.oncancel = () => {\n input.remove();\n resolve([]);\n };\n\n document.body.appendChild(input);\n input.click();\n input.addEventListener('error', () => {\n input.remove();\n reject(new Error('[PlatformAdapter:web] filePick 失败'));\n });\n });\n },\n };\n}\n\n/** 浏览器 / Next.js CSR 官方 adapter */\nexport function createWebPlatformAdapter(\n options: { filePick?: boolean } = {},\n): PlatformAdapter {\n return {\n storage: new WebStorageAdapter(),\n fetch: new WebRequestAdapter(),\n filePick: options.filePick === false ? undefined : createWebFilePickAdapter(),\n };\n}\n","import type { PlatformAdapter } from '../types';\n\n/**\n * Taro 小程序 adapter 骨架(R2-222)\n *\n * 宿主需传入已初始化的 Taro storage / request 实现。\n */\nexport function createTaroPlatformAdapter(partial: PlatformAdapter): PlatformAdapter {\n if (!partial.storage || !partial.fetch) {\n throw new Error(\n '[PlatformAdapter:taro] 请注入 storage 与 fetch(基于 Taro.getStorage / Taro.request)',\n );\n }\n return {\n storage: partial.storage,\n fetch: partial.fetch,\n filePick: partial.filePick,\n };\n}\n","import { WebRequestAdapter } from '../../../request/adapters/web-adapter';\nimport { ElectronStorageAdapter } from '../../../storage/adapters/electron-adapter';\nimport { createWebPlatformAdapter } from './web';\nimport type { PlatformAdapter } from '../types';\n\n/**\n * Electron 桌面 adapter 骨架(R2-222)\n *\n * 默认复用 Web fetch + Electron storage;filePick 回退 Web input。\n */\nexport function createElectronPlatformAdapter(\n options: { filePick?: boolean } = {},\n): PlatformAdapter {\n try {\n return {\n storage: new ElectronStorageAdapter(),\n fetch: new WebRequestAdapter(),\n filePick:\n options.filePick === false\n ? undefined\n : createWebPlatformAdapter({ filePick: true }).filePick,\n };\n } catch {\n return createWebPlatformAdapter(options);\n }\n}\n","import type { FilePickAdapter, PlatformAdapter } from '../types';\nimport type { RequestAdapter } from '../../../request/types/types';\nimport type { StorageAdapter } from '../../../storage/types';\n\n/** 内存 storage,适用于无持久化需求的 Node / Hono SSR */\nclass MemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n async getItem(key: string): Promise<string | null> {\n return this.store.get(key) ?? null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.store.set(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n this.store.delete(key);\n }\n}\n\n/** 基于全局 fetch 的 Node 请求适配器 */\nclass NodeFetchAdapter implements RequestAdapter {\n async request<T>(config: {\n url: string;\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n params?: Record<string, unknown>;\n }): Promise<T> {\n let fullUrl = config.url;\n if (config.params) {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(config.params)) {\n if (value !== undefined && value !== null) {\n search.append(key, String(value));\n }\n }\n const qs = search.toString();\n if (qs) {\n fullUrl += (fullUrl.includes('?') ? '&' : '?') + qs;\n }\n }\n\n const response = await fetch(fullUrl, {\n method: config.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n body: config.body ? JSON.stringify(config.body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`[PlatformAdapter:node-hono] HTTP ${response.status}`);\n }\n\n return (await response.json()) as T;\n }\n}\n\nconst unsupportedFilePick: FilePickAdapter = {\n async pickFiles() {\n throw new Error('[PlatformAdapter:node-hono] filePick 需在宿主注入');\n },\n};\n\n/** Hono / Node API 官方 adapter 骨架(R2-222) */\nexport function createNodeHonoPlatformAdapter(\n overrides: Partial<Pick<PlatformAdapter, 'storage' | 'fetch' | 'filePick'>> = {},\n): PlatformAdapter {\n return {\n storage: overrides.storage ?? new MemoryStorageAdapter(),\n fetch: overrides.fetch ?? new NodeFetchAdapter(),\n filePick: overrides.filePick ?? unsupportedFilePick,\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/universalFile/types.ts"],"names":[],"mappings":";;;AAmSO,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;AAGO,IAAM,eAAA,GAAN,cAA8B,gBAAA,CAAiB;AAAA,EACpD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,qBAAqB,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAGO,IAAM,mBAAA,GAAN,cAAkC,gBAAA,CAAiB;AAAA,EACxD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,yBAAyB,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAGO,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-ZRAW3HXA.js","sourcesContent":["/**\n * 通用文件服务类型定义\n *\n * 定义了文件存储、上传、下载等核心接口和类型\n */\n\n// ============= 基础类型定义 =============\n\n/** 文件存储类型 */\nexport type StorageType = 'local' | 'aliyun-oss' | 'aws-s3' | 'qcloud-cos';\n\n/** CDN提供者类型 */\nexport type CDNType = 'none' | 'aliyun-cdn' | 'aws-cloudfront' | 'qcloud-cdn';\n\n/** 文件处理类型 */\nexport type ProcessorType = 'image' | 'audio' | 'video' | 'document';\n\n/** 文件上传状态 */\nexport type UploadStatus = 'pending' | 'uploading' | 'processing' | 'completed' | 'failed';\n\n/** 访问权限类型 */\nexport type AccessPermission = 'public' | 'private' | 'authenticated' | 'owner-only';\n\n// ============= 文件元数据接口 =============\n\n/** 文件元数据基础接口 */\nexport interface FileMetadata {\n /** 文件ID */\n id: string;\n /** 原始文件名 */\n originalName: string;\n /** 存储文件名 */\n storageName: string;\n /** 文件大小(字节) */\n size: number;\n /** MIME类型 */\n mimeType: string;\n /** 文件扩展名 */\n extension: string;\n /** 文件哈希值 */\n hash?: string;\n /** 上传时间 */\n uploadTime: Date;\n /** 访问权限 */\n permission: AccessPermission;\n /** 上传者ID */\n uploaderId: string;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 存储提供者 */\n storageProvider: StorageType;\n /** 存储路径 */\n storagePath: string;\n /** CDN URL */\n cdnUrl?: string;\n /** 访问次数 */\n accessCount: number;\n /** 最后访问时间 */\n lastAccessTime?: Date;\n /** 过期时间 */\n expiresAt?: Date;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n}\n\n/** 上传文件信息(客户端使用) */\nexport interface UploadFileInfo {\n /** 文件对象 */\n file: File;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 访问权限 */\n permission?: AccessPermission;\n /** 自定义存储路径 */\n customPath?: string;\n /** 自定义元数据 */\n metadata?: Record<string, any>;\n /** 是否需要处理 */\n needsProcessing?: boolean;\n /** 处理选项 */\n processingOptions?: ProcessingOptions;\n}\n\n/** 文件处理选项基础接口 */\nexport interface ProcessingOptions {\n /** 处理器类型 */\n type: ProcessorType;\n /** 处理参数 */\n params?: Record<string, any>;\n}\n\n/** 图片处理选项 */\nexport interface ImageProcessingOptions extends ProcessingOptions {\n type: 'image';\n /** 压缩质量 0-100 */\n quality?: number;\n /** 目标宽度 */\n width?: number;\n /** 目标高度 */\n height?: number;\n /** 格式转换 */\n format?: 'jpeg' | 'png' | 'webp' | 'avif';\n /** 是否添加水印 */\n watermark?: boolean;\n /** 水印配置 */\n watermarkOptions?: {\n text?: string;\n image?: string;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'center';\n opacity?: number;\n };\n}\n\n/** 音频处理选项 */\nexport interface AudioProcessingOptions extends ProcessingOptions {\n type: 'audio';\n /** 比特率 */\n bitrate?: number;\n /** 格式转换 */\n format?: 'mp3' | 'wav' | 'ogg' | 'aac';\n /** 采样率 */\n sampleRate?: number;\n /** 声道数 */\n channels?: number;\n}\n\n/** 视频处理选项 */\nexport interface VideoProcessingOptions extends ProcessingOptions {\n type: 'video';\n /** 视频质量 */\n quality?: number;\n /** 格式转换 */\n format?: 'mp4' | 'avi' | 'mov' | 'webm';\n /** 生成缩略图 */\n generateThumbnail?: boolean;\n /** 缩略图时间点(秒) */\n thumbnailTime?: number;\n}\n\n// ============= 上传相关接口 =============\n\n/** 上传进度 */\nexport interface UploadProgress {\n /** 文件ID */\n fileId: string;\n /** 上传状态 */\n status: UploadStatus;\n /** 进度百分比(0-100) */\n progress: number;\n /** 已上传字节数 */\n uploadedBytes: number;\n /** 总字节数 */\n totalBytes: number;\n /** 上传速度(字节/秒) */\n speed: number;\n /** 剩余时间(秒) */\n remainingTime: number;\n /** 错误信息 */\n error?: string;\n}\n\n/** 上传结果 */\nexport interface UploadResult {\n /** 是否成功 */\n success: boolean;\n /** 文件元数据 */\n file?: FileMetadata;\n /** 文件访问URL */\n url?: string;\n /** 错误信息 */\n error?: string;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 查询相关接口 =============\n\n/** 文件查询选项 */\nexport interface FileQueryOptions {\n /** 模块标识 */\n moduleId?: string;\n /** 业务标识 */\n businessId?: string;\n /** 上传者ID */\n uploaderId?: string;\n /** MIME类型过滤 */\n mimeType?: string;\n /** 最小文件大小 */\n minSize?: number;\n /** 最大文件大小 */\n maxSize?: number;\n /** 开始时间 */\n startTime?: Date;\n /** 结束时间 */\n endTime?: Date;\n /** 搜索关键词 */\n keyword?: string;\n /** 标签 */\n tags?: string[];\n /** 排序字段 */\n sortBy?: string;\n /** 排序方向 */\n sortOrder?: 'asc' | 'desc';\n /** 页码 */\n page?: number;\n /** 每页数量 */\n pageSize?: number;\n}\n\n/** 分页结果 */\nexport interface PaginatedResult<T> {\n /** 数据项 */\n items: T[];\n /** 总数 */\n total: number;\n /** 当前页码 */\n page: number;\n /** 每页数量 */\n pageSize: number;\n /** 总页数 */\n totalPages: number;\n /** 是否有下一页 */\n hasNext: boolean;\n /** 是否有上一页 */\n hasPrev: boolean;\n}\n\n/** 批量操作结果 */\nexport interface BatchOperationResult {\n /** 成功数量 */\n successCount: number;\n /** 失败数量 */\n failureCount: number;\n /** 失败详情 */\n failures: Array<{\n fileId: string;\n error: string;\n }>;\n}\n\n// ============= 事件相关接口 =============\n\n/** 文件事件类型 */\nexport type FileEventType =\n | 'upload:start'\n | 'upload:progress'\n | 'upload:complete'\n | 'upload:error'\n | 'download:start'\n | 'download:complete'\n | 'download:error'\n | 'delete:complete'\n | 'processing:start'\n | 'processing:complete'\n | 'processing:error';\n\n/** 文件事件 */\nexport interface FileEvent {\n /** 事件类型 */\n type: FileEventType;\n /** 文件ID */\n fileId: string;\n /** 事件时间 */\n timestamp: Date;\n /** 事件数据 */\n data?: Record<string, any>;\n /** 错误信息 */\n error?: string;\n}\n\n/** 文件事件监听器 */\nexport type FileEventListener = (event: FileEvent) => void | Promise<void>;\n\n// ============= 异常类定义 =============\n\n/** 文件服务基础异常 */\nexport class FileServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'FileServiceError';\n }\n}\n\n/** 文件上传错误 */\nexport class FileUploadError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_UPLOAD_ERROR', details);\n this.name = 'FileUploadError';\n }\n}\n\n/** 文件处理错误 */\nexport class FileProcessingError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'FILE_PROCESSING_ERROR', details);\n this.name = 'FileProcessingError';\n }\n}\n\n/** 存储提供者错误 */\nexport class StorageProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'STORAGE_PROVIDER_ERROR', details);\n this.name = 'StorageProviderError';\n }\n}\n\n/** CDN提供者错误 */\nexport class CDNProviderError extends FileServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'CDN_PROVIDER_ERROR', details);\n this.name = 'CDNProviderError';\n }\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/time.ts","../src/utils/japanese.ts","../src/utils/validators.ts","../src/utils/file.ts","../src/utils/array.ts","../src/utils/string.ts","../src/utils/debug.ts","../src/utils/error.ts","../src/utils/cn.ts"],"names":["logger","twMerge","clsx"],"mappings":"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","file":"chunk-ZWQJSZEY.js","sourcesContent":["/**\n * 时间格式化工具\n */\n\nexport const formatTime = {\n /**\n * 将秒数转换为 MM:SS 格式\n */\n toMinutesSeconds(seconds: number): string {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return minutes + ':' + remainingSeconds.toString().padStart(2, '0');\n },\n\n /**\n * 将秒数转换为 HH:MM:SS 格式\n */\n toHoursMinutesSeconds(seconds: number): string {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n\n if (hours > 0) {\n return hours + ':' + minutes.toString().padStart(2, '0') + ':' + remainingSeconds.toString().padStart(2, '0');\n }\n return minutes + ':' + remainingSeconds.toString().padStart(2, '0');\n },\n\n /**\n * 格式化日期为用户友好的格式\n */\n formatDate(date: string | Date, locale = 'zh-CN'): string {\n const d = new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return locale === 'zh-CN' ? '今天' : 'Today';\n } else if (diffDays === 1) {\n return locale === 'zh-CN' ? '昨天' : 'Yesterday';\n } else if (diffDays < 7) {\n return locale === 'zh-CN' ? diffDays + '天前' : diffDays + ' days ago';\n } else {\n return d.toLocaleDateString(locale);\n }\n },\n};\n\n","/**\n * 日语文本处理工具\n */\n\nexport const japaneseUtils = {\n /**\n * 提取文本中的汉字\n */\n extractKanji(text: string): string[] {\n return text.match(/[\\u4E00-\\u9FAF]/g) || [];\n },\n\n /**\n * 提取文本中的假名\n */\n extractKana(text: string): string[] {\n return text.match(/[\\u3040-\\u309F\\u30A0-\\u30FF]/g) || [];\n },\n\n /**\n * 清理文本,移除特殊字符但保留日语字符\n */\n cleanText(text: string): string {\n return text.replace(/[^\\u3040-\\u309F\\u30A0-\\u30FF\\u4E00-\\u9FAF\\w\\s]/g, '');\n },\n};\n","/**\n * 验证工具\n */\n\nexport const validators = {\n /**\n * 验证邮箱格式\n */\n isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n },\n\n /**\n * 验证密码强度\n */\n isValidPassword(password: string): {\n isValid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (password.length < 6) {\n errors.push('Password must be at least 6 characters');\n }\n\n if (password.length > 50) {\n errors.push('Password must not exceed 50 characters');\n }\n\n if (!/[a-zA-Z]/.test(password)) {\n errors.push('Password must contain at least one letter');\n }\n\n if (!/[0-9]/.test(password)) {\n errors.push('Password must contain at least one number');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * 验证用户名格式\n */\n isValidUsername(username: string): boolean {\n const usernameRegex = /^[a-zA-Z0-9_]{3,20}$/;\n return usernameRegex.test(username);\n },\n\n /**\n * 验证文件大小\n */\n isValidFileSize(size: number, maxSize: number): boolean {\n return size > 0 && size <= maxSize;\n },\n\n /**\n * 验证文件类型\n */\n isValidFileType(type: string, supportedTypes: string[]): boolean {\n return supportedTypes.includes(type);\n },\n\n /**\n * 验证 URL 格式\n */\n isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n },\n};\n\n","/**\n * 文件处理工具\n */\n\nexport const fileUtils = {\n /**\n * 格式化文件大小\n */\n formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n },\n\n /**\n * 获取文件扩展名\n */\n getFileExtension(filename: string): string {\n return filename.slice(((filename.lastIndexOf('.') - 1) >>> 0) + 2);\n },\n\n /**\n * 生成唯一文件名\n */\n generateUniqueFileName(originalName: string): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n const extension = this.getFileExtension(originalName);\n const baseName = originalName.replace('.' + (extension), '');\n return extension ? (baseName) + '_' + (timestamp) + '_' + (random) + '.' + (extension) : (baseName) + '_' + (timestamp) + '_' + (random);\n },\n\n /**\n * 验证文件名是否有效\n */\n isValidFilename(filename: string): boolean {\n // 不允许包含特殊字符\n const invalidChars = /[<>:\"/\\\\|?*\\x00-\\x1F]/g;\n return !invalidChars.test(filename) && filename.length > 0 && filename.length <= 255;\n },\n};\n\n","/**\n * 数组和对象工具\n */\n\nexport const arrayUtils = {\n /**\n * 数组去重\n */\n unique<T>(array: T[]): T[] {\n return [...new Set(array)];\n },\n\n /**\n * 数组分组\n */\n groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\n return array.reduce(\n (groups, item) => {\n const groupKey = String(item[key]);\n const group = groups[groupKey] || [];\n group.push(item);\n groups[groupKey] = group;\n return groups;\n },\n {} as Record<string, T[]>\n );\n },\n\n /**\n * 数组分页\n */\n paginate<T>(\n array: T[],\n page: number,\n limit: number\n ): {\n data: T[];\n total: number;\n page: number;\n pages: number;\n hasNext: boolean;\n hasPrev: boolean;\n } {\n const total = array.length;\n const pages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n const end = start + limit;\n const data = array.slice(start, end);\n\n return {\n data,\n total,\n page,\n pages,\n hasNext: page < pages,\n hasPrev: page > 1,\n };\n },\n\n /**\n * 数组随机排序\n */\n shuffle<T>(array: T[]): T[] {\n const shuffled = [...array];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j]!, shuffled[i]!];\n }\n return shuffled;\n },\n};\n\n","/**\n * 字符串工具\n */\n\nexport const stringUtils = {\n /**\n * 截断文本\n */\n truncate(text: string, length: number, suffix = '...'): string {\n if (text.length <= length) return text;\n return text.substring(0, length - suffix.length) + suffix;\n },\n\n /**\n * 首字母大写\n */\n capitalize(text: string): string {\n if (!text) return '';\n return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n },\n\n /**\n * 驼峰转下划线\n */\n camelToSnake(text: string): string {\n return text.replace(/[A-Z]/g, (letter) => '_' + (letter.toLowerCase()));\n },\n\n /**\n * 下划线转驼峰\n */\n snakeToCamel(text: string): string {\n return text.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n },\n\n /**\n * 生成随机字符串\n */\n generateRandom(length: number): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n },\n};\n\n","/**\n * 调试工具\n */\n\nimport { logger } from '../logger';\nimport { fileUtils } from './file';\n\nexport const debugUtils = {\n /**\n * 安全的 JSON 序列化\n */\n safeStringify(obj: any): string {\n try {\n return JSON.stringify(obj, null, 2);\n } catch (error) {\n return '[Circular Reference or Invalid JSON: ' + (error) + ']';\n }\n },\n\n /**\n * 性能计时器\n */\n createTimer(label?: string) {\n const start = typeof performance !== 'undefined' ? performance.now() : Date.now();\n return {\n end: () => {\n const end = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const duration = end - start;\n const message = (label || 'Timer') + ': ' + (duration.toFixed(2)) + 'ms';\n logger.info(message);\n return duration;\n },\n };\n },\n\n /**\n * 内存使用情况(仅在 Node.js 环境)\n */\n getMemoryUsage(): Record<string, string> | null {\n if (typeof process !== 'undefined' && process.memoryUsage) {\n const usage = process.memoryUsage();\n return {\n rss: fileUtils.formatFileSize(usage.rss),\n heapTotal: fileUtils.formatFileSize(usage.heapTotal),\n heapUsed: fileUtils.formatFileSize(usage.heapUsed),\n external: fileUtils.formatFileSize(usage.external),\n };\n }\n return null;\n },\n};\n\n","/**\n * 错误处理工具\n */\n\nexport const errorUtils = {\n /**\n * 创建标准化的错误对象\n */\n createError(\n code: string,\n message: string,\n details?: any\n ): Error & { code: string; details?: any } {\n const error = new Error(message) as Error & { code: string; details?: any };\n error.code = code;\n if (details) {\n error.details = details;\n }\n return error;\n },\n\n /**\n * 安全的错误信息提取\n */\n extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n return 'Unknown error';\n },\n\n /**\n * 错误重试机制\n */\n async retry<T>(fn: () => Promise<T>, maxAttempts = 3, delay = 1000): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxAttempts) {\n throw lastError;\n }\n\n // 指数退避延迟\n await new Promise((resolve) => setTimeout(resolve, delay * Math.pow(2, attempt - 1)));\n }\n }\n\n throw lastError!;\n },\n};\n\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n"]}