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
@@ -0,0 +1,31 @@
1
+ // src/universalExport/types.ts
2
+ var ExportServiceError = class extends Error {
3
+ constructor(message, code, details) {
4
+ super(message);
5
+ this.code = code;
6
+ this.details = details;
7
+ this.name = "ExportServiceError";
8
+ }
9
+ };
10
+ var ExportConfigError = class extends ExportServiceError {
11
+ constructor(message, details) {
12
+ super(message, "EXPORT_CONFIG_ERROR", details);
13
+ this.name = "ExportConfigError";
14
+ }
15
+ };
16
+ var ExportDataError = class extends ExportServiceError {
17
+ constructor(message, details) {
18
+ super(message, "EXPORT_DATA_ERROR", details);
19
+ this.name = "ExportDataError";
20
+ }
21
+ };
22
+ var ExportFileError = class extends ExportServiceError {
23
+ constructor(message, details) {
24
+ super(message, "EXPORT_FILE_ERROR", details);
25
+ this.name = "ExportFileError";
26
+ }
27
+ };
28
+
29
+ export { ExportConfigError, ExportDataError, ExportFileError, ExportServiceError };
30
+ //# sourceMappingURL=chunk-7XLFSPDG.mjs.map
31
+ //# sourceMappingURL=chunk-7XLFSPDG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/universalExport/types.ts"],"names":[],"mappings":";AAuRO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CACE,OAAA,EACgB,IAAA,EACA,OAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAGO,IAAM,iBAAA,GAAN,cAAgC,kBAAA,CAAmB;AAAA,EACxD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,uBAAuB,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,kBAAA,CAAmB;AAAA,EACtD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,qBAAqB,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,kBAAA,CAAmB;AAAA,EACtD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,qBAAqB,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF","file":"chunk-7XLFSPDG.mjs","sourcesContent":["/**\n * 通用导出服务类型定义\n *\n * 定义了导出功能的核心接口和类型\n */\n\n// ============= 基础类型定义 =============\n\n/** 导出格式类型 */\nexport type ExportFormat = 'csv' | 'excel' | 'json';\n\n/** 字段类型 */\nexport type FieldType = 'string' | 'number' | 'date' | 'boolean' | 'array' | 'object';\n\n/** 字段对齐方式 */\nexport type FieldAlignment = 'left' | 'center' | 'right';\n\n/** 导出状态 */\nexport type ExportStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';\n\n/** 分组模式 */\nexport type GroupingMode = 'merge' | 'separate' | 'nested';\n\n/** 分组处理类型 */\nexport type GroupValueProcessing = 'first' | 'last' | 'concat' | 'sum' | 'count' | 'custom';\n\n// ============= 字段定义接口 =============\n\n/** 导出字段定义 */\nexport interface ExportField {\n /** 字段键名 */\n key: string;\n /** 字段显示名称 */\n label: string;\n /** 字段类型 */\n type: FieldType;\n /** 是否启用 */\n enabled: boolean;\n /** 字段宽度 */\n width?: number;\n /** 对齐方式 */\n alignment?: FieldAlignment;\n /** 格式化函数 */\n formatter?: (value: any) => string;\n /** 排序权重 */\n sortOrder?: number;\n /** 是否必填 */\n required?: boolean;\n /** 字段描述 */\n description?: string;\n /** 自定义样式 */\n style?: Record<string, any>;\n}\n\n/** 分组字段配置 */\nexport interface GroupingField {\n /** 分组字段键名 */\n key: string;\n /** 分组字段显示名称 */\n label: string;\n /** 分组模式 */\n mode: GroupingMode;\n /** 其他字段的值处理方式 */\n valueProcessing: GroupValueProcessing;\n /** 自定义处理函数 */\n customProcessor?: (values: any[]) => any;\n /** 是否显示分组行 */\n showGroupHeader: boolean;\n /** 分组行模板 */\n groupHeaderTemplate?: string;\n /** 是否合并单元格(仅Excel格式支持) */\n mergeCells: boolean;\n}\n\n/** 分组配置 */\nexport interface GroupingConfig {\n /** 是否启用分组 */\n enabled: boolean;\n /** 分组字段列表(支持多级分组) */\n fields: GroupingField[];\n /** 分组后是否保持原始顺序 */\n preserveOrder: boolean;\n /** 空值处理方式 */\n nullValueHandling: 'skip' | 'group' | 'separate';\n /** 空值分组名称 */\n nullGroupName?: string;\n}\n\n/** 导出配置 */\nexport interface ExportConfig {\n /** 配置ID */\n id: string;\n /** 配置名称 */\n name: string;\n /** 配置描述 */\n description?: string;\n /** 导出格式 */\n format: ExportFormat;\n /** 字段定义 */\n fields: ExportField[];\n /** 分组配置 */\n grouping?: GroupingConfig;\n /** 文件名模板 */\n fileNameTemplate: string;\n /** 是否包含表头 */\n includeHeader: boolean;\n /** 分隔符 */\n delimiter: string;\n /** 编码格式 */\n encoding: string;\n /** 是否添加BOM */\n addBOM: boolean;\n /** 最大行数限制 */\n maxRows?: number;\n /** 创建时间 */\n createdAt: Date;\n /** 更新时间 */\n updatedAt: Date;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 创建者ID */\n createdBy?: string;\n}\n\n/** 导出请求 */\nexport interface ExportRequest {\n /** 导出配置ID或配置对象 */\n configId: string | ExportConfig;\n /** 数据源 */\n dataSource: string | (() => Promise<any[]>);\n /** 查询参数 */\n queryParams?: Record<string, any>;\n /** 自定义字段映射 */\n fieldMapping?: Record<string, string>;\n /** 过滤条件 */\n filters?: ExportFilter[];\n /** 排序条件 */\n sortBy?: ExportSort[];\n /** 分页参数 */\n pagination?: {\n page: number;\n pageSize: number;\n };\n /** 自定义文件名 */\n customFileName?: string;\n /** 回调函数 */\n callbacks?: {\n onProgress?: (progress: ExportProgress) => void;\n onSuccess?: (result: ExportResult) => void;\n onError?: (error: ExportError) => void;\n };\n}\n\n/** 导出过滤器 */\nexport interface ExportFilter {\n /** 字段名 */\n field: string;\n /** 操作符 */\n operator:\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'contains'\n | 'startsWith'\n | 'endsWith'\n | 'in'\n | 'notIn';\n /** 值 */\n value: any;\n}\n\n/** 导出排序 */\nexport interface ExportSort {\n /** 字段名 */\n field: string;\n /** 排序方向 */\n direction: 'asc' | 'desc';\n}\n\n/** 导出进度 */\nexport interface ExportProgress {\n /** 导出ID */\n exportId: string;\n /** 状态 */\n status: ExportStatus;\n /** 进度百分比 */\n progress: number;\n /** 已处理行数 */\n processedRows: number;\n /** 总行数 */\n totalRows: number;\n /** 开始时间 */\n startTime: Date;\n /** 预计完成时间 */\n estimatedEndTime?: Date;\n /** 当前处理的数据 */\n currentData?: any;\n /** 错误信息 */\n error?: string;\n}\n\n/** 导出结果 */\nexport interface ExportResult {\n /** 导出ID */\n exportId: string;\n /** 文件名 */\n fileName: string;\n /** 文件大小 */\n fileSize: number;\n /** 文件URL */\n fileUrl?: string;\n /** 文件Blob */\n fileBlob?: Blob;\n /** 导出行数 */\n exportedRows: number;\n /** 开始时间 */\n startTime: Date;\n /** 完成时间 */\n endTime: Date;\n /** 耗时(毫秒) */\n duration: number;\n /** 统计信息 */\n statistics?: {\n totalRows: number;\n filteredRows: number;\n exportedRows: number;\n skippedRows: number;\n };\n}\n\n/** 导出错误 */\nexport interface ExportError {\n /** 错误代码 */\n code: string;\n /** 错误消息 */\n message: string;\n /** 错误详情 */\n details?: Record<string, any>;\n /** 错误时间 */\n timestamp: Date;\n}\n\n// ============= 服务配置接口 =============\n\n/** 通用导出服务配置 */\nexport interface UniversalExportServiceConfig {\n /** 默认导出格式 */\n defaultFormat: ExportFormat;\n /** 默认分隔符 */\n defaultDelimiter: string;\n /** 默认编码 */\n defaultEncoding: string;\n /** 是否默认添加BOM */\n defaultAddBOM: boolean;\n /** 最大文件大小限制(字节) */\n maxFileSize: number;\n /** 最大行数限制 */\n maxRowsLimit: number;\n /** 并发导出数量限制 */\n maxConcurrentExports: number;\n /** 导出超时时间(毫秒) */\n exportTimeout: number;\n /** 缓存配置 */\n cache: {\n /** 配置缓存TTL(秒) */\n configTTL: number;\n /** 结果缓存TTL(秒) */\n resultTTL: number;\n };\n}\n\n// ============= 异常类定义 =============\n\n/** 导出服务基础异常 */\nexport class ExportServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'ExportServiceError';\n }\n}\n\n/** 导出配置错误 */\nexport class ExportConfigError extends ExportServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'EXPORT_CONFIG_ERROR', details);\n this.name = 'ExportConfigError';\n }\n}\n\n/** 导出数据处理错误 */\nexport class ExportDataError extends ExportServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'EXPORT_DATA_ERROR', details);\n this.name = 'ExportDataError';\n }\n}\n\n/** 导出文件生成错误 */\nexport class ExportFileError extends ExportServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'EXPORT_FILE_ERROR', details);\n this.name = 'ExportFileError';\n }\n}\n\n// ============= 事件类型定义 =============\n\n/** 导出事件类型 */\nexport type ExportEventType =\n | 'export:start'\n | 'export:progress'\n | 'export:complete'\n | 'export:error'\n | 'export:cancel'\n | 'config:save'\n | 'config:delete';\n\n/** 导出事件 */\nexport interface ExportEvent {\n /** 事件类型 */\n type: ExportEventType;\n /** 导出ID */\n exportId: string;\n /** 事件时间 */\n timestamp: Date;\n /** 事件数据 */\n data?: Record<string, any>;\n /** 错误信息 */\n error?: string;\n}\n\n/** 导出事件监听器 */\nexport type ExportEventListener = (event: ExportEvent) => void | Promise<void>;\n\n// ============= 工具类型 =============\n\n/** 字段映射函数 */\nexport type FieldMapper<T = any> = (item: T, index: number) => Record<string, any>;\n\n/** 数据转换函数 */\nexport type DataTransformer<T = any, R = any> = (data: T[]) => R[];\n\n/** 验证函数 */\nexport type Validator<T = any> = (data: T) => boolean | string;\n\n/** 格式化函数 */\nexport type Formatter<T = any> = (value: T) => string;\n"]}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ // src/universalExport/types.ts
4
+ var ExportServiceError = class extends Error {
5
+ constructor(message, code, details) {
6
+ super(message);
7
+ this.code = code;
8
+ this.details = details;
9
+ this.name = "ExportServiceError";
10
+ }
11
+ };
12
+ var ExportConfigError = class extends ExportServiceError {
13
+ constructor(message, details) {
14
+ super(message, "EXPORT_CONFIG_ERROR", details);
15
+ this.name = "ExportConfigError";
16
+ }
17
+ };
18
+ var ExportDataError = class extends ExportServiceError {
19
+ constructor(message, details) {
20
+ super(message, "EXPORT_DATA_ERROR", details);
21
+ this.name = "ExportDataError";
22
+ }
23
+ };
24
+ var ExportFileError = class extends ExportServiceError {
25
+ constructor(message, details) {
26
+ super(message, "EXPORT_FILE_ERROR", details);
27
+ this.name = "ExportFileError";
28
+ }
29
+ };
30
+
31
+ exports.ExportConfigError = ExportConfigError;
32
+ exports.ExportDataError = ExportDataError;
33
+ exports.ExportFileError = ExportFileError;
34
+ exports.ExportServiceError = ExportServiceError;
35
+ //# sourceMappingURL=chunk-GCVOKQZP.js.map
36
+ //# sourceMappingURL=chunk-GCVOKQZP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/universalExport/types.ts"],"names":[],"mappings":";;;AAuRO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CACE,OAAA,EACgB,IAAA,EACA,OAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAGO,IAAM,iBAAA,GAAN,cAAgC,kBAAA,CAAmB;AAAA,EACxD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,uBAAuB,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,kBAAA,CAAmB;AAAA,EACtD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,qBAAqB,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,kBAAA,CAAmB;AAAA,EACtD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAA,EAAS,qBAAqB,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF","file":"chunk-GCVOKQZP.js","sourcesContent":["/**\n * 通用导出服务类型定义\n *\n * 定义了导出功能的核心接口和类型\n */\n\n// ============= 基础类型定义 =============\n\n/** 导出格式类型 */\nexport type ExportFormat = 'csv' | 'excel' | 'json';\n\n/** 字段类型 */\nexport type FieldType = 'string' | 'number' | 'date' | 'boolean' | 'array' | 'object';\n\n/** 字段对齐方式 */\nexport type FieldAlignment = 'left' | 'center' | 'right';\n\n/** 导出状态 */\nexport type ExportStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';\n\n/** 分组模式 */\nexport type GroupingMode = 'merge' | 'separate' | 'nested';\n\n/** 分组处理类型 */\nexport type GroupValueProcessing = 'first' | 'last' | 'concat' | 'sum' | 'count' | 'custom';\n\n// ============= 字段定义接口 =============\n\n/** 导出字段定义 */\nexport interface ExportField {\n /** 字段键名 */\n key: string;\n /** 字段显示名称 */\n label: string;\n /** 字段类型 */\n type: FieldType;\n /** 是否启用 */\n enabled: boolean;\n /** 字段宽度 */\n width?: number;\n /** 对齐方式 */\n alignment?: FieldAlignment;\n /** 格式化函数 */\n formatter?: (value: any) => string;\n /** 排序权重 */\n sortOrder?: number;\n /** 是否必填 */\n required?: boolean;\n /** 字段描述 */\n description?: string;\n /** 自定义样式 */\n style?: Record<string, any>;\n}\n\n/** 分组字段配置 */\nexport interface GroupingField {\n /** 分组字段键名 */\n key: string;\n /** 分组字段显示名称 */\n label: string;\n /** 分组模式 */\n mode: GroupingMode;\n /** 其他字段的值处理方式 */\n valueProcessing: GroupValueProcessing;\n /** 自定义处理函数 */\n customProcessor?: (values: any[]) => any;\n /** 是否显示分组行 */\n showGroupHeader: boolean;\n /** 分组行模板 */\n groupHeaderTemplate?: string;\n /** 是否合并单元格(仅Excel格式支持) */\n mergeCells: boolean;\n}\n\n/** 分组配置 */\nexport interface GroupingConfig {\n /** 是否启用分组 */\n enabled: boolean;\n /** 分组字段列表(支持多级分组) */\n fields: GroupingField[];\n /** 分组后是否保持原始顺序 */\n preserveOrder: boolean;\n /** 空值处理方式 */\n nullValueHandling: 'skip' | 'group' | 'separate';\n /** 空值分组名称 */\n nullGroupName?: string;\n}\n\n/** 导出配置 */\nexport interface ExportConfig {\n /** 配置ID */\n id: string;\n /** 配置名称 */\n name: string;\n /** 配置描述 */\n description?: string;\n /** 导出格式 */\n format: ExportFormat;\n /** 字段定义 */\n fields: ExportField[];\n /** 分组配置 */\n grouping?: GroupingConfig;\n /** 文件名模板 */\n fileNameTemplate: string;\n /** 是否包含表头 */\n includeHeader: boolean;\n /** 分隔符 */\n delimiter: string;\n /** 编码格式 */\n encoding: string;\n /** 是否添加BOM */\n addBOM: boolean;\n /** 最大行数限制 */\n maxRows?: number;\n /** 创建时间 */\n createdAt: Date;\n /** 更新时间 */\n updatedAt: Date;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 创建者ID */\n createdBy?: string;\n}\n\n/** 导出请求 */\nexport interface ExportRequest {\n /** 导出配置ID或配置对象 */\n configId: string | ExportConfig;\n /** 数据源 */\n dataSource: string | (() => Promise<any[]>);\n /** 查询参数 */\n queryParams?: Record<string, any>;\n /** 自定义字段映射 */\n fieldMapping?: Record<string, string>;\n /** 过滤条件 */\n filters?: ExportFilter[];\n /** 排序条件 */\n sortBy?: ExportSort[];\n /** 分页参数 */\n pagination?: {\n page: number;\n pageSize: number;\n };\n /** 自定义文件名 */\n customFileName?: string;\n /** 回调函数 */\n callbacks?: {\n onProgress?: (progress: ExportProgress) => void;\n onSuccess?: (result: ExportResult) => void;\n onError?: (error: ExportError) => void;\n };\n}\n\n/** 导出过滤器 */\nexport interface ExportFilter {\n /** 字段名 */\n field: string;\n /** 操作符 */\n operator:\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'contains'\n | 'startsWith'\n | 'endsWith'\n | 'in'\n | 'notIn';\n /** 值 */\n value: any;\n}\n\n/** 导出排序 */\nexport interface ExportSort {\n /** 字段名 */\n field: string;\n /** 排序方向 */\n direction: 'asc' | 'desc';\n}\n\n/** 导出进度 */\nexport interface ExportProgress {\n /** 导出ID */\n exportId: string;\n /** 状态 */\n status: ExportStatus;\n /** 进度百分比 */\n progress: number;\n /** 已处理行数 */\n processedRows: number;\n /** 总行数 */\n totalRows: number;\n /** 开始时间 */\n startTime: Date;\n /** 预计完成时间 */\n estimatedEndTime?: Date;\n /** 当前处理的数据 */\n currentData?: any;\n /** 错误信息 */\n error?: string;\n}\n\n/** 导出结果 */\nexport interface ExportResult {\n /** 导出ID */\n exportId: string;\n /** 文件名 */\n fileName: string;\n /** 文件大小 */\n fileSize: number;\n /** 文件URL */\n fileUrl?: string;\n /** 文件Blob */\n fileBlob?: Blob;\n /** 导出行数 */\n exportedRows: number;\n /** 开始时间 */\n startTime: Date;\n /** 完成时间 */\n endTime: Date;\n /** 耗时(毫秒) */\n duration: number;\n /** 统计信息 */\n statistics?: {\n totalRows: number;\n filteredRows: number;\n exportedRows: number;\n skippedRows: number;\n };\n}\n\n/** 导出错误 */\nexport interface ExportError {\n /** 错误代码 */\n code: string;\n /** 错误消息 */\n message: string;\n /** 错误详情 */\n details?: Record<string, any>;\n /** 错误时间 */\n timestamp: Date;\n}\n\n// ============= 服务配置接口 =============\n\n/** 通用导出服务配置 */\nexport interface UniversalExportServiceConfig {\n /** 默认导出格式 */\n defaultFormat: ExportFormat;\n /** 默认分隔符 */\n defaultDelimiter: string;\n /** 默认编码 */\n defaultEncoding: string;\n /** 是否默认添加BOM */\n defaultAddBOM: boolean;\n /** 最大文件大小限制(字节) */\n maxFileSize: number;\n /** 最大行数限制 */\n maxRowsLimit: number;\n /** 并发导出数量限制 */\n maxConcurrentExports: number;\n /** 导出超时时间(毫秒) */\n exportTimeout: number;\n /** 缓存配置 */\n cache: {\n /** 配置缓存TTL(秒) */\n configTTL: number;\n /** 结果缓存TTL(秒) */\n resultTTL: number;\n };\n}\n\n// ============= 异常类定义 =============\n\n/** 导出服务基础异常 */\nexport class ExportServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'ExportServiceError';\n }\n}\n\n/** 导出配置错误 */\nexport class ExportConfigError extends ExportServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'EXPORT_CONFIG_ERROR', details);\n this.name = 'ExportConfigError';\n }\n}\n\n/** 导出数据处理错误 */\nexport class ExportDataError extends ExportServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'EXPORT_DATA_ERROR', details);\n this.name = 'ExportDataError';\n }\n}\n\n/** 导出文件生成错误 */\nexport class ExportFileError extends ExportServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'EXPORT_FILE_ERROR', details);\n this.name = 'ExportFileError';\n }\n}\n\n// ============= 事件类型定义 =============\n\n/** 导出事件类型 */\nexport type ExportEventType =\n | 'export:start'\n | 'export:progress'\n | 'export:complete'\n | 'export:error'\n | 'export:cancel'\n | 'config:save'\n | 'config:delete';\n\n/** 导出事件 */\nexport interface ExportEvent {\n /** 事件类型 */\n type: ExportEventType;\n /** 导出ID */\n exportId: string;\n /** 事件时间 */\n timestamp: Date;\n /** 事件数据 */\n data?: Record<string, any>;\n /** 错误信息 */\n error?: string;\n}\n\n/** 导出事件监听器 */\nexport type ExportEventListener = (event: ExportEvent) => void | Promise<void>;\n\n// ============= 工具类型 =============\n\n/** 字段映射函数 */\nexport type FieldMapper<T = any> = (item: T, index: number) => Record<string, any>;\n\n/** 数据转换函数 */\nexport type DataTransformer<T = any, R = any> = (data: T[]) => R[];\n\n/** 验证函数 */\nexport type Validator<T = any> = (data: T) => boolean | string;\n\n/** 格式化函数 */\nexport type Formatter<T = any> = (value: T) => string;\n"]}
@@ -0,0 +1,560 @@
1
+ import { getTokenFromRequest } from './chunk-U2L6V7KD.mjs';
2
+
3
+ // src/auth/routes/login.ts
4
+ function addCorsHeaders(response, config, request) {
5
+ if (!config.cors?.enabled) return response;
6
+ const origin = request.headers.get("origin");
7
+ const allowedOrigins = config.cors.origin;
8
+ if (allowedOrigins) {
9
+ if (typeof allowedOrigins === "string") {
10
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
11
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
12
+ response.headers.set("Access-Control-Allow-Origin", origin);
13
+ }
14
+ } else {
15
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
16
+ }
17
+ if (config.cors.credentials) {
18
+ response.headers.set("Access-Control-Allow-Credentials", "true");
19
+ }
20
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
21
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
22
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
23
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
24
+ return response;
25
+ }
26
+ function createLoginHandler(config) {
27
+ return async (request) => {
28
+ let requestBody = {};
29
+ try {
30
+ requestBody = await request.json();
31
+ const { email, password } = requestBody;
32
+ if (!email || !password) {
33
+ const response2 = new Response(
34
+ JSON.stringify({
35
+ success: false,
36
+ error: "\u90AE\u7BB1\u548C\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A"
37
+ }),
38
+ {
39
+ status: 400,
40
+ headers: { "Content-Type": "application/json" }
41
+ }
42
+ );
43
+ return addCorsHeaders(response2, config, request);
44
+ }
45
+ const result = await config.authService.signIn(email, password);
46
+ if (config.analytics) {
47
+ try {
48
+ await config.analytics.track("user_login_success", {
49
+ userId: result.user.id,
50
+ userRole: result.user.role,
51
+ email: result.user.email,
52
+ loginMethod: "email_password",
53
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
54
+ });
55
+ } catch (analyticsError) {
56
+ console.error("Failed to track login analytics:", analyticsError);
57
+ }
58
+ }
59
+ const response = new Response(
60
+ JSON.stringify({
61
+ success: true,
62
+ data: {
63
+ user: result.user,
64
+ token: result.token
65
+ },
66
+ message: "\u767B\u5F55\u6210\u529F"
67
+ }),
68
+ {
69
+ status: 200,
70
+ headers: { "Content-Type": "application/json" }
71
+ }
72
+ );
73
+ if (config.cookieOptions) {
74
+ const cookieOptions = {
75
+ name: config.cookieOptions?.name || "auth_token",
76
+ httpOnly: config.cookieOptions?.httpOnly !== false,
77
+ secure: config.cookieOptions?.secure !== false && process.env.NODE_ENV === "production",
78
+ sameSite: config.cookieOptions?.sameSite || "lax",
79
+ maxAge: config.cookieOptions?.maxAge || 60 * 60 * 24 * 7,
80
+ // 7天
81
+ path: config.cookieOptions?.path || "/"
82
+ };
83
+ const cookieValue = `${cookieOptions.name}=${result.token}; HttpOnly=${cookieOptions.httpOnly}; Secure=${cookieOptions.secure}; SameSite=${cookieOptions.sameSite}; Max-Age=${cookieOptions.maxAge}; Path=${cookieOptions.path}`;
84
+ response.headers.set("Set-Cookie", cookieValue);
85
+ }
86
+ return addCorsHeaders(response, config, request);
87
+ } catch (error) {
88
+ console.error("Login error:", error);
89
+ if (config.analytics) {
90
+ try {
91
+ await config.analytics.track("user_login_failed", {
92
+ errorMessage: error.message || "\u767B\u5F55\u5931\u8D25",
93
+ email: requestBody.email,
94
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
95
+ });
96
+ } catch (analyticsError) {
97
+ console.error("Failed to track login failure analytics:", analyticsError);
98
+ }
99
+ }
100
+ const response = new Response(
101
+ JSON.stringify({
102
+ success: false,
103
+ error: error.message || "\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u90AE\u7BB1\u548C\u5BC6\u7801"
104
+ }),
105
+ {
106
+ status: 401,
107
+ headers: { "Content-Type": "application/json" }
108
+ }
109
+ );
110
+ return addCorsHeaders(response, config, request);
111
+ }
112
+ };
113
+ }
114
+ function createLoginOptionsHandler(config) {
115
+ return async (request) => {
116
+ const response = new Response(null, {
117
+ status: 204,
118
+ headers: {
119
+ "Content-Length": "0"
120
+ }
121
+ });
122
+ return addCorsHeaders(response, config, request);
123
+ };
124
+ }
125
+
126
+ // src/auth/routes/register.ts
127
+ function addCorsHeaders2(response, config, request) {
128
+ if (!config.cors?.enabled) return response;
129
+ const origin = request.headers.get("origin");
130
+ const allowedOrigins = config.cors.origin;
131
+ if (allowedOrigins) {
132
+ if (typeof allowedOrigins === "string") {
133
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
134
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
135
+ response.headers.set("Access-Control-Allow-Origin", origin);
136
+ }
137
+ } else {
138
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
139
+ }
140
+ if (config.cors.credentials) {
141
+ response.headers.set("Access-Control-Allow-Credentials", "true");
142
+ }
143
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
144
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
145
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
146
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
147
+ return response;
148
+ }
149
+ function createRegisterHandler(config) {
150
+ return async (request) => {
151
+ try {
152
+ const { email, password, username } = await request.json();
153
+ if (!email || !password) {
154
+ const response2 = new Response(
155
+ JSON.stringify({
156
+ success: false,
157
+ error: "\u90AE\u7BB1\u548C\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A"
158
+ }),
159
+ {
160
+ status: 400,
161
+ headers: { "Content-Type": "application/json" }
162
+ }
163
+ );
164
+ return addCorsHeaders2(response2, config, request);
165
+ }
166
+ if (password.length < 6) {
167
+ const response2 = new Response(
168
+ JSON.stringify({
169
+ success: false,
170
+ error: "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C11\u4E3A 6 \u4F4D"
171
+ }),
172
+ {
173
+ status: 400,
174
+ headers: { "Content-Type": "application/json" }
175
+ }
176
+ );
177
+ return addCorsHeaders2(response2, config, request);
178
+ }
179
+ const result = await config.authService.signUp(
180
+ email,
181
+ password,
182
+ username,
183
+ config.defaultRole || "USER"
184
+ );
185
+ if (config.analytics) {
186
+ try {
187
+ await config.analytics.track("user_register_success", {
188
+ userId: result.user.id,
189
+ email: result.user.email,
190
+ username: result.user.username,
191
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
192
+ });
193
+ } catch (analyticsError) {
194
+ console.error("Failed to track register analytics:", analyticsError);
195
+ }
196
+ }
197
+ const response = new Response(
198
+ JSON.stringify({
199
+ success: true,
200
+ data: {
201
+ user: result.user,
202
+ token: result.token
203
+ },
204
+ message: "\u6CE8\u518C\u6210\u529F"
205
+ }),
206
+ {
207
+ status: 201,
208
+ headers: { "Content-Type": "application/json" }
209
+ }
210
+ );
211
+ if (config.cookieOptions) {
212
+ const cookieOptions = {
213
+ name: config.cookieOptions?.name || "auth_token",
214
+ httpOnly: config.cookieOptions?.httpOnly !== false,
215
+ secure: config.cookieOptions?.secure !== false && process.env.NODE_ENV === "production",
216
+ sameSite: config.cookieOptions?.sameSite || "lax",
217
+ maxAge: config.cookieOptions?.maxAge || 60 * 60 * 24 * 7,
218
+ path: config.cookieOptions?.path || "/"
219
+ };
220
+ const cookieValue = `${cookieOptions.name}=${result.token}; HttpOnly=${cookieOptions.httpOnly}; Secure=${cookieOptions.secure}; SameSite=${cookieOptions.sameSite}; Max-Age=${cookieOptions.maxAge}; Path=${cookieOptions.path}`;
221
+ response.headers.set("Set-Cookie", cookieValue);
222
+ }
223
+ return addCorsHeaders2(response, config, request);
224
+ } catch (error) {
225
+ console.error("Register error:", error);
226
+ if (config.analytics) {
227
+ try {
228
+ await config.analytics.track("user_register_failed", {
229
+ errorMessage: error.message || "\u6CE8\u518C\u5931\u8D25",
230
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
231
+ });
232
+ } catch (analyticsError) {
233
+ console.error("Failed to track register failure analytics:", analyticsError);
234
+ }
235
+ }
236
+ const response = new Response(
237
+ JSON.stringify({
238
+ success: false,
239
+ error: error.message || "\u6CE8\u518C\u5931\u8D25"
240
+ }),
241
+ {
242
+ status: 400,
243
+ headers: { "Content-Type": "application/json" }
244
+ }
245
+ );
246
+ return addCorsHeaders2(response, config, request);
247
+ }
248
+ };
249
+ }
250
+ function createRegisterOptionsHandler(config) {
251
+ return async (request) => {
252
+ const response = new Response(null, {
253
+ status: 204,
254
+ headers: {
255
+ "Content-Length": "0"
256
+ }
257
+ });
258
+ if (config.cors?.enabled) {
259
+ const origin = request.headers.get("origin");
260
+ const allowedOrigins = config.cors.origin;
261
+ if (allowedOrigins) {
262
+ if (typeof allowedOrigins === "string") {
263
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
264
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
265
+ response.headers.set("Access-Control-Allow-Origin", origin);
266
+ }
267
+ } else {
268
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
269
+ }
270
+ if (config.cors.credentials) {
271
+ response.headers.set("Access-Control-Allow-Credentials", "true");
272
+ }
273
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
274
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
275
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
276
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
277
+ }
278
+ return response;
279
+ };
280
+ }
281
+
282
+ // src/auth/routes/me.ts
283
+ function addCorsHeaders3(response, config, request) {
284
+ if (!config.cors?.enabled) return response;
285
+ const origin = request.headers.get("origin");
286
+ const allowedOrigins = config.cors.origin;
287
+ if (allowedOrigins) {
288
+ if (typeof allowedOrigins === "string") {
289
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
290
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
291
+ response.headers.set("Access-Control-Allow-Origin", origin);
292
+ }
293
+ } else {
294
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
295
+ }
296
+ if (config.cors.credentials) {
297
+ response.headers.set("Access-Control-Allow-Credentials", "true");
298
+ }
299
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
300
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
301
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
302
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
303
+ return response;
304
+ }
305
+ function createMeHandler(config) {
306
+ return async (request) => {
307
+ try {
308
+ const token = getTokenFromRequest(request);
309
+ if (!token) {
310
+ const response2 = new Response(
311
+ JSON.stringify({
312
+ success: false,
313
+ error: "\u672A\u63D0\u4F9B\u8BA4\u8BC1\u4EE4\u724C"
314
+ }),
315
+ {
316
+ status: 401,
317
+ headers: { "Content-Type": "application/json" }
318
+ }
319
+ );
320
+ return addCorsHeaders3(response2, config, request);
321
+ }
322
+ const result = await config.authService.verifyToken(token);
323
+ const response = new Response(
324
+ JSON.stringify({
325
+ success: true,
326
+ data: result.user
327
+ }),
328
+ {
329
+ status: 200,
330
+ headers: { "Content-Type": "application/json" }
331
+ }
332
+ );
333
+ return addCorsHeaders3(response, config, request);
334
+ } catch (error) {
335
+ console.error("Get user info error:", error);
336
+ const response = new Response(
337
+ JSON.stringify({
338
+ success: false,
339
+ error: "\u8BA4\u8BC1\u5931\u8D25"
340
+ }),
341
+ {
342
+ status: 401,
343
+ headers: { "Content-Type": "application/json" }
344
+ }
345
+ );
346
+ return addCorsHeaders3(response, config, request);
347
+ }
348
+ };
349
+ }
350
+ function createMeOptionsHandler(config) {
351
+ return async (request) => {
352
+ const response = new Response(null, {
353
+ status: 204,
354
+ headers: {
355
+ "Content-Length": "0"
356
+ }
357
+ });
358
+ return addCorsHeaders3(response, config, request);
359
+ };
360
+ }
361
+
362
+ // src/auth/routes/logout.ts
363
+ function addCorsHeaders4(response, config, request) {
364
+ if (!config.cors?.enabled) return response;
365
+ const origin = request.headers.get("origin");
366
+ const allowedOrigins = config.cors.origin;
367
+ if (allowedOrigins) {
368
+ if (typeof allowedOrigins === "string") {
369
+ response.headers.set("Access-Control-Allow-Origin", allowedOrigins);
370
+ } else if (Array.isArray(allowedOrigins) && origin && allowedOrigins.includes(origin)) {
371
+ response.headers.set("Access-Control-Allow-Origin", origin);
372
+ }
373
+ } else {
374
+ response.headers.set("Access-Control-Allow-Origin", origin || "*");
375
+ }
376
+ if (config.cors.credentials) {
377
+ response.headers.set("Access-Control-Allow-Credentials", "true");
378
+ }
379
+ const methods = config.cors.methods || ["GET", "POST", "PUT", "DELETE", "OPTIONS"];
380
+ response.headers.set("Access-Control-Allow-Methods", methods.join(", "));
381
+ const headers = config.cors.allowedHeaders || ["Content-Type", "Authorization"];
382
+ response.headers.set("Access-Control-Allow-Headers", headers.join(", "));
383
+ return response;
384
+ }
385
+ function createLogoutHandler(config) {
386
+ return async (request) => {
387
+ try {
388
+ const token = getTokenFromRequest(request);
389
+ if (!token) {
390
+ const response2 = new Response(
391
+ JSON.stringify({
392
+ success: false,
393
+ error: "\u672A\u63D0\u4F9B\u8BA4\u8BC1\u4EE4\u724C"
394
+ }),
395
+ {
396
+ status: 401,
397
+ headers: { "Content-Type": "application/json" }
398
+ }
399
+ );
400
+ return addCorsHeaders4(response2, config, request);
401
+ }
402
+ await config.authService.signOut(token);
403
+ if (config.analytics) {
404
+ try {
405
+ await config.analytics.track("user_logout", {
406
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
407
+ });
408
+ } catch (analyticsError) {
409
+ console.error("Failed to track logout analytics:", analyticsError);
410
+ }
411
+ }
412
+ const response = new Response(
413
+ JSON.stringify({
414
+ success: true,
415
+ message: "\u767B\u51FA\u6210\u529F"
416
+ }),
417
+ {
418
+ status: 200,
419
+ headers: { "Content-Type": "application/json" }
420
+ }
421
+ );
422
+ response.headers.set(
423
+ "Set-Cookie",
424
+ "auth_token=; HttpOnly; Secure; SameSite=Lax; Max-Age=0; Path=/"
425
+ );
426
+ return addCorsHeaders4(response, config, request);
427
+ } catch (error) {
428
+ console.error("Logout error:", error);
429
+ const response = new Response(
430
+ JSON.stringify({
431
+ success: false,
432
+ error: "\u767B\u51FA\u5931\u8D25"
433
+ }),
434
+ {
435
+ status: 500,
436
+ headers: { "Content-Type": "application/json" }
437
+ }
438
+ );
439
+ return addCorsHeaders4(response, config, request);
440
+ }
441
+ };
442
+ }
443
+ function createLogoutOptionsHandler(config) {
444
+ return async (request) => {
445
+ const response = new Response(null, {
446
+ status: 204,
447
+ headers: {
448
+ "Content-Length": "0"
449
+ }
450
+ });
451
+ return addCorsHeaders4(response, config, request);
452
+ };
453
+ }
454
+
455
+ // src/auth/routes/defaults.ts
456
+ function createDefaultBaseConfig(authService, overrides) {
457
+ return {
458
+ authService,
459
+ cors: {
460
+ enabled: true,
461
+ credentials: true,
462
+ ...overrides?.cors
463
+ },
464
+ analytics: overrides?.analytics
465
+ };
466
+ }
467
+ function createDefaultLoginConfig(authService, overrides) {
468
+ return {
469
+ authService,
470
+ cors: {
471
+ enabled: true,
472
+ credentials: true,
473
+ ...overrides?.cors
474
+ },
475
+ cookieOptions: {
476
+ name: "auth_token",
477
+ httpOnly: true,
478
+ secure: process.env.NODE_ENV === "production",
479
+ sameSite: "lax",
480
+ maxAge: 60 * 60 * 24 * 7,
481
+ // 7天
482
+ path: "/",
483
+ ...overrides?.cookieOptions
484
+ },
485
+ analytics: overrides?.analytics
486
+ };
487
+ }
488
+ function createDefaultRegisterConfig(authService, overrides) {
489
+ return {
490
+ authService,
491
+ defaultRole: overrides?.defaultRole || "USER",
492
+ cors: {
493
+ enabled: true,
494
+ credentials: true,
495
+ ...overrides?.cors
496
+ },
497
+ cookieOptions: overrides?.cookieOptions !== void 0 ? {
498
+ name: "auth_token",
499
+ httpOnly: true,
500
+ secure: process.env.NODE_ENV === "production",
501
+ sameSite: "lax",
502
+ maxAge: 60 * 60 * 24 * 7,
503
+ // 7天
504
+ path: "/",
505
+ ...overrides.cookieOptions
506
+ } : void 0,
507
+ analytics: overrides?.analytics,
508
+ emailVerificationRequired: overrides?.emailVerificationRequired
509
+ };
510
+ }
511
+
512
+ // src/auth/routes/analytics-adapter.ts
513
+ function createAnalyticsAdapter(analyticsService, options) {
514
+ const config = {
515
+ platform: options?.platform || "backend",
516
+ appVersion: options?.appVersion || "1.0.0",
517
+ sdkVersion: options?.sdkVersion || "1.0.0",
518
+ deviceId: options?.deviceId || "server",
519
+ generateId: options?.generateId || (() => {
520
+ return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
521
+ })
522
+ };
523
+ return {
524
+ track: async (eventName, properties) => {
525
+ try {
526
+ let eventType = "event";
527
+ if (eventName.includes("login_success")) {
528
+ eventType = "login";
529
+ } else if (eventName.includes("register_success")) {
530
+ eventType = "register";
531
+ } else if (eventName.includes("logout")) {
532
+ eventType = "logout";
533
+ } else if (eventName.includes("failed") || eventName.includes("error")) {
534
+ eventType = "error";
535
+ }
536
+ const event = {
537
+ id: config.generateId(),
538
+ eventType,
539
+ eventName,
540
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
541
+ priority: 1,
542
+ userId: properties.userId || "anonymous",
543
+ sessionId: properties.sessionId || `session_${Date.now()}_${properties.userId || "anonymous"}`,
544
+ deviceId: config.deviceId,
545
+ platform: config.platform,
546
+ appVersion: config.appVersion,
547
+ sdkVersion: config.sdkVersion,
548
+ properties
549
+ };
550
+ await analyticsService.insertAnalyticsEvents([event]);
551
+ } catch (error) {
552
+ console.error("Failed to track analytics:", error);
553
+ }
554
+ }
555
+ };
556
+ }
557
+
558
+ export { createAnalyticsAdapter, createDefaultBaseConfig, createDefaultLoginConfig, createDefaultRegisterConfig, createLoginHandler, createLoginOptionsHandler, createLogoutHandler, createLogoutOptionsHandler, createMeHandler, createMeOptionsHandler, createRegisterHandler, createRegisterOptionsHandler };
559
+ //# sourceMappingURL=chunk-IBLB7ARJ.mjs.map
560
+ //# sourceMappingURL=chunk-IBLB7ARJ.mjs.map