@cloudcome/utils-core 1.19.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +1 -1
  2. package/dist/array.cjs +181 -125
  3. package/dist/array.cjs.map +1 -1
  4. package/dist/array.mjs +181 -133
  5. package/dist/array.mjs.map +1 -1
  6. package/dist/async.cjs +181 -171
  7. package/dist/async.cjs.map +1 -1
  8. package/dist/async.mjs +181 -174
  9. package/dist/async.mjs.map +1 -1
  10. package/dist/base64.cjs +16 -12
  11. package/dist/base64.cjs.map +1 -1
  12. package/dist/base64.mjs +17 -14
  13. package/dist/base64.mjs.map +1 -1
  14. package/dist/cache.cjs +79 -67
  15. package/dist/cache.cjs.map +1 -1
  16. package/dist/cache.d.ts +3 -3
  17. package/dist/cache.mjs +80 -71
  18. package/dist/cache.mjs.map +1 -1
  19. package/dist/color.cjs +478 -167
  20. package/dist/color.cjs.map +1 -1
  21. package/dist/color.d.ts +3 -3
  22. package/dist/color.mjs +480 -197
  23. package/dist/color.mjs.map +1 -1
  24. package/dist/crypto.cjs +474 -687
  25. package/dist/crypto.cjs.map +1 -1
  26. package/dist/crypto.mjs +476 -693
  27. package/dist/crypto.mjs.map +1 -1
  28. package/dist/date.cjs +972 -161
  29. package/dist/date.cjs.map +1 -1
  30. package/dist/date.d.ts +2 -2
  31. package/dist/date.mjs +962 -191
  32. package/dist/date.mjs.map +1 -1
  33. package/dist/dict.cjs +90 -52
  34. package/dist/dict.cjs.map +1 -1
  35. package/dist/dict.d.ts +1 -1
  36. package/dist/dict.mjs +91 -54
  37. package/dist/dict.mjs.map +1 -1
  38. package/dist/easing.cjs +105 -103
  39. package/dist/easing.cjs.map +1 -1
  40. package/dist/easing.mjs +106 -133
  41. package/dist/easing.mjs.map +1 -1
  42. package/dist/emitter.cjs +101 -96
  43. package/dist/emitter.cjs.map +1 -1
  44. package/dist/emitter.mjs +101 -97
  45. package/dist/emitter.mjs.map +1 -1
  46. package/dist/env.cjs +43 -9
  47. package/dist/env.cjs.map +1 -1
  48. package/dist/env.d.ts +1 -1
  49. package/dist/env.mjs +43 -15
  50. package/dist/env.mjs.map +1 -1
  51. package/dist/error.cjs +26 -5
  52. package/dist/error.cjs.map +1 -1
  53. package/dist/error.mjs +26 -7
  54. package/dist/error.mjs.map +1 -1
  55. package/dist/exception.cjs +38 -20
  56. package/dist/exception.cjs.map +1 -1
  57. package/dist/exception.d.ts +5 -5
  58. package/dist/exception.mjs +38 -21
  59. package/dist/exception.mjs.map +1 -1
  60. package/dist/function.cjs +128 -68
  61. package/dist/function.cjs.map +1 -1
  62. package/dist/function.mjs +128 -72
  63. package/dist/function.mjs.map +1 -1
  64. package/dist/index.cjs +8 -3
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.mjs +9 -5
  67. package/dist/index.mjs.map +1 -1
  68. package/dist/number.cjs +10 -14
  69. package/dist/number.mjs +2 -15
  70. package/dist/object/get-set.d.ts +27 -3
  71. package/dist/object/merge.d.ts +2 -2
  72. package/dist/object.cjs +369 -106
  73. package/dist/object.cjs.map +1 -1
  74. package/dist/object.mjs +366 -115
  75. package/dist/object.mjs.map +1 -1
  76. package/dist/path.cjs +144 -55
  77. package/dist/path.cjs.map +1 -1
  78. package/dist/path.mjs +144 -62
  79. package/dist/path.mjs.map +1 -1
  80. package/dist/promise.cjs +84 -43
  81. package/dist/promise.cjs.map +1 -1
  82. package/dist/promise.mjs +85 -50
  83. package/dist/promise.mjs.map +1 -1
  84. package/dist/qs.cjs +63 -39
  85. package/dist/qs.cjs.map +1 -1
  86. package/dist/qs.mjs +64 -42
  87. package/dist/qs.mjs.map +1 -1
  88. package/dist/regexp.cjs +118 -35
  89. package/dist/regexp.cjs.map +1 -1
  90. package/dist/regexp.mjs +119 -46
  91. package/dist/regexp.mjs.map +1 -1
  92. package/dist/string.cjs +12 -15
  93. package/dist/string.mjs +2 -16
  94. package/dist/string2.cjs +378 -142
  95. package/dist/string2.cjs.map +1 -1
  96. package/dist/string2.mjs +259 -143
  97. package/dist/string2.mjs.map +1 -1
  98. package/dist/time.cjs +136 -59
  99. package/dist/time.cjs.map +1 -1
  100. package/dist/time.mjs +136 -65
  101. package/dist/time.mjs.map +1 -1
  102. package/dist/timer.cjs +122 -112
  103. package/dist/timer.cjs.map +1 -1
  104. package/dist/timer.mjs +123 -115
  105. package/dist/timer.mjs.map +1 -1
  106. package/dist/tree.cjs +207 -112
  107. package/dist/tree.cjs.map +1 -1
  108. package/dist/tree.mjs +207 -116
  109. package/dist/tree.mjs.map +1 -1
  110. package/dist/try/curry.d.ts +1 -1
  111. package/dist/try.cjs +36 -37
  112. package/dist/try.cjs.map +1 -1
  113. package/dist/try.mjs +35 -37
  114. package/dist/try.mjs.map +1 -1
  115. package/dist/type.cjs +126 -24
  116. package/dist/type.cjs.map +1 -1
  117. package/dist/type.d.ts +2 -2
  118. package/dist/type.mjs +128 -45
  119. package/dist/type.mjs.map +1 -1
  120. package/dist/types.cjs +0 -2
  121. package/dist/types.d.ts +2 -2
  122. package/dist/types.mjs +0 -2
  123. package/dist/unique.cjs +41 -38
  124. package/dist/unique.cjs.map +1 -1
  125. package/dist/unique.mjs +42 -41
  126. package/dist/unique.mjs.map +1 -1
  127. package/dist/url.cjs +39 -30
  128. package/dist/url.cjs.map +1 -1
  129. package/dist/url.mjs +40 -33
  130. package/dist/url.mjs.map +1 -1
  131. package/dist/version.cjs +51 -33
  132. package/dist/version.cjs.map +1 -1
  133. package/dist/version.mjs +51 -35
  134. package/dist/version.mjs.map +1 -1
  135. package/package.json +104 -105
  136. package/dist/const.cjs +0 -14
  137. package/dist/const.cjs.map +0 -1
  138. package/dist/const.mjs +0 -15
  139. package/dist/const.mjs.map +0 -1
  140. package/dist/core.cjs +0 -362
  141. package/dist/core.cjs.map +0 -1
  142. package/dist/core.mjs +0 -363
  143. package/dist/core.mjs.map +0 -1
  144. package/dist/crypto/md5.d.mts +0 -1
  145. package/dist/crypto/sha1.d.mts +0 -1
  146. package/dist/crypto/sha256.d.mts +0 -1
  147. package/dist/crypto/sha512.d.mts +0 -1
  148. package/dist/each.cjs +0 -18
  149. package/dist/each.cjs.map +0 -1
  150. package/dist/each.mjs +0 -19
  151. package/dist/each.mjs.map +0 -1
  152. package/dist/merge.cjs +0 -87
  153. package/dist/merge.cjs.map +0 -1
  154. package/dist/merge.mjs +0 -88
  155. package/dist/merge.mjs.map +0 -1
  156. package/dist/number.cjs.map +0 -1
  157. package/dist/number.mjs.map +0 -1
  158. package/dist/string.cjs.map +0 -1
  159. package/dist/string.mjs.map +0 -1
  160. package/dist/types.cjs.map +0 -1
  161. package/dist/types.mjs.map +0 -1
