@alibarbar/common 1.0.9 → 1.0.10

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 (176) hide show
  1. package/dist/{chunk-O3O67R4I.js → algorithm.cjs} +0 -2
  2. package/dist/algorithm.js +130 -44
  3. package/dist/{chunk-LOAZSPGQ.js → array.cjs} +0 -2
  4. package/dist/array.js +135 -84
  5. package/dist/{chunk-Y364QIQH.js → color.cjs} +0 -2
  6. package/dist/color.js +127 -40
  7. package/dist/{chunk-DYBSRI7V.js → crypto.cjs} +0 -2
  8. package/dist/crypto.js +172 -60
  9. package/dist/{chunk-BHCRFURU.js → data-structure.cjs} +0 -2
  10. package/dist/data-structure.js +481 -32
  11. package/dist/{chunk-I3L42475.js → date.cjs} +0 -2
  12. package/dist/date.js +125 -72
  13. package/dist/{chunk-JK2SE3I2.js → dom.cjs} +0 -2
  14. package/dist/dom.js +84 -56
  15. package/dist/{chunk-7V5UQXIO.js → file.cjs} +0 -2
  16. package/dist/file.js +79 -32
  17. package/dist/{chunk-OX5PLOWB.js → i18n.cjs} +0 -2
  18. package/dist/i18n.js +78 -40
  19. package/dist/index.cjs +4132 -0
  20. package/dist/index.d.mts +3 -159
  21. package/dist/index.d.ts +3 -159
  22. package/dist/index.js +3364 -17427
  23. package/dist/{chunk-4RGXV4SJ.js → network.cjs} +0 -2
  24. package/dist/network.js +97 -28
  25. package/dist/{chunk-3FRYJPHG.js → number.cjs} +0 -2
  26. package/dist/number.js +77 -56
  27. package/dist/{chunk-27UDDVLZ.js → object.cjs} +0 -2
  28. package/dist/object.js +237 -80
  29. package/dist/{chunk-JQZBPAPO.js → performance.cjs} +0 -2
  30. package/dist/performance.js +145 -40
  31. package/dist/services.cjs +291 -0
  32. package/dist/services.d.mts +161 -0
  33. package/dist/services.d.ts +161 -0
  34. package/dist/services.js +281 -0
  35. package/dist/{chunk-WZDOPUJW.js → storage.cjs} +216 -17
  36. package/dist/storage.js +550 -31
  37. package/dist/{chunk-D7CS5EKF.js → string.cjs} +0 -2
  38. package/dist/string.js +91 -68
  39. package/dist/{chunk-56W6YECK.js → tracking.cjs} +0 -2
  40. package/dist/tracking.js +359 -52
  41. package/dist/{chunk-ZDMFMUDR.js → transform.cjs} +0 -2
  42. package/dist/transform.js +299 -32
  43. package/dist/{chunk-NJARVI6X.mjs → upload.cjs} +41 -14
  44. package/dist/upload.js +402 -20
  45. package/dist/{chunk-KGFTD255.js → url.cjs} +0 -2
  46. package/dist/url.js +91 -44
  47. package/dist/{chunk-TQN37HIN.js → validation.cjs} +0 -2
  48. package/dist/validation.js +77 -60
  49. package/package.json +7 -2
  50. package/dist/algorithm.js.map +0 -1
  51. package/dist/algorithm.mjs +0 -4
  52. package/dist/algorithm.mjs.map +0 -1
  53. package/dist/array.js.map +0 -1
  54. package/dist/array.mjs +0 -4
  55. package/dist/array.mjs.map +0 -1
  56. package/dist/chunk-27UDDVLZ.js.map +0 -1
  57. package/dist/chunk-2R2QWFJC.mjs +0 -138
  58. package/dist/chunk-2R2QWFJC.mjs.map +0 -1
  59. package/dist/chunk-3FRYJPHG.js.map +0 -1
  60. package/dist/chunk-4RGXV4SJ.js.map +0 -1
  61. package/dist/chunk-56W6YECK.js.map +0 -1
  62. package/dist/chunk-5BGSUGTI.mjs +0 -128
  63. package/dist/chunk-5BGSUGTI.mjs.map +0 -1
  64. package/dist/chunk-7E6GELHJ.mjs +0 -302
  65. package/dist/chunk-7E6GELHJ.mjs.map +0 -1
  66. package/dist/chunk-7V5UQXIO.js.map +0 -1
  67. package/dist/chunk-A4SWQXX7.mjs +0 -484
  68. package/dist/chunk-A4SWQXX7.mjs.map +0 -1
  69. package/dist/chunk-BHCRFURU.js.map +0 -1
  70. package/dist/chunk-CDSGEAOK.mjs +0 -80
  71. package/dist/chunk-CDSGEAOK.mjs.map +0 -1
  72. package/dist/chunk-D7CS5EKF.js.map +0 -1
  73. package/dist/chunk-DYBSRI7V.js.map +0 -1
  74. package/dist/chunk-FEBKPX5A.js +0 -386
  75. package/dist/chunk-FEBKPX5A.js.map +0 -1
  76. package/dist/chunk-FJ6ZGZIA.mjs +0 -39
  77. package/dist/chunk-FJ6ZGZIA.mjs.map +0 -1
  78. package/dist/chunk-HLDFI7R2.mjs +0 -175
  79. package/dist/chunk-HLDFI7R2.mjs.map +0 -1
  80. package/dist/chunk-I3L42475.js.map +0 -1
  81. package/dist/chunk-JBLX27WD.mjs +0 -240
  82. package/dist/chunk-JBLX27WD.mjs.map +0 -1
  83. package/dist/chunk-JHZ7M2MR.mjs +0 -133
  84. package/dist/chunk-JHZ7M2MR.mjs.map +0 -1
  85. package/dist/chunk-JK2SE3I2.js.map +0 -1
  86. package/dist/chunk-JQZBPAPO.js.map +0 -1
  87. package/dist/chunk-JXYGC2C5.mjs +0 -100
  88. package/dist/chunk-JXYGC2C5.mjs.map +0 -1
  89. package/dist/chunk-KGFTD255.js.map +0 -1
  90. package/dist/chunk-LBHBNPNJ.mjs +0 -148
  91. package/dist/chunk-LBHBNPNJ.mjs.map +0 -1
  92. package/dist/chunk-LF4CILQS.mjs +0 -87
  93. package/dist/chunk-LF4CILQS.mjs.map +0 -1
  94. package/dist/chunk-LOAZSPGQ.js.map +0 -1
  95. package/dist/chunk-NJARVI6X.mjs.map +0 -1
  96. package/dist/chunk-NSSDYX2U.mjs +0 -80
  97. package/dist/chunk-NSSDYX2U.mjs.map +0 -1
  98. package/dist/chunk-O3O67R4I.js.map +0 -1
  99. package/dist/chunk-OIXQ3E6W.mjs +0 -354
  100. package/dist/chunk-OIXQ3E6W.mjs.map +0 -1
  101. package/dist/chunk-OX5PLOWB.js.map +0 -1
  102. package/dist/chunk-PJ7UCTX4.mjs +0 -362
  103. package/dist/chunk-PJ7UCTX4.mjs.map +0 -1
  104. package/dist/chunk-PR4QN5HX.js +0 -44
  105. package/dist/chunk-PR4QN5HX.js.map +0 -1
  106. package/dist/chunk-QIBE7GVN.mjs +0 -81
  107. package/dist/chunk-QIBE7GVN.mjs.map +0 -1
  108. package/dist/chunk-QIOC54LQ.mjs +0 -130
  109. package/dist/chunk-QIOC54LQ.mjs.map +0 -1
  110. package/dist/chunk-TQN37HIN.js.map +0 -1
  111. package/dist/chunk-WZDOPUJW.js.map +0 -1
  112. package/dist/chunk-XJTZDXSR.mjs +0 -94
  113. package/dist/chunk-XJTZDXSR.mjs.map +0 -1
  114. package/dist/chunk-Y364QIQH.js.map +0 -1
  115. package/dist/chunk-YXM6Q4JS.mjs +0 -94
  116. package/dist/chunk-YXM6Q4JS.mjs.map +0 -1
  117. package/dist/chunk-ZDMFMUDR.js.map +0 -1
  118. package/dist/chunk-ZVJ6NQUM.mjs +0 -82
  119. package/dist/chunk-ZVJ6NQUM.mjs.map +0 -1
  120. package/dist/color.js.map +0 -1
  121. package/dist/color.mjs +0 -4
  122. package/dist/color.mjs.map +0 -1
  123. package/dist/crypto.js.map +0 -1
  124. package/dist/crypto.mjs +0 -4
  125. package/dist/crypto.mjs.map +0 -1
  126. package/dist/data-structure.js.map +0 -1
  127. package/dist/data-structure.mjs +0 -4
  128. package/dist/data-structure.mjs.map +0 -1
  129. package/dist/date.js.map +0 -1
  130. package/dist/date.mjs +0 -4
  131. package/dist/date.mjs.map +0 -1
  132. package/dist/dom.js.map +0 -1
  133. package/dist/dom.mjs +0 -4
  134. package/dist/dom.mjs.map +0 -1
  135. package/dist/file.js.map +0 -1
  136. package/dist/file.mjs +0 -4
  137. package/dist/file.mjs.map +0 -1
  138. package/dist/i18n.js.map +0 -1
  139. package/dist/i18n.mjs +0 -4
  140. package/dist/i18n.mjs.map +0 -1
  141. package/dist/index.js.map +0 -1
  142. package/dist/index.mjs +0 -17155
  143. package/dist/index.mjs.map +0 -1
  144. package/dist/network.js.map +0 -1
  145. package/dist/network.mjs +0 -4
  146. package/dist/network.mjs.map +0 -1
  147. package/dist/number.js.map +0 -1
  148. package/dist/number.mjs +0 -4
  149. package/dist/number.mjs.map +0 -1
  150. package/dist/object.js.map +0 -1
  151. package/dist/object.mjs +0 -4
  152. package/dist/object.mjs.map +0 -1
  153. package/dist/performance.js.map +0 -1
  154. package/dist/performance.mjs +0 -4
  155. package/dist/performance.mjs.map +0 -1
  156. package/dist/storage.js.map +0 -1
  157. package/dist/storage.mjs +0 -5
  158. package/dist/storage.mjs.map +0 -1
  159. package/dist/string.js.map +0 -1
  160. package/dist/string.mjs +0 -4
  161. package/dist/string.mjs.map +0 -1
  162. package/dist/tracking.js.map +0 -1
  163. package/dist/tracking.mjs +0 -4
  164. package/dist/tracking.mjs.map +0 -1
  165. package/dist/transform.js.map +0 -1
  166. package/dist/transform.mjs +0 -4
  167. package/dist/transform.mjs.map +0 -1
  168. package/dist/upload.js.map +0 -1
  169. package/dist/upload.mjs +0 -5
  170. package/dist/upload.mjs.map +0 -1
  171. package/dist/url.js.map +0 -1
  172. package/dist/url.mjs +0 -4
  173. package/dist/url.mjs.map +0 -1
  174. package/dist/validation.js.map +0 -1
  175. package/dist/validation.mjs +0 -4
  176. package/dist/validation.mjs.map +0 -1
