@cloudcome/utils-core 1.1.1 → 1.2.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 (291) hide show
  1. package/dist/array.cjs +129 -0
  2. package/dist/array.cjs.map +1 -0
  3. package/dist/array.d.ts +171 -0
  4. package/dist/array.mjs +129 -0
  5. package/dist/array.mjs.map +1 -0
  6. package/dist/async.cjs +219 -0
  7. package/dist/async.cjs.map +1 -0
  8. package/dist/async.d.ts +137 -0
  9. package/dist/async.mjs +219 -0
  10. package/dist/async.mjs.map +1 -0
  11. package/dist/base64.cjs +16 -0
  12. package/dist/base64.cjs.map +1 -0
  13. package/dist/base64.d.ts +7 -0
  14. package/dist/base64.mjs +16 -0
  15. package/dist/base64.mjs.map +1 -0
  16. package/dist/cache.cjs +79 -0
  17. package/dist/cache.cjs.map +1 -0
  18. package/dist/cache.d.ts +90 -0
  19. package/dist/cache.mjs +79 -0
  20. package/dist/cache.mjs.map +1 -0
  21. package/{src/color/contrast.ts → dist/color/contrast.d.ts} +2 -12
  22. package/dist/color/distance.d.ts +8 -0
  23. package/dist/color/helpers.d.ts +2 -0
  24. package/dist/color/hex-hsl.d.ts +3 -0
  25. package/{src/color/hex-hsv.ts → dist/color/hex-hsv.d.ts} +3 -11
  26. package/{src/color/hex-hwb.ts → dist/color/hex-hwb.d.ts} +3 -11
  27. package/dist/color/hex-rgb.d.ts +18 -0
  28. package/{src/color/hsl-lighten.ts → dist/color/hsl-lighten.d.ts} +2 -7
  29. package/{src/color/hsv-brighten.ts → dist/color/hsv-brighten.d.ts} +2 -7
  30. package/{src/color/luminance.ts → dist/color/luminance.d.ts} +2 -9
  31. package/{src/color/mix.ts → dist/color/mix.d.ts} +2 -10
  32. package/dist/color/rgb-hsl.d.ts +23 -0
  33. package/{src/color/rgb-hsv.ts → dist/color/rgb-hsv.d.ts} +3 -30
  34. package/dist/color/rgb-hwb.d.ts +29 -0
  35. package/{src/color/rgb-lab.ts → dist/color/rgb-lab.d.ts} +3 -11
  36. package/dist/color/rgb-whiter.d.ts +12 -0
  37. package/dist/color/rgb-xyz.d.ts +22 -0
  38. package/{src/color/types.ts → dist/color/types.d.ts} +30 -12
  39. package/{src/color/xyz-lab.ts → dist/color/xyz-lab.d.ts} +3 -32
  40. package/dist/color.cjs +250 -0
  41. package/dist/color.cjs.map +1 -0
  42. package/dist/color.mjs +250 -0
  43. package/dist/color.mjs.map +1 -0
  44. package/dist/const.cjs +14 -0
  45. package/dist/const.cjs.map +1 -0
  46. package/dist/const.mjs +15 -0
  47. package/dist/const.mjs.map +1 -0
  48. package/dist/core.cjs +250 -0
  49. package/dist/core.cjs.map +1 -0
  50. package/dist/core.mjs +251 -0
  51. package/dist/core.mjs.map +1 -0
  52. package/dist/crypto/md5.d.mts +1 -0
  53. package/dist/crypto/sha1.d.mts +1 -0
  54. package/dist/crypto/sha256.d.mts +1 -0
  55. package/dist/crypto/sha512.d.mts +1 -0
  56. package/dist/crypto.cjs +812 -0
  57. package/dist/crypto.cjs.map +1 -0
  58. package/{src/crypto.ts → dist/crypto.d.ts} +4 -20
  59. package/dist/crypto.mjs +812 -0
  60. package/dist/crypto.mjs.map +1 -0
  61. package/dist/date/const.d.ts +6 -0
  62. package/dist/date/core.d.ts +52 -0
  63. package/dist/date/days.d.ts +23 -0
  64. package/{src/date/is.ts → dist/date/is.d.ts} +8 -102
  65. package/dist/date/relative.d.ts +44 -0
  66. package/dist/date/start-end.d.ts +73 -0
  67. package/dist/date/timezone.d.ts +67 -0
  68. package/dist/date/weeks.d.ts +72 -0
  69. package/dist/date.cjs +239 -0
  70. package/dist/date.cjs.map +1 -0
  71. package/dist/date.mjs +241 -0
  72. package/dist/date.mjs.map +1 -0
  73. package/dist/dict.cjs +2 -0
  74. package/dist/dict.cjs.map +1 -0
  75. package/dist/dict.mjs +2 -0
  76. package/dist/dict.mjs.map +1 -0
  77. package/dist/each.cjs +18 -0
  78. package/dist/each.cjs.map +1 -0
  79. package/dist/each.mjs +19 -0
  80. package/dist/each.mjs.map +1 -0
  81. package/dist/easing.cjs +151 -0
  82. package/dist/easing.cjs.map +1 -0
  83. package/dist/easing.d.ts +46 -0
  84. package/dist/easing.mjs +151 -0
  85. package/dist/easing.mjs.map +1 -0
  86. package/dist/emitter.cjs +94 -0
  87. package/dist/emitter.cjs.map +1 -0
  88. package/dist/emitter.d.ts +68 -0
  89. package/dist/emitter.mjs +94 -0
  90. package/dist/emitter.mjs.map +1 -0
  91. package/dist/enum.cjs +58 -0
  92. package/dist/enum.cjs.map +1 -0
  93. package/dist/enum.d.ts +68 -0
  94. package/dist/enum.mjs +58 -0
  95. package/dist/enum.mjs.map +1 -0
  96. package/dist/env.cjs +28 -0
  97. package/dist/env.cjs.map +1 -0
  98. package/{src/env.ts → dist/env.d.ts} +6 -30
  99. package/dist/env.mjs +28 -0
  100. package/dist/env.mjs.map +1 -0
  101. package/dist/error.cjs +12 -0
  102. package/dist/error.cjs.map +1 -0
  103. package/{src/error.ts → dist/error.d.ts} +3 -12
  104. package/dist/error.mjs +12 -0
  105. package/dist/error.mjs.map +1 -0
  106. package/dist/exception.cjs +22 -0
  107. package/dist/exception.cjs.map +1 -0
  108. package/dist/exception.d.ts +31 -0
  109. package/dist/exception.mjs +22 -0
  110. package/dist/exception.mjs.map +1 -0
  111. package/dist/fn.cjs +76 -0
  112. package/dist/fn.cjs.map +1 -0
  113. package/dist/fn.d.ts +102 -0
  114. package/dist/fn.mjs +76 -0
  115. package/dist/fn.mjs.map +1 -0
  116. package/dist/index.cjs +5 -0
  117. package/dist/index.cjs.map +1 -0
  118. package/dist/index.d.ts +1 -0
  119. package/dist/index.mjs +5 -0
  120. package/dist/index.mjs.map +1 -0
  121. package/dist/merge.cjs +87 -0
  122. package/dist/merge.cjs.map +1 -0
  123. package/dist/merge.mjs +88 -0
  124. package/dist/merge.mjs.map +1 -0
  125. package/dist/number.cjs +14 -0
  126. package/dist/number.cjs.map +1 -0
  127. package/dist/number.d.ts +153 -0
  128. package/dist/number.mjs +14 -0
  129. package/dist/number.mjs.map +1 -0
  130. package/{src/object/each.ts → dist/object/each.d.ts} +3 -23
  131. package/dist/object/get-set.d.ts +111 -0
  132. package/dist/object/is.d.ts +32 -0
  133. package/dist/object/merge.d.ts +72 -0
  134. package/{src/object/process.ts → dist/object/process.d.ts} +4 -38
  135. package/dist/object.cjs +130 -0
  136. package/dist/object.cjs.map +1 -0
  137. package/dist/object.mjs +130 -0
  138. package/dist/object.mjs.map +1 -0
  139. package/dist/path.cjs +77 -0
  140. package/dist/path.cjs.map +1 -0
  141. package/dist/path.d.ts +82 -0
  142. package/dist/path.mjs +77 -0
  143. package/dist/path.mjs.map +1 -0
  144. package/dist/promise.cjs +62 -0
  145. package/dist/promise.cjs.map +1 -0
  146. package/{src/promise.ts → dist/promise.d.ts} +6 -67
  147. package/dist/promise.mjs +62 -0
  148. package/dist/promise.mjs.map +1 -0
  149. package/dist/qs.cjs +47 -0
  150. package/dist/qs.cjs.map +1 -0
  151. package/{src/qs.ts → dist/qs.d.ts} +3 -60
  152. package/dist/qs.mjs +47 -0
  153. package/dist/qs.mjs.map +1 -0
  154. package/dist/regexp.cjs +66 -0
  155. package/dist/regexp.cjs.map +1 -0
  156. package/dist/regexp.d.ts +65 -0
  157. package/dist/regexp.mjs +66 -0
  158. package/dist/regexp.mjs.map +1 -0
  159. package/dist/string.cjs +16 -0
  160. package/dist/string.cjs.map +1 -0
  161. package/dist/string.d.ts +80 -0
  162. package/dist/string.mjs +16 -0
  163. package/dist/string.mjs.map +1 -0
  164. package/dist/string2.cjs +157 -0
  165. package/dist/string2.cjs.map +1 -0
  166. package/dist/string2.mjs +158 -0
  167. package/dist/string2.mjs.map +1 -0
  168. package/dist/time/from.d.ts +14 -0
  169. package/dist/time/to.d.ts +38 -0
  170. package/dist/time.cjs +82 -0
  171. package/dist/time.cjs.map +1 -0
  172. package/dist/time.mjs +82 -0
  173. package/dist/time.mjs.map +1 -0
  174. package/dist/timer.cjs +119 -0
  175. package/dist/timer.cjs.map +1 -0
  176. package/dist/timer.d.ts +96 -0
  177. package/{src/timer.ts → dist/timer.mjs} +17 -124
  178. package/dist/timer.mjs.map +1 -0
  179. package/dist/tree.cjs +125 -0
  180. package/dist/tree.cjs.map +1 -0
  181. package/{src/tree.ts → dist/tree.d.ts} +41 -225
  182. package/dist/tree.mjs +125 -0
  183. package/dist/tree.mjs.map +1 -0
  184. package/dist/type.cjs +78 -0
  185. package/dist/type.cjs.map +1 -0
  186. package/{src/type.ts → dist/type.d.ts} +20 -96
  187. package/dist/type.mjs +78 -0
  188. package/dist/type.mjs.map +1 -0
  189. package/dist/types.cjs +2 -0
  190. package/dist/types.cjs.map +1 -0
  191. package/{src/types.ts → dist/types.d.ts} +12 -33
  192. package/dist/types.mjs +2 -0
  193. package/dist/types.mjs.map +1 -0
  194. package/dist/unique.cjs +46 -0
  195. package/dist/unique.cjs.map +1 -0
  196. package/dist/unique.d.ts +22 -0
  197. package/dist/unique.mjs +46 -0
  198. package/dist/unique.mjs.map +1 -0
  199. package/dist/url.cjs +37 -0
  200. package/dist/url.cjs.map +1 -0
  201. package/dist/url.d.ts +53 -0
  202. package/dist/url.mjs +37 -0
  203. package/dist/url.mjs.map +1 -0
  204. package/dist/version.cjs +33 -0
  205. package/dist/version.cjs.map +1 -0
  206. package/dist/version.d.ts +32 -0
  207. package/dist/version.mjs +33 -0
  208. package/dist/version.mjs.map +1 -0
  209. package/package.json +8 -2
  210. package/CHANGELOG.md +0 -52
  211. package/src/array.ts +0 -312
  212. package/src/async.ts +0 -379
  213. package/src/base64.ts +0 -20
  214. package/src/cache.ts +0 -146
  215. package/src/color/distance.ts +0 -28
  216. package/src/color/helpers.ts +0 -23
  217. package/src/color/hex-hsl.ts +0 -11
  218. package/src/color/hex-rgb.ts +0 -39
  219. package/src/color/rgb-hsl.ts +0 -53
  220. package/src/color/rgb-hwb.ts +0 -56
  221. package/src/color/rgb-whiter.ts +0 -22
  222. package/src/color/rgb-xyz.ts +0 -62
  223. package/src/crypto/md5.mjs +0 -357
  224. package/src/crypto/sha1.mjs +0 -300
  225. package/src/crypto/sha256.mjs +0 -310
  226. package/src/crypto/sha512.mjs +0 -459
  227. package/src/date/const.ts +0 -6
  228. package/src/date/core.ts +0 -162
  229. package/src/date/days.ts +0 -51
  230. package/src/date/relative.ts +0 -92
  231. package/src/date/start-end.ts +0 -246
  232. package/src/date/timezone.ts +0 -220
  233. package/src/date/weeks.ts +0 -100
  234. package/src/dts/global.d.ts +0 -27
  235. package/src/easing.ts +0 -166
  236. package/src/emitter.ts +0 -117
  237. package/src/enum.ts +0 -171
  238. package/src/exception.ts +0 -68
  239. package/src/fn.ts +0 -197
  240. package/src/index.ts +0 -1
  241. package/src/number.ts +0 -236
  242. package/src/object/get-set.ts +0 -273
  243. package/src/object/is.ts +0 -128
  244. package/src/object/merge.ts +0 -180
  245. package/src/path.ts +0 -188
  246. package/src/regexp.ts +0 -156
  247. package/src/string.ts +0 -146
  248. package/src/time/from.ts +0 -57
  249. package/src/time/to.ts +0 -106
  250. package/src/unique.ts +0 -77
  251. package/src/url.ts +0 -93
  252. package/src/version.ts +0 -71
  253. package/test/array.test.ts +0 -332
  254. package/test/async-real.test.ts +0 -39
  255. package/test/async.test.ts +0 -375
  256. package/test/base64.test.ts +0 -32
  257. package/test/cache.test.ts +0 -83
  258. package/test/color.test.ts +0 -163
  259. package/test/crypto.test.ts +0 -34
  260. package/test/date-tz.test.ts +0 -206
  261. package/test/date.test.ts +0 -353
  262. package/test/easing.test.ts +0 -33
  263. package/test/emitter.test.ts +0 -71
  264. package/test/enum.test.ts +0 -113
  265. package/test/env.test.ts +0 -69
  266. package/test/error.test.ts +0 -58
  267. package/test/exception.test.ts +0 -43
  268. package/test/fn.test.ts +0 -263
  269. package/test/helpers.ts +0 -23
  270. package/test/index.test.ts +0 -6
  271. package/test/number.test.ts +0 -213
  272. package/test/object.test.ts +0 -309
  273. package/test/path.test.ts +0 -156
  274. package/test/promise.test.ts +0 -199
  275. package/test/qs.test.ts +0 -79
  276. package/test/regexp.test.ts +0 -97
  277. package/test/string.test.ts +0 -150
  278. package/test/time.test.ts +0 -214
  279. package/test/timer.test.ts +0 -114
  280. package/test/tree.test.ts +0 -348
  281. package/test/type.test.ts +0 -226
  282. package/test/unique.test.ts +0 -71
  283. package/test/url.test.ts +0 -136
  284. package/test/version.test.ts +0 -52
  285. package/tsconfig.json +0 -31
  286. package/vite.config.mts +0 -114
  287. /package/{src/color.ts → dist/color.d.ts} +0 -0
  288. /package/{src/date.ts → dist/date.d.ts} +0 -0
  289. /package/{src/dict.ts → dist/dict.d.ts} +0 -0
  290. /package/{src/object.ts → dist/object.d.ts} +0 -0
  291. /package/{src/time.ts → dist/time.d.ts} +0 -0
