sa2kit 1.0.0 → 1.0.2

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 (99) hide show
  1. package/dist/UniversalFileService-CEZRJ87g.d.mts +727 -0
  2. package/dist/UniversalFileService-CEZRJ87g.d.ts +727 -0
  3. package/dist/api/index.d.mts +248 -0
  4. package/dist/api/index.d.ts +248 -0
  5. package/dist/api/index.js +294 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/index.mjs +290 -0
  8. package/dist/api/index.mjs.map +1 -0
  9. package/dist/auth/client/index.d.mts +52 -3
  10. package/dist/auth/client/index.d.ts +52 -3
  11. package/dist/auth/components/index.d.mts +149 -4
  12. package/dist/auth/components/index.d.ts +149 -4
  13. package/dist/auth/components/index.js +243 -9
  14. package/dist/auth/components/index.js.map +1 -1
  15. package/dist/auth/components/index.mjs +237 -4
  16. package/dist/auth/components/index.mjs.map +1 -1
  17. package/dist/auth/hooks/index.d.mts +31 -2
  18. package/dist/auth/hooks/index.d.ts +31 -2
  19. package/dist/auth/index.d.mts +5 -5
  20. package/dist/auth/index.d.ts +5 -5
  21. package/dist/auth/index.js +49 -17
  22. package/dist/auth/index.mjs +1 -1
  23. package/dist/auth/routes/index.d.mts +103 -5
  24. package/dist/auth/routes/index.d.ts +103 -5
  25. package/dist/auth/routes/index.js +37 -5
  26. package/dist/auth/routes/index.mjs +1 -1
  27. package/dist/chunk-42IJ7HEI.js +573 -0
  28. package/dist/chunk-42IJ7HEI.js.map +1 -0
  29. package/dist/chunk-7XLFSPDG.mjs +31 -0
  30. package/dist/chunk-7XLFSPDG.mjs.map +1 -0
  31. package/dist/chunk-GCVOKQZP.js +36 -0
  32. package/dist/chunk-GCVOKQZP.js.map +1 -0
  33. package/dist/chunk-IBLB7ARJ.mjs +560 -0
  34. package/dist/chunk-IBLB7ARJ.mjs.map +1 -0
  35. package/dist/{chunk-6FNUWAIV.js → chunk-LX4XX6W7.js} +54 -8
  36. package/dist/chunk-LX4XX6W7.js.map +1 -0
  37. package/dist/{chunk-HXFFYNIF.mjs → chunk-T5OZHYVM.mjs} +54 -8
  38. package/dist/chunk-T5OZHYVM.mjs.map +1 -0
  39. package/dist/config/server/index.d.mts +1533 -0
  40. package/dist/config/server/index.d.ts +1533 -0
  41. package/dist/config/server/index.js +1177 -0
  42. package/dist/config/server/index.js.map +1 -0
  43. package/dist/config/server/index.mjs +1138 -0
  44. package/dist/config/server/index.mjs.map +1 -0
  45. package/dist/i18n/index.d.mts +2 -1
  46. package/dist/i18n/index.d.ts +2 -1
  47. package/dist/i18n/index.js +125 -61
  48. package/dist/i18n/index.js.map +1 -1
  49. package/dist/i18n/index.mjs +126 -62
  50. package/dist/i18n/index.mjs.map +1 -1
  51. package/dist/index.js +6 -6
  52. package/dist/index.mjs +1 -1
  53. package/dist/mmd/index.d.mts +346 -0
  54. package/dist/mmd/index.d.ts +346 -0
  55. package/dist/mmd/index.js +1535 -0
  56. package/dist/mmd/index.js.map +1 -0
  57. package/dist/mmd/index.mjs +1503 -0
  58. package/dist/mmd/index.mjs.map +1 -0
  59. package/dist/storage/index.d.mts +1 -0
  60. package/dist/storage/index.d.ts +1 -0
  61. package/dist/storage/index.js +9 -9
  62. package/dist/storage/index.mjs +1 -1
  63. package/dist/{index-8VoHap_4.d.mts → types-CroexXnI.d.ts} +38 -44
  64. package/dist/{index-8VoHap_4.d.ts → types-DmsXCWvm.d.mts} +38 -44
  65. package/dist/{types-DAxQ1MeY.d.ts → types-Dt0oqeFM.d.mts} +1 -1
  66. package/dist/{types-DT8LVCvE.d.mts → types-zK6kDzDQ.d.ts} +1 -1
  67. package/dist/universalExport/index.js +17 -32
  68. package/dist/universalExport/index.js.map +1 -1
  69. package/dist/universalExport/index.mjs +2 -29
  70. package/dist/universalExport/index.mjs.map +1 -1
  71. package/dist/universalExport/server/index.d.mts +849 -8
  72. package/dist/universalExport/server/index.d.ts +849 -8
  73. package/dist/universalExport/server/index.js +1382 -2
  74. package/dist/universalExport/server/index.js.map +1 -1
  75. package/dist/universalExport/server/index.mjs +1355 -3
  76. package/dist/universalExport/server/index.mjs.map +1 -1
  77. package/dist/universalFile/index.d.mts +54 -3
  78. package/dist/universalFile/index.d.ts +54 -3
  79. package/dist/universalFile/index.js +272 -0
  80. package/dist/universalFile/index.js.map +1 -1
  81. package/dist/universalFile/index.mjs +267 -1
  82. package/dist/universalFile/index.mjs.map +1 -1
  83. package/dist/universalFile/server/index.d.mts +2541 -469
  84. package/dist/universalFile/server/index.d.ts +2541 -469
  85. package/dist/universalFile/server/index.js +830 -64
  86. package/dist/universalFile/server/index.js.map +1 -1
  87. package/dist/universalFile/server/index.mjs +803 -66
  88. package/dist/universalFile/server/index.mjs.map +1 -1
  89. package/package.json +47 -23
  90. package/dist/chunk-6FNUWAIV.js.map +0 -1
  91. package/dist/chunk-APY57REU.js +0 -300
  92. package/dist/chunk-APY57REU.js.map +0 -1
  93. package/dist/chunk-C64RY2OW.mjs +0 -295
  94. package/dist/chunk-C64RY2OW.mjs.map +0 -1
  95. package/dist/chunk-HXFFYNIF.mjs.map +0 -1
  96. package/dist/types-CoGG1rNV.d.mts +0 -258
  97. package/dist/types-CoGG1rNV.d.ts +0 -258
  98. package/dist/types-DW9qar-w.d.mts +0 -52
  99. package/dist/types-DW9qar-w.d.ts +0 -52
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../../src/universalExport/server/UniversalExportService.ts","../../../src/universalExport/server/factory.ts","../../../src/universalExport/server/presets.ts","../../../src/universalExport/server/validation.ts","../../../src/universalExport/server/utils/index.ts","../../../src/universalExport/server/drizzle-schemas/postgres.ts","../../../src/universalExport/server/drizzle-database.ts"],"names":["endTime","duration","timestamp"],"mappings":"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","file":"index.mjs","sourcesContent":["// @ts-nocheck\n\n/**\n * 通用导出服务\n *\n * 提供统一的导出功能,支持配置化字段选择、格式化和分组\n */\n\nimport type {\n ExportConfig,\n ExportRequest,\n ExportResult,\n ExportProgress,\n ExportError,\n ExportField,\n ExportFormat,\n UniversalExportServiceConfig,\n ExportEvent,\n ExportEventListener,\n FieldMapper,\n DataTransformer,\n Validator,\n Formatter,\n GroupingConfig,\n GroupingField,\n GroupingMode,\n GroupValueProcessing,\n} from '../types';\n\n// Excel导出依赖\nimport * as XLSX from 'xlsx';\n\n// 日志\nimport { createLogger } from '../../logger';\nconst logger = createLogger('UniversalExportService');\n\n// 客户端服务(可选依赖,通过构造函数注入)\n// import { universalExportClient } from './client';\n\nimport {\n ExportServiceError,\n ExportConfigError,\n ExportDataError,\n ExportFileError,\n} from '../types';\n\n// ============= 默认配置 =============\n\nconst DEFAULT_CONFIG: UniversalExportServiceConfig = {\n defaultFormat: 'csv',\n defaultDelimiter: ',',\n defaultEncoding: 'utf-8',\n defaultAddBOM: true,\n maxFileSize: 100 * 1024 * 1024, // 100MB\n maxRowsLimit: 100000,\n maxConcurrentExports: 5,\n exportTimeout: 300000, // 5分钟\n cache: {\n configTTL: 3600, // 1小时\n resultTTL: 1800, // 30分钟\n },\n};\n\n// ============= 内置格式化器 =============\n\nconst DEFAULT_FORMATTERS: Record<string, Formatter> = {\n // 日期格式化\n date: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toISOString().split('T')[0];\n },\n\n // 时间格式化\n datetime: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n return date.toLocaleString('zh-CN');\n },\n\n // 数字格式化\n number: (value: any) => {\n if (value === null || value === undefined) return '';\n return String(value);\n },\n\n // 货币格式化\n currency: (value: any) => {\n if (value === null || value === undefined) return '';\n return `¥${Number(value).toFixed(2)}`;\n },\n\n // 百分比格式化\n percentage: (value: any) => {\n if (value === null || value === undefined) return '';\n return `${(Number(value) * 100).toFixed(2)}%`;\n },\n\n // 布尔值格式化\n boolean: (value: any) => {\n if (value === null || value === undefined) return '';\n return value ? '是' : '否';\n },\n\n // 数组格式化\n array: (value: any) => {\n if (!Array.isArray(value)) return '';\n return value.join(', ');\n },\n\n // 对象格式化\n object: (value: any) => {\n if (!value || typeof value !== 'object') return '';\n return JSON.stringify(value);\n },\n};\n\n// ============= 主服务类 =============\n\n/**\n * 导出客户端接口(用于依赖注入)\n */\nexport interface IExportClient {\n createConfig(config: Omit<ExportConfig, 'id' | 'createdAt' | 'updatedAt'>): Promise<ExportConfig>;\n getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]>;\n}\n\nexport class UniversalExportService {\n private config: UniversalExportServiceConfig;\n private eventListeners: Map<string, ExportEventListener[]> = new Map();\n private activeExports: Map<string, ExportProgress> = new Map();\n private configCache: Map<string, { config: ExportConfig; timestamp: number }> = new Map();\n private resultCache: Map<string, { result: ExportResult; timestamp: number }> = new Map();\n private client?: IExportClient;\n\n constructor(\n config?: Partial<UniversalExportServiceConfig>,\n client?: IExportClient\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.client = client;\n }\n\n // ============= 配置管理 =============\n\n /**\n * 创建导出配置\n */\n async createConfig(\n config: Omit<ExportConfig, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<ExportConfig> {\n try {\n // 验证配置\n this.validateConfig({\n ...config,\n id: 'temp',\n createdAt: new Date(),\n updatedAt: new Date(),\n });\n\n // 通过客户端API保存到数据库(如果提供了client)\n if (!this.client) {\n throw new ExportConfigError('未提供导出客户端服务', config);\n }\n const newConfig = await this.client.createConfig(config);\n\n // 保存到缓存\n this.configCache.set(newConfig.id, {\n config: newConfig,\n timestamp: Date.now(),\n });\n\n // 触发事件\n this.emitEvent({\n type: 'config:save',\n exportId: newConfig.id,\n timestamp: new Date(),\n data: { config: newConfig },\n });\n\n return newConfig;\n } catch (error) {\n throw new ExportConfigError(\n `创建导出配置失败: ${error instanceof Error ? error.message : '未知错误'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * 获取导出配置\n */\n async getConfig(configId: string): Promise<ExportConfig | null> {\n // 先从缓存获取\n const cached = this.configCache.get(configId);\n if (cached && Date.now() - cached.timestamp < this.config.cache.configTTL * 1000) {\n return cached.config;\n }\n\n // 从缓存中获取(暂时不支持从数据库获取单个配置)\n return null;\n }\n\n /**\n * 更新导出配置\n */\n async updateConfig(configId: string, updates: Partial<ExportConfig>): Promise<ExportConfig> {\n const existing = await this.getConfig(configId);\n if (!existing) {\n throw new ExportConfigError(`配置不存在: ${configId}`);\n }\n\n const updatedConfig: ExportConfig = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n\n // 验证配置\n this.validateConfig(updatedConfig);\n\n // 更新缓存\n this.configCache.set(configId, {\n config: updatedConfig,\n timestamp: Date.now(),\n });\n\n // 触发事件\n this.emitEvent({\n type: 'config:save',\n exportId: configId,\n timestamp: new Date(),\n data: { config: updatedConfig },\n });\n\n return updatedConfig;\n }\n\n /**\n * 删除导出配置\n */\n async deleteConfig(configId: string): Promise<void> {\n const existing = await this.getConfig(configId);\n if (!existing) {\n throw new ExportConfigError(`配置不存在: ${configId}`);\n }\n\n // 从缓存删除\n this.configCache.delete(configId);\n\n // 触发事件\n this.emitEvent({\n type: 'config:delete',\n exportId: configId,\n timestamp: new Date(),\n data: { configId },\n });\n }\n\n /**\n * 获取模块的配置列表\n */\n async getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]> {\n if (!this.client) {\n throw new ExportConfigError('未提供导出客户端服务', { moduleId, businessId });\n }\n return await this.client.getConfigsByModule(moduleId, businessId);\n }\n\n // ============= 导出执行 =============\n\n /**\n * 执行导出\n */\n async export(request: ExportRequest): Promise<ExportResult> {\n const exportId = this.generateId();\n const startTime = new Date();\n\n logger.info('🚀 [UniversalExportService] 开始导出:', {\n exportId,\n configId: request.configId,\n hasDataSource: !!request.dataSource,\n hasCallbacks: !!request.callbacks,\n });\n\n try {\n // 获取配置 - 支持直接传入配置对象或从缓存获取\n let config: ExportConfig;\n if (typeof request.configId === 'object' && request.configId !== null) {\n // 直接传入配置对象\n config = request.configId as ExportConfig;\n logger.info('📋 [UniversalExportService] 使用直接传入的配置:', {\n configId: config.id,\n configName: config.name,\n format: config.format,\n fieldsCount: config.fields.length,\n hasGrouping: !!config.grouping,\n groupingEnabled: config.grouping?.enabled,\n groupingFieldsCount: config.grouping?.fields?.length || 0,\n groupingFields:\n config.grouping?.fields?.map((f) => ({ key: f.key, mergeCells: f.mergeCells })) || [],\n });\n } else {\n // 从缓存获取配置\n logger.info('🔍 [UniversalExportService] 从缓存获取配置:', request.configId);\n const cachedConfig = await this.getConfig(request.configId as string);\n if (!cachedConfig) {\n throw new ExportConfigError(`导出配置不存在: ${request.configId}`);\n }\n config = cachedConfig;\n logger.info('✅ [UniversalExportService] 成功获取缓存配置:', {\n configId: config.id,\n configName: config.name,\n });\n }\n\n // 创建进度对象\n const progress: ExportProgress = {\n exportId,\n status: 'pending',\n progress: 0,\n processedRows: 0,\n totalRows: 0,\n startTime,\n };\n\n this.activeExports.set(exportId, progress);\n\n // 触发开始事件\n this.emitEvent({\n type: 'export:start',\n exportId,\n timestamp: startTime,\n data: { config, request },\n });\n\n // 调用进度回调\n if (request.callbacks?.onProgress) {\n logger.info('📞 [UniversalExportService] 调用 onProgress 回调 - 开始');\n request.callbacks.onProgress(progress);\n }\n\n logger.info('📊 [UniversalExportService] 开始获取数据...');\n\n // 获取数据\n const data = await this.getData(request);\n logger.info('✅ [UniversalExportService] 数据获取成功:', {\n dataLength: data.length,\n firstItem: data[0] ? Object.keys(data[0]) : [],\n sampleData: data.slice(0, 2),\n });\n\n progress.totalRows = data.length;\n progress.status = 'processing';\n\n // 更新进度回调\n if (request.callbacks?.onProgress) {\n logger.info('📞 [UniversalExportService] 调用 onProgress 回调 - 数据处理');\n progress.progress = 30;\n request.callbacks.onProgress(progress);\n }\n\n // 过滤和排序数据\n logger.info('🔄 [UniversalExportService] 开始处理数据...');\n const processedData = await this.processData(data, request, config);\n logger.info('✅ [UniversalExportService] 数据处理完成:', {\n originalLength: data.length,\n processedLength: processedData.length,\n });\n\n // 更新进度回调\n if (request.callbacks?.onProgress) {\n logger.info('📞 [UniversalExportService] 调用 onProgress 回调 - 数据完成');\n progress.progress = 60;\n request.callbacks.onProgress(progress);\n }\n\n // 生成文件\n logger.info('📄 [UniversalExportService] 开始生成文件...');\n const result = await this.generateFile(processedData, config, request, exportId);\n logger.info('✅ [UniversalExportService] 文件生成成功:', {\n fileName: result.fileName,\n fileSize: result.fileSize,\n exportedRows: result.exportedRows,\n });\n\n // 更新进度\n progress.status = 'completed';\n progress.progress = 100;\n progress.processedRows = data.length;\n\n // 调用成功回调\n if (request.callbacks?.onSuccess) {\n logger.info('📞 [UniversalExportService] 调用 onSuccess 回调');\n request.callbacks.onSuccess(result);\n }\n\n // 触发完成事件\n this.emitEvent({\n type: 'export:complete',\n exportId,\n timestamp: new Date(),\n data: { result },\n });\n\n // 缓存结果\n this.resultCache.set(exportId, {\n result,\n timestamp: Date.now(),\n });\n\n // 清理进度\n this.activeExports.delete(exportId);\n\n return result;\n } catch (error) {\n const errorObj: ExportError = {\n code: 'EXPORT_FAILED',\n message: error instanceof Error ? error.message : '导出失败',\n details: { originalError: error },\n timestamp: new Date(),\n };\n\n // 更新进度\n const progress = this.activeExports.get(exportId);\n if (progress) {\n progress.status = 'failed';\n progress.error = errorObj.message;\n this.activeExports.delete(exportId);\n }\n\n // 调用错误回调\n if (request.callbacks?.onError) {\n logger.info('📞 [UniversalExportService] 调用 onError 回调');\n request.callbacks.onError(errorObj);\n }\n\n // 触发错误事件\n this.emitEvent({\n type: 'export:error',\n exportId,\n timestamp: new Date(),\n error: errorObj.message,\n data: { error: errorObj },\n });\n\n throw error;\n }\n }\n\n /**\n * 获取导出进度\n */\n getExportProgress(exportId: string): ExportProgress | null {\n return this.activeExports.get(exportId) || null;\n }\n\n /**\n * 取消导出\n */\n cancelExport(exportId: string): boolean {\n const progress = this.activeExports.get(exportId);\n if (!progress) {\n return false;\n }\n\n progress.status = 'cancelled';\n this.activeExports.delete(exportId);\n\n // 触发取消事件\n this.emitEvent({\n type: 'export:cancel',\n exportId,\n timestamp: new Date(),\n data: { progress },\n });\n\n return true;\n }\n\n // ============= 事件管理 =============\n\n /**\n * 添加事件监听器\n */\n addEventListener(type: string, listener: ExportEventListener): void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, []);\n }\n this.eventListeners.get(type)!.push(listener);\n }\n\n /**\n * 移除事件监听器\n */\n removeEventListener(type: string, listener: ExportEventListener): void {\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 生成唯一ID\n */\n private generateId(): string {\n return `export_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * 验证配置\n */\n private validateConfig(config: ExportConfig): void {\n if (!config.name || config.name.trim() === '') {\n throw new ExportConfigError('配置名称不能为空');\n }\n\n if (!config.fields || config.fields.length === 0) {\n throw new ExportConfigError('至少需要定义一个字段');\n }\n\n const enabledFields = config.fields.filter((f) => f.enabled);\n if (enabledFields.length === 0) {\n throw new ExportConfigError('至少需要启用一个字段');\n }\n\n // 检查字段键名唯一性\n const keys = config.fields.map((f) => f.key);\n const uniqueKeys = new Set(keys);\n if (keys.length !== uniqueKeys.size) {\n throw new ExportConfigError('字段键名必须唯一');\n }\n }\n\n /**\n * 获取数据\n */\n private async getData(request: ExportRequest): Promise<any[]> {\n logger.info('🔍 [UniversalExportService] getData 开始执行...');\n try {\n if (typeof request.dataSource === 'function') {\n logger.info('📞 [UniversalExportService] 调用数据源函数...');\n const data = await request.dataSource();\n logger.info('✅ [UniversalExportService] 数据源函数执行成功:', {\n dataType: typeof data,\n isArray: Array.isArray(data),\n length: Array.isArray(data) ? data.length : 'N/A',\n });\n return data;\n } else {\n // 这里可以扩展支持从API获取数据\n console.error('❌ [UniversalExportService] 数据源不是函数:', typeof request.dataSource);\n throw new ExportDataError('暂不支持字符串数据源');\n }\n } catch (error) {\n console.error('❌ [UniversalExportService] 获取数据失败:', error);\n throw new ExportDataError(\n `获取数据失败: ${error instanceof Error ? error.message : '未知错误'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * 处理数据\n */\n private async processData(\n data: any[],\n request: ExportRequest,\n config: ExportConfig\n ): Promise<any[]> {\n logger.info('🔄 [UniversalExportService] processData 开始执行:', {\n dataLength: data.length,\n hasFilters: !!(request.filters && request.filters.length > 0),\n hasSortBy: !!(request.sortBy && request.sortBy.length > 0),\n hasPagination: !!request.pagination,\n hasGrouping: !!(config.grouping && config.grouping.enabled),\n maxRows: config.maxRows,\n });\n\n // 🔍 详细调试分组配置\n logger.info('🔍 [UniversalExportService] 详细分组配置检查:', {\n configGrouping: config.grouping,\n groupingExists: !!config.grouping,\n groupingEnabled: config.grouping?.enabled,\n groupingFields: config.grouping?.fields,\n groupingFieldsLength: config.grouping?.fields?.length,\n });\n\n let processedData = [...data];\n\n // 应用过滤器\n if (request.filters && request.filters.length > 0) {\n logger.info('🔍 [UniversalExportService] 应用过滤器...');\n processedData = this.applyFilters(processedData, request.filters);\n logger.info('✅ [UniversalExportService] 过滤器应用完成:', {\n beforeLength: data.length,\n afterLength: processedData.length,\n });\n }\n\n // 应用排序\n if (request.sortBy && request.sortBy.length > 0) {\n logger.info('📊 [UniversalExportService] 应用排序...');\n processedData = this.applySorting(processedData, request.sortBy);\n logger.info('✅ [UniversalExportService] 排序应用完成');\n }\n\n // 应用分组\n if (config.grouping && config.grouping.enabled) {\n logger.info('📊 [UniversalExportService] 应用分组...');\n processedData = this.applyGrouping(processedData, config.grouping);\n logger.info('✅ [UniversalExportService] 分组应用完成:', {\n groupsCount: this.countGroups(processedData),\n resultLength: processedData.length,\n });\n }\n\n // 应用分页\n if (request.pagination) {\n logger.info('📄 [UniversalExportService] 应用分页...');\n const { page, pageSize } = request.pagination;\n const start = (page - 1) * pageSize;\n const end = start + pageSize;\n processedData = processedData.slice(start, end);\n logger.info('✅ [UniversalExportService] 分页应用完成:', {\n page,\n pageSize,\n start,\n end,\n resultLength: processedData.length,\n });\n }\n\n // 限制行数\n if (config.maxRows && processedData.length > config.maxRows) {\n logger.info('📏 [UniversalExportService] 应用行数限制...');\n processedData = processedData.slice(0, config.maxRows);\n logger.info('✅ [UniversalExportService] 行数限制应用完成:', {\n maxRows: config.maxRows,\n resultLength: processedData.length,\n });\n }\n\n logger.info('✅ [UniversalExportService] processData 执行完成:', {\n originalLength: data.length,\n finalLength: processedData.length,\n });\n\n return processedData;\n }\n\n /**\n * 应用过滤器\n */\n private applyFilters(data: any[], filters: any[]): any[] {\n return data.filter((item) => {\n return filters.every((filter) => {\n const value = this.getNestedValue(item, filter.field);\n\n switch (filter.operator) {\n case 'eq':\n return value === filter.value;\n case 'ne':\n return value !== filter.value;\n case 'gt':\n return value > filter.value;\n case 'gte':\n return value >= filter.value;\n case 'lt':\n return value < filter.value;\n case 'lte':\n return value <= filter.value;\n case 'contains':\n return String(value).includes(String(filter.value));\n case 'startsWith':\n return String(value).startsWith(String(filter.value));\n case 'endsWith':\n return String(value).endsWith(String(filter.value));\n case 'in':\n return Array.isArray(filter.value) && filter.value.includes(value);\n case 'notIn':\n return Array.isArray(filter.value) && !filter.value.includes(value);\n default:\n return true;\n }\n });\n });\n }\n\n /**\n * 应用排序\n */\n private applySorting(data: any[], sortBy: any[]): any[] {\n return data.sort((a, b) => {\n for (const sort of sortBy) {\n const aValue = this.getNestedValue(a, sort.field);\n const bValue = this.getNestedValue(b, sort.field);\n\n if (aValue < bValue) {\n return sort.direction === 'asc' ? -1 : 1;\n }\n if (aValue > bValue) {\n return sort.direction === 'asc' ? 1 : -1;\n }\n }\n return 0;\n });\n }\n\n /**\n * 获取嵌套值\n */\n private getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => {\n return current && current[key] !== undefined ? current[key] : null;\n }, obj);\n }\n\n /**\n * 过滤掉所有行都为空值的字段\n */\n private filterEmptyFields(data: any[], fields: ExportField[]): ExportField[] {\n const filteredFields = fields.filter((field) => {\n // 特殊处理:强制保留某些重要字段,即使所有行都为空值\n const forceKeepFields = ['pickupMethod', 'notes', 'adminNotes'];\n if (forceKeepFields.includes(field.key)) {\n logger.info(`🔧 [UniversalExportService] 强制保留字段 \"${field.key}\" (${field.label})`);\n return true;\n }\n\n // 检查所有数据行,如果至少有一行该字段有值,则保留该字段\n const hasValue = data.some((item) => {\n const value = this.getNestedValue(item, field.key);\n return value !== null && value !== undefined && value !== '';\n });\n\n if (!hasValue) {\n logger.info(\n `🔍 [UniversalExportService] 字段 \"${field.key}\" (${field.label}) 被过滤掉 - 所有行都为空值`\n );\n }\n\n return hasValue;\n });\n\n logger.info('📊 [UniversalExportService] 字段过滤结果:', {\n 原始字段数: fields.length,\n 过滤后字段数: filteredFields.length,\n 被过滤的字段: fields.filter((f) => !filteredFields.includes(f)).map((f) => f.key),\n 保留的字段: filteredFields.map((f) => f.key),\n });\n\n return filteredFields;\n }\n\n /**\n * 生成文件\n */\n private async generateFile(\n data: any[],\n config: ExportConfig,\n request: ExportRequest,\n exportId: string\n ): Promise<ExportResult> {\n const startTime = new Date();\n const enabledFields = config.fields.filter((f) => f.enabled);\n\n logger.info('📄 [UniversalExportService] generateFile 开始执行:', {\n dataLength: data.length,\n enabledFieldsCount: enabledFields.length,\n format: config.format,\n enabledFields: enabledFields.map((f) => ({ key: f.key, label: f.label })),\n });\n\n try {\n let content: string;\n let fileName: string;\n\n switch (config.format) {\n case 'csv':\n logger.info('📊 [UniversalExportService] 生成CSV格式...');\n content = this.generateCSV(data, enabledFields, config);\n fileName = this.generateFileName(\n request.customFileName || config.fileNameTemplate,\n 'csv'\n );\n logger.info('✅ [UniversalExportService] CSV生成完成:', {\n contentLength: content.length,\n fileName,\n });\n break;\n case 'excel':\n logger.info('📊 [UniversalExportService] 生成Excel格式...');\n const excelBuffer = this.generateExcel(data, enabledFields, config);\n fileName = this.generateFileName(\n request.customFileName || config.fileNameTemplate,\n 'xlsx'\n );\n logger.info('✅ [UniversalExportService] Excel生成完成:', {\n bufferLength: excelBuffer.byteLength,\n fileName,\n });\n // 创建Excel Blob\n const excelBlob = new Blob([excelBuffer], { type: this.getMimeType(config.format) });\n const endTime = new Date();\n const duration = endTime.getTime() - startTime.getTime();\n return {\n exportId,\n fileName,\n fileSize: excelBlob.size,\n fileBlob: excelBlob,\n exportedRows: data.length,\n startTime,\n endTime,\n duration,\n statistics: {\n totalRows: data.length,\n filteredRows: data.length,\n exportedRows: data.length,\n skippedRows: 0,\n },\n };\n case 'json':\n logger.info('📄 [UniversalExportService] 生成JSON格式...');\n content = this.generateJSON(data, enabledFields);\n fileName = this.generateFileName(\n request.customFileName || config.fileNameTemplate,\n 'json'\n );\n logger.info('✅ [UniversalExportService] JSON生成完成:', {\n contentLength: content.length,\n fileName,\n });\n break;\n default:\n console.error('❌ [UniversalExportService] 不支持的格式:', config.format);\n throw new ExportFileError(`不支持的导出格式: ${config.format}`);\n }\n\n // 创建Blob\n const blob = new Blob([content], { type: this.getMimeType(config.format) });\n\n // 检查文件大小\n if (blob.size > this.config.maxFileSize) {\n throw new ExportFileError(`文件大小超过限制: ${blob.size} > ${this.config.maxFileSize}`);\n }\n\n const endTime = new Date();\n const duration = endTime.getTime() - startTime.getTime();\n\n return {\n exportId,\n fileName,\n fileSize: blob.size,\n fileBlob: blob,\n exportedRows: data.length,\n startTime,\n endTime,\n duration,\n statistics: {\n totalRows: data.length,\n filteredRows: data.length,\n exportedRows: data.length,\n skippedRows: 0,\n },\n };\n } catch (error) {\n throw new ExportFileError(\n `生成文件失败: ${error instanceof Error ? error.message : '未知错误'}`,\n { originalError: error }\n );\n }\n }\n\n /**\n * 生成CSV内容\n */\n private generateCSV(data: any[], fields: ExportField[], config: ExportConfig): string {\n logger.info('📊 [UniversalExportService] generateCSV 开始执行:', {\n dataLength: data.length,\n fieldsCount: fields.length,\n includeHeader: config.includeHeader,\n delimiter: config.delimiter,\n addBOM: config.addBOM,\n });\n\n const lines: string[] = [];\n\n // 添加BOM\n if (config.addBOM) {\n lines.push('\\uFEFF');\n logger.info('📝 [UniversalExportService] 添加BOM');\n }\n\n // 过滤掉所有行都为空值的字段\n const nonEmptyFields = this.filterEmptyFields(data, fields);\n logger.info('📊 [UniversalExportService] 过滤空字段:', {\n originalFieldsCount: fields.length,\n nonEmptyFieldsCount: nonEmptyFields.length,\n removedFields: fields\n .filter((f: ExportField) => !nonEmptyFields.includes(f))\n .map((f: ExportField) => f.key),\n });\n\n // 添加表头\n if (config.includeHeader) {\n const headers = nonEmptyFields.map((f) => this.escapeCSVField(f.label));\n lines.push(headers.join(config.delimiter));\n logger.info('📋 [UniversalExportService] 添加表头:', headers);\n }\n\n // 添加数据行\n logger.info('📊 [UniversalExportService] 开始处理数据行...');\n for (let i = 0; i < data.length; i++) {\n const item = data[i];\n if (i === 0) {\n logger.info('📊 [UniversalExportService] 第一行数据示例:', item);\n }\n\n const row = nonEmptyFields.map((field) => {\n // 处理分组头行\n if (item.__isGroupHeader) {\n return this.escapeCSVField(item[field.key] || '');\n }\n\n let value = this.getNestedValue(item, field.key);\n\n // 应用格式化器\n if (field.formatter) {\n value = field.formatter(value);\n } else if (DEFAULT_FORMATTERS[field.type]) {\n value = DEFAULT_FORMATTERS[field.type](value);\n } else {\n value = String(value || '');\n }\n\n return this.escapeCSVField(value);\n });\n\n lines.push(row.join(config.delimiter));\n\n if (i === 0) {\n logger.info('📊 [UniversalExportService] 第一行处理结果:', row);\n }\n }\n\n const result = lines.join('\\n');\n logger.info('✅ [UniversalExportService] CSV生成完成:', {\n totalLines: lines.length,\n resultLength: result.length,\n });\n return result;\n }\n\n /**\n * 生成JSON内容\n */\n private generateJSON(data: any[], fields: ExportField[]): string {\n const processedData = data.map((item) => {\n const processed: Record<string, any> = {};\n\n for (const field of fields) {\n let value = this.getNestedValue(item, field.key);\n\n // 应用格式化器\n if (field.formatter) {\n value = field.formatter(value);\n } else if (DEFAULT_FORMATTERS[field.type]) {\n value = DEFAULT_FORMATTERS[field.type](value);\n }\n\n processed[field.key] = value;\n }\n\n return processed;\n });\n\n return JSON.stringify(processedData, null, 2);\n }\n\n /**\n * 转义CSV字段\n */\n private escapeCSVField(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n\n /**\n * 生成文件名\n */\n private generateFileName(template: string, extension: string): string {\n const now = new Date();\n const dateStr = now.toISOString().split('T')[0];\n const timeStr = now.toTimeString().split(' ')[0].replace(/:/g, '-');\n\n return (\n template\n .replace('{date}', dateStr)\n .replace('{time}', timeStr)\n .replace('{timestamp}', now.getTime().toString()) + `.${extension}`\n );\n }\n\n /**\n * 获取MIME类型\n */\n private getMimeType(format: ExportFormat): string {\n switch (format) {\n case 'csv':\n return 'text/csv; charset=utf-8';\n case 'json':\n return 'application/json; charset=utf-8';\n case 'excel':\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n default:\n return 'application/octet-stream';\n }\n }\n\n /**\n * 触发事件\n */\n private emitEvent(event: ExportEvent): void {\n const listeners = this.eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((listener) => {\n try {\n listener(event);\n } catch (error) {\n console.error('事件监听器执行失败:', error);\n }\n });\n }\n }\n\n // ============= 分组相关方法 =============\n\n /**\n * 应用分组\n */\n private applyGrouping(data: any[], groupingConfig: GroupingConfig): any[] {\n logger.info('📊 [UniversalExportService] applyGrouping 开始执行:', {\n dataLength: data.length,\n groupingFields: groupingConfig.fields.map((f) => f.key),\n preserveOrder: groupingConfig.preserveOrder,\n });\n\n if (!groupingConfig.fields || groupingConfig.fields.length === 0) {\n return data;\n }\n\n // 按分组字段对数据进行分组\n const grouped = this.groupDataByFields(data, groupingConfig);\n\n // 处理分组后的数据\n const result = this.processGroupedData(grouped, groupingConfig);\n\n logger.info('✅ [UniversalExportService] applyGrouping 执行完成:', {\n originalLength: data.length,\n groupedLength: result.length,\n });\n\n return result;\n }\n\n /**\n * 按字段分组数据\n */\n private groupDataByFields(data: any[], groupingConfig: GroupingConfig): Map<string, any[]> {\n const groups = new Map<string, any[]>();\n\n for (const item of data) {\n // 生成分组键\n const groupKey = this.generateGroupKey(item, groupingConfig.fields);\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n }\n\n return groups;\n }\n\n /**\n * 生成分组键\n */\n private generateGroupKey(item: any, groupingFields: GroupingField[]): string {\n const keyParts = groupingFields.map((field) => {\n const value = this.getNestedValue(item, field.key);\n\n // 处理空值\n if (value === null || value === undefined || value === '') {\n return '__NULL__';\n }\n\n return String(value);\n });\n\n return keyParts.join('|');\n }\n\n /**\n * 处理分组后的数据\n */\n private processGroupedData(groups: Map<string, any[]>, groupingConfig: GroupingConfig): any[] {\n const result: any[] = [];\n\n for (const [groupKey, groupItems] of groups) {\n if (groupItems.length === 0) continue;\n\n // 解析分组键\n const groupValues = groupKey.split('|');\n\n // 处理分组\n const processedGroup = this.processGroup(groupItems, groupingConfig, groupValues);\n result.push(...processedGroup);\n }\n\n return result;\n }\n\n /**\n * 处理单个分组\n */\n private processGroup(\n groupItems: any[],\n groupingConfig: GroupingConfig,\n groupValues: string[]\n ): any[] {\n const result: any[] = [];\n\n // 添加分组头行(如果需要)\n const showGroupHeader = groupingConfig.fields.some((f) => f.showGroupHeader);\n if (showGroupHeader) {\n const groupHeader = this.createGroupHeader(groupValues, groupingConfig.fields);\n result.push(groupHeader);\n }\n\n // 处理分组模式 - 对于多字段分组,使用特殊处理\n if (groupingConfig.fields.length > 1) {\n // 多字段合并模式\n result.push(...this.processMultiFieldMergeMode(groupItems, groupingConfig.fields));\n } else {\n // 单字段分组\n const primaryGroupField = groupingConfig.fields[0];\n\n switch (primaryGroupField.mode) {\n case 'merge':\n // 合并模式:第一行显示分组值,其他行为空\n result.push(...this.processMergeMode(groupItems, primaryGroupField));\n break;\n case 'separate':\n // 分离模式:每个分组独立显示\n result.push(...groupItems);\n break;\n case 'nested':\n // 嵌套模式:支持多级分组\n result.push(...this.processNestedMode(groupItems, groupingConfig));\n break;\n default:\n result.push(...groupItems);\n }\n }\n\n return result;\n }\n\n /**\n * 创建分组头行\n */\n private createGroupHeader(groupValues: string[], groupingFields: GroupingField[]): any {\n const header: any = { __isGroupHeader: true };\n\n groupingFields.forEach((field, index) => {\n const value = groupValues[index] === '__NULL__' ? '' : groupValues[index];\n const template = field.groupHeaderTemplate || `${field.label}: {value}`;\n header[field.key] = template.replace('{value}', value);\n });\n\n return header;\n }\n\n /**\n * 处理合并模式\n */\n private processMergeMode(groupItems: any[], groupField: GroupingField): any[] {\n if (groupItems.length === 0) return [];\n\n const result: any[] = [];\n\n // 第一行保持原样\n const firstItem = { ...groupItems[0] };\n firstItem.__groupSize = groupItems.length;\n firstItem.__isGroupFirst = true;\n result.push(firstItem);\n\n // 其他行的分组字段设置为空,用于合并单元格\n for (let i = 1; i < groupItems.length; i++) {\n const item = { ...groupItems[i] };\n item[groupField.key] = ''; // 空值表示需要合并\n item.__isGroupChild = true;\n item.__groupIndex = i;\n result.push(item);\n }\n\n return result;\n }\n\n /**\n * 处理多字段合并模式\n */\n private processMultiFieldMergeMode(groupItems: any[], groupFields: GroupingField[]): any[] {\n if (groupItems.length === 0) return [];\n\n const result: any[] = [];\n\n // 第一行保持原样,添加分组标记\n const firstItem = { ...groupItems[0] };\n firstItem.__groupSize = groupItems.length;\n firstItem.__isGroupFirst = true;\n\n // 为每个分组字段标记\n groupFields.forEach((field) => {\n firstItem[`__${field.key}_groupSize`] = groupItems.length;\n firstItem[`__${field.key}_isGroupFirst`] = true;\n });\n\n result.push(firstItem);\n\n logger.info('🔗 [UniversalExportService] 处理多字段合并模式:', {\n groupItemsLength: groupItems.length,\n groupFields: groupFields.map((f) => f.key),\n firstItem: firstItem,\n });\n\n // 其他行的所有分组字段设置为空,用于合并单元格\n for (let i = 1; i < groupItems.length; i++) {\n const item = { ...groupItems[i] };\n\n // 清空所有分组字段的值,用于单元格合并\n groupFields.forEach((field) => {\n item[field.key] = ''; // 空值表示需要合并\n });\n\n item.__isGroupChild = true;\n item.__groupIndex = i;\n result.push(item);\n }\n\n return result;\n }\n\n /**\n * 处理嵌套模式\n */\n private processNestedMode(groupItems: any[], groupingConfig: GroupingConfig): any[] {\n // 如果只有一个分组字段,按merge模式处理\n if (groupingConfig.fields.length === 1) {\n return this.processMergeMode(groupItems, groupingConfig.fields[0]);\n }\n\n // 多级分组:递归处理下一级\n const subGroupingConfig: GroupingConfig = {\n ...groupingConfig,\n fields: groupingConfig.fields.slice(1),\n };\n\n return this.applyGrouping(groupItems, subGroupingConfig);\n }\n\n /**\n * 统计分组数量\n */\n private countGroups(data: any[]): number {\n const groupHeaders = data.filter((item) => item.__isGroupHeader);\n const groupFirsts = data.filter((item) => item.__isGroupFirst);\n return Math.max(groupHeaders.length, groupFirsts.length);\n }\n\n /**\n * 生成Excel文件\n */\n private generateExcel(data: any[], fields: ExportField[], config: ExportConfig): ArrayBuffer {\n logger.info('📊 [UniversalExportService] generateExcel 开始执行:', {\n dataLength: data.length,\n fieldsCount: fields.length,\n hasGrouping: !!(config.grouping && config.grouping.enabled),\n });\n\n // 创建工作簿\n const workbook = XLSX.utils.book_new();\n\n // 过滤掉所有行都为空值的字段\n const nonEmptyFields = this.filterEmptyFields(data, fields);\n\n // 准备数据\n const worksheetData = this.prepareExcelData(data, nonEmptyFields, config);\n\n // 创建工作表\n const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);\n\n // 应用分组和合并单元格\n if (config.grouping && config.grouping.enabled) {\n this.applyExcelGrouping(\n worksheet,\n data,\n nonEmptyFields,\n config.grouping,\n config.includeHeader\n );\n }\n\n // 设置列宽和样式\n this.setExcelColumnWidths(worksheet, nonEmptyFields);\n\n // 为所有数据单元格添加边框\n this.applyExcelDataStyles(worksheet, config.includeHeader);\n\n // 添加工作表到工作簿\n XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');\n\n // 生成文件\n const excelBuffer = XLSX.write(workbook, {\n bookType: 'xlsx',\n type: 'array',\n cellStyles: true,\n });\n\n logger.info('✅ [UniversalExportService] generateExcel 执行完成');\n return excelBuffer;\n }\n\n /**\n * 准备Excel数据\n */\n private prepareExcelData(data: any[], fields: ExportField[], config: ExportConfig): any[][] {\n const result: any[][] = [];\n\n logger.info('📊 [UniversalExportService] 准备Excel数据:', {\n dataLength: data.length,\n fieldsCount: fields.length,\n includeHeader: config.includeHeader,\n hasGrouping: !!(config.grouping && config.grouping.enabled),\n });\n\n // 添加表头\n if (config.includeHeader) {\n const headers = fields.map((field) => field.label);\n result.push(headers);\n logger.info('📋 [UniversalExportService] 添加表头:', headers);\n }\n\n // 添加数据行\n for (let i = 0; i < data.length; i++) {\n const item = data[i];\n\n const row = fields.map((field) => {\n // 跳过分组头行的处理\n if (item.__isGroupHeader) {\n return item[field.key] || '';\n }\n\n let value = this.getNestedValue(item, field.key);\n\n // 应用格式化器\n if (field.formatter) {\n value = field.formatter(value);\n } else if (DEFAULT_FORMATTERS[field.type]) {\n value = DEFAULT_FORMATTERS[field.type](value);\n } else {\n value = String(value || '');\n }\n\n return value;\n });\n\n result.push(row);\n\n if (i === 0) {\n logger.info('📊 [UniversalExportService] 第一行数据示例:', row);\n }\n }\n\n logger.info('✅ [UniversalExportService] Excel数据准备完成:', {\n totalRows: result.length,\n headerRows: config.includeHeader ? 1 : 0,\n dataRows: result.length - (config.includeHeader ? 1 : 0),\n });\n\n return result;\n }\n\n /**\n * 应用Excel分组和合并单元格\n */\n private applyExcelGrouping(\n worksheet: XLSX.WorkSheet,\n data: any[],\n fields: ExportField[],\n groupingConfig: GroupingConfig,\n includeHeader: boolean = true\n ): void {\n if (!worksheet['!merges']) {\n worksheet['!merges'] = [];\n }\n\n const headerOffset = includeHeader ? 1 : 0; // 是否有表头\n let currentRow = headerOffset;\n\n logger.info('📊 [UniversalExportService] 开始处理Excel分组和合并单元格:', {\n dataLength: data.length,\n headerOffset,\n groupingFields: groupingConfig.fields.map((f) => ({ key: f.key, mergeCells: f.mergeCells })),\n });\n\n for (let i = 0; i < data.length; i++) {\n const item = data[i];\n\n if (item.__isGroupFirst && item.__groupSize > 1) {\n logger.info('🔗 [UniversalExportService] 处理分组合并:', {\n row: currentRow,\n groupSize: item.__groupSize,\n item: item,\n });\n\n // 找到需要合并的分组字段\n groupingConfig.fields.forEach((groupField) => {\n if (groupField.mergeCells) {\n const fieldIndex = fields.findIndex((f) => f.key === groupField.key);\n if (fieldIndex >= 0) {\n // 获取分组大小 - 优先使用字段特定的分组大小\n const groupSize = item[`__${groupField.key}_groupSize`] || item.__groupSize;\n\n // 创建合并区域\n const mergeRange = {\n s: { r: currentRow, c: fieldIndex }, // 开始行列\n e: { r: currentRow + groupSize - 1, c: fieldIndex }, // 结束行列\n };\n\n logger.info('📊 [UniversalExportService] 添加合并区域:', {\n field: groupField.key,\n fieldIndex,\n groupSize,\n mergeRange,\n });\n\n worksheet['!merges']!.push(mergeRange);\n\n // 为合并单元格添加样式\n const startCellAddress = XLSX.utils.encode_cell(mergeRange.s);\n if (worksheet[startCellAddress]) {\n worksheet[startCellAddress].s = {\n ...worksheet[startCellAddress].s,\n alignment: { horizontal: 'center', vertical: 'middle' },\n fill: { fgColor: { rgb: 'F2F2F2' } },\n border: {\n top: { style: 'thin', color: { rgb: '000000' } },\n bottom: { style: 'thin', color: { rgb: '000000' } },\n left: { style: 'thin', color: { rgb: '000000' } },\n right: { style: 'thin', color: { rgb: '000000' } },\n },\n };\n }\n }\n }\n });\n }\n\n currentRow++;\n }\n\n logger.info('✅ [UniversalExportService] Excel分组和合并单元格处理完成:', {\n totalMerges: worksheet['!merges']?.length || 0,\n });\n }\n\n /**\n * 设置Excel列宽和样式\n */\n private setExcelColumnWidths(worksheet: XLSX.WorkSheet, fields: ExportField[]): void {\n const colWidths = fields.map((field) => ({\n wch: field.width || 15, // 默认宽度15字符\n }));\n\n worksheet['!cols'] = colWidths;\n\n // 设置表头样式\n if (worksheet['!ref']) {\n const range = XLSX.utils.decode_range(worksheet['!ref']);\n for (let col = range.s.c; col <= range.e.c; col++) {\n const cellAddress = XLSX.utils.encode_cell({ r: 0, c: col });\n if (worksheet[cellAddress]) {\n // 为表头添加样式\n worksheet[cellAddress].s = {\n font: { bold: true, color: { rgb: 'FFFFFF' } },\n fill: { fgColor: { rgb: '4472C4' } },\n alignment: { horizontal: 'center', vertical: 'center' },\n border: {\n top: { style: 'thin', color: { rgb: '000000' } },\n bottom: { style: 'thin', color: { rgb: '000000' } },\n left: { style: 'thin', color: { rgb: '000000' } },\n right: { style: 'thin', color: { rgb: '000000' } },\n },\n };\n }\n }\n }\n\n logger.info('✅ [UniversalExportService] Excel列宽和样式设置完成:', {\n columnsCount: colWidths.length,\n columnWidths: colWidths.map((col, index) => ({ field: fields[index]?.key, width: col.wch })),\n });\n }\n\n /**\n * 为Excel数据单元格应用样式\n */\n private applyExcelDataStyles(worksheet: XLSX.WorkSheet, includeHeader: boolean = true): void {\n if (!worksheet['!ref']) return;\n\n const range = XLSX.utils.decode_range(worksheet['!ref']);\n const startRow = includeHeader ? 1 : 0; // 跳过表头\n\n logger.info('🎨 [UniversalExportService] 开始应用Excel数据样式:', {\n totalRows: range.e.r + 1,\n totalCols: range.e.c + 1,\n startRow,\n });\n\n // 为数据单元格添加边框和对齐\n for (let row = startRow; row <= range.e.r; row++) {\n for (let col = range.s.c; col <= range.e.c; col++) {\n const cellAddress = XLSX.utils.encode_cell({ r: row, c: col });\n if (worksheet[cellAddress]) {\n // 保留已有样式(如合并单元格的样式)\n const existingStyle = worksheet[cellAddress].s || {};\n\n worksheet[cellAddress].s = {\n ...existingStyle,\n border: {\n top: { style: 'thin', color: { rgb: 'CCCCCC' } },\n bottom: { style: 'thin', color: { rgb: 'CCCCCC' } },\n left: { style: 'thin', color: { rgb: 'CCCCCC' } },\n right: { style: 'thin', color: { rgb: 'CCCCCC' } },\n },\n alignment: {\n ...existingStyle.alignment,\n vertical: 'center',\n },\n };\n }\n }\n }\n\n logger.info('✅ [UniversalExportService] Excel数据样式应用完成');\n }\n}\n","/**\n * UniversalExport Service 工厂函数\n * 提供简化的服务初始化方式\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\n/**\n * 创建导出服务配置(带智能默认值)\n */\nexport function createExportServiceConfig(\n options: Partial<UniversalExportServiceConfig> = {}\n): UniversalExportServiceConfig {\n return {\n db: options.db,\n exportDir: options.exportDir || process.env.EXPORT_DIR || './exports',\n tempDir: options.tempDir || process.env.TEMP_DIR || './temp',\n maxRows: options.maxRows || 100000, // 默认最多导出 10 万行\n enableStreaming: options.enableStreaming !== false, // 默认启用流式导出\n timeout: options.timeout || 300000, // 默认超时 5 分钟\n };\n}\n\n/**\n * 创建导出服务实例(简化版)\n *\n * @example\n * ```typescript\n * // 最简配置\n * const service = createUniversalExportService();\n *\n * // 标准配置\n * const service = createUniversalExportService({\n * db: drizzleDb,\n * exportDir: './exports',\n * maxRows: 50000,\n * });\n * ```\n */\nexport function createUniversalExportService(\n options: Partial<UniversalExportServiceConfig> = {}\n) {\n const config = createExportServiceConfig(options);\n\n // 注意:实际的 UniversalExportService 将在后续 Phase 中迁移\n // 这里先返回一个占位对象,包含基本的类型信息\n console.warn(\n '⚠️ UniversalExportService 的完整实现将在后续 Phase 中迁移到 Sa2kit。\\n' +\n ' 当前版本仅包含类型定义和配置工厂函数。\\n' +\n ' 请暂时继续从 LyricNote 的 lib/universalExport 导入服务类。'\n );\n\n return {\n config,\n // 占位方法\n async export() {\n throw new Error('UniversalExportService 尚未完全迁移,请从 LyricNote 导入');\n },\n async createTask() {\n throw new Error('UniversalExportService 尚未完全迁移,请从 LyricNote 导入');\n },\n };\n}\n\n/**\n * 从环境变量创建配置(便利函数)\n *\n * @example\n * ```typescript\n * // .env\n * // EXPORT_DIR=./exports\n * // EXPORT_MAX_ROWS=50000\n *\n * const service = createExportServiceFromEnv();\n * ```\n */\nexport function createExportServiceFromEnv(db?: any) {\n return createUniversalExportService({\n db,\n exportDir: process.env.EXPORT_DIR,\n tempDir: process.env.TEMP_DIR,\n maxRows: process.env.EXPORT_MAX_ROWS\n ? parseInt(process.env.EXPORT_MAX_ROWS)\n : undefined,\n });\n}\n\n","/**\n * UniversalExport 预设配置\n * 提供常见场景的开箱即用配置\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\n/**\n * 小型应用预设(数据量小)\n */\nexport function createSmallAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 10000, // 1万行\n timeout: 60000, // 1分钟\n enableStreaming: false, // 小数据量不需要流式导出\n };\n}\n\n/**\n * 中型应用预设(默认配置)\n */\nexport function createMediumAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 100000, // 10万行\n timeout: 300000, // 5分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 大型应用预设(数据量大)\n */\nexport function createLargeAppPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 1000000, // 100万行\n timeout: 600000, // 10分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 实时导出预设(快速响应)\n */\nexport function createRealtimeExportPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: 5000, // 5千行\n timeout: 30000, // 30秒\n enableStreaming: false,\n };\n}\n\n/**\n * 批量导出预设(大批量、离线处理)\n */\nexport function createBatchExportPreset(): Partial<UniversalExportServiceConfig> {\n return {\n maxRows: Number.MAX_SAFE_INTEGER, // 不限制\n timeout: 1800000, // 30分钟\n enableStreaming: true,\n };\n}\n\n/**\n * 智能预设:根据环境自动选择\n */\nexport function createSmartExportPreset(): Partial<UniversalExportServiceConfig> {\n const envMaxRows = process.env.EXPORT_MAX_ROWS;\n\n if (envMaxRows) {\n const maxRows = parseInt(envMaxRows);\n\n // 根据配置的最大行数自动选择合适的预设\n if (maxRows <= 10000) {\n return createSmallAppPreset();\n } else if (maxRows <= 100000) {\n return createMediumAppPreset();\n } else {\n return createLargeAppPreset();\n }\n }\n\n // 默认使用中型应用预设\n return createMediumAppPreset();\n}\n\n","/**\n * UniversalExport 配置验证\n */\n\nimport type { UniversalExportServiceConfig } from './types';\n\nexport class ConfigValidationError extends Error {\n constructor(message: string, public field: string) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\n/**\n * 验证导出服务配置\n */\nexport function validateExportConfig(config: UniversalExportServiceConfig): void {\n // 验证导出目录\n if (!config.exportDir) {\n throw new ConfigValidationError('exportDir is required', 'exportDir');\n }\n\n // 验证临时目录\n if (!config.tempDir) {\n throw new ConfigValidationError('tempDir is required', 'tempDir');\n }\n\n // 验证最大行数\n if (config.maxRows && config.maxRows <= 0) {\n throw new ConfigValidationError(\n 'maxRows must be greater than 0',\n 'maxRows'\n );\n }\n\n // 验证超时时间\n if (config.timeout && config.timeout <= 0) {\n throw new ConfigValidationError(\n 'timeout must be greater than 0',\n 'timeout'\n );\n }\n\n // 安全建议\n if (config.maxRows && config.maxRows > 1000000) {\n console.warn(\n `⚠️ Warning: maxRows (${config.maxRows}) is very large. ` +\n `Consider using pagination or streaming for better performance.`\n );\n }\n}\n\n/**\n * 验证环境变量\n */\nexport function validateEnvironment(requiredVars: string[]): void {\n const missing: string[] = [];\n\n for (const varName of requiredVars) {\n if (!process.env[varName]) {\n missing.push(varName);\n }\n }\n\n if (missing.length > 0) {\n throw new ConfigValidationError(\n `Missing required environment variables: ${missing.join(', ')}`,\n 'environment'\n );\n }\n}\n\n","/**\n * UniversalExport Server 工具函数\n */\n\nimport type { ExportField, FieldType } from '../../types';\n\n/**\n * 格式化字段值\n *\n * @param value 原始值\n * @param field 字段定义\n * @returns 格式化后的值\n */\nexport function formatFieldValue(value: any, field: ExportField): string {\n // 如果字段有自定义格式化函数,使用它\n if (field.formatter) {\n return field.formatter(value);\n }\n\n // 空值处理\n if (value === null || value === undefined) {\n return '';\n }\n\n // 根据字段类型进行默认格式化\n switch (field.type) {\n case 'date':\n return value instanceof Date\n ? (value.toISOString().split('T')[0] || '')\n : String(value);\n\n case 'boolean':\n return value ? '是' : '否';\n\n case 'array':\n return Array.isArray(value) ? value.join(', ') : String(value);\n\n case 'object':\n return typeof value === 'object'\n ? JSON.stringify(value)\n : String(value);\n\n case 'number':\n return typeof value === 'number'\n ? value.toLocaleString()\n : String(value);\n\n default:\n return String(value);\n }\n}\n\n/**\n * 验证字段值\n *\n * @param value 字段值\n * @param field 字段定义\n * @returns 是否有效\n */\nexport function validateFieldValue(value: any, field: ExportField): boolean {\n // 必填字段检查\n if (field.required && (value === null || value === undefined || value === '')) {\n return false;\n }\n\n // 类型检查\n switch (field.type) {\n case 'number':\n return typeof value === 'number' || !isNaN(Number(value));\n\n case 'boolean':\n return typeof value === 'boolean';\n\n case 'array':\n return Array.isArray(value);\n\n case 'object':\n return typeof value === 'object';\n\n case 'date':\n return value instanceof Date || !isNaN(Date.parse(value));\n\n default:\n return true;\n }\n}\n\n/**\n * 转换字段类型\n *\n * @param value 原始值\n * @param targetType 目标类型\n * @returns 转换后的值\n */\nexport function convertFieldType(value: any, targetType: FieldType): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n switch (targetType) {\n case 'string':\n return String(value);\n\n case 'number':\n return Number(value);\n\n case 'boolean':\n return Boolean(value);\n\n case 'date':\n return value instanceof Date ? value : new Date(value);\n\n case 'array':\n return Array.isArray(value) ? value : [value];\n\n case 'object':\n return typeof value === 'object' ? value : { value };\n\n default:\n return value;\n }\n}\n\n/**\n * 安全获取嵌套属性值\n *\n * @param obj 对象\n * @param path 属性路径(支持点号分隔)\n * @returns 属性值\n *\n * @example\n * ```typescript\n * const obj = { user: { name: 'John', age: 30 } };\n * getNestedValue(obj, 'user.name') // 'John'\n * getNestedValue(obj, 'user.email') // undefined\n * ```\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n}\n\n/**\n * 转义 CSV 字段值\n *\n * @param value 字段值\n * @returns 转义后的值\n */\nexport function escapeCsvValue(value: string): string {\n // 如果包含逗号、引号或换行符,需要用引号包裹并转义引号\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\n/**\n * 生成唯一的文件名\n *\n * @param prefix 前缀\n * @param extension 扩展名\n * @returns 唯一文件名\n *\n * @example\n * ```typescript\n * generateUniqueFilename('export', 'xlsx')\n * // 'export_20231111_123456_abc123.xlsx'\n * ```\n */\nexport function generateUniqueFilename(prefix: string, extension: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5);\n const random = Math.random().toString(36).substring(2, 8);\n return `${prefix}_${timestamp}_${random}.${extension}`;\n}\n\n/**\n * 计算导出进度百分比\n *\n * @param processed 已处理行数\n * @param total 总行数\n * @returns 百分比(0-100)\n */\nexport function calculateProgress(processed: number, total: number): number {\n if (total === 0) return 0;\n return Math.min(Math.round((processed / total) * 100), 100);\n}\n\n/**\n * 估算剩余时间(秒)\n *\n * @param processed 已处理行数\n * @param total 总行数\n * @param elapsedMs 已用时间(毫秒)\n * @returns 剩余时间(秒)\n */\nexport function estimateRemainingTime(\n processed: number,\n total: number,\n elapsedMs: number\n): number {\n if (processed === 0) return 0;\n const avgTimePerRow = elapsedMs / processed;\n const remainingRows = total - processed;\n return Math.round((remainingRows * avgTimePerRow) / 1000);\n}\n\n","/**\n * 通用导出服务 - PostgreSQL 数据库表结构定义\n *\n * 提供导出配置和历史记录的数据库表结构。\n *\n * 表结构概览:\n * - export_configs: 导出配置表\n * - export_history: 导出历史记录表\n *\n * 设计特点:\n * - 支持多种导出格式(CSV, Excel, JSON)\n * - 灵活的字段配置和分组\n * - 完整的历史记录追踪\n *\n * @fileoverview 数据库表结构 - 通用导出服务 (PostgreSQL)\n * @package sa2kit/universalExport/server\n */\n\nimport { pgTable, text, boolean, jsonb, timestamp, integer } from 'drizzle-orm/pg-core';\nimport { sql, relations } from 'drizzle-orm';\n\n/**\n * 导出配置表 (ExportConfig)\n *\n * 存储导出任务的配置信息,包括字段选择、格式化、分组等。\n */\nexport const exportConfigs = pgTable('ExportConfig', {\n /** 主键ID */\n id: text('id')\n .primaryKey()\n .$defaultFn(() => `export_config_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`),\n\n /** 配置名称 */\n name: text('name').notNull(),\n\n /** 配置描述 */\n description: text('description'),\n\n /** 导出格式:'csv' | 'excel' | 'json' */\n format: text('format').notNull(),\n\n /** 导出字段配置(JSON数组) */\n fields: jsonb('fields').notNull(), // ExportField[]\n\n /** 分组配置 */\n grouping: jsonb('grouping'), // GroupingConfig\n\n /** 文件名模板 */\n fileNameTemplate: text('fileNameTemplate').notNull(),\n\n /** 是否包含表头 */\n includeHeader: boolean('includeHeader').default(true).notNull(),\n\n /** 分隔符(用于CSV格式) */\n delimiter: text('delimiter').default(',').notNull(),\n\n /** 编码格式 */\n encoding: text('encoding').default('utf-8').notNull(),\n\n /** 是否添加BOM(用于Excel打开UTF-8 CSV) */\n addBOM: boolean('addBOM').default(true).notNull(),\n\n /** 最大导出行数 */\n maxRows: integer('maxRows'),\n\n /** 模块ID */\n moduleId: text('moduleId').notNull(),\n\n /** 业务ID */\n businessId: text('businessId'),\n\n /** 创建者ID */\n createdBy: text('createdBy'),\n\n /** 创建时间 */\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n\n /** 更新时间 */\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\n/**\n * 导出历史记录表 (ExportHistory)\n *\n * 记录每次导出任务的执行情况,包括状态、耗时、文件信息等。\n */\nexport const exportHistory = pgTable('ExportHistory', {\n /** 主键ID */\n id: text('id')\n .primaryKey()\n .$defaultFn(() => `export_history_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`),\n\n /** 关联的配置ID */\n configId: text('configId').notNull(),\n\n /** 导出的文件名 */\n fileName: text('fileName').notNull(),\n\n /** 文件大小(字节) */\n fileSize: integer('fileSize').notNull(),\n\n /** 导出的行数 */\n exportedRows: integer('exportedRows').notNull(),\n\n /** 导出状态:'pending' | 'processing' | 'completed' | 'failed' */\n status: text('status').notNull(),\n\n /** 错误信息(如果失败) */\n error: text('error'),\n\n /** 导出耗时(毫秒) */\n duration: integer('duration'),\n\n /** 开始时间 */\n startTime: timestamp('startTime', { precision: 3, mode: 'date' }).notNull(),\n\n /** 结束时间 */\n endTime: timestamp('endTime', { precision: 3, mode: 'date' }),\n\n /** 创建者ID */\n createdBy: text('createdBy'),\n\n /** 创建时间 */\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\n// ========== 关系定义 ==========\n\n/**\n * 导出配置表关系\n * 一个配置可以有多个导出历史记录\n */\nexport const exportConfigsRelations = relations(exportConfigs, ({ many }) => ({\n history: many(exportHistory),\n}));\n\n/**\n * 导出历史表关系\n * 每个历史记录关联一个配置\n */\nexport const exportHistoryRelations = relations(exportHistory, ({ one }) => ({\n config: one(exportConfigs, {\n fields: [exportHistory.configId],\n references: [exportConfigs.id],\n }),\n}));\n\n// ========== 导出类型 ==========\n\nexport type ExportConfig = typeof exportConfigs.$inferSelect;\nexport type NewExportConfig = typeof exportConfigs.$inferInsert;\n\nexport type ExportHistory = typeof exportHistory.$inferSelect;\nexport type NewExportHistory = typeof exportHistory.$inferInsert;\n\n","/**\n * 通用导出服务 - Drizzle 数据库操作层\n *\n * 提供导出配置和历史记录的数据库操作接口。\n * 支持任何 Drizzle 数据库实例。\n *\n * @package sa2kit/universalExport/server\n */\n\nimport { eq, and, desc } from 'drizzle-orm';\nimport type {\n ExportConfig,\n NewExportConfig,\n ExportHistory,\n NewExportHistory,\n} from './drizzle-schemas/postgres';\nimport { exportConfigs, exportHistory } from './drizzle-schemas/postgres';\n\n/**\n * Drizzle 数据库实例类型\n */\nexport type DrizzleDb = any; // 支持任何 Drizzle 数据库实例\n\n/**\n * 导出配置数据库服务工厂选项\n */\nexport interface ExportDatabaseServiceOptions {\n /**\n * Drizzle 数据库实例\n */\n db: DrizzleDb;\n}\n\n/**\n * 导出配置数据库服务\n *\n * 提供导出配置的 CRUD 操作\n */\nexport class ExportConfigDatabaseService {\n constructor(private readonly db: DrizzleDb) {}\n\n /**\n * 创建导出配置\n */\n async createConfig(\n config: Omit<NewExportConfig, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<ExportConfig> {\n const id = `export_config_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const now = new Date();\n\n const [newConfig] = await this.db\n .insert(exportConfigs)\n .values({\n id,\n ...config,\n createdAt: now,\n updatedAt: now,\n })\n .returning();\n\n return newConfig;\n }\n\n /**\n * 根据ID获取配置\n */\n async getConfigById(id: string): Promise<ExportConfig | null> {\n const [config] = await this.db\n .select()\n .from(exportConfigs)\n .where(eq(exportConfigs.id, id))\n .limit(1);\n\n return config || null;\n }\n\n /**\n * 根据模块和业务ID获取配置列表\n */\n async getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]> {\n const whereConditions = businessId\n ? and(eq(exportConfigs.moduleId, moduleId), eq(exportConfigs.businessId, businessId))\n : eq(exportConfigs.moduleId, moduleId);\n\n return await this.db\n .select()\n .from(exportConfigs)\n .where(whereConditions)\n .orderBy(desc(exportConfigs.updatedAt));\n }\n\n /**\n * 更新配置\n */\n async updateConfig(\n id: string,\n updates: Partial<Omit<ExportConfig, 'id' | 'createdAt'>>\n ): Promise<ExportConfig | null> {\n const [updatedConfig] = await this.db\n .update(exportConfigs)\n .set({\n ...updates,\n updatedAt: new Date(),\n })\n .where(eq(exportConfigs.id, id))\n .returning();\n\n return updatedConfig || null;\n }\n\n /**\n * 删除配置\n */\n async deleteConfig(id: string): Promise<boolean> {\n await this.db.delete(exportConfigs).where(eq(exportConfigs.id, id));\n return true;\n }\n\n /**\n * 根据用户ID获取配置列表\n */\n async getConfigsByUser(userId: string): Promise<ExportConfig[]> {\n return await this.db\n .select()\n .from(exportConfigs)\n .where(eq(exportConfigs.createdBy, userId))\n .orderBy(desc(exportConfigs.updatedAt));\n }\n}\n\n/**\n * 导出历史记录数据库服务\n *\n * 提供导出历史记录的 CRUD 操作\n */\nexport class ExportHistoryDatabaseService {\n constructor(private readonly db: DrizzleDb) {}\n\n /**\n * 创建导出历史记录\n */\n async createHistory(history: Omit<NewExportHistory, 'id' | 'createdAt'>): Promise<ExportHistory> {\n const id = `export_history_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n const [newHistory] = await this.db\n .insert(exportHistory)\n .values({\n id,\n ...history,\n createdAt: new Date(),\n })\n .returning();\n\n return newHistory;\n }\n\n /**\n * 根据配置ID获取历史记录\n */\n async getHistoryByConfigId(configId: string): Promise<ExportHistory[]> {\n return await this.db\n .select()\n .from(exportHistory)\n .where(eq(exportHistory.configId, configId))\n .orderBy(desc(exportHistory.createdAt));\n }\n\n /**\n * 根据用户ID获取历史记录\n */\n async getHistoryByUser(userId: string): Promise<ExportHistory[]> {\n return await this.db\n .select()\n .from(exportHistory)\n .where(eq(exportHistory.createdBy, userId))\n .orderBy(desc(exportHistory.createdAt));\n }\n\n /**\n * 获取最近的导出历史记录\n */\n async getRecentHistory(limit: number = 10): Promise<ExportHistory[]> {\n return await this.db\n .select()\n .from(exportHistory)\n .orderBy(desc(exportHistory.createdAt))\n .limit(limit);\n }\n}\n\n/**\n * 创建导出数据库服务实例\n *\n * @param options - 数据库服务选项\n * @returns 导出配置和历史记录服务实例\n *\n * @example\n * ```typescript\n * import { createExportDatabaseServices } from 'sa2kit/universalExport/server';\n * import { db } from './db';\n *\n * const { configDB, historyDB } = createExportDatabaseServices({ db });\n *\n * // 使用服务\n * const config = await configDB.createConfig({ ... });\n * const history = await historyDB.createHistory({ ... });\n * ```\n */\nexport function createExportDatabaseServices(options: ExportDatabaseServiceOptions) {\n const { db } = options;\n\n return {\n configDB: new ExportConfigDatabaseService(db),\n historyDB: new ExportHistoryDatabaseService(db),\n };\n}\n\n"]}
@@ -1,5 +1,7 @@
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';
1
+ import { U as UploadFileInfo, a as UploadProgress, F as FileMetadata, b as FileQueryOptions, P as PaginatedResult, B as BatchOperationResult, c as UniversalFileService, d as ProcessingOptions } from '../UniversalFileService-CEZRJ87g.mjs';
2
+ export { A as AccessPermission, l as AudioProcessingOptions, C as CDNProviderError, i as CDNType, o as FileEvent, p as FileEventListener, n as FileEventType, g as FileProcessingError, e as FileServiceError, f as FileUploadError, I as ImageProcessingOptions, j as ProcessorType, S as StorageProviderError, h as StorageType, m as UploadResult, k as UploadStatus, V as VideoProcessingOptions } from '../UniversalFileService-CEZRJ87g.mjs';
3
+ import React__default from 'react';
4
+ import 'events';
3
5
 