package/dist/object.cjs CHANGED
@@ -1,136 +1,399 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const each = require("./each.cjs");
4
- const type = require("./type.cjs");
5
- const merge = require("./merge.cjs");
2
+ const require_type = require("./type.cjs");
3
+ //#region src/object/each.ts
4
+ /**
5
+ * 遍历对象的每个键值对,并对每个键值对执行提供的回调函数。
6
+ *
7
+ * @param obj - 要遍历的对象。
8
+ * @param iterator - 对每个键值对执行的回调函数。如果回调函数返回 false,则提前终止遍历。
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const obj = { a: 1, b: 2, c: 3 };
13
+ * const results: [string, number][] = [];
14
+ * objectEach(obj, (val, key) => {
15
+ * results.push([key, val]);
16
+ * });
17
+ * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]
18
+ * ```
19
+ */
20
+ function objectEach(obj, iterator) {
21
+ for (const [key, val] of Object.entries(obj)) if (iterator.call(obj, val, key) === false) break;
22
+ }
23
+ /**
24
+ * 异步遍历对象的每个键值对,并对每个键值对执行提供的回调函数。
25
+ *
26
+ * @param obj - 要遍历的对象。
27
+ * @param iterator - 对每个键值对执行的异步回调函数。如果回调函数返回 false,则提前终止遍历。
28
+ * @returns 返回一个 Promise,当所有异步操作完成后,Promise 会被 resolve。
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const obj = { a: 1, b: 2, c: 3 };
33
+ * const results: [string, number][] = [];
34
+ * await objectEachAsync(obj, async (val, key) => {
35
+ * results.push([key, val]);
36
+ * });
37
+ * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]
38
+ * ```
39
+ */
40
+ async function objectEachAsync(obj, iterator) {
41
+ for (const [key, val] of Object.entries(obj)) if (await iterator.call(obj, val, key) === false) break;
42
+ }
43
+ //#endregion
44
+ //#region src/object/get-set.ts
6
45
  function pathToKeys(path) {
7
- if (type.isArray(path)) return [...path];
8
- let pathFinal = path.replace(/\[(\w+)\]/g, ".$1");
9
- pathFinal = pathFinal.replace(/^\./, "");
10
- return pathFinal.split(".");
46
+ if (require_type.isArray(path)) return [...path];
47
+ let pathFinal = path.replace(/\[(\w+)\]/g, ".$1");
48
+ pathFinal = pathFinal.replace(/^\./, "");
49
+ return pathFinal.split(".");
11
50
  }
12
51
  function isObjectOrArray(v) {
13
- return type.isObject(v) || type.isArray(v);
52
+ return require_type.isObject(v) || require_type.isArray(v);
14
53
  }
54
+ /**
55
+ * 根据属性路径获取属性值
56
+ * @param {O} obj
57
+ * @param {string | string[] | P} path
58
+ * @returns {ObjectNode<O>}
59
+ * 根据属性路径获取属性值。
60
+ *
61
+ * @template O - 目标对象的类型。
62
+ * @template P - 属性路径的类型。
63
+ * @param {O} obj - 要操作的目标对象。
64
+ * @param {P | string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 "a.b.c")或数组形式(如 ["a", "b", "c"])。
65
+ * @returns {ObjectNode<O>} 返回一个包含父级、键名路径、键名和键值的对象节点。
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const obj = { a: { b: { c: 42 } } };
70
+ * const result = objectGet(obj, 'a.b.c');
71
+ * console.log(result.value); // 输出 42
72
+ * ```
73
+ */
15
74
  function objectGet(obj, path) {
16
- const keys = pathToKeys(path);
17
- const lastKey = keys.pop();
18
- let parent = obj;
19
- const keysFinal = [];
20
- for (let i = 0; i < keys.length; i++) {
21
- const key = keys[i];
22
- keysFinal.push(key);
23
- if (!isObjectOrArray(parent)) break;
24
- parent = parent[key];
25
- }
26
- return {
27
- parent,
28
- keys: keysFinal,
29
- key: lastKey,
30
- // @ts-ignore
31
- value: isObjectOrArray(parent) && lastKey ? parent[lastKey] : void 0
32
- };
75
+ const keys = pathToKeys(path);
76
+ const lastKey = keys.pop();
77
+ let parent = obj;
78
+ const keysFinal = [];
79
+ for (let i = 0; i < keys.length; i++) {
80
+ const key = keys[i];
81
+ keysFinal.push(key);
82
+ if (!isObjectOrArray(parent)) break;
83
+ parent = parent[key];
84
+ }
85
+ return {
86
+ parent,
87
+ keys: keysFinal,
88
+ key: lastKey,
89
+ value: isObjectOrArray(parent) && lastKey ? parent[lastKey] : void 0
90
+ };
33
91
  }