@@ -0,0 +1,153 @@
1
+ export type NumberFixedOptions = {
2
+ /**
3
+ * 保留的小数位数
4
+ * @default 0
5
+ */
6
+ precision?: number;
7
+ /**
8
+ * 舍入方法,0 为四舍五入,1 为向上取整,-1 为向下取整
9
+ * @default 0
10
+ */
11
+ round?: 0 | 1 | -1;
12
+ };
13
+ /**
14
+ * 对数字进行精确小数位数处理并按规则舍入
15
+ * @param number 需要处理的原始数值
16
+ * @param options 可选配置参数
17
+ * @returns 处理后的数值(number类型)
18
+ * @example
19
+ * // 四舍五入示例
20
+ * numberFixed(3.1415, { precision: 2 }); // 3.14
21
+ * // 向上取整示例
22
+ * numberFixed(3.1415, { precision: 2, round: 1 }); // 3.15
23
+ * // 向下取整示例
24
+ * numberFixed(3.9999, { precision: 1, round: -1 }); // 3.9
25
+ */
26
+ export declare function numberFixed(number: number, options?: NumberFixedOptions): number;
27
+ /**
28
+ * 生成指定范围内的随机整数
29
+ * @param {number} min - 随机数的最小值(包含)
30
+ * @param {number} max - 随机数的最大值(包含)
31
+ * @returns {number} - 生成的随机整数
32
+ * @example
33
+ * // 生成 1 到 10 之间的随机整数
34
+ * randomNumber(1, 10); // 可能返回 7
35
+ */
36
+ export declare function randomNumber(min: number, max: number): number;
37
+ /**
38
+ * 数字缩写选项
39
+ */
40
+ export type NumberAbbrOptions = {
41
+ /**
42
+ * 进制基数,用于计算单位进阶(如 1000 表示千进制)
43
+ * @default 1000
44
+ */
45
+ base?: number;
46
+ /**
47
+ * 数值保留的小数位数
48
+ * @default 0
49
+ */
50
+ precision?: number;
51
+ };
52
+ /**
53
+ * 将数字转换为带单位缩写的字符串表示
54
+ *
55
+ * @param {number} number - 需要转换的原始数值
56
+ * @param {Array<string>} units - 单位数组,按从小到大顺序排列(如['B','KB','MB']),不能为空
57
+ * @param {NumberAbbrOptions} [options] - 可选配置参数
58
+ * @returns {string} - 转换后的带单位字符串(如"1.2KB")
59
+ * @example
60
+ * // 基础用法
61
+ * numberAbbr(1500, ['', 'K', 'M'], { base: 1000 }); // "1.5K"
62
+ * @example
63
+ * // 自定义小数位
64
+ * numberAbbr(123456, ['B','KB','MB'], { precision: 1 }); // "0.1MB"
65
+ * @example
66
+ * // 处理不足基数的情况
67
+ * numberAbbr(500, ['B','KB']); // "500B"
68
+ */
69
+ export declare function numberAbbr(number: number, units: Array<string>, options?: NumberAbbrOptions): string;
70
+ /**
71
+ * 将文件大小转换为带单位缩写的字符串表示
72
+ *
73
+ * @param {number} number - 需要转换的文件大小数值
74
+ * @param {number} [precision=0] - 数值保留的小数位数
75
+ * @returns {string} - 转换后的带单位字符串(如"1.2KB")
76
+ * @example
77
+ * // 基础用法
78
+ * fileSizeAbbr(1024); // "1KB"
79
+ * @example
80
+ * // 自定义小数位
81
+ * fileSizeAbbr(123456, 1); // "0.1MB"
82
+ */
83
+ export declare function fileSizeAbbr(number: number, precision?: number): string;
84
+ /**
85
+ * 将十进制数转换为指定进制的字符串表示
86
+ *
87
+ * @param {number | bigint} decimal - 需要转换的十进制数,可以是任意长度的数字或大整数
88
+ * @param {string} [dict] - 用于表示进制的字符字典,默认为数字、小写字母和大写字母的组合(62 进制)
89
+ * @returns {string} - 转换后的指定进制字符串
90
+ * @throws {Error} - 如果字符字典的长度小于 2,将抛出错误
91
+ * @example
92
+ * // 默认 62 进制
93
+ * numberConvert(123456789); // "8M0kX"
94
+ * @example
95
+ * // 自定义 16 进制
96
+ * numberConvert(255, '0123456789ABCDEF'); // "FF"
97
+ * @example
98
+ * // 处理大整数
99
+ * numberConvert(9007199254740991n); // "2gosa7pa2GV"
100
+ */
101
+ export declare function numberConvert(decimal: number | bigint, dict?: string): string;
102
+ /**
103
+ * 数字格式化配置选项
104
+ */
105
+ export type NumberFormatOptions = {
106
+ /**
107
+ * 分隔符字符,用于数字分隔
108
+ * @default ','
109
+ * @example 使用 '_' 分隔符时,123456 会格式化为 '123_456'
110
+ */
111
+ separator?: string;
112
+ /**
113
+ * 分隔步长,即每隔多少位添加分隔符
114
+ * @default 3
115
+ * @example 步长为 2 时,123456 会格式化为 '12,34,56'
116
+ */
117
+ step?: number;
118
+ };
119
+ /**
120
+ * 数字格式化
121
+ * @param [number] {number} 数字
122
+ * @param options {NumberFormatOptions} 格式化配置
123
+ * @returns {string} 分割后的字符串
124
+ * @example
125
+ * // 使用默认分隔符和步长
126
+ * numberFormat(123456.789); // => "123,456.789"
127
+ * // 自定义分隔符
128
+ * numberFormat(123456.789, '_'); // => "123_456.789"
129
+ * // 自定义步长
130
+ * numberFormat(123456.789, 2); // => "12,34,56.789"
131
+ * // 使用对象配置
132
+ * numberFormat(123456.789, { separator: '.', step: 4 }); // => "12.3456.789"
133
+ */
134
+ export declare function numberFormat(number: number, options: NumberFormatOptions): string;
135
+ export declare function numberFormat(number: number, separator: string): string;
136
+ export declare function numberFormat(number: number, step: number): string;
137
+ export declare function numberFormat(number: number): string;
138
+ /**
139
+ * 将数字限制在指定范围内。
140
+ *
141
+ * @param min - 最小值。
142
+ * @param number - 要限制的数字。
143
+ * @param max - 最大值。
144
+ * @returns 限制后的数字。
145
+ */
146
+ export declare function numberClamp(min: number, number: number, max: number): number;
147
+ /**
148
+ * 为数字添加单位
149
+ * @param number - 需要处理的数字,可以是数字类型或字符串类型
150
+ * @param unit - 要添加的单位,默认为空字符串
151
+ * @returns 如果输入是数字或纯数字字符串,则返回带单位的字符串;否则返回原值
152
+ */
153
+ export declare function numberUnit(number: string | number, unit?: string): string;
@@ -0,0 +1,14 @@
1
+ import "./merge.mjs";
2
+ import { f, b, d, n, a, c, e, r } from "./string2.mjs";
3
+ import "./type.mjs";
4
+ export {
5
+ f as fileSizeAbbr,
6
+ b as numberAbbr,
7
+ d as numberClamp,
8
+ n as numberConvert,
9
+ a as numberFixed,
10
+ c as numberFormat,
11
+ e as numberUnit,
12
+ r as randomNumber
13
+ };
14
+ //# sourceMappingURL=number.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -1,5 +1,4 @@
1
- import type { AnyObject, MaybePromise } from '@/types';
2
-
1
+ import { AnyObject, MaybePromise } from '../types';
3
2
  /**
4
3
  * 遍历对象的每个键值对,并对每个键值对执行提供的回调函数。
5
4
  *
@@ -16,17 +15,7 @@ import type { AnyObject, MaybePromise } from '@/types';
16
15
  * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]
17
16
  * ```
18
17
  */