4
6
  /**
5
7
  * 通用文件服务客户端SDK
@@ -307,4 +309,53 @@ declare function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer>;
307
309
  */
308
310
  declare function readFileAsText(file: File, encoding?: string): Promise<string>;
309
311
 
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 };
312
+ /**
313
+ * 通用文件上传组件
314
+ * Universal File Uploader Component
315
+ *
316
+ * 支持拖拽上传、进度显示、多文件上传等功能
317
+ * 使用 Tailwind CSS 样式,支持暗色模式
318
+ */
319
+
320
+ interface FileUploaderProps {
321
+ /** 文件服务实例 */
322
+ fileService: UniversalFileService;
323
+ /** 模块标识 */
324
+ moduleId: string;
325
+ /** 业务标识 */
326
+ businessId?: string;
327
+ /** 允许的文件类型 */
328
+ acceptedTypes?: string[];
329
+ /** 最大文件大小(MB) */
330
+ maxFileSize?: number;
331
+ /** 最大文件数量 */
332
+ maxFiles?: number;
333
+ /** 是否支持多文件上传 */
334
+ multiple?: boolean;
335
+ /** 是否启用文件处理 */
336
+ enableProcessing?: boolean;
337
+ /** 默认处理选项 */
338
+ defaultProcessingOptions?: ProcessingOptions;
339
+ /** 上传成功回调 */
340
+ onUploadSuccess?: (files: FileMetadata[]) => void;
341
+ /** 上传失败回调 */
342
+ onUploadError?: (error: string) => void;
343
+ /** 上传进度回调 */
344
+ onProgress?: (progress: UploadProgress[]) => void;
345
+ /** 自定义样式类名 */
346
+ className?: string;
347
+ /** 是否禁用 */
348
+ disabled?: boolean;
349
+ /** 显示模式 */
350
+ mode?: 'compact' | 'normal' | 'detailed';
351
+ }
352
+ interface UploadingFile {
353
+ id: string;
354
+ file: File;
355
+ progress: UploadProgress;
356
+ metadata?: FileMetadata;
357
+ error?: string;
358
+ }
359
+ declare const FileUploader: React__default.FC<FileUploaderProps>;
360
+
361
+ 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, FileUploader as DefaultFileUploader, ERROR_CODES, FileMetadata, FileQueryOptions, FileUploader, type FileUploaderProps, IMAGE_EXTENSIONS, IMAGE_MIME_TYPES, PaginatedResult, ProcessingOptions, UNIVERSAL_FILE_NAME, UNIVERSAL_FILE_VERSION, UniversalFileClient, type UniversalFileClientConfig, UploadFileInfo, UploadProgress, type UploadingFile, 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 };
@@ -1,5 +1,7 @@
1
- import { U as UploadFileInfo, a as UploadProgress, F as FileMetadata, b as FileQueryOptions, P as PaginatedResult, B as BatchOperationResult } from '../types-CoGG1rNV.js';
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.js';
1
+ import { U as UploadFileInfo, a as UploadProgress, F as FileMetadata, b as FileQueryOptions, P as PaginatedResult, B as BatchOperationResult, c as UniversalFileService, d as ProcessingOptions } from '../UniversalFileService-CEZRJ87g.js';
2
+ export { A as AccessPermission, l as AudioProcessingOptions, C as CDNProviderError, i as CDNType, o as FileEvent, p as FileEventListener, n as FileEventType, g as FileProcessingError, e as FileServiceError, f as FileUploadError, I as ImageProcessingOptions, j as ProcessorType, S as StorageProviderError, h as StorageType, m as UploadResult, k as UploadStatus, V as VideoProcessingOptions } from '../UniversalFileService-CEZRJ87g.js';
3
+ import React__default from 'react';
4
+ import 'events';
3
5
 
