sa2kit 1.6.57 → 1.6.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/AliyunOSSProvider-KSYW2IOG.js +15 -0
  2. package/dist/{AliyunOSSProvider-2FARPAQD.js.map → AliyunOSSProvider-KSYW2IOG.js.map} +1 -1
  3. package/dist/AliyunOSSProvider-TBK3G7YK.mjs +6 -0
  4. package/dist/{AliyunOSSProvider-UMVGVBDJ.mjs.map → AliyunOSSProvider-TBK3G7YK.mjs.map} +1 -1
  5. package/dist/LocalStorageProvider-2DGYRQAB.mjs +6 -0
  6. package/dist/{LocalStorageProvider-PYOHETJV.mjs.map → LocalStorageProvider-2DGYRQAB.mjs.map} +1 -1
  7. package/dist/LocalStorageProvider-SSRW3ZJW.js +15 -0
  8. package/dist/{LocalStorageProvider-JQF5WK5H.js.map → LocalStorageProvider-SSRW3ZJW.js.map} +1 -1
  9. package/dist/UniversalFileService-336GFY6N.mjs +6 -0
  10. package/dist/{UniversalFileService-TNYKO6JN.mjs.map → UniversalFileService-336GFY6N.mjs.map} +1 -1
  11. package/dist/UniversalFileService-J6ET6KZK.js +15 -0
  12. package/dist/{UniversalFileService-RBV6EN5J.js.map → UniversalFileService-J6ET6KZK.js.map} +1 -1
  13. package/dist/calendar/index.js +11 -11
  14. package/dist/calendar/index.mjs +4 -4
  15. package/dist/chunk-25OFOKNF.js +171 -0
  16. package/dist/chunk-25OFOKNF.js.map +1 -0
  17. package/dist/chunk-3DXPQ4YV.mjs +165 -0
  18. package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
  19. package/dist/{chunk-4VJQZSPU.mjs → chunk-3NHAT7D4.mjs} +3 -4
  20. package/dist/chunk-3NHAT7D4.mjs.map +1 -0
  21. package/dist/{chunk-3JW4X3AC.mjs → chunk-622Y6LTH.mjs} +3 -3
  22. package/dist/{chunk-3JW4X3AC.mjs.map → chunk-622Y6LTH.mjs.map} +1 -1
  23. package/dist/chunk-CIVO4R6N.mjs +37 -0
  24. package/dist/chunk-CIVO4R6N.mjs.map +1 -0
  25. package/dist/{chunk-6BJ76BYC.mjs → chunk-EGJPS7OL.mjs} +3 -3
  26. package/dist/{chunk-6BJ76BYC.mjs.map → chunk-EGJPS7OL.mjs.map} +1 -1
  27. package/dist/{chunk-U7AQC2Z7.js → chunk-EKIOJEJK.js} +1179 -2002
  28. package/dist/chunk-EKIOJEJK.js.map +1 -0
  29. package/dist/{chunk-53WLQ22S.js → chunk-EOWTOG7Y.js} +6 -6
  30. package/dist/{chunk-53WLQ22S.js.map → chunk-EOWTOG7Y.js.map} +1 -1
  31. package/dist/chunk-HDMIOOZY.mjs +546 -0
  32. package/dist/chunk-HDMIOOZY.mjs.map +1 -0
  33. package/dist/{chunk-MZKATHB7.js → chunk-HHVDOIPV.js} +4 -4
  34. package/dist/{chunk-MZKATHB7.js.map → chunk-HHVDOIPV.js.map} +1 -1
  35. package/dist/chunk-HJ6MH7J7.js +552 -0
  36. package/dist/chunk-HJ6MH7J7.js.map +1 -0
  37. package/dist/chunk-KH6RQ4J5.js +28 -0
  38. package/dist/chunk-KH6RQ4J5.js.map +1 -0
  39. package/dist/{chunk-35CXIK5Y.js → chunk-NCOXT7SK.js} +11 -11
  40. package/dist/{chunk-35CXIK5Y.js.map → chunk-NCOXT7SK.js.map} +1 -1
  41. package/dist/chunk-NZZZUMMX.mjs +784 -0
  42. package/dist/chunk-NZZZUMMX.mjs.map +1 -0
  43. package/dist/{chunk-OBIPI4GU.mjs → chunk-OFYBMMWT.mjs} +4 -4
  44. package/dist/{chunk-OBIPI4GU.mjs.map → chunk-OFYBMMWT.mjs.map} +1 -1
  45. package/dist/{chunk-W2NCOORK.js → chunk-PVLLRDUT.js} +951 -145
  46. package/dist/chunk-PVLLRDUT.js.map +1 -0
  47. package/dist/chunk-Q5EDCKQA.js +336 -0
  48. package/dist/chunk-Q5EDCKQA.js.map +1 -0
  49. package/dist/{chunk-6NMIKAE7.mjs → chunk-SNBILYSH.mjs} +5 -5
  50. package/dist/{chunk-6NMIKAE7.mjs.map → chunk-SNBILYSH.mjs.map} +1 -1
  51. package/dist/{chunk-IPY26RQH.js → chunk-UVHPCLP6.js} +5 -5
  52. package/dist/{chunk-IPY26RQH.js.map → chunk-UVHPCLP6.js.map} +1 -1
  53. package/dist/{chunk-V6BXO6ZS.mjs → chunk-WGD2NBVR.mjs} +835 -38
  54. package/dist/chunk-WGD2NBVR.mjs.map +1 -0
  55. package/dist/{chunk-HYZ5C6FY.mjs → chunk-WS3QZYBI.mjs} +1175 -1996
  56. package/dist/chunk-WS3QZYBI.mjs.map +1 -0
  57. package/dist/{chunk-UR5TU4MW.mjs → chunk-XLR6QUDR.mjs} +3 -3
  58. package/dist/{chunk-UR5TU4MW.mjs.map → chunk-XLR6QUDR.mjs.map} +1 -1
  59. package/dist/chunk-YMS6BPXS.js +807 -0
  60. package/dist/chunk-YMS6BPXS.js.map +1 -0
  61. package/dist/chunk-YOTQG4NP.mjs +314 -0
  62. package/dist/chunk-YOTQG4NP.mjs.map +1 -0
  63. package/dist/chunk-ZGVB35L2.mjs +25 -0
  64. package/dist/chunk-ZGVB35L2.mjs.map +1 -0
  65. package/dist/chunk-ZRAW3HXA.js +43 -0
  66. package/dist/chunk-ZRAW3HXA.js.map +1 -0
  67. package/dist/{chunk-4XXIBWCO.js → chunk-ZRWED7Q6.js} +66 -66
  68. package/dist/{chunk-4XXIBWCO.js.map → chunk-ZRWED7Q6.js.map} +1 -1
  69. package/dist/{chunk-DVENFCQY.js → chunk-ZWQJSZEY.js} +4 -5
  70. package/dist/chunk-ZWQJSZEY.js.map +1 -0
  71. package/dist/components/index.js +104 -104
  72. package/dist/components/index.mjs +4 -4
  73. package/dist/index.js +146 -148
  74. package/dist/index.js.map +1 -1
  75. package/dist/index.mjs +8 -11
  76. package/dist/index.mjs.map +1 -1
  77. package/dist/logger/index.js +7 -7
  78. package/dist/logger/index.mjs +1 -4
  79. package/dist/mikuFusionGame/index.js +4 -4
  80. package/dist/mikuFusionGame/index.mjs +3 -3
  81. package/dist/portfolio/index.js +10 -10
  82. package/dist/portfolio/index.mjs +5 -5
  83. package/dist/showmasterpiece/db/index.js +42 -42
  84. package/dist/showmasterpiece/db/index.mjs +1 -1
  85. package/dist/showmasterpiece/index.js +143 -144
  86. package/dist/showmasterpiece/index.js.map +1 -1
  87. package/dist/showmasterpiece/index.mjs +7 -9
  88. package/dist/showmasterpiece/index.mjs.map +1 -1
  89. package/dist/showmasterpiece/logic/index.js +19 -19
  90. package/dist/showmasterpiece/logic/index.mjs +2 -2
  91. package/dist/showmasterpiece/server/index.js +42 -42
  92. package/dist/showmasterpiece/server/index.mjs +1 -1
  93. package/dist/showmasterpiece/ui/web/index.js +34 -34
  94. package/dist/showmasterpiece/ui/web/index.mjs +6 -6
  95. package/dist/universalExport/server/index.js +2 -4
  96. package/dist/universalExport/server/index.js.map +1 -1
  97. package/dist/universalExport/server/index.mjs +1 -3
  98. package/dist/universalExport/server/index.mjs.map +1 -1
  99. package/dist/universalFile/index.js +6 -9
  100. package/dist/universalFile/index.js.map +1 -1
  101. package/dist/universalFile/index.mjs +1 -5
  102. package/dist/universalFile/index.mjs.map +1 -1
  103. package/dist/universalFile/server/index.js +31 -64
  104. package/dist/universalFile/server/index.js.map +1 -1
  105. package/dist/universalFile/server/index.mjs +7 -42
  106. package/dist/universalFile/server/index.mjs.map +1 -1
  107. package/dist/utils/index.js +11 -11
  108. package/dist/utils/index.mjs +2 -2
  109. package/package.json +1 -1
  110. package/dist/AliyunOSSProvider-2FARPAQD.js +0 -15
  111. package/dist/AliyunOSSProvider-UMVGVBDJ.mjs +0 -9
  112. package/dist/LocalStorageProvider-JQF5WK5H.js +0 -15
  113. package/dist/LocalStorageProvider-PYOHETJV.mjs +0 -9
  114. package/dist/UniversalFileService-RBV6EN5J.js +0 -15
  115. package/dist/UniversalFileService-TNYKO6JN.mjs +0 -9
  116. package/dist/chunk-4NFOSCM6.js +0 -34
  117. package/dist/chunk-4NFOSCM6.js.map +0 -1
  118. package/dist/chunk-4VJQZSPU.mjs.map +0 -1
  119. package/dist/chunk-6AHYPPUP.js +0 -344
  120. package/dist/chunk-6AHYPPUP.js.map +0 -1
  121. package/dist/chunk-76V7EKBX.mjs +0 -796
  122. package/dist/chunk-76V7EKBX.mjs.map +0 -1
  123. package/dist/chunk-ACLOJXXE.js +0 -195
  124. package/dist/chunk-ACLOJXXE.js.map +0 -1
  125. package/dist/chunk-AEXPAH7Z.mjs +0 -32
  126. package/dist/chunk-AEXPAH7Z.mjs.map +0 -1
  127. package/dist/chunk-CFGX3EKK.js +0 -560
  128. package/dist/chunk-CFGX3EKK.js.map +0 -1
  129. package/dist/chunk-D2HXMGXS.js +0 -46
  130. package/dist/chunk-D2HXMGXS.js.map +0 -1
  131. package/dist/chunk-DVENFCQY.js.map +0 -1
  132. package/dist/chunk-HYZ5C6FY.mjs.map +0 -1
  133. package/dist/chunk-K7WNCB4V.mjs +0 -554
  134. package/dist/chunk-K7WNCB4V.mjs.map +0 -1
  135. package/dist/chunk-L4ZYBFB2.mjs +0 -44
  136. package/dist/chunk-L4ZYBFB2.mjs.map +0 -1
  137. package/dist/chunk-M4HGHTIC.js +0 -820
  138. package/dist/chunk-M4HGHTIC.js.map +0 -1
  139. package/dist/chunk-PXWDQFWV.mjs +0 -192
  140. package/dist/chunk-PXWDQFWV.mjs.map +0 -1
  141. package/dist/chunk-U7AQC2Z7.js.map +0 -1
  142. package/dist/chunk-V6BXO6ZS.mjs.map +0 -1
  143. package/dist/chunk-VTGPHE4Z.mjs +0 -322
  144. package/dist/chunk-VTGPHE4Z.mjs.map +0 -1
  145. package/dist/chunk-W2NCOORK.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ImageMappingPanel.tsx","../src/components/LocalImageMappingPanel.tsx"],"names":["React","cn","useLocalStorage"],"mappings":"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","file":"chunk-MZKATHB7.js","sourcesContent":["import React from 'react';\nimport { cn } from '../utils';\n\nexport interface ImageMappingItem {\n id: string;\n label: string;\n}\n\nexport type ImageMappingValue = Record<string, string>;\n\nexport interface ImageMappingPanelProps {\n title: string;\n items: ImageMappingItem[];\n value: ImageMappingValue;\n onChange: (next: ImageMappingValue) => void;\n className?: string;\n uploadLabel?: string;\n clearLabel?: string;\n}\n\nexport function ImageMappingPanel({\n title,\n items,\n value,\n onChange,\n className,\n uploadLabel = '上传图片',\n clearLabel = '清除',\n}: ImageMappingPanelProps) {\n const handleFileChange = (id: string, file?: File) => {\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n const base64 = typeof reader.result === 'string' ? reader.result : '';\n if (!base64) {\n return;\n }\n onChange({\n ...value,\n [id]: base64,\n });\n };\n reader.readAsDataURL(file);\n };\n\n const handleRemove = (id: string) => {\n const next = { ...value };\n delete next[id];\n onChange(next);\n };\n\n return (\n <details className={cn('rounded-lg border border-slate-200 bg-white/80 p-3', className)}>\n <summary className=\"cursor-pointer text-sm font-semibold text-slate-700\">{title}</summary>\n <div className=\"mt-3 grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {items.map((item) => {\n const image = value[item.id];\n return (\n <div\n key={item.id}\n className=\"flex items-center gap-2 rounded-md border border-slate-200 bg-white p-2\"\n >\n <div className=\"w-16 text-xs font-semibold text-slate-600\">{item.label}</div>\n <label className=\"flex-1 cursor-pointer rounded-md bg-cyan-600 px-2 py-1 text-center text-xs font-medium text-white\">\n {uploadLabel}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(event) => {\n handleFileChange(item.id, event.target.files?.[0]);\n event.currentTarget.value = '';\n }}\n />\n </label>\n {image ? (\n <>\n <img\n src={image}\n alt={item.label}\n className=\"h-8 w-8 rounded-full border border-slate-200 object-cover\"\n />\n <button\n type=\"button\"\n className=\"rounded-md border border-red-200 px-2 py-1 text-xs text-red-600\"\n onClick={() => handleRemove(item.id)}\n >\n {clearLabel}\n </button>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n </details>\n );\n}\n\n","import React from 'react';\nimport { useLocalStorage } from '../storage/hooks/useLocalStorage';\nimport {\n ImageMappingPanel,\n type ImageMappingItem,\n type ImageMappingPanelProps,\n type ImageMappingValue,\n} from './ImageMappingPanel';\n\nexport interface LocalImageMappingPanelProps\n extends Omit<ImageMappingPanelProps, 'value' | 'onChange'> {\n storageKey: string;\n defaultValue?: ImageMappingValue;\n onValueChange?: (next: ImageMappingValue) => void;\n}\n\nexport function LocalImageMappingPanel({\n storageKey,\n defaultValue = {},\n onValueChange,\n ...panelProps\n}: LocalImageMappingPanelProps) {\n const [value, setValue] = useLocalStorage<ImageMappingValue>(storageKey, defaultValue);\n\n return (\n <ImageMappingPanel\n {...panelProps}\n value={value}\n onChange={(next) => {\n setValue(next);\n onValueChange?.(next);\n }}\n />\n );\n}\n\nexport type { ImageMappingItem };\n\n"]}
