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.
- package/README.md +5 -5
- package/dist/AliyunOSSProvider-7IOT5U6M.js +15 -0
- package/dist/{AliyunOSSProvider-4GRL2FJB.js.map → AliyunOSSProvider-7IOT5U6M.js.map} +1 -1
- package/dist/AliyunOSSProvider-ZXZM7OQA.mjs +6 -0
- package/dist/{AliyunOSSProvider-QNVFIZ7Q.mjs.map → AliyunOSSProvider-ZXZM7OQA.mjs.map} +1 -1
- package/dist/LocalStorageProvider-KJKRCKBS.js +15 -0
- package/dist/{LocalStorageProvider-PFA2DMIJ.js.map → LocalStorageProvider-KJKRCKBS.js.map} +1 -1
- package/dist/LocalStorageProvider-O22465NY.mjs +6 -0
- package/dist/{LocalStorageProvider-J5RHV37G.mjs.map → LocalStorageProvider-O22465NY.mjs.map} +1 -1
- package/dist/{chunk-SLKOEYFH.js → chunk-2234T4A6.js} +5 -5
- package/dist/chunk-2234T4A6.js.map +1 -0
- package/dist/{chunk-HQLKOXG7.js → chunk-36KGNXKW.js} +3 -3
- package/dist/{chunk-HQLKOXG7.js.map → chunk-36KGNXKW.js.map} +1 -1
- package/dist/{chunk-BCE6RUZV.js → chunk-375C7WL7.js} +19 -19
- package/dist/chunk-375C7WL7.js.map +1 -0
- package/dist/{chunk-VMTEDX5H.js → chunk-3J24Z4MB.js} +34 -318
- package/dist/chunk-3J24Z4MB.js.map +1 -0
- package/dist/{chunk-PBI7FKMB.js → chunk-3QCATFQV.js} +3 -3
- package/dist/chunk-3QCATFQV.js.map +1 -0
- package/dist/{chunk-FXQOXLDE.js → chunk-3R6JHA6D.js} +4 -4
- package/dist/chunk-3R6JHA6D.js.map +1 -0
- package/dist/{chunk-ZRAW3HXA.js → chunk-4OXKHV7J.js} +3 -3
- package/dist/chunk-4OXKHV7J.js.map +1 -0
- package/dist/chunk-4PJM4752.js +4 -0
- package/dist/{chunk-5USIS3UM.js.map → chunk-4PJM4752.js.map} +1 -1
- package/dist/{chunk-3Z43XGA4.mjs → chunk-65JRVC3F.mjs} +4 -4
- package/dist/{chunk-3Z43XGA4.mjs.map → chunk-65JRVC3F.mjs.map} +1 -1
- package/dist/{chunk-Q5EDCKQA.js → chunk-6HL54I2B.js} +16 -16
- package/dist/chunk-6HL54I2B.js.map +1 -0
- package/dist/chunk-6V2MIQPF.mjs +77 -0
- package/dist/chunk-6V2MIQPF.mjs.map +1 -0
- package/dist/{chunk-C6KV7VTZ.mjs → chunk-7CRU2Y5X.mjs} +5 -5
- package/dist/chunk-7CRU2Y5X.mjs.map +1 -0
- package/dist/chunk-7PMT4L4I.js +324 -0
- package/dist/chunk-7PMT4L4I.js.map +1 -0
- package/dist/{chunk-XJ7ZAGC5.js → chunk-7VVZHFEM.js} +3 -3
- package/dist/chunk-7VVZHFEM.js.map +1 -0
- package/dist/chunk-AWHGIKTQ.js +56 -0
- package/dist/{chunk-FHLTPXAR.js.map → chunk-AWHGIKTQ.js.map} +1 -1
- package/dist/chunk-B3GYF6TY.js +37 -0
- package/dist/{chunk-2Y7BKFKZ.js.map → chunk-B3GYF6TY.js.map} +1 -1
- package/dist/{chunk-5FUAQLGC.mjs → chunk-BDBJFOXM.mjs} +3 -3
- package/dist/{chunk-5FUAQLGC.mjs.map → chunk-BDBJFOXM.mjs.map} +1 -1
- package/dist/{chunk-ZGVB35L2.mjs → chunk-BTW3SWQN.mjs} +3 -3
- package/dist/chunk-BTW3SWQN.mjs.map +1 -0
- package/dist/{chunk-I5ZPEDNR.mjs → chunk-CHYSSZ4E.mjs} +10 -10
- package/dist/chunk-CHYSSZ4E.mjs.map +1 -0
- package/dist/{chunk-FIUBFREP.mjs → chunk-DO6QYAZV.mjs} +5 -5
- package/dist/chunk-DO6QYAZV.mjs.map +1 -0
- package/dist/{chunk-MBANGIG3.mjs → chunk-DTR53LQO.mjs} +6 -6
- package/dist/chunk-DTR53LQO.mjs.map +1 -0
- package/dist/{chunk-EQXPL7TN.mjs → chunk-EI2S4XDG.mjs} +16 -5
- package/dist/chunk-EI2S4XDG.mjs.map +1 -0
- package/dist/{chunk-GSNGCENJ.js → chunk-EOZHUI46.js} +16 -4
- package/dist/chunk-EOZHUI46.js.map +1 -0
- package/dist/{chunk-25OFOKNF.js → chunk-F2BZIU67.js} +18 -5
- package/dist/chunk-F2BZIU67.js.map +1 -0
- package/dist/{chunk-AQPU2AXH.js → chunk-F2TEJSCP.js} +10 -10
- package/dist/chunk-F2TEJSCP.js.map +1 -0
- package/dist/{chunk-UCOE6SET.js → chunk-FCLS5R24.js} +3 -3
- package/dist/chunk-FCLS5R24.js.map +1 -0
- package/dist/{chunk-3NHAT7D4.mjs → chunk-FUA6ZGMI.mjs} +27 -12
- package/dist/chunk-FUA6ZGMI.mjs.map +1 -0
- package/dist/chunk-FY2X3LYR.mjs +3 -0
- package/dist/{chunk-VRN76M56.mjs.map → chunk-FY2X3LYR.mjs.map} +1 -1
- package/dist/{chunk-V7EVKD5G.mjs → chunk-GS4SAW25.mjs} +4 -4
- package/dist/chunk-GS4SAW25.mjs.map +1 -0
- package/dist/chunk-H56ICWUO.js +321 -0
- package/dist/chunk-H56ICWUO.js.map +1 -0
- package/dist/{chunk-HDMIOOZY.mjs → chunk-HG34SGMN.mjs} +4 -4
- package/dist/chunk-HG34SGMN.mjs.map +1 -0
- package/dist/chunk-HL4H2HF6.js +279 -0
- package/dist/chunk-HL4H2HF6.js.map +1 -0
- package/dist/chunk-IJIQUMAK.mjs +272 -0
- package/dist/chunk-IJIQUMAK.mjs.map +1 -0
- package/dist/{imageCrop/index.mjs → chunk-KEZFTDZT.mjs} +24 -6
- package/dist/chunk-KEZFTDZT.mjs.map +1 -0
- package/dist/{chunk-KQ643L7Z.js → chunk-KHOVC2KL.js} +3 -3
- package/dist/chunk-KHOVC2KL.js.map +1 -0
- package/dist/{chunk-6PMXAK7F.js → chunk-KRBSTLKC.js} +57 -57
- package/dist/chunk-KRBSTLKC.js.map +1 -0
- package/dist/chunk-KVYHCGRY.js +2011 -0
- package/dist/chunk-KVYHCGRY.js.map +1 -0
- package/dist/{chunk-G7UBMCUT.mjs → chunk-LZ5YTMMP.mjs} +3 -3
- package/dist/chunk-LZ5YTMMP.mjs.map +1 -0
- package/dist/{chunk-WW4GE6CZ.js → chunk-MJ6XJGAL.js} +23 -119
- package/dist/chunk-MJ6XJGAL.js.map +1 -0
- package/dist/{chunk-NCRP2YHY.mjs → chunk-MKLXCV4Z.mjs} +8 -96
- package/dist/chunk-MKLXCV4Z.mjs.map +1 -0
- package/dist/chunk-MMDSZIXD.mjs +286 -0
- package/dist/chunk-MMDSZIXD.mjs.map +1 -0
- package/dist/{chunk-TC5YU6A4.mjs → chunk-N2O3OX5Y.mjs} +3 -3
- package/dist/chunk-N2O3OX5Y.mjs.map +1 -0
- package/dist/{chunk-3FRAIS4T.mjs → chunk-O6NNSPWD.mjs} +5 -5
- package/dist/{chunk-3FRAIS4T.mjs.map → chunk-O6NNSPWD.mjs.map} +1 -1
- package/dist/chunk-OIRZXSYM.js +80 -0
- package/dist/chunk-OIRZXSYM.js.map +1 -0
- package/dist/{chunk-Q5VFBPMG.mjs → chunk-P7JQRNBJ.mjs} +3 -3
- package/dist/chunk-P7JQRNBJ.mjs.map +1 -0
- package/dist/{chunk-BIHYZA67.mjs → chunk-PLIG5257.mjs} +18 -18
- package/dist/chunk-PLIG5257.mjs.map +1 -0
- package/dist/chunk-QIF4MG5V.mjs +283 -0
- package/dist/chunk-QIF4MG5V.mjs.map +1 -0
- package/dist/{chunk-4OOANEJV.mjs → chunk-RHECN4E2.mjs} +21 -21
- package/dist/chunk-RHECN4E2.mjs.map +1 -0
- package/dist/{chunk-YOTQG4NP.mjs → chunk-RHHTZTIN.mjs} +4 -4
- package/dist/chunk-RHHTZTIN.mjs.map +1 -0
- package/dist/{chunk-G6NSKJMH.js → chunk-RRQ2X26Z.js} +4 -4
- package/dist/chunk-RRQ2X26Z.js.map +1 -0
- package/dist/{chunk-4WBCWJSN.js → chunk-RST2T54Y.js} +7 -7
- package/dist/chunk-RST2T54Y.js.map +1 -0
- package/dist/{chunk-R2DXTE2L.js → chunk-RVNQI6BI.js} +4 -4
- package/dist/chunk-RVNQI6BI.js.map +1 -0
- package/dist/{chunk-SKFEJPMJ.mjs → chunk-S3K4LTRI.mjs} +6 -6
- package/dist/chunk-S3K4LTRI.mjs.map +1 -0
- package/dist/{chunk-ZM2SZJTZ.js → chunk-SWZ5XNF6.js} +9 -9
- package/dist/chunk-SWZ5XNF6.js.map +1 -0
- package/dist/{chunk-QSKLQX6H.js → chunk-U7HNBCBS.js} +16 -16
- package/dist/chunk-U7HNBCBS.js.map +1 -0
- package/dist/{chunk-CIVO4R6N.mjs → chunk-UJS3YSD3.mjs} +3 -3
- package/dist/chunk-UJS3YSD3.mjs.map +1 -0
- package/dist/{chunk-G6HXNQ2U.mjs → chunk-UJUWDF7M.mjs} +8 -8
- package/dist/chunk-UJUWDF7M.mjs.map +1 -0
- package/dist/{chunk-CAYOQDBR.js → chunk-UR5NENGE.js} +3 -3
- package/dist/chunk-UR5NENGE.js.map +1 -0
- package/dist/{chunk-QXAOXBVB.mjs → chunk-V7HGBDCB.mjs} +3 -3
- package/dist/chunk-V7HGBDCB.mjs.map +1 -0
- package/dist/{chunk-ATUCZXJY.js → chunk-V7RLIZMN.js} +14 -4
- package/dist/chunk-V7RLIZMN.js.map +1 -0
- package/dist/{chunk-ACUFEDVQ.js → chunk-VCKXK6V5.js} +9 -9
- package/dist/chunk-VCKXK6V5.js.map +1 -0
- package/dist/{chunk-XUS5ACKR.mjs → chunk-VIEXDTNF.mjs} +3 -3
- package/dist/chunk-VIEXDTNF.mjs.map +1 -0
- package/dist/{imageCrop/index.js → chunk-VN2DULIA.js} +24 -5
- package/dist/chunk-VN2DULIA.js.map +1 -0
- package/dist/{chunk-S6YSGVWD.js → chunk-VNWMRUY6.js} +31 -87
- package/dist/chunk-VNWMRUY6.js.map +1 -0
- package/dist/{chunk-3DXPQ4YV.mjs → chunk-VYK4M2D6.mjs} +18 -6
- package/dist/chunk-VYK4M2D6.mjs.map +1 -0
- package/dist/{chunk-WEEXCPSE.mjs → chunk-WB4H6ZUW.mjs} +3 -3
- package/dist/chunk-WB4H6ZUW.mjs.map +1 -0
- package/dist/{chunk-GWNBVGDT.mjs → chunk-WM3AEJ2E.mjs} +6 -257
- package/dist/chunk-WM3AEJ2E.mjs.map +1 -0
- package/dist/{chunk-CX2GHCAI.mjs → chunk-X5GINUGI.mjs} +26 -81
- package/dist/chunk-X5GINUGI.mjs.map +1 -0
- package/dist/{chunk-DIF5VRL3.mjs → chunk-XB7GUEHZ.mjs} +14 -5
- package/dist/chunk-XB7GUEHZ.mjs.map +1 -0
- package/dist/{chunk-ZLYPALF3.js → chunk-XE5RGZ3B.js} +11 -11
- package/dist/chunk-XE5RGZ3B.js.map +1 -0
- package/dist/{chunk-WJ7IMUEJ.mjs → chunk-XNTIMVSL.mjs} +7 -7
- package/dist/chunk-XNTIMVSL.mjs.map +1 -0
- package/dist/{chunk-ZWQJSZEY.js → chunk-Y7WHUKJF.js} +28 -12
- package/dist/chunk-Y7WHUKJF.js.map +1 -0
- package/dist/{components/index.mjs → chunk-YIRPPMCN.mjs} +305 -785
- package/dist/chunk-YIRPPMCN.mjs.map +1 -0
- package/dist/{chunk-KH6RQ4J5.js → chunk-Z2SNB5LJ.js} +3 -3
- package/dist/chunk-Z2SNB5LJ.js.map +1 -0
- package/dist/{chunk-HJ6MH7J7.js → chunk-ZOP7YIVX.js} +17 -17
- package/dist/chunk-ZOP7YIVX.js.map +1 -0
- package/dist/{chunk-HJZHQW5R.mjs → chunk-ZUZLWHH5.mjs} +3 -3
- package/dist/chunk-ZUZLWHH5.mjs.map +1 -0
- package/dist/{ai → common/ai}/llm/core/index.d.mts +3 -3
- package/dist/{ai → common/ai}/llm/core/index.d.ts +3 -3
- package/dist/{ai/llm → common/ai/llm/core}/index.js +14 -14
- package/dist/{ai/llm → common/ai/llm/core}/index.mjs +3 -3
- package/dist/{ai → common/ai}/llm/electron/index.d.mts +3 -3
- package/dist/{ai/llm/web → common/ai/llm/electron}/index.d.ts +3 -3
- package/dist/common/ai/llm/electron/index.js +67 -0
- package/dist/common/ai/llm/electron/index.mjs +10 -0
- package/dist/{ai → common/ai}/llm/index.d.mts +2 -2
- package/dist/{ai → common/ai}/llm/index.d.ts +2 -2
- package/dist/{ai/llm/core → common/ai/llm}/index.js +13 -13
- package/dist/{ai/llm/core → common/ai/llm}/index.mjs +2 -2
- package/dist/{ai → common/ai}/llm/miniapp/index.d.mts +3 -3
- package/dist/{ai → common/ai}/llm/miniapp/index.d.ts +3 -3
- package/dist/{ai/llm/rn → common/ai/llm/miniapp}/index.js +16 -16
- package/dist/{ai/llm/rn → common/ai/llm/miniapp}/index.mjs +4 -4
- package/dist/{ai → common/ai}/llm/rn/index.d.mts +3 -3
- package/dist/{ai → common/ai}/llm/rn/index.d.ts +3 -3
- package/dist/{ai/llm/miniapp → common/ai/llm/rn}/index.js +16 -16
- package/dist/{ai/llm/miniapp → common/ai/llm/rn}/index.mjs +4 -4
- package/dist/common/ai/llm/ui/electron/index.d.mts +5 -0
- package/dist/common/ai/llm/ui/electron/index.d.ts +5 -0
- package/dist/common/ai/llm/ui/electron/index.js +22 -0
- package/dist/common/ai/llm/ui/electron/index.mjs +9 -0
- package/dist/common/ai/llm/ui/miniapp/index.d.mts +9 -0
- package/dist/common/ai/llm/ui/miniapp/index.d.ts +9 -0
- package/dist/common/ai/llm/ui/miniapp/index.js +14 -0
- package/dist/common/ai/llm/ui/miniapp/index.mjs +5 -0
- package/dist/common/ai/llm/ui/rn/index.d.mts +9 -0
- package/dist/common/ai/llm/ui/rn/index.d.ts +9 -0
- package/dist/common/ai/llm/ui/rn/index.js +14 -0
- package/dist/common/ai/llm/ui/rn/index.mjs +5 -0
- package/dist/{ai → common/ai}/llm/ui/web/index.d.mts +7 -7
- package/dist/{ai → common/ai}/llm/ui/web/index.d.ts +7 -7
- package/dist/common/ai/llm/ui/web/index.js +21 -0
- package/dist/common/ai/llm/ui/web/index.mjs +8 -0
- package/dist/{ai → common/ai}/llm/web/index.d.mts +3 -3
- package/dist/{ai/llm/electron → common/ai/llm/web}/index.d.ts +3 -3
- package/dist/common/ai/llm/web/index.js +66 -0
- package/dist/common/ai/llm/web/index.mjs +9 -0
- package/dist/{analytics → common/analytics}/index.d.mts +1 -1
- package/dist/{analytics → common/analytics}/index.d.ts +1 -1
- package/dist/{analytics → common/analytics}/index.js +79 -79
- package/dist/{analytics → common/analytics}/index.mjs +3 -3
- package/dist/{analytics → common/analytics}/server/index.js +2 -2
- package/dist/common/analytics/server/index.js.map +1 -0
- package/dist/{analytics → common/analytics}/server/index.mjs +2 -2
- package/dist/common/analytics/server/index.mjs.map +1 -0
- package/dist/{api → common/api}/index.d.mts +3 -3
- package/dist/{api → common/api}/index.d.ts +3 -3
- package/dist/common/api/index.js +21 -0
- package/dist/common/api/index.mjs +4 -0
- package/dist/common/auth/components/index.d.mts +9 -9
- package/dist/common/auth/components/index.d.ts +9 -9
- package/dist/common/auth/index.js +6 -6
- package/dist/common/auth/index.mjs +2 -2
- package/dist/common/auth/react/index.d.mts +3 -3
- package/dist/common/auth/react/index.d.ts +3 -3
- package/dist/common/auth/rn/index.d.mts +2 -2
- package/dist/common/auth/rn/index.d.ts +2 -2
- package/dist/common/auth/rn/index.js +2 -2
- package/dist/common/auth/rn/index.js.map +1 -1
- package/dist/common/auth/rn/index.mjs +1 -1
- package/dist/common/auth/rn/index.mjs.map +1 -1
- package/dist/common/components/index.d.mts +4 -0
- package/dist/common/components/index.d.ts +4 -0
- package/dist/common/components/index.js +414 -0
- package/dist/common/components/index.mjs +9 -0
- package/dist/{config → common/config}/index.d.mts +1 -1
- package/dist/{config → common/config}/index.d.ts +1 -1
- package/dist/common/config/index.js +21 -0
- package/dist/common/config/index.mjs +4 -0
- package/dist/{config → common/config}/server/index.js +5 -5
- package/dist/common/config/server/index.js.map +1 -0
- package/dist/{config → common/config}/server/index.mjs +5 -5
- package/dist/common/config/server/index.mjs.map +1 -0
- package/dist/common/export/index.d.mts +2 -2
- package/dist/common/export/index.d.ts +2 -2
- package/dist/common/export/index.js +67 -67
- package/dist/common/export/index.mjs +3 -3
- package/dist/common/export/server/index.d.mts +2 -2
- package/dist/common/export/server/index.d.ts +2 -2
- package/dist/common/export/server/index.js +76 -48
- package/dist/common/export/server/index.mjs +3 -3
- package/dist/common/file/index.d.mts +2 -2
- package/dist/common/file/index.d.ts +2 -2
- package/dist/common/file/index.js +27 -27
- package/dist/common/file/index.mjs +5 -5
- package/dist/common/file/server/index.d.mts +2 -2
- package/dist/common/file/server/index.d.ts +2 -2
- package/dist/common/file/server/index.js +58 -50
- package/dist/common/file/server/index.mjs +8 -8
- package/dist/{i18n → common/i18n}/index.d.mts +1 -1
- package/dist/{i18n → common/i18n}/index.d.ts +1 -1
- package/dist/{i18n → common/i18n}/index.js +18 -18
- package/dist/{i18n → common/i18n}/index.mjs +2 -2
- package/dist/common/imageCrop/index.d.mts +2 -0
- package/dist/common/imageCrop/index.d.ts +2 -0
- package/dist/common/imageCrop/index.js +61 -0
- package/dist/common/imageCrop/index.mjs +4 -0
- package/dist/common/index.d.mts +16 -16
- package/dist/common/index.d.ts +16 -16
- package/dist/common/index.js +75 -67
- package/dist/common/index.mjs +26 -26
- package/dist/common/logger/index.d.mts +1 -1
- package/dist/common/logger/index.d.ts +1 -1
- package/dist/common/logger/index.js +6 -7
- package/dist/common/logger/index.mjs +1 -2
- package/dist/{ossFile → common/ossFile}/index.d.mts +6 -6
- package/dist/{ossFile → common/ossFile}/index.d.ts +6 -6
- package/dist/{ossFile → common/ossFile}/index.js +26 -26
- package/dist/{ossFile → common/ossFile}/index.mjs +5 -5
- package/dist/{ossFile/server/index.d.ts → common/ossFile/server/index.d.mts} +7 -7
- package/dist/{ossFile/server/index.d.mts → common/ossFile/server/index.d.ts} +7 -7
- package/dist/{ossFile → common/ossFile}/server/index.js +60 -52
- package/dist/{ossFile → common/ossFile}/server/index.mjs +10 -10
- package/dist/common/platform/index.js +8 -8
- package/dist/common/platform/index.mjs +4 -4
- package/dist/common/request/index.d.mts +1 -1
- package/dist/common/request/index.d.ts +1 -1
- package/dist/common/request/index.js +5 -6
- package/dist/common/request/index.mjs +2 -3
- package/dist/common/storage/index.d.mts +1 -1
- package/dist/common/storage/index.d.ts +1 -1
- package/dist/common/storage/index.js +17 -17
- package/dist/common/storage/index.mjs +5 -5
- package/dist/{universalExport → common/universalExport}/index.d.mts +6 -86
- package/dist/{universalExport → common/universalExport}/index.d.ts +6 -86
- package/dist/{universalExport → common/universalExport}/index.js +67 -67
- package/dist/common/universalExport/index.mjs +5 -0
- package/dist/{universalExport → common/universalExport}/server/index.d.mts +3 -84
- package/dist/{universalExport → common/universalExport}/server/index.d.ts +3 -84
- package/dist/common/universalExport/server/index.js +151 -0
- package/dist/common/universalExport/server/index.mjs +6 -0
- package/dist/{universalFile/index.d.ts → common/universalFile/index.d.mts} +9 -9
- package/dist/{universalFile/index.d.mts → common/universalFile/index.d.ts} +9 -9
- package/dist/{universalFile → common/universalFile}/index.js +63 -63
- package/dist/common/universalFile/index.js.map +1 -0
- package/dist/{universalFile → common/universalFile}/index.mjs +4 -4
- package/dist/common/universalFile/index.mjs.map +1 -0
- package/dist/{universalFile → common/universalFile}/server/index.d.mts +5 -5
- package/dist/{universalFile → common/universalFile}/server/index.d.ts +5 -5
- package/dist/{universalFile → common/universalFile}/server/index.js +68 -68
- package/dist/{universalFile → common/universalFile}/server/index.mjs +8 -8
- package/dist/common/utils/index.d.mts +1 -1
- package/dist/common/utils/index.d.ts +1 -1
- package/dist/common/utils/index.js +11 -12
- package/dist/common/utils/index.mjs +2 -3
- package/dist/{index-WrR57hKT.d.ts → index-BRLygK4h.d.ts} +2 -2
- package/dist/{request/index.d.mts → index-BWNK5mH2.d.ts} +19 -2
- package/dist/{utils/index.d.mts → index-BiCK6gg6.d.mts} +19 -1
- package/dist/{utils/index.d.ts → index-BiCK6gg6.d.ts} +19 -1
- package/dist/{index-DoUo8IrU.d.mts → index-BxZauNN_.d.mts} +8 -8
- package/dist/{index-DoUo8IrU.d.ts → index-BxZauNN_.d.ts} +8 -8
- package/dist/{request/index.d.ts → index-C-P2yBTH.d.mts} +19 -2
- package/dist/{index-D0cqaQEH.d.mts → index-CLB80GCP.d.mts} +5 -5
- package/dist/{index-D0cqaQEH.d.ts → index-CLB80GCP.d.ts} +5 -5
- package/dist/{index-2G9Dxjvt.d.ts → index-CT4K2z-O.d.ts} +2 -2
- package/dist/{index-qcOvRVuN.d.mts → index-D6RJTGce.d.mts} +2 -2
- package/dist/{storage/index.d.ts → index-DA7L9JlE.d.mts} +26 -3
- package/dist/{imageCrop/index.d.mts → index-DXVph21C.d.mts} +40 -4
- package/dist/{imageCrop/index.d.ts → index-DXVph21C.d.ts} +40 -4
- package/dist/{index-CYuUB8aF.d.mts → index-DzyK789B.d.mts} +2 -2
- package/dist/{logger/index.d.mts → index-FVJZCEtm.d.mts} +21 -1
- package/dist/{logger/index.d.ts → index-FVJZCEtm.d.ts} +21 -1
- package/dist/{storage/index.d.mts → index-nD9vPCZT.d.ts} +26 -3
- package/dist/{components/index.d.mts → index-nOmIv2BG.d.mts} +159 -5
- package/dist/{components/index.d.ts → index-nOmIv2BG.d.ts} +159 -5
- package/dist/{path-qjVnH8qU.d.ts → path-Bzc7hj1N.d.ts} +5 -1
- package/dist/{path-DkaHQSyW.d.mts → path-DN_65vhO.d.mts} +5 -1
- package/dist/{types-3ujSNAXb.d.mts → utils-Dm3O1rAa.d.mts} +81 -1
- package/dist/{types-3ujSNAXb.d.ts → utils-Dm3O1rAa.d.ts} +81 -1
- package/package.json +292 -312
- package/dist/AliyunOSSProvider-4GRL2FJB.js +0 -15
- package/dist/AliyunOSSProvider-QNVFIZ7Q.mjs +0 -6
- package/dist/CollisionBalls-BpHufX3H.d.mts +0 -41
- package/dist/CollisionBalls-BpHufX3H.d.ts +0 -41
- package/dist/ConfigService-BxK06xP6.d.mts +0 -262
- package/dist/ConfigService-BxK06xP6.d.ts +0 -262
- package/dist/LocalStorageProvider-J5RHV37G.mjs +0 -6
- package/dist/LocalStorageProvider-PFA2DMIJ.js +0 -15
- package/dist/UniversalFileService-CC4d3wkc.d.ts +0 -139
- package/dist/UniversalFileService-CzAE_G4V.d.mts +0 -139
- package/dist/ai/llm/electron/index.js +0 -66
- package/dist/ai/llm/electron/index.mjs +0 -9
- package/dist/ai/llm/ui/electron/index.d.mts +0 -5
- package/dist/ai/llm/ui/electron/index.d.ts +0 -5
- package/dist/ai/llm/ui/electron/index.js +0 -21
- package/dist/ai/llm/ui/electron/index.mjs +0 -8
- package/dist/ai/llm/ui/miniapp/index.d.mts +0 -9
- package/dist/ai/llm/ui/miniapp/index.d.ts +0 -9
- package/dist/ai/llm/ui/miniapp/index.js +0 -14
- package/dist/ai/llm/ui/miniapp/index.mjs +0 -5
- package/dist/ai/llm/ui/rn/index.d.mts +0 -9
- package/dist/ai/llm/ui/rn/index.d.ts +0 -9
- package/dist/ai/llm/ui/rn/index.js +0 -14
- package/dist/ai/llm/ui/rn/index.mjs +0 -5
- package/dist/ai/llm/ui/web/index.js +0 -20
- package/dist/ai/llm/ui/web/index.mjs +0 -7
- package/dist/ai/llm/web/index.js +0 -65
- package/dist/ai/llm/web/index.mjs +0 -8
- package/dist/analytics/server/index.js.map +0 -1
- package/dist/analytics/server/index.mjs.map +0 -1
- package/dist/api/index.js +0 -21
- package/dist/api/index.mjs +0 -4
- package/dist/audioDetection/index.d.mts +0 -449
- package/dist/audioDetection/index.d.ts +0 -449
- package/dist/audioDetection/index.js +0 -1244
- package/dist/audioDetection/index.js.map +0 -1
- package/dist/audioDetection/index.mjs +0 -1227
- package/dist/audioDetection/index.mjs.map +0 -1
- package/dist/boothVaultService-Cn4WPhjg.d.mts +0 -83
- package/dist/boothVaultService-Cn4WPhjg.d.ts +0 -83
- package/dist/business/index.d.mts +0 -2
- package/dist/business/index.d.ts +0 -2
- package/dist/business/index.js +0 -581
- package/dist/business/index.js.map +0 -1
- package/dist/business/index.mjs +0 -575
- package/dist/business/index.mjs.map +0 -1
- package/dist/calendar/index.d.mts +0 -1325
- package/dist/calendar/index.d.ts +0 -1325
- package/dist/calendar/index.js +0 -5964
- package/dist/calendar/index.js.map +0 -1
- package/dist/calendar/index.mjs +0 -5878
- package/dist/calendar/index.mjs.map +0 -1
- package/dist/calendar/routes/index.d.mts +0 -191
- package/dist/calendar/routes/index.d.ts +0 -191
- package/dist/calendar/routes/index.js +0 -844
- package/dist/calendar/routes/index.js.map +0 -1
- package/dist/calendar/routes/index.mjs +0 -826
- package/dist/calendar/routes/index.mjs.map +0 -1
- package/dist/chunk-25OFOKNF.js.map +0 -1
- package/dist/chunk-2Y7BKFKZ.js +0 -37
- package/dist/chunk-3CSCIRQY.js +0 -17
- package/dist/chunk-3CSCIRQY.js.map +0 -1
- package/dist/chunk-3DXPQ4YV.mjs.map +0 -1
- package/dist/chunk-3NHAT7D4.mjs.map +0 -1
- package/dist/chunk-4FDUURSD.js +0 -22
- package/dist/chunk-4FDUURSD.js.map +0 -1
- package/dist/chunk-4OOANEJV.mjs.map +0 -1
- package/dist/chunk-4WBCWJSN.js.map +0 -1
- package/dist/chunk-5GBDDXYL.mjs +0 -23
- package/dist/chunk-5GBDDXYL.mjs.map +0 -1
- package/dist/chunk-5USIS3UM.js +0 -4
- package/dist/chunk-6PMXAK7F.js.map +0 -1
- package/dist/chunk-7B5SI4OF.mjs +0 -15
- package/dist/chunk-7B5SI4OF.mjs.map +0 -1
- package/dist/chunk-ACUFEDVQ.js.map +0 -1
- package/dist/chunk-AQPU2AXH.js.map +0 -1
- package/dist/chunk-ATUCZXJY.js.map +0 -1
- package/dist/chunk-BCE6RUZV.js.map +0 -1
- package/dist/chunk-BIHYZA67.mjs.map +0 -1
- package/dist/chunk-C6KV7VTZ.mjs.map +0 -1
- package/dist/chunk-CAYOQDBR.js.map +0 -1
- package/dist/chunk-CIVO4R6N.mjs.map +0 -1
- package/dist/chunk-CX2GHCAI.mjs.map +0 -1
- package/dist/chunk-DIF5VRL3.mjs.map +0 -1
- package/dist/chunk-EQXPL7TN.mjs.map +0 -1
- package/dist/chunk-FCEBAWN6.js +0 -18
- package/dist/chunk-FCEBAWN6.js.map +0 -1
- package/dist/chunk-FHIE5MTC.mjs +0 -541
- package/dist/chunk-FHIE5MTC.mjs.map +0 -1
- package/dist/chunk-FHLTPXAR.js +0 -56
- package/dist/chunk-FIUBFREP.mjs.map +0 -1
- package/dist/chunk-FXQOXLDE.js.map +0 -1
- package/dist/chunk-G6HXNQ2U.mjs.map +0 -1
- package/dist/chunk-G6NSKJMH.js.map +0 -1
- package/dist/chunk-G7UBMCUT.mjs.map +0 -1
- package/dist/chunk-GSNGCENJ.js.map +0 -1
- package/dist/chunk-GWNBVGDT.mjs.map +0 -1
- package/dist/chunk-HDMIOOZY.mjs.map +0 -1
- package/dist/chunk-HJ6MH7J7.js.map +0 -1
- package/dist/chunk-HJZHQW5R.mjs.map +0 -1
- package/dist/chunk-I5ZPEDNR.mjs.map +0 -1
- package/dist/chunk-KH6RQ4J5.js.map +0 -1
- package/dist/chunk-KQ643L7Z.js.map +0 -1
- package/dist/chunk-LFB5EIIM.mjs +0 -31
- package/dist/chunk-LFB5EIIM.mjs.map +0 -1
- package/dist/chunk-MBANGIG3.mjs.map +0 -1
- package/dist/chunk-NCRP2YHY.mjs.map +0 -1
- package/dist/chunk-NDGHXVGS.js +0 -25
- package/dist/chunk-NDGHXVGS.js.map +0 -1
- package/dist/chunk-NDPO5OMC.js +0 -563
- package/dist/chunk-NDPO5OMC.js.map +0 -1
- package/dist/chunk-PBI7FKMB.js.map +0 -1
- package/dist/chunk-Q5EDCKQA.js.map +0 -1
- package/dist/chunk-Q5VFBPMG.mjs.map +0 -1
- package/dist/chunk-QSKLQX6H.js.map +0 -1
- package/dist/chunk-QXAOXBVB.mjs.map +0 -1
- package/dist/chunk-R2DXTE2L.js.map +0 -1
- package/dist/chunk-RTD2WHQQ.mjs +0 -16
- package/dist/chunk-RTD2WHQQ.mjs.map +0 -1
- package/dist/chunk-S6YSGVWD.js.map +0 -1
- package/dist/chunk-SKFEJPMJ.mjs.map +0 -1
- package/dist/chunk-SLKOEYFH.js.map +0 -1
- package/dist/chunk-TC5YU6A4.mjs.map +0 -1
- package/dist/chunk-UCOE6SET.js.map +0 -1
- package/dist/chunk-UIYKZ73N.js +0 -36
- package/dist/chunk-UIYKZ73N.js.map +0 -1
- package/dist/chunk-V7EVKD5G.mjs.map +0 -1
- package/dist/chunk-VMTEDX5H.js.map +0 -1
- package/dist/chunk-VRN76M56.mjs +0 -3
- package/dist/chunk-VXFUXZN5.mjs +0 -20
- package/dist/chunk-VXFUXZN5.mjs.map +0 -1
- package/dist/chunk-WEEXCPSE.mjs.map +0 -1
- package/dist/chunk-WJ7IMUEJ.mjs.map +0 -1
- package/dist/chunk-WW4GE6CZ.js.map +0 -1
- package/dist/chunk-XJ7ZAGC5.js.map +0 -1
- package/dist/chunk-XUS5ACKR.mjs.map +0 -1
- package/dist/chunk-YOTQG4NP.mjs.map +0 -1
- package/dist/chunk-ZGVB35L2.mjs.map +0 -1
- package/dist/chunk-ZLYPALF3.js.map +0 -1
- package/dist/chunk-ZM2SZJTZ.js.map +0 -1
- package/dist/chunk-ZRAW3HXA.js.map +0 -1
- package/dist/chunk-ZWQJSZEY.js.map +0 -1
- package/dist/components/index.js +0 -2516
- package/dist/components/index.js.map +0 -1
- package/dist/components/index.mjs.map +0 -1
- package/dist/config/index.js +0 -21
- package/dist/config/index.mjs +0 -4
- package/dist/config/server/index.js.map +0 -1
- package/dist/config/server/index.mjs.map +0 -1
- package/dist/drizzle-schema-BNhqj2AZ.d.mts +0 -1114
- package/dist/drizzle-schema-BNhqj2AZ.d.ts +0 -1114
- package/dist/festivalCard/index.d.mts +0 -76
- package/dist/festivalCard/index.d.ts +0 -76
- package/dist/festivalCard/index.js +0 -1492
- package/dist/festivalCard/index.js.map +0 -1
- package/dist/festivalCard/index.mjs +0 -1475
- package/dist/festivalCard/index.mjs.map +0 -1
- package/dist/festivalCard/routes/index.d.mts +0 -42
- package/dist/festivalCard/routes/index.d.ts +0 -42
- package/dist/festivalCard/routes/index.js +0 -361
- package/dist/festivalCard/routes/index.js.map +0 -1
- package/dist/festivalCard/routes/index.mjs +0 -356
- package/dist/festivalCard/routes/index.mjs.map +0 -1
- package/dist/festivalCard/server/index.d.mts +0 -120
- package/dist/festivalCard/server/index.d.ts +0 -120
- package/dist/festivalCard/server/index.js +0 -272
- package/dist/festivalCard/server/index.js.map +0 -1
- package/dist/festivalCard/server/index.mjs +0 -265
- package/dist/festivalCard/server/index.mjs.map +0 -1
- package/dist/festivalCardService-B3GsnNpV.d.ts +0 -13
- package/dist/festivalCardService-CWhrLNE9.d.mts +0 -13
- package/dist/imageCrop/index.js.map +0 -1
- package/dist/imageCrop/index.mjs.map +0 -1
- package/dist/index-Bjem5rWn.d.mts +0 -17
- package/dist/index-C5U-2hJq.d.ts +0 -23
- package/dist/index-CifSBBP2.d.ts +0 -17
- package/dist/index-D0K4ehme.d.mts +0 -20
- package/dist/index-DLnfKN-a.d.mts +0 -23
- package/dist/index-DSel44Ke.d.mts +0 -93
- package/dist/index-DSel44Ke.d.ts +0 -93
- package/dist/index-DZ5iJtNO.d.mts +0 -102
- package/dist/index-DZ5iJtNO.d.ts +0 -102
- package/dist/index-Da7qdkgW.d.ts +0 -20
- package/dist/index-DrPcMJPc.d.mts +0 -250
- package/dist/index-DrPcMJPc.d.ts +0 -250
- package/dist/index-oLUvfqT8.d.ts +0 -20
- package/dist/index-pe38RDgC.d.mts +0 -20
- package/dist/index.d.mts +0 -11611
- package/dist/index.d.ts +0 -11611
- package/dist/index.js +0 -17230
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -16954
- package/dist/index.mjs.map +0 -1
- package/dist/logger/index.js +0 -29
- package/dist/logger/index.mjs +0 -4
- package/dist/mikuContest/ui/web/index.d.mts +0 -2
- package/dist/mikuContest/ui/web/index.d.ts +0 -2
- package/dist/mikuContest/ui/web/index.js +0 -353
- package/dist/mikuContest/ui/web/index.js.map +0 -1
- package/dist/mikuContest/ui/web/index.mjs +0 -343
- package/dist/mikuContest/ui/web/index.mjs.map +0 -1
- package/dist/mikuFireworks3D/index.d.mts +0 -268
- package/dist/mikuFireworks3D/index.d.ts +0 -268
- package/dist/mikuFireworks3D/index.js +0 -1267
- package/dist/mikuFireworks3D/index.js.map +0 -1
- package/dist/mikuFireworks3D/index.mjs +0 -1228
- package/dist/mikuFireworks3D/index.mjs.map +0 -1
- package/dist/mikuFusionGame/index.d.mts +0 -117
- package/dist/mikuFusionGame/index.d.ts +0 -117
- package/dist/mikuFusionGame/index.js +0 -1208
- package/dist/mikuFusionGame/index.js.map +0 -1
- package/dist/mikuFusionGame/index.mjs +0 -1195
- package/dist/mikuFusionGame/index.mjs.map +0 -1
- package/dist/mmd/admin/index.d.mts +0 -487
- package/dist/mmd/admin/index.d.ts +0 -487
- package/dist/mmd/admin/index.js +0 -1058
- package/dist/mmd/admin/index.js.map +0 -1
- package/dist/mmd/admin/index.mjs +0 -1027
- package/dist/mmd/admin/index.mjs.map +0 -1
- package/dist/mmd/index.d.mts +0 -2467
- package/dist/mmd/index.d.ts +0 -2467
- package/dist/mmd/index.js +0 -10119
- package/dist/mmd/index.js.map +0 -1
- package/dist/mmd/index.mjs +0 -10028
- package/dist/mmd/index.mjs.map +0 -1
- package/dist/mmd/server/index.d.mts +0 -139
- package/dist/mmd/server/index.d.ts +0 -139
- package/dist/mmd/server/index.js +0 -424
- package/dist/mmd/server/index.js.map +0 -1
- package/dist/mmd/server/index.mjs +0 -404
- package/dist/mmd/server/index.mjs.map +0 -1
- package/dist/music/index.d.mts +0 -74
- package/dist/music/index.d.ts +0 -74
- package/dist/music/index.js +0 -830
- package/dist/music/index.js.map +0 -1
- package/dist/music/index.mjs +0 -809
- package/dist/music/index.mjs.map +0 -1
- package/dist/music/server/index.d.mts +0 -1
- package/dist/music/server/index.d.ts +0 -1
- package/dist/music/server/index.js +0 -194
- package/dist/music/server/index.js.map +0 -1
- package/dist/music/server/index.mjs +0 -182
- package/dist/music/server/index.mjs.map +0 -1
- package/dist/navigation/index.d.mts +0 -93
- package/dist/navigation/index.d.ts +0 -93
- package/dist/navigation/index.js +0 -453
- package/dist/navigation/index.js.map +0 -1
- package/dist/navigation/index.mjs +0 -443
- package/dist/navigation/index.mjs.map +0 -1
- package/dist/portfolio/index.d.mts +0 -66
- package/dist/portfolio/index.d.ts +0 -66
- package/dist/portfolio/index.js +0 -736
- package/dist/portfolio/index.js.map +0 -1
- package/dist/portfolio/index.mjs +0 -724
- package/dist/portfolio/index.mjs.map +0 -1
- package/dist/qqbot/server/index.d.mts +0 -216
- package/dist/qqbot/server/index.d.ts +0 -216
- package/dist/qqbot/server/index.js +0 -394
- package/dist/qqbot/server/index.js.map +0 -1
- package/dist/qqbot/server/index.mjs +0 -385
- package/dist/qqbot/server/index.mjs.map +0 -1
- package/dist/qqbot/ui/web/index.d.mts +0 -10
- package/dist/qqbot/ui/web/index.d.ts +0 -10
- package/dist/qqbot/ui/web/index.js +0 -105
- package/dist/qqbot/ui/web/index.js.map +0 -1
- package/dist/qqbot/ui/web/index.mjs +0 -99
- package/dist/qqbot/ui/web/index.mjs.map +0 -1
- package/dist/request/index.js +0 -22
- package/dist/request/index.mjs +0 -5
- package/dist/screenReceiver/index.d.mts +0 -86
- package/dist/screenReceiver/index.d.ts +0 -86
- package/dist/screenReceiver/index.js +0 -281
- package/dist/screenReceiver/index.js.map +0 -1
- package/dist/screenReceiver/index.mjs +0 -273
- package/dist/screenReceiver/index.mjs.map +0 -1
- package/dist/storage/index.js +0 -48
- package/dist/storage/index.mjs +0 -7
- package/dist/testYourself/admin/index.d.mts +0 -58
- package/dist/testYourself/admin/index.d.ts +0 -58
- package/dist/testYourself/admin/index.js +0 -1009
- package/dist/testYourself/admin/index.js.map +0 -1
- package/dist/testYourself/admin/index.mjs +0 -1002
- package/dist/testYourself/admin/index.mjs.map +0 -1
- package/dist/testYourself/index.d.mts +0 -53
- package/dist/testYourself/index.d.ts +0 -53
- package/dist/testYourself/index.js +0 -2551
- package/dist/testYourself/index.js.map +0 -1
- package/dist/testYourself/index.mjs +0 -2531
- package/dist/testYourself/index.mjs.map +0 -1
- package/dist/testYourself/server/index.d.mts +0 -1029
- package/dist/testYourself/server/index.d.ts +0 -1029
- package/dist/testYourself/server/index.js +0 -825
- package/dist/testYourself/server/index.js.map +0 -1
- package/dist/testYourself/server/index.mjs +0 -816
- package/dist/testYourself/server/index.mjs.map +0 -1
- package/dist/types-B6B210gX.d.mts +0 -270
- package/dist/types-B6B210gX.d.ts +0 -270
- package/dist/types-Bdnte5EN.d.mts +0 -292
- package/dist/types-Cs0CLvrH.d.mts +0 -70
- package/dist/types-Cs0CLvrH.d.ts +0 -70
- package/dist/types-HorDyIRv.d.mts +0 -303
- package/dist/types-HorDyIRv.d.ts +0 -303
- package/dist/types-_rFX1atk.d.ts +0 -292
- package/dist/universalExport/index.mjs +0 -5
- package/dist/universalExport/server/index.js +0 -123
- package/dist/universalExport/server/index.mjs +0 -6
- package/dist/universalFile/index.js.map +0 -1
- package/dist/universalFile/index.mjs.map +0 -1
- package/dist/universalFile/server/index.js.map +0 -1
- package/dist/universalFile/server/index.mjs.map +0 -1
- package/dist/utils/index.js +0 -46
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/index.mjs +0 -5
- package/dist/utils/index.mjs.map +0 -1
- package/dist/vocaloidBooth/index.d.mts +0 -64
- package/dist/vocaloidBooth/index.d.ts +0 -64
- package/dist/vocaloidBooth/index.js +0 -376
- package/dist/vocaloidBooth/index.js.map +0 -1
- package/dist/vocaloidBooth/index.mjs +0 -362
- package/dist/vocaloidBooth/index.mjs.map +0 -1
- package/dist/vocaloidBooth/server/index.d.mts +0 -111
- package/dist/vocaloidBooth/server/index.d.ts +0 -111
- package/dist/vocaloidBooth/server/index.js +0 -247
- package/dist/vocaloidBooth/server/index.js.map +0 -1
- package/dist/vocaloidBooth/server/index.mjs +0 -237
- package/dist/vocaloidBooth/server/index.mjs.map +0 -1
- package/dist/vocaloidBooth/web/index.d.mts +0 -3
- package/dist/vocaloidBooth/web/index.d.ts +0 -3
- package/dist/vocaloidBooth/web/index.js +0 -376
- package/dist/vocaloidBooth/web/index.js.map +0 -1
- package/dist/vocaloidBooth/web/index.mjs +0 -362
- package/dist/vocaloidBooth/web/index.mjs.map +0 -1
- /package/dist/{ai → common/ai}/llm/core/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/core/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/electron/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/electron/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/miniapp/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/miniapp/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/rn/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/rn/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/electron/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/electron/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/miniapp/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/miniapp/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/rn/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/rn/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/web/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/ui/web/index.mjs.map +0 -0
- /package/dist/{ai → common/ai}/llm/web/index.js.map +0 -0
- /package/dist/{ai → common/ai}/llm/web/index.mjs.map +0 -0
- /package/dist/{analytics → common/analytics}/index.js.map +0 -0
- /package/dist/{analytics → common/analytics}/index.mjs.map +0 -0
- /package/dist/{analytics → common/analytics}/server/index.d.mts +0 -0
- /package/dist/{analytics → common/analytics}/server/index.d.ts +0 -0
- /package/dist/{api → common/api}/index.js.map +0 -0
- /package/dist/{api → common/api}/index.mjs.map +0 -0
- /package/dist/{config → common/components}/index.js.map +0 -0
- /package/dist/{config → common/components}/index.mjs.map +0 -0
- /package/dist/{i18n → common/config}/index.js.map +0 -0
- /package/dist/{i18n → common/config}/index.mjs.map +0 -0
- /package/dist/{config → common/config}/server/index.d.mts +0 -0
- /package/dist/{config → common/config}/server/index.d.ts +0 -0
- /package/dist/{logger → common/i18n}/index.js.map +0 -0
- /package/dist/{logger → common/i18n}/index.mjs.map +0 -0
- /package/dist/{ossFile → common/imageCrop}/index.js.map +0 -0
- /package/dist/{ossFile → common/imageCrop}/index.mjs.map +0 -0
- /package/dist/{ossFile/server → common/ossFile}/index.js.map +0 -0
- /package/dist/{ossFile/server → common/ossFile}/index.mjs.map +0 -0
- /package/dist/{request → common/ossFile/server}/index.js.map +0 -0
- /package/dist/{request → common/ossFile/server}/index.mjs.map +0 -0
- /package/dist/{storage → common/universalExport}/index.js.map +0 -0
- /package/dist/{storage → common/universalExport}/index.mjs.map +0 -0
- /package/dist/{universalExport → common/universalExport/server}/index.js.map +0 -0
- /package/dist/{universalExport → common/universalExport/server}/index.mjs.map +0 -0
- /package/dist/{universalExport → common/universalFile}/server/index.js.map +0 -0
- /package/dist/{universalExport → common/universalFile}/server/index.mjs.map +0 -0
package/dist/chunk-FHLTPXAR.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkVMTEDX5H_js = require('./chunk-VMTEDX5H.js');
|
|
4
|
-
var chunkUIYKZ73N_js = require('./chunk-UIYKZ73N.js');
|
|
5
|
-
var chunkNSBPE2FW_js = require('./chunk-NSBPE2FW.js');
|
|
6
|
-
|
|
7
|
-
// src/common/export/index.ts
|
|
8
|
-
var export_exports = {};
|
|
9
|
-
chunkNSBPE2FW_js.__export(export_exports, {
|
|
10
|
-
API_BASE_PATH: () => chunkVMTEDX5H_js.API_BASE_PATH,
|
|
11
|
-
API_ENDPOINTS: () => chunkVMTEDX5H_js.API_ENDPOINTS,
|
|
12
|
-
DEFAULT_ADD_BOM: () => chunkVMTEDX5H_js.DEFAULT_ADD_BOM,
|
|
13
|
-
DEFAULT_CONFIG_CACHE_TTL: () => chunkVMTEDX5H_js.DEFAULT_CONFIG_CACHE_TTL,
|
|
14
|
-
DEFAULT_CSV_DELIMITER: () => chunkVMTEDX5H_js.DEFAULT_CSV_DELIMITER,
|
|
15
|
-
DEFAULT_ENCODING: () => chunkVMTEDX5H_js.DEFAULT_ENCODING,
|
|
16
|
-
DEFAULT_EXPORT_FORMAT: () => chunkVMTEDX5H_js.DEFAULT_EXPORT_FORMAT,
|
|
17
|
-
DEFAULT_EXPORT_TIMEOUT: () => chunkVMTEDX5H_js.DEFAULT_EXPORT_TIMEOUT,
|
|
18
|
-
DEFAULT_FORMATTERS: () => chunkVMTEDX5H_js.DEFAULT_FORMATTERS,
|
|
19
|
-
DEFAULT_MAX_CONCURRENT_EXPORTS: () => chunkVMTEDX5H_js.DEFAULT_MAX_CONCURRENT_EXPORTS,
|
|
20
|
-
DEFAULT_MAX_FILE_SIZE: () => chunkVMTEDX5H_js.DEFAULT_MAX_FILE_SIZE,
|
|
21
|
-
DEFAULT_MAX_ROWS: () => chunkVMTEDX5H_js.DEFAULT_MAX_ROWS,
|
|
22
|
-
DEFAULT_RESULT_CACHE_TTL: () => chunkVMTEDX5H_js.DEFAULT_RESULT_CACHE_TTL,
|
|
23
|
-
ERROR_CODES: () => chunkVMTEDX5H_js.ERROR_CODES,
|
|
24
|
-
EXPORT_FORMAT_EXTENSIONS: () => chunkVMTEDX5H_js.EXPORT_FORMAT_EXTENSIONS,
|
|
25
|
-
EXPORT_FORMAT_MIME_TYPES: () => chunkVMTEDX5H_js.EXPORT_FORMAT_MIME_TYPES,
|
|
26
|
-
ExportConfigEditor: () => chunkVMTEDX5H_js.ExportConfigEditor,
|
|
27
|
-
ExportConfigError: () => chunkUIYKZ73N_js.ExportConfigError,
|
|
28
|
-
ExportDataError: () => chunkUIYKZ73N_js.ExportDataError,
|
|
29
|
-
ExportFileError: () => chunkUIYKZ73N_js.ExportFileError,
|
|
30
|
-
ExportServiceError: () => chunkUIYKZ73N_js.ExportServiceError,
|
|
31
|
-
UNIVERSAL_EXPORT_NAME: () => chunkVMTEDX5H_js.UNIVERSAL_EXPORT_NAME,
|
|
32
|
-
UNIVERSAL_EXPORT_VERSION: () => chunkVMTEDX5H_js.UNIVERSAL_EXPORT_VERSION,
|
|
33
|
-
UniversalExportButton: () => chunkVMTEDX5H_js.UniversalExportButton,
|
|
34
|
-
UniversalExportClient: () => chunkVMTEDX5H_js.UniversalExportClient,
|
|
35
|
-
applyFormatter: () => chunkVMTEDX5H_js.applyFormatter,
|
|
36
|
-
createExportClient: () => chunkVMTEDX5H_js.createExportClient,
|
|
37
|
-
createExportError: () => chunkVMTEDX5H_js.createExportError,
|
|
38
|
-
escapeCSVField: () => chunkVMTEDX5H_js.escapeCSVField,
|
|
39
|
-
estimateEndTime: () => chunkVMTEDX5H_js.estimateEndTime,
|
|
40
|
-
formatDuration: () => chunkVMTEDX5H_js.formatDuration,
|
|
41
|
-
formatErrorMessage: () => chunkVMTEDX5H_js.formatErrorMessage,
|
|
42
|
-
formatFileSize: () => chunkVMTEDX5H_js.formatFileSize,
|
|
43
|
-
generateExportFileName: () => chunkVMTEDX5H_js.generateExportFileName,
|
|
44
|
-
getNestedValue: () => chunkVMTEDX5H_js.getNestedValue,
|
|
45
|
-
parseCSVField: () => chunkVMTEDX5H_js.parseCSVField,
|
|
46
|
-
sanitizeFileName: () => chunkVMTEDX5H_js.sanitizeFileName,
|
|
47
|
-
setNestedValue: () => chunkVMTEDX5H_js.setNestedValue,
|
|
48
|
-
universalExportClient: () => chunkVMTEDX5H_js.universalExportClient,
|
|
49
|
-
validateExportConfig: () => chunkVMTEDX5H_js.validateExportConfig,
|
|
50
|
-
validateExportRequest: () => chunkVMTEDX5H_js.validateExportRequest,
|
|
51
|
-
validateFileName: () => chunkVMTEDX5H_js.validateFileName
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
exports.export_exports = export_exports;
|
|
55
|
-
//# sourceMappingURL=chunk-FHLTPXAR.js.map
|
|
56
|
-
//# sourceMappingURL=chunk-FHLTPXAR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/index.ts","../src/api/types.ts","../src/api/BaseApiClient.ts"],"names":[],"mappings":"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","file":"chunk-FIUBFREP.mjs","sourcesContent":["/**\n * API 模块\n * API Module\n *\n * 提供通用的 API 客户端基类和类型定义\n */\n\nexport * from './types';\nexport * from './BaseApiClient';\n\n// 重新导出依赖的适配器类型,方便使用\nexport type { StorageAdapter } from '../storage';\nexport type { RequestAdapter, RequestConfig } from '../request';\n\n// 导出常用的默认配置\nexport { DEFAULT_STORAGE_KEYS, DEFAULT_API_ROUTES } from './types';\n\n","/**\n * API 通用类型定义\n * Common API Types\n */\n\n/**\n * API 响应类型\n * Generic API Response Format\n */\nexport interface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n meta?: {\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n [key: string]: any;\n };\n}\n\n/**\n * 分页参数类型\n * Pagination Parameters\n */\nexport interface PaginationParams {\n page?: number;\n limit?: number;\n search?: string;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * 认证响应类型(泛型)\n * Generic Auth Response\n */\nexport interface AuthResponse<TUser = any> {\n user: TUser;\n token: string;\n}\n\n/**\n * 默认存储键常量\n * Default Storage Keys\n */\nexport const DEFAULT_STORAGE_KEYS = {\n AUTH_TOKEN: 'auth_token',\n USER_DATA: 'user_data',\n REFRESH_TOKEN: 'refresh_token',\n} as const;\n\n/**\n * 存储键类型(可扩展)\n * Storage Keys Type\n */\nexport type StorageKeys = typeof DEFAULT_STORAGE_KEYS;\n\n/**\n * API 路由配置\n * API Routes Configuration\n */\nexport interface ApiRoutes {\n /** 认证相关路由 */\n auth?: {\n login?: string;\n logout?: string;\n register?: string;\n me?: string;\n };\n /** 用户相关路由 */\n users?: {\n list?: string;\n detail?: (id: string) => string;\n update?: (id: string) => string;\n delete?: (id: string) => string;\n };\n /** 自定义路由 */\n [key: string]: any;\n}\n\n/**\n * 默认 API 路由\n */\nexport const DEFAULT_API_ROUTES: ApiRoutes = {\n auth: {\n login: '/auth/login',\n logout: '/auth/logout',\n register: '/auth/register',\n me: '/auth/me',\n },\n users: {\n list: '/users',\n detail: (id: string) => '/users/' + (id),\n update: (id: string) => '/users/' + (id),\n delete: (id: string) => '/users/' + (id),\n },\n};\n","/**\n * 基础 API 客户端(泛型)\n * Base API Client (Generic)\n *\n * 提供统一的 API 调用逻辑,通过适配器模式支持多平台\n * 使用泛型 TUser 支持不同项目的用户类型\n */\n\nimport type { StorageAdapter } from '../storage';\nimport type { RequestAdapter, RequestConfig } from '../request';\nimport type { ApiResponse, AuthResponse, StorageKeys, ApiRoutes } from './types';\nimport { DEFAULT_STORAGE_KEYS, DEFAULT_API_ROUTES } from './types';\n\n/**\n * 基础 API 客户端配置\n */\nexport interface BaseApiClientConfig {\n /** 基础 URL */\n baseUrl: string;\n /** 存储适配器 */\n storage: StorageAdapter;\n /** 请求适配器 */\n request: RequestAdapter;\n /** 自定义存储键(可选) */\n storageKeys?: Partial<StorageKeys>;\n /** API 路由配置(可选) */\n routes?: ApiRoutes;\n}\n\n/**\n * 基础 API 客户端\n * @template TUser 用户类型(泛型)\n */\nexport class BaseApiClient<TUser = any> {\n protected token: string | null = null;\n protected user: TUser | null = null;\n protected baseUrl: string;\n protected storage: StorageAdapter;\n protected request: RequestAdapter;\n protected storageKeys: StorageKeys;\n protected routes: ApiRoutes;\n\n constructor(config: BaseApiClientConfig) {\n this.baseUrl = config.baseUrl;\n this.storage = config.storage;\n this.request = config.request;\n this.storageKeys = {\n ...DEFAULT_STORAGE_KEYS,\n ...(config.storageKeys || {}),\n };\n this.routes = {\n ...DEFAULT_API_ROUTES,\n ...(config.routes || {}),\n auth: {\n ...DEFAULT_API_ROUTES.auth,\n ...(config.routes?.auth || {}),\n },\n users: {\n ...DEFAULT_API_ROUTES.users,\n ...(config.routes?.users || {}),\n },\n };\n }\n\n /**\n * 初始化 - 从存储中加载 token 和用户信息\n */\n async init(): Promise<void> {\n try {\n this.token = await this.storage.getItem(this.storageKeys.AUTH_TOKEN);\n const userData = await this.storage.getItem(this.storageKeys.USER_DATA);\n if (userData) {\n this.user = JSON.parse(userData) as TUser;\n }\n } catch (error) {\n console.error('Failed to load auth data:', error);\n }\n }\n\n /**\n * 设置认证 token\n */\n async setToken(token: string | null): Promise<void> {\n this.token = token;\n if (token) {\n await this.storage.setItem(this.storageKeys.AUTH_TOKEN, token);\n } else {\n await this.storage.removeItem(this.storageKeys.AUTH_TOKEN);\n }\n }\n\n /**\n * 设置用户信息\n */\n async setUser(user: TUser | null): Promise<void> {\n this.user = user;\n if (user) {\n await this.storage.setItem(this.storageKeys.USER_DATA, JSON.stringify(user));\n } else {\n await this.storage.removeItem(this.storageKeys.USER_DATA);\n }\n }\n\n /**\n * 获取当前 token\n */\n getToken(): string | null {\n return this.token;\n }\n\n /**\n * 获取当前用户\n */\n getUser(): TUser | null {\n return this.user;\n }\n\n /**\n * 检查是否已登录\n */\n async isAuthenticated(): Promise<boolean> {\n return !!this.token;\n }\n\n /**\n * 清除用户数据\n */\n async clearUserData(): Promise<void> {\n await this.storage.removeItem(this.storageKeys.AUTH_TOKEN);\n await this.storage.removeItem(this.storageKeys.USER_DATA);\n if (this.storageKeys.REFRESH_TOKEN) {\n await this.storage.removeItem(this.storageKeys.REFRESH_TOKEN);\n }\n this.token = null;\n this.user = null;\n }\n\n /**\n * 发送请求的通用方法\n */\n protected async sendRequest<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n };\n\n // 添加认证 token\n if (this.token) {\n headers['Authorization'] = 'Bearer ' + (this.token);\n }\n\n const response = await this.request.request<ApiResponse<T>>({\n ...config,\n url: (this.baseUrl) + (config.url),\n headers,\n });\n\n return response;\n } catch (error) {\n console.error('API request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络错误,请重试',\n };\n }\n }\n\n /**\n * 发送 GET 请求\n */\n async get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'GET', params });\n }\n\n /**\n * 发送 POST 请求\n */\n async post<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'POST', body });\n }\n\n /**\n * 发送 PUT 请求\n */\n async put<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PUT', body });\n }\n\n /**\n * 发送 PATCH 请求\n */\n async patch<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PATCH', body });\n }\n\n /**\n * 发送 DELETE 请求\n */\n async delete<T = any>(url: string): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'DELETE' });\n }\n\n // ==================== 默认认证方法(子类可重写) ====================\n\n /**\n * 用户注册\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async register(\n email: string,\n password: string,\n username: string\n ): Promise<ApiResponse<AuthResponse<TUser>>> {\n if (!this.routes.auth?.register) {\n throw new Error('Register route is not configured');\n }\n\n const response = await this.post<AuthResponse<TUser>>(this.routes.auth.register, {\n email,\n password,\n username,\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n await this.onAuthSuccess?.(response.data.user, response.data.token);\n } else if (!response.success) {\n await this.onAuthError?.(response.error || 'Registration failed');\n }\n\n return response;\n }\n\n /**\n * 用户登录\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async login(email: string, password: string): Promise<ApiResponse<AuthResponse<TUser>>> {\n if (!this.routes.auth?.login) {\n throw new Error('Login route is not configured');\n }\n\n const response = await this.post<AuthResponse<TUser>>(this.routes.auth.login, {\n email,\n password,\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n await this.onAuthSuccess?.(response.data.user, response.data.token);\n } else if (!response.success) {\n await this.onAuthError?.(response.error || 'Login failed');\n }\n\n return response;\n }\n\n /**\n * 用户退出登录\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async logout(): Promise<void> {\n if (this.routes.auth?.logout) {\n await this.post<void>(this.routes.auth.logout);\n }\n\n // 无论请求成功与否,都清除本地数据\n await this.clearUserData();\n await this.onLogout?.();\n }\n\n /**\n * 获取当前用户信息\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async getCurrentUser(): Promise<ApiResponse<TUser>> {\n if (!this.routes.auth?.me) {\n throw new Error('Current user route is not configured');\n }\n\n const response = await this.get<any>(this.routes.auth.me);\n\n // 统一处理响应格式:自动展开 response.data.user 为 response.data\n if (response.success && response.data) {\n // 如果 data 是嵌套的 {user: {...}, session: {...}} 格式,提取 user\n const userData = response.data.user || response.data;\n\n await this.setUser(userData);\n\n return {\n ...response,\n data: userData,\n };\n }\n\n return response;\n }\n\n // ==================== 默认用户管理方法(子类可重写) ====================\n\n /**\n * 获取用户列表\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async getUsers(params?: {\n page?: number;\n limit?: number;\n search?: string;\n }): Promise<ApiResponse<{ users: TUser[]; total: number }>> {\n if (!this.routes.users?.list) {\n throw new Error('Users list route is not configured');\n }\n\n return this.get(this.routes.users.list, params);\n }\n\n /**\n * 获取用户详情\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async getUserById(userId: string): Promise<ApiResponse<TUser>> {\n if (!this.routes.users?.detail) {\n throw new Error('User detail route is not configured');\n }\n\n return this.get(this.routes.users.detail(userId));\n }\n\n /**\n * 更新用户信息\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async updateUser(userId: string, data: Partial<TUser>): Promise<ApiResponse<TUser>> {\n if (!this.routes.users?.update) {\n throw new Error('User update route is not configured');\n }\n\n return this.put(this.routes.users.update(userId), data);\n }\n\n /**\n * 删除用户\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async deleteUser(userId: string): Promise<ApiResponse<void>> {\n if (!this.routes.users?.delete) {\n throw new Error('User delete route is not configured');\n }\n\n return this.delete(this.routes.users.delete(userId));\n }\n\n // ==================== 子类可重写的钩子方法 ====================\n\n /**\n * 请求前钩子(子类可重写)\n */\n protected async onBeforeRequest?(config: RequestConfig): Promise<RequestConfig>;\n\n /**\n * 请求后钩子(子类可重写)\n */\n protected async onAfterRequest?<T>(response: ApiResponse<T>): Promise<ApiResponse<T>>;\n\n /**\n * 请求错误钩子(子类可重写)\n */\n protected async onRequestError?(error: Error): Promise<void>;\n\n /**\n * 认证成功钩子(子类可重写)\n */\n protected async onAuthSuccess?(user: TUser, token: string): Promise<void>;\n\n /**\n * 认证失败钩子(子类可重写)\n */\n protected async onAuthError?(error: string): Promise<void>;\n\n /**\n * 登出钩子(子类可重写)\n */\n protected async onLogout?(): Promise<void>;\n}\n\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ai/llm/prompt/variables.ts","../src/ai/llm/prompt/template.ts","../src/ai/llm/hooks/useAiChat.ts"],"names":["useRef","useState","useCallback"],"mappings":";;;;;AAIO,IAAM,wBAAA,GAA2B,CACtC,SAAA,GAA6B,EAAC,KACH;AAC3B,EAAA,MAAM,aAAqC,EAAC;AAE5C,EAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAClD,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,EAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,IAChC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,UAAA;AACT;;;ACXO,IAAM,mBAAA,GAAsB,CACjC,QAAA,EACA,SAAA,GAA6B,EAAC,EAC9B,OAAA,GAAiC,EAAC,KACvB;AACX,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,yBAAyB,SAAS,CAAA;AACnD,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,EAAA;AAE7C,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,kCAAA,EAAoC,CAAC,QAAQ,GAAA,KAAgB;AACnF,IAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,GAAG,CAAA,EAAG;AACvD,MAAA,OAAO,QAAA,CAAS,GAAG,CAAA,IAAK,EAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,OAAA,CAAQ,eAAA,GAAkB,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,CAAA,GAAO,YAAA;AAAA,EAClD,CAAC,CAAA;AACH;ACTA,IAAM,iBAAA,GAAoB,CAAC,YAAA,EAAuB,eAAA,KAA+C;AAC/F,EAAA,MAAM,eAA4B,EAAC;AACnC,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,YAAA,CAAa,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AAAA,EAC7D;AACA,EAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,IAAA,YAAA,CAAa,IAAA,CAAK,GAAG,eAAe,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,YAAA;AACT,CAAA;AAEO,IAAM,SAAA,GAAY,CAAC,OAAA,KAA8B;AACtD,EAAA,MAAM,eAAA,GAAkBA,YAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AACnD,EAAA,MAAM,WAAA,GAAcA,YAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAC3C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,cAAA;AAAA,IAAsB,MACpD,iBAAA,CAAkB,eAAA,CAAgB,OAAA,EAAS,QAAQ,eAAe;AAAA,GACpE;AACA,EAAA,MAAM,WAAA,GAAcD,aAAO,QAAQ,CAAA;AACnC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,eAAuB,MAAM,CAAA;AACzD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAgC,IAAI,CAAA;AAE5E,EAAA,MAAM,YAAA,GAAe,CAAC,YAAA,KAA8B;AAClD,IAAA,WAAA,CAAY,OAAA,GAAU,YAAA;AACtB,IAAA,WAAA,CAAY,YAAY,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQC,kBAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,iBAAA,CAAkB,eAAA,CAAgB,OAAA,EAAS,OAAA,CAAQ,eAAe,CAAC,CAAA;AAChF,IAAA,SAAA,CAAU,MAAM,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,OAAA,CAAQ,eAAe,CAAC,CAAA;AAE5B,EAAA,MAAM,eAAA,GAAkBA,iBAAA;AAAA,IACtB,CAAC,MAAA,KAAoB;AACnB,MAAA,eAAA,CAAgB,OAAA,GAAU,MAAA;AAC1B,MAAA,KAAA,EAAM;AAAA,IACR,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,WAAA,GAAcA,iBAAA;AAAA,IAClB,OAAO,KAAA,EAAe,cAAA,GAAqC,EAAC,KAAM;AAChE,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,aAAY,GAAI,cAAA;AAChD,MAAA,MAAM,cAAA,GAAiB,YAAY,WAAA,CAAY,OAAA;AAC/C,MAAA,MAAM,kBAAkB,EAAE,KAAA,EAAO,GAAI,SAAA,IAAa,EAAC,EAAG;AACtD,MAAA,MAAM,OAAA,GAAU,cAAA,GAAiB,mBAAA,CAAoB,cAAA,EAAgB,eAAe,CAAA,GAAI,KAAA;AAExF,MAAA,MAAM,WAAA,GAAyB,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAQ;AACvD,MAAA,MAAM,YAAA,GAAe,CAAC,GAAG,WAAA,CAAY,SAAS,WAAW,CAAA;AACzD,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS;AAAA,UAC7C,QAAA,EAAU,YAAA;AAAA,UACV,GAAG;AAAA,SACJ,CAAA;AAED,QAAA,MAAM,gBAAA,GACJ,SAAS,OAAA,IAAW;AAAA,UAClB,IAAA,EAAM,WAAA;AAAA,UACN,SAAS,QAAA,CAAS,OAAA;AAAA,UAClB,WAAW,QAAA,CAAS;AAAA,SACtB;AACF,QAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,YAAA,EAAc,gBAAgB,CAAA;AAC1D,QAAA,YAAA,CAAa,eAAe,CAAA;AAC5B,QAAA,SAAA,CAAU,SAAS,CAAA;AACnB,QAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,SAAA,GAAY,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACpE,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,QAAA,CAAS,SAAS,CAAA;AAClB,QAAA,MAAM,SAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,MAAM;AAAA,GACjB;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAW,MAAA,KAAW,SAAA;AAAA,IACtB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-FXQOXLDE.js","sourcesContent":["export type PromptVariableValue = string | number | boolean | null | undefined;\n\nexport type PromptVariables = Record<string, PromptVariableValue>;\n\nexport const normalizePromptVariables = (\n variables: PromptVariables = {}\n): Record<string, string> => {\n const normalized: Record<string, string> = {};\n\n Object.entries(variables).forEach(([key, value]) => {\n if (value === null || value === undefined) {\n normalized[key] = '';\n } else {\n normalized[key] = String(value);\n }\n });\n\n return normalized;\n};\n","import { normalizePromptVariables, PromptVariables } from './variables';\n\nexport interface PromptTemplateOptions {\n missingValue?: string;\n preserveUnknown?: boolean;\n}\n\nexport const applyPromptTemplate = (\n template: string,\n variables: PromptVariables = {},\n options: PromptTemplateOptions = {}\n): string => {\n if (!template) {\n return '';\n }\n\n const resolved = normalizePromptVariables(variables);\n const missingValue = options.missingValue ?? '';\n\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_.-]+)\\s*\\}\\}/g, (_match, key: string) => {\n if (Object.prototype.hasOwnProperty.call(resolved, key)) {\n return resolved[key] ?? '';\n }\n\n return options.preserveUnknown ? `{{${key}}}` : missingValue;\n });\n};\n","import { useCallback, useRef, useState } from 'react';\nimport { applyPromptTemplate } from '../prompt/template';\nimport type {\n AiChatInputOptions,\n AiChatResponse,\n AiChatStatus,\n AiClient,\n AiMessage,\n} from '../types';\n\nexport interface UseAiChatOptions {\n client: AiClient;\n systemPrompt?: string;\n template?: string;\n initialMessages?: AiMessage[];\n}\n\nconst buildBaseMessages = (systemPrompt?: string, initialMessages?: AiMessage[]): AiMessage[] => {\n const baseMessages: AiMessage[] = [];\n if (systemPrompt) {\n baseMessages.push({ role: 'system', content: systemPrompt });\n }\n if (initialMessages?.length) {\n baseMessages.push(...initialMessages);\n }\n return baseMessages;\n};\n\nexport const useAiChat = (options: UseAiChatOptions) => {\n const systemPromptRef = useRef(options.systemPrompt);\n const templateRef = useRef(options.template);\n const [messages, setMessages] = useState<AiMessage[]>(() =>\n buildBaseMessages(systemPromptRef.current, options.initialMessages)\n );\n const messagesRef = useRef(messages);\n const [status, setStatus] = useState<AiChatStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [lastResponse, setLastResponse] = useState<AiChatResponse | null>(null);\n\n const syncMessages = (nextMessages: AiMessage[]) => {\n messagesRef.current = nextMessages;\n setMessages(nextMessages);\n };\n\n const reset = useCallback(() => {\n syncMessages(buildBaseMessages(systemPromptRef.current, options.initialMessages));\n setStatus('idle');\n setError(null);\n setLastResponse(null);\n }, [options.initialMessages]);\n\n const setSystemPrompt = useCallback(\n (prompt?: string) => {\n systemPromptRef.current = prompt;\n reset();\n },\n [reset]\n );\n\n const sendMessage = useCallback(\n async (input: string, requestOptions: AiChatInputOptions = {}) => {\n const { template, variables, ...chatOptions } = requestOptions;\n const activeTemplate = template ?? templateRef.current;\n const mergedVariables = { input, ...(variables ?? {}) };\n const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;\n\n const userMessage: AiMessage = { role: 'user', content };\n const nextMessages = [...messagesRef.current, userMessage];\n syncMessages(nextMessages);\n setStatus('loading');\n setError(null);\n\n try {\n const response = await options.client.sendChat({\n messages: nextMessages,\n ...chatOptions,\n });\n\n const assistantMessage: AiMessage =\n response.message ?? {\n role: 'assistant',\n content: response.content,\n toolCalls: response.toolCalls,\n };\n const updatedMessages = [...nextMessages, assistantMessage];\n syncMessages(updatedMessages);\n setStatus('success');\n setLastResponse(response);\n return response;\n } catch (err) {\n const nextError = err instanceof Error ? err : new Error(String(err));\n setStatus('error');\n setError(nextError);\n throw nextError;\n }\n },\n [options.client]\n );\n\n return {\n status,\n isLoading: status === 'loading',\n error,\n messages,\n lastResponse,\n sendMessage,\n reset,\n setSystemPrompt,\n };\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ai/llm/client/request.ts","../src/ai/llm/providers/openai-compatible.ts","../src/ai/llm/client/createAiClient.ts","../src/ai/llm/client/createChatSession.ts","../src/ai/llm/skills/registry.ts"],"names":[],"mappings":"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","file":"chunk-G6HXNQ2U.mjs","sourcesContent":["import type { RequestAdapter } from '../../../request';\n\nexport type JsonRequestOptions = {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n headers?: Record<string, string>;\n body?: any;\n timeoutMs?: number;\n requestAdapter?: RequestAdapter;\n};\n\nexport const requestJson = async <T>(options: JsonRequestOptions): Promise<T> => {\n const { url, method = 'POST', headers = {}, body, timeoutMs, requestAdapter } = options;\n\n if (requestAdapter) {\n return requestAdapter.request<T>({\n url,\n method,\n headers,\n body,\n });\n }\n\n const controller = timeoutMs ? new AbortController() : undefined;\n const timeoutId = timeoutMs\n ? setTimeout(() => {\n controller?.abort();\n }, timeoutMs)\n : undefined;\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller?.signal,\n });\n\n const text = await response.text();\n let data: any = null;\n\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n }\n\n if (!response.ok) {\n const errorMessage =\n data?.error?.message ||\n data?.error ||\n data?.message ||\n `Request failed with status ${response.status}`;\n const error = new Error(errorMessage);\n (error as any).status = response.status;\n (error as any).data = data;\n throw error;\n }\n\n return data as T;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n};\n","import type {\n AiChatRequest,\n AiChatResponse,\n AiMessage,\n AiToolCall,\n AiUsage,\n ResolvedAiClientConfig,\n} from '../types';\nimport type { AiProvider } from './types';\nimport { requestJson } from '../client/request';\n\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_OPENAI_MODEL = 'gpt-3.5-turbo';\n\ntype OpenAIToolCall = {\n id?: string;\n type?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n};\n\ntype OpenAIMessage = {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n};\n\ntype OpenAIChatResponse = {\n id: string;\n choices?: Array<{\n message?: OpenAIMessage;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n};\n\nconst joinUrl = (base: string, path: string): string => {\n const trimmedBase = base.replace(/\\/+$/, '');\n const trimmedPath = path.replace(/^\\/+/, '');\n return `${trimmedBase}/${trimmedPath}`;\n};\n\nconst normalizeToolCalls = (toolCalls?: OpenAIToolCall[]): AiToolCall[] | undefined => {\n if (!toolCalls || !toolCalls.length) {\n return undefined;\n }\n\n return toolCalls.map((call, index) => ({\n id: call?.id ?? String(index),\n type: 'function',\n function: {\n name: call?.function?.name ?? '',\n arguments: call?.function?.arguments ?? '',\n },\n }));\n};\n\nconst normalizeUsage = (usage?: OpenAIChatResponse['usage']): AiUsage | undefined => {\n if (!usage) {\n return undefined;\n }\n\n return {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n};\n\nconst mapMessage = (message: AiMessage): Record<string, any> => {\n const mapped: Record<string, any> = {\n role: message.role,\n content: message.content,\n };\n\n if (message.name) {\n mapped.name = message.name;\n }\n if (message.toolCallId) {\n mapped.tool_call_id = message.toolCallId;\n }\n if (message.toolCalls?.length) {\n mapped.tool_calls = message.toolCalls.map((call) => ({\n id: call.id,\n type: call.type,\n function: {\n name: call.function.name,\n arguments: call.function.arguments,\n },\n }));\n }\n\n return mapped;\n};\n\nexport const createOpenAICompatibleProvider = (): AiProvider => {\n return {\n id: 'openai-compatible',\n sendChat: async (request: AiChatRequest, config: ResolvedAiClientConfig): Promise<AiChatResponse> => {\n if (request.stream) {\n throw new Error('Streaming is not supported in sendChat. Use streamChat when available.');\n }\n\n const model = request.model ?? config.model ?? DEFAULT_OPENAI_MODEL;\n if (!model) {\n throw new Error('Model is required for chat completion requests.');\n }\n\n const payload: Record<string, any> = {\n model,\n messages: request.messages.map(mapMessage),\n };\n\n if (request.temperature !== undefined) {\n payload.temperature = request.temperature;\n }\n if (request.maxTokens !== undefined) {\n payload.max_tokens = request.maxTokens;\n }\n if (request.topP !== undefined) {\n payload.top_p = request.topP;\n }\n if (request.stop !== undefined) {\n payload.stop = request.stop;\n }\n if (request.tools) {\n payload.tools = request.tools;\n }\n if (request.toolChoice) {\n payload.tool_choice = request.toolChoice;\n }\n\n const url = joinUrl(config.baseUrl || DEFAULT_OPENAI_BASE_URL, 'chat/completions');\n const response = await requestJson<OpenAIChatResponse>({\n url,\n method: 'POST',\n headers: config.headers,\n body: payload,\n timeoutMs: config.timeoutMs,\n requestAdapter: config.requestAdapter,\n });\n\n const firstMessage = response.choices?.[0]?.message;\n const toolCalls = normalizeToolCalls(firstMessage?.tool_calls);\n const content = firstMessage?.content ?? '';\n const assistantMessage: AiMessage = {\n role: 'assistant',\n content,\n toolCalls,\n };\n\n return {\n id: response.id ?? '',\n content,\n message: assistantMessage,\n usage: normalizeUsage(response.usage),\n toolCalls,\n raw: response,\n };\n },\n };\n};\n","import type {\n AiChatRequest,\n AiChatRequestOptions,\n AiChatResponse,\n AiClient,\n AiClientConfig,\n AiMessage,\n ResolvedAiClientConfig,\n} from '../types';\nimport type { AiProvider } from '../providers/types';\nimport { createOpenAICompatibleProvider } from '../providers/openai-compatible';\n\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\nconst resolveApiKey = async (config: AiClientConfig): Promise<string | undefined> => {\n if (config.apiKey) {\n return config.apiKey;\n }\n if (config.getApiKey) {\n return await config.getApiKey();\n }\n return undefined;\n};\n\nconst hasAuthorizationHeader = (headers: Record<string, string>): boolean => {\n return Object.keys(headers).some((key) => key.toLowerCase() === 'authorization');\n};\n\nconst resolveHeaders = async (config: AiClientConfig): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers ?? {}),\n };\n\n if (!hasAuthorizationHeader(headers)) {\n const apiKey = await resolveApiKey(config);\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n }\n\n return headers;\n};\n\nconst resolveClientConfig = async (config: AiClientConfig): Promise<ResolvedAiClientConfig> => {\n const headers = await resolveHeaders(config);\n\n return {\n ...config,\n baseUrl: config.baseUrl ?? 'https://api.openai.com/v1',\n headers,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n };\n};\n\nconst resolveProvider = (provider?: AiProvider): AiProvider => {\n return provider ?? createOpenAICompatibleProvider();\n};\n\nexport const createAiClient = (config: AiClientConfig): AiClient => {\n const provider = resolveProvider(config.provider);\n\n const sendChat = async (request: AiChatRequest): Promise<AiChatResponse> => {\n const resolvedConfig = await resolveClientConfig(config);\n config.logger?.debug?.('ai.sendChat', {\n model: request.model ?? resolvedConfig.model,\n messageCount: request.messages.length,\n });\n try {\n return await provider.sendChat(request, resolvedConfig);\n } catch (error) {\n config.logger?.error?.('ai.sendChat.error', error);\n throw error;\n }\n };\n\n type SendMessageOptions = AiChatRequestOptions & { systemPrompt?: string };\n\n const sendMessage = async (\n content: string,\n options?: SendMessageOptions\n ): Promise<AiChatResponse> => {\n const resolvedOptions: SendMessageOptions = options ?? {};\n const { systemPrompt, ...requestOptions } = resolvedOptions;\n\n const messages: AiMessage[] = [];\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n messages.push({ role: 'user', content });\n\n return sendChat({\n messages,\n ...requestOptions,\n });\n };\n\n return {\n sendChat,\n sendMessage,\n };\n};\n","import { applyPromptTemplate } from '../prompt/template';\nimport type { AiChatInputOptions, AiChatResponse, AiChatSession, AiChatSessionOptions, AiMessage } from '../types';\n\nconst buildBaseMessages = (systemPrompt?: string, initialMessages?: AiMessage[]): AiMessage[] => {\n const baseMessages: AiMessage[] = [];\n if (systemPrompt) {\n baseMessages.push({ role: 'system', content: systemPrompt });\n }\n if (initialMessages?.length) {\n baseMessages.push(...initialMessages);\n }\n return baseMessages;\n};\n\nexport const createChatSession = (options: AiChatSessionOptions): AiChatSession => {\n let systemPrompt = options.systemPrompt;\n let messages = buildBaseMessages(systemPrompt, options.initialMessages);\n\n const reset = () => {\n messages = buildBaseMessages(systemPrompt, options.initialMessages);\n };\n\n const setSystemPrompt = (prompt?: string) => {\n systemPrompt = prompt;\n reset();\n };\n\n const sendMessage = async (\n input: string,\n requestOptions: AiChatInputOptions = {}\n ): Promise<AiChatResponse> => {\n const { template, variables, ...chatOptions } = requestOptions;\n const activeTemplate = template ?? options.template;\n const mergedVariables = { input, ...(variables ?? {}) };\n const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;\n\n const userMessage: AiMessage = { role: 'user', content };\n const nextMessages = [...messages, userMessage];\n\n const response = await options.client.sendChat({\n messages: nextMessages,\n ...chatOptions,\n });\n\n const assistantMessage: AiMessage =\n response.message ?? {\n role: 'assistant',\n content: response.content,\n toolCalls: response.toolCalls,\n };\n\n messages = [...nextMessages, assistantMessage];\n\n return response;\n };\n\n return {\n getMessages: () => messages,\n setSystemPrompt,\n reset,\n sendMessage,\n };\n};\n","import type { AiToolDefinition } from '../types';\nimport type { SkillDefinition, SkillExecutionContext, SkillRegistry } from './types';\n\nexport const skillToToolDefinition = (skill: SkillDefinition): AiToolDefinition => {\n const toolDefinition: AiToolDefinition = {\n type: 'function',\n function: {\n name: skill.name,\n description: skill.description,\n },\n };\n\n if (skill.inputSchema) {\n toolDefinition.function.parameters = skill.inputSchema;\n }\n\n return toolDefinition;\n};\n\nexport class InMemorySkillRegistry implements SkillRegistry {\n private skills = new Map<string, SkillDefinition>();\n\n constructor(initialSkills?: SkillDefinition[]) {\n initialSkills?.forEach((skill) => {\n this.skills.set(skill.name, skill);\n });\n }\n\n registerSkill(skill: SkillDefinition): void {\n this.skills.set(skill.name, skill);\n }\n\n unregisterSkill(name: string): boolean {\n return this.skills.delete(name);\n }\n\n getSkill(name: string): SkillDefinition | undefined {\n return this.skills.get(name);\n }\n\n listSkills(): SkillDefinition[] {\n return Array.from(this.skills.values());\n }\n\n async executeSkill(name: string, input: any, context?: SkillExecutionContext): Promise<any> {\n const skill = this.skills.get(name);\n if (!skill) {\n throw new Error(`Skill not found: ${name}`);\n }\n return await skill.execute(input, context);\n }\n\n toToolDefinitions(): AiToolDefinition[] {\n return this.listSkills().map(skillToToolDefinition);\n }\n}\n\nexport const createSkillRegistry = (initialSkills?: SkillDefinition[]): InMemorySkillRegistry => {\n return new InMemorySkillRegistry(initialSkills);\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ai/llm/ui/miniapp/components/AiChatDialog.tsx"],"names":["useAiChat","useState","useMemo","useEffect","View","React","Text","ScrollView","Textarea","Button"],"mappings":"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","file":"chunk-G6NSKJMH.js","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/request/adapters/web-adapter.ts"],"names":[],"mappings":";AAWO,IAAM,oBAAN,MAAkD;AAAA,EACvD,MAAM,QAAiB,MAAA,EAAmC;AACxD,IAAA,MAAM,EAAE,KAAK,MAAA,GAAS,KAAA,EAAO,UAAU,EAAC,EAAG,IAAA,EAAM,MAAA,EAAO,GAAI,MAAA;AAG5D,IAAA,IAAI,OAAA,GAAU,GAAA;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,MAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,UAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACxC;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAA,IAAA,CAAY,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,MAAM,GAAA,IAAO,WAAA;AAAA,MAC/C;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAS;AAAA,MACpC,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG;AAAA,OACL;AAAA,MACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,MAAA;AAAA,MACpC,WAAA,EAAa;AAAA;AAAA,KACd,CAAA;AAGD,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAGjC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,4BAAA,GAAY,QAAA,CAAS;AAAA,OAC5C;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"chunk-G7UBMCUT.mjs","sourcesContent":["import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * Web 平台请求适配器\n * 基于标准 fetch API\n *\n * 适用平台:\n * - Web (Next.js)\n * - Desktop (Electron)\n * - Mobile (React Native)\n */\nexport class WebRequestAdapter implements RequestAdapter {\n async request<T = any>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n // 构建 URL(如果有查询参数)\n let fullUrl = url;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n fullUrl += (url.includes('?') ? '&' : '?') + queryString;\n }\n }\n\n // 发送请求\n const response = await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n credentials: 'include', // 🔐 自动发送和接收 Cookie(支持 httpOnly Cookie 认证)\n });\n\n // 解析响应\n const data = await response.json();\n\n // 如果响应不成功,返回错误格式\n if (!response.ok) {\n return {\n success: false,\n error: data.error || '请求失败: ' + (response.status),\n } as T;\n }\n\n return data;\n }\n}\n\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/request/adapters/miniapp-adapter.ts","../src/request/adapters/react-native-adapter.ts"],"names":[],"mappings":"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","file":"chunk-GSNGCENJ.js","sourcesContent":["import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * Taro Request 接口定义\n * 兼容 @tarojs/taro request API\n */\ninterface TaroRequestStatic {\n request<T = any>(options: {\n url: string;\n method?: string;\n header?: Record<string, string>;\n data?: any;\n }): Promise<{\n statusCode: number;\n data: T;\n }>;\n}\n\n/**\n * Miniapp 平台请求适配器\n * 基于 Taro.request API\n *\n * 使用方式:\n * ```typescript\n * import Taro from '@tarojs/taro'\n * const adapter = new MiniappRequestAdapter(Taro)\n * ```\n *\n * 适用平台:\n * - WeChat Miniapp\n * - Other Taro-based miniapps\n */\nexport class MiniappRequestAdapter implements RequestAdapter {\n private taro: TaroRequestStatic;\n\n constructor(taro: TaroRequestStatic) {\n if (!taro) {\n throw new Error('MiniappRequestAdapter requires Taro instance');\n }\n this.taro = taro;\n }\n\n async request<T = any>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n try {\n const response = await this.taro.request({\n url,\n method: method as any,\n header: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n data: method === 'GET' ? params : body,\n });\n\n const data = response.data as any;\n\n // 统一返回格式\n if (response.statusCode >= 200 && response.statusCode < 300) {\n return data;\n } else {\n return {\n success: false,\n error: data.error || '请求失败: ' + (response.statusCode),\n } as T;\n }\n } catch (error) {\n console.error('[MiniappRequestAdapter] request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络请求失败',\n } as T;\n }\n }\n}\n\n","import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * React Native 请求适配器(fetch,不携带 Cookie)\n * 与 WebRequestAdapter 的区别:RN 跨域场景下 credentials:include 无效且易误导\n */\nexport class ReactNativeRequestAdapter implements RequestAdapter {\n async request<T = unknown>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n let fullUrl = url;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const qs = searchParams.toString();\n if (qs) {\n fullUrl += url.includes('?') ? `&${qs}` : `?${qs}`;\n }\n }\n\n const response = await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = (await response.json()) as T & { error?: string };\n if (!response.ok) {\n return {\n success: false,\n error:\n (data as { error?: string }).error ??\n `请求失败 (${response.status})`,\n } as T;\n }\n return data;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/universalExport/constants.ts","../src/universalExport/utils.ts","../src/universalExport/client.ts","../src/universalExport/components/ExportConfigEditor.tsx","../src/universalExport/components/UniversalExportButton.tsx"],"names":["config","useState","useCallback","React","FileText","Settings","clsx"],"mappings":"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","file":"chunk-GWNBVGDT.mjs","sourcesContent":["/**\n * 通用导出服务常量定义\n */\n\nimport type { ExportFormat } from './types';\n\n// ============= 版本信息 =============\n\n/** 模块版本 */\nexport const UNIVERSAL_EXPORT_VERSION = '1.0.0';\n\n/** 模块名称 */\nexport const UNIVERSAL_EXPORT_NAME = '@lyricnote/universal-export';\n\n// ============= 默认配置 =============\n\n/** 默认导出格式 */\nexport const DEFAULT_EXPORT_FORMAT: ExportFormat = 'csv';\n\n/** 默认CSV分隔符 */\nexport const DEFAULT_CSV_DELIMITER = ',';\n\n/** 默认编码格式 */\nexport const DEFAULT_ENCODING = 'utf-8';\n\n/** 默认是否添加BOM */\nexport const DEFAULT_ADD_BOM = true;\n\n/** 默认最大文件大小(字节) - 100MB */\nexport const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;\n\n/** 默认最大行数限制 */\nexport const DEFAULT_MAX_ROWS = 100000;\n\n/** 默认并发导出数量 */\nexport const DEFAULT_MAX_CONCURRENT_EXPORTS = 5;\n\n/** 默认导出超时时间(毫秒) - 5分钟 */\nexport const DEFAULT_EXPORT_TIMEOUT = 300000;\n\n/** 默认配置缓存TTL(秒) - 1小时 */\nexport const DEFAULT_CONFIG_CACHE_TTL = 3600;\n\n/** 默认结果缓存TTL(秒) - 30分钟 */\nexport const DEFAULT_RESULT_CACHE_TTL = 1800;\n\n// ============= 文件扩展名 =============\n\n/** 导出格式对应的文件扩展名 */\nexport const EXPORT_FORMAT_EXTENSIONS: Record<ExportFormat, string> = {\n csv: 'csv',\n excel: 'xlsx',\n json: 'json',\n};\n\n/** 导出格式对应的MIME类型 */\nexport const EXPORT_FORMAT_MIME_TYPES: Record<ExportFormat, string> = {\n csv: 'text/csv; charset=utf-8',\n excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n json: 'application/json; charset=utf-8',\n};\n\n// ============= API端点 =============\n\n/** API基础路径 */\nexport const API_BASE_PATH = '/api/universal-export';\n\n/** API端点 */\nexport const API_ENDPOINTS = {\n /** 获取配置列表 */\n GET_CONFIGS: (API_BASE_PATH) + '/configs',\n /** 创建配置 */\n CREATE_CONFIG: (API_BASE_PATH) + '/configs',\n /** 更新配置 */\n UPDATE_CONFIG: (configId: string) => (API_BASE_PATH) + '/configs/' + (configId),\n /** 删除配置 */\n DELETE_CONFIG: (configId: string) => (API_BASE_PATH) + '/configs/' + (configId),\n /** 触发导出 */\n EXPORT_DATA: (API_BASE_PATH) + '/export',\n /** 查询导出进度 */\n GET_PROGRESS: (exportId: string) => (API_BASE_PATH) + '/export/' + (exportId) + '/progress',\n /** 下载导出文件 */\n DOWNLOAD_FILE: (exportId: string) => (API_BASE_PATH) + '/export/' + (exportId) + '/download',\n} as const;\n\n// ============= 错误代码 =============\n\n/** 错误代码 */\nexport const ERROR_CODES = {\n /** 导出配置错误 */\n EXPORT_CONFIG_ERROR: 'EXPORT_CONFIG_ERROR',\n /** 导出数据错误 */\n EXPORT_DATA_ERROR: 'EXPORT_DATA_ERROR',\n /** 导出文件错误 */\n EXPORT_FILE_ERROR: 'EXPORT_FILE_ERROR',\n /** 网络错误 */\n NETWORK_ERROR: 'NETWORK_ERROR',\n /** 超时错误 */\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n /** 未授权 */\n UNAUTHORIZED: 'UNAUTHORIZED',\n /** 服务器错误 */\n SERVER_ERROR: 'SERVER_ERROR',\n} as const;\n","/**\n * 通用导出服务工具函数\n */\n\nimport type { ExportFormat, Formatter } from './types';\nimport { EXPORT_FORMAT_EXTENSIONS } from './constants';\n\n// ============= 文件名处理 =============\n\n/**\n * 生成导出文件名\n */\nexport function generateExportFileName(template: string, format: ExportFormat): string {\n const now = new Date();\n const dateStr = now.toISOString().split('T')[0] || '';\n const timeStr = (now.toTimeString().split(' ')[0] || '').replace(/:/g, '-');\n const extension = EXPORT_FORMAT_EXTENSIONS[format];\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 * 验证文件名是否合法\n */\nexport function validateFileName(fileName: string): boolean {\n // 检查是否包含非法字符\n const invalidChars = /[<>:\"|?*\\/\\\\]/;\n if (invalidChars.test(fileName)) {\n return false;\n }\n\n // 检查长度\n if (fileName.length === 0 || fileName.length > 255) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 清理文件名,移除非法字符\n */\nexport function sanitizeFileName(fileName: string): string {\n return fileName.replace(/[<>:\"|?*\\/\\\\]/g, '_').substring(0, 255);\n}\n\n// ============= CSV处理 =============\n\n/**\n * 转义CSV字段\n */\nexport function escapeCSVField(value: string, delimiter: string = ','): string {\n const valueStr = String(value || '');\n\n // 如果包含分隔符、双引号或换行符,需要用双引号包裹并转义内部的双引号\n if (valueStr.includes(delimiter) || valueStr.includes('\"') || valueStr.includes('\\n')) {\n return '\"' + (valueStr.replace(/\"/g, '\"\"')) + '\"';\n }\n\n return valueStr;\n}\n\n/**\n * 解析CSV字段\n */\nexport function parseCSVField(field: string): string {\n // 如果字段被双引号包裹,移除双引号并还原转义的双引号\n if (field.startsWith('\"') && field.endsWith('\"')) {\n return field.slice(1, -1).replace(/\"\"/g, '\"');\n }\n\n return field;\n}\n\n// ============= 数据格式化 =============\n\n/**\n * 内置格式化器集合\n */\nexport const DEFAULT_FORMATTERS: Record<string, Formatter> = {\n // 日期格式化\n date: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n if (isNaN(date.getTime())) return String(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 if (isNaN(date.getTime())) return String(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 */\nexport function applyFormatter(value: any, formatter?: Formatter, type?: string): string {\n // 优先使用自定义格式化器\n if (formatter) {\n return formatter(value);\n }\n\n // 使用类型对应的默认格式化器\n if (type && DEFAULT_FORMATTERS[type]) {\n return DEFAULT_FORMATTERS[type](value);\n }\n\n // 默认转字符串\n return String(value || '');\n}\n\n// ============= 数据验证 =============\n\n/**\n * 验证导出配置\n */\nexport function validateExportConfig(config: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 检查必填字段\n if (!config.name || config.name.trim() === '') {\n errors.push('配置名称不能为空');\n }\n\n if (!config.fields || !Array.isArray(config.fields) || config.fields.length === 0) {\n errors.push('至少需要定义一个字段');\n }\n\n if (config.fields) {\n const enabledFields = config.fields.filter((f: any) => f.enabled);\n if (enabledFields.length === 0) {\n errors.push('至少需要启用一个字段');\n }\n\n // 检查字段键名唯一性\n const keys = config.fields.map((f: any) => f.key);\n const uniqueKeys = new Set(keys);\n if (keys.length !== uniqueKeys.size) {\n errors.push('字段键名必须唯一');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * 验证导出请求\n */\nexport function validateExportRequest(request: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!request.configId) {\n errors.push('导出配置ID不能为空');\n }\n\n if (!request.dataSource) {\n errors.push('数据源不能为空');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n// ============= 文件大小格式化 =============\n\n/**\n * 格式化文件大小\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return ((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + (units[i]);\n}\n\n// ============= 时间处理 =============\n\n/**\n * 格式化持续时间\n */\nexport function formatDuration(milliseconds: number): string {\n if (milliseconds < 1000) {\n return (milliseconds) + 'ms';\n }\n\n const seconds = Math.floor(milliseconds / 1000);\n\n if (seconds < 60) {\n return (seconds) + '秒';\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n\n if (minutes < 60) {\n return remainingSeconds > 0 ? (minutes) + '分' + (remainingSeconds) + '秒' : (minutes) + '分钟';\n }\n\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n\n return remainingMinutes > 0 ? (hours) + '小时' + (remainingMinutes) + '分钟' : (hours) + '小时';\n}\n\n/**\n * 计算预计完成时间\n */\nexport function estimateEndTime(\n startTime: Date,\n processedRows: number,\n totalRows: number\n): Date | undefined {\n if (processedRows === 0 || totalRows === 0) {\n return undefined;\n }\n\n const elapsed = Date.now() - startTime.getTime();\n const avgTimePerRow = elapsed / processedRows;\n const remainingRows = totalRows - processedRows;\n const remainingTime = avgTimePerRow * remainingRows;\n\n return new Date(Date.now() + remainingTime);\n}\n\n// ============= 数据处理 =============\n\n/**\n * 获取嵌套对象的值\n */\nexport function 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 */\nexport function setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split('.');\n const lastKey = keys.pop();\n\n if (!lastKey) return;\n\n const target = keys.reduce((current, key) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n}\n\n// ============= 错误处理 =============\n\n/**\n * 创建导出错误对象\n */\nexport function createExportError(\n code: string,\n message: string,\n details?: Record<string, any>\n): { code: string; message: string; details?: Record<string, any>; timestamp: Date } {\n return {\n code,\n message,\n details,\n timestamp: new Date(),\n };\n}\n\n/**\n * 格式化错误消息\n */\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return '未知错误';\n}\n","/**\n * 通用导出服务客户端SDK\n *\n * 提供与后端API交互的客户端接口\n */\n\nimport type { ExportConfig, ExportProgress, ExportResult, ExportRequest } from './types';\nimport { API_ENDPOINTS, ERROR_CODES } from './constants';\nimport { createExportError, formatErrorMessage } from './utils';\n\n// ============= 配置类型 =============\n\nexport interface UniversalExportClientConfig {\n /** API基础URL */\n baseUrl?: string;\n /** 请求超时时间(毫秒) */\n timeout?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\n// ============= 客户端类 =============\n\n/**\n * 通用导出服务客户端\n */\nexport class UniversalExportClient {\n private config: UniversalExportClientConfig;\n\n constructor(config: UniversalExportClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || '',\n timeout: config.timeout || 30000,\n headers: config.headers || {},\n };\n }\n\n // ============= 配置管理API =============\n\n /**\n * 获取模块的导出配置列表\n */\n async getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]> {\n const params = new URLSearchParams({ moduleId });\n if (businessId) {\n params.append('businessId', businessId);\n }\n\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_CONFIGS) + '?' + (params);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取配置失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformConfigsFromAPI(data.configs || []);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '获取导出配置失败: ' + (formatErrorMessage(error)),\n { moduleId, businessId, originalError: error }\n );\n }\n }\n\n /**\n * 创建导出配置\n */\n async createConfig(\n config: Omit<ExportConfig, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<ExportConfig> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.CREATE_CONFIG);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(config),\n });\n\n if (!response.ok) {\n throw new Error('创建配置失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformConfigFromAPI(data.config);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '创建导出配置失败: ' + (formatErrorMessage(error)),\n { config, originalError: error }\n );\n }\n }\n\n /**\n * 更新导出配置\n */\n async updateConfig(configId: string, updates: Partial<ExportConfig>): Promise<ExportConfig> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.UPDATE_CONFIG(configId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'PUT',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updates),\n });\n\n if (!response.ok) {\n throw new Error('更新配置失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformConfigFromAPI(data.config);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '更新导出配置失败: ' + (formatErrorMessage(error)),\n { configId, updates, originalError: error }\n );\n }\n }\n\n /**\n * 删除导出配置\n */\n async deleteConfig(configId: string): Promise<void> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.DELETE_CONFIG(configId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('删除配置失败: ' + (response.statusText));\n }\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '删除导出配置失败: ' + (formatErrorMessage(error)),\n { configId, originalError: error }\n );\n }\n }\n\n // ============= 导出执行API =============\n\n /**\n * 触发数据导出\n */\n async exportData(request: Omit<ExportRequest, 'callbacks' | 'dataSource'> & {\n dataSource: any[] | string;\n }): Promise<ExportResult> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.EXPORT_DATA);\n\n try {\n // 如果 dataSource 是数组,我们需要将其作为请求体的一部分\n const isDataArray = Array.isArray(request.dataSource);\n\n const requestBody: any = {\n queryParams: request.queryParams,\n fieldMapping: request.fieldMapping,\n filters: request.filters,\n sortBy: request.sortBy,\n pagination: request.pagination,\n customFileName: request.customFileName,\n };\n\n // 支持两种方式:传字符串 ID(服务端从缓存/数据库查找)或传完整配置对象(服务端直接使用)\n if (typeof request.configId === 'string') {\n requestBody.configId = request.configId;\n } else if (request.configId && typeof request.configId === 'object') {\n // 传入完整配置对象时,只设置 config 字段,避免与字符串 configId 产生歧义\n requestBody.config = request.configId;\n }\n\n // 如果是数组数据,直接包含在请求体中\n if (isDataArray) {\n requestBody.data = request.dataSource;\n } else {\n requestBody.dataSource = request.dataSource;\n }\n\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData;\n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n throw new Error(errorData.message || '导出失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformExportResultFromAPI(data.result);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.EXPORT_DATA_ERROR,\n '数据导出失败: ' + (formatErrorMessage(error)),\n { request, originalError: error }\n );\n }\n }\n\n /**\n * 查询导出进度\n */\n async getExportProgress(exportId: string): Promise<ExportProgress> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_PROGRESS(exportId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取导出进度失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformProgressFromAPI(data.progress);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '获取导出进度失败: ' + (formatErrorMessage(error)),\n { exportId, originalError: error }\n );\n }\n }\n\n /**\n * 下载导出文件\n */\n async downloadExportFile(exportId: string): Promise<Blob> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.DOWNLOAD_FILE(exportId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('下载文件失败: ' + (response.statusText));\n }\n\n return await response.blob();\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '下载导出文件失败: ' + (formatErrorMessage(error)),\n { exportId, originalError: error }\n );\n }\n }\n\n // ============= 私有辅助方法 =============\n\n /**\n * 获取请求头\n */\n private getHeaders(): Record<string, string> {\n return {\n ...this.config.headers,\n };\n }\n\n /**\n * 带超时的fetch请求\n */\n private async fetchWithTimeout(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createExportError(ERROR_CODES.TIMEOUT_ERROR, '请求超时', {\n url,\n timeout: this.config.timeout,\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 转换API返回的配置数据\n */\n private transformConfigFromAPI(apiConfig: any): ExportConfig {\n return {\n id: apiConfig.id,\n name: apiConfig.name,\n description: apiConfig.description || undefined,\n format: apiConfig.format,\n fields: apiConfig.fields,\n grouping: apiConfig.grouping,\n fileNameTemplate: apiConfig.fileNameTemplate,\n includeHeader: apiConfig.includeHeader,\n delimiter: apiConfig.delimiter,\n encoding: apiConfig.encoding,\n addBOM: apiConfig.addBOM,\n maxRows: apiConfig.maxRows || undefined,\n createdAt: new Date(apiConfig.createdAt),\n updatedAt: new Date(apiConfig.updatedAt),\n moduleId: apiConfig.moduleId,\n businessId: apiConfig.businessId || undefined,\n createdBy: apiConfig.createdBy || undefined,\n };\n }\n\n /**\n * 转换API返回的配置列表\n */\n private transformConfigsFromAPI(apiConfigs: any[]): ExportConfig[] {\n return apiConfigs.map((config) => this.transformConfigFromAPI(config));\n }\n\n /**\n * 转换API返回的导出结果\n */\n private transformExportResultFromAPI(apiResult: any): ExportResult {\n const fileBlob = this.createFileBlobFromBase64(\n apiResult.fileData ?? apiResult.fileBlob,\n apiResult.fileName\n );\n\n return {\n exportId: apiResult.exportId,\n fileName: apiResult.fileName,\n fileSize: apiResult.fileSize,\n fileUrl: apiResult.fileUrl,\n fileBlob,\n exportedRows: apiResult.exportedRows,\n startTime: new Date(apiResult.startTime),\n endTime: new Date(apiResult.endTime),\n duration: apiResult.duration,\n statistics: apiResult.statistics,\n };\n }\n\n /**\n * 将后端返回的base64文件数据转换为Blob\n */\n private createFileBlobFromBase64(fileData?: string, fileName?: string): Blob | undefined {\n if (!fileData || typeof fileData !== 'string') {\n return undefined;\n }\n\n try {\n if (typeof atob === 'function') {\n const binaryString = atob(fileData);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n const arrayBuffer = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n );\n return new Blob([arrayBuffer], { type: this.getMimeTypeByFileName(fileName) });\n } else if (typeof Buffer !== 'undefined') {\n const bufferBytes = Buffer.from(fileData, 'base64');\n const bytes = Uint8Array.from(bufferBytes);\n const arrayBuffer = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n );\n return new Blob([arrayBuffer], { type: this.getMimeTypeByFileName(fileName) });\n } else {\n return undefined;\n }\n } catch {\n return undefined;\n }\n }\n\n /**\n * 根据文件名推断MIME类型\n */\n private getMimeTypeByFileName(fileName?: string): string {\n const extension = fileName?.split('.').pop()?.toLowerCase();\n\n switch (extension) {\n case 'csv':\n return 'text/csv; charset=utf-8';\n case 'xlsx':\n case 'xls':\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n case 'json':\n return 'application/json; charset=utf-8';\n default:\n return 'application/octet-stream';\n }\n }\n\n /**\n * 转换API返回的进度数据\n */\n private transformProgressFromAPI(apiProgress: any): ExportProgress {\n return {\n exportId: apiProgress.exportId,\n status: apiProgress.status,\n progress: apiProgress.progress,\n processedRows: apiProgress.processedRows,\n totalRows: apiProgress.totalRows,\n startTime: new Date(apiProgress.startTime),\n estimatedEndTime: apiProgress.estimatedEndTime\n ? new Date(apiProgress.estimatedEndTime)\n : undefined,\n currentData: apiProgress.currentData,\n error: apiProgress.error,\n };\n }\n}\n\n// ============= 单例导出 =============\n\n/**\n * 默认客户端实例\n */\nexport const universalExportClient = new UniversalExportClient();\n\n/**\n * 创建自定义客户端实例\n */\nexport function createExportClient(config?: UniversalExportClientConfig): UniversalExportClient {\n return new UniversalExportClient(config);\n}\n","/**\n * 导出配置编辑器组件\n * \n * 提供可视化的导出字段配置编辑功能\n */\n\n'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport { \n Settings, \n Trash2, \n Eye, \n EyeOff, \n MoveUp, \n MoveDown, \n Save, \n X,\n FileText,\n Calendar,\n Hash,\n CheckSquare,\n Type,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Group,\n GitMerge,\n Layers,\n ArrowUpDown,\n FileSpreadsheet,\n Database\n} from 'lucide-react';\n\nimport type { \n ExportConfig, \n ExportField, \n FieldType, \n FieldAlignment,\n ExportFormat,\n GroupingConfig,\n GroupingField,\n GroupingMode,\n GroupValueProcessing\n} from '../types';\n\n// ============= 类型定义 =============\n\nexport interface ExportConfigEditorProps {\n /** 初始配置 */\n initialConfig?: ExportConfig;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 可用的字段定义 */\n availableFields: ExportField[];\n /** 保存配置回调 */\n onSave?: (config: ExportConfig) => void;\n /** 取消回调 */\n onCancel?: () => void;\n /** 是否显示 */\n visible?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 配置变化回调(新增/删除/更新) */\n onConfigChange?: () => void;\n}\n\n// ============= 字段类型图标映射 =============\n\nconst FIELD_TYPE_ICONS: Record<FieldType, React.ReactNode> = {\n string: <Type className=\"w-4 h-4\" />,\n number: <Hash className=\"w-4 h-4\" />,\n date: <Calendar className=\"w-4 h-4\" />,\n boolean: <CheckSquare className=\"w-4 h-4\" />,\n array: <FileText className=\"w-4 h-4\" />,\n object: <FileText className=\"w-4 h-4\" />,\n};\n\nconst FIELD_TYPE_LABELS: Record<FieldType, string> = {\n string: '文本',\n number: '数字',\n date: '日期',\n boolean: '布尔',\n array: '数组',\n object: '对象',\n};\n\nconst ALIGNMENT_ICONS: Record<FieldAlignment, React.ReactNode> = {\n left: <AlignLeft className=\"w-4 h-4\" />,\n center: <AlignCenter className=\"w-4 h-4\" />,\n right: <AlignRight className=\"w-4 h-4\" />,\n};\n\nconst ALIGNMENT_LABELS: Record<FieldAlignment, string> = {\n left: '左对齐',\n center: '居中对齐',\n right: '右对齐',\n};\n\n// ============= 分组相关标签 =============\n\nconst GROUPING_MODE_LABELS: Record<GroupingMode, string> = {\n merge: '合并模式',\n separate: '分离模式',\n nested: '嵌套模式',\n};\n\nconst GROUPING_MODE_DESCRIPTIONS: Record<GroupingMode, string> = {\n merge: '同组数据合并显示,Excel支持单元格合并',\n separate: '每个分组独立显示,可添加分组头',\n nested: '支持多级嵌套分组',\n};\n\nconst VALUE_PROCESSING_LABELS: Record<GroupValueProcessing, string> = {\n first: '取第一个值',\n last: '取最后一个值',\n concat: '连接所有值',\n sum: '求和',\n count: '计数',\n custom: '自定义处理',\n};\n\nconst FORMAT_ICONS: Record<ExportFormat, React.ReactNode> = {\n csv: <FileText className=\"w-4 h-4\" />,\n excel: <FileSpreadsheet className=\"w-4 h-4\" />,\n json: <Database className=\"w-4 h-4\" />,\n};\n\nconst FORMAT_DESCRIPTIONS: Record<ExportFormat, string> = {\n csv: '逗号分隔值文件,兼容性最好',\n excel: 'Excel表格文件,支持格式化和单元格合并',\n json: 'JSON数据文件,适合开发者使用',\n};\n\n// ============= 主组件 =============\n\nexport const ExportConfigEditor: React.FC<ExportConfigEditorProps> = ({\n initialConfig,\n moduleId,\n businessId,\n availableFields,\n onSave,\n onCancel,\n visible = false,\n className = '',\n onConfigChange,\n}) => {\n // ============= 状态管理 =============\n \n const [config, setConfig] = useState<ExportConfig>(() => {\n if (initialConfig) {\n return { ...initialConfig };\n }\n \n // 创建默认配置\n return {\n id: '',\n name: '新建导出配置',\n description: '',\n format: 'csv',\n fields: availableFields.map((field, index) => ({\n ...field,\n enabled: true,\n sortOrder: index,\n })),\n grouping: {\n enabled: false,\n fields: [],\n preserveOrder: true,\n nullValueHandling: 'separate',\n nullGroupName: '未分组'\n },\n fileNameTemplate: '导出数据_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n maxRows: undefined,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId,\n businessId,\n };\n });\n\n const [activeTab, setActiveTab] = useState<'basic' | 'fields' | 'grouping' | 'manage'>('basic');\n \n // 配置管理相关状态\n const [savedConfigs, setSavedConfigs] = useState<ExportConfig[]>([]);\n const [loadingConfigs, setLoadingConfigs] = useState(false);\n const [deletingConfigId, setDeletingConfigId] = useState<string | null>(null);\n\n // 加载已保存的配置\n const loadSavedConfigs = useCallback(async () => {\n if (!visible || activeTab !== 'manage') return;\n \n setLoadingConfigs(true);\n try {\n const params = new URLSearchParams({ moduleId });\n if (businessId) {\n params.set('businessId', businessId);\n }\n \n const response = await fetch('/api/universal-export/configs?' + (params.toString()));\n if (response.ok) {\n const data = await response.json();\n setSavedConfigs(data.configs || []);\n }\n } catch (error) {\n console.error('加载配置异常:', error);\n } finally {\n setLoadingConfigs(false);\n }\n }, [visible, activeTab, moduleId, businessId]);\n\n // 删除配置\n const deleteConfig = useCallback(async (configId: string) => {\n setDeletingConfigId(configId);\n try {\n const response = await fetch('/api/universal-export/configs/' + (configId), {\n method: 'DELETE'\n });\n if (response.ok) {\n setSavedConfigs(prev => prev.filter(cfg => cfg.id !== configId));\n onConfigChange?.();\n }\n } catch (error) {\n console.error('删除配置失败:', error);\n } finally {\n setDeletingConfigId(null);\n }\n }, [onConfigChange]);\n\n // 加载配置到编辑器\n const loadConfigToEditor = useCallback((config: ExportConfig) => {\n setConfig(config);\n setActiveTab('basic');\n }, []);\n\n // 当切换到管理tab时加载配置\n useEffect(() => {\n if (activeTab === 'manage') {\n loadSavedConfigs();\n }\n }, [activeTab, loadSavedConfigs]);\n\n // 阻止背景滚动\n useEffect(() => {\n if (!visible) return;\n \n const scrollY = window.scrollY;\n document.body.style.position = 'fixed';\n document.body.style.top = '-' + (scrollY) + 'px';\n document.body.style.left = '0';\n document.body.style.right = '0';\n document.body.style.overflow = 'hidden';\n \n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel?.();\n }\n };\n \n document.addEventListener('keydown', handleKeyDown);\n \n return () => {\n document.body.style.position = '';\n document.body.style.top = '';\n document.body.style.left = '';\n document.body.style.right = '';\n document.body.style.overflow = '';\n window.scrollTo(0, scrollY);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [visible, onCancel]);\n\n // ============= 字段管理 =============\n\n const toggleFieldEnabled = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.map(field =>\n field.key === fieldKey\n ? { ...field, enabled: !field.enabled }\n : field\n ),\n }));\n }, []);\n\n const updateField = useCallback((fieldKey: string, updates: Partial<ExportField>) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.map(field =>\n field.key === fieldKey\n ? { ...field, ...updates }\n : field\n ),\n }));\n }, []);\n\n const moveField = useCallback((fieldKey: string, direction: 'up' | 'down') => {\n setConfig(prev => {\n const fields = [...prev.fields];\n const index = fields.findIndex(f => f.key === fieldKey);\n \n if (direction === 'up' && index > 0) {\n const temp = fields[index - 1]!;\n fields[index - 1] = fields[index]!;\n fields[index] = temp;\n } else if (direction === 'down' && index < fields.length - 1) {\n const temp = fields[index + 1]!;\n fields[index + 1] = fields[index]!;\n fields[index] = temp;\n }\n \n return {\n ...prev,\n fields: fields.map((field, idx) => ({ ...field, sortOrder: idx })),\n };\n });\n }, []);\n\n const removeField = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.filter(f => f.key !== fieldKey),\n }));\n }, []);\n\n // ============= 分组配置管理 =============\n\n const toggleGrouping = useCallback((enabled: boolean) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n enabled,\n },\n }));\n }, []);\n\n const addGroupingField = useCallback((fieldKey: string) => {\n const field = config.fields.find(f => f.key === fieldKey);\n if (!field) return;\n\n const groupField: GroupingField = {\n key: field.key,\n label: field.label,\n mode: 'merge',\n valueProcessing: 'first',\n showGroupHeader: false,\n mergeCells: true,\n };\n\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: [...prev.grouping!.fields, groupField],\n },\n }));\n }, [config.fields]);\n\n const removeGroupingField = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: prev.grouping!.fields.filter(f => f.key !== fieldKey),\n },\n }));\n }, []);\n\n const updateGroupingField = useCallback((fieldKey: string, updates: Partial<GroupingField>) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: prev.grouping!.fields.map(field =>\n field.key === fieldKey\n ? { ...field, ...updates }\n : field\n ),\n },\n }));\n }, []);\n\n const moveGroupingField = useCallback((fieldKey: string, direction: 'up' | 'down') => {\n setConfig(prev => {\n const fields = [...prev.grouping!.fields];\n const index = fields.findIndex(f => f.key === fieldKey);\n \n if (direction === 'up' && index > 0) {\n const temp = fields[index - 1]!;\n fields[index - 1] = fields[index]!;\n fields[index] = temp;\n } else if (direction === 'down' && index < fields.length - 1) {\n const temp = fields[index + 1]!;\n fields[index + 1] = fields[index]!;\n fields[index] = temp;\n }\n \n return {\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields,\n },\n };\n });\n }, []);\n\n const updateGroupingConfig = useCallback((updates: Partial<GroupingConfig>) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n ...updates,\n },\n }));\n }, []);\n\n // ============= 保存配置 =============\n\n const handleSave = useCallback(() => {\n if (!config.name.trim()) {\n alert('请输入配置名称');\n return;\n }\n\n const enabledFields = config.fields.filter(f => f.enabled);\n if (enabledFields.length === 0) {\n alert('至少需要启用一个字段');\n return;\n }\n\n const updatedConfig: ExportConfig = {\n ...config,\n updatedAt: new Date(),\n };\n\n onSave?.(updatedConfig);\n onConfigChange?.();\n }, [config, onSave, onConfigChange]);\n\n // ============= 渲染组件 =============\n\n if (!visible) {\n return null;\n }\n\n const tabs = [\n { id: 'basic' as const, label: '基本配置', icon: <Settings className=\"w-4 h-4\" />, description: '配置名称、格式和基本选项' },\n { id: 'fields' as const, label: '字段设置', icon: <Type className=\"w-4 h-4\" />, description: '选择和配置导出字段' },\n { id: 'grouping' as const, label: '分组设置', icon: <Group className=\"w-4 h-4\" />, description: '配置数据分组和合并选项' },\n { id: 'manage' as const, label: '配置管理', icon: <Database className=\"w-4 h-4\" />, description: '管理已保存的导出配置' },\n ];\n\n return (\n <div \n className={clsx('fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-[50] p-4', className)}\n onClick={onCancel}\n >\n <div \n className=\"bg-white rounded-lg shadow-xl w-full max-w-5xl max-h-[90vh] flex flex-col\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-4 border-b flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <Settings className=\"w-6 h-6 text-blue-600\" />\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900\">导出配置编辑器</h2>\n <p className=\"text-sm text-gray-600\">配置导出字段和格式选项</p>\n </div>\n </div>\n <button onClick={onCancel} className=\"p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded-lg\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Tab导航 */}\n <div className=\"border-b bg-gray-50 flex-shrink-0\">\n <nav className=\"flex space-x-1 p-2\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={clsx('flex items-center gap-2 px-4 py-3 text-sm font-medium rounded-lg transition-colors', activeTab === tab.id ? 'bg-white text-blue-600 shadow-sm border border-gray-200' : 'text-gray-600 hover:text-gray-900')}\n >\n {tab.icon}\n <span>{tab.label}</span>\n </button>\n ))}\n </nav>\n </div>\n\n {/* Tab内容 */}\n <div className=\"flex-1 overflow-hidden flex flex-col\">\n <div className=\"bg-blue-50 border-b border-blue-100 p-4 flex-shrink-0\">\n <div className=\"flex items-center gap-2 text-blue-800 text-sm font-medium\">\n {tabs.find(t => t.id === activeTab)?.icon}\n {tabs.find(t => t.id === activeTab)?.description}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 sm:p-6\">\n {activeTab === 'basic' && (\n <div className=\"max-w-2xl mx-auto space-y-6\">\n <div className=\"space-y-4\">\n <label className=\"block text-sm font-medium text-gray-700\">配置名称 *</label>\n <input\n type=\"text\"\n value={config.name}\n onChange={(e) => setConfig(prev => ({ ...prev, name: e.target.value }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n />\n <label className=\"block text-sm font-medium text-gray-700\">描述</label>\n <textarea\n value={config.description}\n onChange={(e) => setConfig(prev => ({ ...prev, description: e.target.value }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n rows={3}\n />\n <label className=\"block text-sm font-medium text-gray-700\">导出格式</label>\n <div className=\"space-y-3\">\n {(['csv', 'excel', 'json'] as ExportFormat[]).map((format) => (\n <label key={format} className=\"flex items-start gap-3 p-3 border rounded-lg cursor-pointer hover:border-blue-300\">\n <input\n type=\"radio\"\n checked={config.format === format}\n onChange={() => setConfig(prev => ({ ...prev, format }))}\n className=\"mt-1\"\n />\n <div>\n <div className=\"flex items-center gap-2 font-medium\">\n {FORMAT_ICONS[format]} {format.toUpperCase()}\n </div>\n <p className=\"text-sm text-gray-600\">{FORMAT_DESCRIPTIONS[format]}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {activeTab === 'fields' && (\n <div className=\"space-y-4\">\n {config.fields.map((field, index) => (\n <div key={field.key} className=\"flex items-center gap-3 p-3 border rounded-lg bg-white\">\n <button onClick={() => toggleFieldEnabled(field.key)} className={field.enabled ? 'text-blue-600' : 'text-gray-400'}>\n {field.enabled ? <Eye className=\"w-4 h-4\" /> : <EyeOff className=\"w-4 h-4\" />}\n </button>\n <div className=\"flex-1\">\n <div className=\"font-medium\">{field.label}</div>\n <div className=\"text-xs text-gray-500\">{field.key}</div>\n </div>\n <div className=\"flex gap-1\">\n <button onClick={() => moveField(field.key, 'up')} disabled={index === 0} className=\"disabled:opacity-30\"><MoveUp className=\"w-4 h-4\" /></button>\n <button onClick={() => moveField(field.key, 'down')} disabled={index === config.fields.length - 1} className=\"disabled:opacity-30\"><MoveDown className=\"w-4 h-4\" /></button>\n <button onClick={() => removeField(field.key)} className=\"text-red-600\"><Trash2 className=\"w-4 h-4\" /></button>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {activeTab === 'grouping' && (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-lg font-medium flex items-center gap-2\"><Group className=\"w-5 h-5 text-blue-600\" /> 分组配置</h3>\n <label className=\"flex items-center gap-2\">\n <input type=\"checkbox\" checked={config.grouping?.enabled} onChange={(e) => toggleGrouping(e.target.checked)} />\n 启用分组\n </label>\n </div>\n {config.grouping?.enabled && (\n <div className=\"space-y-4\">\n {config.grouping.fields.map((gf, index) => (\n <div key={gf.key} className=\"p-4 border rounded-lg bg-blue-50 border-blue-200\">\n <div className=\"flex justify-between items-center mb-4\">\n <span className=\"font-medium text-blue-900\">{gf.label}</span>\n <button onClick={() => removeGroupingField(gf.key)} className=\"text-red-600\"><Trash2 className=\"w-4 h-4\" /></button>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <select value={gf.mode} onChange={(e) => updateGroupingField(gf.key, { mode: e.target.value as GroupingMode })} className=\"border rounded p-2\">\n <option value=\"merge\">合并模式</option>\n <option value=\"separate\">分离模式</option>\n <option value=\"nested\">嵌套模式</option>\n </select>\n <select value={gf.valueProcessing} onChange={(e) => updateGroupingField(gf.key, { valueProcessing: e.target.value as GroupValueProcessing })} className=\"border rounded p-2\">\n <option value=\"first\">首值</option>\n <option value=\"sum\">求和</option>\n <option value=\"count\">计数</option>\n </select>\n </div>\n </div>\n ))}\n <select onChange={(e) => e.target.value && addGroupingField(e.target.value)} className=\"w-full border rounded p-2\">\n <option value=\"\">添加分组字段...</option>\n {config.fields.filter(f => f.enabled && !config.grouping?.fields.some(gf => gf.key === f.key)).map(f => (\n <option key={f.key} value={f.key}>{f.label}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'manage' && (\n <div className=\"space-y-4\">\n {loadingConfigs ? <div className=\"text-center py-10\">加载中...</div> : savedConfigs.map(sc => (\n <div key={sc.id} className=\"flex justify-between items-center p-4 border rounded-lg\">\n <div>\n <div className=\"font-medium\">{sc.name}</div>\n <div className=\"text-sm text-gray-500\">{sc.format}</div>\n </div>\n <div className=\"flex gap-2\">\n <button onClick={() => loadConfigToEditor(sc)} className=\"text-blue-600 px-3 py-1 border rounded\">编辑</button>\n <button onClick={() => deleteConfig(sc.id)} className=\"text-red-600 px-3 py-1 border rounded\">删除</button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* 底部 */}\n <div className=\"flex justify-end gap-3 p-4 border-t bg-gray-50\">\n <button onClick={onCancel} className=\"px-4 py-2 border rounded\">取消</button>\n {activeTab !== 'manage' && (\n <button onClick={handleSave} className=\"px-4 py-2 bg-blue-600 text-white rounded flex items-center gap-2\">\n <Save className=\"w-4 h-4\" /> 保存配置\n </button>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n","/**\n * 通用导出按钮组件\n * \n * 提供统一的导出功能入口,支持配置化导出\n */\n\n'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport { \n Download, \n Settings, \n FileText, \n Loader2,\n ChevronDown\n} from 'lucide-react';\n\nimport type { \n ExportConfig, \n ExportField, \n ExportRequest,\n ExportResult,\n ExportProgress \n} from '../types';\n\nimport { ExportConfigEditor } from './ExportConfigEditor';\n\n// ============= 类型定义 =============\n\nexport interface UniversalExportButtonProps {\n /** 导出服务实例 */\n exportService: any; // UniversalExportClient\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 可用的字段定义 */\n availableFields: ExportField[];\n /** 数据源函数 */\n dataSource: () => Promise<any[]>;\n /** 默认配置 */\n defaultConfig?: ExportConfig;\n /** 按钮文本 */\n buttonText?: string;\n /** 按钮样式 */\n variant?: 'primary' | 'secondary' | 'outline';\n /** 按钮大小 */\n size?: 'sm' | 'md' | 'lg';\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 导出成功回调 */\n onExportSuccess?: (result: ExportResult) => void;\n /** 导出失败回调 */\n onExportError?: (error: string) => void;\n /** 配置保存回调 */\n onConfigSave?: (config: ExportConfig) => void;\n}\n\n// ============= 按钮样式配置 =============\n\nconst BUTTON_STYLES = {\n primary: {\n sm: 'px-3 py-1.5 text-sm bg-blue-600 text-white hover:bg-blue-700',\n md: 'px-4 py-2 text-sm bg-blue-600 text-white hover:bg-blue-700',\n lg: 'px-6 py-3 text-base bg-blue-600 text-white hover:bg-blue-700',\n },\n secondary: {\n sm: 'px-3 py-1.5 text-sm bg-gray-600 text-white hover:bg-gray-700',\n md: 'px-4 py-2 text-sm bg-gray-600 text-white hover:bg-gray-700',\n lg: 'px-6 py-3 text-base bg-gray-600 text-white hover:bg-gray-700',\n },\n outline: {\n sm: 'px-3 py-1.5 text-sm border border-gray-300 text-gray-700 hover:bg-gray-50',\n md: 'px-4 py-2 text-sm border border-gray-300 text-gray-700 hover:bg-gray-50',\n lg: 'px-6 py-3 text-base border border-gray-300 text-gray-700 hover:bg-gray-50',\n },\n};\n\n// ============= 主组件 =============\n\nexport const UniversalExportButton: React.FC<UniversalExportButtonProps> = ({\n exportService,\n moduleId,\n businessId,\n availableFields,\n dataSource,\n defaultConfig,\n buttonText = '导出数据',\n variant = 'primary',\n size = 'md',\n disabled = false,\n className = '',\n onExportSuccess,\n onExportError,\n onConfigSave,\n}) => {\n // ============= 状态管理 =============\n \n const [showConfigEditor, setShowConfigEditor] = useState(false);\n const [showDropdown, setShowDropdown] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n const [exportProgress, setExportProgress] = useState<ExportProgress | null>(null);\n const [savedConfigs, setSavedConfigs] = useState<ExportConfig[]>([]);\n\n // 加载保存的配置\n const loadSavedConfigs = useCallback(async () => {\n try {\n if (exportService) {\n const configs = await exportService.getConfigsByModule(moduleId, businessId);\n setSavedConfigs(configs);\n }\n } catch (error) {\n console.error('加载保存的配置失败:', error);\n }\n }, [exportService, moduleId, businessId]);\n\n // 组件挂载时加载配置\n React.useEffect(() => {\n loadSavedConfigs();\n }, [loadSavedConfigs]);\n\n // ============= 导出处理 =============\n\n const handleExport = useCallback(async (config: ExportConfig) => {\n console.log('🚀 [UniversalExportButton] 开始导出:', {\n configId: config.id,\n configName: config.name,\n format: config.format,\n fieldsCount: config.fields.length,\n });\n\n if (!exportService) {\n console.error('❌ [UniversalExportButton] 导出服务未初始化');\n onExportError?.('导出服务未初始化');\n return;\n }\n\n setIsExporting(true);\n setExportProgress(null);\n\n try {\n // 获取数据\n console.log('📊 [UniversalExportButton] 获取数据...');\n const data = await dataSource();\n console.log('✅ [UniversalExportButton] 数据获取成功:', {\n dataType: typeof data,\n isArray: Array.isArray(data),\n length: Array.isArray(data) ? data.length : 'N/A',\n });\n\n // 创建导出请求(不包含回调,因为客户端不支持)\n const request = {\n configId: config,\n dataSource: data, // 传递实际数据而不是函数\n queryParams: undefined,\n fieldMapping: undefined,\n filters: undefined,\n sortBy: undefined,\n pagination: undefined,\n customFileName: undefined,\n };\n\n console.log('📞 [UniversalExportButton] 调用导出服务...');\n const result = await exportService.exportData(request);\n\n console.log('✅ [UniversalExportButton] 导出成功:', {\n fileName: result.fileName,\n fileSize: result.fileSize,\n exportedRows: result.exportedRows,\n });\n\n // 由于客户端不支持进度回调,我们模拟一个完成状态\n const progress: ExportProgress = {\n exportId: result.exportId,\n status: 'completed',\n progress: 100,\n processedRows: result.exportedRows,\n totalRows: result.exportedRows,\n startTime: result.startTime,\n estimatedEndTime: result.endTime,\n };\n setExportProgress(progress);\n\n // 下载文件\n if (result.fileUrl) {\n console.log('📥 [UniversalExportButton] 从URL下载文件...');\n const link = document.createElement('a');\n link.href = result.fileUrl;\n link.download = result.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n console.log('✅ [UniversalExportButton] 文件下载完成');\n } else if (result.fileBlob) {\n console.log('📥 [UniversalExportButton] 从Blob下载文件...');\n const url = window.URL.createObjectURL(result.fileBlob);\n const link = document.createElement('a');\n link.href = url;\n link.download = result.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n console.log('✅ [UniversalExportButton] 文件下载完成');\n } else if (result.exportId && typeof exportService.downloadExportFile === 'function') {\n console.log('📥 [UniversalExportButton] 从exportId兜底下载文件...');\n const blob = await exportService.downloadExportFile(result.exportId);\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = result.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n console.log('✅ [UniversalExportButton] 文件下载完成(兜底分支)');\n } else {\n console.warn('⚠️ [UniversalExportButton] 导出成功但缺少可下载文件信息:', result);\n }\n\n // 延迟清除进度状态\n setTimeout(() => {\n setIsExporting(false);\n setExportProgress(null);\n }, 1000);\n\n onExportSuccess?.(result);\n } catch (error) {\n console.error('❌ [UniversalExportButton] 导出异常:', error);\n setIsExporting(false);\n setExportProgress(null);\n\n // 更好地处理错误信息\n let errorMessage = '导出失败';\n if (error && typeof error === 'object') {\n if ('message' in error && typeof error.message === 'string') {\n errorMessage = error.message;\n } else if ('code' in error && 'message' in error) {\n errorMessage = (error.code) + ': ' + (error.message);\n }\n } else if (typeof error === 'string') {\n errorMessage = error;\n }\n\n onExportError?.(errorMessage);\n }\n }, [exportService, dataSource, onExportSuccess, onExportError]);\n\n const handleQuickExport = useCallback(async () => {\n if (defaultConfig) {\n await handleExport(defaultConfig);\n } else {\n // 创建默认配置\n const config: ExportConfig = {\n id: 'quick_export',\n name: '快速导出',\n description: '使用默认配置快速导出',\n format: 'csv',\n fields: availableFields.map((field, index) => ({\n ...field,\n enabled: true,\n sortOrder: index,\n })),\n fileNameTemplate: '导出数据_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId,\n businessId,\n };\n \n await handleExport(config);\n }\n }, [defaultConfig, availableFields, moduleId, businessId, handleExport]);\n\n // ============= 配置管理 =============\n\n const handleConfigSave = useCallback(async (config: ExportConfig) => {\n try {\n if (exportService) {\n const savedConfig = await exportService.createConfig(config);\n // 重新加载配置列表\n await loadSavedConfigs();\n onConfigSave?.(savedConfig);\n }\n setShowConfigEditor(false);\n } catch (error) {\n onExportError?.(error instanceof Error ? error.message : '保存配置失败');\n }\n }, [exportService, onConfigSave, onExportError, loadSavedConfigs]);\n\n // ============= 渲染进度 =============\n\n const renderProgress = () => {\n if (!exportProgress) return null;\n\n const { status, progress, processedRows, totalRows } = exportProgress;\n\n return (\n <div className=\"absolute top-full left-0 right-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg p-4 z-[10]\">\n <div className=\"flex items-center gap-3 mb-2\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-600\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {status === 'processing' ? '正在导出...' : '导出完成'}\n </span>\n </div>\n \n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-xs text-gray-600\">\n <span>进度: {progress}%</span>\n <span>{processedRows} / {totalRows} 行</span>\n </div>\n \n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div \n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: (progress) + '%' }}\n />\n </div>\n </div>\n </div>\n );\n };\n\n // ============= 渲染下拉菜单 =============\n\n const renderDropdown = () => {\n if (!showDropdown) return null;\n\n return (\n <div className=\"absolute top-full left-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg py-2 z-[10] min-w-48\">\n {/* 快速导出 */}\n <button\n onClick={() => {\n setShowDropdown(false);\n handleQuickExport();\n }}\n disabled={isExporting}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <Download className=\"w-4 h-4\" />\n 快速导出\n </button>\n\n {/* 使用保存的配置 */}\n {savedConfigs.length > 0 && (\n <>\n <div className=\"border-t border-gray-200 my-1\" />\n {savedConfigs.map((config) => (\n <button\n key={config.id}\n onClick={() => {\n setShowDropdown(false);\n handleExport(config);\n }}\n disabled={isExporting}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <FileText className=\"w-4 h-4\" />\n {config.name}\n </button>\n ))}\n </>\n )}\n\n {/* 配置编辑器 */}\n <div className=\"border-t border-gray-200 my-1\" />\n <button\n onClick={() => {\n setShowDropdown(false);\n setShowConfigEditor(true);\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <Settings className=\"w-4 h-4\" />\n 自定义配置\n </button>\n </div>\n );\n };\n\n // ============= 渲染组件 =============\n\n const buttonStyle = BUTTON_STYLES[variant][size];\n const baseClasses = 'inline-flex items-center gap-2 rounded-lg font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed ' + (buttonStyle);\n\n return (\n <div className={clsx('relative', className)}>\n {/* 主按钮 */}\n <button\n onClick={() => setShowDropdown(!showDropdown)}\n disabled={disabled || isExporting}\n className={clsx(baseClasses, isExporting ? 'cursor-not-allowed' : '')}\n >\n {isExporting ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Download className=\"w-4 h-4\" />\n )}\n <span>{isExporting ? '导出中...' : buttonText}</span>\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n\n {/* 下拉菜单 */}\n {renderDropdown()}\n\n {/* 进度显示 */}\n {renderProgress()}\n\n {/* 配置编辑器 */}\n <ExportConfigEditor\n moduleId={moduleId}\n businessId={businessId}\n availableFields={availableFields}\n onSave={handleConfigSave}\n onCancel={() => setShowConfigEditor(false)}\n visible={showConfigEditor}\n onConfigChange={loadSavedConfigs}\n />\n\n {/* 点击外部关闭下拉菜单 */}\n {showDropdown && (\n <div\n className=\"fixed inset-0 z-[0]\"\n onClick={() => setShowDropdown(false)}\n />\n )}\n </div>\n );\n};\n\n"]}
|