19
- export function objectEach<O extends AnyObject, K extends keyof O & (string | number)>(
20
- obj: O,
21
- iterator: (this: O, val: O[K], key: K) => false | unknown,
22
- ): void {
23
- for (const [key, val] of Object.entries(obj)) {
24
- if (iterator.call(obj, val as O[K], key as K) === false) {
25
- break;
26
- }
27
- }
28
- }
29
-
18
+ export declare function objectEach<O extends AnyObject, K extends keyof O & (string | number)>(obj: O, iterator: (this: O, val: O[K], key: K) => false | unknown): void;
30
19
  /**
31
20
  * 异步遍历对象的每个键值对,并对每个键值对执行提供的回调函数。
32
21
  *
@@ -44,13 +33,4 @@ export function objectEach<O extends AnyObject, K extends keyof O & (string | nu
44
33
  * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]
45
34
  * ```
46
35
  */
47
- export async function objectEachAsync<O extends AnyObject, K extends keyof O & (string | number)>(
48
- obj: O,
49
- iterator: (this: O, val: O[K], key: K) => MaybePromise<false | unknown>,
50
- ): Promise<void> {
51
- for (const [key, val] of Object.entries(obj)) {
52
- if ((await iterator.call(obj, val as O[K], key as K)) === false) {
53
- break;
54
- }
55
- }
56
- }
36
+ export declare function objectEachAsync<O extends AnyObject, K extends keyof O & (string | number)>(obj: O, iterator: (this: O, val: O[K], key: K) => MaybePromise<false | unknown>): Promise<void>;
@@ -0,0 +1,111 @@
1
+ import { AnyArray, AnyObject } from '../types';
2
+ type Idx<T, K> = K extends keyof T ? T[K] : number extends keyof T ? K extends `${number}` ? T[number] : never : never;
3
+ type Join<K, P> = K extends string | number ? P extends string | number ? `${K}${'' extends P ? '' : '.'}${P}` : never : never;
4
+ type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]];
5
+ export type ObjectPath<O, D extends number = 4> = [D] extends [never] ? never : O extends object ? {
6
+ [K in keyof O]-?: K extends string | number ? `${K}` | Join<K, ObjectPath<O[K], Prev[D]>> : never;
7
+ }[keyof O] : '';
8
+ export type ObjectLeafPath<O, D extends number = 4> = [D] extends [never] ? never : O extends object ? {
9
+ [K in keyof O]-?: K extends string | number ? O[K] extends string | number ? `${K}` | Join<K, ObjectLeafPath<O[K], Prev[D]>> : Join<K, ObjectLeafPath<O[K], Prev[D]>> : never;
10
+ }[keyof O] : '';
11
+ export type ObjectPathValue<O, P extends ObjectPath<O, 4>> = P extends `${infer Key}.${infer Rest}` ? Rest extends ObjectPath<Idx<O, Key>, 4> ? ObjectPathValue<Idx<O, Key>, Rest> : never : Idx<O, P>;
12
+ /**
13
+ * 表示对象节点的信息。
14
+ *
15
+ * @template V - 键值的类型。
16
+ */
17
+ export type TObjectNode<V = unknown | undefined> = {
18
+ /**
19
+ * 当前节点的父级对象。
20
+ */
21
+ parent: unknown | undefined;
22
+ /**
23
+ * 当前节点的键名路径。
24
+ */
25
+ keys: string[];
26
+ /**
27
+ * 当前节点的键名。
28
+ */
29
+ key: string | undefined;
30
+ /**
31
+ * 当前节点的键值。
32
+ */
33
+ value: V;
34
+ };
35
+ /**
36
+ * 根据属性路径获取属性值
37
+ * @param {O} obj
38
+ * @param {string | string[] | P} path
39
+ * @returns {TObjectNode<O>}
40
+ * 根据属性路径获取属性值。
41
+ *
42
+ * @template O - 目标对象的类型。
43
+ * @template P - 属性路径的类型。
44
+ * @param {O} obj - 要操作的目标对象。
45
+ * @param {P | string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 "a.b.c")或数组形式(如 ["a", "b", "c"])。
46
+ * @returns {TObjectNode<O>} 返回一个包含父级、键名路径、键名和键值的对象节点。
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const obj = { a: { b: { c: 42 } } };
51
+ * const result = objectGet(obj, 'a.b.c');
52
+ * console.log(result.value); // 输出 42
53
+ * ```
54
+ */
55
+ export declare function objectGet<O extends AnyObject, P extends ObjectPath<O>>(obj: O, path: P | string | string[]): TObjectNode<O>;
56
+ /**
57
+ * 配置选项,用于控制 `objectSet` 的行为。
58
+ *
59
+ * @template O - 目标对象的类型。
60
+ */
61
+ export type TObjectSetOptions<O extends AnyObject> = {
62
+ /**
63
+ * 在设置值之前调用的钩子函数。
64
+ * 如果返回 `false`,则阻止设置值。
65
+ *
66
+ * @param {TObjectNode<O> & { key: string }} node - 当前节点信息。
67
+ * @returns {boolean | undefined | void} 返回 `false` 时阻止设置值。
68
+ */
69
+ beforeSet(node: TObjectNode<O> & {
70
+ key: string;
71
+ }): boolean | undefined | void;
72
+ /**
73
+ * 当遇到未定义的中间节点时调用的钩子函数。
74
+ * 返回值将用于创建中间节点。
75
+ *
76
+ * @param {TObjectNode<O>} node - 当前节点信息。
77
+ * @returns {AnyObject | AnyArray | undefined | void} 返回值将用于创建中间节点。
78
+ */
79
+ undefinedSet(node: TObjectNode<O>): AnyObject | AnyArray | undefined | void;
80
+ };
81
+ /**
82
+ * 根据属性路径设置属性值
83
+ * @param {AnyObject} obj
84
+ * @param {string} path
85
+ * @param {V} val
86
+ * @param {Partial<TObjectSetOptions<O>>} options
87
+ * @returns {TObjectNode<O, V>}
88
+ * 根据属性路径设置属性值。
89
+ *
90
+ * @template O - 目标对象的类型。
91
+ * @template V - 要设置的值的类型。
92
+ * @param {O} obj - 要操作的目标对象。
93
+ * @param {string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 "a.b.c")或数组形式(如 ["a", "b", "c"])。
94
+ * @param {V} val - 要设置的值。
95
+ * @param {Partial<TObjectSetOptions<O>>} [options] - 可选配置项,用于控制设置行为。
96
+ * @returns {TObjectNode<V>} 返回一个包含父级、键名路径、键名和键值的对象节点。
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * const obj = {};
101
+ * objectSet(obj, 'a.b.c', 42);
102
+ * console.log(obj); // 输出 { a: { b: { c: 42 } } }
103
+ *
104
+ * objectSet(obj, 'a.b.c', 100, {
105
+ * beforeSet: (node) => node.key === 'c',
106
+ * });
107
+ * console.log(obj); // 输出 { a: { b: { c: 100 } } }
108
+ * ```
109
+ */
110
+ export declare function objectSet<O extends AnyObject, V>(obj: O, path: string | string[], val: V, options?: Partial<TObjectSetOptions<O>>): TObjectNode<V>;
111
+ export {};
@@ -0,0 +1,32 @@
1
+ import { AnyObject } from '../types';
2
+ /**
3
+ * 检查一个对象是否为空对象(不包含任何自有属性,包括符号属性)。
4
+ *
5
+ * @param obj - 要检查的对象
6
+ * @returns 如果对象没有自有属性(包括符号属性)则返回 true,否则返回 false
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * isEmptyObject({}); // true
11
+ * isEmptyObject({ a: 1 }); // false
12
+ * isEmptyObject(Object.create(null)); // true
13
+ * isEmptyObject({ [Symbol('key')]: 'value' }); // false
14
+ * ```
15
+ */
16
+ export declare function isEmptyObject(obj: AnyObject): boolean;
17
+ /**
18
+ * 检查一个对象是否为纯对象(通过对象字面量或Object构造函数创建,而非其他构造函数的实例)。
19
+ *
20
+ * @param obj - 要检查的对象
21
+ * @returns 如果是纯对象则返回 true,否则返回 false
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * isPlainObject({}); // true
26
+ * isPlainObject(Object.create(null)); // true
27
+ * isPlainObject(new Date()); // false
28
+ * isPlainObject([]); // false
29
+ * isPlainObject(() => {}); // false
30
+ * ```
31
+ */
32
+ export declare function isPlainObject(obj: AnyObject): boolean;
@@ -0,0 +1,72 @@
1
+ import { AnyArray, AnyObject } from '../types';
2
+ export type TObjectMergeRule = {
3
+ /**
4
+ * 处理冲突
5
+ * @param target - 目标对象
6
+ * @param source - 源对象
7
+ * @param key - 键名
8
+ * @returns 返回 true 表示继续处理,否则返回 false
9
+ */
10
+ next: (info: {
11
+ target: AnyObject | AnyArray;
12
+ source: AnyObject | AnyArray;
13
+ key: string | number;
14
+ }) => boolean;
15
+ /**
16
+ * 处理赋值
17
+ * @param target - 目标对象
18
+ * @param source - 源对象
19
+ * @param key - 键名
20
+ * @returns 返回处理后的值
21
+ */
22
+ assign: (info: {
23
+ target: AnyObject | AnyArray;
24
+ source: AnyObject | AnyArray;
25
+ key: string | number;
26
+ merge: () => any;
27
+ }) => any;
28
+ };
29
+ /**
30
+ * 合并多个对象或数组。如果遇到循环引用,则直接返回目标对象。
31
+ *
32
+ * @param target - 目标对象或数组。
33
+ * @param sources - 要合并的源对象或数组。
34
+ * @returns 合并后的对象或数组。
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const obj1 = { a: 1, b: { x: 10 } };
39
+ * const obj2 = { b: { y: 20 }, c: 3 };
40
+ * const merged = objectMerge(obj1, obj2);
41
+ * console.log(merged); // { a: 1, b: { x: 10, y: 20 }, c: 3 }
42
+ * ```
43
+ */
44
+ export declare function objectMerge(target: AnyObject | AnyArray, ...sources: (AnyObject | AnyArray)[]): AnyObject | AnyArray;
45
+ /**
46
+ * 为对象设置默认值。如果目标对象中的属性为 `undefined`,则使用默认对象中的属性值。
47
+ * 支持多个默认对象,优先级从左到右依次降低。
48
+ * 如果目标对象中的属性已经是对象或数组,则递归地设置默认值。
49
+ *
50
+ * @param target - 目标对象或数组。
51
+ * @param defaults - 默认对象或数组。
52
+ * @returns 合并后的对象或数组。
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * const obj = { a: 1, b: undefined };
57
+ * const defaults = { a: 4, b: 2, c: 3 };
58
+ * const result = objectDefaults(obj, defaults);
59
+ * console.log(result); // { a: 1, b: 2, c: 3 }
60
+ *
61
+ * const obj2 = { a: 1, b: 2 };
62
+ * const defaults2 = { a: 5, b: 3, c: 4 };
63
+ * const result2 = objectDefaults(obj2, defaults2);
64
+ * console.log(result2); // { a: 1, b: 2, c: 4 }
65
+ *
66
+ * const obj3 = { a: { x: 1 }, b: undefined };
67
+ * const defaults3 = { a: { x: 4, z: 3 }, b: { y: 2 } };
68
+ * const result3 = objectDefaults(obj3, defaults3);
69
+ * console.log(result3); // { a: { x: 1, z: 3 }, b: { y: 2 } }
70
+ * ```
71
+ */
72
+ export declare function objectDefaults<T extends AnyObject | AnyArray>(target: T, defaults: T): T;
@@ -1,5 +1,4 @@
1
- import type { AnyObject } from '@/types';
2
-
1
+ import { AnyObject } from '../types';
3
2
  /**
4
3
  * 从对象中选择指定键的属性,返回一个新的对象。
5
4
  *
@@ -14,16 +13,7 @@ import type { AnyObject } from '@/types';
14
13
  * console.log(result); // { a: 1, c: 3 }
15
14
  * ```
16
15
  */