1
+ {"version":3,"sources":["../src/components/ImageMappingPanel.tsx","../src/components/LocalImageMappingPanel.tsx"],"names":["React","cn","useLocalStorage"],"mappings":"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","file":"chunk-HHVDOIPV.js","sourcesContent":["import React from 'react';\nimport { cn } from '../utils';\n\nexport interface ImageMappingItem {\n id: string;\n label: string;\n}\n\nexport type ImageMappingValue = Record<string, string>;\n\nexport interface ImageMappingPanelProps {\n title: string;\n items: ImageMappingItem[];\n value: ImageMappingValue;\n onChange: (next: ImageMappingValue) => void;\n className?: string;\n uploadLabel?: string;\n clearLabel?: string;\n}\n\nexport function ImageMappingPanel({\n title,\n items,\n value,\n onChange,\n className,\n uploadLabel = '上传图片',\n clearLabel = '清除',\n}: ImageMappingPanelProps) {\n const handleFileChange = (id: string, file?: File) => {\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n const base64 = typeof reader.result === 'string' ? reader.result : '';\n if (!base64) {\n return;\n }\n onChange({\n ...value,\n [id]: base64,\n });\n };\n reader.readAsDataURL(file);\n };\n\n const handleRemove = (id: string) => {\n const next = { ...value };\n delete next[id];\n onChange(next);\n };\n\n return (\n <details className={cn('rounded-lg border border-slate-200 bg-white/80 p-3', className)}>\n <summary className=\"cursor-pointer text-sm font-semibold text-slate-700\">{title}</summary>\n <div className=\"mt-3 grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {items.map((item) => {\n const image = value[item.id];\n return (\n <div\n key={item.id}\n className=\"flex items-center gap-2 rounded-md border border-slate-200 bg-white p-2\"\n >\n <div className=\"w-16 text-xs font-semibold text-slate-600\">{item.label}</div>\n <label className=\"flex-1 cursor-pointer rounded-md bg-cyan-600 px-2 py-1 text-center text-xs font-medium text-white\">\n {uploadLabel}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(event) => {\n handleFileChange(item.id, event.target.files?.[0]);\n event.currentTarget.value = '';\n }}\n />\n </label>\n {image ? (\n <>\n <img\n src={image}\n alt={item.label}\n className=\"h-8 w-8 rounded-full border border-slate-200 object-cover\"\n />\n <button\n type=\"button\"\n className=\"rounded-md border border-red-200 px-2 py-1 text-xs text-red-600\"\n onClick={() => handleRemove(item.id)}\n >\n {clearLabel}\n </button>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n </details>\n );\n}\n\n","import React from 'react';\nimport { useLocalStorage } from '../storage/hooks/useLocalStorage';\nimport {\n ImageMappingPanel,\n type ImageMappingItem,\n type ImageMappingPanelProps,\n type ImageMappingValue,\n} from './ImageMappingPanel';\n\nexport interface LocalImageMappingPanelProps\n extends Omit<ImageMappingPanelProps, 'value' | 'onChange'> {\n storageKey: string;\n defaultValue?: ImageMappingValue;\n onValueChange?: (next: ImageMappingValue) => void;\n}\n\nexport function LocalImageMappingPanel({\n storageKey,\n defaultValue = {},\n onValueChange,\n ...panelProps\n}: LocalImageMappingPanelProps) {\n const [value, setValue] = useLocalStorage<ImageMappingValue>(storageKey, defaultValue);\n\n return (\n <ImageMappingPanel\n {...panelProps}\n value={value}\n onChange={(next) => {\n setValue(next);\n onValueChange?.(next);\n }}\n />\n );\n}\n\nexport type { ImageMappingItem };\n\n"]}
@@ -0,0 +1,552 @@
1
+ 'use strict';
2
+
3
+ var chunkKH6RQ4J5_js = require('./chunk-KH6RQ4J5.js');
4
+ var chunk25OFOKNF_js = require('./chunk-25OFOKNF.js');
5
+ var OSS = require('ali-oss');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var OSS__default = /*#__PURE__*/_interopDefault(OSS);
10
+
11
+ var logger = chunk25OFOKNF_js.createLogger("AliyunOSSProvider");
12
+ var AliyunOSSProvider = class {
13
+ constructor() {
14
+ this.type = "aliyun-oss";
15
+ this.config = null;
16
+ this.client = null;
17
+ this.isInitialized = false;
18
+ }
19
+ /**
20
+ * 初始化存储提供者
21
+ */
22
+ async initialize(config) {
23
+ return this.reinitialize(config);
24
+ }
25
+ /**
26
+ * 重新初始化存储提供者(支持配置热更新)
27
+ */
28
+ async reinitialize(config) {
29
+ logger.info("\u{1F504} [AliyunOSSProvider] \u91CD\u65B0\u521D\u59CB\u5316OSS\u5BA2\u6237\u7AEF", config);
30
+ if (config.type !== "aliyun-oss") {
31
+ throw new chunkKH6RQ4J5_js.StorageProviderError("\u914D\u7F6E\u7C7B\u578B\u4E0D\u5339\u914D\uFF1A\u671F\u671B aliyun-oss");
32
+ }
33
+ const newConfig = config;
34
+ const configChanged = !this.config || this.config.region !== newConfig.region || this.config.bucket !== newConfig.bucket || this.config.accessKeyId !== newConfig.accessKeyId || this.config.accessKeySecret !== newConfig.accessKeySecret || this.config.customDomain !== newConfig.customDomain || this.config.secure !== newConfig.secure || this.config.internal !== newConfig.internal;
35
+ if (configChanged) {
36
+ logger.info("\u{1F504} [AliyunOSSProvider] \u68C0\u6D4B\u5230\u914D\u7F6E\u53D8\u5316\uFF0C\u91CD\u65B0\u521D\u59CB\u5316OSS\u5BA2\u6237\u7AEF");
37
+ logger.info(
38
+ "\u2601\uFE0F [AliyunOSSProvider] \u65B0\u914D\u7F6E: bucket=" + newConfig.bucket + ", region=" + newConfig.region
39
+ );
40
+ } else if (this.isInitialized) {
41
+ logger.info("\u2139\uFE0F [AliyunOSSProvider] \u914D\u7F6E\u672A\u53D8\u5316\uFF0C\u8DF3\u8FC7\u91CD\u65B0\u521D\u59CB\u5316");
42
+ return;
43
+ }
44
+ this.config = newConfig;
45
+ logger.info("\u2601\uFE0F [AliyunOSSProvider] " + (this.isInitialized ? "\u91CD\u65B0" : "") + "\u521D\u59CB\u5316\u963F\u91CC\u4E91OSS");
46
+ logger.info("\u2601\uFE0F [AliyunOSSProvider] " + (this.config ? JSON.stringify(this.config) : ""));
47
+ try {
48
+ this.validateConfig();
49
+ if (!this.config.region || typeof this.config.region !== "string") {
50
+ throw new Error("OSS region \u5FC5\u987B\u662F\u6709\u6548\u7684\u5B57\u7B26\u4E32");
51
+ }
52
+ if (!this.config.bucket || typeof this.config.bucket !== "string") {
53
+ throw new Error("OSS bucket \u5FC5\u987B\u662F\u6709\u6548\u7684\u5B57\u7B26\u4E32");
54
+ }
55
+ if (!this.config.accessKeyId || typeof this.config.accessKeyId !== "string") {
56
+ throw new Error("OSS accessKeyId \u5FC5\u987B\u662F\u6709\u6548\u7684\u5B57\u7B26\u4E32");
57
+ }
58
+ if (!this.config.accessKeySecret || typeof this.config.accessKeySecret !== "string") {
59
+ throw new Error("OSS accessKeySecret \u5FC5\u987B\u662F\u6709\u6548\u7684\u5B57\u7B26\u4E32");
60
+ }
61
+ logger.info(`\u2601\uFE0F [AliyunOSSProvider] \u521B\u5EFAOSS\u5BA2\u6237\u7AEF\u914D\u7F6E:`, {
62
+ region: this.config.region,
63
+ bucket: this.config.bucket,
64
+ hasAccessKeyId: !!this.config.accessKeyId,
65
+ hasAccessKeySecret: !!this.config.accessKeySecret,
66
+ secure: this.config.secure !== false,
67
+ internal: this.config.internal || false,
68
+ cname: !!this.config.customDomain,
69
+ endpoint: this.config.customDomain || "\u9ED8\u8BA4\u7AEF\u70B9"
70
+ });
71
+ this.client = new OSS__default.default({
72
+ region: this.config.region,
73
+ bucket: this.config.bucket,
74
+ accessKeyId: this.config.accessKeyId,
75
+ accessKeySecret: this.config.accessKeySecret,
76
+ secure: this.config.secure !== false,
77
+ // 默认使用HTTPS
78
+ internal: this.config.internal || false,
79
+ // 默认使用公网
80
+ timeout: 3e5,
81
+ // 5分钟超时
82
+ cname: !!this.config.customDomain,
83
+ // 是否使用自定义域名
84
+ endpoint: this.config.customDomain || void 0
85
+ });
86
+ if (!this.client) {
87
+ throw new Error("OSS\u5BA2\u6237\u7AEF\u521B\u5EFA\u5931\u8D25");
88
+ }
89
+ logger.info(`\u2601\uFE0F [AliyunOSSProvider] OSS\u5BA2\u6237\u7AEF\u521B\u5EFA\u6210\u529F`);
90
+ this.isInitialized = true;
91
+ logger.info("\u2705 [AliyunOSSProvider] \u963F\u91CC\u4E91OSS" + (configChanged ? "\u91CD\u65B0" : "") + "\u521D\u59CB\u5316\u5B8C\u6210");
92
+ } catch (error) {
93
+ logger.error("\u274C [AliyunOSSProvider] \u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25:", error);
94
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u963F\u91CC\u4E91OSS\u521D\u59CB\u5316\u5931\u8D25`);
95
+ }
96
+ }
97
+ /**
98
+ * 上传文件
99
+ */
100
+ async upload(fileInfo, filePath) {
101
+ this.ensureInitialized();
102
+ const startTime = Date.now();
103
+ logger.info("\u{1F4E4} [AliyunOSSProvider] \u5F00\u59CB\u4E0A\u4F20\u6587\u4EF6\u5230OSS: " + filePath);
104
+ try {
105
+ const buffer = Buffer.from(await fileInfo.file.arrayBuffer());
106
+ const options = {
107
+ headers: {
108
+ "Content-Type": fileInfo.file.type || "application/octet-stream",
109
+ "Content-Length": fileInfo.file.size.toString()
110
+ },
111
+ meta: {
112
+ uid: 0,
113
+ // 必需字段
114
+ pid: 0,
115
+ // 必需字段
116
+ originalName: encodeURIComponent(fileInfo.file.name),
117
+ moduleId: fileInfo.moduleId,
118
+ businessId: fileInfo.businessId || "",
119
+ uploadTime: (/* @__PURE__ */ new Date()).toISOString(),
120
+ // 对元数据进行编码处理,避免中文字符问题
121
+ ...this.encodeMetadata(fileInfo.metadata || {})
122
+ }
123
+ };
124
+ let result;
125
+ if (fileInfo.file.size > 100 * 1024 * 1024) {
126
+ logger.info(
127
+ "\u{1F4E6} [AliyunOSSProvider] \u4F7F\u7528\u5206\u7247\u4E0A\u4F20\u5927\u6587\u4EF6: " + filePath + ", \u5927\u5C0F: " + fileInfo.file.size
128
+ );
129
+ result = await this.multipartUpload(filePath, buffer, options);
130
+ } else {
131
+ logger.info(
132
+ "\u{1F4E4} [AliyunOSSProvider] \u4F7F\u7528\u666E\u901A\u4E0A\u4F20: " + filePath + ", \u5927\u5C0F: " + fileInfo.file.size
133
+ );
134
+ result = await this.client?.put(filePath, buffer, options);
135
+ }
136
+ const accessUrl = this.generateAccessUrl(filePath);
137
+ const uploadTime = Date.now() - startTime;
138
+ logger.info("\u2705 [AliyunOSSProvider] \u6587\u4EF6\u4E0A\u4F20\u5B8C\u6210: " + filePath + ", \u8017\u65F6: " + uploadTime + "ms");
139
+ return {
140
+ success: true,
141
+ path: filePath,
142
+ url: accessUrl,
143
+ size: fileInfo.file.size,
144
+ data: {
145
+ etag: result.data ? JSON.stringify(result.data) : "",
146
+ requestId: result.res?.rt || 0,
147
+ uploadTime,
148
+ ossUrl: result.url || result.name
149
+ }
150
+ };
151
+ } catch (error) {
152
+ logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u4E0A\u4F20\u5931\u8D25: " + filePath + ":", error);
153
+ return {
154
+ success: false,
155
+ error: this.formatOSSError(error)
156
+ };
157
+ }
158
+ }
159
+ /**
160
+ * 下载文件
161
+ */
162
+ async download(filePath) {
163
+ this.ensureInitialized();
164
+ logger.info("\u{1F4E5} [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u4E0B\u8F7D\u6587\u4EF6: " + filePath);
165
+ try {
166
+ const result = await this.client?.get(filePath);
167
+ if (!result.content || !Buffer.isBuffer(result.content)) {
168
+ throw new chunkKH6RQ4J5_js.StorageProviderError("\u4E0B\u8F7D\u7684\u6587\u4EF6\u5185\u5BB9\u683C\u5F0F\u9519\u8BEF");
169
+ }
170
+ logger.info(
171
+ "\u2705 [AliyunOSSProvider] \u6587\u4EF6\u4E0B\u8F7D\u5B8C\u6210: " + filePath + ", \u5927\u5C0F: " + result.content.length
172
+ );
173
+ return result.content;
174
+ } catch (error) {
175
+ logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25: " + filePath + ":", error);
176
+ if (this.isOSSError(error) && error.code === "NoSuchKey") {
177
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u6587\u4EF6\u4E0D\u5B58\u5728`);
178
+ }
179
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25`);
180
+ }
181
+ }
182
+ /**
183
+ * 删除文件
184
+ */
185
+ async delete(filePath) {
186
+ this.ensureInitialized();
187
+ logger.info("\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u4ECEOSS\u5220\u9664\u6587\u4EF6: " + filePath);
188
+ try {
189
+ const result = await this.client?.delete(filePath);
190
+ logger.info("\u2705 [AliyunOSSProvider] \u6587\u4EF6\u5220\u9664\u5B8C\u6210: " + filePath);
191
+ return {
192
+ success: true,
193
+ data: {
194
+ requestId: result?.res?.rt || 0,
195
+ deletedPath: filePath
196
+ }
197
+ };
198
+ } catch (error) {
199
+ logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u5220\u9664\u5931\u8D25: " + filePath + ":", error);
200
+ if (this.isOSSError(error) && error.code === "NoSuchKey") {
201
+ logger.warn("\u26A0\uFE0F [AliyunOSSProvider] \u6587\u4EF6\u4E0D\u5B58\u5728: " + filePath);
202
+ return {
203
+ success: true,
204
+ data: { reason: "file_not_exists" }
205
+ };
206
+ }
207
+ return {
208
+ success: false,
209
+ error: this.formatOSSError(error)
210
+ };
211
+ }
212
+ }
213
+ /**
214
+ * 获取文件信息
215
+ */
216
+ async getFileInfo(filePath) {
217
+ this.ensureInitialized();
218
+ try {
219
+ const result = await this.client?.head(filePath);
220
+ return {
221
+ success: true,
222
+ size: parseInt(String(result.meta["content-length"] || "0")),
223
+ data: {
224
+ etag: result.meta.etag || "",
225
+ lastModified: result.meta["last-modified"] || "",
226
+ contentType: result.meta["content-type"],
227
+ meta: result.meta,
228
+ size: parseInt(String(result.meta["content-length"] || "0"))
229
+ }
230
+ };
231
+ } catch (error) {
232
+ if (this.isOSSError(error) && error.code === "NoSuchKey") {
233
+ return {
234
+ success: false,
235
+ error: "\u6587\u4EF6\u4E0D\u5B58\u5728"
236
+ };
237
+ }
238
+ return {
239
+ success: false,
240
+ error: this.formatOSSError(error)
241
+ };
242
+ }
243
+ }
244
+ /**
245
+ * 生成访问URL
246
+ */
247
+ async getAccessUrl(filePath, expiresIn) {
248
+ this.ensureInitialized();
249
+ try {
250
+ const isImage = /\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)$/i.test(filePath);
251
+ if (isImage) {
252
+ return this.generateAccessUrl(filePath);
253
+ } else {
254
+ const expires = expiresIn || 3600;
255
+ const signedUrl = this.client?.signatureUrl(filePath, {
256
+ expires,
257
+ method: "GET"
258
+ });
259
+ return signedUrl || "";
260
+ }
261
+ } catch (error) {
262
+ logger.error("\u274C [AliyunOSSProvider] \u751F\u6210\u8BBF\u95EEURL\u5931\u8D25: " + filePath + ":", error);
263
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u751F\u6210\u8BBF\u95EEURL\u5931\u8D25`);
264
+ }
265
+ }
266
+ /**
267
+ * 生成预签名上传URL
268
+ */
269
+ async getUploadUrl(filePath, expiresIn) {
270
+ this.ensureInitialized();
271
+ try {
272
+ const expires = expiresIn || 3600;
273
+ const signedUrl = this.client?.signatureUrl(filePath, {
274
+ expires,
275
+ method: "PUT"
276
+ });
277
+ return signedUrl || "";
278
+ } catch (error) {
279
+ logger.error("\u274C [AliyunOSSProvider] \u751F\u6210\u4E0A\u4F20URL\u5931\u8D25: " + filePath + ":", error);
280
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u751F\u6210\u4E0A\u4F20URL\u5931\u8D25`);
281
+ }
282
+ }
283
+ /**
284
+ * 检查文件是否存在
285
+ */
286
+ async exists(filePath) {
287
+ this.ensureInitialized();
288
+ try {
289
+ await this.client?.head(filePath);
290
+ return true;
291
+ } catch (error) {
292
+ if (this.isOSSError(error) && error.code === "NoSuchKey") {
293
+ return false;
294
+ }
295
+ logger.warn("\u26A0\uFE0F [AliyunOSSProvider] \u68C0\u67E5\u6587\u4EF6\u5B58\u5728\u6027\u65F6\u51FA\u9519: " + filePath + ":", error);
296
+ return false;
297
+ }
298
+ }
299
+ /**
300
+ * 列出文件(详细信息)
301
+ */
302
+ async listFiles(prefix, delimiter = "/", maxKeys = 1e3) {
303
+ this.ensureInitialized();
304
+ try {
305
+ const options = {
306
+ prefix,
307
+ delimiter,
308
+ "max-keys": String(maxKeys)
309
+ };
310
+ const result = await this.client?.list(options, {});
311
+ const files = (result.objects || []).map((obj) => ({
312
+ name: obj.name,
313
+ url: this.generateAccessUrl(obj.name),
314
+ size: obj.size,
315
+ lastModified: obj.lastModified,
316
+ etag: obj.etag,
317
+ type: "file"
318
+ }));
319
+ const folders = result.prefixes || [];
320
+ return {
321
+ files,
322
+ folders,
323
+ nextMarker: result.nextMarker
324
+ };
325
+ } catch (error) {
326
+ logger.error("\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: " + prefix + ":", error);
327
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`\u5217\u51FA\u6587\u4EF6\u5931\u8D25`);
328
+ }
329
+ }
330
+ /**
331
+ * 列出文件
332
+ */
333
+ async list(prefix, maxKeys) {
334
+ this.ensureInitialized();
335
+ try {
336
+ const options = {
337
+ prefix,
338
+ "max-keys": String(maxKeys || 1e3)
339
+ };
340
+ const result = await this.client?.list(options, {});
341
+ return result.objects?.map((obj) => obj.name) || [];
342
+ } catch (error) {
343
+ logger.error("\u274C [AliyunOSSProvider] \u5217\u51FA\u6587\u4EF6\u5931\u8D25: " + prefix + ":", error);
344
+ return [];
345
+ }
346
+ }
347
+ // ============= 私有方法 =============
348
+ /**
349
+ * 确保已初始化
350
+ */
351
+ ensureInitialized() {
352
+ if (!this.isInitialized || !this.client || !this.config) {
353
+ throw new chunkKH6RQ4J5_js.StorageProviderError("OSS\u5B58\u50A8\u63D0\u4F9B\u8005\u672A\u521D\u59CB\u5316");
354
+ }
355
+ }
356
+ /**
357
+ * 验证配置
358
+ */
359
+ validateConfig() {
360
+ if (!this.config) {
361
+ throw new chunkKH6RQ4J5_js.StorageProviderError("OSS\u914D\u7F6E\u4E3A\u7A7A");
362
+ }
363
+ const required = ["region", "bucket", "accessKeyId", "accessKeySecret"];
364
+ const missing = required.filter((key) => !this.config[key]);
365
+ if (missing.length > 0) {
366
+ throw new chunkKH6RQ4J5_js.StorageProviderError(`OSS\u914D\u7F6E\u7F3A\u5C11\u5FC5\u9700\u9879`);
367
+ }
368
+ }
369
+ /**
370
+ * 测试连接
371
+ */
372
+ async testConnection() {
373
+ }
374
+ /**
375
+ * 分片上传大文件
376
+ */
377
+ async multipartUpload(filePath, buffer, options) {
378
+ logger.info(`\u{1F4E6} [AliyunOSSProvider] \u4F7F\u7528\u591A\u5206\u7247\u4E0A\u4F20`);
379
+ const result = await this.client?.multipartUpload(filePath, buffer, {
380
+ partSize: 10 * 1024 * 1024,
381
+ // 10MB per chunk
382
+ parallel: 4,
383
+ // 并发数
384
+ progress: (p) => {
385
+ if (p % 0.1 < 0.01) {
386
+ logger.info("\u{1F4E6} [AliyunOSSProvider] \u4E0A\u4F20\u8FDB\u5EA6: " + (p * 100).toFixed(1) + "%");
387
+ }
388
+ },
389
+ meta: options.meta,
390
+ headers: options.headers
391
+ });
392
+ return {
393
+ name: result?.name || "",
394
+ url: result?.name || "",
395
+ // OSS返回的是object名称
396
+ data: result?.data || {},
397
+ res: result?.res || {}
398
+ };
399
+ }
400
+ /**
401
+ * 生成公开访问URL
402
+ */
403
+ generateAccessUrl(filePath) {
404
+ if (!this.config) {
405
+ throw new chunkKH6RQ4J5_js.StorageProviderError("OSS\u914D\u7F6E\u4E3A\u7A7A");
406
+ }
407
+ const normalizedPath = filePath.startsWith("/") ? filePath.substring(1) : filePath;
408
+ if (this.config.customDomain) {
409
+ const protocol = this.config.secure !== false ? "https" : "http";
410
+ const url = protocol + "://" + this.config.customDomain + "/" + normalizedPath;
411
+ logger.info("\u{1F517} [AliyunOSSProvider] \u4F7F\u7528\u81EA\u5B9A\u4E49\u57DF\u540D: " + url);
412
+ return url;
413
+ } else {
414
+ const protocol = this.config.secure !== false ? "https" : "http";
415
+ const url = protocol + "://" + this.config.bucket + "." + this.config.region + ".aliyuncs.com/" + normalizedPath;
416
+ logger.info("\u{1F517} [AliyunOSSProvider] \u4F7F\u7528\u9ED8\u8BA4OSS\u57DF\u540D: " + url);
417
+ return url;
418
+ }
419
+ }
420
+ /**
421
+ * 判断是否为OSS错误
422
+ */
423
+ isOSSError(error) {
424
+ if (!error || typeof error !== "object") {
425
+ return false;
426
+ }
427
+ return typeof error.code === "string" && typeof (error.name || "") === "string" && typeof (error.message || "") === "string";
428
+ }
429
+ /**
430
+ * 格式化OSS错误信息
431
+ */
432
+ formatOSSError(error) {
433
+ if (error instanceof Error) {
434
+ return error.message;
435
+ }
436
+ if (typeof error === "string") {
437
+ return error;
438
+ }
439
+ return "\u672A\u77E5\u9519\u8BEF";
440
+ }
441
+ /**
442
+ * 流式上传(可选实现)
443
+ */
444
+ async uploadStream(readableStream, filePath, contentType, contentLength) {
445
+ this.ensureInitialized();
446
+ const startTime = Date.now();
447
+ logger.info("\u{1F4E4} [AliyunOSSProvider] \u5F00\u59CB\u6D41\u5F0F\u4E0A\u4F20\u6587\u4EF6\u5230OSS: " + filePath);
448
+ try {
449
+ const options = {
450
+ timeout: 3e5,
451
+ mime: contentType || "application/octet-stream",
452
+ meta: { uid: 0, pid: 0 },
453
+ callback: { url: "", body: "" },
454
+ headers: {}
455
+ };
456
+ if (contentLength) {
457
+ options.headers["Content-Length"] = contentLength.toString();
458
+ }
459
+ const result = await this.client?.putStream(filePath, readableStream, options);
460
+ const accessUrl = this.generateAccessUrl(filePath);
461
+ const uploadTime = Date.now() - startTime;
462
+ logger.info("\u2705 [AliyunOSSProvider] \u6D41\u5F0F\u4E0A\u4F20\u5B8C\u6210: " + filePath + ", \u8017\u65F6: " + uploadTime + "ms");
463
+ return {
464
+ success: true,
465
+ path: filePath,
466
+ url: accessUrl,
467
+ size: contentLength,
468
+ data: {
469
+ name: result.name,
470
+ requestId: result.res?.rt || 0,
471
+ uploadTime,
472
+ ossUrl: result.url || result.name
473
+ }
474
+ };
475
+ } catch (error) {
476
+ logger.error("\u274C [AliyunOSSProvider] \u6D41\u5F0F\u4E0A\u4F20\u5931\u8D25: " + filePath + ":", error);
477
+ return {
478
+ success: false,
479
+ error: this.formatOSSError(error)
480
+ };
481
+ }
482
+ }
483
+ /**
484
+ * 批量删除文件
485
+ */
486
+ async batchDelete(filePaths) {
487
+ this.ensureInitialized();
488
+ logger.info("\u{1F5D1}\uFE0F [AliyunOSSProvider] \u5F00\u59CB\u6279\u91CF\u5220\u9664\u6587\u4EF6\uFF0C\u6570\u91CF: " + filePaths.length);
489
+ try {
490
+ const result = await this.client?.deleteMulti(filePaths, {
491
+ quiet: false
492
+ // 返回删除结果
493
+ });
494
+ logger.info("\u2705 [AliyunOSSProvider] \u6279\u91CF\u5220\u9664\u5B8C\u6210\uFF0C\u6210\u529F: " + (result.deleted?.length || 0));
495
+ return {
496
+ success: true,
497
+ data: {
498
+ deleted: result.deleted,
499
+ requestId: result.res?.rt || 0
500
+ }
501
+ };
502
+ } catch (error) {
503
+ logger.error(`\u274C [AliyunOSSProvider] \u6279\u91CF\u5220\u9664\u5931\u8D25:`, error);
504
+ return {
505
+ success: false,
506
+ error: this.formatOSSError(error)
507
+ };
508
+ }
509
+ }
510
+ /**
511
+ * 复制文件
512
+ */
513
+ async copy(sourcePath, targetPath) {
514
+ this.ensureInitialized();
515
+ logger.info("\u{1F4CB} [AliyunOSSProvider] \u5F00\u59CB\u590D\u5236\u6587\u4EF6: " + sourcePath + " -> " + targetPath);
516
+ try {
517
+ const result = await this.client?.copy(targetPath, sourcePath);
518
+ logger.info("\u2705 [AliyunOSSProvider] \u6587\u4EF6\u590D\u5236\u5B8C\u6210: " + sourcePath + " -> " + targetPath);
519
+ return {
520
+ success: true,
521
+ data: {
522
+ etag: result.data?.etag,
523
+ lastModified: result.data?.lastModified,
524
+ requestId: result.res?.rt || 0
525
+ }
526
+ };
527
+ } catch (error) {
528
+ logger.error("\u274C [AliyunOSSProvider] \u6587\u4EF6\u590D\u5236\u5931\u8D25: " + sourcePath + " -> " + targetPath + ":", error);
529
+ return {
530
+ success: false,
531
+ error: this.formatOSSError(error)
532
+ };
533
+ }
534
+ }
535
+ /**
536
+ * 编码元数据,避免中文字符在HTTP头部中的问题
537
+ */
538
+ encodeMetadata(metadata) {
539
+ const encoded = {};
540
+ for (const [key, value] of Object.entries(metadata)) {
541
+ if (value !== null && value !== void 0) {
542
+ const stringValue = String(value);
543
+ encoded[key] = encodeURIComponent(stringValue);
544
+ }
545
+ }
546
+ return encoded;
547
+ }
548
+ };
549
+
550
+ exports.AliyunOSSProvider = AliyunOSSProvider;
551
+ //# sourceMappingURL=chunk-HJ6MH7J7.js.map
552
+ //# sourceMappingURL=chunk-HJ6MH7J7.js.map