sa2kit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +298 -0
  3. package/dist/AliyunOSSProvider-7JLMJDXK.js +15 -0
  4. package/dist/AliyunOSSProvider-7JLMJDXK.js.map +1 -0
  5. package/dist/AliyunOSSProvider-GQMSDJGZ.mjs +6 -0
  6. package/dist/AliyunOSSProvider-GQMSDJGZ.mjs.map +1 -0
  7. package/dist/LocalStorageProvider-FVLLHBHO.mjs +6 -0
  8. package/dist/LocalStorageProvider-FVLLHBHO.mjs.map +1 -0
  9. package/dist/LocalStorageProvider-NBNHHWLY.js +15 -0
  10. package/dist/LocalStorageProvider-NBNHHWLY.js.map +1 -0
  11. package/dist/analytics/index.d.mts +1084 -0
  12. package/dist/analytics/index.d.ts +1084 -0
  13. package/dist/analytics/index.js +2595 -0
  14. package/dist/analytics/index.js.map +1 -0
  15. package/dist/analytics/index.mjs +2518 -0
  16. package/dist/analytics/index.mjs.map +1 -0
  17. package/dist/analytics/server/index.d.mts +499 -0
  18. package/dist/analytics/server/index.d.ts +499 -0
  19. package/dist/analytics/server/index.js +529 -0
  20. package/dist/analytics/server/index.js.map +1 -0
  21. package/dist/analytics/server/index.mjs +525 -0
  22. package/dist/analytics/server/index.mjs.map +1 -0
  23. package/dist/auth/client/index.d.mts +104 -0
  24. package/dist/auth/client/index.d.ts +104 -0
  25. package/dist/auth/client/index.js +21 -0
  26. package/dist/auth/client/index.js.map +1 -0
  27. package/dist/auth/client/index.mjs +4 -0
  28. package/dist/auth/client/index.mjs.map +1 -0
  29. package/dist/auth/components/index.d.mts +82 -0
  30. package/dist/auth/components/index.d.ts +82 -0
  31. package/dist/auth/components/index.js +93 -0
  32. package/dist/auth/components/index.js.map +1 -0
  33. package/dist/auth/components/index.mjs +86 -0
  34. package/dist/auth/components/index.mjs.map +1 -0
  35. package/dist/auth/hooks/index.d.mts +2 -0
  36. package/dist/auth/hooks/index.d.ts +2 -0
  37. package/dist/auth/hooks/index.js +17 -0
  38. package/dist/auth/hooks/index.js.map +1 -0
  39. package/dist/auth/hooks/index.mjs +4 -0
  40. package/dist/auth/hooks/index.mjs.map +1 -0
  41. package/dist/auth/index.d.mts +15 -0
  42. package/dist/auth/index.d.ts +15 -0
  43. package/dist/auth/index.js +110 -0
  44. package/dist/auth/index.js.map +1 -0
  45. package/dist/auth/index.mjs +9 -0
  46. package/dist/auth/index.mjs.map +1 -0
  47. package/dist/auth/middleware/index.d.mts +75 -0
  48. package/dist/auth/middleware/index.d.ts +75 -0
  49. package/dist/auth/middleware/index.js +15 -0
  50. package/dist/auth/middleware/index.js.map +1 -0
  51. package/dist/auth/middleware/index.mjs +6 -0
  52. package/dist/auth/middleware/index.mjs.map +1 -0
  53. package/dist/auth/routes/index.d.mts +163 -0
  54. package/dist/auth/routes/index.d.ts +163 -0
  55. package/dist/auth/routes/index.js +27 -0
  56. package/dist/auth/routes/index.js.map +1 -0
  57. package/dist/auth/routes/index.mjs +6 -0
  58. package/dist/auth/routes/index.mjs.map +1 -0
  59. package/dist/auth/schema/index.d.mts +789 -0
  60. package/dist/auth/schema/index.d.ts +789 -0
  61. package/dist/auth/schema/index.js +41 -0
  62. package/dist/auth/schema/index.js.map +1 -0
  63. package/dist/auth/schema/index.mjs +4 -0
  64. package/dist/auth/schema/index.mjs.map +1 -0
  65. package/dist/auth/services/index.d.mts +47 -0
  66. package/dist/auth/services/index.d.ts +47 -0
  67. package/dist/auth/services/index.js +34 -0
  68. package/dist/auth/services/index.js.map +1 -0
  69. package/dist/auth/services/index.mjs +5 -0
  70. package/dist/auth/services/index.mjs.map +1 -0
  71. package/dist/chunk-3RFBUDRA.js +507 -0
  72. package/dist/chunk-3RFBUDRA.js.map +1 -0
  73. package/dist/chunk-3XG5OHFD.mjs +37 -0
  74. package/dist/chunk-3XG5OHFD.mjs.map +1 -0
  75. package/dist/chunk-6BL3AZGD.js +285 -0
  76. package/dist/chunk-6BL3AZGD.js.map +1 -0
  77. package/dist/chunk-6FNUWAIV.js +394 -0
  78. package/dist/chunk-6FNUWAIV.js.map +1 -0
  79. package/dist/chunk-6PRFP5EG.js +171 -0
  80. package/dist/chunk-6PRFP5EG.js.map +1 -0
  81. package/dist/chunk-6VHWOPRR.mjs +90 -0
  82. package/dist/chunk-6VHWOPRR.mjs.map +1 -0
  83. package/dist/chunk-AIKEVVDR.mjs +122 -0
  84. package/dist/chunk-AIKEVVDR.mjs.map +1 -0
  85. package/dist/chunk-APY57REU.js +300 -0
  86. package/dist/chunk-APY57REU.js.map +1 -0
  87. package/dist/chunk-BJTO5JO5.mjs +10 -0
  88. package/dist/chunk-BJTO5JO5.mjs.map +1 -0
  89. package/dist/chunk-C64RY2OW.mjs +295 -0
  90. package/dist/chunk-C64RY2OW.mjs.map +1 -0
  91. package/dist/chunk-DGUM43GV.js +12 -0
  92. package/dist/chunk-DGUM43GV.js.map +1 -0
  93. package/dist/chunk-FV3FNHQY.js +92 -0
  94. package/dist/chunk-FV3FNHQY.js.map +1 -0
  95. package/dist/chunk-GSTLV3MB.mjs +316 -0
  96. package/dist/chunk-GSTLV3MB.mjs.map +1 -0
  97. package/dist/chunk-HEMA7SWK.mjs +212 -0
  98. package/dist/chunk-HEMA7SWK.mjs.map +1 -0
  99. package/dist/chunk-HWJ34NL6.js +43 -0
  100. package/dist/chunk-HWJ34NL6.js.map +1 -0
  101. package/dist/chunk-HXFFYNIF.mjs +385 -0
  102. package/dist/chunk-HXFFYNIF.mjs.map +1 -0
  103. package/dist/chunk-KGRQNEIR.mjs +183 -0
  104. package/dist/chunk-KGRQNEIR.mjs.map +1 -0
  105. package/dist/chunk-KH6RQ4J5.js +28 -0
  106. package/dist/chunk-KH6RQ4J5.js.map +1 -0
  107. package/dist/chunk-KQGP6BTS.mjs +165 -0
  108. package/dist/chunk-KQGP6BTS.mjs.map +1 -0
  109. package/dist/chunk-NMF4ANIC.js +365 -0
  110. package/dist/chunk-NMF4ANIC.js.map +1 -0
  111. package/dist/chunk-O26VCNS3.js +216 -0
  112. package/dist/chunk-O26VCNS3.js.map +1 -0
  113. package/dist/chunk-OLHGZXN3.mjs +86 -0
  114. package/dist/chunk-OLHGZXN3.mjs.map +1 -0
  115. package/dist/chunk-QU5OT4DF.js +88 -0
  116. package/dist/chunk-QU5OT4DF.js.map +1 -0
  117. package/dist/chunk-RCNNVNLT.mjs +356 -0
  118. package/dist/chunk-RCNNVNLT.mjs.map +1 -0
  119. package/dist/chunk-ROEYW4A7.js +186 -0
  120. package/dist/chunk-ROEYW4A7.js.map +1 -0
  121. package/dist/chunk-SVWQN2LR.js +131 -0
  122. package/dist/chunk-SVWQN2LR.js.map +1 -0
  123. package/dist/chunk-TKCYPDWU.js +338 -0
  124. package/dist/chunk-TKCYPDWU.js.map +1 -0
  125. package/dist/chunk-U2L6V7KD.mjs +273 -0
  126. package/dist/chunk-U2L6V7KD.mjs.map +1 -0
  127. package/dist/chunk-YVBU7QDJ.mjs +505 -0
  128. package/dist/chunk-YVBU7QDJ.mjs.map +1 -0
  129. package/dist/chunk-ZGVB35L2.mjs +25 -0
  130. package/dist/chunk-ZGVB35L2.mjs.map +1 -0
  131. package/dist/config/index.d.mts +64 -0
  132. package/dist/config/index.d.ts +64 -0
  133. package/dist/config/index.js +136 -0
  134. package/dist/config/index.js.map +1 -0
  135. package/dist/config/index.mjs +128 -0
  136. package/dist/config/index.mjs.map +1 -0
  137. package/dist/drizzle-auth-service-Bxlovhv8.d.ts +145 -0
  138. package/dist/drizzle-auth-service-DZY2F1sv.d.mts +145 -0
  139. package/dist/enums-Dume-V5Y.d.mts +16 -0
  140. package/dist/enums-Dume-V5Y.d.ts +16 -0
  141. package/dist/i18n/index.d.mts +416 -0
  142. package/dist/i18n/index.d.ts +416 -0
  143. package/dist/i18n/index.js +671 -0
  144. package/dist/i18n/index.js.map +1 -0
  145. package/dist/i18n/index.mjs +650 -0
  146. package/dist/i18n/index.mjs.map +1 -0
  147. package/dist/index-8VoHap_4.d.mts +105 -0
  148. package/dist/index-8VoHap_4.d.ts +105 -0
  149. package/dist/index.d.mts +4 -0
  150. package/dist/index.d.ts +4 -0
  151. package/dist/index.js +84 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/index.mjs +7 -0
  154. package/dist/index.mjs.map +1 -0
  155. package/dist/logger/index.d.mts +125 -0
  156. package/dist/logger/index.d.ts +125 -0
  157. package/dist/logger/index.js +29 -0
  158. package/dist/logger/index.js.map +1 -0
  159. package/dist/logger/index.mjs +4 -0
  160. package/dist/logger/index.mjs.map +1 -0
  161. package/dist/request/index.d.mts +51 -0
  162. package/dist/request/index.d.ts +51 -0
  163. package/dist/request/index.js +85 -0
  164. package/dist/request/index.js.map +1 -0
  165. package/dist/request/index.mjs +82 -0
  166. package/dist/request/index.mjs.map +1 -0
  167. package/dist/storage/index.d.mts +74 -0
  168. package/dist/storage/index.d.ts +74 -0
  169. package/dist/storage/index.js +46 -0
  170. package/dist/storage/index.js.map +1 -0
  171. package/dist/storage/index.mjs +5 -0
  172. package/dist/storage/index.mjs.map +1 -0
  173. package/dist/types-BINlP9MK.d.mts +286 -0
  174. package/dist/types-BINlP9MK.d.ts +286 -0
  175. package/dist/types-BaZccpvk.d.mts +48 -0
  176. package/dist/types-BaZccpvk.d.ts +48 -0
  177. package/dist/types-CbTsi9CZ.d.mts +31 -0
  178. package/dist/types-CbTsi9CZ.d.ts +31 -0
  179. package/dist/types-CoGG1rNV.d.mts +258 -0
  180. package/dist/types-CoGG1rNV.d.ts +258 -0
  181. package/dist/types-DAxQ1MeY.d.ts +70 -0
  182. package/dist/types-DT8LVCvE.d.mts +70 -0
  183. package/dist/types-DW9qar-w.d.mts +52 -0
  184. package/dist/types-DW9qar-w.d.ts +52 -0
  185. package/dist/universalExport/index.d.mts +235 -0
  186. package/dist/universalExport/index.d.ts +235 -0
  187. package/dist/universalExport/index.js +621 -0
  188. package/dist/universalExport/index.js.map +1 -0
  189. package/dist/universalExport/index.mjs +580 -0
  190. package/dist/universalExport/index.mjs.map +1 -0
  191. package/dist/universalExport/server/index.d.mts +429 -0
  192. package/dist/universalExport/server/index.d.ts +429 -0
  193. package/dist/universalExport/server/index.js +263 -0
  194. package/dist/universalExport/server/index.js.map +1 -0
  195. package/dist/universalExport/server/index.mjs +242 -0
  196. package/dist/universalExport/server/index.mjs.map +1 -0
  197. package/dist/universalFile/index.d.mts +310 -0
  198. package/dist/universalFile/index.d.ts +310 -0
  199. package/dist/universalFile/index.js +811 -0
  200. package/dist/universalFile/index.js.map +1 -0
  201. package/dist/universalFile/index.mjs +736 -0
  202. package/dist/universalFile/index.mjs.map +1 -0
  203. package/dist/universalFile/server/index.d.mts +2428 -0
  204. package/dist/universalFile/server/index.d.ts +2428 -0
  205. package/dist/universalFile/server/index.js +4578 -0
  206. package/dist/universalFile/server/index.js.map +1 -0
  207. package/dist/universalFile/server/index.mjs +4518 -0
  208. package/dist/universalFile/server/index.mjs.map +1 -0
  209. package/dist/useElectronStorage-Dj0rcorG.d.mts +65 -0
  210. package/dist/useElectronStorage-DwnNfIhl.d.ts +65 -0
  211. package/dist/utils/index.d.mts +188 -0
  212. package/dist/utils/index.d.ts +188 -0
  213. package/dist/utils/index.js +42 -0
  214. package/dist/utils/index.js.map +1 -0
  215. package/dist/utils/index.mjs +5 -0
  216. package/dist/utils/index.mjs.map +1 -0
  217. package/package.json +220 -0
  218. package/tailwind.animations.js +34 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/universalExport/server/factory.ts","../../../src/universalExport/server/presets.ts","../../../src/universalExport/server/validation.ts","../../../src/universalExport/server/utils/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * UniversalExport Service 工厂函数\n * 提供简化的服务初始化方式\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\n/**\n * 创建导出服务配置(带智能默认值)\n */\nexport function createExportServiceConfig(\n options: Partial<UniversalExportServiceConfig> = {}\n): UniversalExportServiceConfig {\n return {\n db: options.db,\n exportDir: options.exportDir || process.env.EXPORT_DIR || './exports',\n tempDir: options.tempDir || process.env.TEMP_DIR || './temp',\n maxRows: options.maxRows || 100000, // 默认最多导出 10 万行\n enableStreaming: options.enableStreaming !== false, // 默认启用流式导出\n timeout: options.timeout || 300000, // 默认超时 5 分钟\n };\n}\n\n/**\n * 创建导出服务实例(简化版)\n *\n * @example\n * ```typescript\n * // 最简配置\n * const service = createUniversalExportService();\n *\n * // 标准配置\n * const service = createUniversalExportService({\n * db: drizzleDb,\n * exportDir: './exports',\n * maxRows: 50000,\n * });\n * ```\n */\nexport function createUniversalExportService(\n options: Partial<UniversalExportServiceConfig> = {}\n) {\n const config = createExportServiceConfig(options);\n\n // 注意:实际的 UniversalExportService 将在后续 Phase 中迁移\n // 这里先返回一个占位对象,包含基本的类型信息\n console.warn(\n '⚠️ UniversalExportService 的完整实现将在后续 Phase 中迁移到 Sa2kit。\\n' +\n ' 当前版本仅包含类型定义和配置工厂函数。\\n' +\n ' 请暂时继续从 LyricNote 的 lib/universalExport 导入服务类。'\n );\n\n return {\n config,\n // 占位方法\n async export() {\n throw new Error('UniversalExportService 尚未完全迁移,请从 LyricNote 导入');\n },\n async createTask() {\n throw new Error('UniversalExportService 尚未完全迁移,请从 LyricNote 导入');\n },\n };\n}\n\n/**\n * 从环境变量创建配置(便利函数)\n *\n * @example\n * ```typescript\n * // .env\n * // EXPORT_DIR=./exports\n * // EXPORT_MAX_ROWS=50000\n *\n * const service = createExportServiceFromEnv();\n * ```\n */\nexport function createExportServiceFromEnv(db?: any) {\n return createUniversalExportService({\n db,\n exportDir: process.env.EXPORT_DIR,\n tempDir: process.env.TEMP_DIR,\n maxRows: process.env.EXPORT_MAX_ROWS\n ? parseInt(process.env.EXPORT_MAX_ROWS)\n : undefined,\n });\n}\n\n","/**\n * UniversalExport 预设配置\n * 提供常见场景的开箱即用配置\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\n/**\n * 小型应用预设(数据量小)\n */\nexport function createSmallAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 10000, // 1万行\n timeout: 60000, // 1分钟\n enableStreaming: false, // 小数据量不需要流式导出\n };\n}\n\n/**\n * 中型应用预设(默认配置)\n */\nexport function createMediumAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 100000, // 10万行\n timeout: 300000, // 5分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 大型应用预设(数据量大)\n */\nexport function createLargeAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 1000000, // 100万行\n timeout: 600000, // 10分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 实时导出预设(快速响应)\n */\nexport function createRealtimeExportPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 5000, // 5千行\n timeout: 30000, // 30秒\n enableStreaming: false,\n };\n}\n\n/**\n * 批量导出预设(大批量、离线处理)\n */\nexport function createBatchExportPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: Number.MAX_SAFE_INTEGER, // 不限制\n timeout: 1800000, // 30分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 智能预设:根据环境自动选择\n */\nexport function createSmartExportPreset(): Partial<UniversalExportServiceConfig> {\n const envMaxRows = process.env.EXPORT_MAX_ROWS;\n\n if (envMaxRows) {\n const maxRows = parseInt(envMaxRows);\n\n // 根据配置的最大行数自动选择合适的预设\n if (maxRows <= 10000) {\n return createSmallAppPreset();\n } else if (maxRows <= 100000) {\n return createMediumAppPreset();\n } else {\n return createLargeAppPreset();\n }\n }\n\n // 默认使用中型应用预设\n return createMediumAppPreset();\n}\n\n","/**\n * UniversalExport 配置验证\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\nexport class ConfigValidationError extends Error {\n constructor(message: string, public field: string) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\n/**\n * 验证导出服务配置\n */\nexport function validateExportConfig(config: UniversalExportServiceConfig): void {\n // 验证导出目录\n if (!config.exportDir) {\n throw new ConfigValidationError('exportDir is required', 'exportDir');\n }\n\n // 验证临时目录\n if (!config.tempDir) {\n throw new ConfigValidationError('tempDir is required', 'tempDir');\n }\n\n // 验证最大行数\n if (config.maxRows && config.maxRows <= 0) {\n throw new ConfigValidationError(\n 'maxRows must be greater than 0',\n 'maxRows'\n );\n }\n\n // 验证超时时间\n if (config.timeout && config.timeout <= 0) {\n throw new ConfigValidationError(\n 'timeout must be greater than 0',\n 'timeout'\n );\n }\n\n // 安全建议\n if (config.maxRows && config.maxRows > 1000000) {\n console.warn(\n `⚠️ Warning: maxRows (${config.maxRows}) is very large. ` +\n `Consider using pagination or streaming for better performance.`\n );\n }\n}\n\n/**\n * 验证环境变量\n */\nexport function validateEnvironment(requiredVars: string[]): void {\n const missing: string[] = [];\n\n for (const varName of requiredVars) {\n if (!process.env[varName]) {\n missing.push(varName);\n }\n }\n\n if (missing.length > 0) {\n throw new ConfigValidationError(\n `Missing required environment variables: ${missing.join(', ')}`,\n 'environment'\n );\n }\n}\n\n","/**\n * UniversalExport Server 工具函数\n */\n\nimport type { ExportField, FieldType } from '../../types';\n\n/**\n * 格式化字段值\n *\n * @param value 原始值\n * @param field 字段定义\n * @returns 格式化后的值\n */\nexport function formatFieldValue(value: any, field: ExportField): string {\n // 如果字段有自定义格式化函数,使用它\n if (field.formatter) {\n return field.formatter(value);\n }\n\n // 空值处理\n if (value === null || value === undefined) {\n return '';\n }\n\n // 根据字段类型进行默认格式化\n switch (field.type) {\n case 'date':\n return value instanceof Date\n ? (value.toISOString().split('T')[0] || '')\n : String(value);\n\n case 'boolean':\n return value ? '是' : '否';\n\n case 'array':\n return Array.isArray(value) ? value.join(', ') : String(value);\n\n case 'object':\n return typeof value === 'object'\n ? JSON.stringify(value)\n : String(value);\n\n case 'number':\n return typeof value === 'number'\n ? value.toLocaleString()\n : String(value);\n\n default:\n return String(value);\n }\n}\n\n/**\n * 验证字段值\n *\n * @param value 字段值\n * @param field 字段定义\n * @returns 是否有效\n */\nexport function validateFieldValue(value: any, field: ExportField): boolean {\n // 必填字段检查\n if (field.required && (value === null || value === undefined || value === '')) {\n return false;\n }\n\n // 类型检查\n switch (field.type) {\n case 'number':\n return typeof value === 'number' || !isNaN(Number(value));\n\n case 'boolean':\n return typeof value === 'boolean';\n\n case 'array':\n return Array.isArray(value);\n\n case 'object':\n return typeof value === 'object';\n\n case 'date':\n return value instanceof Date || !isNaN(Date.parse(value));\n\n default:\n return true;\n }\n}\n\n/**\n * 转换字段类型\n *\n * @param value 原始值\n * @param targetType 目标类型\n * @returns 转换后的值\n */\nexport function convertFieldType(value: any, targetType: FieldType): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n switch (targetType) {\n case 'string':\n return String(value);\n\n case 'number':\n return Number(value);\n\n case 'boolean':\n return Boolean(value);\n\n case 'date':\n return value instanceof Date ? value : new Date(value);\n\n case 'array':\n return Array.isArray(value) ? value : [value];\n\n case 'object':\n return typeof value === 'object' ? value : { value };\n\n default:\n return value;\n }\n}\n\n/**\n * 安全获取嵌套属性值\n *\n * @param obj 对象\n * @param path 属性路径(支持点号分隔)\n * @returns 属性值\n *\n * @example\n * ```typescript\n * const obj = { user: { name: 'John', age: 30 } };\n * getNestedValue(obj, 'user.name') // 'John'\n * getNestedValue(obj, 'user.email') // undefined\n * ```\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n}\n\n/**\n * 转义 CSV 字段值\n *\n * @param value 字段值\n * @returns 转义后的值\n */\nexport function escapeCsvValue(value: string): string {\n // 如果包含逗号、引号或换行符,需要用引号包裹并转义引号\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\n/**\n * 生成唯一的文件名\n *\n * @param prefix 前缀\n * @param extension 扩展名\n * @returns 唯一文件名\n *\n * @example\n * ```typescript\n * generateUniqueFilename('export', 'xlsx')\n * // 'export_20231111_123456_abc123.xlsx'\n * ```\n */\nexport function generateUniqueFilename(prefix: string, extension: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5);\n const random = Math.random().toString(36).substring(2, 8);\n return `${prefix}_${timestamp}_${random}.${extension}`;\n}\n\n/**\n * 计算导出进度百分比\n *\n * @param processed 已处理行数\n * @param total 总行数\n * @returns 百分比(0-100)\n */\nexport function calculateProgress(processed: number, total: number): number {\n if (total === 0) return 0;\n return Math.min(Math.round((processed / total) * 100), 100);\n}\n\n/**\n * 估算剩余时间(秒)\n *\n * @param processed 已处理行数\n * @param total 总行数\n * @param elapsedMs 已用时间(毫秒)\n * @returns 剩余时间(秒)\n */\nexport function estimateRemainingTime(\n processed: number,\n total: number,\n elapsedMs: number\n): number {\n if (processed === 0) return 0;\n const avgTimePerRow = elapsedMs / processed;\n const remainingRows = total - processed;\n return Math.round((remainingRows * avgTimePerRow) / 1000);\n}\n\n"]}
@@ -0,0 +1,242 @@
1
+ import '../../chunk-BJTO5JO5.mjs';
2
+
3
+ // src/universalExport/server/factory.ts
4
+ function createExportServiceConfig(options = {}) {
5
+ return {
6
+ db: options.db,
7
+ exportDir: options.exportDir || process.env.EXPORT_DIR || "./exports",
8
+ tempDir: options.tempDir || process.env.TEMP_DIR || "./temp",
9
+ maxRows: options.maxRows || 1e5,
10
+ // 默认最多导出 10 万行
11
+ enableStreaming: options.enableStreaming !== false,
12
+ // 默认启用流式导出
13
+ timeout: options.timeout || 3e5
14
+ // 默认超时 5 分钟
15
+ };
16
+ }
17
+ function createUniversalExportService(options = {}) {
18
+ const config = createExportServiceConfig(options);
19
+ console.warn(
20
+ "\u26A0\uFE0F UniversalExportService \u7684\u5B8C\u6574\u5B9E\u73B0\u5C06\u5728\u540E\u7EED Phase \u4E2D\u8FC1\u79FB\u5230 Sa2kit\u3002\n \u5F53\u524D\u7248\u672C\u4EC5\u5305\u542B\u7C7B\u578B\u5B9A\u4E49\u548C\u914D\u7F6E\u5DE5\u5382\u51FD\u6570\u3002\n \u8BF7\u6682\u65F6\u7EE7\u7EED\u4ECE LyricNote \u7684 lib/universalExport \u5BFC\u5165\u670D\u52A1\u7C7B\u3002"
21
+ );
22
+ return {
23
+ config,
24
+ // 占位方法
25
+ async export() {
26
+ throw new Error("UniversalExportService \u5C1A\u672A\u5B8C\u5168\u8FC1\u79FB\uFF0C\u8BF7\u4ECE LyricNote \u5BFC\u5165");
27
+ },
28
+ async createTask() {
29
+ throw new Error("UniversalExportService \u5C1A\u672A\u5B8C\u5168\u8FC1\u79FB\uFF0C\u8BF7\u4ECE LyricNote \u5BFC\u5165");
30
+ }
31
+ };
32
+ }
33
+ function createExportServiceFromEnv(db) {
34
+ return createUniversalExportService({
35
+ db,
36
+ exportDir: process.env.EXPORT_DIR,
37
+ tempDir: process.env.TEMP_DIR,
38
+ maxRows: process.env.EXPORT_MAX_ROWS ? parseInt(process.env.EXPORT_MAX_ROWS) : void 0
39
+ });
40
+ }
41
+
42
+ // src/universalExport/server/presets.ts
43
+ function createSmallAppPreset() {
44
+ return {
45
+ maxRows: 1e4,
46
+ // 1万行
47
+ timeout: 6e4,
48
+ // 1分钟
49
+ enableStreaming: false
50
+ // 小数据量不需要流式导出
51
+ };
52
+ }
53
+ function createMediumAppPreset() {
54
+ return {
55
+ maxRows: 1e5,
56
+ // 10万行
57
+ timeout: 3e5,
58
+ // 5分钟
59
+ enableStreaming: true
60
+ };
61
+ }
62
+ function createLargeAppPreset() {
63
+ return {
64
+ maxRows: 1e6,
65
+ // 100万行
66
+ timeout: 6e5,
67
+ // 10分钟
68
+ enableStreaming: true
69
+ };
70
+ }
71
+ function createRealtimeExportPreset() {
72
+ return {
73
+ maxRows: 5e3,
74
+ // 5千行
75
+ timeout: 3e4,
76
+ // 30秒
77
+ enableStreaming: false
78
+ };
79
+ }
80
+ function createBatchExportPreset() {
81
+ return {
82
+ maxRows: Number.MAX_SAFE_INTEGER,
83
+ // 不限制
84
+ timeout: 18e5,
85
+ // 30分钟
86
+ enableStreaming: true
87
+ };
88
+ }
89
+ function createSmartExportPreset() {
90
+ const envMaxRows = process.env.EXPORT_MAX_ROWS;
91
+ if (envMaxRows) {
92
+ const maxRows = parseInt(envMaxRows);
93
+ if (maxRows <= 1e4) {
94
+ return createSmallAppPreset();
95
+ } else if (maxRows <= 1e5) {
96
+ return createMediumAppPreset();
97
+ } else {
98
+ return createLargeAppPreset();
99
+ }
100
+ }
101
+ return createMediumAppPreset();
102
+ }
103
+
104
+ // src/universalExport/server/validation.ts
105
+ var ConfigValidationError = class extends Error {
106
+ constructor(message, field) {
107
+ super(message);
108
+ this.field = field;
109
+ this.name = "ConfigValidationError";
110
+ }
111
+ };
112
+ function validateExportConfig(config) {
113
+ if (!config.exportDir) {
114
+ throw new ConfigValidationError("exportDir is required", "exportDir");
115
+ }
116
+ if (!config.tempDir) {
117
+ throw new ConfigValidationError("tempDir is required", "tempDir");
118
+ }
119
+ if (config.maxRows && config.maxRows <= 0) {
120
+ throw new ConfigValidationError(
121
+ "maxRows must be greater than 0",
122
+ "maxRows"
123
+ );
124
+ }
125
+ if (config.timeout && config.timeout <= 0) {
126
+ throw new ConfigValidationError(
127
+ "timeout must be greater than 0",
128
+ "timeout"
129
+ );
130
+ }
131
+ if (config.maxRows && config.maxRows > 1e6) {
132
+ console.warn(
133
+ `\u26A0\uFE0F Warning: maxRows (${config.maxRows}) is very large. Consider using pagination or streaming for better performance.`
134
+ );
135
+ }
136
+ }
137
+ function validateEnvironment(requiredVars) {
138
+ const missing = [];
139
+ for (const varName of requiredVars) {
140
+ if (!process.env[varName]) {
141
+ missing.push(varName);
142
+ }
143
+ }
144
+ if (missing.length > 0) {
145
+ throw new ConfigValidationError(
146
+ `Missing required environment variables: ${missing.join(", ")}`,
147
+ "environment"
148
+ );
149
+ }
150
+ }
151
+
152
+ // src/universalExport/server/utils/index.ts
153
+ function formatFieldValue(value, field) {
154
+ if (field.formatter) {
155
+ return field.formatter(value);
156
+ }
157
+ if (value === null || value === void 0) {
158
+ return "";
159
+ }
160
+ switch (field.type) {
161
+ case "date":
162
+ return value instanceof Date ? value.toISOString().split("T")[0] || "" : String(value);
163
+ case "boolean":
164
+ return value ? "\u662F" : "\u5426";
165
+ case "array":
166
+ return Array.isArray(value) ? value.join(", ") : String(value);
167
+ case "object":
168
+ return typeof value === "object" ? JSON.stringify(value) : String(value);
169
+ case "number":
170
+ return typeof value === "number" ? value.toLocaleString() : String(value);
171
+ default:
172
+ return String(value);
173
+ }
174
+ }
175
+ function validateFieldValue(value, field) {
176
+ if (field.required && (value === null || value === void 0 || value === "")) {
177
+ return false;
178
+ }
179
+ switch (field.type) {
180
+ case "number":
181
+ return typeof value === "number" || !isNaN(Number(value));
182
+ case "boolean":
183
+ return typeof value === "boolean";
184
+ case "array":
185
+ return Array.isArray(value);
186
+ case "object":
187
+ return typeof value === "object";
188
+ case "date":
189
+ return value instanceof Date || !isNaN(Date.parse(value));
190
+ default:
191
+ return true;
192
+ }
193
+ }
194
+ function convertFieldType(value, targetType) {
195
+ if (value === null || value === void 0) {
196
+ return value;
197
+ }
198
+ switch (targetType) {
199
+ case "string":
200
+ return String(value);
201
+ case "number":
202
+ return Number(value);
203
+ case "boolean":
204
+ return Boolean(value);
205
+ case "date":
206
+ return value instanceof Date ? value : new Date(value);
207
+ case "array":
208
+ return Array.isArray(value) ? value : [value];
209
+ case "object":
210
+ return typeof value === "object" ? value : { value };
211
+ default:
212
+ return value;
213
+ }
214
+ }
215
+ function getNestedValue(obj, path) {
216
+ return path.split(".").reduce((current, key) => current?.[key], obj);
217
+ }
218
+ function escapeCsvValue(value) {
219
+ if (value.includes(",") || value.includes('"') || value.includes("\n")) {
220
+ return `"${value.replace(/"/g, '""')}"`;
221
+ }
222
+ return value;
223
+ }
224
+ function generateUniqueFilename(prefix, extension) {
225
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, -5);
226
+ const random = Math.random().toString(36).substring(2, 8);
227
+ return `${prefix}_${timestamp}_${random}.${extension}`;
228
+ }
229
+ function calculateProgress(processed, total) {
230
+ if (total === 0) return 0;
231
+ return Math.min(Math.round(processed / total * 100), 100);
232
+ }
233
+ function estimateRemainingTime(processed, total, elapsedMs) {
234
+ if (processed === 0) return 0;
235
+ const avgTimePerRow = elapsedMs / processed;
236
+ const remainingRows = total - processed;
237
+ return Math.round(remainingRows * avgTimePerRow / 1e3);
238
+ }
239
+
240
+ export { ConfigValidationError as ExportConfigValidationError, calculateProgress, convertFieldType, createBatchExportPreset, createExportServiceConfig, createExportServiceFromEnv, createLargeAppPreset, createMediumAppPreset, createRealtimeExportPreset, createSmallAppPreset, createSmartExportPreset, createUniversalExportService, escapeCsvValue, estimateRemainingTime, formatFieldValue, generateUniqueFilename, getNestedValue, validateExportConfig, validateEnvironment as validateExportEnvironment, validateFieldValue };
241
+ //# sourceMappingURL=index.mjs.map
242
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/universalExport/server/factory.ts","../../../src/universalExport/server/presets.ts","../../../src/universalExport/server/validation.ts","../../../src/universalExport/server/utils/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * UniversalExport Service 工厂函数\n * 提供简化的服务初始化方式\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\n/**\n * 创建导出服务配置(带智能默认值)\n */\nexport function createExportServiceConfig(\n options: Partial<UniversalExportServiceConfig> = {}\n): UniversalExportServiceConfig {\n return {\n db: options.db,\n exportDir: options.exportDir || process.env.EXPORT_DIR || './exports',\n tempDir: options.tempDir || process.env.TEMP_DIR || './temp',\n maxRows: options.maxRows || 100000, // 默认最多导出 10 万行\n enableStreaming: options.enableStreaming !== false, // 默认启用流式导出\n timeout: options.timeout || 300000, // 默认超时 5 分钟\n };\n}\n\n/**\n * 创建导出服务实例(简化版)\n *\n * @example\n * ```typescript\n * // 最简配置\n * const service = createUniversalExportService();\n *\n * // 标准配置\n * const service = createUniversalExportService({\n * db: drizzleDb,\n * exportDir: './exports',\n * maxRows: 50000,\n * });\n * ```\n */\nexport function createUniversalExportService(\n options: Partial<UniversalExportServiceConfig> = {}\n) {\n const config = createExportServiceConfig(options);\n\n // 注意:实际的 UniversalExportService 将在后续 Phase 中迁移\n // 这里先返回一个占位对象,包含基本的类型信息\n console.warn(\n '⚠️ UniversalExportService 的完整实现将在后续 Phase 中迁移到 Sa2kit。\\n' +\n ' 当前版本仅包含类型定义和配置工厂函数。\\n' +\n ' 请暂时继续从 LyricNote 的 lib/universalExport 导入服务类。'\n );\n\n return {\n config,\n // 占位方法\n async export() {\n throw new Error('UniversalExportService 尚未完全迁移,请从 LyricNote 导入');\n },\n async createTask() {\n throw new Error('UniversalExportService 尚未完全迁移,请从 LyricNote 导入');\n },\n };\n}\n\n/**\n * 从环境变量创建配置(便利函数)\n *\n * @example\n * ```typescript\n * // .env\n * // EXPORT_DIR=./exports\n * // EXPORT_MAX_ROWS=50000\n *\n * const service = createExportServiceFromEnv();\n * ```\n */\nexport function createExportServiceFromEnv(db?: any) {\n return createUniversalExportService({\n db,\n exportDir: process.env.EXPORT_DIR,\n tempDir: process.env.TEMP_DIR,\n maxRows: process.env.EXPORT_MAX_ROWS\n ? parseInt(process.env.EXPORT_MAX_ROWS)\n : undefined,\n });\n}\n\n","/**\n * UniversalExport 预设配置\n * 提供常见场景的开箱即用配置\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\n/**\n * 小型应用预设(数据量小)\n */\nexport function createSmallAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 10000, // 1万行\n timeout: 60000, // 1分钟\n enableStreaming: false, // 小数据量不需要流式导出\n };\n}\n\n/**\n * 中型应用预设(默认配置)\n */\nexport function createMediumAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 100000, // 10万行\n timeout: 300000, // 5分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 大型应用预设(数据量大)\n */\nexport function createLargeAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 1000000, // 100万行\n timeout: 600000, // 10分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 实时导出预设(快速响应)\n */\nexport function createRealtimeExportPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 5000, // 5千行\n timeout: 30000, // 30秒\n enableStreaming: false,\n };\n}\n\n/**\n * 批量导出预设(大批量、离线处理)\n */\nexport function createBatchExportPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: Number.MAX_SAFE_INTEGER, // 不限制\n timeout: 1800000, // 30分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 智能预设:根据环境自动选择\n */\nexport function createSmartExportPreset(): Partial<UniversalExportServiceConfig> {\n const envMaxRows = process.env.EXPORT_MAX_ROWS;\n\n if (envMaxRows) {\n const maxRows = parseInt(envMaxRows);\n\n // 根据配置的最大行数自动选择合适的预设\n if (maxRows <= 10000) {\n return createSmallAppPreset();\n } else if (maxRows <= 100000) {\n return createMediumAppPreset();\n } else {\n return createLargeAppPreset();\n }\n }\n\n // 默认使用中型应用预设\n return createMediumAppPreset();\n}\n\n","/**\n * UniversalExport 配置验证\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\nexport class ConfigValidationError extends Error {\n constructor(message: string, public field: string) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\n/**\n * 验证导出服务配置\n */\nexport function validateExportConfig(config: UniversalExportServiceConfig): void {\n // 验证导出目录\n if (!config.exportDir) {\n throw new ConfigValidationError('exportDir is required', 'exportDir');\n }\n\n // 验证临时目录\n if (!config.tempDir) {\n throw new ConfigValidationError('tempDir is required', 'tempDir');\n }\n\n // 验证最大行数\n if (config.maxRows && config.maxRows <= 0) {\n throw new ConfigValidationError(\n 'maxRows must be greater than 0',\n 'maxRows'\n );\n }\n\n // 验证超时时间\n if (config.timeout && config.timeout <= 0) {\n throw new ConfigValidationError(\n 'timeout must be greater than 0',\n 'timeout'\n );\n }\n\n // 安全建议\n if (config.maxRows && config.maxRows > 1000000) {\n console.warn(\n `⚠️ Warning: maxRows (${config.maxRows}) is very large. ` +\n `Consider using pagination or streaming for better performance.`\n );\n }\n}\n\n/**\n * 验证环境变量\n */\nexport function validateEnvironment(requiredVars: string[]): void {\n const missing: string[] = [];\n\n for (const varName of requiredVars) {\n if (!process.env[varName]) {\n missing.push(varName);\n }\n }\n\n if (missing.length > 0) {\n throw new ConfigValidationError(\n `Missing required environment variables: ${missing.join(', ')}`,\n 'environment'\n );\n }\n}\n\n","/**\n * UniversalExport Server 工具函数\n */\n\nimport type { ExportField, FieldType } from '../../types';\n\n/**\n * 格式化字段值\n *\n * @param value 原始值\n * @param field 字段定义\n * @returns 格式化后的值\n */\nexport function formatFieldValue(value: any, field: ExportField): string {\n // 如果字段有自定义格式化函数,使用它\n if (field.formatter) {\n return field.formatter(value);\n }\n\n // 空值处理\n if (value === null || value === undefined) {\n return '';\n }\n\n // 根据字段类型进行默认格式化\n switch (field.type) {\n case 'date':\n return value instanceof Date\n ? (value.toISOString().split('T')[0] || '')\n : String(value);\n\n case 'boolean':\n return value ? '是' : '否';\n\n case 'array':\n return Array.isArray(value) ? value.join(', ') : String(value);\n\n case 'object':\n return typeof value === 'object'\n ? JSON.stringify(value)\n : String(value);\n\n case 'number':\n return typeof value === 'number'\n ? value.toLocaleString()\n : String(value);\n\n default:\n return String(value);\n }\n}\n\n/**\n * 验证字段值\n *\n * @param value 字段值\n * @param field 字段定义\n * @returns 是否有效\n */\nexport function validateFieldValue(value: any, field: ExportField): boolean {\n // 必填字段检查\n if (field.required && (value === null || value === undefined || value === '')) {\n return false;\n }\n\n // 类型检查\n switch (field.type) {\n case 'number':\n return typeof value === 'number' || !isNaN(Number(value));\n\n case 'boolean':\n return typeof value === 'boolean';\n\n case 'array':\n return Array.isArray(value);\n\n case 'object':\n return typeof value === 'object';\n\n case 'date':\n return value instanceof Date || !isNaN(Date.parse(value));\n\n default:\n return true;\n }\n}\n\n/**\n * 转换字段类型\n *\n * @param value 原始值\n * @param targetType 目标类型\n * @returns 转换后的值\n */\nexport function convertFieldType(value: any, targetType: FieldType): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n switch (targetType) {\n case 'string':\n return String(value);\n\n case 'number':\n return Number(value);\n\n case 'boolean':\n return Boolean(value);\n\n case 'date':\n return value instanceof Date ? value : new Date(value);\n\n case 'array':\n return Array.isArray(value) ? value : [value];\n\n case 'object':\n return typeof value === 'object' ? value : { value };\n\n default:\n return value;\n }\n}\n\n/**\n * 安全获取嵌套属性值\n *\n * @param obj 对象\n * @param path 属性路径(支持点号分隔)\n * @returns 属性值\n *\n * @example\n * ```typescript\n * const obj = { user: { name: 'John', age: 30 } };\n * getNestedValue(obj, 'user.name') // 'John'\n * getNestedValue(obj, 'user.email') // undefined\n * ```\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n}\n\n/**\n * 转义 CSV 字段值\n *\n * @param value 字段值\n * @returns 转义后的值\n */\nexport function escapeCsvValue(value: string): string {\n // 如果包含逗号、引号或换行符,需要用引号包裹并转义引号\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\n/**\n * 生成唯一的文件名\n *\n * @param prefix 前缀\n * @param extension 扩展名\n * @returns 唯一文件名\n *\n * @example\n * ```typescript\n * generateUniqueFilename('export', 'xlsx')\n * // 'export_20231111_123456_abc123.xlsx'\n * ```\n */\nexport function generateUniqueFilename(prefix: string, extension: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5);\n const random = Math.random().toString(36).substring(2, 8);\n return `${prefix}_${timestamp}_${random}.${extension}`;\n}\n\n/**\n * 计算导出进度百分比\n *\n * @param processed 已处理行数\n * @param total 总行数\n * @returns 百分比(0-100)\n */\nexport function calculateProgress(processed: number, total: number): number {\n if (total === 0) return 0;\n return Math.min(Math.round((processed / total) * 100), 100);\n}\n\n/**\n * 估算剩余时间(秒)\n *\n * @param processed 已处理行数\n * @param total 总行数\n * @param elapsedMs 已用时间(毫秒)\n * @returns 剩余时间(秒)\n */\nexport function estimateRemainingTime(\n processed: number,\n total: number,\n elapsedMs: number\n): number {\n if (processed === 0) return 0;\n const avgTimePerRow = elapsedMs / processed;\n const remainingRows = total - processed;\n return Math.round((remainingRows * avgTimePerRow) / 1000);\n}\n\n"]}
@@ -0,0 +1,310 @@
1
+ import { U as UploadFileInfo, a as UploadProgress, F as FileMetadata, b as FileQueryOptions, P as PaginatedResult, B as BatchOperationResult } from '../types-CoGG1rNV.mjs';
2
+ export { A as AccessPermission, k as AudioProcessingOptions, C as CDNProviderError, g as CDNType, n as FileEvent, o as FileEventListener, m as FileEventType, e as FileProcessingError, c as FileServiceError, d as FileUploadError, I as ImageProcessingOptions, j as ProcessingOptions, h as ProcessorType, S as StorageProviderError, f as StorageType, l as UploadResult, i as UploadStatus, V as VideoProcessingOptions } from '../types-CoGG1rNV.mjs';
3
+
4
+ /**
5
+ * 通用文件服务客户端SDK
6
+ *
7
+ * 提供文件上传、下载、查询等功能的客户端接口
8
+ */
9
+
10
+ interface UniversalFileClientConfig {
11
+ /** API基础URL */
12
+ baseUrl?: string;
13
+ /** 请求超时时间(毫秒) */
14
+ timeout?: number;
15
+ /** 上传超时时间(毫秒) */
16
+ uploadTimeout?: number;
17
+ /** 自定义请求头 */
18
+ headers?: Record<string, string>;
19
+ }
20
+ /**
21
+ * 通用文件服务客户端
22
+ */
23
+ declare class UniversalFileClient {
24
+ private config;
25
+ constructor(config?: UniversalFileClientConfig);
26
+ /**
27
+ * 上传文件
28
+ */
29
+ uploadFile(fileInfo: UploadFileInfo, onProgress?: (progress: UploadProgress) => void): Promise<FileMetadata>;
30
+ /**
31
+ * 获取文件访问URL
32
+ */
33
+ getFileUrl(fileId: string, expiresIn?: number): Promise<string>;
34
+ /**
35
+ * 获取文件元数据
36
+ */
37
+ getFileMetadata(fileId: string): Promise<FileMetadata>;
38
+ /**
39
+ * 查询文件列表
40
+ */
41
+ queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>>;
42
+ /**
43
+ * 删除文件
44
+ */
45
+ deleteFile(fileId: string): Promise<void>;
46
+ /**
47
+ * 批量删除文件
48
+ */
49
+ batchDeleteFiles(fileIds: string[]): Promise<BatchOperationResult>;
50
+ /**
51
+ * 获取上传进度
52
+ */
53
+ getUploadProgress(fileId: string): Promise<UploadProgress>;
54
+ /**
55
+ * 获取请求头
56
+ */
57
+ private getHeaders;
58
+ /**
59
+ * 带超时的fetch请求
60
+ */
61
+ private fetchWithTimeout;
62
+ /**
63
+ * 转换API返回的文件元数据
64
+ */
65
+ private transformFileMetadataFromAPI;
66
+ }
67
+ /**
68
+ * 默认客户端实例
69
+ */
70
+ declare const universalFileClient: UniversalFileClient;
71
+ /**
72
+ * 创建自定义客户端实例
73
+ */
74
+ declare function createFileClient(config?: UniversalFileClientConfig): UniversalFileClient;
75
+
76
+ /**
77
+ * 通用文件服务常量定义
78
+ */
79
+ /** 模块版本 */
80
+ declare const UNIVERSAL_FILE_VERSION = "1.0.0";
81
+ /** 模块名称 */
82
+ declare const UNIVERSAL_FILE_NAME = "@qhr123/sa2kit/universalFile";
83
+ /** 默认最大文件大小(字节) - 100MB */
84
+ declare const DEFAULT_MAX_FILE_SIZE: number;
85
+ /** 默认最大图片大小(字节) - 10MB */
86
+ declare const DEFAULT_MAX_IMAGE_SIZE: number;
87
+ /** 默认最大视频大小(字节) - 500MB */
88
+ declare const DEFAULT_MAX_VIDEO_SIZE: number;
89
+ /** 默认最大音频大小(字节) - 50MB */
90
+ declare const DEFAULT_MAX_AUDIO_SIZE: number;
91
+ /** 默认最大文档大小(字节) - 20MB */
92
+ declare const DEFAULT_MAX_DOCUMENT_SIZE: number;
93
+ /** 图片MIME类型 */
94
+ declare const IMAGE_MIME_TYPES: string[];
95
+ /** 视频MIME类型 */
96
+ declare const VIDEO_MIME_TYPES: string[];
97
+ /** 音频MIME类型 */
98
+ declare const AUDIO_MIME_TYPES: string[];
99
+ /** 文档MIME类型 */
100
+ declare const DOCUMENT_MIME_TYPES: string[];
101
+ /** 所有支持的MIME类型 */
102
+ declare const ALL_SUPPORTED_MIME_TYPES: string[];
103
+ /** 图片扩展名 */
104
+ declare const IMAGE_EXTENSIONS: string[];
105
+ /** 视频扩展名 */
106
+ declare const VIDEO_EXTENSIONS: string[];
107
+ /** 音频扩展名 */
108
+ declare const AUDIO_EXTENSIONS: string[];
109
+ /** 文档扩展名 */
110
+ declare const DOCUMENT_EXTENSIONS: string[];
111
+ /** API基础路径 */
112
+ declare const API_BASE_PATH = "/api/universal-file";
113
+ /** API端点 */
114
+ declare const API_ENDPOINTS: {
115
+ /** 上传文件 */
116
+ readonly UPLOAD: "/api/universal-file/upload";
117
+ /** 获取文件URL */
118
+ readonly GET_URL: (fileId: string) => string;
119
+ /** 获取文件元数据 */
120
+ readonly GET_METADATA: (fileId: string) => string;
121
+ /** 删除文件 */
122
+ readonly DELETE: (fileId: string) => string;
123
+ /** 查询文件列表 */
124
+ readonly QUERY: "/api/universal-file/files";
125
+ /** 批量删除 */
126
+ readonly BATCH_DELETE: "/api/universal-file/files/batch-delete";
127
+ /** 获取上传进度 */
128
+ readonly GET_PROGRESS: (fileId: string) => string;
129
+ };
130
+ /** 错误代码 */
131
+ declare const ERROR_CODES: {
132
+ /** 文件上传错误 */
133
+ readonly FILE_UPLOAD_ERROR: "FILE_UPLOAD_ERROR";
134
+ /** 文件大小超限 */
135
+ readonly FILE_SIZE_EXCEEDED: "FILE_SIZE_EXCEEDED";
136
+ /** 文件类型不支持 */
137
+ readonly FILE_TYPE_NOT_SUPPORTED: "FILE_TYPE_NOT_SUPPORTED";
138
+ /** 文件不存在 */
139
+ readonly FILE_NOT_FOUND: "FILE_NOT_FOUND";
140
+ /** 文件处理错误 */
141
+ readonly FILE_PROCESSING_ERROR: "FILE_PROCESSING_ERROR";
142
+ /** 存储提供者错误 */
143
+ readonly STORAGE_PROVIDER_ERROR: "STORAGE_PROVIDER_ERROR";
144
+ /** CDN提供者错误 */
145
+ readonly CDN_PROVIDER_ERROR: "CDN_PROVIDER_ERROR";
146
+ /** 网络错误 */
147
+ readonly NETWORK_ERROR: "NETWORK_ERROR";
148
+ /** 超时错误 */
149
+ readonly TIMEOUT_ERROR: "TIMEOUT_ERROR";
150
+ /** 未授权 */
151
+ readonly UNAUTHORIZED: "UNAUTHORIZED";
152
+ /** 权限不足 */
153
+ readonly FORBIDDEN: "FORBIDDEN";
154
+ /** 服务器错误 */
155
+ readonly SERVER_ERROR: "SERVER_ERROR";
156
+ };
157
+ /** 默认分页大小 */
158
+ declare const DEFAULT_PAGE_SIZE = 20;
159
+ /** 默认请求超时时间(毫秒) - 30秒 */
160
+ declare const DEFAULT_REQUEST_TIMEOUT = 30000;
161
+ /** 默认上传超时时间(毫秒) - 5分钟 */
162
+ declare const DEFAULT_UPLOAD_TIMEOUT = 300000;
163
+ /** 默认分片上传大小(字节) - 5MB */
164
+ declare const DEFAULT_CHUNK_SIZE: number;
165
+
166
+ /**
167
+ * 通用文件服务工具函数
168
+ */
169
+ /**
170
+ * 格式化文件大小
171
+ */
172
+ declare function formatFileSize(bytes: number): string;
173
+ /**
174
+ * 解析文件大小字符串
175
+ */
176
+ declare function parseFileSize(sizeStr: string): number;
177
+ /**
178
+ * 获取文件扩展名
179
+ */
180
+ declare function getFileExtension(fileName: string): string;
181
+ /**
182
+ * 根据文件名获取MIME类型
183
+ */
184
+ declare function getMimeTypeFromFileName(fileName: string): string;
185
+ /**
186
+ * 检查MIME类型是否支持
187
+ */
188
+ declare function isMimeTypeSupported(mimeType: string, allowedTypes?: string[]): boolean;
189
+ /**
190
+ * 判断是否为图片类型
191
+ */
192
+ declare function isImageFile(mimeType: string): boolean;
193
+ /**
194
+ * 判断是否为视频类型
195
+ */
196
+ declare function isVideoFile(mimeType: string): boolean;
197
+ /**
198
+ * 判断是否为音频类型
199
+ */
200
+ declare function isAudioFile(mimeType: string): boolean;
201
+ /**
202
+ * 判断是否为文档类型
203
+ */
204
+ declare function isDocumentFile(mimeType: string): boolean;
205
+ /**
206
+ * 获取文件类型类别
207
+ */
208
+ declare function getFileCategory(mimeType: string): 'image' | 'video' | 'audio' | 'document' | 'other';
209
+ /**
210
+ * 验证文件名是否合法
211
+ */
212
+ declare function validateFileName(fileName: string): boolean;
213
+ /**
214
+ * 清理文件名,移除非法字符
215
+ */
216
+ declare function sanitizeFileName(fileName: string): string;
217
+ /**
218
+ * 生成唯一文件名
219
+ */
220
+ declare function generateUniqueFileName(originalName: string, fileId: string): string;
221
+ /**
222
+ * 生成存储路径
223
+ */
224
+ declare function generateStoragePath(moduleId: string, fileName: string, options?: {
225
+ businessId?: string;
226
+ useDate?: boolean;
227
+ customPrefix?: string;
228
+ }): string;
229
+ /**
230
+ * 解析存储路径
231
+ */
232
+ declare function parseStoragePath(path: string): {
233
+ moduleId?: string;
234
+ businessId?: string;
235
+ year?: string;
236
+ month?: string;
237
+ day?: string;
238
+ fileName: string;
239
+ };
240
+ /**
241
+ * 验证文件大小
242
+ */
243
+ declare function validateFileSize(file: File, maxSize: number): {
244
+ valid: boolean;
245
+ error?: string;
246
+ };
247
+ /**
248
+ * 验证文件类型
249
+ */
250
+ declare function validateFileType(file: File, allowedTypes?: string[]): {
251
+ valid: boolean;
252
+ error?: string;
253
+ };
254
+ /**
255
+ * 验证文件
256
+ */
257
+ declare function validateFile(file: File, options?: {
258
+ maxSize?: number;
259
+ allowedTypes?: string[];
260
+ }): {
261
+ valid: boolean;
262
+ errors: string[];
263
+ };
264
+ /**
265
+ * 构建查询字符串
266
+ */
267
+ declare function buildQueryString(params: Record<string, any>): string;
268
+ /**
269
+ * 解析URL查询参数
270
+ */
271
+ declare function parseQueryString(url: string): Record<string, string>;
272
+ /**
273
+ * 计算上传进度
274
+ */
275
+ declare function calculateProgress(uploadedBytes: number, totalBytes: number): number;
276
+ /**
277
+ * 计算上传速度
278
+ */
279
+ declare function calculateSpeed(uploadedBytes: number, elapsedTime: number): number;
280
+ /**
281
+ * 计算剩余时间
282
+ */
283
+ declare function calculateRemainingTime(uploadedBytes: number, totalBytes: number, speed: number): number;
284
+ /**
285
+ * 创建文件错误对象
286
+ */
287
+ declare function createFileError(code: string, message: string, details?: Record<string, any>): {
288
+ code: string;
289
+ message: string;
290
+ details?: Record<string, any>;
291
+ timestamp: Date;
292
+ };
293
+ /**
294
+ * 格式化错误消息
295
+ */
296
+ declare function formatErrorMessage(error: unknown): string;
297
+ /**
298
+ * 读取文件为Base64
299
+ */
300
+ declare function readFileAsBase64(file: File): Promise<string>;
301
+ /**
302
+ * 读取文件为ArrayBuffer
303
+ */
304
+ declare function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer>;
305
+ /**
306
+ * 读取文件为文本
307
+ */
308
+ declare function readFileAsText(file: File, encoding?: string): Promise<string>;
309
+
310
+ export { ALL_SUPPORTED_MIME_TYPES, API_BASE_PATH, API_ENDPOINTS, AUDIO_EXTENSIONS, AUDIO_MIME_TYPES, BatchOperationResult, DEFAULT_CHUNK_SIZE, DEFAULT_MAX_AUDIO_SIZE, DEFAULT_MAX_DOCUMENT_SIZE, DEFAULT_MAX_FILE_SIZE, DEFAULT_MAX_IMAGE_SIZE, DEFAULT_MAX_VIDEO_SIZE, DEFAULT_PAGE_SIZE, DEFAULT_REQUEST_TIMEOUT, DEFAULT_UPLOAD_TIMEOUT, DOCUMENT_EXTENSIONS, DOCUMENT_MIME_TYPES, ERROR_CODES, FileMetadata, FileQueryOptions, IMAGE_EXTENSIONS, IMAGE_MIME_TYPES, PaginatedResult, UNIVERSAL_FILE_NAME, UNIVERSAL_FILE_VERSION, UniversalFileClient, type UniversalFileClientConfig, UploadFileInfo, UploadProgress, VIDEO_EXTENSIONS, VIDEO_MIME_TYPES, buildQueryString, calculateProgress, calculateRemainingTime, calculateSpeed, createFileClient, createFileError, formatErrorMessage, formatFileSize, generateStoragePath, generateUniqueFileName, getFileCategory, getFileExtension, getMimeTypeFromFileName, isAudioFile, isDocumentFile, isImageFile, isMimeTypeSupported, isVideoFile, parseFileSize, parseQueryString, parseStoragePath, readFileAsArrayBuffer, readFileAsBase64, readFileAsText, sanitizeFileName, universalFileClient, validateFile, validateFileName, validateFileSize, validateFileType };