17
- export function objectPick<T extends AnyObject, K extends keyof T>(object: T, keys: K[]): Pick<T, K> {
18
- const result = {} as Pick<T, K>;
19
- for (const key of keys) {
20
- if (key in object) {
21
- result[key] = object[key];
22
- }
23
- }
24
- return result;
25
- }
26
-
16
+ export declare function objectPick<T extends AnyObject, K extends keyof T>(object: T, keys: K[]): Pick<T, K>;
27
17
  /**
28
18
  * 从对象中排除指定键的属性,返回一个新的对象。
29
19
  *
@@ -38,17 +28,7 @@ export function objectPick<T extends AnyObject, K extends keyof T>(object: T, ke
38
28
  * console.log(result); // { b: 2, c: 3 }
39
29
  * ```
40
30
  */
41
- export function objectOmit<T extends AnyObject, K extends keyof T>(object: T, keys: K[]): Omit<T, K> {
42
- const result = {} as Omit<T, K>;
43
- for (const key in object) {
44
- if (!keys.includes(key as unknown as K)) {
45
- // @ts-expect-error
46
- result[key] = object[key];
47
- }
48
- }
49
- return result;
50
- }
51
-
31
+ export declare function objectOmit<T extends AnyObject, K extends keyof T>(object: T, keys: K[]): Omit<T, K>;
52
32
  /**
53
33
  * 遍历对象的每个键值对,并对每个键值对执行提供的映射函数,返回一个新的对象。
54
34
  *
@@ -63,18 +43,4 @@ export function objectOmit<T extends AnyObject, K extends keyof T>(object: T, ke
63
43
  * console.log(result); // { a: '2', b: '4', c: '6' }
64
44
  * ```
65
45
  */
