@alibarbar/common 1.0.9 → 1.1.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.
- package/dist/{chunk-O3O67R4I.js → algorithm.cjs} +1 -3
- package/dist/algorithm.js +130 -44
- package/dist/{chunk-LOAZSPGQ.js → array.cjs} +1 -3
- package/dist/array.js +135 -84
- package/dist/{chunk-Y364QIQH.js → color.cjs} +1 -3
- package/dist/color.js +127 -40
- package/dist/{chunk-DYBSRI7V.js → crypto.cjs} +109 -3
- package/dist/crypto.d.mts +48 -1
- package/dist/crypto.d.ts +48 -1
- package/dist/crypto.js +274 -60
- package/dist/{chunk-BHCRFURU.js → data-structure.cjs} +1 -3
- package/dist/data-structure.js +481 -32
- package/dist/{chunk-I3L42475.js → date.cjs} +1 -3
- package/dist/date.js +125 -72
- package/dist/{chunk-JK2SE3I2.js → dom.cjs} +1 -3
- package/dist/dom.js +84 -56
- package/dist/{chunk-7V5UQXIO.js → file.cjs} +1 -3
- package/dist/file.js +79 -32
- package/dist/{chunk-OX5PLOWB.js → i18n.cjs} +1 -3
- package/dist/i18n.js +78 -40
- package/dist/index.cjs +4543 -0
- package/dist/index.d.mts +6 -162
- package/dist/index.d.ts +6 -162
- package/dist/index.js +3712 -17374
- package/dist/{chunk-4RGXV4SJ.js → network.cjs} +1 -3
- package/dist/network.js +97 -28
- package/dist/{chunk-3FRYJPHG.js → number.cjs} +1 -3
- package/dist/number.js +77 -56
- package/dist/{chunk-27UDDVLZ.js → object.cjs} +1 -3
- package/dist/object.js +237 -80
- package/dist/{chunk-JQZBPAPO.js → performance.cjs} +1 -3
- package/dist/performance.js +145 -40
- package/dist/services.cjs +291 -0
- package/dist/services.d.mts +161 -0
- package/dist/services.d.ts +161 -0
- package/dist/services.js +281 -0
- package/dist/storage.cjs +943 -0
- package/dist/storage.d.mts +46 -1
- package/dist/storage.d.ts +46 -1
- package/dist/storage.js +930 -32
- package/dist/{chunk-D7CS5EKF.js → string.cjs} +1 -3
- package/dist/string.js +91 -68
- package/dist/{chunk-56W6YECK.js → tracking.cjs} +1 -3
- package/dist/tracking.js +359 -52
- package/dist/{chunk-ZDMFMUDR.js → transform.cjs} +1 -3
- package/dist/transform.js +299 -32
- package/dist/{chunk-NJARVI6X.mjs → upload.cjs} +42 -15
- package/dist/upload.d.mts +1 -1
- package/dist/upload.d.ts +1 -1
- package/dist/upload.js +402 -20
- package/dist/{chunk-KGFTD255.js → url.cjs} +1 -3
- package/dist/url.js +91 -44
- package/dist/{chunk-TQN37HIN.js → validation.cjs} +1 -3
- package/dist/validation.js +77 -60
- package/package.json +7 -2
- package/dist/algorithm.js.map +0 -1
- package/dist/algorithm.mjs +0 -4
- package/dist/algorithm.mjs.map +0 -1
- package/dist/array.js.map +0 -1
- package/dist/array.mjs +0 -4
- package/dist/array.mjs.map +0 -1
- package/dist/chunk-27UDDVLZ.js.map +0 -1
- package/dist/chunk-2R2QWFJC.mjs +0 -138
- package/dist/chunk-2R2QWFJC.mjs.map +0 -1
- package/dist/chunk-3FRYJPHG.js.map +0 -1
- package/dist/chunk-4RGXV4SJ.js.map +0 -1
- package/dist/chunk-56W6YECK.js.map +0 -1
- package/dist/chunk-5BGSUGTI.mjs +0 -128
- package/dist/chunk-5BGSUGTI.mjs.map +0 -1
- package/dist/chunk-7E6GELHJ.mjs +0 -302
- package/dist/chunk-7E6GELHJ.mjs.map +0 -1
- package/dist/chunk-7V5UQXIO.js.map +0 -1
- package/dist/chunk-A4SWQXX7.mjs +0 -484
- package/dist/chunk-A4SWQXX7.mjs.map +0 -1
- package/dist/chunk-BHCRFURU.js.map +0 -1
- package/dist/chunk-CDSGEAOK.mjs +0 -80
- package/dist/chunk-CDSGEAOK.mjs.map +0 -1
- package/dist/chunk-D7CS5EKF.js.map +0 -1
- package/dist/chunk-DYBSRI7V.js.map +0 -1
- package/dist/chunk-FEBKPX5A.js +0 -386
- package/dist/chunk-FEBKPX5A.js.map +0 -1
- package/dist/chunk-FJ6ZGZIA.mjs +0 -39
- package/dist/chunk-FJ6ZGZIA.mjs.map +0 -1
- package/dist/chunk-HLDFI7R2.mjs +0 -175
- package/dist/chunk-HLDFI7R2.mjs.map +0 -1
- package/dist/chunk-I3L42475.js.map +0 -1
- package/dist/chunk-JBLX27WD.mjs +0 -240
- package/dist/chunk-JBLX27WD.mjs.map +0 -1
- package/dist/chunk-JHZ7M2MR.mjs +0 -133
- package/dist/chunk-JHZ7M2MR.mjs.map +0 -1
- package/dist/chunk-JK2SE3I2.js.map +0 -1
- package/dist/chunk-JQZBPAPO.js.map +0 -1
- package/dist/chunk-JXYGC2C5.mjs +0 -100
- package/dist/chunk-JXYGC2C5.mjs.map +0 -1
- package/dist/chunk-KGFTD255.js.map +0 -1
- package/dist/chunk-LBHBNPNJ.mjs +0 -148
- package/dist/chunk-LBHBNPNJ.mjs.map +0 -1
- package/dist/chunk-LF4CILQS.mjs +0 -87
- package/dist/chunk-LF4CILQS.mjs.map +0 -1
- package/dist/chunk-LOAZSPGQ.js.map +0 -1
- package/dist/chunk-NJARVI6X.mjs.map +0 -1
- package/dist/chunk-NSSDYX2U.mjs +0 -80
- package/dist/chunk-NSSDYX2U.mjs.map +0 -1
- package/dist/chunk-O3O67R4I.js.map +0 -1
- package/dist/chunk-OIXQ3E6W.mjs +0 -354
- package/dist/chunk-OIXQ3E6W.mjs.map +0 -1
- package/dist/chunk-OX5PLOWB.js.map +0 -1
- package/dist/chunk-PJ7UCTX4.mjs +0 -362
- package/dist/chunk-PJ7UCTX4.mjs.map +0 -1
- package/dist/chunk-PR4QN5HX.js +0 -44
- package/dist/chunk-PR4QN5HX.js.map +0 -1
- package/dist/chunk-QIBE7GVN.mjs +0 -81
- package/dist/chunk-QIBE7GVN.mjs.map +0 -1
- package/dist/chunk-QIOC54LQ.mjs +0 -130
- package/dist/chunk-QIOC54LQ.mjs.map +0 -1
- package/dist/chunk-TQN37HIN.js.map +0 -1
- package/dist/chunk-WZDOPUJW.js +0 -361
- package/dist/chunk-WZDOPUJW.js.map +0 -1
- package/dist/chunk-XJTZDXSR.mjs +0 -94
- package/dist/chunk-XJTZDXSR.mjs.map +0 -1
- package/dist/chunk-Y364QIQH.js.map +0 -1
- package/dist/chunk-YXM6Q4JS.mjs +0 -94
- package/dist/chunk-YXM6Q4JS.mjs.map +0 -1
- package/dist/chunk-ZDMFMUDR.js.map +0 -1
- package/dist/chunk-ZVJ6NQUM.mjs +0 -82
- package/dist/chunk-ZVJ6NQUM.mjs.map +0 -1
- package/dist/color.js.map +0 -1
- package/dist/color.mjs +0 -4
- package/dist/color.mjs.map +0 -1
- package/dist/crypto.js.map +0 -1
- package/dist/crypto.mjs +0 -4
- package/dist/crypto.mjs.map +0 -1
- package/dist/data-structure.js.map +0 -1
- package/dist/data-structure.mjs +0 -4
- package/dist/data-structure.mjs.map +0 -1
- package/dist/date.js.map +0 -1
- package/dist/date.mjs +0 -4
- package/dist/date.mjs.map +0 -1
- package/dist/dom.js.map +0 -1
- package/dist/dom.mjs +0 -4
- package/dist/dom.mjs.map +0 -1
- package/dist/file.js.map +0 -1
- package/dist/file.mjs +0 -4
- package/dist/file.mjs.map +0 -1
- package/dist/i18n.js.map +0 -1
- package/dist/i18n.mjs +0 -4
- package/dist/i18n.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -17155
- package/dist/index.mjs.map +0 -1
- package/dist/network.js.map +0 -1
- package/dist/network.mjs +0 -4
- package/dist/network.mjs.map +0 -1
- package/dist/number.js.map +0 -1
- package/dist/number.mjs +0 -4
- package/dist/number.mjs.map +0 -1
- package/dist/object.js.map +0 -1
- package/dist/object.mjs +0 -4
- package/dist/object.mjs.map +0 -1
- package/dist/performance.js.map +0 -1
- package/dist/performance.mjs +0 -4
- package/dist/performance.mjs.map +0 -1
- package/dist/storage.js.map +0 -1
- package/dist/storage.mjs +0 -5
- package/dist/storage.mjs.map +0 -1
- package/dist/string.js.map +0 -1
- package/dist/string.mjs +0 -4
- package/dist/string.mjs.map +0 -1
- package/dist/tracking.js.map +0 -1
- package/dist/tracking.mjs +0 -4
- package/dist/tracking.mjs.map +0 -1
- package/dist/transform.js.map +0 -1
- package/dist/transform.mjs +0 -4
- package/dist/transform.mjs.map +0 -1
- package/dist/upload.js.map +0 -1
- package/dist/upload.mjs +0 -5
- package/dist/upload.mjs.map +0 -1
- package/dist/url.js.map +0 -1
- package/dist/url.mjs +0 -4
- package/dist/url.mjs.map +0 -1
- package/dist/validation.js.map +0 -1
- package/dist/validation.mjs +0 -4
- package/dist/validation.mjs.map +0 -1
- /package/dist/{upload-DchqyDBQ.d.mts → index-DchqyDBQ.d.mts} +0 -0
- /package/dist/{upload-DchqyDBQ.d.ts → index-DchqyDBQ.d.ts} +0 -0
package/dist/validation.js
CHANGED
|
@@ -1,61 +1,78 @@
|
|
|
1
|
-
|
|
1
|
+
// src/core/validation/index.ts
|
|
2
|
+
function isValidEmail(email) {
|
|
3
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
4
|
+
return emailRegex.test(email);
|
|
5
|
+
}
|
|
6
|
+
function isValidPhone(phone) {
|
|
7
|
+
const phoneRegex = /^1[3-9]\d{9}$/;
|
|
8
|
+
return phoneRegex.test(phone);
|
|
9
|
+
}
|
|
10
|
+
function isValidUrl(url) {
|
|
11
|
+
try {
|
|
12
|
+
new URL(url);
|
|
13
|
+
return true;
|
|
14
|
+
} catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function isValidIdCard(idCard) {
|
|
19
|
+
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]$/;
|
|
20
|
+
return idCardRegex.test(idCard);
|
|
21
|
+
}
|
|
22
|
+
function isEmpty(value) {
|
|
23
|
+
if (value === null || value === void 0) return true;
|
|
24
|
+
if (typeof value === "string") return value.trim().length === 0;
|
|
25
|
+
if (Array.isArray(value)) return value.length === 0;
|
|
26
|
+
if (typeof value === "object") return Object.keys(value).length === 0;
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
function isValidUUID(uuid) {
|
|
30
|
+
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;
|
|
31
|
+
return uuidRegex.test(uuid);
|
|
32
|
+
}
|
|
33
|
+
function isValidIP(ip) {
|
|
34
|
+
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]?)$/;
|
|
35
|
+
return ipRegex.test(ip);
|
|
36
|
+
}
|
|
37
|
+
function isValidDomain(domain) {
|
|
38
|
+
const domainRegex = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i;
|
|
39
|
+
return domainRegex.test(domain);
|
|
40
|
+
}
|
|
41
|
+
function isValidHexColor(color) {
|
|
42
|
+
const hexColorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
|
|
43
|
+
return hexColorRegex.test(color);
|
|
44
|
+
}
|
|
45
|
+
function isValidJSON(json) {
|
|
46
|
+
try {
|
|
47
|
+
JSON.parse(json);
|
|
48
|
+
return true;
|
|
49
|
+
} catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function isNumeric(value) {
|
|
54
|
+
if (typeof value === "number") return !isNaN(value) && isFinite(value);
|
|
55
|
+
if (typeof value === "string") {
|
|
56
|
+
return value.trim() !== "" && !isNaN(Number(value)) && isFinite(Number(value));
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
function isInteger(value) {
|
|
61
|
+
if (typeof value === "number") return Number.isInteger(value);
|
|
62
|
+
if (typeof value === "string") {
|
|
63
|
+
const num = Number(value);
|
|
64
|
+
return !isNaN(num) && Number.isInteger(num);
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
function isFloat(value) {
|
|
69
|
+
if (typeof value === "number")
|
|
70
|
+
return !isNaN(value) && isFinite(value) && !Number.isInteger(value);
|
|
71
|
+
if (typeof value === "string") {
|
|
72
|
+
const num = Number(value);
|
|
73
|
+
return !isNaN(num) && isFinite(num) && !Number.isInteger(num);
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
2
77
|
|
|
3
|
-
|
|
4
|
-
require('./chunk-PR4QN5HX.js');
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Object.defineProperty(exports, "isEmpty", {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
get: function () { return chunkTQN37HIN_js.isEmpty; }
|
|
11
|
-
});
|
|
12
|
-
Object.defineProperty(exports, "isFloat", {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function () { return chunkTQN37HIN_js.isFloat; }
|
|
15
|
-
});
|
|
16
|
-
Object.defineProperty(exports, "isInteger", {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
get: function () { return chunkTQN37HIN_js.isInteger; }
|
|
19
|
-
});
|
|
20
|
-
Object.defineProperty(exports, "isNumeric", {
|
|
21
|
-
enumerable: true,
|
|
22
|
-
get: function () { return chunkTQN37HIN_js.isNumeric; }
|
|
23
|
-
});
|
|
24
|
-
Object.defineProperty(exports, "isValidDomain", {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
get: function () { return chunkTQN37HIN_js.isValidDomain; }
|
|
27
|
-
});
|
|
28
|
-
Object.defineProperty(exports, "isValidEmail", {
|
|
29
|
-
enumerable: true,
|
|
30
|
-
get: function () { return chunkTQN37HIN_js.isValidEmail; }
|
|
31
|
-
});
|
|
32
|
-
Object.defineProperty(exports, "isValidHexColor", {
|
|
33
|
-
enumerable: true,
|
|
34
|
-
get: function () { return chunkTQN37HIN_js.isValidHexColor; }
|
|
35
|
-
});
|
|
36
|
-
Object.defineProperty(exports, "isValidIP", {
|
|
37
|
-
enumerable: true,
|
|
38
|
-
get: function () { return chunkTQN37HIN_js.isValidIP; }
|
|
39
|
-
});
|
|
40
|
-
Object.defineProperty(exports, "isValidIdCard", {
|
|
41
|
-
enumerable: true,
|
|
42
|
-
get: function () { return chunkTQN37HIN_js.isValidIdCard; }
|
|
43
|
-
});
|
|
44
|
-
Object.defineProperty(exports, "isValidJSON", {
|
|
45
|
-
enumerable: true,
|
|
46
|
-
get: function () { return chunkTQN37HIN_js.isValidJSON; }
|
|
47
|
-
});
|
|
48
|
-
Object.defineProperty(exports, "isValidPhone", {
|
|
49
|
-
enumerable: true,
|
|
50
|
-
get: function () { return chunkTQN37HIN_js.isValidPhone; }
|
|
51
|
-
});
|
|
52
|
-
Object.defineProperty(exports, "isValidUUID", {
|
|
53
|
-
enumerable: true,
|
|
54
|
-
get: function () { return chunkTQN37HIN_js.isValidUUID; }
|
|
55
|
-
});
|
|
56
|
-
Object.defineProperty(exports, "isValidUrl", {
|
|
57
|
-
enumerable: true,
|
|
58
|
-
get: function () { return chunkTQN37HIN_js.isValidUrl; }
|
|
59
|
-
});
|
|
60
|
-
//# sourceMappingURL=validation.js.map
|
|
61
|
-
//# sourceMappingURL=validation.js.map
|
|
78
|
+
export { isEmpty, isFloat, isInteger, isNumeric, isValidDomain, isValidEmail, isValidHexColor, isValidIP, isValidIdCard, isValidJSON, isValidPhone, isValidUUID, isValidUrl };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alibarbar/common",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Alibarbar 通用工具库",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -126,7 +126,9 @@
|
|
|
126
126
|
],
|
|
127
127
|
"scripts": {
|
|
128
128
|
"build": "tsup",
|
|
129
|
+
"build:dev": "SOURCEMAP=true tsup",
|
|
129
130
|
"build:analyze": "tsup --minify false && npm run analyze",
|
|
131
|
+
"build:clean": "rm -rf dist && npm run build",
|
|
130
132
|
"dev": "tsup --watch",
|
|
131
133
|
"test": "jest",
|
|
132
134
|
"test:watch": "jest --watch",
|
|
@@ -172,7 +174,10 @@
|
|
|
172
174
|
"tsup": "^8.0.1",
|
|
173
175
|
"typescript": "^5.3.3"
|
|
174
176
|
},
|
|
175
|
-
"peerDependencies": {
|
|
177
|
+
"peerDependencies": {
|
|
178
|
+
"axios": "^1.7.0",
|
|
179
|
+
"qs": "^6.11.2"
|
|
180
|
+
},
|
|
176
181
|
"dependencies": {}
|
|
177
182
|
}
|
|
178
183
|
|
package/dist/algorithm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"algorithm.js"}
|
package/dist/algorithm.mjs
DELETED
package/dist/algorithm.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"algorithm.mjs"}
|
package/dist/array.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"array.js"}
|
package/dist/array.mjs
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export { chunk, compact, difference, drop, dropWhile, findIndexBy, flatten, groupBy, intersection, partition, sample, shuffle, sortBy, take, takeWhile, union, unique, unzip, zip } from './chunk-2R2QWFJC.mjs';
|
|
2
|
-
import './chunk-FJ6ZGZIA.mjs';
|
|
3
|
-
//# sourceMappingURL=array.mjs.map
|
|
4
|
-
//# sourceMappingURL=array.mjs.map
|
package/dist/array.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"array.mjs"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/object.ts"],"names":["keys","defaults"],"mappings":"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","file":"chunk-27UDDVLZ.js","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"]}
|
package/dist/chunk-2R2QWFJC.mjs
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
// src/core/array.ts
|
|
2
|
-
function unique(arr) {
|
|
3
|
-
return Array.from(new Set(arr));
|
|
4
|
-
}
|
|
5
|
-
function groupBy(arr, keyFn) {
|
|
6
|
-
const getKey = typeof keyFn === "string" ? (item) => item[keyFn] : keyFn;
|
|
7
|
-
return arr.reduce(
|
|
8
|
-
(acc, item) => {
|
|
9
|
-
const key = getKey(item);
|
|
10
|
-
if (!acc[key]) {
|
|
11
|
-
acc[key] = [];
|
|
12
|
-
}
|
|
13
|
-
acc[key].push(item);
|
|
14
|
-
return acc;
|
|
15
|
-
},
|
|
16
|
-
{}
|
|
17
|
-
);
|
|
18
|
-
}
|
|
19
|
-
function chunk(arr, size) {
|
|
20
|
-
const chunks = [];
|
|
21
|
-
for (let i = 0; i < arr.length; i += size) {
|
|
22
|
-
chunks.push(arr.slice(i, i + size));
|
|
23
|
-
}
|
|
24
|
-
return chunks;
|
|
25
|
-
}
|
|
26
|
-
function flatten(arr, depth = 1) {
|
|
27
|
-
return depth > 0 ? arr.reduce(
|
|
28
|
-
(acc, val) => acc.concat(Array.isArray(val) ? flatten(val, depth - 1) : val),
|
|
29
|
-
[]
|
|
30
|
-
) : arr;
|
|
31
|
-
}
|
|
32
|
-
function shuffle(arr) {
|
|
33
|
-
const result = [...arr];
|
|
34
|
-
for (let i = result.length - 1; i > 0; i--) {
|
|
35
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
36
|
-
[result[i], result[j]] = [result[j], result[i]];
|
|
37
|
-
}
|
|
38
|
-
return result;
|
|
39
|
-
}
|
|
40
|
-
function sample(arr, count = 1) {
|
|
41
|
-
if (arr.length === 0) {
|
|
42
|
-
throw new Error("Cannot sample from empty array");
|
|
43
|
-
}
|
|
44
|
-
if (count === 1) {
|
|
45
|
-
const shuffled2 = shuffle(arr);
|
|
46
|
-
return shuffled2[0];
|
|
47
|
-
}
|
|
48
|
-
if (count >= arr.length) return [...arr];
|
|
49
|
-
const shuffled = shuffle(arr);
|
|
50
|
-
return shuffled.slice(0, count);
|
|
51
|
-
}
|
|
52
|
-
function difference(arr1, arr2) {
|
|
53
|
-
const set2 = new Set(arr2);
|
|
54
|
-
return arr1.filter((item) => !set2.has(item));
|
|
55
|
-
}
|
|
56
|
-
function intersection(arr1, arr2) {
|
|
57
|
-
const set2 = new Set(arr2);
|
|
58
|
-
return arr1.filter((item) => set2.has(item));
|
|
59
|
-
}
|
|
60
|
-
function union(arr1, arr2) {
|
|
61
|
-
return unique([...arr1, ...arr2]);
|
|
62
|
-
}
|
|
63
|
-
function sortBy(arr, keyFn, order = "asc") {
|
|
64
|
-
const getKey = typeof keyFn === "string" ? (item) => item[keyFn] : keyFn;
|
|
65
|
-
const result = [...arr];
|
|
66
|
-
result.sort((a, b) => {
|
|
67
|
-
const keyA = getKey(a);
|
|
68
|
-
const keyB = getKey(b);
|
|
69
|
-
if (keyA < keyB) return order === "asc" ? -1 : 1;
|
|
70
|
-
if (keyA > keyB) return order === "asc" ? 1 : -1;
|
|
71
|
-
return 0;
|
|
72
|
-
});
|
|
73
|
-
return result;
|
|
74
|
-
}
|
|
75
|
-
function findIndexBy(arr, predicate) {
|
|
76
|
-
return arr.findIndex(predicate);
|
|
77
|
-
}
|
|
78
|
-
function partition(arr, predicate) {
|
|
79
|
-
const truthy = [];
|
|
80
|
-
const falsy = [];
|
|
81
|
-
arr.forEach((item) => {
|
|
82
|
-
if (predicate(item)) {
|
|
83
|
-
truthy.push(item);
|
|
84
|
-
} else {
|
|
85
|
-
falsy.push(item);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
return [truthy, falsy];
|
|
89
|
-
}
|
|
90
|
-
function zip(...arrays) {
|
|
91
|
-
const maxLength = Math.max(...arrays.map((arr) => arr.length));
|
|
92
|
-
const result = [];
|
|
93
|
-
for (let i = 0; i < maxLength; i++) {
|
|
94
|
-
result.push(
|
|
95
|
-
arrays.map((arr) => arr[i])
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
return result;
|
|
99
|
-
}
|
|
100
|
-
function unzip(array) {
|
|
101
|
-
if (array.length === 0) return [];
|
|
102
|
-
const length = array[0].length;
|
|
103
|
-
const result = Array.from({ length }, () => []);
|
|
104
|
-
array.forEach((item) => {
|
|
105
|
-
item.forEach((val, index) => {
|
|
106
|
-
result[index].push(val);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
return result;
|
|
110
|
-
}
|
|
111
|
-
function compact(arr) {
|
|
112
|
-
return arr.filter((item) => Boolean(item));
|
|
113
|
-
}
|
|
114
|
-
function take(arr, n) {
|
|
115
|
-
return arr.slice(0, n);
|
|
116
|
-
}
|
|
117
|
-
function drop(arr, n) {
|
|
118
|
-
return arr.slice(n);
|
|
119
|
-
}
|
|
120
|
-
function takeWhile(arr, predicate) {
|
|
121
|
-
const result = [];
|
|
122
|
-
for (const item of arr) {
|
|
123
|
-
if (!predicate(item)) break;
|
|
124
|
-
result.push(item);
|
|
125
|
-
}
|
|
126
|
-
return result;
|
|
127
|
-
}
|
|
128
|
-
function dropWhile(arr, predicate) {
|
|
129
|
-
let index = 0;
|
|
130
|
-
while (index < arr.length && predicate(arr[index])) {
|
|
131
|
-
index++;
|
|
132
|
-
}
|
|
133
|
-
return arr.slice(index);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export { chunk, compact, difference, drop, dropWhile, findIndexBy, flatten, groupBy, intersection, partition, sample, shuffle, sortBy, take, takeWhile, union, unique, unzip, zip };
|
|
137
|
-
//# sourceMappingURL=chunk-2R2QWFJC.mjs.map
|
|
138
|
-
//# sourceMappingURL=chunk-2R2QWFJC.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/array.ts"],"names":["shuffled"],"mappings":"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","file":"chunk-2R2QWFJC.mjs","sourcesContent":["/**\n * 数组工具函数\n */\n\n/**\n * 数组去重\n * @param arr - 输入数组\n * @returns 去重后的数组\n */\nexport function unique<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n\n/**\n * 数组分组\n * @param arr - 输入数组\n * @param keyFn - 分组键函数或属性名\n * @returns 分组后的对象\n */\nexport function groupBy<T, K extends string | number>(\n arr: T[],\n keyFn: ((item: T) => K) | string\n): Record<K, T[]> {\n const getKey =\n typeof keyFn === 'string' ? (item: T) => (item as Record<string, K>)[keyFn] as K : keyFn;\n\n return arr.reduce(\n (acc, item) => {\n const key = getKey(item);\n if (!acc[key]) {\n acc[key] = [];\n }\n acc[key].push(item);\n return acc;\n },\n {} as Record<K, T[]>\n );\n}\n\n/**\n * 数组分块\n * @param arr - 输入数组\n * @param size - 每块大小\n * @returns 分块后的二维数组\n */\nexport function chunk<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * 数组扁平化\n * @param arr - 输入数组\n * @param depth - 扁平化深度,默认为 1\n * @returns 扁平化后的数组\n */\nexport function flatten<T>(arr: (T | T[])[], depth = 1): T[] {\n return depth > 0\n ? arr.reduce<T[]>(\n (acc, val) => acc.concat(Array.isArray(val) ? flatten(val, depth - 1) : val),\n []\n )\n : (arr as T[]);\n}\n\n/**\n * 数组随机打乱(Fisher-Yates算法)\n * @param arr - 输入数组\n * @returns 打乱后的新数组\n */\nexport function shuffle<T>(arr: T[]): T[] {\n const result = [...arr];\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [result[i], result[j]] = [result[j], result[i]];\n }\n return result;\n}\n\n/**\n * 随机取样\n * @param arr - 输入数组\n * @param count - 取样数量,默认为 1。当 count=1 时返回单个元素,否则返回数组\n * @returns 随机取样的数组或单个元素\n */\nexport function sample<T>(arr: T[]): T;\nexport function sample<T>(arr: T[], count: number): T | T[];\nexport function sample<T>(arr: T[], count = 1): T | T[] {\n if (arr.length === 0) {\n throw new Error('Cannot sample from empty array');\n }\n\n if (count === 1) {\n const shuffled = shuffle(arr);\n return shuffled[0];\n }\n\n if (count >= arr.length) return [...arr];\n const shuffled = shuffle(arr);\n return shuffled.slice(0, count);\n}\n\n/**\n * 数组差集(在arr1中但不在arr2中的元素)\n * @param arr1 - 第一个数组\n * @param arr2 - 第二个数组\n * @returns 差集数组\n */\nexport function difference<T>(arr1: T[], arr2: T[]): T[] {\n const set2 = new Set(arr2);\n return arr1.filter(item => !set2.has(item));\n}\n\n/**\n * 数组交集\n * @param arr1 - 第一个数组\n * @param arr2 - 第二个数组\n * @returns 交集数组\n */\nexport function intersection<T>(arr1: T[], arr2: T[]): T[] {\n const set2 = new Set(arr2);\n return arr1.filter(item => set2.has(item));\n}\n\n/**\n * 数组并集\n * @param arr1 - 第一个数组\n * @param arr2 - 第二个数组\n * @returns 并集数组\n */\nexport function union<T>(arr1: T[], arr2: T[]): T[] {\n return unique([...arr1, ...arr2]);\n}\n\n/**\n * 按属性排序\n * @param arr - 输入数组\n * @param keyFn - 获取排序键的函数或属性名\n * @param order - 排序顺序,'asc' 或 'desc',默认为 'asc'\n * @returns 排序后的新数组\n */\nexport function sortBy<T, K extends string | number>(\n arr: T[],\n keyFn: ((item: T) => K) | string,\n order: 'asc' | 'desc' = 'asc'\n): T[] {\n const getKey =\n typeof keyFn === 'string' ? (item: T) => (item as Record<string, K>)[keyFn] as K : keyFn;\n\n const result = [...arr];\n result.sort((a, b) => {\n const keyA = getKey(a);\n const keyB = getKey(b);\n if (keyA < keyB) return order === 'asc' ? -1 : 1;\n if (keyA > keyB) return order === 'asc' ? 1 : -1;\n return 0;\n });\n return result;\n}\n\n/**\n * 按条件查找索引\n * @param arr - 输入数组\n * @param predicate - 条件函数\n * @returns 找到的索引,未找到返回 -1\n */\nexport function findIndexBy<T>(arr: T[], predicate: (item: T) => boolean): number {\n return arr.findIndex(predicate);\n}\n\n/**\n * 数组分割(满足条件/不满足条件)\n * @param arr - 输入数组\n * @param predicate - 条件函数\n * @returns 包含两个数组的元组:[满足条件的数组, 不满足条件的数组]\n */\nexport function partition<T>(arr: T[], predicate: (item: T) => boolean): [T[], T[]] {\n const truthy: T[] = [];\n const falsy: T[] = [];\n arr.forEach(item => {\n if (predicate(item)) {\n truthy.push(item);\n } else {\n falsy.push(item);\n }\n });\n return [truthy, falsy];\n}\n\n/**\n * 数组压缩(将多个数组合并成元组数组)\n * @param arrays - 要压缩的数组\n * @returns 压缩后的元组数组\n */\nexport function zip<T extends readonly unknown[]>(\n ...arrays: T\n): Array<{ [K in keyof T]: T[K] extends readonly (infer U)[] ? U : never }> {\n const maxLength = Math.max(...arrays.map(arr => (arr as unknown[]).length));\n const result: Array<{ [K in keyof T]: T[K] extends readonly (infer U)[] ? U : never }> = [];\n for (let i = 0; i < maxLength; i++) {\n result.push(\n arrays.map(arr => (arr as unknown[])[i]) as {\n [K in keyof T]: T[K] extends readonly (infer U)[] ? U : never;\n }\n );\n }\n return result;\n}\n\n/**\n * 数组解压(将元组数组拆分成多个数组)\n * @param array - 要解压的数组\n * @returns 解压后的数组元组\n */\nexport function unzip<T extends readonly unknown[]>(\n array: Array<{ [K in keyof T]: T[number] extends readonly (infer U)[] ? U : never }>\n): T {\n if (array.length === 0) return [] as unknown as T;\n const length = (array[0] as unknown[]).length;\n const result = Array.from({ length }, () => []) as unknown as unknown[][];\n array.forEach(item => {\n (item as unknown[]).forEach((val, index) => {\n result[index].push(val);\n });\n });\n return result as unknown as T;\n}\n\n/**\n * 移除假值(null, undefined, false, 0, '')\n * @param arr - 输入数组\n * @returns 移除假值后的数组\n */\nexport function compact<T>(arr: (T | null | undefined | false | 0 | '')[]): T[] {\n return arr.filter((item): item is T => Boolean(item));\n}\n\n/**\n * 取前N个元素\n * @param arr - 输入数组\n * @param n - 要取的元素数量\n * @returns 前N个元素的数组\n */\nexport function take<T>(arr: T[], n: number): T[] {\n return arr.slice(0, n);\n}\n\n/**\n * 跳过前N个元素\n * @param arr - 输入数组\n * @param n - 要跳过的元素数量\n * @returns 跳过后的数组\n */\nexport function drop<T>(arr: T[], n: number): T[] {\n return arr.slice(n);\n}\n\n/**\n * 条件取元素(直到条件不满足)\n * @param arr - 输入数组\n * @param predicate - 条件函数\n * @returns 满足条件的连续元素数组\n */\nexport function takeWhile<T>(arr: T[], predicate: (item: T) => boolean): T[] {\n const result: T[] = [];\n for (const item of arr) {\n if (!predicate(item)) break;\n result.push(item);\n }\n return result;\n}\n\n/**\n * 条件跳过元素(直到条件不满足)\n * @param arr - 输入数组\n * @param predicate - 条件函数\n * @returns 跳过后的数组\n */\nexport function dropWhile<T>(arr: T[], predicate: (item: T) => boolean): T[] {\n let index = 0;\n while (index < arr.length && predicate(arr[index])) {\n index++;\n }\n return arr.slice(index);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/format/number.ts"],"names":["dec"],"mappings":"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","file":"chunk-3FRYJPHG.js","sourcesContent":["/**\n * 数字工具函数\n */\n\n/**\n * 数字格式化(千分位)\n * @param num - 数字\n * @param options - 格式化选项\n * @returns 格式化后的字符串\n */\nexport function formatNumber(\n num: number,\n options: {\n decimals?: number;\n separator?: string;\n decimalPoint?: string;\n minimumFractionDigits?: number;\n } = {}\n): string {\n const { decimals, separator = ',', decimalPoint = '.', minimumFractionDigits } = options;\n\n // 如果没有指定 decimals,自动检测小数位\n let numStr: string;\n if (decimals !== undefined) {\n numStr = num.toFixed(decimals);\n } else if (minimumFractionDigits !== undefined) {\n numStr = num.toFixed(minimumFractionDigits);\n } else {\n // 自动检测小数位\n const str = num.toString();\n if (str.includes('.')) {\n numStr = str;\n } else {\n numStr = num.toFixed(0);\n }\n }\n\n const parts = numStr.split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator);\n return parts.join(decimalPoint);\n}\n\n/**\n * 生成随机数\n * @param min - 最小值\n * @param max - 最大值\n * @param integer - 是否为整数,默认为 false\n * @returns 随机数\n */\nexport function random(min: number, max: number, integer = false): number {\n const value = Math.random() * (max - min) + min;\n return integer ? Math.floor(value) : value;\n}\n\n/**\n * 限制数值范围\n * @param num - 数字\n * @param min - 最小值\n * @param max - 最大值\n * @returns 限制后的数字\n */\nexport function clamp(num: number, min: number, max: number): number {\n return Math.min(Math.max(num, min), max);\n}\n\n/**\n * 增强版四舍五入\n * @param num - 数字\n * @param decimals - 小数位数,默认为 0\n * @returns 四舍五入后的数字\n */\nexport function round(num: number, decimals = 0): number {\n const factor = Math.pow(10, decimals);\n return Math.round(num * factor) / factor;\n}\n\n/**\n * 增强版向下取整\n * @param num - 数字\n * @param decimals - 小数位数,默认为 0\n * @returns 向下取整后的数字\n */\nexport function floor(num: number, decimals = 0): number {\n const factor = Math.pow(10, decimals);\n return Math.floor(num * factor) / factor;\n}\n\n/**\n * 增强版向上取整\n * @param num - 数字\n * @param decimals - 小数位数,默认为 0\n * @returns 向上取整后的数字\n */\nexport function ceil(num: number, decimals = 0): number {\n const factor = Math.pow(10, decimals);\n return Math.ceil(num * factor) / factor;\n}\n\n/**\n * 保留小数位(增强版)\n * @param num - 数字\n * @param decimals - 小数位数\n * @returns 格式化后的字符串\n */\nexport function toFixed(num: number, decimals: number): string {\n return num.toFixed(decimals);\n}\n\n/**\n * 解析数字字符串\n * @param str - 数字字符串\n * @param defaultValue - 默认值,解析失败时返回\n * @returns 解析后的数字\n */\nexport function parseNumber(str: string, defaultValue = 0): number {\n const num = Number(str);\n return isNaN(num) ? defaultValue : num;\n}\n\n/**\n * 判断是否在范围内\n * @param num - 数字\n * @param min - 最小值\n * @param max - 最大值\n * @param inclusive - 是否包含边界,默认为 true\n * @returns 是否在范围内\n */\nexport function isBetween(num: number, min: number, max: number, inclusive = true): boolean {\n if (inclusive) {\n return num >= min && num <= max;\n }\n return num > min && num < max;\n}\n\n/**\n * 百分比计算\n * @param value - 当前值(0-1之间的小数)或当前值(当提供total时)\n * @param decimals - 小数位数,默认为 0(当value是0-1之间的小数时)或总值(当value是实际值时)\n * @returns 百分比数字(当value是0-1之间的小数时)或百分比字符串(当提供total时)\n */\nexport function percent(value: number, decimals?: number): number;\nexport function percent(value: number, total: number, decimals: number): string;\nexport function percent(\n value: number,\n decimalsOrTotal?: number,\n decimals?: number\n): number | string {\n // 如果 value 是 0-1 之间的小数,且只传了一个参数或第二个参数是小数位数\n if (value >= 0 && value <= 1 && (decimalsOrTotal === undefined || decimalsOrTotal < 10)) {\n const dec = decimalsOrTotal ?? 0;\n return Number((value * 100).toFixed(dec));\n }\n\n // 如果提供了 total(第二个参数大于等于10,认为是total)\n if (decimalsOrTotal !== undefined && decimalsOrTotal >= 10) {\n const total = decimalsOrTotal;\n const dec = decimals ?? 2;\n if (total === 0) return '0%';\n return `${((value / total) * 100).toFixed(dec)}%`;\n }\n\n // 默认情况:value 是 0-1 之间的小数\n const dec = decimalsOrTotal ?? 0;\n return Number((value * 100).toFixed(dec));\n}\n\n/**\n * 货币格式化\n * @param num - 数字\n * @param currency - 货币符号,默认为 '¥'\n * @param decimals - 小数位数,默认为 2\n * @returns 格式化后的货币字符串\n */\nexport function formatCurrency(num: number, currency = '¥', decimals = 2): string {\n return `${currency}${formatNumber(num, { decimals, separator: ',' })}`;\n}\n\n/**\n * 字节格式化\n * @param bytes - 字节数\n * @param decimals - 小数位数,默认为 2\n * @returns 格式化后的字节字符串\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${sizes[i]}`;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/browser/network.ts"],"names":["url"],"mappings":"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","file":"chunk-4RGXV4SJ.js","sourcesContent":["/**\n * 网络工具函数\n */\n\n/**\n * 带重试的fetch\n * @param url - 请求URL\n * @param options - fetch选项\n * @param retryCount - 重试次数,默认为 3\n * @param retryDelay - 重试延迟(毫秒),默认为 1000\n * @returns Promise<Response>\n */\nexport async function fetchWithRetry(\n url: string,\n options: RequestInit = {},\n retryCount = 3,\n retryDelay = 1000\n): Promise<Response> {\n let lastError: Error | null = null;\n\n for (let i = 0; i <= retryCount; i++) {\n try {\n const response = await fetch(url, options);\n if (response.ok) {\n return response;\n }\n // 如果不是最后一次尝试,继续重试\n if (i < retryCount) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n continue;\n }\n return response;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (i < retryCount) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n }\n }\n }\n\n throw lastError || new Error('Fetch failed after retries');\n}\n\n/**\n * 带超时的fetch\n * @param url - 请求URL\n * @param options - fetch选项\n * @param timeout - 超时时间(毫秒),默认为 5000\n * @returns Promise<Response>\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeout = 5000\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${timeout}ms`);\n }\n throw error;\n }\n}\n\n/**\n * 文件下载\n * @param url - 文件URL\n * @param filename - 文件名,可选\n * @returns Promise<void>\n */\nexport async function downloadFile(url: string, filename?: string): Promise<void> {\n if (typeof window === 'undefined') {\n throw new Error('downloadFile is only available in browser environment');\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n\n const blob = await response.blob();\n const downloadUrl = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = downloadUrl;\n link.download = filename || url.split('/').pop() || 'download';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(downloadUrl);\n } catch (error) {\n throw error instanceof Error ? error : new Error(String(error));\n }\n}\n\n/**\n * 检查网络状态\n * @returns 是否在线\n */\nexport function checkOnline(): boolean {\n if (typeof navigator === 'undefined') return true;\n return navigator.onLine;\n}\n\n/**\n * 统一的HTTP请求封装\n * @param url - 请求URL\n * @param options - 请求选项\n * @returns Promise<T>\n */\nexport async function request<T = unknown>(\n url: string,\n options: {\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n timeout?: number;\n retry?: number;\n } = {}\n): Promise<T> {\n const { method = 'GET', headers = {}, body, timeout, retry = 0 } = options;\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n };\n\n if (body) {\n fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n let fetchFn: (url: string, options: RequestInit) => Promise<Response> = fetch;\n\n if (timeout) {\n fetchFn = (url, opts) => fetchWithTimeout(url, opts, timeout);\n }\n\n if (retry > 0) {\n fetchFn = (url, opts) => fetchWithRetry(url, opts, retry);\n }\n\n const response = await fetchFn(url, fetchOptions);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return response.json() as Promise<T>;\n }\n\n return response.text() as Promise<T>;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helper/tracking.ts"],"names":[],"mappings":"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","file":"chunk-56W6YECK.js","sourcesContent":["/**\n * 埋点追踪工具\n */\n\n/**\n * 埋点事件类型\n */\nexport type TrackingEventType = 'event' | 'pageview' | 'click' | 'exposure' | 'custom';\n\n/**\n * 埋点事件数据\n */\nexport interface TrackingEvent {\n /** 事件类型 */\n type: TrackingEventType;\n /** 事件名称 */\n name: string;\n /** 事件参数 */\n params?: Record<string, unknown>;\n /** 时间戳 */\n timestamp: number;\n /** 页面URL */\n url?: string;\n /** 用户代理 */\n userAgent?: string;\n /** 用户ID */\n userId?: string;\n /** 会话ID */\n sessionId?: string;\n /** 其他自定义字段 */\n [key: string]: unknown;\n}\n\n/**\n * 埋点配置选项\n */\nexport interface TrackerOptions {\n /** 上报接口URL */\n endpoint: string;\n /** 批量上报大小,默认10 */\n batchSize?: number;\n /** 批量上报延迟(毫秒),默认3000 */\n batchDelay?: number;\n /** 是否自动追踪页面浏览,默认true */\n autoTrackPageView?: boolean;\n /** 是否自动追踪点击事件,默认false */\n autoTrackClick?: boolean;\n /** 公共参数 */\n commonParams?: Record<string, unknown>;\n /** 自定义上报函数 */\n customSend?: (events: TrackingEvent[]) => Promise<void>;\n /** 是否启用调试模式,默认false */\n debug?: boolean;\n}\n\n/**\n * 曝光追踪选项\n */\nexport interface ExposureOptions {\n /** 曝光阈值(0-1),元素可见比例达到此值才触发,默认0.5 */\n threshold?: number;\n /** 曝光时长(毫秒),元素可见时长达到此值才触发,默认1000 */\n duration?: number;\n /** 是否只触发一次,默认true */\n once?: boolean;\n}\n\n/**\n * 埋点追踪器类\n */\nexport class Tracker {\n private options: Required<\n Pick<\n TrackerOptions,\n 'batchSize' | 'batchDelay' | 'autoTrackPageView' | 'autoTrackClick' | 'debug'\n >\n > &\n Pick<TrackerOptions, 'endpoint' | 'commonParams' | 'customSend'>;\n private eventQueue: TrackingEvent[] = [];\n private batchTimer: ReturnType<typeof setTimeout> | null = null;\n private userInfo: Record<string, unknown> = {};\n private sessionId: string;\n private exposureObservers: Map<string, IntersectionObserver> = new Map();\n private exposureTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private exposedElements: Set<Element> = new Set();\n\n constructor(options: TrackerOptions) {\n if (!options.endpoint && !options.customSend) {\n throw new Error('Either endpoint or customSend must be provided');\n }\n\n this.options = {\n endpoint: options.endpoint || '',\n batchSize: options.batchSize ?? 10,\n batchDelay: options.batchDelay ?? 3000,\n autoTrackPageView: options.autoTrackPageView ?? true,\n autoTrackClick: options.autoTrackClick ?? false,\n commonParams: options.commonParams || {},\n customSend: options.customSend,\n debug: options.debug ?? false,\n };\n\n // 生成会话ID\n this.sessionId = this.generateSessionId();\n\n // 自动追踪页面浏览\n if (this.options.autoTrackPageView && typeof window !== 'undefined') {\n this.trackPageView();\n // 监听路由变化(SPA应用)\n this.setupPageViewListener();\n }\n\n // 自动追踪点击事件\n if (this.options.autoTrackClick && typeof window !== 'undefined') {\n this.setupClickListener();\n }\n }\n\n /**\n * 生成会话ID\n */\n private generateSessionId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * 获取公共数据\n */\n private getCommonData(): Pick<TrackingEvent, 'timestamp' | 'sessionId'> &\n Partial<Omit<TrackingEvent, 'timestamp' | 'sessionId'>> {\n const data: Pick<TrackingEvent, 'timestamp' | 'sessionId'> &\n Partial<Omit<TrackingEvent, 'timestamp' | 'sessionId'>> = {\n timestamp: Date.now(),\n sessionId: this.sessionId,\n ...this.options.commonParams,\n ...this.userInfo,\n };\n\n if (typeof window !== 'undefined') {\n data.url = window.location.href;\n data.userAgent = navigator.userAgent;\n }\n\n return data;\n }\n\n /**\n * 添加事件到队列\n */\n private enqueue(event: TrackingEvent): void {\n this.eventQueue.push(event);\n\n if (this.options.debug) {\n console.log('[Tracker] Event enqueued:', event);\n }\n\n // 如果队列达到批量大小,立即上报\n if (this.eventQueue.length >= this.options.batchSize) {\n this.flush();\n } else {\n // 否则设置延迟上报\n this.scheduleBatch();\n }\n }\n\n /**\n * 安排批量上报\n */\n private scheduleBatch(): void {\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n }\n\n this.batchTimer = setTimeout(() => {\n this.flush();\n }, this.options.batchDelay);\n }\n\n /**\n * 上报事件\n */\n private async sendEvents(events: TrackingEvent[]): Promise<void> {\n if (events.length === 0) return;\n\n try {\n if (this.options.customSend) {\n await this.options.customSend(events);\n } else if (this.options.endpoint) {\n await this.sendToEndpoint(events);\n }\n\n if (this.options.debug) {\n console.log('[Tracker] Events sent:', events);\n }\n } catch (error) {\n console.error('[Tracker] Failed to send events:', error);\n // 失败后重新加入队列(可选:限制重试次数)\n this.eventQueue.unshift(...events);\n }\n }\n\n /**\n * 发送到上报接口\n */\n private async sendToEndpoint(events: TrackingEvent[]): Promise<void> {\n const response = await fetch(this.options.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ events }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n }\n\n /**\n * 立即上报所有待上报事件\n */\n async flush(): Promise<void> {\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n\n if (this.eventQueue.length === 0) return;\n\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n await this.sendEvents(events);\n }\n\n /**\n * 追踪事件\n */\n trackEvent(name: string, params?: Record<string, unknown>): void {\n const event: TrackingEvent = {\n type: 'event',\n name,\n params,\n ...this.getCommonData(),\n };\n\n this.enqueue(event);\n }\n\n /**\n * 追踪页面浏览\n */\n trackPageView(params?: Record<string, unknown>): void {\n const event: TrackingEvent = {\n type: 'pageview',\n name: 'pageview',\n params: {\n path: typeof window !== 'undefined' ? window.location.pathname : undefined,\n search: typeof window !== 'undefined' ? window.location.search : undefined,\n hash: typeof window !== 'undefined' ? window.location.hash : undefined,\n ...params,\n },\n ...this.getCommonData(),\n };\n\n this.enqueue(event);\n }\n\n /**\n * 追踪点击事件\n */\n trackClick(element: Element | string, params?: Record<string, unknown>): void {\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (!el) {\n if (this.options.debug) {\n console.warn('[Tracker] Element not found:', element);\n }\n return;\n }\n\n const event: TrackingEvent = {\n type: 'click',\n name: 'click',\n params: {\n element: el.tagName.toLowerCase(),\n id: el.id || undefined,\n className: el.className || undefined,\n text: el.textContent?.trim().substring(0, 100) || undefined,\n ...params,\n },\n ...this.getCommonData(),\n };\n\n this.enqueue(event);\n }\n\n /**\n * 追踪曝光事件\n */\n trackExposure(\n element: Element | string,\n options?: ExposureOptions,\n params?: Record<string, unknown>\n ): void {\n if (typeof window === 'undefined' || !window.IntersectionObserver) {\n if (this.options.debug) {\n console.warn('[Tracker] IntersectionObserver is not supported');\n }\n return;\n }\n\n const el = typeof element === 'string' ? document.querySelector(element) : element;\n if (!el) {\n if (this.options.debug) {\n console.warn('[Tracker] Element not found:', element);\n }\n return;\n }\n\n const { threshold = 0.5, duration = 1000, once = true } = options || {};\n\n const elementId = `${Date.now()}-${Math.random()}`;\n\n // 如果已经曝光过且只触发一次,直接返回\n if (once && this.exposedElements.has(el)) {\n return;\n }\n\n let exposureTimer: ReturnType<typeof setTimeout> | null = null;\n let startTime: number | null = null;\n\n const observer = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n if (entry.isIntersecting && entry.intersectionRatio >= threshold) {\n // 开始计时\n if (!startTime) {\n startTime = Date.now();\n const currentStartTime = startTime;\n exposureTimer = setTimeout(() => {\n // 触发曝光事件\n const event: TrackingEvent = {\n type: 'exposure',\n name: 'exposure',\n params: {\n element: el.tagName.toLowerCase(),\n id: el.id || undefined,\n className: el.className || undefined,\n duration: currentStartTime ? Date.now() - currentStartTime : duration,\n ...params,\n },\n ...this.getCommonData(),\n };\n\n this.enqueue(event);\n this.exposedElements.add(el);\n\n // 清理\n observer.disconnect();\n this.exposureObservers.delete(elementId);\n if (exposureTimer) {\n clearTimeout(exposureTimer);\n this.exposureTimers.delete(elementId);\n }\n }, duration);\n this.exposureTimers.set(elementId, exposureTimer);\n }\n } else {\n // 不可见,重置计时\n if (exposureTimer) {\n clearTimeout(exposureTimer);\n this.exposureTimers.delete(elementId);\n }\n startTime = null;\n }\n });\n },\n {\n threshold: [threshold],\n }\n );\n\n observer.observe(el);\n this.exposureObservers.set(elementId, observer);\n }\n\n /**\n * 设置用户信息\n */\n setUserInfo(userInfo: Record<string, unknown>): void {\n this.userInfo = { ...this.userInfo, ...userInfo };\n }\n\n /**\n * 设置公共参数\n */\n setCommonParams(params: Record<string, unknown>): void {\n this.options.commonParams = { ...this.options.commonParams, ...params };\n }\n\n /**\n * 设置页面浏览监听器(SPA应用)\n */\n private setupPageViewListener(): void {\n if (typeof window === 'undefined') return;\n\n // 监听popstate事件(浏览器前进后退)\n window.addEventListener('popstate', () => {\n this.trackPageView();\n });\n\n // 监听pushState和replaceState(需要重写history方法)\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function (...args) {\n originalPushState.apply(history, args);\n window.dispatchEvent(new Event('pushstate'));\n };\n\n history.replaceState = function (...args) {\n originalReplaceState.apply(history, args);\n window.dispatchEvent(new Event('replacestate'));\n };\n\n window.addEventListener('pushstate', () => {\n this.trackPageView();\n });\n\n window.addEventListener('replacestate', () => {\n this.trackPageView();\n });\n }\n\n /**\n * 设置点击事件监听器\n */\n private setupClickListener(): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n document.addEventListener(\n 'click',\n event => {\n const target = event.target as Element;\n if (target) {\n this.trackClick(target);\n }\n },\n true // 使用捕获阶段\n );\n }\n\n /**\n * 清理资源\n */\n destroy(): void {\n // 清理定时器\n if (this.batchTimer) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n\n // 清理曝光观察器\n this.exposureObservers.forEach(observer => observer.disconnect());\n this.exposureObservers.clear();\n\n // 清理曝光定时器\n this.exposureTimers.forEach(timer => clearTimeout(timer));\n this.exposureTimers.clear();\n\n // 上报剩余事件\n this.flush().catch(console.error);\n }\n}\n\n/**\n * 创建埋点追踪器实例\n */\nexport function createTracker(options: TrackerOptions): Tracker {\n return new Tracker(options);\n}\n\n/**\n * 默认追踪器实例(单例模式)\n */\nlet defaultTracker: Tracker | null = null;\n\n/**\n * 初始化默认追踪器\n */\nexport function initTracker(options: TrackerOptions): Tracker {\n if (defaultTracker) {\n console.warn('[Tracker] Default tracker already initialized');\n return defaultTracker;\n }\n defaultTracker = new Tracker(options);\n return defaultTracker;\n}\n\n/**\n * 获取默认追踪器\n */\nexport function getTracker(): Tracker {\n if (!defaultTracker) {\n throw new Error('Tracker not initialized. Call initTracker() first.');\n }\n return defaultTracker;\n}\n\n/**\n * 追踪事件(使用默认追踪器)\n */\nexport function trackEvent(name: string, params?: Record<string, unknown>): void {\n getTracker().trackEvent(name, params);\n}\n\n/**\n * 追踪页面浏览(使用默认追踪器)\n */\nexport function trackPageView(params?: Record<string, unknown>): void {\n getTracker().trackPageView(params);\n}\n\n/**\n * 追踪点击事件(使用默认追踪器)\n */\nexport function trackClick(element: Element | string, params?: Record<string, unknown>): void {\n getTracker().trackClick(element, params);\n}\n\n/**\n * 追踪曝光事件(使用默认追踪器)\n */\nexport function trackExposure(\n element: Element | string,\n options?: ExposureOptions,\n params?: Record<string, unknown>\n): void {\n getTracker().trackExposure(element, options, params);\n}\n\n/**\n * 设置用户信息(使用默认追踪器)\n */\nexport function setUserInfo(userInfo: Record<string, unknown>): void {\n getTracker().setUserInfo(userInfo);\n}\n\n/**\n * 设置公共参数(使用默认追踪器)\n */\nexport function setCommonParams(params: Record<string, unknown>): void {\n getTracker().setCommonParams(params);\n}\n\n/**\n * 立即上报(使用默认追踪器)\n */\nexport async function flush(): Promise<void> {\n await getTracker().flush();\n}\n"]}
|
package/dist/chunk-5BGSUGTI.mjs
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
// src/core/date.ts
|
|
2
|
-
function formatDate(date, format = "YYYY-MM-DD HH:mm:ss") {
|
|
3
|
-
const d = typeof date === "number" ? new Date(date) : date;
|
|
4
|
-
const year = d.getFullYear();
|
|
5
|
-
const month = String(d.getMonth() + 1).padStart(2, "0");
|
|
6
|
-
const day = String(d.getDate()).padStart(2, "0");
|
|
7
|
-
const hours = String(d.getHours()).padStart(2, "0");
|
|
8
|
-
const minutes = String(d.getMinutes()).padStart(2, "0");
|
|
9
|
-
const seconds = String(d.getSeconds()).padStart(2, "0");
|
|
10
|
-
return format.replace("YYYY", String(year)).replace("MM", month).replace("DD", day).replace("HH", hours).replace("mm", minutes).replace("ss", seconds);
|
|
11
|
-
}
|
|
12
|
-
function getRelativeTime(date) {
|
|
13
|
-
const now = /* @__PURE__ */ new Date();
|
|
14
|
-
const target = typeof date === "number" ? new Date(date) : date;
|
|
15
|
-
const diff = now.getTime() - target.getTime();
|
|
16
|
-
const seconds = Math.floor(diff / 1e3);
|
|
17
|
-
const minutes = Math.floor(seconds / 60);
|
|
18
|
-
const hours = Math.floor(minutes / 60);
|
|
19
|
-
const days = Math.floor(hours / 24);
|
|
20
|
-
const months = Math.floor(days / 30);
|
|
21
|
-
const years = Math.floor(days / 365);
|
|
22
|
-
if (years > 0) return `${years}\u5E74\u524D`;
|
|
23
|
-
if (months > 0) return `${months}\u4E2A\u6708\u524D`;
|
|
24
|
-
if (days > 0) return `${days}\u5929\u524D`;
|
|
25
|
-
if (hours > 0) return `${hours}\u5C0F\u65F6\u524D`;
|
|
26
|
-
if (minutes > 0) return `${minutes}\u5206\u949F\u524D`;
|
|
27
|
-
if (seconds > 0) return `${seconds}\u79D2\u524D`;
|
|
28
|
-
return "\u521A\u521A";
|
|
29
|
-
}
|
|
30
|
-
function isToday(date) {
|
|
31
|
-
const d = typeof date === "number" ? new Date(date) : date;
|
|
32
|
-
const today = /* @__PURE__ */ new Date();
|
|
33
|
-
return d.getDate() === today.getDate() && d.getMonth() === today.getMonth() && d.getFullYear() === today.getFullYear();
|
|
34
|
-
}
|
|
35
|
-
function isYesterday(date) {
|
|
36
|
-
const d = typeof date === "number" ? new Date(date) : date;
|
|
37
|
-
const yesterday = /* @__PURE__ */ new Date();
|
|
38
|
-
yesterday.setDate(yesterday.getDate() - 1);
|
|
39
|
-
return d.getDate() === yesterday.getDate() && d.getMonth() === yesterday.getMonth() && d.getFullYear() === yesterday.getFullYear();
|
|
40
|
-
}
|
|
41
|
-
function getTimeFromGMT(gmt) {
|
|
42
|
-
const now = /* @__PURE__ */ new Date();
|
|
43
|
-
const localOffset = now.getTimezoneOffset();
|
|
44
|
-
const gmtOffsetMinutes = gmt * 60;
|
|
45
|
-
const targetTime = new Date(now.getTime() + localOffset * 6e4 + gmtOffsetMinutes * 6e4);
|
|
46
|
-
const format = getDateFormatByGMT(gmt);
|
|
47
|
-
return formatDate(targetTime, format);
|
|
48
|
-
}
|
|
49
|
-
function getDateFormatByGMT(gmt) {
|
|
50
|
-
switch (gmt) {
|
|
51
|
-
case 0:
|
|
52
|
-
return "YYYY-MM-DD HH:mm:ss";
|
|
53
|
-
case 1:
|
|
54
|
-
case 2:
|
|
55
|
-
case 3:
|
|
56
|
-
return "YYYY-MM-DD HH:mm:ss";
|
|
57
|
-
case 8:
|
|
58
|
-
return "YYYY-MM-DD HH:mm:ss";
|
|
59
|
-
case 9:
|
|
60
|
-
return "YYYY-MM-DD HH:mm:ss";
|
|
61
|
-
case -5:
|
|
62
|
-
case -6:
|
|
63
|
-
case -7:
|
|
64
|
-
case -8:
|
|
65
|
-
return "MM/DD/YYYY HH:mm:ss";
|
|
66
|
-
default:
|
|
67
|
-
return "YYYY-MM-DD HH:mm:ss";
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
function addDays(date, days) {
|
|
71
|
-
const d = typeof date === "number" ? new Date(date) : new Date(date);
|
|
72
|
-
d.setDate(d.getDate() + days);
|
|
73
|
-
return d;
|
|
74
|
-
}
|
|
75
|
-
function addMonths(date, months) {
|
|
76
|
-
const d = typeof date === "number" ? new Date(date) : new Date(date);
|
|
77
|
-
d.setMonth(d.getMonth() + months);
|
|
78
|
-
return d;
|
|
79
|
-
}
|
|
80
|
-
function addYears(date, years) {
|
|
81
|
-
const d = typeof date === "number" ? new Date(date) : new Date(date);
|
|
82
|
-
d.setFullYear(d.getFullYear() + years);
|
|
83
|
-
return d;
|
|
84
|
-
}
|
|
85
|
-
function diffDays(date1, date2) {
|
|
86
|
-
const d1 = typeof date1 === "number" ? new Date(date1) : date1;
|
|
87
|
-
const d2 = typeof date2 === "number" ? new Date(date2) : date2;
|
|
88
|
-
const diff = d1.getTime() - d2.getTime();
|
|
89
|
-
return Math.floor(diff / (1e3 * 60 * 60 * 24));
|
|
90
|
-
}
|
|
91
|
-
function startOfDay(date) {
|
|
92
|
-
const d = typeof date === "number" ? new Date(date) : new Date(date);
|
|
93
|
-
d.setHours(0, 0, 0, 0);
|
|
94
|
-
return d;
|
|
95
|
-
}
|
|
96
|
-
function endOfDay(date) {
|
|
97
|
-
const d = typeof date === "number" ? new Date(date) : new Date(date);
|
|
98
|
-
d.setHours(23, 59, 59, 999);
|
|
99
|
-
return d;
|
|
100
|
-
}
|
|
101
|
-
function isWeekend(date) {
|
|
102
|
-
const d = typeof date === "number" ? new Date(date) : date;
|
|
103
|
-
const day = d.getDay();
|
|
104
|
-
return day === 0 || day === 6;
|
|
105
|
-
}
|
|
106
|
-
function isWeekday(date) {
|
|
107
|
-
return !isWeekend(date);
|
|
108
|
-
}
|
|
109
|
-
function getWeekNumber(date) {
|
|
110
|
-
const d = typeof date === "number" ? new Date(date) : new Date(date);
|
|
111
|
-
const target = new Date(d.valueOf());
|
|
112
|
-
const dayNr = (d.getDay() + 6) % 7;
|
|
113
|
-
target.setDate(target.getDate() - dayNr + 3);
|
|
114
|
-
const firstThursday = target.valueOf();
|
|
115
|
-
target.setMonth(0, 1);
|
|
116
|
-
if (target.getDay() !== 4) {
|
|
117
|
-
target.setMonth(0, 1 + (4 - target.getDay() + 7) % 7);
|
|
118
|
-
}
|
|
119
|
-
return 1 + Math.ceil((firstThursday - target.valueOf()) / 6048e5);
|
|
120
|
-
}
|
|
121
|
-
function getQuarter(date) {
|
|
122
|
-
const d = typeof date === "number" ? new Date(date) : date;
|
|
123
|
-
return Math.floor(d.getMonth() / 3) + 1;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export { addDays, addMonths, addYears, diffDays, endOfDay, formatDate, getDateFormatByGMT, getQuarter, getRelativeTime, getTimeFromGMT, getWeekNumber, isToday, isWeekday, isWeekend, isYesterday, startOfDay };
|
|
127
|
-
//# sourceMappingURL=chunk-5BGSUGTI.mjs.map
|
|
128
|
-
//# sourceMappingURL=chunk-5BGSUGTI.mjs.map
|