@@ -1,175 +0,0 @@
1
- // src/helper/crypto.ts
2
- async function sha256(data) {
3
- const buffer = typeof data === "string" ? new TextEncoder().encode(data) : data;
4
- const hashBuffer = await crypto.subtle.digest("SHA-256", buffer);
5
- const hashArray = Array.from(new Uint8Array(hashBuffer));
6
- return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
7
- }
8
- function base64Encode(data) {
9
- if (typeof data === "string") {
10
- return btoa(unescape(encodeURIComponent(data)));
11
- }
12
- const bytes = new Uint8Array(data);
13
- let binary = "";
14
- for (let i = 0; i < bytes.length; i++) {
15
- binary += String.fromCharCode(bytes[i]);
16
- }
17
- return btoa(binary);
18
- }
19
- function base64Decode(data) {
20
- try {
21
- return decodeURIComponent(escape(atob(data)));
22
- } catch {
23
- throw new Error("Invalid Base64 string");
24
- }
25
- }
26
- function generateUUID() {
27
- if (typeof crypto !== "undefined" && crypto.randomUUID) {
28
- return crypto.randomUUID();
29
- }
30
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
31
- const r = Math.random() * 16 | 0;
32
- const v = c === "x" ? r : r & 3 | 8;
33
- return v.toString(16);
34
- });
35
- }
36
- function generateRandomString(length, charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") {
37
- let result = "";
38
- for (let i = 0; i < length; i++) {
39
- result += charset.charAt(Math.floor(Math.random() * charset.length));
40
- }
41
- return result;
42
- }
43
- function hash(data) {
44
- let hashValue = 0;
45
- for (let i = 0; i < data.length; i++) {
46
- const char = data.charCodeAt(i);
47
- hashValue = (hashValue << 5) - hashValue + char;
48
- hashValue = hashValue & hashValue;
49
- }
50
- return Math.abs(hashValue);
51
- }
52
- async function generateRSAKeyPair(modulusLength = 2048) {
53
- if (typeof crypto === "undefined" || !crypto.subtle) {
54
- throw new Error("Web Crypto API is not available");
55
- }
56
- const keyPair = await crypto.subtle.generateKey(
57
- {
58
- name: "RSA-OAEP",
59
- modulusLength,
60
- publicExponent: new Uint8Array([1, 0, 1]),
61
- hash: "SHA-256"
62
- },
63
- true,
64
- ["encrypt", "decrypt"]
65
- );
66
- return {
67
- publicKey: keyPair.publicKey,
68
- privateKey: keyPair.privateKey
69
- };
70
- }
71
- async function rsaEncrypt(data, publicKey) {
72
- if (typeof crypto === "undefined" || !crypto.subtle) {
73
- throw new Error("Web Crypto API is not available");
74
- }
75
- const encoder = new TextEncoder();
76
- const dataBuffer = encoder.encode(data);
77
- const maxChunkSize = 245;
78
- const chunks = [];
79
- for (let i = 0; i < dataBuffer.length; i += maxChunkSize) {
80
- const chunk = dataBuffer.slice(i, i + maxChunkSize);
81
- const encrypted = await crypto.subtle.encrypt(
82
- {
83
- name: "RSA-OAEP"
84
- },
85
- publicKey,
86
- chunk
87
- );
88
- chunks.push(encrypted);
89
- }
90
- const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
91
- const merged = new Uint8Array(totalLength);
92
- let offset = 0;
93
- for (const chunk of chunks) {
94
- merged.set(new Uint8Array(chunk), offset);
95
- offset += chunk.byteLength;
96
- }
97
- return base64Encode(merged.buffer);
98
- }
99
- async function rsaDecrypt(encryptedData, privateKey) {
100
- if (typeof crypto === "undefined" || !crypto.subtle) {
101
- throw new Error("Web Crypto API is not available");
102
- }
103
- const binaryString = atob(encryptedData);
104
- const encryptedArray = new Uint8Array(binaryString.length);
105
- for (let i = 0; i < binaryString.length; i++) {
106
- encryptedArray[i] = binaryString.charCodeAt(i);
107
- }
108
- const chunkSize = 256;
109
- const chunks = [];
110
- for (let i = 0; i < encryptedArray.length; i += chunkSize) {
111
- const chunk = encryptedArray.slice(i, i + chunkSize);
112
- const decrypted = await crypto.subtle.decrypt(
113
- {
114
- name: "RSA-OAEP"
115
- },
116
- privateKey,
117
- chunk
118
- );
119
- const decoder = new TextDecoder();
120
- chunks.push(decoder.decode(decrypted));
121
- }
122
- return chunks.join("");
123
- }
124
- async function exportPublicKey(publicKey) {
125
- if (typeof crypto === "undefined" || !crypto.subtle) {
126
- throw new Error("Web Crypto API is not available");
127
- }
128
- const exported = await crypto.subtle.exportKey("spki", publicKey);
129
- return base64Encode(exported);
130
- }
131
- async function exportPrivateKey(privateKey) {
132
- if (typeof crypto === "undefined" || !crypto.subtle) {
133
- throw new Error("Web Crypto API is not available");
134
- }
135
- const exported = await crypto.subtle.exportKey("pkcs8", privateKey);
136
- return base64Encode(exported);
137
- }
138
- async function importPublicKey(keyData) {
139
- if (typeof crypto === "undefined" || !crypto.subtle) {
140
- throw new Error("Web Crypto API is not available");
141
- }
142
- const keyBuffer = base64Decode(keyData);
143
- const keyArray = new Uint8Array(keyBuffer.split("").map((char) => char.charCodeAt(0)));
144
- return crypto.subtle.importKey(
145
- "spki",
146
- keyArray.buffer,
147
- {
148
- name: "RSA-OAEP",
149
- hash: "SHA-256"
150
- },
151
- true,
152
- ["encrypt"]
153
- );
154
- }
155
- async function importPrivateKey(keyData) {
156
- if (typeof crypto === "undefined" || !crypto.subtle) {
157
- throw new Error("Web Crypto API is not available");
158
- }
159
- const keyBuffer = base64Decode(keyData);
160
- const keyArray = new Uint8Array(keyBuffer.split("").map((char) => char.charCodeAt(0)));
161
- return crypto.subtle.importKey(
162
- "pkcs8",
163
- keyArray.buffer,
164
- {
165
- name: "RSA-OAEP",
166
- hash: "SHA-256"
167
- },
168
- true,
169
- ["decrypt"]
170
- );
171
- }
172
-
173
- export { base64Decode, base64Encode, exportPrivateKey, exportPublicKey, generateRSAKeyPair, generateRandomString, generateUUID, hash, importPrivateKey, importPublicKey, rsaDecrypt, rsaEncrypt, sha256 };
174
- //# sourceMappingURL=chunk-HLDFI7R2.mjs.map
175
- //# sourceMappingURL=chunk-HLDFI7R2.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/helper/crypto.ts"],"names":[],"mappings":"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","file":"chunk-HLDFI7R2.mjs","sourcesContent":["/**\n * 加密工具函数\n */\n\n/**\n * SHA256加密\n * @param data - 要加密的数据(字符串或ArrayBuffer)\n * @returns Promise<string> 加密后的十六进制字符串\n */\nexport async function sha256(data: string | ArrayBuffer): Promise<string> {\n const buffer = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Base64编码\n * @param data - 要编码的数据(字符串或ArrayBuffer)\n * @returns Base64编码字符串\n */\nexport function base64Encode(data: string | ArrayBuffer): string {\n if (typeof data === 'string') {\n return btoa(unescape(encodeURIComponent(data)));\n }\n const bytes = new Uint8Array(data);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Base64解码\n * @param data - Base64编码字符串\n * @returns 解码后的字符串\n */\nexport function base64Decode(data: string): string {\n try {\n return decodeURIComponent(escape(atob(data)));\n } catch {\n throw new Error('Invalid Base64 string');\n }\n}\n\n/**\n * 生成UUID v4\n * @returns UUID字符串\n */\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // 降级方案\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * 生成随机字符串\n * @param length - 字符串长度\n * @param charset - 字符集,默认为 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n * @returns 随机字符串\n */\nexport function generateRandomString(\n length: number,\n charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += charset.charAt(Math.floor(Math.random() * charset.length));\n }\n return result;\n}\n\n/**\n * 通用哈希函数(简单实现)\n * @param data - 要哈希的数据\n * @returns 哈希值\n */\nexport function hash(data: string): number {\n let hashValue = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hashValue = (hashValue << 5) - hashValue + char;\n hashValue = hashValue & hashValue; // 转换为32位整数\n }\n return Math.abs(hashValue);\n}\n\n/**\n * RSA密钥对类型\n */\nexport interface RSAKeyPair {\n publicKey: CryptoKey;\n privateKey: CryptoKey;\n}\n\n/**\n * 生成RSA密钥对\n * @param modulusLength - 密钥长度,默认为 2048\n * @returns Promise<RSAKeyPair> RSA密钥对\n */\nexport async function generateRSAKeyPair(modulusLength = 2048): Promise<RSAKeyPair> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const keyPair = await crypto.subtle.generateKey(\n {\n name: 'RSA-OAEP',\n modulusLength,\n publicExponent: new Uint8Array([1, 0, 1]),\n hash: 'SHA-256',\n },\n true,\n ['encrypt', 'decrypt']\n );\n\n return {\n publicKey: keyPair.publicKey,\n privateKey: keyPair.privateKey,\n };\n}\n\n/**\n * RSA加密\n * @param data - 要加密的数据(字符串)\n * @param publicKey - 公钥\n * @returns Promise<string> Base64编码的加密数据\n */\nexport async function rsaEncrypt(data: string, publicKey: CryptoKey): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const encoder = new TextEncoder();\n const dataBuffer = encoder.encode(data);\n\n // RSA-OAEP 最大加密长度受密钥长度限制\n // 2048位密钥最多加密245字节,需要分块处理\n const maxChunkSize = 245;\n const chunks: ArrayBuffer[] = [];\n\n for (let i = 0; i < dataBuffer.length; i += maxChunkSize) {\n const chunk = dataBuffer.slice(i, i + maxChunkSize);\n const encrypted = await crypto.subtle.encrypt(\n {\n name: 'RSA-OAEP',\n },\n publicKey,\n chunk\n );\n chunks.push(encrypted);\n }\n\n // 将所有加密块合并并转换为Base64\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(new Uint8Array(chunk), offset);\n offset += chunk.byteLength;\n }\n\n return base64Encode(merged.buffer);\n}\n\n/**\n * RSA解密\n * @param encryptedData - Base64编码的加密数据\n * @param privateKey - 私钥\n * @returns Promise<string> 解密后的字符串\n */\nexport async function rsaDecrypt(encryptedData: string, privateKey: CryptoKey): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n // Base64解码为ArrayBuffer\n const binaryString = atob(encryptedData);\n const encryptedArray = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n encryptedArray[i] = binaryString.charCodeAt(i);\n }\n\n // RSA-OAEP 解密块大小(256字节对于2048位密钥)\n const chunkSize = 256;\n const chunks: string[] = [];\n\n for (let i = 0; i < encryptedArray.length; i += chunkSize) {\n const chunk = encryptedArray.slice(i, i + chunkSize);\n const decrypted = await crypto.subtle.decrypt(\n {\n name: 'RSA-OAEP',\n },\n privateKey,\n chunk\n );\n const decoder = new TextDecoder();\n chunks.push(decoder.decode(decrypted));\n }\n\n return chunks.join('');\n}\n\n/**\n * 导出公钥为Base64字符串\n * @param publicKey - 公钥\n * @returns Promise<string> Base64编码的公钥\n */\nexport async function exportPublicKey(publicKey: CryptoKey): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const exported = await crypto.subtle.exportKey('spki', publicKey);\n return base64Encode(exported);\n}\n\n/**\n * 导出私钥为Base64字符串\n * @param privateKey - 私钥\n * @returns Promise<string> Base64编码的私钥\n */\nexport async function exportPrivateKey(privateKey: CryptoKey): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const exported = await crypto.subtle.exportKey('pkcs8', privateKey);\n return base64Encode(exported);\n}\n\n/**\n * 从Base64字符串导入公钥\n * @param keyData - Base64编码的公钥\n * @returns Promise<CryptoKey> 公钥对象\n */\nexport async function importPublicKey(keyData: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const keyBuffer = base64Decode(keyData);\n const keyArray = new Uint8Array(keyBuffer.split('').map(char => char.charCodeAt(0)));\n\n return crypto.subtle.importKey(\n 'spki',\n keyArray.buffer,\n {\n name: 'RSA-OAEP',\n hash: 'SHA-256',\n },\n true,\n ['encrypt']\n );\n}\n\n/**\n * 从Base64字符串导入私钥\n * @param keyData - Base64编码的私钥\n * @returns Promise<CryptoKey> 私钥对象\n */\nexport async function importPrivateKey(keyData: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API is not available');\n }\n\n const keyBuffer = base64Decode(keyData);\n const keyArray = new Uint8Array(keyBuffer.split('').map(char => char.charCodeAt(0)));\n\n return crypto.subtle.importKey(\n 'pkcs8',\n keyArray.buffer,\n {\n name: 'RSA-OAEP',\n hash: 'SHA-256',\n },\n true,\n ['decrypt']\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/date.ts"],"names":[],"mappings":"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","file":"chunk-I3L42475.js","sourcesContent":["/**\n * 日期工具函数\n */\n\n/**\n * 格式化日期\n * @param date - 日期对象或时间戳\n * @param format - 格式字符串,默认 'YYYY-MM-DD HH:mm:ss'\n * @returns 格式化后的日期字符串\n */\nexport function formatDate(date: Date | number, format = 'YYYY-MM-DD HH:mm:ss'): string {\n const d = typeof date === 'number' ? new Date(date) : date;\n\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n const hours = String(d.getHours()).padStart(2, '0');\n const minutes = String(d.getMinutes()).padStart(2, '0');\n const seconds = String(d.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n}\n\n/**\n * 获取相对时间描述\n * @param date - 日期对象或时间戳\n * @returns 相对时间字符串,如 '2分钟前', '3小时前'\n */\nexport function getRelativeTime(date: Date | number): string {\n const now = new Date();\n const target = typeof date === 'number' ? new Date(date) : date;\n const diff = now.getTime() - target.getTime();\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(days / 365);\n\n if (years > 0) return `${years}年前`;\n if (months > 0) return `${months}个月前`;\n if (days > 0) return `${days}天前`;\n if (hours > 0) return `${hours}小时前`;\n if (minutes > 0) return `${minutes}分钟前`;\n if (seconds > 0) return `${seconds}秒前`;\n return '刚刚';\n}\n\n/**\n * 判断是否为今天\n * @param date - 日期对象或时间戳\n * @returns 是否为今天\n */\nexport function isToday(date: Date | number): boolean {\n const d = typeof date === 'number' ? new Date(date) : date;\n const today = new Date();\n return (\n d.getDate() === today.getDate() &&\n d.getMonth() === today.getMonth() &&\n d.getFullYear() === today.getFullYear()\n );\n}\n\n/**\n * 判断是否为昨天\n * @param date - 日期对象或时间戳\n * @returns 是否为昨天\n */\nexport function isYesterday(date: Date | number): boolean {\n const d = typeof date === 'number' ? new Date(date) : date;\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n return (\n d.getDate() === yesterday.getDate() &&\n d.getMonth() === yesterday.getMonth() &&\n d.getFullYear() === yesterday.getFullYear()\n );\n}\n\n/**\n * 根据格林威治时间与当前时区获取时间 格林威治时间:0表示当前时区,1表示东一区,-1表示西一区\n * 需要返回符合该国家的时间格式\n * @param gmt - 格林威治时间偏移量(小时),0表示GMT+0,1表示GMT+1(东一区),-1表示GMT-1(西一区)\n * @returns 格式化后的时间字符串\n */\nexport function getTimeFromGMT(gmt: number): string {\n const now = new Date();\n const localOffset = now.getTimezoneOffset(); // 本地时区偏移(分钟)\n // GMT偏移量转换为分钟,然后计算目标时区的时间\n const gmtOffsetMinutes = gmt * 60;\n const targetTime = new Date(now.getTime() + localOffset * 60000 + gmtOffsetMinutes * 60000);\n // 获取适合该时区的时间格式\n const format = getDateFormatByGMT(gmt);\n return formatDate(targetTime, format);\n}\n\n/**\n * 获取适合指定GMT时区的时间格式\n * 格林威治时间:0表示GMT+0,1表示东一区(GMT+1),-1表示西一区(GMT-1)\n * @param gmt - GMT时区偏移量(小时)\n * @returns 时间格式字符串\n */\nexport function getDateFormatByGMT(gmt: number): string {\n switch (gmt) {\n case 0:\n // GMT+0 (英国、葡萄牙等)\n return 'YYYY-MM-DD HH:mm:ss';\n case 1:\n case 2:\n case 3:\n // GMT+1~+3 (欧洲大部分地区)\n return 'YYYY-MM-DD HH:mm:ss';\n case 8:\n // GMT+8 (中国、新加坡等)\n return 'YYYY-MM-DD HH:mm:ss';\n case 9:\n // GMT+9 (日本、韩国等)\n return 'YYYY-MM-DD HH:mm:ss';\n case -5:\n case -6:\n case -7:\n case -8:\n // GMT-5~-8 (美洲地区)\n return 'MM/DD/YYYY HH:mm:ss';\n default:\n // 默认格式\n return 'YYYY-MM-DD HH:mm:ss';\n }\n}\n\n/**\n * 日期加减(天数)\n * @param date - 日期对象或时间戳\n * @param days - 要加减的天数(正数为加,负数为减)\n * @returns 新的日期对象\n */\nexport function addDays(date: Date | number, days: number): Date {\n const d = typeof date === 'number' ? new Date(date) : new Date(date);\n d.setDate(d.getDate() + days);\n return d;\n}\n\n/**\n * 日期加减(月数)\n * @param date - 日期对象或时间戳\n * @param months - 要加减的月数(正数为加,负数为减)\n * @returns 新的日期对象\n */\nexport function addMonths(date: Date | number, months: number): Date {\n const d = typeof date === 'number' ? new Date(date) : new Date(date);\n d.setMonth(d.getMonth() + months);\n return d;\n}\n\n/**\n * 日期加减(年数)\n * @param date - 日期对象或时间戳\n * @param years - 要加减的年数(正数为加,负数为减)\n * @returns 新的日期对象\n */\nexport function addYears(date: Date | number, years: number): Date {\n const d = typeof date === 'number' ? new Date(date) : new Date(date);\n d.setFullYear(d.getFullYear() + years);\n return d;\n}\n\n/**\n * 计算日期差值(天数)\n * @param date1 - 第一个日期\n * @param date2 - 第二个日期\n * @returns 相差的天数(date1 - date2)\n */\nexport function diffDays(date1: Date | number, date2: Date | number): number {\n const d1 = typeof date1 === 'number' ? new Date(date1) : date1;\n const d2 = typeof date2 === 'number' ? new Date(date2) : date2;\n const diff = d1.getTime() - d2.getTime();\n return Math.floor(diff / (1000 * 60 * 60 * 24));\n}\n\n/**\n * 获取一天的开始时间(00:00:00)\n * @param date - 日期对象或时间戳\n * @returns 一天的开始时间\n */\nexport function startOfDay(date: Date | number): Date {\n const d = typeof date === 'number' ? new Date(date) : new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\n/**\n * 获取一天的结束时间(23:59:59.999)\n * @param date - 日期对象或时间戳\n * @returns 一天的结束时间\n */\nexport function endOfDay(date: Date | number): Date {\n const d = typeof date === 'number' ? new Date(date) : new Date(date);\n d.setHours(23, 59, 59, 999);\n return d;\n}\n\n/**\n * 判断是否为周末\n * @param date - 日期对象或时间戳\n * @returns 是否为周末\n */\nexport function isWeekend(date: Date | number): boolean {\n const d = typeof date === 'number' ? new Date(date) : date;\n const day = d.getDay();\n return day === 0 || day === 6;\n}\n\n/**\n * 判断是否为工作日\n * @param date - 日期对象或时间戳\n * @returns 是否为工作日\n */\nexport function isWeekday(date: Date | number): boolean {\n return !isWeekend(date);\n}\n\n/**\n * 获取周数(ISO 8601标准)\n * @param date - 日期对象或时间戳\n * @returns 周数(1-53)\n */\nexport function getWeekNumber(date: Date | number): number {\n const d = typeof date === 'number' ? new Date(date) : new Date(date);\n const target = new Date(d.valueOf());\n const dayNr = (d.getDay() + 6) % 7;\n target.setDate(target.getDate() - dayNr + 3);\n const firstThursday = target.valueOf();\n target.setMonth(0, 1);\n if (target.getDay() !== 4) {\n target.setMonth(0, 1 + ((4 - target.getDay() + 7) % 7));\n }\n return 1 + Math.ceil((firstThursday - target.valueOf()) / 604800000);\n}\n\n/**\n * 获取季度(1-4)\n * @param date - 日期对象或时间戳\n * @returns 季度(1-4)\n */\nexport function getQuarter(date: Date | number): number {\n const d = typeof date === 'number' ? new Date(date) : date;\n return Math.floor(d.getMonth() / 3) + 1;\n}\n"]}
@@ -1,240 +0,0 @@
1
- // src/core/object.ts
2
- function deepClone(obj) {
3
- if (obj === null || typeof obj !== "object") {
4
- return obj;
5
- }
6
- if (obj instanceof Date) {
7
- return new Date(obj.getTime());
8
- }
9
- if (obj instanceof RegExp) {
10
- return new RegExp(obj.source, obj.flags);
11
- }
12
- if (Array.isArray(obj)) {
13
- return obj.map((item) => deepClone(item));
14
- }
15
- if (obj instanceof Map) {
16
- const clonedMap = /* @__PURE__ */ new Map();
17
- obj.forEach((value, key) => {
18
- clonedMap.set(deepClone(key), deepClone(value));
19
- });
20
- return clonedMap;
21
- }
22
- if (obj instanceof Set) {
23
- const clonedSet = /* @__PURE__ */ new Set();
24
- obj.forEach((value) => {
25
- clonedSet.add(deepClone(value));
26
- });
27
- return clonedSet;
28
- }
29
- if (typeof obj === "object") {
30
- const clonedObj = {};
31
- for (const key in obj) {
32
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
33
- clonedObj[key] = deepClone(obj[key]);
34
- }
35
- }
36
- return clonedObj;
37
- }
38
- return obj;
39
- }
40
- function merge(target, ...sources) {
41
- return Object.assign({}, target, ...sources);
42
- }
43
- function deepMerge(target, ...sources) {
44
- if (!sources.length) return target;
45
- const source = sources.shift();
46
- if (!source) {
47
- return deepMerge(target, ...sources);
48
- }
49
- if (isObject(target) && isObject(source)) {
50
- for (const key in source) {
51
- if (Object.prototype.hasOwnProperty.call(source, key)) {
52
- const sourceValue = source[key];
53
- const targetValue = target[key];
54
- if (isObject(sourceValue) && isObject(targetValue)) {
55
- target[key] = deepMerge(
56
- targetValue,
57
- sourceValue
58
- );
59
- } else if (sourceValue !== void 0) {
60
- target[key] = sourceValue;
61
- }
62
- }
63
- }
64
- }
65
- return deepMerge(target, ...sources);
66
- }
67
- function isObject(item) {
68
- return item !== null && typeof item === "object" && !Array.isArray(item) && !(item instanceof Date) && !(item instanceof RegExp) && !(item instanceof Map) && !(item instanceof Set);
69
- }
70
- function get(obj, path, defaultValue) {
71
- if (!obj || typeof obj !== "object") {
72
- return defaultValue;
73
- }
74
- const keys2 = Array.isArray(path) ? path : path.split(".");
75
- if (keys2.length === 0) {
76
- return defaultValue;
77
- }
78
- let result = obj;
79
- for (const key of keys2) {
80
- if (result == null || typeof result !== "object" || Array.isArray(result)) {
81
- return defaultValue;
82
- }
83
- const record = result;
84
- if (!(key in record)) {
85
- return defaultValue;
86
- }
87
- result = record[key];
88
- }
89
- return result !== void 0 ? result : defaultValue;
90
- }
91
- function set(obj, path, value) {
92
- const keys2 = Array.isArray(path) ? path : path.split(".");
93
- if (keys2.length === 0) return obj;
94
- const result = deepClone(obj);
95
- let current = result;
96
- for (let i = 0; i < keys2.length - 1; i++) {
97
- const key = keys2[i];
98
- if (!(key in current) || typeof current[key] !== "object" || current[key] === null) {
99
- current[key] = {};
100
- }
101
- current = current[key];
102
- }
103
- current[keys2[keys2.length - 1]] = value;
104
- return result;
105
- }
106
- function pick(obj, keys2) {
107
- const result = {};
108
- keys2.forEach((key) => {
109
- if (key in obj) {
110
- result[key] = obj[key];
111
- }
112
- });
113
- return result;
114
- }
115
- function omit(obj, keys2) {
116
- const result = { ...obj };
117
- keys2.forEach((key) => {
118
- delete result[key];
119
- });
120
- return result;
121
- }
122
- function keys(obj, deep = false) {
123
- if (!deep) return Object.keys(obj);
124
- const result = [];
125
- const traverse = (current, prefix = "") => {
126
- Object.keys(current).forEach((key) => {
127
- const fullKey = prefix ? `${prefix}.${key}` : key;
128
- result.push(fullKey);
129
- const value = current[key];
130
- if (value !== null && typeof value === "object" && !Array.isArray(value) && !(value instanceof Date) && !(value instanceof RegExp)) {
131
- traverse(value, fullKey);
132
- }
133
- });
134
- };
135
- traverse(obj);
136
- return result;
137
- }
138
- function values(obj, deep = false) {
139
- if (!deep) return Object.values(obj);
140
- const result = [];
141
- const traverse = (current) => {
142
- Object.values(current).forEach((value) => {
143
- if (value !== null && typeof value === "object" && !Array.isArray(value) && !(value instanceof Date) && !(value instanceof RegExp)) {
144
- traverse(value);
145
- } else {
146
- result.push(value);
147
- }
148
- });
149
- };
150
- traverse(obj);
151
- return result;
152
- }
153
- function mapKeys(obj, fn) {
154
- const result = {};
155
- Object.keys(obj).forEach((key) => {
156
- const newKey = fn(key, obj[key]);
157
- result[newKey] = obj[key];
158
- });
159
- return result;
160
- }
161
- function mapValues(obj, fn) {
162
- const result = {};
163
- Object.keys(obj).forEach((key) => {
164
- result[key] = fn(obj[key], key);
165
- });
166
- return result;
167
- }
168
- function invert(obj) {
169
- const result = {};
170
- Object.keys(obj).forEach((key) => {
171
- result[String(obj[key])] = key;
172
- });
173
- return result;
174
- }
175
- function defaults(obj, ...defaults2) {
176
- const result = { ...obj };
177
- defaults2.reverse().forEach((defaultObj) => {
178
- Object.keys(defaultObj).forEach((key) => {
179
- const typedKey = key;
180
- if (!(typedKey in result) || result[typedKey] === void 0) {
181
- result[typedKey] = defaultObj[typedKey];
182
- }
183
- });
184
- });
185
- return result;
186
- }
187
- function isEmptyObject(obj) {
188
- return Object.keys(obj).length === 0;
189
- }
190
- function isEqual(obj1, obj2) {
191
- if (obj1 === obj2) return true;
192
- if (obj1 === null || obj2 === null) return false;
193
- if (typeof obj1 !== "object" || typeof obj2 !== "object") return false;
194
- if (obj1 instanceof Date && obj2 instanceof Date) {
195
- return obj1.getTime() === obj2.getTime();
196
- }
197
- if (Array.isArray(obj1) && Array.isArray(obj2)) {
198
- if (obj1.length !== obj2.length) return false;
199
- return obj1.every((item, index) => isEqual(item, obj2[index]));
200
- }
201
- if (Array.isArray(obj1) || Array.isArray(obj2)) return false;
202
- const keys1 = Object.keys(obj1);
203
- const keys2 = Object.keys(obj2);
204
- if (keys1.length !== keys2.length) return false;
205
- return keys1.every((key) => {
206
- const val1 = obj1[key];
207
- const val2 = obj2[key];
208
- return isEqual(val1, val2);
209
- });
210
- }
211
- function transform(obj, iteratee, accumulator = {}) {
212
- Object.keys(obj).forEach((key) => {
213
- iteratee(accumulator, obj[key], key);
214
- });
215
- return accumulator;
216
- }
217
- function pickBy(obj, predicate) {
218
- const result = {};
219
- Object.keys(obj).forEach((key) => {
220
- const typedKey = key;
221
- if (predicate(obj[typedKey], key)) {
222
- result[typedKey] = obj[typedKey];
223
- }
224
- });
225
- return result;
226
- }
227
- function omitBy(obj, predicate) {
228
- const result = {};
229
- Object.keys(obj).forEach((key) => {
230
- const typedKey = key;
231
- if (!predicate(obj[typedKey], key)) {
232
- result[typedKey] = obj[typedKey];
233
- }
234
- });
235
- return result;
236
- }
237
-
238
- export { deepClone, deepMerge, defaults, get, invert, isEmptyObject, isEqual, keys, mapKeys, mapValues, merge, omit, omitBy, pick, pickBy, set, transform, values };
239
- //# sourceMappingURL=chunk-JBLX27WD.mjs.map
240
- //# sourceMappingURL=chunk-JBLX27WD.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/object.ts"],"names":["keys","defaults"],"mappings":"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","file":"chunk-JBLX27WD.mjs","sourcesContent":["/**\n * 对象工具函数\n */\n\n/**\n * 深拷贝对象\n * 支持 Date、Array、RegExp、Map、Set 等特殊类型\n * @param obj - 输入对象\n * @returns 深拷贝后的对象\n */\nexport function deepClone<T>(obj: T): T {\n // 处理 null 和基本类型\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // 处理 Date\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n\n // 处理 RegExp\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags) as unknown as T;\n }\n\n // 处理 Array\n if (Array.isArray(obj)) {\n return obj.map(item => deepClone(item)) as unknown as T;\n }\n\n // 处理 Map\n if (obj instanceof Map) {\n const clonedMap = new Map();\n obj.forEach((value, key) => {\n clonedMap.set(deepClone(key), deepClone(value));\n });\n return clonedMap as unknown as T;\n }\n\n // 处理 Set\n if (obj instanceof Set) {\n const clonedSet = new Set();\n obj.forEach(value => {\n clonedSet.add(deepClone(value));\n });\n return clonedSet as unknown as T;\n }\n\n // 处理普通对象\n if (typeof obj === 'object') {\n const clonedObj = {} as T;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n clonedObj[key] = deepClone(obj[key]);\n }\n }\n return clonedObj;\n }\n\n return obj;\n}\n\n/**\n * 对象合并\n * @param target - 目标对象\n * @param sources - 源对象数组\n * @returns 合并后的对象\n */\nexport function merge<T extends Record<string, unknown>>(target: T, ...sources: Partial<T>[]): T {\n return Object.assign({}, target, ...sources);\n}\n\n/**\n * 深合并对象\n * @param target - 目标对象\n * @param sources - 源对象数组\n * @returns 深合并后的对象\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T,\n ...sources: Partial<T>[]\n): T {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (!source) {\n return deepMerge(target, ...sources);\n }\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (isObject(sourceValue) && isObject(targetValue)) {\n // 递归合并嵌套对象\n target[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[Extract<keyof T, string>];\n } else if (sourceValue !== undefined) {\n // 直接赋值(包括 null)\n target[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n }\n\n return deepMerge(target, ...sources);\n}\n\n/**\n * 判断是否为普通对象(非 null、非数组、非 Date 等)\n */\nfunction isObject(item: unknown): item is Record<string, unknown> {\n return (\n item !== null &&\n typeof item === 'object' &&\n !Array.isArray(item) &&\n !(item instanceof Date) &&\n !(item instanceof RegExp) &&\n !(item instanceof Map) &&\n !(item instanceof Set)\n );\n}\n\n/**\n * 获取对象嵌套属性值\n * @param obj - 对象\n * @param path - 属性路径,如 'a.b.c' 或 ['a', 'b', 'c']\n * @param defaultValue - 默认值\n * @returns 属性值\n */\nexport function get<T = unknown>(\n obj: Record<string, unknown>,\n path: string | string[],\n defaultValue?: T\n): T | undefined {\n if (!obj || typeof obj !== 'object') {\n return defaultValue;\n }\n\n const keys = Array.isArray(path) ? path : path.split('.');\n if (keys.length === 0) {\n return defaultValue;\n }\n\n let result: unknown = obj;\n\n for (const key of keys) {\n if (result == null || typeof result !== 'object' || Array.isArray(result)) {\n return defaultValue;\n }\n\n // 使用类型断言访问属性\n const record = result as Record<string, unknown>;\n if (!(key in record)) {\n return defaultValue;\n }\n\n result = record[key];\n }\n\n return result !== undefined ? (result as T) : defaultValue;\n}\n\n/**\n * 设置嵌套属性值\n * @param obj - 对象\n * @param path - 属性路径,如 'a.b.c' 或 ['a', 'b', 'c']\n * @param value - 要设置的值\n * @returns 设置后的新对象(不修改原对象)\n */\nexport function set<T extends Record<string, unknown>>(\n obj: T,\n path: string | string[],\n value: unknown\n): T {\n const keys = Array.isArray(path) ? path : path.split('.');\n if (keys.length === 0) return obj;\n\n const result = deepClone(obj);\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n return result;\n}\n\n/**\n * 选择指定属性\n * @param obj - 对象\n * @param keys - 要选择的属性键数组\n * @returns 包含指定属性的新对象\n */\nexport function pick<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n keys.forEach(key => {\n if (key in obj) {\n result[key] = obj[key];\n }\n });\n return result;\n}\n\n/**\n * 排除指定属性\n * @param obj - 对象\n * @param keys - 要排除的属性键数组\n * @returns 排除指定属性后的新对象\n */\nexport function omit<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n keys.forEach(key => {\n delete result[key];\n });\n return result;\n}\n\n/**\n * 获取所有键(支持深度)\n * @param obj - 对象\n * @param deep - 是否深度获取,默认为 false\n * @returns 键数组\n */\nexport function keys<T extends Record<string, unknown>>(obj: T, deep = false): string[] {\n if (!deep) return Object.keys(obj);\n const result: string[] = [];\n const traverse = (current: Record<string, unknown>, prefix = ''): void => {\n Object.keys(current).forEach(key => {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n result.push(fullKey);\n const value = current[key];\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof RegExp)\n ) {\n traverse(value as Record<string, unknown>, fullKey);\n }\n });\n };\n traverse(obj);\n return result;\n}\n\n/**\n * 获取所有值(支持深度)\n * @param obj - 对象\n * @param deep - 是否深度获取,默认为 false\n * @returns 值数组\n */\nexport function values<T extends Record<string, unknown>>(obj: T, deep = false): unknown[] {\n if (!deep) return Object.values(obj);\n const result: unknown[] = [];\n const traverse = (current: Record<string, unknown>): void => {\n Object.values(current).forEach(value => {\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof RegExp)\n ) {\n traverse(value as Record<string, unknown>);\n } else {\n result.push(value);\n }\n });\n };\n traverse(obj);\n return result;\n}\n\n/**\n * 键映射\n * @param obj - 对象\n * @param fn - 键转换函数\n * @returns 键映射后的新对象\n */\nexport function mapKeys<T extends Record<string, unknown>>(\n obj: T,\n fn: (key: string, value: unknown) => string\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n Object.keys(obj).forEach(key => {\n const newKey = fn(key, obj[key]);\n result[newKey] = obj[key];\n });\n return result;\n}\n\n/**\n * 值映射\n * @param obj - 对象\n * @param fn - 值转换函数\n * @returns 值映射后的新对象\n */\nexport function mapValues<T extends Record<string, unknown>, R>(\n obj: T,\n fn: (value: unknown, key: string) => R\n): Record<string, R> {\n const result: Record<string, R> = {};\n Object.keys(obj).forEach(key => {\n result[key] = fn(obj[key], key);\n });\n return result;\n}\n\n/**\n * 键值反转\n * @param obj - 对象\n * @returns 键值反转后的新对象\n */\nexport function invert<T extends Record<string, string | number>>(obj: T): Record<string, string> {\n const result: Record<string, string> = {};\n Object.keys(obj).forEach(key => {\n result[String(obj[key])] = key;\n });\n return result;\n}\n\n/**\n * 设置默认值\n * @param obj - 对象\n * @param defaults - 默认值对象\n * @returns 合并默认值后的新对象\n */\nexport function defaults<T extends Record<string, unknown>>(\n obj: Partial<T>,\n ...defaults: Partial<T>[]\n): T {\n const result = { ...obj } as T;\n defaults.reverse().forEach(defaultObj => {\n Object.keys(defaultObj).forEach(key => {\n const typedKey = key as Extract<keyof T, string>;\n if (!(typedKey in result) || result[typedKey] === undefined) {\n result[typedKey] = defaultObj[typedKey] as T[Extract<keyof T, string>];\n }\n });\n });\n return result;\n}\n\n/**\n * 判断对象是否为空\n * @param obj - 对象\n * @returns 是否为空\n */\nexport function isEmptyObject(obj: Record<string, unknown>): boolean {\n return Object.keys(obj).length === 0;\n}\n\n/**\n * 深度比较两个对象\n * @param obj1 - 第一个对象\n * @param obj2 - 第二个对象\n * @returns 是否相等\n */\nexport function isEqual<T>(obj1: T, obj2: T): boolean {\n if (obj1 === obj2) return true;\n if (obj1 === null || obj2 === null) return false;\n if (typeof obj1 !== 'object' || typeof obj2 !== 'object') return false;\n\n if (obj1 instanceof Date && obj2 instanceof Date) {\n return obj1.getTime() === obj2.getTime();\n }\n\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\n if (obj1.length !== obj2.length) return false;\n return obj1.every((item, index) => isEqual(item, obj2[index]));\n }\n\n if (Array.isArray(obj1) || Array.isArray(obj2)) return false;\n\n const keys1 = Object.keys(obj1 as Record<string, unknown>);\n const keys2 = Object.keys(obj2 as Record<string, unknown>);\n\n if (keys1.length !== keys2.length) return false;\n\n return keys1.every(key => {\n const val1 = (obj1 as Record<string, unknown>)[key];\n const val2 = (obj2 as Record<string, unknown>)[key];\n return isEqual(val1, val2);\n });\n}\n\n/**\n * 对象转换\n * @param obj - 对象\n * @param iteratee - 转换函数\n * @param accumulator - 累加器,默认为空对象\n * @returns 转换后的对象\n */\nexport function transform<T extends Record<string, unknown>, R extends Record<string, unknown>>(\n obj: T,\n iteratee: (result: R, value: unknown, key: string) => void,\n accumulator: R = {} as R\n): R {\n Object.keys(obj).forEach(key => {\n iteratee(accumulator, obj[key], key);\n });\n return accumulator;\n}\n\n/**\n * 条件选择属性\n * @param obj - 对象\n * @param predicate - 条件函数\n * @returns 满足条件的属性组成的新对象\n */\nexport function pickBy<T extends Record<string, unknown>>(\n obj: T,\n predicate: (value: unknown, key: string) => boolean\n): Partial<T> {\n const result: Partial<T> = {};\n Object.keys(obj).forEach(key => {\n const typedKey = key as keyof T;\n if (predicate(obj[typedKey], key)) {\n result[typedKey] = obj[typedKey];\n }\n });\n return result;\n}\n\n/**\n * 条件排除属性\n * @param obj - 对象\n * @param predicate - 条件函数\n * @returns 不满足条件的属性组成的新对象\n */\nexport function omitBy<T extends Record<string, unknown>>(\n obj: T,\n predicate: (value: unknown, key: string) => boolean\n): Partial<T> {\n const result: Partial<T> = {};\n Object.keys(obj).forEach(key => {\n const typedKey = key as keyof T;\n if (!predicate(obj[typedKey], key)) {\n result[typedKey] = obj[typedKey];\n }\n });\n return result;\n}\n"]}
@@ -1,133 +0,0 @@
1
- // src/data/algorithm.ts
2
- function binarySearch(array, target, compareFn) {
3
- let left = 0;
4
- let right = array.length - 1;
5
- const compare = compareFn || ((a, b) => a < b ? -1 : a > b ? 1 : 0);
6
- while (left <= right) {
7
- const mid = Math.floor((left + right) / 2);
8
- const comparison = compare(array[mid], target);
9
- if (comparison === 0) {
10
- return mid;
11
- } else if (comparison < 0) {
12
- left = mid + 1;
13
- } else {
14
- right = mid - 1;
15
- }
16
- }
17
- return -1;
18
- }
19
- function quickSort(array, compareFn) {
20
- if (array.length <= 1) {
21
- return [...array];
22
- }
23
- const compare = compareFn || ((a, b) => a < b ? -1 : a > b ? 1 : 0);
24
- const pivot = array[Math.floor(array.length / 2)];
25
- const left = [];
26
- const right = [];
27
- const equal = [];
28
- for (const item of array) {
29
- const comparison = compare(item, pivot);
30
- if (comparison < 0) {
31
- left.push(item);
32
- } else if (comparison > 0) {
33
- right.push(item);
34
- } else {
35
- equal.push(item);
36
- }
37
- }
38
- return [...quickSort(left, compareFn), ...equal, ...quickSort(right, compareFn)];
39
- }
40
- function mergeSort(array, compareFn) {
41
- if (array.length <= 1) {
42
- return [...array];
43
- }
44
- const compare = compareFn || ((a, b) => a < b ? -1 : a > b ? 1 : 0);
45
- const mid = Math.floor(array.length / 2);
46
- const left = mergeSort(array.slice(0, mid), compareFn);
47
- const right = mergeSort(array.slice(mid), compareFn);
48
- return merge(left, right, compare);
49
- }
50
- function merge(left, right, compareFn) {
51
- const result = [];
52
- let i = 0;
53
- let j = 0;
54
- while (i < left.length && j < right.length) {
55
- if (compareFn(left[i], right[j]) <= 0) {
56
- result.push(left[i]);
57
- i++;
58
- } else {
59
- result.push(right[j]);
60
- j++;
61
- }
62
- }
63
- return result.concat(left.slice(i)).concat(right.slice(j));
64
- }
65
- function bubbleSort(array, compareFn) {
66
- const result = [...array];
67
- const compare = compareFn || ((a, b) => a < b ? -1 : a > b ? 1 : 0);
68
- const n = result.length;
69
- for (let i = 0; i < n - 1; i++) {
70
- let swapped = false;
71
- for (let j = 0; j < n - i - 1; j++) {
72
- if (compare(result[j], result[j + 1]) > 0) {
73
- [result[j], result[j + 1]] = [result[j + 1], result[j]];
74
- swapped = true;
75
- }
76
- }
77
- if (!swapped) {
78
- break;
79
- }
80
- }
81
- return result;
82
- }
83
- function fibonacci(n) {
84
- if (n < 0) {
85
- throw new Error("n must be non-negative");
86
- }
87
- if (n === 0) return 0;
88
- if (n === 1) return 1;
89
- let a = 0;
90
- let b = 1;
91
- for (let i = 2; i <= n; i++) {
92
- [a, b] = [b, a + b];
93
- }
94
- return b;
95
- }
96
- function fibonacciSequence(n) {
97
- if (n <= 0) return [];
98
- if (n === 1) return [0];
99
- if (n === 2) return [0, 1];
100
- const sequence = [0, 1];
101
- for (let i = 2; i < n; i++) {
102
- sequence.push(sequence[i - 1] + sequence[i - 2]);
103
- }
104
- return sequence;
105
- }
106
- function factorial(n) {
107
- if (n < 0) {
108
- throw new Error("n must be non-negative");
109
- }
110
- if (n === 0 || n === 1) {
111
- return 1;
112
- }
113
- let result = 1;
114
- for (let i = 2; i <= n; i++) {
115
- result *= i;
116
- }
117
- return result;
118
- }
119
- function gcd(a, b) {
120
- a = Math.abs(a);
121
- b = Math.abs(b);
122
- while (b !== 0) {
123
- [a, b] = [b, a % b];
124
- }
125
- return a;
126
- }
127
- function lcm(a, b) {
128
- return Math.abs(a * b) / gcd(a, b);
129
- }
130
-
131
- export { binarySearch, bubbleSort, factorial, fibonacci, fibonacciSequence, gcd, lcm, mergeSort, quickSort };
132
- //# sourceMappingURL=chunk-JHZ7M2MR.mjs.map
133
- //# sourceMappingURL=chunk-JHZ7M2MR.mjs.map