@alibarbar/common 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/README.md +338 -0
  2. package/dist/algorithm.d.mts +66 -0
  3. package/dist/algorithm.d.ts +66 -0
  4. package/dist/algorithm.js +44 -0
  5. package/dist/algorithm.js.map +1 -0
  6. package/dist/algorithm.mjs +3 -0
  7. package/dist/algorithm.mjs.map +1 -0
  8. package/dist/array.d.mts +139 -0
  9. package/dist/array.d.ts +139 -0
  10. package/dist/array.js +84 -0
  11. package/dist/array.js.map +1 -0
  12. package/dist/array.mjs +3 -0
  13. package/dist/array.mjs.map +1 -0
  14. package/dist/chunk-27UDDVLZ.js +259 -0
  15. package/dist/chunk-27UDDVLZ.js.map +1 -0
  16. package/dist/chunk-2FFSQ573.mjs +138 -0
  17. package/dist/chunk-2FFSQ573.mjs.map +1 -0
  18. package/dist/chunk-4RGXV4SJ.js +106 -0
  19. package/dist/chunk-4RGXV4SJ.js.map +1 -0
  20. package/dist/chunk-56W6YECK.js +374 -0
  21. package/dist/chunk-56W6YECK.js.map +1 -0
  22. package/dist/chunk-5BGSUGTI.mjs +128 -0
  23. package/dist/chunk-5BGSUGTI.mjs.map +1 -0
  24. package/dist/chunk-7E6GELHJ.mjs +302 -0
  25. package/dist/chunk-7E6GELHJ.mjs.map +1 -0
  26. package/dist/chunk-7V5UQXIO.js +89 -0
  27. package/dist/chunk-7V5UQXIO.js.map +1 -0
  28. package/dist/chunk-A4SWQXX7.mjs +484 -0
  29. package/dist/chunk-A4SWQXX7.mjs.map +1 -0
  30. package/dist/chunk-ALDC6LRJ.mjs +85 -0
  31. package/dist/chunk-ALDC6LRJ.mjs.map +1 -0
  32. package/dist/chunk-BHCRFURU.js +491 -0
  33. package/dist/chunk-BHCRFURU.js.map +1 -0
  34. package/dist/chunk-D7CS5EKF.js +110 -0
  35. package/dist/chunk-D7CS5EKF.js.map +1 -0
  36. package/dist/chunk-DYBSRI7V.js +189 -0
  37. package/dist/chunk-DYBSRI7V.js.map +1 -0
  38. package/dist/chunk-F3LAGHPG.js +332 -0
  39. package/dist/chunk-F3LAGHPG.js.map +1 -0
  40. package/dist/chunk-HLDFI7R2.mjs +175 -0
  41. package/dist/chunk-HLDFI7R2.mjs.map +1 -0
  42. package/dist/chunk-HME2N3VY.mjs +354 -0
  43. package/dist/chunk-HME2N3VY.mjs.map +1 -0
  44. package/dist/chunk-I3L42475.js +145 -0
  45. package/dist/chunk-I3L42475.js.map +1 -0
  46. package/dist/chunk-JBLX27WD.mjs +240 -0
  47. package/dist/chunk-JBLX27WD.mjs.map +1 -0
  48. package/dist/chunk-JHZ7M2MR.mjs +133 -0
  49. package/dist/chunk-JHZ7M2MR.mjs.map +1 -0
  50. package/dist/chunk-JK2SE3I2.js +100 -0
  51. package/dist/chunk-JK2SE3I2.js.map +1 -0
  52. package/dist/chunk-JQZBPAPO.js +157 -0
  53. package/dist/chunk-JQZBPAPO.js.map +1 -0
  54. package/dist/chunk-JXYGC2C5.mjs +100 -0
  55. package/dist/chunk-JXYGC2C5.mjs.map +1 -0
  56. package/dist/chunk-KGFTD255.js +104 -0
  57. package/dist/chunk-KGFTD255.js.map +1 -0
  58. package/dist/chunk-LBHBNPNJ.mjs +148 -0
  59. package/dist/chunk-LBHBNPNJ.mjs.map +1 -0
  60. package/dist/chunk-LCXGZISK.js +158 -0
  61. package/dist/chunk-LCXGZISK.js.map +1 -0
  62. package/dist/chunk-LF4CILQS.mjs +87 -0
  63. package/dist/chunk-LF4CILQS.mjs.map +1 -0
  64. package/dist/chunk-MMR6XQNX.js +98 -0
  65. package/dist/chunk-MMR6XQNX.js.map +1 -0
  66. package/dist/chunk-NSSDYX2U.mjs +80 -0
  67. package/dist/chunk-NSSDYX2U.mjs.map +1 -0
  68. package/dist/chunk-O3O67R4I.js +143 -0
  69. package/dist/chunk-O3O67R4I.js.map +1 -0
  70. package/dist/chunk-OX5PLOWB.js +90 -0
  71. package/dist/chunk-OX5PLOWB.js.map +1 -0
  72. package/dist/chunk-PJ7UCTX4.mjs +362 -0
  73. package/dist/chunk-PJ7UCTX4.mjs.map +1 -0
  74. package/dist/chunk-QIBE7GVN.mjs +81 -0
  75. package/dist/chunk-QIBE7GVN.mjs.map +1 -0
  76. package/dist/chunk-QIOC54LQ.mjs +130 -0
  77. package/dist/chunk-QIOC54LQ.mjs.map +1 -0
  78. package/dist/chunk-QV6MIQ7H.mjs +328 -0
  79. package/dist/chunk-QV6MIQ7H.mjs.map +1 -0
  80. package/dist/chunk-TQN37HIN.js +94 -0
  81. package/dist/chunk-TQN37HIN.js.map +1 -0
  82. package/dist/chunk-XJTZDXSR.mjs +94 -0
  83. package/dist/chunk-XJTZDXSR.mjs.map +1 -0
  84. package/dist/chunk-XVUE53T3.js +361 -0
  85. package/dist/chunk-XVUE53T3.js.map +1 -0
  86. package/dist/chunk-Y364QIQH.js +139 -0
  87. package/dist/chunk-Y364QIQH.js.map +1 -0
  88. package/dist/chunk-YXM6Q4JS.mjs +94 -0
  89. package/dist/chunk-YXM6Q4JS.mjs.map +1 -0
  90. package/dist/chunk-ZDMFMUDR.js +309 -0
  91. package/dist/chunk-ZDMFMUDR.js.map +1 -0
  92. package/dist/chunk-ZVJ6NQUM.mjs +82 -0
  93. package/dist/chunk-ZVJ6NQUM.mjs.map +1 -0
  94. package/dist/color.d.mts +74 -0
  95. package/dist/color.d.ts +74 -0
  96. package/dist/color.js +40 -0
  97. package/dist/color.js.map +1 -0
  98. package/dist/color.mjs +3 -0
  99. package/dist/color.mjs.map +1 -0
  100. package/dist/crypto.d.mts +92 -0
  101. package/dist/crypto.d.ts +92 -0
  102. package/dist/crypto.js +60 -0
  103. package/dist/crypto.js.map +1 -0
  104. package/dist/crypto.mjs +3 -0
  105. package/dist/crypto.mjs.map +1 -0
  106. package/dist/data-structure.d.mts +213 -0
  107. package/dist/data-structure.d.ts +213 -0
  108. package/dist/data-structure.js +32 -0
  109. package/dist/data-structure.js.map +1 -0
  110. package/dist/data-structure.mjs +3 -0
  111. package/dist/data-structure.mjs.map +1 -0
  112. package/dist/date.d.mts +108 -0
  113. package/dist/date.d.ts +108 -0
  114. package/dist/date.js +72 -0
  115. package/dist/date.js.map +1 -0
  116. package/dist/date.mjs +3 -0
  117. package/dist/date.mjs.map +1 -0
  118. package/dist/dom.d.mts +92 -0
  119. package/dist/dom.d.ts +92 -0
  120. package/dist/dom.js +56 -0
  121. package/dist/dom.js.map +1 -0
  122. package/dist/dom.mjs +3 -0
  123. package/dist/dom.mjs.map +1 -0
  124. package/dist/file.d.mts +44 -0
  125. package/dist/file.d.ts +44 -0
  126. package/dist/file.js +32 -0
  127. package/dist/file.js.map +1 -0
  128. package/dist/file.mjs +3 -0
  129. package/dist/file.mjs.map +1 -0
  130. package/dist/i18n.d.mts +77 -0
  131. package/dist/i18n.d.ts +77 -0
  132. package/dist/i18n.js +40 -0
  133. package/dist/i18n.js.map +1 -0
  134. package/dist/i18n.mjs +3 -0
  135. package/dist/i18n.mjs.map +1 -0
  136. package/dist/index.d.mts +155 -0
  137. package/dist/index.d.ts +155 -0
  138. package/dist/index.js +839 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/index.mjs +22 -0
  141. package/dist/index.mjs.map +1 -0
  142. package/dist/network.d.mts +47 -0
  143. package/dist/network.d.ts +47 -0
  144. package/dist/network.js +28 -0
  145. package/dist/network.js.map +1 -0
  146. package/dist/network.mjs +3 -0
  147. package/dist/network.mjs.map +1 -0
  148. package/dist/number.d.mts +100 -0
  149. package/dist/number.d.ts +100 -0
  150. package/dist/number.js +56 -0
  151. package/dist/number.js.map +1 -0
  152. package/dist/number.mjs +3 -0
  153. package/dist/number.mjs.map +1 -0
  154. package/dist/object.d.mts +132 -0
  155. package/dist/object.d.ts +132 -0
  156. package/dist/object.js +80 -0
  157. package/dist/object.js.map +1 -0
  158. package/dist/object.mjs +3 -0
  159. package/dist/object.mjs.map +1 -0
  160. package/dist/performance.d.mts +85 -0
  161. package/dist/performance.d.ts +85 -0
  162. package/dist/performance.js +40 -0
  163. package/dist/performance.js.map +1 -0
  164. package/dist/performance.mjs +3 -0
  165. package/dist/performance.mjs.map +1 -0
  166. package/dist/storage.d.mts +176 -0
  167. package/dist/storage.d.ts +176 -0
  168. package/dist/storage.js +33 -0
  169. package/dist/storage.js.map +1 -0
  170. package/dist/storage.mjs +4 -0
  171. package/dist/storage.mjs.map +1 -0
  172. package/dist/string.d.mts +105 -0
  173. package/dist/string.d.ts +105 -0
  174. package/dist/string.js +68 -0
  175. package/dist/string.js.map +1 -0
  176. package/dist/string.mjs +3 -0
  177. package/dist/string.mjs.map +1 -0
  178. package/dist/tracking.d.mts +182 -0
  179. package/dist/tracking.d.ts +182 -0
  180. package/dist/tracking.js +52 -0
  181. package/dist/tracking.js.map +1 -0
  182. package/dist/tracking.mjs +3 -0
  183. package/dist/tracking.mjs.map +1 -0
  184. package/dist/transform.d.mts +53 -0
  185. package/dist/transform.d.ts +53 -0
  186. package/dist/transform.js +32 -0
  187. package/dist/transform.js.map +1 -0
  188. package/dist/transform.mjs +3 -0
  189. package/dist/transform.mjs.map +1 -0
  190. package/dist/upload-DzlQtUBc.d.mts +202 -0
  191. package/dist/upload-DzlQtUBc.d.ts +202 -0
  192. package/dist/upload.d.mts +1 -0
  193. package/dist/upload.d.ts +1 -0
  194. package/dist/upload.js +17 -0
  195. package/dist/upload.js.map +1 -0
  196. package/dist/upload.mjs +4 -0
  197. package/dist/upload.mjs.map +1 -0
  198. package/dist/url.d.mts +82 -0
  199. package/dist/url.d.ts +82 -0
  200. package/dist/url.js +44 -0
  201. package/dist/url.js.map +1 -0
  202. package/dist/url.mjs +3 -0
  203. package/dist/url.mjs.map +1 -0
  204. package/dist/validation.d.mts +83 -0
  205. package/dist/validation.d.ts +83 -0
  206. package/dist/validation.js +60 -0
  207. package/dist/validation.js.map +1 -0
  208. package/dist/validation.mjs +3 -0
  209. package/dist/validation.mjs.map +1 -0
  210. package/package.json +170 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/upload.ts","../src/browser/upload.ts"],"names":["UploadStatus","result"],"mappings":"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","file":"chunk-QV6MIQ7H.mjs","sourcesContent":["/**\n * 文件上传相关类型定义\n */\n\n/**\n * 上传初始化请求参数\n */\nexport interface UploadInitRequest {\n fileName: string;\n fileSize: number;\n fileMd5: string;\n chunkSize?: number;\n}\n\n/**\n * 上传初始化响应\n */\nexport interface UploadInitResponse {\n taskId: string;\n totalChunks: number;\n existingChunks: number[];\n instantUpload: boolean;\n fileUrl?: string;\n chunkSize: number;\n}\n\n/**\n * 分片上传响应\n */\nexport interface ChunkUploadResponse {\n chunkIndex: number;\n success: boolean;\n message: string;\n chunkMd5: string;\n}\n\n/**\n * 完成上传响应\n */\nexport interface CompleteUploadResponse {\n taskId: string;\n fileUrl: string;\n fileName: string;\n fileSize: number;\n fileMd5: string;\n success: boolean;\n message: string;\n}\n\n/**\n * 上传进度信息\n */\nexport interface UploadProgress {\n taskId: string;\n fileName: string;\n fileSize: number;\n totalChunks: number;\n uploadedChunks: number;\n percentage: number;\n status: string;\n uploadedSize: number;\n}\n\n/**\n * API响应包装类型\n */\nexport interface ApiResponse<T> {\n code: number;\n message: string;\n data: T;\n timestamp: number;\n}\n\n/**\n * 上传配置选项\n */\nexport interface UploadOptions {\n /** 分片大小(字节),默认 2MB */\n chunkSize?: number;\n /** 并发上传数量,默认 3 */\n concurrency?: number;\n /** 重试次数,默认 3 */\n retryCount?: number;\n /** 重试延迟(毫秒),默认 1000 */\n retryDelay?: number;\n /** 基础API地址 */\n baseURL?: string;\n /** 请求头 */\n headers?: Record<string, string>;\n /** 上传进度回调 */\n onProgress?: (progress: UploadProgress) => void;\n /** 上传完成回调 */\n onComplete?: (result: CompleteUploadResponse) => void;\n /** 上传错误回调 */\n onError?: (error: Error) => void;\n}\n\n/**\n * 上传状态\n */\nexport enum UploadStatus {\n PENDING = 'pending',\n UPLOADING = 'uploading',\n PAUSED = 'paused',\n COMPLETED = 'completed',\n FAILED = 'failed',\n CANCELLED = 'cancelled',\n}\n\n/**\n * 文件分片信息\n */\nexport interface ChunkInfo {\n index: number;\n start: number;\n end: number;\n blob: Blob;\n md5?: string;\n}\n","/**\n * 文件分片上传工具类\n * 支持分片上传、断点续传、进度追踪\n */\n\nimport {\n UploadOptions,\n UploadInitRequest,\n UploadInitResponse,\n ChunkUploadResponse,\n CompleteUploadResponse,\n UploadProgress,\n UploadStatus,\n ChunkInfo,\n ApiResponse,\n} from '../types/upload';\nimport { calculateBlobMD5, splitFileIntoChunks } from './file';\n\n/**\n * 文件上传器类\n */\nexport class ChunkUploader {\n private file: File;\n private options: Required<UploadOptions>;\n private taskId: string | null = null;\n private chunks: ChunkInfo[] = [];\n private uploadedChunks: Set<number> = new Set();\n private status: UploadStatus = UploadStatus.PENDING;\n private abortController: AbortController | null = null;\n\n constructor(file: File, options: UploadOptions = {}) {\n this.file = file;\n this.options = {\n chunkSize: options.chunkSize || 2 * 1024 * 1024, // 默认2MB\n concurrency: options.concurrency || 3,\n retryCount: options.retryCount || 3,\n retryDelay: options.retryDelay || 1000,\n baseURL: options.baseURL || '',\n headers: options.headers || {},\n onProgress: options.onProgress || (() => {}),\n onComplete: options.onComplete || (() => {}),\n onError: options.onError || (() => {}),\n };\n }\n\n /**\n * 初始化上传\n */\n private async initUpload(): Promise<UploadInitResponse> {\n const fileMd5 = await this.calculateFileMD5();\n const request: UploadInitRequest = {\n fileName: this.file.name,\n fileSize: this.file.size,\n fileMd5,\n chunkSize: this.options.chunkSize,\n };\n\n const response = await this.request<ApiResponse<UploadInitResponse>>('/api/files/common/init', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.options.headers,\n },\n body: JSON.stringify(request),\n });\n\n if (response.code !== 200) {\n throw new Error(response.message || '初始化上传失败');\n }\n\n return response.data;\n }\n\n /**\n * 计算文件MD5(简化版,实际应该使用spark-md5等库)\n */\n private async calculateFileMD5(): Promise<string> {\n // 这里使用简化的方法,实际项目中应该使用spark-md5库\n const chunks = splitFileIntoChunks(this.file, this.options.chunkSize);\n const md5Promises = chunks.map((chunk, index) =>\n calculateBlobMD5(chunk).then(md5 => ({ index, md5 }))\n );\n const md5Results = await Promise.all(md5Promises);\n // 简单拼接,实际应该使用正确的MD5算法\n return md5Results.map(r => r.md5).join('');\n }\n\n /**\n * 准备分片\n */\n private prepareChunks(): void {\n const blobChunks = splitFileIntoChunks(this.file, this.options.chunkSize);\n this.chunks = blobChunks.map((blob, index) => ({\n index,\n start: index * this.options.chunkSize,\n end: Math.min((index + 1) * this.options.chunkSize, this.file.size),\n blob,\n }));\n }\n\n /**\n * 获取已上传的分片列表\n */\n private async getUploadedChunks(): Promise<number[]> {\n if (!this.taskId) return [];\n\n try {\n const response = await this.request<ApiResponse<number[]>>(\n `/api/files/common/chunks/${this.taskId}`,\n {\n method: 'GET',\n headers: this.options.headers,\n }\n );\n\n if (response.code === 200) {\n return response.data || [];\n }\n } catch (error) {\n console.warn('获取已上传分片失败:', error);\n }\n\n return [];\n }\n\n /**\n * 上传单个分片\n */\n private async uploadChunk(chunkInfo: ChunkInfo, retryCount = 0): Promise<void> {\n if (!this.taskId) {\n throw new Error('任务ID不存在');\n }\n\n if (this.uploadedChunks.has(chunkInfo.index)) {\n return; // 已上传,跳过\n }\n\n try {\n // 计算分片MD5\n const chunkMd5 = await calculateBlobMD5(chunkInfo.blob);\n\n const formData = new FormData();\n formData.append('file', chunkInfo.blob, this.file.name);\n\n const url = `/api/files/common/chunk?taskId=${this.taskId}&chunkIndex=${chunkInfo.index}&chunkMd5=${chunkMd5}`;\n\n const response = await this.request<ApiResponse<ChunkUploadResponse>>(url, {\n method: 'POST',\n headers: this.options.headers,\n body: formData,\n });\n\n if (response.code === 200 && response.data.success) {\n this.uploadedChunks.add(chunkInfo.index);\n this.updateProgress();\n } else {\n throw new Error(response.message || '分片上传失败');\n }\n } catch (error) {\n if (retryCount < this.options.retryCount) {\n await this.delay(this.options.retryDelay);\n return this.uploadChunk(chunkInfo, retryCount + 1);\n }\n throw error;\n }\n }\n\n /**\n * 并发上传分片\n */\n private async uploadChunksConcurrently(): Promise<void> {\n const chunksToUpload = this.chunks.filter(chunk => !this.uploadedChunks.has(chunk.index));\n\n const uploadPromises: Promise<void>[] = [];\n let currentIndex = 0;\n\n const uploadNext = async (): Promise<void> => {\n while (currentIndex < chunksToUpload.length && this.status === UploadStatus.UPLOADING) {\n const chunk = chunksToUpload[currentIndex++];\n const promise = this.uploadChunk(chunk).then(() => {\n if (currentIndex < chunksToUpload.length) {\n return uploadNext();\n }\n });\n uploadPromises.push(promise);\n\n if (uploadPromises.length >= this.options.concurrency) {\n await Promise.race(uploadPromises);\n uploadPromises.splice(\n uploadPromises.findIndex(p => p === promise),\n 1\n );\n }\n }\n };\n\n // 启动并发上传\n const concurrencyPromises: Promise<void>[] = [];\n for (let i = 0; i < this.options.concurrency; i++) {\n concurrencyPromises.push(uploadNext());\n }\n\n await Promise.all(concurrencyPromises);\n }\n\n /**\n * 完成上传\n */\n private async completeUpload(): Promise<CompleteUploadResponse> {\n if (!this.taskId) {\n throw new Error('任务ID不存在');\n }\n\n const response = await this.request<ApiResponse<CompleteUploadResponse>>(\n `/api/files/common/complete/${this.taskId}`,\n {\n method: 'POST',\n headers: this.options.headers,\n }\n );\n\n if (response.code !== 200) {\n throw new Error(response.message || '完成上传失败');\n }\n\n return response.data;\n }\n\n /**\n * 更新上传进度\n */\n private async updateProgress(): Promise<void> {\n if (!this.taskId) return;\n\n try {\n const response = await this.request<ApiResponse<UploadProgress>>(\n `/api/files/common/progress/${this.taskId}`,\n {\n method: 'GET',\n headers: this.options.headers,\n }\n );\n\n if (response.code === 200 && this.options.onProgress) {\n this.options.onProgress(response.data);\n }\n } catch (error) {\n console.warn('获取上传进度失败:', error);\n }\n }\n\n /**\n * 开始上传\n */\n async upload(): Promise<CompleteUploadResponse> {\n try {\n this.status = UploadStatus.UPLOADING;\n this.abortController = new AbortController();\n\n // 1. 初始化上传\n const initResponse = await this.initUpload();\n this.taskId = initResponse.taskId;\n\n // 如果已经完成上传(秒传)\n if (initResponse.instantUpload && initResponse.fileUrl) {\n this.status = UploadStatus.COMPLETED;\n const result: CompleteUploadResponse = {\n taskId: this.taskId,\n fileUrl: initResponse.fileUrl,\n fileName: this.file.name,\n fileSize: this.file.size,\n fileMd5: '',\n success: true,\n message: '文件已存在,秒传成功',\n };\n this.options.onComplete(result);\n return result;\n }\n\n // 2. 准备分片\n this.prepareChunks();\n\n // 3. 获取已上传的分片(断点续传)\n const existingChunks = await this.getUploadedChunks();\n existingChunks.forEach(index => this.uploadedChunks.add(index));\n\n // 4. 上传分片\n await this.uploadChunksConcurrently();\n\n // 5. 完成上传\n const result = await this.completeUpload();\n this.status = UploadStatus.COMPLETED;\n this.options.onComplete(result);\n\n return result;\n } catch (error) {\n this.status = UploadStatus.FAILED;\n const err = error instanceof Error ? error : new Error(String(error));\n this.options.onError(err);\n throw err;\n }\n }\n\n /**\n * 暂停上传\n */\n pause(): void {\n if (this.status === UploadStatus.UPLOADING) {\n this.status = UploadStatus.PAUSED;\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n }\n\n /**\n * 恢复上传\n */\n async resume(): Promise<CompleteUploadResponse> {\n if (this.status === UploadStatus.PAUSED) {\n return this.upload();\n }\n throw new Error('当前状态无法恢复上传');\n }\n\n /**\n * 取消上传\n */\n async cancel(): Promise<void> {\n if (this.taskId && this.status === UploadStatus.UPLOADING) {\n try {\n await this.request<ApiResponse<null>>(`/api/files/common/cancel/${this.taskId}`, {\n method: 'POST',\n headers: this.options.headers,\n });\n } catch (error) {\n console.warn('取消上传失败:', error);\n }\n }\n\n this.status = UploadStatus.CANCELLED;\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /**\n * 获取当前状态\n */\n getStatus(): UploadStatus {\n return this.status;\n }\n\n /**\n * 获取任务ID\n */\n getTaskId(): string | null {\n return this.taskId;\n }\n\n /**\n * HTTP请求封装\n */\n private async request<T>(url: string, options: RequestInit = {}): Promise<T> {\n const fullUrl = `${this.options.baseURL}${url}`;\n const signal = this.abortController?.signal;\n\n const response = await fetch(fullUrl, {\n ...options,\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP错误: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n\n/**\n * 创建文件上传器实例\n * @param file - 文件对象\n * @param options - 上传配置选项\n * @returns 上传器实例\n */\nexport function createUploader(file: File, options?: UploadOptions): ChunkUploader {\n return new ChunkUploader(file, options);\n}\n"]}
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ // src/core/validation.ts
4
+ function isValidEmail(email) {
5
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
6
+ return emailRegex.test(email);
7
+ }
8
+ function isValidPhone(phone) {
9
+ const phoneRegex = /^1[3-9]\d{9}$/;
10
+ return phoneRegex.test(phone);
11
+ }
12
+ function isValidUrl(url) {
13
+ try {
14
+ new URL(url);
15
+ return true;
16
+ } catch {
17
+ return false;
18
+ }
19
+ }
20
+ function isValidIdCard(idCard) {
21
+ const idCardRegex = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/;
22
+ return idCardRegex.test(idCard);
23
+ }
24
+ function isEmpty(value) {
25
+ if (value === null || value === void 0) return true;
26
+ if (typeof value === "string") return value.trim().length === 0;
27
+ if (Array.isArray(value)) return value.length === 0;
28
+ if (typeof value === "object") return Object.keys(value).length === 0;
29
+ return false;
30
+ }
31
+ function isValidUUID(uuid) {
32
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
33
+ return uuidRegex.test(uuid);
34
+ }
35
+ function isValidIP(ip) {
36
+ const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
37
+ return ipRegex.test(ip);
38
+ }
39
+ function isValidDomain(domain) {
40
+ const domainRegex = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i;
41
+ return domainRegex.test(domain);
42
+ }
43
+ function isValidHexColor(color) {
44
+ const hexColorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
45
+ return hexColorRegex.test(color);
46
+ }
47
+ function isValidJSON(json) {
48
+ try {
49
+ JSON.parse(json);
50
+ return true;
51
+ } catch {
52
+ return false;
53
+ }
54
+ }
55
+ function isNumeric(value) {
56
+ if (typeof value === "number") return !isNaN(value) && isFinite(value);
57
+ if (typeof value === "string") {
58
+ return value.trim() !== "" && !isNaN(Number(value)) && isFinite(Number(value));
59
+ }
60
+ return false;
61
+ }
62
+ function isInteger(value) {
63
+ if (typeof value === "number") return Number.isInteger(value);
64
+ if (typeof value === "string") {
65
+ const num = Number(value);
66
+ return !isNaN(num) && Number.isInteger(num);
67
+ }
68
+ return false;
69
+ }
70
+ function isFloat(value) {
71
+ if (typeof value === "number")
72
+ return !isNaN(value) && isFinite(value) && !Number.isInteger(value);
73
+ if (typeof value === "string") {
74
+ const num = Number(value);
75
+ return !isNaN(num) && isFinite(num) && !Number.isInteger(num);
76
+ }
77
+ return false;
78
+ }
79
+
80
+ exports.isEmpty = isEmpty;
81
+ exports.isFloat = isFloat;
82
+ exports.isInteger = isInteger;
83
+ exports.isNumeric = isNumeric;
84
+ exports.isValidDomain = isValidDomain;
85
+ exports.isValidEmail = isValidEmail;
86
+ exports.isValidHexColor = isValidHexColor;
87
+ exports.isValidIP = isValidIP;
88
+ exports.isValidIdCard = isValidIdCard;
89
+ exports.isValidJSON = isValidJSON;
90
+ exports.isValidPhone = isValidPhone;
91
+ exports.isValidUUID = isValidUUID;
92
+ exports.isValidUrl = isValidUrl;
93
+ //# sourceMappingURL=chunk-TQN37HIN.js.map
94
+ //# sourceMappingURL=chunk-TQN37HIN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/validation.ts"],"names":[],"mappings":"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","file":"chunk-TQN37HIN.js","sourcesContent":["/**\n * 验证工具函数\n */\n\n/**\n * 验证邮箱格式\n * @param email - 邮箱地址\n * @returns 是否为有效邮箱\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * 验证手机号格式(中国大陆)\n * @param phone - 手机号\n * @returns 是否为有效手机号\n */\nexport function isValidPhone(phone: string): boolean {\n const phoneRegex = /^1[3-9]\\d{9}$/;\n return phoneRegex.test(phone);\n}\n\n/**\n * 验证URL格式\n * @param url - URL地址\n * @returns 是否为有效URL\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 验证身份证号格式(中国大陆18位)\n * @param idCard - 身份证号\n * @returns 是否为有效身份证号\n */\nexport function isValidIdCard(idCard: string): boolean {\n const idCardRegex = /^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$/;\n return idCardRegex.test(idCard);\n}\n\n/**\n * 验证是否为空值\n * @param value - 待验证的值\n * @returns 是否为空\n */\nexport function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value).length === 0;\n return false;\n}\n\n/**\n * 验证UUID格式\n * @param uuid - UUID字符串\n * @returns 是否为有效UUID\n */\nexport function isValidUUID(uuid: string): boolean {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidRegex.test(uuid);\n}\n\n/**\n * 验证IP地址格式(IPv4)\n * @param ip - IP地址\n * @returns 是否为有效IP地址\n */\nexport function isValidIP(ip: string): boolean {\n const ipRegex =\n /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n return ipRegex.test(ip);\n}\n\n/**\n * 验证域名格式\n * @param domain - 域名\n * @returns 是否为有效域名\n */\nexport function isValidDomain(domain: string): boolean {\n const domainRegex = /^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$/i;\n return domainRegex.test(domain);\n}\n\n/**\n * 验证十六进制颜色格式\n * @param color - 颜色值\n * @returns 是否为有效十六进制颜色\n */\nexport function isValidHexColor(color: string): boolean {\n const hexColorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\n return hexColorRegex.test(color);\n}\n\n/**\n * 验证JSON字符串格式\n * @param json - JSON字符串\n * @returns 是否为有效JSON\n */\nexport function isValidJSON(json: string): boolean {\n try {\n JSON.parse(json);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 验证是否为数字\n * @param value - 待验证的值\n * @returns 是否为数字\n */\nexport function isNumeric(value: unknown): boolean {\n if (typeof value === 'number') return !isNaN(value) && isFinite(value);\n if (typeof value === 'string') {\n return value.trim() !== '' && !isNaN(Number(value)) && isFinite(Number(value));\n }\n return false;\n}\n\n/**\n * 验证是否为整数\n * @param value - 待验证的值\n * @returns 是否为整数\n */\nexport function isInteger(value: unknown): boolean {\n if (typeof value === 'number') return Number.isInteger(value);\n if (typeof value === 'string') {\n const num = Number(value);\n return !isNaN(num) && Number.isInteger(num);\n }\n return false;\n}\n\n/**\n * 验证是否为浮点数\n * @param value - 待验证的值\n * @returns 是否为浮点数\n */\nexport function isFloat(value: unknown): boolean {\n if (typeof value === 'number')\n return !isNaN(value) && isFinite(value) && !Number.isInteger(value);\n if (typeof value === 'string') {\n const num = Number(value);\n return !isNaN(num) && isFinite(num) && !Number.isInteger(num);\n }\n return false;\n}\n"]}
@@ -0,0 +1,94 @@
1
+ // src/core/string.ts
2
+ function capitalize(str) {
3
+ if (!str) return str;
4
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
5
+ }
6
+ function camelCase(str) {
7
+ if (!str) return str;
8
+ const words = str.replace(/[A-Z]/g, (letter) => ` ${letter.toLowerCase()}`).split(/[\s\-_]+/).filter((word) => word.length > 0);
9
+ if (words.length === 0) return "";
10
+ return words[0].toLowerCase() + words.slice(1).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join("");
11
+ }
12
+ function kebabCase(str) {
13
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
14
+ }
15
+ function truncate(str, length, suffix = "...") {
16
+ if (str.length <= length) return str;
17
+ return str.slice(0, length - suffix.length) + suffix;
18
+ }
19
+ function snakeCase(str) {
20
+ if (!str) return str;
21
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).replace(/[\s-]+/g, "_").replace(/^_+|_+$/g, "").toLowerCase();
22
+ }
23
+ function pascalCase(str) {
24
+ if (!str) return str;
25
+ const camel = camelCase(str);
26
+ return camel.charAt(0).toUpperCase() + camel.slice(1);
27
+ }
28
+ function mask(str, options = {}) {
29
+ if (!str) return str;
30
+ const { start = 0, end = str.length, maskChar = "*" } = options;
31
+ const startIndex = Math.max(0, start);
32
+ const endIndex = Math.min(str.length, end);
33
+ if (startIndex >= endIndex) return str;
34
+ return str.slice(0, startIndex) + maskChar.repeat(endIndex - startIndex) + str.slice(endIndex);
35
+ }
36
+ function maskPhone(phone) {
37
+ if (!phone || phone.length < 7) return phone;
38
+ return mask(phone, { start: 3, end: phone.length - 4 });
39
+ }
40
+ function maskEmail(email) {
41
+ if (!email || !email.includes("@")) return email;
42
+ const [local, domain] = email.split("@");
43
+ if (local.length <= 2) return email;
44
+ return `${local.slice(0, 2)}***@${domain}`;
45
+ }
46
+ function slugify(str) {
47
+ if (!str) return "";
48
+ return str.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, "");
49
+ }
50
+ function removeAccents(str) {
51
+ if (!str) return str;
52
+ return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
53
+ }
54
+ function escapeHtml(str) {
55
+ if (!str) return str;
56
+ const map = {
57
+ "&": "&amp;",
58
+ "<": "&lt;",
59
+ ">": "&gt;",
60
+ '"': "&quot;",
61
+ "'": "&#39;"
62
+ };
63
+ return str.replace(/[&<>"']/g, (char) => map[char]);
64
+ }
65
+ function unescapeHtml(str) {
66
+ if (!str) return str;
67
+ const map = {
68
+ "&amp;": "&",
69
+ "&lt;": "<",
70
+ "&gt;": ">",
71
+ "&quot;": '"',
72
+ "&#39;": "'"
73
+ };
74
+ return str.replace(/&amp;|&lt;|&gt;|&quot;|&#39;/g, (char) => map[char]);
75
+ }
76
+ function template(template2, data) {
77
+ if (!template2) return template2;
78
+ return template2.replace(/\{\{(\w+)\}\}/g, (match, key) => {
79
+ const value = data[key];
80
+ return value !== void 0 && value !== null ? String(value) : match;
81
+ });
82
+ }
83
+ function highlight(text, keyword, tag = "mark") {
84
+ if (!text || !keyword) return text;
85
+ const regex = new RegExp(`(${escapeRegex(keyword)})`, "gi");
86
+ return text.replace(regex, `<${tag}>$1</${tag}>`);
87
+ }
88
+ function escapeRegex(str) {
89
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
90
+ }
91
+
92
+ export { camelCase, capitalize, escapeHtml, highlight, kebabCase, mask, maskEmail, maskPhone, pascalCase, removeAccents, slugify, snakeCase, template, truncate, unescapeHtml };
93
+ //# sourceMappingURL=chunk-XJTZDXSR.mjs.map
94
+ //# sourceMappingURL=chunk-XJTZDXSR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/string.ts"],"names":["template"],"mappings":"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","file":"chunk-XJTZDXSR.mjs","sourcesContent":["/**\n * 字符串工具函数\n */\n\n/**\n * 首字母大写\n * @param str - 输入字符串\n * @returns 首字母大写的字符串\n */\nexport function capitalize(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\n/**\n * 驼峰命名转换\n * @param str - 输入字符串(支持 kebab-case, snake_case, space separated)\n * @returns 驼峰命名字符串\n */\nexport function camelCase(str: string): string {\n if (!str) return str;\n\n // 先转换为小写,然后按空格、短横线、下划线分割\n const words = str\n .replace(/[A-Z]/g, letter => ` ${letter.toLowerCase()}`)\n .split(/[\\s\\-_]+/)\n .filter(word => word.length > 0);\n\n if (words.length === 0) return '';\n\n // 第一个单词全小写,后续单词首字母大写\n return (\n words[0].toLowerCase() +\n words\n .slice(1)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n );\n}\n\n/**\n * 短横线命名转换\n * @param str - 输入字符串\n * @returns kebab-case 字符串\n */\nexport function kebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * 截断字符串\n * @param str - 输入字符串\n * @param length - 最大长度\n * @param suffix - 后缀,默认为 '...'\n * @returns 截断后的字符串\n */\nexport function truncate(str: string, length: number, suffix = '...'): string {\n if (str.length <= length) return str;\n return str.slice(0, length - suffix.length) + suffix;\n}\n\n/**\n * 下划线命名转换\n * @param str - 输入字符串\n * @returns snake_case 字符串\n */\nexport function snakeCase(str: string): string {\n if (!str) return str;\n return str\n .replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`)\n .replace(/[\\s-]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toLowerCase();\n}\n\n/**\n * 帕斯卡命名转换\n * @param str - 输入字符串(支持 kebab-case, snake_case, space separated)\n * @returns PascalCase 字符串\n */\nexport function pascalCase(str: string): string {\n if (!str) return str;\n const camel = camelCase(str);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n}\n\n/**\n * 字符串脱敏\n * @param str - 输入字符串\n * @param options - 脱敏选项\n * @returns 脱敏后的字符串\n */\nexport function mask(\n str: string,\n options: {\n start?: number;\n end?: number;\n maskChar?: string;\n } = {}\n): string {\n if (!str) return str;\n const { start = 0, end = str.length, maskChar = '*' } = options;\n const startIndex = Math.max(0, start);\n const endIndex = Math.min(str.length, end);\n if (startIndex >= endIndex) return str;\n return str.slice(0, startIndex) + maskChar.repeat(endIndex - startIndex) + str.slice(endIndex);\n}\n\n/**\n * 手机号脱敏(默认显示前3位和后4位)\n * @param phone - 手机号\n * @returns 脱敏后的手机号\n */\nexport function maskPhone(phone: string): string {\n if (!phone || phone.length < 7) return phone;\n return mask(phone, { start: 3, end: phone.length - 4 });\n}\n\n/**\n * 邮箱脱敏(默认显示前2位和@后的域名)\n * @param email - 邮箱地址\n * @returns 脱敏后的邮箱\n */\nexport function maskEmail(email: string): string {\n if (!email || !email.includes('@')) return email;\n const [local, domain] = email.split('@');\n if (local.length <= 2) return email;\n return `${local.slice(0, 2)}***@${domain}`;\n}\n\n/**\n * URL友好的字符串转换(slugify)\n * @param str - 输入字符串\n * @returns URL友好的字符串\n */\nexport function slugify(str: string): string {\n if (!str) return '';\n return str\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/**\n * 移除重音符号\n * @param str - 输入字符串\n * @returns 移除重音后的字符串\n */\nexport function removeAccents(str: string): string {\n if (!str) return str;\n return str.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n}\n\n/**\n * HTML转义\n * @param str - 输入字符串\n * @returns 转义后的字符串\n */\nexport function escapeHtml(str: string): string {\n if (!str) return str;\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n };\n return str.replace(/[&<>\"']/g, char => map[char]);\n}\n\n/**\n * HTML反转义\n * @param str - 输入字符串\n * @returns 反转义后的字符串\n */\nexport function unescapeHtml(str: string): string {\n if (!str) return str;\n const map: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n };\n return str.replace(/&amp;|&lt;|&gt;|&quot;|&#39;/g, char => map[char]);\n}\n\n/**\n * 模板字符串替换\n * @param template - 模板字符串,使用 {{key}} 作为占位符\n * @param data - 替换数据对象\n * @returns 替换后的字符串\n */\nexport function template(template: string, data: Record<string, unknown>): string {\n if (!template) return template;\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n const value = data[key];\n return value !== undefined && value !== null ? String(value) : match;\n });\n}\n\n/**\n * 关键词高亮\n * @param text - 文本内容\n * @param keyword - 关键词\n * @param tag - 高亮标签,默认为 'mark'\n * @returns 高亮后的HTML字符串\n */\nexport function highlight(text: string, keyword: string, tag = 'mark'): string {\n if (!text || !keyword) return text;\n const regex = new RegExp(`(${escapeRegex(keyword)})`, 'gi');\n return text.replace(regex, `<${tag}>$1</${tag}>`);\n}\n\n/**\n * 转义正则表达式特殊字符\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n"]}
@@ -0,0 +1,361 @@
1
+ 'use strict';
2
+
3
+ var chunkDYBSRI7V_js = require('./chunk-DYBSRI7V.js');
4
+
5
+ // src/browser/storage.ts
6
+ var globalKeyPair = null;
7
+ function setStorageKeyPair(keyPair) {
8
+ globalKeyPair = keyPair;
9
+ }
10
+ function getStorageKeyPair() {
11
+ return globalKeyPair;
12
+ }
13
+ async function encryptValue(value, publicKey) {
14
+ return chunkDYBSRI7V_js.rsaEncrypt(value, publicKey);
15
+ }
16
+ async function decryptValue(encryptedValue, privateKey) {
17
+ try {
18
+ return await chunkDYBSRI7V_js.rsaDecrypt(encryptedValue, privateKey);
19
+ } catch {
20
+ try {
21
+ JSON.parse(encryptedValue);
22
+ return encryptedValue;
23
+ } catch {
24
+ throw new Error("Failed to decrypt storage value");
25
+ }
26
+ }
27
+ }
28
+ var localStorage = {
29
+ /**
30
+ * 设置值
31
+ * @param key - 键
32
+ * @param value - 值
33
+ * @param options - 选项(过期时间、密钥等)
34
+ * @returns Promise<void>
35
+ */
36
+ async set(key, value, options = {}) {
37
+ if (typeof window === "undefined" || !window.localStorage) {
38
+ throw new Error("localStorage is not available");
39
+ }
40
+ const { expiry, publicKey } = options;
41
+ const item = {
42
+ value,
43
+ expiry: expiry ? Date.now() + expiry : void 0
44
+ };
45
+ try {
46
+ const jsonStr = JSON.stringify(item);
47
+ const keyToUse = publicKey || globalKeyPair?.publicKey;
48
+ if (keyToUse) {
49
+ const encrypted = await encryptValue(jsonStr, keyToUse);
50
+ window.localStorage.setItem(key, encrypted);
51
+ } else {
52
+ const { base64Encode } = await import('./crypto.js');
53
+ const encoded = base64Encode(jsonStr);
54
+ window.localStorage.setItem(key, encoded);
55
+ }
56
+ } catch (error) {
57
+ console.error("localStorage.set error:", error);
58
+ throw error;
59
+ }
60
+ },
61
+ /**
62
+ * 获取值
63
+ * @param key - 键
64
+ * @param options - 选项(默认值、私钥等)
65
+ * @returns Promise<T | undefined> 值或默认值
66
+ */
67
+ async get(key, options = {}) {
68
+ if (typeof window === "undefined" || !window.localStorage) {
69
+ return options.defaultValue;
70
+ }
71
+ const { defaultValue, privateKey } = options;
72
+ try {
73
+ const encryptedStr = window.localStorage.getItem(key);
74
+ if (!encryptedStr) return defaultValue;
75
+ let decryptedStr;
76
+ const keyToUse = privateKey || globalKeyPair?.privateKey;
77
+ if (keyToUse) {
78
+ try {
79
+ decryptedStr = await decryptValue(encryptedStr, keyToUse);
80
+ } catch {
81
+ const { base64Decode } = await import('./crypto.js');
82
+ try {
83
+ decryptedStr = base64Decode(encryptedStr);
84
+ } catch {
85
+ return defaultValue;
86
+ }
87
+ }
88
+ } else {
89
+ const { base64Decode } = await import('./crypto.js');
90
+ try {
91
+ decryptedStr = base64Decode(encryptedStr);
92
+ } catch {
93
+ return defaultValue;
94
+ }
95
+ }
96
+ const item = JSON.parse(decryptedStr);
97
+ if (item.expiry && Date.now() > item.expiry) {
98
+ window.localStorage.removeItem(key);
99
+ return defaultValue;
100
+ }
101
+ return item.value;
102
+ } catch {
103
+ return defaultValue;
104
+ }
105
+ },
106
+ /**
107
+ * 移除值
108
+ * @param key - 键
109
+ */
110
+ remove(key) {
111
+ if (typeof window === "undefined" || !window.localStorage) return;
112
+ try {
113
+ window.localStorage.removeItem(key);
114
+ } catch (error) {
115
+ console.error("localStorage.remove error:", error);
116
+ }
117
+ },
118
+ /**
119
+ * 清空所有值
120
+ */
121
+ clear() {
122
+ if (typeof window === "undefined" || !window.localStorage) return;
123
+ try {
124
+ window.localStorage.clear();
125
+ } catch (error) {
126
+ console.error("localStorage.clear error:", error);
127
+ }
128
+ },
129
+ /**
130
+ * 获取所有键
131
+ * @returns 键数组
132
+ */
133
+ keys() {
134
+ if (typeof window === "undefined" || !window.localStorage) return [];
135
+ const keys = [];
136
+ try {
137
+ for (let i = 0; i < window.localStorage.length; i++) {
138
+ const key = window.localStorage.key(i);
139
+ if (key) keys.push(key);
140
+ }
141
+ } catch (error) {
142
+ console.error("localStorage.keys error:", error);
143
+ }
144
+ return keys;
145
+ }
146
+ };
147
+ var sessionStorage = {
148
+ /**
149
+ * 设置值
150
+ * @param key - 键
151
+ * @param value - 值
152
+ * @param options - 选项(公钥等)
153
+ * @returns Promise<void>
154
+ */
155
+ async set(key, value, options = {}) {
156
+ if (typeof window === "undefined" || !window.sessionStorage) {
157
+ throw new Error("sessionStorage is not available");
158
+ }
159
+ const { publicKey } = options;
160
+ try {
161
+ const jsonStr = JSON.stringify(value);
162
+ const keyToUse = publicKey || globalKeyPair?.publicKey;
163
+ if (keyToUse) {
164
+ const encrypted = await encryptValue(jsonStr, keyToUse);
165
+ window.sessionStorage.setItem(key, encrypted);
166
+ } else {
167
+ const { base64Encode } = await import('./crypto.js');
168
+ const encoded = base64Encode(jsonStr);
169
+ window.sessionStorage.setItem(key, encoded);
170
+ }
171
+ } catch (error) {
172
+ console.error("sessionStorage.set error:", error);
173
+ throw error;
174
+ }
175
+ },
176
+ /**
177
+ * 获取值
178
+ * @param key - 键
179
+ * @param options - 选项(默认值、私钥等)
180
+ * @returns Promise<T | undefined> 值或默认值
181
+ */
182
+ async get(key, options = {}) {
183
+ if (typeof window === "undefined" || !window.sessionStorage) {
184
+ return options.defaultValue;
185
+ }
186
+ const { defaultValue, privateKey } = options;
187
+ try {
188
+ const encryptedStr = window.sessionStorage.getItem(key);
189
+ if (!encryptedStr) return defaultValue;
190
+ let decryptedStr;
191
+ const keyToUse = privateKey || globalKeyPair?.privateKey;
192
+ if (keyToUse) {
193
+ try {
194
+ decryptedStr = await decryptValue(encryptedStr, keyToUse);
195
+ } catch {
196
+ const { base64Decode } = await import('./crypto.js');
197
+ try {
198
+ decryptedStr = base64Decode(encryptedStr);
199
+ } catch {
200
+ return defaultValue;
201
+ }
202
+ }
203
+ } else {
204
+ const { base64Decode } = await import('./crypto.js');
205
+ try {
206
+ decryptedStr = base64Decode(encryptedStr);
207
+ } catch {
208
+ return defaultValue;
209
+ }
210
+ }
211
+ return JSON.parse(decryptedStr);
212
+ } catch {
213
+ return defaultValue;
214
+ }
215
+ },
216
+ /**
217
+ * 移除值
218
+ * @param key - 键
219
+ */
220
+ remove(key) {
221
+ if (typeof window === "undefined" || !window.sessionStorage) return;
222
+ try {
223
+ window.sessionStorage.removeItem(key);
224
+ } catch (error) {
225
+ console.error("sessionStorage.remove error:", error);
226
+ }
227
+ },
228
+ /**
229
+ * 清空所有值
230
+ */
231
+ clear() {
232
+ if (typeof window === "undefined" || !window.sessionStorage) return;
233
+ try {
234
+ window.sessionStorage.clear();
235
+ } catch (error) {
236
+ console.error("sessionStorage.clear error:", error);
237
+ }
238
+ }
239
+ };
240
+ var cookie = {
241
+ /**
242
+ * 设置Cookie
243
+ * @param key - 键
244
+ * @param value - 值
245
+ * @param options - Cookie选项
246
+ */
247
+ set(key, value, options = {}) {
248
+ if (typeof document === "undefined") {
249
+ throw new Error("document is not available");
250
+ }
251
+ let cookieStr = `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
252
+ if (options.expires) {
253
+ const expiresDate = options.expires instanceof Date ? options.expires : new Date(Date.now() + options.expires * 24 * 60 * 60 * 1e3);
254
+ cookieStr += `; expires=${expiresDate.toUTCString()}`;
255
+ }
256
+ if (options.path) cookieStr += `; path=${options.path}`;
257
+ if (options.domain) cookieStr += `; domain=${options.domain}`;
258
+ if (options.secure) cookieStr += "; secure";
259
+ if (options.sameSite) cookieStr += `; sameSite=${options.sameSite}`;
260
+ document.cookie = cookieStr;
261
+ },
262
+ /**
263
+ * 获取Cookie
264
+ * @param key - 键
265
+ * @returns Cookie值
266
+ */
267
+ get(key) {
268
+ if (typeof document === "undefined") return void 0;
269
+ const name = encodeURIComponent(key);
270
+ const cookies = document.cookie.split(";");
271
+ for (const cookie2 of cookies) {
272
+ const [cookieKey, cookieValue] = cookie2.trim().split("=");
273
+ if (cookieKey === name) {
274
+ return decodeURIComponent(cookieValue);
275
+ }
276
+ }
277
+ return void 0;
278
+ },
279
+ /**
280
+ * 移除Cookie
281
+ * @param key - 键
282
+ * @param options - Cookie选项
283
+ */
284
+ remove(key, options = {}) {
285
+ cookie.set(key, "", {
286
+ ...options,
287
+ expires: /* @__PURE__ */ new Date(0)
288
+ });
289
+ },
290
+ /**
291
+ * 获取所有Cookie
292
+ * @returns Cookie对象
293
+ */
294
+ getAll() {
295
+ if (typeof document === "undefined") return {};
296
+ const cookies = {};
297
+ document.cookie.split(";").forEach((cookieStr) => {
298
+ const [key, value] = cookieStr.trim().split("=");
299
+ if (key && value) {
300
+ cookies[decodeURIComponent(key)] = decodeURIComponent(value);
301
+ }
302
+ });
303
+ return cookies;
304
+ }
305
+ };
306
+ var storage = {
307
+ /**
308
+ * 设置值(优先使用localStorage,失败则使用sessionStorage)
309
+ * @param key - 键
310
+ * @param value - 值
311
+ * @param options - 选项(过期时间、公钥等)
312
+ * @returns Promise<void>
313
+ */
314
+ async set(key, value, options = {}) {
315
+ try {
316
+ await localStorage.set(key, value, options);
317
+ } catch {
318
+ try {
319
+ await sessionStorage.set(key, value, { publicKey: options.publicKey });
320
+ } catch {
321
+ console.warn("Both localStorage and sessionStorage are not available");
322
+ }
323
+ }
324
+ },
325
+ /**
326
+ * 获取值
327
+ * @param key - 键
328
+ * @param options - 选项(默认值、私钥等)
329
+ * @returns Promise<T | undefined> 值或默认值
330
+ */
331
+ async get(key, options = {}) {
332
+ const localValue = await localStorage.get(key, options);
333
+ if (localValue !== void 0) return localValue;
334
+ const sessionValue = await sessionStorage.get(key, options);
335
+ return sessionValue !== void 0 ? sessionValue : options.defaultValue;
336
+ },
337
+ /**
338
+ * 移除值
339
+ * @param key - 键
340
+ */
341
+ remove(key) {
342
+ localStorage.remove(key);
343
+ sessionStorage.remove(key);
344
+ },
345
+ /**
346
+ * 清空所有值
347
+ */
348
+ clear() {
349
+ localStorage.clear();
350
+ sessionStorage.clear();
351
+ }
352
+ };
353
+
354
+ exports.cookie = cookie;
355
+ exports.getStorageKeyPair = getStorageKeyPair;
356
+ exports.localStorage = localStorage;
357
+ exports.sessionStorage = sessionStorage;
358
+ exports.setStorageKeyPair = setStorageKeyPair;
359
+ exports.storage = storage;
360
+ //# sourceMappingURL=chunk-XVUE53T3.js.map
361
+ //# sourceMappingURL=chunk-XVUE53T3.js.map