4
6
  /**
5
7
  * 通用文件服务客户端SDK
@@ -307,4 +309,53 @@ declare function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer>;
307
309
  */
308
310
  declare function readFileAsText(file: File, encoding?: string): Promise<string>;
309
311
 
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 };
312
+ /**
313
+ * 通用文件上传组件
314
+ * Universal File Uploader Component
315
+ *
316
+ * 支持拖拽上传、进度显示、多文件上传等功能
317
+ * 使用 Tailwind CSS 样式,支持暗色模式
318
+ */
319
+
320
+ interface FileUploaderProps {
321
+ /** 文件服务实例 */
322
+ fileService: UniversalFileService;
323
+ /** 模块标识 */
324
+ moduleId: string;
325
+ /** 业务标识 */
326
+ businessId?: string;
327
+ /** 允许的文件类型 */
328
+ acceptedTypes?: string[];
329
+ /** 最大文件大小(MB) */
330
+ maxFileSize?: number;
331
+ /** 最大文件数量 */
332
+ maxFiles?: number;
333
+ /** 是否支持多文件上传 */
334
+ multiple?: boolean;
335
+ /** 是否启用文件处理 */
336
+ enableProcessing?: boolean;
337
+ /** 默认处理选项 */
338
+ defaultProcessingOptions?: ProcessingOptions;
339
+ /** 上传成功回调 */
340
+ onUploadSuccess?: (files: FileMetadata[]) => void;
341
+ /** 上传失败回调 */
342
+ onUploadError?: (error: string) => void;
343
+ /** 上传进度回调 */
344
+ onProgress?: (progress: UploadProgress[]) => void;
345
+ /** 自定义样式类名 */
346
+ className?: string;
347
+ /** 是否禁用 */
348
+ disabled?: boolean;
349
+ /** 显示模式 */
350
+ mode?: 'compact' | 'normal' | 'detailed';
351
+ }
352
+ interface UploadingFile {
353
+ id: string;
354
+ file: File;
355
+ progress: UploadProgress;
356
+ metadata?: FileMetadata;
357
+ error?: string;
358
+ }
359
+ declare const FileUploader: React__default.FC<FileUploaderProps>;
360
+
361
+ 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, FileUploader as DefaultFileUploader, ERROR_CODES, FileMetadata, FileQueryOptions, FileUploader, type FileUploaderProps, IMAGE_EXTENSIONS, IMAGE_MIME_TYPES, PaginatedResult, ProcessingOptions, UNIVERSAL_FILE_NAME, UNIVERSAL_FILE_VERSION, UniversalFileClient, type UniversalFileClientConfig, UploadFileInfo, UploadProgress, type UploadingFile, 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 };