66
- export function objectMap<T extends AnyObject, V>(
67
- object: T,
68
- mapper: (value: T[keyof T], key: keyof T) => V,
69
- ): Record<keyof T, V> {
70
- return Object.fromEntries(
71
- Object.entries(object).map(([key, value]) => [
72
- key,
73
- mapper(
74
- // @ts-expect-error
75
- value,
76
- key as keyof T,
77
- ),
78
- ]),
79
- ) as Record<keyof T, V>;
80
- }
46
+ export declare function objectMap<T extends AnyObject, V>(object: T, mapper: (value: T[keyof T], key: keyof T) => V): Record<keyof T, V>;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ 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");
6
+ 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(".");
11
+ }
12
+ function isObjectOrArray(v) {
13
+ return type.isObject(v) || type.isArray(v);
14
+ }
15
+ 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
+ };
33
+ }
34
+ const defaultObjectSetOptions = {
35
+ beforeSet: () => true,
36
+ undefinedSet: () => ({})
37
+ };
38
+ 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
+ };
80
+ }
81
+ function isEmptyObject(obj) {
82
+ return Object.getOwnPropertyNames(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0;
83
+ }
84
+ function isPlainObject(obj) {
85
+ const proto = Object.getPrototypeOf(obj);
86
+ if (!proto) return true;
87
+ return proto === Object.prototype;
88
+ }
89
+ 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;
97
+ }
98
+ 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;
106
+ }
107
+ 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
+ );
118
+ }
119
+ exports.objectEach = each.objectEach;
120
+ exports.objectEachAsync = each.objectEachAsync;
121
+ exports.objectDefaults = merge.objectDefaults;
122
+ exports.objectMerge = merge.objectMerge;
123
+ exports.isEmptyObject = isEmptyObject;
124
+ exports.isPlainObject = isPlainObject;
125
+ exports.objectGet = objectGet;
126
+ exports.objectMap = objectMap;
127
+ exports.objectOmit = objectOmit;
128
+ exports.objectPick = objectPick;
129
+ exports.objectSet = objectSet;
130
+ //# sourceMappingURL=object.cjs.map
@@ -0,0 +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 TObjectNode<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 {TObjectNode<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 {TObjectNode<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): TObjectNode<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 TObjectSetOptions<O extends AnyObject> = {\n /**\n * 在设置值之前调用的钩子函数。\n * 如果返回 `false`,则阻止设置值。\n *\n * @param {TObjectNode<O> & { key: string }} node - 当前节点信息。\n * @returns {boolean | undefined | void} 返回 `false` 时阻止设置值。\n */\n // biome-ignore lint/suspicious/noConfusingVoidType: <explanation>\n beforeSet(node: TObjectNode<O> & { key: string }): boolean | undefined | void;\n\n /**\n * 当遇到未定义的中间节点时调用的钩子函数。\n * 返回值将用于创建中间节点。\n *\n * @param {TObjectNode<O>} node - 当前节点信息。\n * @returns {AnyObject | AnyArray | undefined | void} 返回值将用于创建中间节点。\n */\n // biome-ignore lint/suspicious/noConfusingVoidType: <explanation>\n undefinedSet(node: TObjectNode<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: TObjectSetOptions<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<TObjectSetOptions<O>>} options\n * @returns {TObjectNode<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<TObjectSetOptions<O>>} [options] - 可选配置项,用于控制设置行为。\n * @returns {TObjectNode<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<TObjectSetOptions<O>>,\n): TObjectNode<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"],"names":["isArray","isObject","val","isUndefined"],"mappings":"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"}