34
- const defaultObjectSetOptions = {
35
- beforeSet: () => true,
36
- undefinedSet: () => ({})
92
+ var defaultObjectSetOptions = {
93
+ beforeSet: () => true,
94
+ undefinedSet: () => ({})
37
95
  };
96
+ /**
97
+ * 根据属性路径设置属性值
98
+ * @param {AnyObject} obj
99
+ * @param {string} path
100
+ * @param {V} val
101
+ * @param {Partial<ObjectSetOptions<O>>} options
102
+ * @returns {ObjectNode<O, V>}
103
+ * 根据属性路径设置属性值。
104
+ *
105
+ * @template O - 目标对象的类型。
106
+ * @template V - 要设置的值的类型。
107
+ * @param {O} obj - 要操作的目标对象。
108
+ * @param {string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 "a.b.c")或数组形式(如 ["a", "b", "c"])。
109
+ * @param {V} val - 要设置的值。
110
+ * @param {Partial<ObjectSetOptions<O>>} [options] - 可选配置项,用于控制设置行为。
111
+ * @returns {ObjectNode<V>} 返回一个包含父级、键名路径、键名和键值的对象节点。
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * const obj = {};
116
+ * objectSet(obj, 'a.b.c', 42);
117
+ * console.log(obj); // 输出 { a: { b: { c: 42 } } }
118
+ *
119
+ * objectSet(obj, 'a.b.c', 100, {
120
+ * beforeSet: (node) => node.key === 'c',
121
+ * });
122
+ * console.log(obj); // 输出 { a: { b: { c: 100 } } }
123
+ * ```
124
+ */
38
125
  function objectSet(obj, path, val, options) {
39
- const { beforeSet, undefinedSet } = Object.assign({}, defaultObjectSetOptions, options);
40
- const keys = pathToKeys(path);
41
- const lastKey = keys.pop();
42
- let parent = obj;
43
- let stopped = false;
44
- const keysFinal = [];
45
- for (const key of keys) {
46
- let val2 = parent[key];
47
- keysFinal.push(key);
48
- if (type.isUndefined(val2)) {
49
- const seted = undefinedSet({
50
- parent,
51
- keys: keysFinal,
52
- key,
53
- value: val2
54
- });
55
- if (!seted) {
56
- stopped = true;
57
- break;
58
- }
59
- val2 = parent[key] = seted;
60
- }
61
- parent = val2;
62
- }
63
- if (!stopped && !type.isUndefined(lastKey)) {
64
- keysFinal.push(lastKey);
65
- if (beforeSet({
66
- parent,
67
- keys: keysFinal,
68
- key: lastKey,
69
- value: parent[lastKey]
70
- })) {
71
- parent[lastKey] = val;
72
- }
73
- }
74
- return {
75
- keys: keysFinal,
76
- parent,
77
- key: lastKey,
78
- value: val
79
- };
126
+ const { beforeSet, undefinedSet } = Object.assign({}, defaultObjectSetOptions, options);
127
+ const keys = pathToKeys(path);
128
+ const lastKey = keys.pop();
129
+ let parent = obj;
130
+ let stopped = false;
131
+ const keysFinal = [];
132
+ for (const key of keys) {
133
+ let val = parent[key];
134
+ keysFinal.push(key);
135
+ if (require_type.isUndefined(val)) {
136
+ const seted = undefinedSet({
137
+ parent,
138
+ keys: keysFinal,
139
+ key,
140
+ value: val
141
+ });
142
+ if (!seted) {
143
+ stopped = true;
144
+ break;
145
+ }
146
+ val = parent[key] = seted;
147
+ }
148
+ parent = val;
149
+ }
150
+ if (!stopped && !require_type.isUndefined(lastKey)) {
151
+ keysFinal.push(lastKey);
152
+ if (beforeSet({
153
+ parent,
154
+ keys: keysFinal,
155
+ key: lastKey,
156
+ value: parent[lastKey]
157
+ })) parent[lastKey] = val;
158
+ }
159
+ return {
160
+ keys: keysFinal,
161
+ parent,
162
+ key: lastKey,
163
+ value: val
164
+ };
80
165
  }
166
+ //#endregion
167
+ //#region src/object/is.ts
168
+ /**
169
+ * 检查一个对象是否为空对象(不包含任何自有属性,包括符号属性)。
170
+ *
171
+ * @param obj - 要检查的对象
172
+ * @returns 如果对象没有自有属性(包括符号属性)则返回 true,否则返回 false
173
+ *
174
+ * @example
175
+ * ```typescript
176
+ * isEmptyObject({}); // true
177
+ * isEmptyObject({ a: 1 }); // false
178
+ * isEmptyObject(Object.create(null)); // true
179
+ * isEmptyObject({ [Symbol('key')]: 'value' }); // false
180
+ * ```
181
+ */
81
182
  function isEmptyObject(obj) {
82
- return Object.getOwnPropertyNames(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0;
183
+ return Object.getOwnPropertyNames(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0;
83
184
  }
185
+ /**
186
+ * 检查一个对象是否为纯对象(通过对象字面量或Object构造函数创建,而非其他构造函数的实例)。
187
+ *
188
+ * @param obj - 要检查的对象
189
+ * @returns 如果是纯对象则返回 true,否则返回 false
190
+ *
191
+ * @example
192
+ * ```typescript
193
+ * isPlainObject({}); // true
194
+ * isPlainObject(Object.create(null)); // true
195
+ * isPlainObject(new Date()); // false
196
+ * isPlainObject([]); // false
197
+ * isPlainObject(() => {}); // false
198
+ * ```
199
+ */
84
200
  function isPlainObject(obj) {
85
- const proto = Object.getPrototypeOf(obj);
86
- if (!proto) return true;
87
- return proto === Object.prototype;
201
+ const proto = Object.getPrototypeOf(obj);
202
+ if (!proto) return true;
203
+ return proto === Object.prototype;
204
+ }
205
+ //#endregion
206
+ //#region src/object/merge.ts
207
+ function _objectMerge(mergeRule, target, ...sources) {
208
+ const seen = /* @__PURE__ */ new WeakMap();
209
+ const { assign, next } = mergeRule;
210
+ const align = (target, source) => {
211
+ const targetType = require_type.typeIs(target);
212
+ const sourceType = require_type.typeIs(source);
213
+ if (targetType === sourceType) return target;
214
+ return sourceType === "array" ? [] : {};
215
+ };
216
+ const each = (source, iterator) => {
217
+ if (require_type.isObject(source)) objectEach(source, iterator);
218
+ else source.forEach(iterator);
219
+ };
220
+ const merge = (target, source) => {
221
+ if (seen.has(source)) return seen.get(source);
222
+ const merged = align(target, source);
223
+ seen.set(source, merged);
224
+ each(source, (value, key) => {
225
+ if (!next({
226
+ target: merged,
227
+ source,
228
+ key
229
+ })) return;
230
+ if (require_type.isObject(value) || require_type.isArray(value)) merged[key] = assign({
231
+ target: merged,
232
+ source,
233
+ key,
234
+ merge: () => merge(merged[key], value)
235
+ });
236
+ else merged[key] = assign({
237
+ target: merged,
238
+ source,
239
+ key,
240
+ merge: () => value
241
+ });
242
+ });
243
+ return merged;
244
+ };
245
+ let returnTarget = target;
246
+ for (const source of sources) returnTarget = merge(target, source);
247
+ return returnTarget;
248
+ }
249
+ /**
250
+ * 合并多个对象或数组。如果遇到循环引用,则直接返回目标对象。
251
+ *
252
+ * @param target - 目标对象或数组。
253
+ * @param sources - 要合并的源对象或数组。
254
+ * @returns 合并后的对象或数组。
255
+ *
256
+ * @example
257
+ * ```typescript
258
+ * const obj1 = { a: 1, b: { x: 10 } };
259
+ * const obj2 = { b: { y: 20 }, c: 3 };
260
+ * const merged = objectMerge(obj1, obj2);
261
+ * console.log(merged); // { a: 1, b: { x: 10, y: 20 }, c: 3 }
262
+ * ```
263
+ */
264
+ function objectMerge(target, ...sources) {
265
+ return _objectMerge({
266
+ next() {
267
+ return true;
268
+ },
269
+ assign({ merge }) {
270
+ return merge();
271
+ }
272
+ }, target, ...sources);
273
+ }
274
+ /**
275
+ * 为对象设置默认值。如果目标对象中的属性为 `undefined`,则使用默认对象中的属性值。
276
+ * 支持多个默认对象,优先级从左到右依次降低。
277
+ * 如果目标对象中的属性已经是对象或数组,则递归地设置默认值。
278
+ *
279
+ * @param target - 目标对象或数组。
280
+ * @param defaults - 默认对象或数组。
281
+ * @returns 合并后的对象或数组。
282
+ *
283
+ * @example
284
+ * ```typescript
285
+ * const obj = { a: 1, b: undefined };
286
+ * const defaults = { a: 4, b: 2, c: 3 };
287
+ * const result = objectDefaults(obj, defaults);
288
+ * console.log(result); // { a: 1, b: 2, c: 3 }
289
+ *
290
+ * const obj2 = { a: 1, b: 2 };
291
+ * const defaults2 = { a: 5, b: 3, c: 4 };
292
+ * const result2 = objectDefaults(obj2, defaults2);
293
+ * console.log(result2); // { a: 1, b: 2, c: 4 }
294
+ *
295
+ * const obj3 = { a: { x: 1 }, b: undefined };
296
+ * const defaults3 = { a: { x: 4, z: 3 }, b: { y: 2 } };
297
+ * const result3 = objectDefaults(obj3, defaults3);
298
+ * console.log(result3); // { a: { x: 1, z: 3 }, b: { y: 2 } }
299
+ * ```
300
+ */
301
+ function objectDefaults(target, defaults) {
302
+ return _objectMerge({
303
+ next({ target, key }) {
304
+ return target[key] === void 0 || require_type.isObject(target[key]) || require_type.isArray(target[key]);
305
+ },
306
+ assign({ merge }) {
307
+ return merge();
308
+ }
309
+ }, target, defaults);
88
310
  }
311
+ //#endregion
312
+ //#region src/object/process.ts
313
+ /**
314
+ * 从对象中选择指定键的属性,返回一个新的对象。
315
+ *
316
+ * @param object - 要从中选择属性的对象。
317
+ * @param keys - 要选择的键数组。
318
+ * @returns 包含指定键属性的新对象。
319
+ *
320
+ * @example
321
+ * ```typescript
322
+ * const obj = { a: 1, b: 2, c: 3 };
323
+ * const result = objectPick(obj, ['a', 'c']);
324
+ * console.log(result); // { a: 1, c: 3 }
325
+ * ```
326
+ */
89
327
  function objectPick(object, keys) {
90
- const result = {};
91
- for (const key of keys) {
92
- if (key in object) {
93
- result[key] = object[key];
94
- }
95
- }
96
- return result;
328
+ const result = {};
329
+ for (const key of keys) if (key in object) result[key] = object[key];
330
+ return result;
97
331
  }
332
+ /**
333
+ * 从对象中排除指定键的属性,返回一个新的对象。
334
+ *
335
+ * @param object - 要从中排除属性的对象。
336
+ * @param keys - 要排除的键数组。
337
+ * @returns 排除指定键属性后的新对象。
338
+ *
339
+ * @example
340
+ * ```typescript
341
+ * const obj = { a: 1, b: 2, c: 3, d: 4 };
342
+ * const result = objectOmit(obj, ['a', 'd']);
343
+ * console.log(result); // { b: 2, c: 3 }
344
+ * ```
345
+ */
98
346
  function objectOmit(object, keys) {
99
- const result = {};
100
- for (const key in object) {
101
- if (!keys.includes(key)) {
102
- result[key] = object[key];
103
- }
104
- }
105
- return result;
347
+ const result = {};
348
+ for (const key in object) if (!keys.includes(key)) result[key] = object[key];
349
+ return result;
106
350
  }
351
+ /**
352
+ * 遍历对象的每个键值对,并对每个键值对执行提供的映射函数,返回一个新的对象。
353
+ *
354
+ * @param object - 要遍历的对象。
355
+ * @param mapper - 对每个键值对执行的映射函数。
356
+ * @returns 返回一个新的对象,其中每个值都是通过映射函数处理后的结果。
357
+ *
358
+ * @example
359
+ * ```typescript
360
+ * const obj = { a: 1, b: 2, c: 3 };
361
+ * const result = objectMap(obj, (val, key) => String(val * 2));
362
+ * console.log(result); // { a: '2', b: '4', c: '6' }
363
+ * ```
364
+ */
107
365
  function objectMap(object, mapper) {
108
- return Object.fromEntries(
109
- Object.entries(object).map(([key, value]) => [
110
- key,
111
- mapper(
112
- // @ts-expect-error
113
- value,
114
- key
115
- )
116
- ])
117
- );
366
+ return Object.fromEntries(Object.entries(object).map(([key, value]) => [key, mapper(value, key)]));
118
367
  }
368
+ /**
369
+ * 根据提供的过滤函数过滤对象的属性,返回一个新对象,只包含满足条件的属性。
370
+ *
371
+ * @param object - 要过滤的对象。
372
+ * @param predicate - 过滤函数,接收值和键作为参数,返回布尔值。
373
+ * @returns 包含满足过滤条件的属性的新对象。
374
+ *
375
+ * @example
376
+ * ```typescript
377
+ * const obj = { a: 1, b: 2, c: 3, d: 4 };
378
+ * const result = objectFilter(obj, (value, key) => value > 2);
379
+ * console.log(result); // { c: 3, d: 4 }
380
+ * ```
381
+ */
119
382
  function objectFilter(object, predicate) {
120
- return Object.fromEntries(
121
- Object.entries(object).filter(([key, value]) => predicate(value, key))
122
- );
383
+ return Object.fromEntries(Object.entries(object).filter(([key, value]) => predicate(value, key)));
123
384
  }
124
- exports.objectEach = each.objectEach;
125
- exports.objectEachAsync = each.objectEachAsync;
126
- exports.objectDefaults = merge.objectDefaults;
127
- exports.objectMerge = merge.objectMerge;
385
+ //#endregion
128
386
  exports.isEmptyObject = isEmptyObject;
129
387
  exports.isPlainObject = isPlainObject;
388
+ exports.objectDefaults = objectDefaults;
389
+ exports.objectEach = objectEach;
390
+ exports.objectEachAsync = objectEachAsync;
130
391
  exports.objectFilter = objectFilter;
131
392
  exports.objectGet = objectGet;
132
393
  exports.objectMap = objectMap;
394
+ exports.objectMerge = objectMerge;
133
395
  exports.objectOmit = objectOmit;
134
396
  exports.objectPick = objectPick;
135
397
  exports.objectSet = objectSet;
136
- //# sourceMappingURL=object.cjs.map
398
+
399
+ //# sourceMappingURL=object.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"object.cjs","sources":["../src/object/get-set.ts","../src/object/is.ts","../src/object/process.ts"],"sourcesContent":["import { isArray, isObject, isUndefined } from '@/type';\nimport type { AnyArray, AnyObject } from '@/types';\n\n// @ref https://stackoverflow.com/a/67609485\n\ntype Idx<T, K> = K extends keyof T\n ? T[K]\n : number extends keyof T\n ? K extends `${number}`\n ? T[number]\n : never\n : never;\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never;\n\ntype Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]];\n\nexport type ObjectPath<O, D extends number = 4> = [D] extends [never]\n ? never\n : O extends object\n ? {\n [K in keyof O]-?: K extends string | number ? `${K}` | Join<K, ObjectPath<O[K], Prev[D]>> : never;\n }[keyof O]\n : '';\n\nexport type ObjectLeafPath<O, D extends number = 4> = [D] extends [never]\n ? never\n : O extends object\n ? {\n [K in keyof O]-?: K extends string | number\n ? O[K] extends string | number\n ? `${K}` | Join<K, ObjectLeafPath<O[K], Prev[D]>>\n : Join<K, ObjectLeafPath<O[K], Prev[D]>>\n : never;\n }[keyof O]\n : '';\n\nexport type ObjectPathValue<O, P extends ObjectPath<O, 4>> = P extends `${infer Key}.${infer Rest}`\n ? Rest extends ObjectPath<Idx<O, Key>, 4>\n ? ObjectPathValue<Idx<O, Key>, Rest>\n : never\n : Idx<O, P>;\n\nfunction pathToKeys(path: string | string[]) {\n // 下文用到该数组时会进行修改操作,因此复制一份\n if (isArray(path)) return [...path];\n\n let pathFinal = path.replace(/\\[(\\w+)\\]/g, '.$1');\n pathFinal = pathFinal.replace(/^\\./, '');\n return pathFinal.split('.');\n}\n\nfunction isObjectOrArray(v: unknown) {\n return isObject(v) || isArray(v);\n}\n\n/**\n * 表示对象节点的信息。\n *\n * @template V - 键值的类型。\n */\nexport type ObjectNode<V = unknown | undefined> = {\n /**\n * 当前节点的父级对象。\n */\n parent: unknown | undefined;\n\n /**\n * 当前节点的键名路径。\n */\n keys: string[];\n\n /**\n * 当前节点的键名。\n */\n key: string | undefined;\n\n /**\n * 当前节点的键值。\n */\n value: V;\n};\n\n/**\n * 根据属性路径获取属性值\n * @param {O} obj\n * @param {string | string[] | P} path\n * @returns {ObjectNode<O>}\n * 根据属性路径获取属性值。\n *\n * @template O - 目标对象的类型。\n * @template P - 属性路径的类型。\n * @param {O} obj - 要操作的目标对象。\n * @param {P | string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 \"a.b.c\")或数组形式(如 [\"a\", \"b\", \"c\"])。\n * @returns {ObjectNode<O>} 返回一个包含父级、键名路径、键名和键值的对象节点。\n *\n * @example\n * ```typescript\n * const obj = { a: { b: { c: 42 } } };\n * const result = objectGet(obj, 'a.b.c');\n * console.log(result.value); // 输出 42\n * ```\n */\nexport function objectGet<O extends AnyObject, P extends ObjectPath<O>>(\n obj: O,\n path: P | string | string[],\n): ObjectNode<O> {\n const keys = pathToKeys(path);\n const lastKey = keys.pop();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n let parent: any = obj;\n const keysFinal: string[] = [];\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n keysFinal.push(key);\n if (!isObjectOrArray(parent)) break;\n\n // @ts-ignore\n parent = parent[key];\n }\n\n return {\n parent: parent,\n keys: keysFinal,\n key: lastKey,\n // @ts-ignore\n value: isObjectOrArray(parent) && lastKey ? parent[lastKey] : undefined,\n };\n}\n\n// /**\n// * 根据路径获取对象叶子节点值\n// * @param {O} obj\n// * @param {P} path\n// * @returns {ObjectNode<O>}\n// */\n// export function objectLeaf<O extends AnyObject, P extends ObjectLeafPath<O>>(obj: O, path: P) {\n// return objectGet(obj, path);\n// }\n\n/**\n * 配置选项,用于控制 `objectSet` 的行为。\n *\n * @template O - 目标对象的类型。\n */\nexport type ObjectSetOptions<O extends AnyObject> = {\n /**\n * 在设置值之前调用的钩子函数。\n * 如果返回 `false`,则阻止设置值。\n *\n * @param {ObjectNode<O> & { key: string }} node - 当前节点信息。\n * @returns {boolean | undefined | void} 返回 `false` 时阻止设置值。\n */\n // biome-ignore lint/suspicious/noConfusingVoidType: <explanation>\n beforeSet(node: ObjectNode<O> & { key: string }): boolean | undefined | void;\n\n /**\n * 当遇到未定义的中间节点时调用的钩子函数。\n * 返回值将用于创建中间节点。\n *\n * @param {ObjectNode<O>} node - 当前节点信息。\n * @returns {AnyObject | AnyArray | undefined | void} 返回值将用于创建中间节点。\n */\n // biome-ignore lint/suspicious/noConfusingVoidType: <explanation>\n undefinedSet(node: ObjectNode<O>): AnyObject | AnyArray | undefined | void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nconst defaultObjectSetOptions: ObjectSetOptions<any> = {\n beforeSet: () => true,\n undefinedSet: () => ({}),\n};\n\n/**\n * 根据属性路径设置属性值\n * @param {AnyObject} obj\n * @param {string} path\n * @param {V} val\n * @param {Partial<ObjectSetOptions<O>>} options\n * @returns {ObjectNode<O, V>}\n * 根据属性路径设置属性值。\n *\n * @template O - 目标对象的类型。\n * @template V - 要设置的值的类型。\n * @param {O} obj - 要操作的目标对象。\n * @param {string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 \"a.b.c\")或数组形式(如 [\"a\", \"b\", \"c\"])。\n * @param {V} val - 要设置的值。\n * @param {Partial<ObjectSetOptions<O>>} [options] - 可选配置项,用于控制设置行为。\n * @returns {ObjectNode<V>} 返回一个包含父级、键名路径、键名和键值的对象节点。\n *\n * @example\n * ```typescript\n * const obj = {};\n * objectSet(obj, 'a.b.c', 42);\n * console.log(obj); // 输出 { a: { b: { c: 42 } } }\n *\n * objectSet(obj, 'a.b.c', 100, {\n * beforeSet: (node) => node.key === 'c',\n * });\n * console.log(obj); // 输出 { a: { b: { c: 100 } } }\n * ```\n */\nexport function objectSet<O extends AnyObject, V>(\n obj: O,\n path: string | string[],\n val: V,\n options?: Partial<ObjectSetOptions<O>>,\n): ObjectNode<V> {\n const { beforeSet, undefinedSet } = Object.assign({}, defaultObjectSetOptions, options);\n const keys = pathToKeys(path);\n const lastKey = keys.pop();\n let parent = obj;\n let stopped = false;\n const keysFinal: string[] = [];\n\n for (const key of keys) {\n let val = parent[key];\n keysFinal.push(key);\n\n if (isUndefined(val)) {\n const seted = undefinedSet({\n parent: parent,\n keys: keysFinal,\n key: key,\n value: val,\n });\n\n if (!seted) {\n stopped = true;\n break;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n val = parent[key] = seted;\n }\n\n // @ts-ignore\n parent = val;\n }\n\n if (!stopped && !isUndefined(lastKey)) {\n keysFinal.push(lastKey);\n\n if (\n beforeSet({\n parent: parent,\n keys: keysFinal,\n key: lastKey,\n value: parent[lastKey],\n })\n ) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n parent[lastKey] = val;\n }\n }\n\n return {\n keys: keysFinal,\n parent: parent,\n key: lastKey,\n value: val,\n };\n}\n","import { isArray, isObject, isString, typeIs } from '@/type';\nimport type { AnyArray, AnyFunction, AnyObject } from '@/types';\n\n/**\n * 检查一个对象是否为空对象(不包含任何自有属性,包括符号属性)。\n *\n * @param obj - 要检查的对象\n * @returns 如果对象没有自有属性(包括符号属性)则返回 true,否则返回 false\n *\n * @example\n * ```typescript\n * isEmptyObject({}); // true\n * isEmptyObject({ a: 1 }); // false\n * isEmptyObject(Object.create(null)); // true\n * isEmptyObject({ [Symbol('key')]: 'value' }); // false\n * ```\n */\nexport function isEmptyObject(obj: AnyObject): boolean {\n return Object.getOwnPropertyNames(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0;\n}\n\n/**\n * 检查一个对象是否为纯对象(通过对象字面量或Object构造函数创建,而非其他构造函数的实例)。\n *\n * @param obj - 要检查的对象\n * @returns 如果是纯对象则返回 true,否则返回 false\n *\n * @example\n * ```typescript\n * isPlainObject({}); // true\n * isPlainObject(Object.create(null)); // true\n * isPlainObject(new Date()); // false\n * isPlainObject([]); // false\n * isPlainObject(() => {}); // false\n * ```\n */\nexport function isPlainObject(obj: AnyObject): boolean {\n const proto: unknown = Object.getPrototypeOf(obj);\n\n // 对象无原型\n if (!proto) return true;\n\n // 是否对象直接实例\n return proto === Object.prototype;\n}\n\n// 移除,原因是,定义对象尽可能的使用 type 关键字即可避开此问题\n// /**\n// * 精确对象,常用于联合类型判断\n// * 相关 bug:https://l.ydr.me/Zp88vFKc\n// */\n// // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n// export type ExactObject<T = any> = T extends AnyFunction\n// ? never\n// : T extends AnyArray\n// ? never\n// : T extends object\n// ? T\n// : never;\n//\n// /**\n// * 检查值是否为精确接口对象\n// * @param object - 传入对象,必须是一个对象与其他类型的联合\n// * @returns 如果值为对象则返回 true,否则返回 false\n// * @example\n// * ```typescript\n// * type Id = string | string[] | (() => string);\n// *\n// * interface Cache {\n// * id?: Id;\n// * }\n// *\n// * type Share = {\n// * id?: Id;\n// * }\n// *\n// * interface Options {\n// * cache?: Id | Cache;\n// * share?: Id | Share;\n// * }\n// *\n// * function test(options: Options) {\n// * // string | string[] | (() => string) | Cache | undefined\n// * const cache = options.cache;\n// *\n// * // Cache\n// * // 需要使用\n// * if (isExactObject(cache)) {\n// * cache.id;\n// * }\n// * // string[]\n// * else if (isArray(cache)) {\n// * cache.push();\n// * }\n// * // string\n// * else if (isString(cache)) {\n// * cache.charCodeAt(0);\n// * }\n// * // (() => string) | undefined\n// * else {\n// * cache?.();\n// * }\n// *\n// * // string | string[] | (() => string) | Share | undefined\n// * const share = options.share;\n// *\n// * // Share\n// * if (isObject(share)) {\n// * share.id;\n// * }\n// * // string[]\n// * else if (isArray(share)) {\n// * share.push();\n// * }\n// * // string\n// * else if (isString(share)) {\n// * share.charCodeAt(0);\n// * }\n// * // (() => string) | undefined\n// * else {\n// * share?.();\n// * }\n// * }\n// * ```\n// */\n// export function isExactObject<T>(object: T): object is ExactObject<T> {\n// return typeIs(object) === 'object';\n// }\n","import type { AnyObject } from '@/types';\n\n/**\n * 从对象中选择指定键的属性,返回一个新的对象。\n *\n * @param object - 要从中选择属性的对象。\n * @param keys - 要选择的键数组。\n * @returns 包含指定键属性的新对象。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const result = objectPick(obj, ['a', 'c']);\n * console.log(result); // { a: 1, c: 3 }\n * ```\n */\nexport function objectPick<T extends AnyObject, K extends keyof T>(object: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in object) {\n result[key] = object[key];\n }\n }\n return result;\n}\n\n/**\n * 从对象中排除指定键的属性,返回一个新的对象。\n *\n * @param object - 要从中排除属性的对象。\n * @param keys - 要排除的键数组。\n * @returns 排除指定键属性后的新对象。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3, d: 4 };\n * const result = objectOmit(obj, ['a', 'd']);\n * console.log(result); // { b: 2, c: 3 }\n * ```\n */\nexport function objectOmit<T extends AnyObject, K extends keyof T>(object: T, keys: K[]): Omit<T, K> {\n const result = {} as Omit<T, K>;\n for (const key in object) {\n if (!keys.includes(key as unknown as K)) {\n // @ts-expect-error\n result[key] = object[key];\n }\n }\n return result;\n}\n\n/**\n * 遍历对象的每个键值对,并对每个键值对执行提供的映射函数,返回一个新的对象。\n *\n * @param object - 要遍历的对象。\n * @param mapper - 对每个键值对执行的映射函数。\n * @returns 返回一个新的对象,其中每个值都是通过映射函数处理后的结果。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const result = objectMap(obj, (val, key) => String(val * 2));\n * console.log(result); // { a: '2', b: '4', c: '6' }\n * ```\n */\nexport function objectMap<T extends AnyObject, V>(\n object: T,\n mapper: (value: T[keyof T], key: keyof T) => V,\n): Record<keyof T, V> {\n return Object.fromEntries(\n Object.entries(object).map(([key, value]) => [\n key,\n mapper(\n // @ts-expect-error\n value,\n key as keyof T,\n ),\n ]),\n ) as Record<keyof T, V>;\n}\n\n/**\n * 根据提供的过滤函数过滤对象的属性,返回一个新对象,只包含满足条件的属性。\n *\n * @param object - 要过滤的对象。\n * @param predicate - 过滤函数,接收值和键作为参数,返回布尔值。\n * @returns 包含满足过滤条件的属性的新对象。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3, d: 4 };\n * const result = objectFilter(obj, (value, key) => value > 2);\n * console.log(result); // { c: 3, d: 4 }\n * ```\n */\nexport function objectFilter<T extends AnyObject>(\n object: T,\n predicate: (value: T[keyof T], key: keyof T) => boolean,\n): Partial<T> {\n return Object.fromEntries(\n Object.entries(object).filter(([key, value]) => predicate(value as T[keyof T], key as keyof T)),\n ) as Partial<T>;\n}\n"],"names":["isArray","isObject","val","isUndefined"],"mappings":"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"}
1
+ {"version":3,"file":"object.cjs","names":[],"sources":["../src/object/each.ts","../src/object/get-set.ts","../src/object/is.ts","../src/object/merge.ts","../src/object/process.ts"],"sourcesContent":["import type { AnyObject, MaybePromise } from '@/types';\n\n/**\n * 遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的回调函数。如果回调函数返回 false,则提前终止遍历。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * objectEach(obj, (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport function objectEach<\n O extends AnyObject,\n K extends keyof O & (string | number),\n>(obj: O, iterator: (this: O, val: O[K], key: K) => false | unknown): void {\n for (const [key, val] of Object.entries(obj)) {\n if (iterator.call(obj, val as O[K], key as K) === false) {\n break;\n }\n }\n}\n\n/**\n * 异步遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的异步回调函数。如果回调函数返回 false,则提前终止遍历。\n * @returns 返回一个 Promise,当所有异步操作完成后,Promise 会被 resolve。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * await objectEachAsync(obj, async (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport async function objectEachAsync<\n O extends AnyObject,\n K extends keyof O & (string | number),\n>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => MaybePromise<false | unknown>,\n): Promise<void> {\n for (const [key, val] of Object.entries(obj)) {\n if ((await iterator.call(obj, val as O[K], key as K)) === false) {\n break;\n }\n }\n}\n","import { isArray, isObject, isUndefined } from '@/type';\nimport type { AnyArray, AnyObject } from '@/types';\n\n// @ref https://stackoverflow.com/a/67609485\n\ntype Idx<T, K> = K extends keyof T\n ? T[K]\n : number extends keyof T\n ? K extends `${number}`\n ? T[number]\n : never\n : never;\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never;\n\ntype Prev = [\n never,\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 14,\n 15,\n 16,\n 17,\n 18,\n 19,\n 20,\n ...0[],\n];\n\nexport type ObjectPath<O, D extends number = 4> = [D] extends [never]\n ? never\n : O extends object\n ? {\n [K in keyof O]-?: K extends string | number\n ? `${K}` | Join<K, ObjectPath<O[K], Prev[D]>>\n : never;\n }[keyof O]\n : '';\n\nexport type ObjectLeafPath<O, D extends number = 4> = [D] extends [never]\n ? never\n : O extends object\n ? {\n [K in keyof O]-?: K extends string | number\n ? O[K] extends string | number\n ? `${K}` | Join<K, ObjectLeafPath<O[K], Prev[D]>>\n : Join<K, ObjectLeafPath<O[K], Prev[D]>>\n : never;\n }[keyof O]\n : '';\n\nexport type ObjectPathValue<\n O,\n P extends ObjectPath<O, 4>,\n> = P extends `${infer Key}.${infer Rest}`\n ? Rest extends ObjectPath<Idx<O, Key>, 4>\n ? ObjectPathValue<Idx<O, Key>, Rest>\n : never\n : Idx<O, P>;\n\nfunction pathToKeys(path: string | string[]) {\n // 下文用到该数组时会进行修改操作,因此复制一份\n if (isArray(path)) return [...path];\n\n let pathFinal = path.replace(/\\[(\\w+)\\]/g, '.$1');\n pathFinal = pathFinal.replace(/^\\./, '');\n return pathFinal.split('.');\n}\n\nfunction isObjectOrArray(v: unknown) {\n return isObject(v) || isArray(v);\n}\n\n/**\n * 表示对象节点的信息。\n *\n * @template V - 键值的类型。\n */\nexport type ObjectNode<V = unknown | undefined> = {\n /**\n * 当前节点的父级对象。\n */\n parent: unknown | undefined;\n\n /**\n * 当前节点的键名路径。\n */\n keys: string[];\n\n /**\n * 当前节点的键名。\n */\n key: string | undefined;\n\n /**\n * 当前节点的键值。\n */\n value: V;\n};\n\n/**\n * 根据属性路径获取属性值\n * @param {O} obj\n * @param {string | string[] | P} path\n * @returns {ObjectNode<O>}\n * 根据属性路径获取属性值。\n *\n * @template O - 目标对象的类型。\n * @template P - 属性路径的类型。\n * @param {O} obj - 要操作的目标对象。\n * @param {P | string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 \"a.b.c\")或数组形式(如 [\"a\", \"b\", \"c\"])。\n * @returns {ObjectNode<O>} 返回一个包含父级、键名路径、键名和键值的对象节点。\n *\n * @example\n * ```typescript\n * const obj = { a: { b: { c: 42 } } };\n * const result = objectGet(obj, 'a.b.c');\n * console.log(result.value); // 输出 42\n * ```\n */\nexport function objectGet<O extends AnyObject, P extends ObjectPath<O>>(\n obj: O,\n path: P | string | string[],\n): ObjectNode<O> {\n const keys = pathToKeys(path);\n const lastKey = keys.pop();\n // biome-ignore lint/suspicious/noExplicitAny: 内部使用\n let parent: any = obj;\n const keysFinal: string[] = [];\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n keysFinal.push(key);\n if (!isObjectOrArray(parent)) break;\n\n // @ts-expect-error\n parent = parent[key];\n }\n\n return {\n parent: parent,\n keys: keysFinal,\n key: lastKey,\n // @ts-expect-error\n value: isObjectOrArray(parent) && lastKey ? parent[lastKey] : undefined,\n };\n}\n\n// /**\n// * 根据路径获取对象叶子节点值\n// * @param {O} obj\n// * @param {P} path\n// * @returns {ObjectNode<O>}\n// */\n// export function objectLeaf<O extends AnyObject, P extends ObjectLeafPath<O>>(obj: O, path: P) {\n// return objectGet(obj, path);\n// }\n\n/**\n * 配置选项,用于控制 `objectSet` 的行为。\n *\n * @template O - 目标对象的类型。\n */\nexport type ObjectSetOptions<O extends AnyObject> = {\n /**\n * 在设置值之前调用的钩子函数。\n * 如果返回 `false`,则阻止设置值。\n *\n * @param {ObjectNode<O> & { key: string }} node - 当前节点信息。\n * @returns {boolean | undefined | void} 返回 `false` 时阻止设置值。\n */\n beforeSet(node: ObjectNode<O> & { key: string }): boolean | undefined;\n\n /**\n * 当遇到未定义的中间节点时调用的钩子函数。\n * 返回值将用于创建中间节点。\n *\n * @param {ObjectNode<O>} node - 当前节点信息。\n * @returns {AnyObject | AnyArray | undefined | void} 返回值将用于创建中间节点。\n */\n undefinedSet(node: ObjectNode<O>): AnyObject | AnyArray | undefined;\n};\n\n// biome-ignore lint/suspicious/noExplicitAny: 内部使用 any\nconst defaultObjectSetOptions: ObjectSetOptions<any> = {\n beforeSet: () => true,\n undefinedSet: () => ({}),\n};\n\n/**\n * 根据属性路径设置属性值\n * @param {AnyObject} obj\n * @param {string} path\n * @param {V} val\n * @param {Partial<ObjectSetOptions<O>>} options\n * @returns {ObjectNode<O, V>}\n * 根据属性路径设置属性值。\n *\n * @template O - 目标对象的类型。\n * @template V - 要设置的值的类型。\n * @param {O} obj - 要操作的目标对象。\n * @param {string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 \"a.b.c\")或数组形式(如 [\"a\", \"b\", \"c\"])。\n * @param {V} val - 要设置的值。\n * @param {Partial<ObjectSetOptions<O>>} [options] - 可选配置项,用于控制设置行为。\n * @returns {ObjectNode<V>} 返回一个包含父级、键名路径、键名和键值的对象节点。\n *\n * @example\n * ```typescript\n * const obj = {};\n * objectSet(obj, 'a.b.c', 42);\n * console.log(obj); // 输出 { a: { b: { c: 42 } } }\n *\n * objectSet(obj, 'a.b.c', 100, {\n * beforeSet: (node) => node.key === 'c',\n * });\n * console.log(obj); // 输出 { a: { b: { c: 100 } } }\n * ```\n */\nexport function objectSet<O extends AnyObject, V>(\n obj: O,\n path: string | string[],\n val: V,\n options?: Partial<ObjectSetOptions<O>>,\n): ObjectNode<V> {\n const { beforeSet, undefinedSet } = Object.assign(\n {},\n defaultObjectSetOptions,\n options,\n );\n const keys = pathToKeys(path);\n const lastKey = keys.pop();\n let parent = obj;\n let stopped = false;\n const keysFinal: string[] = [];\n\n for (const key of keys) {\n let val = parent[key];\n keysFinal.push(key);\n\n if (isUndefined(val)) {\n const seted = undefinedSet({\n parent: parent,\n keys: keysFinal,\n key: key,\n value: val,\n });\n\n if (!seted) {\n stopped = true;\n break;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n val = parent[key] = seted;\n }\n\n // @ts-expect-error\n parent = val;\n }\n\n if (!stopped && !isUndefined(lastKey)) {\n keysFinal.push(lastKey);\n\n if (\n beforeSet({\n parent: parent,\n keys: keysFinal,\n key: lastKey,\n value: parent[lastKey],\n })\n ) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n parent[lastKey] = val;\n }\n }\n\n return {\n keys: keysFinal,\n parent: parent,\n key: lastKey,\n value: val,\n };\n}\n","import type { AnyObject } from '@/types';\n\n/**\n * 检查一个对象是否为空对象(不包含任何自有属性,包括符号属性)。\n *\n * @param obj - 要检查的对象\n * @returns 如果对象没有自有属性(包括符号属性)则返回 true,否则返回 false\n *\n * @example\n * ```typescript\n * isEmptyObject({}); // true\n * isEmptyObject({ a: 1 }); // false\n * isEmptyObject(Object.create(null)); // true\n * isEmptyObject({ [Symbol('key')]: 'value' }); // false\n * ```\n */\nexport function isEmptyObject(obj: AnyObject): boolean {\n return (\n Object.getOwnPropertyNames(obj).length === 0 &&\n Object.getOwnPropertySymbols(obj).length === 0\n );\n}\n\n/**\n * 检查一个对象是否为纯对象(通过对象字面量或Object构造函数创建,而非其他构造函数的实例)。\n *\n * @param obj - 要检查的对象\n * @returns 如果是纯对象则返回 true,否则返回 false\n *\n * @example\n * ```typescript\n * isPlainObject({}); // true\n * isPlainObject(Object.create(null)); // true\n * isPlainObject(new Date()); // false\n * isPlainObject([]); // false\n * isPlainObject(() => {}); // false\n * ```\n */\nexport function isPlainObject(obj: AnyObject): boolean {\n const proto: unknown = Object.getPrototypeOf(obj);\n\n // 对象无原型\n if (!proto) return true;\n\n // 是否对象直接实例\n return proto === Object.prototype;\n}\n\n// 移除,原因是,定义对象尽可能的使用 type 关键字即可避开此问题\n// /**\n// * 精确对象,常用于联合类型判断\n// * 相关 bug:https://l.ydr.me/Zp88vFKc\n// */\n// // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n// export type ExactObject<T = any> = T extends AnyFunction\n// ? never\n// : T extends AnyArray\n// ? never\n// : T extends object\n// ? T\n// : never;\n//\n// /**\n// * 检查值是否为精确接口对象\n// * @param object - 传入对象,必须是一个对象与其他类型的联合\n// * @returns 如果值为对象则返回 true,否则返回 false\n// * @example\n// * ```typescript\n// * type Id = string | string[] | (() => string);\n// *\n// * interface Cache {\n// * id?: Id;\n// * }\n// *\n// * type Share = {\n// * id?: Id;\n// * }\n// *\n// * interface Options {\n// * cache?: Id | Cache;\n// * share?: Id | Share;\n// * }\n// *\n// * function test(options: Options) {\n// * // string | string[] | (() => string) | Cache | undefined\n// * const cache = options.cache;\n// *\n// * // Cache\n// * // 需要使用\n// * if (isExactObject(cache)) {\n// * cache.id;\n// * }\n// * // string[]\n// * else if (isArray(cache)) {\n// * cache.push();\n// * }\n// * // string\n// * else if (isString(cache)) {\n// * cache.charCodeAt(0);\n// * }\n// * // (() => string) | undefined\n// * else {\n// * cache?.();\n// * }\n// *\n// * // string | string[] | (() => string) | Share | undefined\n// * const share = options.share;\n// *\n// * // Share\n// * if (isObject(share)) {\n// * share.id;\n// * }\n// * // string[]\n// * else if (isArray(share)) {\n// * share.push();\n// * }\n// * // string\n// * else if (isString(share)) {\n// * share.charCodeAt(0);\n// * }\n// * // (() => string) | undefined\n// * else {\n// * share?.();\n// * }\n// * }\n// * ```\n// */\n// export function isExactObject<T>(object: T): object is ExactObject<T> {\n// return typeIs(object) === 'object';\n// }\n","import { isArray, isObject, typeIs } from '@/type';\nimport type { AnyArray, AnyObject } from '@/types';\nimport { objectEach } from './each';\n\nexport type ObjectMergeRule = {\n /**\n * 处理冲突\n * @param target - 目标对象\n * @param source - 源对象\n * @param key - 键名\n * @returns 返回 true 表示继续处理,否则返回 false\n */\n next: (info: {\n target: AnyObject | AnyArray;\n source: AnyObject | AnyArray;\n key: string | number;\n }) => boolean;\n\n /**\n * 处理赋值\n * @param target - 目标对象\n * @param source - 源对象\n * @param key - 键名\n * @returns 返回处理后的值\n */\n assign: (info: {\n target: AnyObject | AnyArray;\n source: AnyObject | AnyArray;\n key: string | number;\n merge: () => unknown;\n }) => unknown;\n};\n\nfunction _objectMerge(\n mergeRule: ObjectMergeRule,\n target: AnyObject | AnyArray,\n ...sources: (AnyObject | AnyArray)[]\n) {\n const seen = new WeakMap<AnyObject | AnyArray, AnyObject | AnyArray>();\n const { assign, next } = mergeRule;\n const align = (\n target: AnyObject | AnyArray,\n source: AnyObject | AnyArray,\n ) => {\n const targetType = typeIs(target);\n const sourceType = typeIs(source);\n\n if (targetType === sourceType) {\n return target;\n }\n\n return sourceType === 'array' ? [] : {};\n };\n const each = (\n source: AnyObject | AnyArray,\n // biome-ignore lint/suspicious/noExplicitAny: 内部使用 any\n iterator: (val: any, key: string | number) => void,\n ) => {\n if (isObject(source)) {\n objectEach(source, iterator);\n } else {\n source.forEach(iterator);\n }\n };\n\n const merge = (\n target: AnyObject | AnyArray,\n source: AnyObject | AnyArray,\n ): AnyObject | AnyArray => {\n // 如果循环引用了,则直接返回目标对象\n if (seen.has(source)) {\n // biome-ignore lint/style/noNonNullAssertion: 必须存在\n return seen.get(source)!;\n }\n\n // 对齐目标对象和源对象\n const merged = align(target, source);\n\n // 存储循环引用\n seen.set(source, merged);\n\n // 遍历源对象\n each(source, (value, key) => {\n if (!next({ target: merged, source, key })) {\n return;\n }\n\n if (isObject(value) || isArray(value)) {\n // @ts-expect-error\n merged[key] = assign({\n target: merged,\n source,\n key,\n // @ts-expect-error\n merge: () => merge(merged[key], value),\n });\n } else {\n // @ts-expect-error\n merged[key] = assign({\n target: merged,\n source,\n key,\n merge: () => value,\n });\n }\n });\n\n return merged;\n };\n\n let returnTarget = target;\n\n for (const source of sources) {\n returnTarget = merge(target, source);\n }\n\n return returnTarget;\n}\n\n/**\n * 合并多个对象或数组。如果遇到循环引用,则直接返回目标对象。\n *\n * @param target - 目标对象或数组。\n * @param sources - 要合并的源对象或数组。\n * @returns 合并后的对象或数组。\n *\n * @example\n * ```typescript\n * const obj1 = { a: 1, b: { x: 10 } };\n * const obj2 = { b: { y: 20 }, c: 3 };\n * const merged = objectMerge(obj1, obj2);\n * console.log(merged); // { a: 1, b: { x: 10, y: 20 }, c: 3 }\n * ```\n */\nexport function objectMerge(\n target: AnyObject | AnyArray,\n ...sources: (AnyObject | AnyArray)[]\n) {\n return _objectMerge(\n {\n next() {\n return true;\n },\n assign({ merge }) {\n return merge();\n },\n },\n target,\n ...sources,\n );\n}\n\n/**\n * 为对象设置默认值。如果目标对象中的属性为 `undefined`,则使用默认对象中的属性值。\n * 支持多个默认对象,优先级从左到右依次降低。\n * 如果目标对象中的属性已经是对象或数组,则递归地设置默认值。\n *\n * @param target - 目标对象或数组。\n * @param defaults - 默认对象或数组。\n * @returns 合并后的对象或数组。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: undefined };\n * const defaults = { a: 4, b: 2, c: 3 };\n * const result = objectDefaults(obj, defaults);\n * console.log(result); // { a: 1, b: 2, c: 3 }\n *\n * const obj2 = { a: 1, b: 2 };\n * const defaults2 = { a: 5, b: 3, c: 4 };\n * const result2 = objectDefaults(obj2, defaults2);\n * console.log(result2); // { a: 1, b: 2, c: 4 }\n *\n * const obj3 = { a: { x: 1 }, b: undefined };\n * const defaults3 = { a: { x: 4, z: 3 }, b: { y: 2 } };\n * const result3 = objectDefaults(obj3, defaults3);\n * console.log(result3); // { a: { x: 1, z: 3 }, b: { y: 2 } }\n * ```\n */\nexport function objectDefaults<T extends AnyObject | AnyArray>(\n target: T,\n defaults: T,\n): T {\n return _objectMerge(\n {\n next({ target, key }) {\n return (\n // @ts-expect-error\n target[key] === undefined ||\n // @ts-expect-error\n isObject(target[key]) ||\n // @ts-expect-error\n isArray(target[key])\n );\n },\n assign({ merge }) {\n return merge();\n },\n },\n target,\n defaults,\n ) as T;\n}\n","import type { AnyObject } from '@/types';\n\n/**\n * 从对象中选择指定键的属性,返回一个新的对象。\n *\n * @param object - 要从中选择属性的对象。\n * @param keys - 要选择的键数组。\n * @returns 包含指定键属性的新对象。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const result = objectPick(obj, ['a', 'c']);\n * console.log(result); // { a: 1, c: 3 }\n * ```\n */\nexport function objectPick<T extends AnyObject, K extends keyof T>(\n object: T,\n keys: K[],\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in object) {\n result[key] = object[key];\n }\n }\n return result;\n}\n\n/**\n * 从对象中排除指定键的属性,返回一个新的对象。\n *\n * @param object - 要从中排除属性的对象。\n * @param keys - 要排除的键数组。\n * @returns 排除指定键属性后的新对象。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3, d: 4 };\n * const result = objectOmit(obj, ['a', 'd']);\n * console.log(result); // { b: 2, c: 3 }\n * ```\n */\nexport function objectOmit<T extends AnyObject, K extends keyof T>(\n object: T,\n keys: K[],\n): Omit<T, K> {\n const result = {} as Omit<T, K>;\n for (const key in object) {\n if (!keys.includes(key as unknown as K)) {\n // @ts-expect-error\n result[key] = object[key];\n }\n }\n return result;\n}\n\n/**\n * 遍历对象的每个键值对,并对每个键值对执行提供的映射函数,返回一个新的对象。\n *\n * @param object - 要遍历的对象。\n * @param mapper - 对每个键值对执行的映射函数。\n * @returns 返回一个新的对象,其中每个值都是通过映射函数处理后的结果。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const result = objectMap(obj, (val, key) => String(val * 2));\n * console.log(result); // { a: '2', b: '4', c: '6' }\n * ```\n */\nexport function objectMap<T extends AnyObject, V>(\n object: T,\n mapper: (value: T[keyof T], key: keyof T) => V,\n): Record<keyof T, V> {\n return Object.fromEntries(\n Object.entries(object).map(([key, value]) => [\n key,\n mapper(\n // @ts-expect-error\n value,\n key as keyof T,\n ),\n ]),\n ) as Record<keyof T, V>;\n}\n\n/**\n * 根据提供的过滤函数过滤对象的属性,返回一个新对象,只包含满足条件的属性。\n *\n * @param object - 要过滤的对象。\n * @param predicate - 过滤函数,接收值和键作为参数,返回布尔值。\n * @returns 包含满足过滤条件的属性的新对象。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3, d: 4 };\n * const result = objectFilter(obj, (value, key) => value > 2);\n * console.log(result); // { c: 3, d: 4 }\n * ```\n */\nexport function objectFilter<T extends AnyObject>(\n object: T,\n predicate: (value: T[keyof T], key: keyof T) => boolean,\n): Partial<T> {\n return Object.fromEntries(\n Object.entries(object).filter(([key, value]) =>\n predicate(value as T[keyof T], key as keyof T),\n ),\n ) as Partial<T>;\n}\n"],"mappings":"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"}