@simplysm/core-common 13.0.0-beta.1

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 (202) hide show
  1. package/.cache/typecheck-browser.tsbuildinfo +1 -0
  2. package/.cache/typecheck-node.tsbuildinfo +1 -0
  3. package/.cache/typecheck-tests-browser.tsbuildinfo +1 -0
  4. package/.cache/typecheck-tests-node.tsbuildinfo +1 -0
  5. package/README.md +887 -0
  6. package/dist/common.types.d.ts +74 -0
  7. package/dist/common.types.d.ts.map +1 -0
  8. package/dist/common.types.js +5 -0
  9. package/dist/common.types.js.map +7 -0
  10. package/dist/env.d.ts +6 -0
  11. package/dist/env.d.ts.map +1 -0
  12. package/dist/env.js +9 -0
  13. package/dist/env.js.map +7 -0
  14. package/dist/errors/argument-error.d.ts +25 -0
  15. package/dist/errors/argument-error.d.ts.map +1 -0
  16. package/dist/errors/argument-error.js +18 -0
  17. package/dist/errors/argument-error.js.map +7 -0
  18. package/dist/errors/not-implemented-error.d.ts +29 -0
  19. package/dist/errors/not-implemented-error.d.ts.map +1 -0
  20. package/dist/errors/not-implemented-error.js +14 -0
  21. package/dist/errors/not-implemented-error.js.map +7 -0
  22. package/dist/errors/sd-error.d.ts +27 -0
  23. package/dist/errors/sd-error.d.ts.map +1 -0
  24. package/dist/errors/sd-error.js +23 -0
  25. package/dist/errors/sd-error.js.map +7 -0
  26. package/dist/errors/timeout-error.d.ts +31 -0
  27. package/dist/errors/timeout-error.d.ts.map +1 -0
  28. package/dist/errors/timeout-error.js +17 -0
  29. package/dist/errors/timeout-error.js.map +7 -0
  30. package/dist/extensions/arr-ext.d.ts +15 -0
  31. package/dist/extensions/arr-ext.d.ts.map +1 -0
  32. package/dist/extensions/arr-ext.helpers.d.ts +19 -0
  33. package/dist/extensions/arr-ext.helpers.d.ts.map +1 -0
  34. package/dist/extensions/arr-ext.helpers.js +35 -0
  35. package/dist/extensions/arr-ext.helpers.js.map +7 -0
  36. package/dist/extensions/arr-ext.js +546 -0
  37. package/dist/extensions/arr-ext.js.map +7 -0
  38. package/dist/extensions/arr-ext.types.d.ts +215 -0
  39. package/dist/extensions/arr-ext.types.d.ts.map +1 -0
  40. package/dist/extensions/arr-ext.types.js +1 -0
  41. package/dist/extensions/arr-ext.types.js.map +7 -0
  42. package/dist/extensions/map-ext.d.ts +57 -0
  43. package/dist/extensions/map-ext.d.ts.map +1 -0
  44. package/dist/extensions/map-ext.js +26 -0
  45. package/dist/extensions/map-ext.js.map +7 -0
  46. package/dist/extensions/set-ext.d.ts +36 -0
  47. package/dist/extensions/set-ext.d.ts.map +1 -0
  48. package/dist/extensions/set-ext.js +29 -0
  49. package/dist/extensions/set-ext.js.map +7 -0
  50. package/dist/features/debounce-queue.d.ts +53 -0
  51. package/dist/features/debounce-queue.d.ts.map +1 -0
  52. package/dist/features/debounce-queue.js +80 -0
  53. package/dist/features/debounce-queue.js.map +7 -0
  54. package/dist/features/event-emitter.d.ts +66 -0
  55. package/dist/features/event-emitter.d.ts.map +1 -0
  56. package/dist/features/event-emitter.js +82 -0
  57. package/dist/features/event-emitter.js.map +7 -0
  58. package/dist/features/serial-queue.d.ts +47 -0
  59. package/dist/features/serial-queue.d.ts.map +1 -0
  60. package/dist/features/serial-queue.js +66 -0
  61. package/dist/features/serial-queue.js.map +7 -0
  62. package/dist/globals.d.ts +12 -0
  63. package/dist/globals.d.ts.map +1 -0
  64. package/dist/globals.js +1 -0
  65. package/dist/globals.js.map +7 -0
  66. package/dist/index.d.ts +32 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +31 -0
  69. package/dist/index.js.map +7 -0
  70. package/dist/types/date-only.d.ts +152 -0
  71. package/dist/types/date-only.d.ts.map +1 -0
  72. package/dist/types/date-only.js +251 -0
  73. package/dist/types/date-only.js.map +7 -0
  74. package/dist/types/date-time.d.ts +96 -0
  75. package/dist/types/date-time.d.ts.map +1 -0
  76. package/dist/types/date-time.js +220 -0
  77. package/dist/types/date-time.js.map +7 -0
  78. package/dist/types/lazy-gc-map.d.ts +80 -0
  79. package/dist/types/lazy-gc-map.d.ts.map +1 -0
  80. package/dist/types/lazy-gc-map.js +179 -0
  81. package/dist/types/lazy-gc-map.js.map +7 -0
  82. package/dist/types/time.d.ts +68 -0
  83. package/dist/types/time.d.ts.map +1 -0
  84. package/dist/types/time.js +151 -0
  85. package/dist/types/time.js.map +7 -0
  86. package/dist/types/uuid.d.ts +35 -0
  87. package/dist/types/uuid.d.ts.map +1 -0
  88. package/dist/types/uuid.js +71 -0
  89. package/dist/types/uuid.js.map +7 -0
  90. package/dist/utils/bytes.d.ts +51 -0
  91. package/dist/utils/bytes.d.ts.map +1 -0
  92. package/dist/utils/bytes.js +89 -0
  93. package/dist/utils/bytes.js.map +7 -0
  94. package/dist/utils/date-format.d.ts +90 -0
  95. package/dist/utils/date-format.d.ts.map +1 -0
  96. package/dist/utils/date-format.js +106 -0
  97. package/dist/utils/date-format.js.map +7 -0
  98. package/dist/utils/json.d.ts +34 -0
  99. package/dist/utils/json.d.ts.map +1 -0
  100. package/dist/utils/json.js +152 -0
  101. package/dist/utils/json.js.map +7 -0
  102. package/dist/utils/num.d.ts +60 -0
  103. package/dist/utils/num.d.ts.map +1 -0
  104. package/dist/utils/num.js +39 -0
  105. package/dist/utils/num.js.map +7 -0
  106. package/dist/utils/obj.d.ts +258 -0
  107. package/dist/utils/obj.d.ts.map +1 -0
  108. package/dist/utils/obj.js +538 -0
  109. package/dist/utils/obj.js.map +7 -0
  110. package/dist/utils/path.d.ts +23 -0
  111. package/dist/utils/path.d.ts.map +1 -0
  112. package/dist/utils/path.js +21 -0
  113. package/dist/utils/path.js.map +7 -0
  114. package/dist/utils/primitive.d.ts +18 -0
  115. package/dist/utils/primitive.d.ts.map +1 -0
  116. package/dist/utils/primitive.js +20 -0
  117. package/dist/utils/primitive.js.map +7 -0
  118. package/dist/utils/str.d.ts +103 -0
  119. package/dist/utils/str.d.ts.map +1 -0
  120. package/dist/utils/str.js +128 -0
  121. package/dist/utils/str.js.map +7 -0
  122. package/dist/utils/template-strings.d.ts +84 -0
  123. package/dist/utils/template-strings.d.ts.map +1 -0
  124. package/dist/utils/template-strings.js +49 -0
  125. package/dist/utils/template-strings.js.map +7 -0
  126. package/dist/utils/transferable.d.ts +47 -0
  127. package/dist/utils/transferable.d.ts.map +1 -0
  128. package/dist/utils/transferable.js +153 -0
  129. package/dist/utils/transferable.js.map +7 -0
  130. package/dist/utils/wait.d.ts +19 -0
  131. package/dist/utils/wait.d.ts.map +1 -0
  132. package/dist/utils/wait.js +19 -0
  133. package/dist/utils/wait.js.map +7 -0
  134. package/dist/utils/xml.d.ts +36 -0
  135. package/dist/utils/xml.d.ts.map +1 -0
  136. package/dist/utils/xml.js +51 -0
  137. package/dist/utils/xml.js.map +7 -0
  138. package/dist/zip/sd-zip.d.ts +80 -0
  139. package/dist/zip/sd-zip.d.ts.map +1 -0
  140. package/dist/zip/sd-zip.js +153 -0
  141. package/dist/zip/sd-zip.js.map +7 -0
  142. package/package.json +31 -0
  143. package/src/common.types.ts +91 -0
  144. package/src/env.ts +11 -0
  145. package/src/errors/argument-error.ts +40 -0
  146. package/src/errors/not-implemented-error.ts +32 -0
  147. package/src/errors/sd-error.ts +53 -0
  148. package/src/errors/timeout-error.ts +36 -0
  149. package/src/extensions/arr-ext.helpers.ts +53 -0
  150. package/src/extensions/arr-ext.ts +777 -0
  151. package/src/extensions/arr-ext.types.ts +258 -0
  152. package/src/extensions/map-ext.ts +86 -0
  153. package/src/extensions/set-ext.ts +68 -0
  154. package/src/features/debounce-queue.ts +116 -0
  155. package/src/features/event-emitter.ts +112 -0
  156. package/src/features/serial-queue.ts +94 -0
  157. package/src/globals.ts +12 -0
  158. package/src/index.ts +55 -0
  159. package/src/types/date-only.ts +329 -0
  160. package/src/types/date-time.ts +294 -0
  161. package/src/types/lazy-gc-map.ts +244 -0
  162. package/src/types/time.ts +210 -0
  163. package/src/types/uuid.ts +113 -0
  164. package/src/utils/bytes.ts +160 -0
  165. package/src/utils/date-format.ts +239 -0
  166. package/src/utils/json.ts +230 -0
  167. package/src/utils/num.ts +97 -0
  168. package/src/utils/obj.ts +956 -0
  169. package/src/utils/path.ts +40 -0
  170. package/src/utils/primitive.ts +33 -0
  171. package/src/utils/str.ts +252 -0
  172. package/src/utils/template-strings.ts +132 -0
  173. package/src/utils/transferable.ts +269 -0
  174. package/src/utils/wait.ts +40 -0
  175. package/src/utils/xml.ts +105 -0
  176. package/src/zip/sd-zip.ts +218 -0
  177. package/tests/errors/errors.spec.ts +196 -0
  178. package/tests/extensions/array-extension.spec.ts +790 -0
  179. package/tests/extensions/map-extension.spec.ts +147 -0
  180. package/tests/extensions/set-extension.spec.ts +74 -0
  181. package/tests/types/date-only.spec.ts +636 -0
  182. package/tests/types/date-time.spec.ts +391 -0
  183. package/tests/types/lazy-gc-map.spec.ts +692 -0
  184. package/tests/types/time.spec.ts +559 -0
  185. package/tests/types/types.spec.ts +55 -0
  186. package/tests/types/uuid.spec.ts +91 -0
  187. package/tests/utils/bytes-utils.spec.ts +230 -0
  188. package/tests/utils/date-format.spec.ts +371 -0
  189. package/tests/utils/debounce-queue.spec.ts +272 -0
  190. package/tests/utils/json.spec.ts +475 -0
  191. package/tests/utils/number.spec.ts +184 -0
  192. package/tests/utils/object.spec.ts +827 -0
  193. package/tests/utils/path.spec.ts +78 -0
  194. package/tests/utils/primitive.spec.ts +55 -0
  195. package/tests/utils/sd-event-emitter.spec.ts +216 -0
  196. package/tests/utils/serial-queue.spec.ts +365 -0
  197. package/tests/utils/string.spec.ts +294 -0
  198. package/tests/utils/template-strings.spec.ts +96 -0
  199. package/tests/utils/transferable.spec.ts +698 -0
  200. package/tests/utils/wait.spec.ts +145 -0
  201. package/tests/utils/xml.spec.ts +146 -0
  202. package/tests/zip/sd-zip.spec.ts +234 -0
@@ -0,0 +1,538 @@
1
+ import { DateTime } from "../types/date-time";
2
+ import { DateOnly } from "../types/date-only";
3
+ import { Time } from "../types/time";
4
+ import { Uuid } from "../types/uuid";
5
+ import { ArgumentError } from "../errors/argument-error";
6
+ function objClone(source) {
7
+ return objCloneImpl(source);
8
+ }
9
+ function objCloneImpl(source, prevClones) {
10
+ if (typeof source !== "object" || source === null) {
11
+ return source;
12
+ }
13
+ if (source instanceof Date) {
14
+ return new Date(source.getTime());
15
+ }
16
+ if (source instanceof DateTime) {
17
+ return new DateTime(source.tick);
18
+ }
19
+ if (source instanceof DateOnly) {
20
+ return new DateOnly(source.tick);
21
+ }
22
+ if (source instanceof Time) {
23
+ return new Time(source.tick);
24
+ }
25
+ if (source instanceof Uuid) {
26
+ return new Uuid(source.toString());
27
+ }
28
+ if (source instanceof RegExp) {
29
+ return new RegExp(source.source, source.flags);
30
+ }
31
+ const currPrevClones = prevClones ?? /* @__PURE__ */ new WeakMap();
32
+ if (currPrevClones.has(source)) {
33
+ return currPrevClones.get(source);
34
+ }
35
+ if (source instanceof Error) {
36
+ const cloned = Object.create(Object.getPrototypeOf(source));
37
+ currPrevClones.set(source, cloned);
38
+ cloned.message = source.message;
39
+ cloned.name = source.name;
40
+ cloned.stack = source.stack;
41
+ if (source.cause !== void 0) {
42
+ cloned.cause = objCloneImpl(source.cause, currPrevClones);
43
+ }
44
+ for (const key of Object.keys(source)) {
45
+ if (!["message", "name", "stack", "cause"].includes(key)) {
46
+ cloned[key] = objCloneImpl(
47
+ source[key],
48
+ currPrevClones
49
+ );
50
+ }
51
+ }
52
+ return cloned;
53
+ }
54
+ if (source instanceof Uint8Array) {
55
+ const result2 = source.slice();
56
+ currPrevClones.set(source, result2);
57
+ return result2;
58
+ }
59
+ if (source instanceof Array) {
60
+ const result2 = [];
61
+ currPrevClones.set(source, result2);
62
+ for (const item of source) {
63
+ result2.push(objCloneImpl(item, currPrevClones));
64
+ }
65
+ return result2;
66
+ }
67
+ if (source instanceof Map) {
68
+ const result2 = /* @__PURE__ */ new Map();
69
+ currPrevClones.set(source, result2);
70
+ for (const [key, value] of source) {
71
+ result2.set(objCloneImpl(key, currPrevClones), objCloneImpl(value, currPrevClones));
72
+ }
73
+ return result2;
74
+ }
75
+ if (source instanceof Set) {
76
+ const result2 = /* @__PURE__ */ new Set();
77
+ currPrevClones.set(source, result2);
78
+ for (const item of source) {
79
+ result2.add(objCloneImpl(item, currPrevClones));
80
+ }
81
+ return result2;
82
+ }
83
+ const result = {};
84
+ Object.setPrototypeOf(result, Object.getPrototypeOf(source));
85
+ currPrevClones.set(source, result);
86
+ for (const key of Object.keys(source)) {
87
+ const value = source[key];
88
+ result[key] = objCloneImpl(value, currPrevClones);
89
+ }
90
+ return result;
91
+ }
92
+ function objEqual(source, target, options) {
93
+ if (source === target) return true;
94
+ if (source == null || target == null) return false;
95
+ if (typeof source !== typeof target) return false;
96
+ if (source instanceof Date && target instanceof Date) {
97
+ return source.getTime() === target.getTime();
98
+ }
99
+ if (source instanceof DateTime && target instanceof DateTime || source instanceof DateOnly && target instanceof DateOnly || source instanceof Time && target instanceof Time) {
100
+ return source.tick === target.tick;
101
+ }
102
+ if (source instanceof Uuid && target instanceof Uuid) {
103
+ return source.toString() === target.toString();
104
+ }
105
+ if (source instanceof RegExp && target instanceof RegExp) {
106
+ return source.source === target.source && source.flags === target.flags;
107
+ }
108
+ if (source instanceof Array && target instanceof Array) {
109
+ return objEqualArray(source, target, options);
110
+ }
111
+ if (source instanceof Map && target instanceof Map) {
112
+ return objEqualMap(source, target, options);
113
+ }
114
+ if (source instanceof Set && target instanceof Set) {
115
+ return objEqualSet(source, target, options);
116
+ }
117
+ if (typeof source === "object" && typeof target === "object") {
118
+ return objEqualObject(source, target, options);
119
+ }
120
+ return false;
121
+ }
122
+ function objEqualArray(source, target, options) {
123
+ if (source.length !== target.length) {
124
+ return false;
125
+ }
126
+ if (options == null ? void 0 : options.ignoreArrayIndex) {
127
+ const matchedIndices = /* @__PURE__ */ new Set();
128
+ if (options.onlyOneDepth) {
129
+ return source.every((sourceItem) => {
130
+ const idx = target.findIndex((t, i) => !matchedIndices.has(i) && t === sourceItem);
131
+ if (idx !== -1) {
132
+ matchedIndices.add(idx);
133
+ return true;
134
+ }
135
+ return false;
136
+ });
137
+ } else {
138
+ const recursiveOptions = { ignoreArrayIndex: options.ignoreArrayIndex, onlyOneDepth: options.onlyOneDepth };
139
+ return source.every((sourceItem) => {
140
+ const idx = target.findIndex((t, i) => !matchedIndices.has(i) && objEqual(t, sourceItem, recursiveOptions));
141
+ if (idx !== -1) {
142
+ matchedIndices.add(idx);
143
+ return true;
144
+ }
145
+ return false;
146
+ });
147
+ }
148
+ } else {
149
+ if (options == null ? void 0 : options.onlyOneDepth) {
150
+ for (let i = 0; i < source.length; i++) {
151
+ if (source[i] !== target[i]) {
152
+ return false;
153
+ }
154
+ }
155
+ } else {
156
+ for (let i = 0; i < source.length; i++) {
157
+ if (!objEqual(source[i], target[i], {
158
+ ignoreArrayIndex: options == null ? void 0 : options.ignoreArrayIndex,
159
+ onlyOneDepth: options == null ? void 0 : options.onlyOneDepth
160
+ })) {
161
+ return false;
162
+ }
163
+ }
164
+ }
165
+ }
166
+ return true;
167
+ }
168
+ function objEqualMap(source, target, options) {
169
+ const sourceKeys = Array.from(source.keys()).filter((key) => source.get(key) != null);
170
+ const targetKeys = Array.from(target.keys()).filter((key) => target.get(key) != null);
171
+ if (sourceKeys.length !== targetKeys.length) {
172
+ return false;
173
+ }
174
+ const usedTargetKeys = /* @__PURE__ */ new Set();
175
+ for (const sourceKey of sourceKeys) {
176
+ if (typeof sourceKey === "string") {
177
+ const sourceValue = source.get(sourceKey);
178
+ const targetValue = target.get(sourceKey);
179
+ if (options == null ? void 0 : options.onlyOneDepth) {
180
+ if (sourceValue !== targetValue) return false;
181
+ } else {
182
+ if (!objEqual(sourceValue, targetValue, {
183
+ ignoreArrayIndex: options == null ? void 0 : options.ignoreArrayIndex,
184
+ onlyOneDepth: options == null ? void 0 : options.onlyOneDepth
185
+ })) {
186
+ return false;
187
+ }
188
+ }
189
+ } else {
190
+ let found = false;
191
+ for (let i = 0; i < targetKeys.length; i++) {
192
+ const targetKey = targetKeys[i];
193
+ if (typeof targetKey === "string" || usedTargetKeys.has(i)) continue;
194
+ if ((options == null ? void 0 : options.onlyOneDepth) ? sourceKey === targetKey : objEqual(sourceKey, targetKey)) {
195
+ usedTargetKeys.add(i);
196
+ const sourceValue = source.get(sourceKey);
197
+ const targetValue = target.get(targetKey);
198
+ if (options == null ? void 0 : options.onlyOneDepth) {
199
+ if (sourceValue !== targetValue) return false;
200
+ } else {
201
+ if (!objEqual(sourceValue, targetValue, {
202
+ ignoreArrayIndex: options == null ? void 0 : options.ignoreArrayIndex,
203
+ onlyOneDepth: options == null ? void 0 : options.onlyOneDepth
204
+ })) {
205
+ return false;
206
+ }
207
+ }
208
+ found = true;
209
+ break;
210
+ }
211
+ }
212
+ if (!found) return false;
213
+ }
214
+ }
215
+ return true;
216
+ }
217
+ function objEqualObject(source, target, options) {
218
+ const sourceKeys = Object.keys(source).filter(
219
+ (key) => {
220
+ var _a;
221
+ return ((options == null ? void 0 : options.topLevelIncludes) === void 0 || options.topLevelIncludes.includes(key)) && !((_a = options == null ? void 0 : options.topLevelExcludes) == null ? void 0 : _a.includes(key)) && source[key] != null;
222
+ }
223
+ );
224
+ const targetKeys = Object.keys(target).filter(
225
+ (key) => {
226
+ var _a;
227
+ return ((options == null ? void 0 : options.topLevelIncludes) === void 0 || options.topLevelIncludes.includes(key)) && !((_a = options == null ? void 0 : options.topLevelExcludes) == null ? void 0 : _a.includes(key)) && target[key] != null;
228
+ }
229
+ );
230
+ if (sourceKeys.length !== targetKeys.length) {
231
+ return false;
232
+ }
233
+ for (const key of sourceKeys) {
234
+ if (options == null ? void 0 : options.onlyOneDepth) {
235
+ if (source[key] !== target[key]) {
236
+ return false;
237
+ }
238
+ } else {
239
+ if (!objEqual(source[key], target[key], {
240
+ ignoreArrayIndex: options == null ? void 0 : options.ignoreArrayIndex
241
+ })) {
242
+ return false;
243
+ }
244
+ }
245
+ }
246
+ return true;
247
+ }
248
+ function objEqualSet(source, target, options) {
249
+ if (source.size !== target.size) {
250
+ return false;
251
+ }
252
+ if (options == null ? void 0 : options.onlyOneDepth) {
253
+ for (const sourceItem of source) {
254
+ if (!target.has(sourceItem)) {
255
+ return false;
256
+ }
257
+ }
258
+ } else {
259
+ const targetArr = [...target];
260
+ const matchedIndices = /* @__PURE__ */ new Set();
261
+ for (const sourceItem of source) {
262
+ const idx = targetArr.findIndex((t, i) => !matchedIndices.has(i) && objEqual(sourceItem, t, options));
263
+ if (idx === -1) {
264
+ return false;
265
+ }
266
+ matchedIndices.add(idx);
267
+ }
268
+ }
269
+ return true;
270
+ }
271
+ function objMerge(source, target, opt) {
272
+ if (source == null) {
273
+ return objClone(target);
274
+ }
275
+ if (target === void 0) {
276
+ return objClone(source);
277
+ }
278
+ if (target === null) {
279
+ return (opt == null ? void 0 : opt.useDelTargetNull) ? void 0 : objClone(source);
280
+ }
281
+ if (typeof target !== "object") {
282
+ return target;
283
+ }
284
+ if (target instanceof Date || target instanceof DateTime || target instanceof DateOnly || target instanceof Time || target instanceof Uuid || target instanceof Uint8Array || (opt == null ? void 0 : opt.arrayProcess) === "replace" && target instanceof Array) {
285
+ return objClone(target);
286
+ }
287
+ if (typeof source !== "object" || source.constructor !== target.constructor) {
288
+ return objClone(target);
289
+ }
290
+ if (source instanceof Map && target instanceof Map) {
291
+ const result = objClone(source);
292
+ for (const key of target.keys()) {
293
+ if (result.has(key)) {
294
+ result.set(key, objMerge(result.get(key), target.get(key), opt));
295
+ } else {
296
+ result.set(key, objClone(target.get(key)));
297
+ }
298
+ }
299
+ return result;
300
+ }
301
+ if ((opt == null ? void 0 : opt.arrayProcess) === "concat" && source instanceof Array && target instanceof Array) {
302
+ let result = [.../* @__PURE__ */ new Set([...source, ...target])];
303
+ if (opt.useDelTargetNull) {
304
+ result = result.filter((item) => item !== null);
305
+ }
306
+ return result;
307
+ }
308
+ const sourceRec = source;
309
+ const targetRec = target;
310
+ const resultRec = objClone(sourceRec);
311
+ for (const key of Object.keys(target)) {
312
+ resultRec[key] = objMerge(sourceRec[key], targetRec[key], opt);
313
+ if (resultRec[key] === void 0) {
314
+ delete resultRec[key];
315
+ }
316
+ }
317
+ return resultRec;
318
+ }
319
+ function objMerge3(source, origin, target, optionsObj) {
320
+ let conflict = false;
321
+ const result = objClone(origin);
322
+ const allKeys = /* @__PURE__ */ new Set([...Object.keys(source), ...Object.keys(target), ...Object.keys(origin)]);
323
+ for (const key of allKeys) {
324
+ if (objEqual(source[key], result[key], optionsObj == null ? void 0 : optionsObj[key])) {
325
+ result[key] = objClone(target[key]);
326
+ } else if (objEqual(target[key], result[key], optionsObj == null ? void 0 : optionsObj[key])) {
327
+ result[key] = objClone(source[key]);
328
+ } else if (objEqual(source[key], target[key], optionsObj == null ? void 0 : optionsObj[key])) {
329
+ result[key] = objClone(source[key]);
330
+ } else {
331
+ conflict = true;
332
+ }
333
+ }
334
+ return {
335
+ conflict,
336
+ result
337
+ };
338
+ }
339
+ function objOmit(item, omitKeys) {
340
+ const result = {};
341
+ for (const key of Object.keys(item)) {
342
+ if (!omitKeys.includes(key)) {
343
+ result[key] = item[key];
344
+ }
345
+ }
346
+ return result;
347
+ }
348
+ function objOmitByFilter(item, omitKeyFn) {
349
+ const result = {};
350
+ for (const key of Object.keys(item)) {
351
+ if (!omitKeyFn(key)) {
352
+ result[key] = item[key];
353
+ }
354
+ }
355
+ return result;
356
+ }
357
+ function objPick(item, keys) {
358
+ const result = {};
359
+ for (const key of keys) {
360
+ result[key] = item[key];
361
+ }
362
+ return result;
363
+ }
364
+ const chainSplitRegex = /[.[\]]/g;
365
+ const chainCleanRegex = /[?!'"]/g;
366
+ const chainNumericRegex = /^[0-9]*$/;
367
+ function getChainSplits(chain) {
368
+ const split = chain.split(chainSplitRegex).map((item) => item.replace(chainCleanRegex, "")).filter((item) => Boolean(item));
369
+ const result = [];
370
+ for (const splitItem of split) {
371
+ if (chainNumericRegex.test(splitItem)) {
372
+ result.push(Number.parseInt(splitItem));
373
+ } else {
374
+ result.push(splitItem);
375
+ }
376
+ }
377
+ return result;
378
+ }
379
+ function objGetChainValue(obj, chain, optional) {
380
+ const splits = getChainSplits(chain);
381
+ let result = obj;
382
+ for (const splitItem of splits) {
383
+ if (optional && result === void 0) {
384
+ result = void 0;
385
+ } else {
386
+ result = result[splitItem];
387
+ }
388
+ }
389
+ return result;
390
+ }
391
+ function objGetChainValueByDepth(obj, key, depth, optional) {
392
+ if (depth < 1) {
393
+ throw new ArgumentError("depth\uB294 1 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", { depth });
394
+ }
395
+ let result = obj;
396
+ for (let i = 0; i < depth; i++) {
397
+ if (optional && result == null) {
398
+ result = void 0;
399
+ } else {
400
+ result = result[key];
401
+ }
402
+ }
403
+ return result;
404
+ }
405
+ function objSetChainValue(obj, chain, value) {
406
+ const splits = getChainSplits(chain);
407
+ if (splits.length === 0) {
408
+ throw new ArgumentError("\uCCB4\uC778\uC774 \uBE44\uC5B4\uC788\uC2B5\uB2C8\uB2E4.", { chain });
409
+ }
410
+ let curr = obj;
411
+ for (const splitItem of splits.slice(0, -1)) {
412
+ curr[splitItem] = curr[splitItem] ?? {};
413
+ curr = curr[splitItem];
414
+ }
415
+ const last = splits[splits.length - 1];
416
+ curr[last] = value;
417
+ }
418
+ function objDeleteChainValue(obj, chain) {
419
+ const splits = getChainSplits(chain);
420
+ if (splits.length === 0) {
421
+ throw new ArgumentError("\uCCB4\uC778\uC774 \uBE44\uC5B4\uC788\uC2B5\uB2C8\uB2E4.", { chain });
422
+ }
423
+ let curr = obj;
424
+ for (const splitItem of splits.slice(0, -1)) {
425
+ const next = curr[splitItem];
426
+ if (next == null || typeof next !== "object") {
427
+ return;
428
+ }
429
+ curr = next;
430
+ }
431
+ const last = splits[splits.length - 1];
432
+ delete curr[last];
433
+ }
434
+ function objClearUndefined(obj) {
435
+ const record = obj;
436
+ for (const key of Object.keys(record)) {
437
+ if (record[key] === void 0) {
438
+ delete record[key];
439
+ }
440
+ }
441
+ return obj;
442
+ }
443
+ function objClear(obj) {
444
+ for (const key of Object.keys(obj)) {
445
+ delete obj[key];
446
+ }
447
+ return obj;
448
+ }
449
+ function objNullToUndefined(obj) {
450
+ return objNullToUndefinedImpl(obj, /* @__PURE__ */ new WeakSet());
451
+ }
452
+ function objNullToUndefinedImpl(obj, seen) {
453
+ if (obj == null) {
454
+ return void 0;
455
+ }
456
+ if (obj instanceof Date || obj instanceof DateTime || obj instanceof DateOnly || obj instanceof Time || obj instanceof Uuid) {
457
+ return obj;
458
+ }
459
+ if (obj instanceof Array) {
460
+ if (seen.has(obj)) return obj;
461
+ seen.add(obj);
462
+ for (let i = 0; i < obj.length; i++) {
463
+ obj[i] = objNullToUndefinedImpl(obj[i], seen);
464
+ }
465
+ return obj;
466
+ }
467
+ if (typeof obj === "object") {
468
+ if (seen.has(obj)) return obj;
469
+ seen.add(obj);
470
+ const objRec = obj;
471
+ for (const key of Object.keys(obj)) {
472
+ objRec[key] = objNullToUndefinedImpl(objRec[key], seen);
473
+ }
474
+ return obj;
475
+ }
476
+ return obj;
477
+ }
478
+ function objUnflatten(flatObj) {
479
+ const result = {};
480
+ for (const key in flatObj) {
481
+ const parts = key.split(".");
482
+ let current = result;
483
+ for (let i = 0; i < parts.length; i++) {
484
+ const part = parts[i];
485
+ if (i === parts.length - 1) {
486
+ current[part] = flatObj[key];
487
+ } else {
488
+ if (!(part in current)) {
489
+ current[part] = {};
490
+ }
491
+ current = current[part];
492
+ }
493
+ }
494
+ }
495
+ return result;
496
+ }
497
+ function objKeys(obj) {
498
+ return Object.keys(obj);
499
+ }
500
+ function objEntries(obj) {
501
+ return Object.entries(obj);
502
+ }
503
+ function objFromEntries(entries) {
504
+ return Object.fromEntries(entries);
505
+ }
506
+ function objMap(obj, fn) {
507
+ return objMapImpl(obj, fn);
508
+ }
509
+ function objMapImpl(obj, fn) {
510
+ const result = {};
511
+ for (const key of Object.keys(obj)) {
512
+ const [newKey, newValue] = fn(key, obj[key]);
513
+ result[newKey ?? key] = newValue;
514
+ }
515
+ return result;
516
+ }
517
+ export {
518
+ objClear,
519
+ objClearUndefined,
520
+ objClone,
521
+ objDeleteChainValue,
522
+ objEntries,
523
+ objEqual,
524
+ objFromEntries,
525
+ objGetChainValue,
526
+ objGetChainValueByDepth,
527
+ objKeys,
528
+ objMap,
529
+ objMerge,
530
+ objMerge3,
531
+ objNullToUndefined,
532
+ objOmit,
533
+ objOmitByFilter,
534
+ objPick,
535
+ objSetChainValue,
536
+ objUnflatten
537
+ };
538
+ //# sourceMappingURL=obj.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/obj.ts"],
4
+ "sourcesContent": ["import { DateTime } from \"../types/date-time\";\nimport { DateOnly } from \"../types/date-only\";\nimport { Time } from \"../types/time\";\nimport { Uuid } from \"../types/uuid\";\nimport { ArgumentError } from \"../errors/argument-error\";\n\n//#region objClone\n\n/**\n * \uAE4A\uC740 \uBCF5\uC0AC\n * - \uC21C\uD658 \uCC38\uC870 \uC9C0\uC6D0\n * - \uCEE4\uC2A4\uD140 \uD0C0\uC785(DateTime, DateOnly, Time, Uuid, Uint8Array) \uBCF5\uC0AC \uC9C0\uC6D0\n *\n * @note \uD568\uC218, Symbol\uC740 \uBCF5\uC0AC\uB418\uC9C0 \uC54A\uACE0 \uCC38\uC870\uAC00 \uC720\uC9C0\uB428\n * @note WeakMap, WeakSet\uC740 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC74C (\uC77C\uBC18 \uAC1D\uCCB4\uB85C \uBCF5\uC0AC\uB418\uC5B4 \uBE48 \uAC1D\uCCB4\uAC00 \uB428)\n * @note \uD504\uB85C\uD1A0\uD0C0\uC785 \uCCB4\uC778\uC740 \uC720\uC9C0\uB428 (Object.setPrototypeOf \uC0AC\uC6A9)\n * @note getter/setter\uB294 \uD604\uC7AC \uAC12\uC73C\uB85C \uD3C9\uAC00\uB418\uC5B4 \uBCF5\uC0AC\uB428 (\uC811\uADFC\uC790 \uC18D\uC131 \uC790\uCCB4\uB294 \uBCF5\uC0AC\uB418\uC9C0 \uC54A\uC74C)\n */\nexport function objClone<T>(source: T): T {\n return objCloneImpl(source) as T;\n}\n\nfunction objCloneImpl(source: unknown, prevClones?: WeakMap<object, unknown>): unknown {\n // primitive\uB294 \uADF8\uB300\uB85C \uBC18\uD658\n if (typeof source !== \"object\" || source === null) {\n return source;\n }\n\n // Immutable-like \uD0C0\uC785\uB4E4 (\uB0B4\uBD80\uC5D0 object \uCC38\uC870 \uC5C6\uC74C)\n if (source instanceof Date) {\n return new Date(source.getTime());\n }\n\n if (source instanceof DateTime) {\n return new DateTime(source.tick);\n }\n\n if (source instanceof DateOnly) {\n return new DateOnly(source.tick);\n }\n\n if (source instanceof Time) {\n return new Time(source.tick);\n }\n\n if (source instanceof Uuid) {\n return new Uuid(source.toString());\n }\n\n // RegExp\n if (source instanceof RegExp) {\n return new RegExp(source.source, source.flags);\n }\n\n // \uC21C\uD658 \uCC38\uC870 \uCCB4\uD06C (Error \uD3EC\uD568 \uBAA8\uB4E0 object \uD0C0\uC785\uC5D0 \uC801\uC6A9)\n const currPrevClones = prevClones ?? new WeakMap<object, unknown>();\n if (currPrevClones.has(source)) {\n return currPrevClones.get(source);\n }\n\n // Error (cause \uD3EC\uD568)\n // \uC0DD\uC131\uC790 \uD638\uCD9C \uB300\uC2E0 \uD504\uB85C\uD1A0\uD0C0\uC785 \uAE30\uBC18 \uBCF5\uC0AC - \uCEE4\uC2A4\uD140 Error \uD074\uB798\uC2A4 \uD638\uD658\uC131 \uBCF4\uC7A5\n if (source instanceof Error) {\n const cloned = Object.create(Object.getPrototypeOf(source)) as Error;\n currPrevClones.set(source, cloned);\n cloned.message = source.message;\n cloned.name = source.name;\n cloned.stack = source.stack;\n if (source.cause !== undefined) {\n cloned.cause = objCloneImpl(source.cause, currPrevClones);\n }\n // \uCEE4\uC2A4\uD140 Error \uC18D\uC131 \uBCF5\uC0AC\n for (const key of Object.keys(source)) {\n if (![\"message\", \"name\", \"stack\", \"cause\"].includes(key)) {\n (cloned as unknown as Record<string, unknown>)[key] = objCloneImpl(\n (source as unknown as Record<string, unknown>)[key],\n currPrevClones,\n );\n }\n }\n return cloned;\n }\n\n if (source instanceof Uint8Array) {\n const result = source.slice();\n currPrevClones.set(source, result);\n return result;\n }\n\n if (source instanceof Array) {\n const result: unknown[] = [];\n currPrevClones.set(source, result);\n for (const item of source) {\n result.push(objCloneImpl(item, currPrevClones));\n }\n return result;\n }\n\n if (source instanceof Map) {\n const result = new Map();\n currPrevClones.set(source, result);\n for (const [key, value] of source) {\n result.set(objCloneImpl(key, currPrevClones), objCloneImpl(value, currPrevClones));\n }\n return result;\n }\n\n if (source instanceof Set) {\n const result = new Set();\n currPrevClones.set(source, result);\n for (const item of source) {\n result.add(objCloneImpl(item, currPrevClones));\n }\n return result;\n }\n\n // \uAE30\uD0C0 Object\n const result: Record<string, unknown> = {};\n Object.setPrototypeOf(result, Object.getPrototypeOf(source));\n currPrevClones.set(source, result);\n\n for (const key of Object.keys(source)) {\n const value = (source as Record<string, unknown>)[key];\n result[key] = objCloneImpl(value, currPrevClones);\n }\n\n return result;\n}\n\n//#endregion\n\n//#region objEqual\n\n/** objEqual \uC635\uC158 \uD0C0\uC785 */\nexport interface EqualOptions {\n /** \uBE44\uAD50\uD560 \uD0A4 \uBAA9\uB85D. \uC9C0\uC815 \uC2DC \uD574\uB2F9 \uD0A4\uB9CC \uBE44\uAD50 (\uCD5C\uC0C1\uC704 \uB808\uBCA8\uC5D0\uB9CC \uC801\uC6A9) */\n topLevelIncludes?: string[];\n /** \uBE44\uAD50\uC5D0\uC11C \uC81C\uC678\uD560 \uD0A4 \uBAA9\uB85D (\uCD5C\uC0C1\uC704 \uB808\uBCA8\uC5D0\uB9CC \uC801\uC6A9) */\n topLevelExcludes?: string[];\n /** \uBC30\uC5F4 \uC21C\uC11C \uBB34\uC2DC \uC5EC\uBD80. true \uC2DC O(n\u00B2) \uBCF5\uC7A1\uB3C4 */\n ignoreArrayIndex?: boolean;\n /** \uC595\uC740 \uBE44\uAD50 \uC5EC\uBD80. true \uC2DC 1\uB2E8\uACC4\uB9CC \uBE44\uAD50 (\uCC38\uC870 \uBE44\uAD50) */\n onlyOneDepth?: boolean;\n}\n\n/**\n * \uAE4A\uC740 \uBE44\uAD50\n *\n * @param source \uBE44\uAD50 \uB300\uC0C1 1\n * @param target \uBE44\uAD50 \uB300\uC0C1 2\n * @param options \uBE44\uAD50 \uC635\uC158\n * @param options.topLevelIncludes \uBE44\uAD50\uD560 \uD0A4 \uBAA9\uB85D. \uC9C0\uC815 \uC2DC \uD574\uB2F9 \uD0A4\uB9CC \uBE44\uAD50 (\uCD5C\uC0C1\uC704 \uB808\uBCA8\uC5D0\uB9CC \uC801\uC6A9)\n * @example `{ topLevelIncludes: [\"id\", \"name\"] }` - id, name \uD0A4\uB9CC \uBE44\uAD50\n * @param options.topLevelExcludes \uBE44\uAD50\uC5D0\uC11C \uC81C\uC678\uD560 \uD0A4 \uBAA9\uB85D (\uCD5C\uC0C1\uC704 \uB808\uBCA8\uC5D0\uB9CC \uC801\uC6A9)\n * @example `{ topLevelExcludes: [\"updatedAt\"] }` - updatedAt \uD0A4\uB97C \uC81C\uC678\uD558\uACE0 \uBE44\uAD50\n * @param options.ignoreArrayIndex \uBC30\uC5F4 \uC21C\uC11C \uBB34\uC2DC \uC5EC\uBD80. true \uC2DC O(n\u00B2) \uBCF5\uC7A1\uB3C4\n * @param options.onlyOneDepth \uC595\uC740 \uBE44\uAD50 \uC5EC\uBD80. true \uC2DC 1\uB2E8\uACC4\uB9CC \uBE44\uAD50 (\uCC38\uC870 \uBE44\uAD50)\n *\n * @note topLevelIncludes/topLevelExcludes \uC635\uC158\uC740 object \uC18D\uC131 \uD0A4\uC5D0\uB9CC \uC801\uC6A9\uB428.\n * Map\uC758 \uBAA8\uB4E0 \uD0A4\uB294 \uD56D\uC0C1 \uBE44\uAD50\uC5D0 \uD3EC\uD568\uB428.\n * @note \uC131\uB2A5 \uACE0\uB824\uC0AC\uD56D:\n * - \uAE30\uBCF8 \uBC30\uC5F4 \uBE44\uAD50: O(n) \uC2DC\uAC04 \uBCF5\uC7A1\uB3C4\n * - `ignoreArrayIndex: true` \uC0AC\uC6A9 \uC2DC: O(n\u00B2) \uC2DC\uAC04 \uBCF5\uC7A1\uB3C4\n * (\uB300\uC6A9\uB7C9 \uBC30\uC5F4\uC5D0\uC11C \uC131\uB2A5 \uC800\uD558 \uAC00\uB2A5)\n * @note `ignoreArrayIndex: true` \uB3D9\uC791 \uD2B9\uC131:\n * - \uBC30\uC5F4 \uC21C\uC11C\uB97C \uBB34\uC2DC\uD558\uACE0 \uB3D9\uC77C\uD55C \uC694\uC18C\uB4E4\uC758 \uC21C\uC5F4\uC778\uC9C0 \uBE44\uAD50\n * - \uC608: `[1,2,3]`\uACFC `[3,2,1]` \u2192 true, `[1,1,1]`\uACFC `[1,2,3]` \u2192 false\n */\nexport function objEqual(source: unknown, target: unknown, options?: EqualOptions): boolean {\n if (source === target) return true;\n if (source == null || target == null) return false;\n if (typeof source !== typeof target) return false;\n\n if (source instanceof Date && target instanceof Date) {\n return source.getTime() === target.getTime();\n }\n\n if (\n (source instanceof DateTime && target instanceof DateTime) ||\n (source instanceof DateOnly && target instanceof DateOnly) ||\n (source instanceof Time && target instanceof Time)\n ) {\n return source.tick === target.tick;\n }\n\n if (source instanceof Uuid && target instanceof Uuid) {\n return source.toString() === target.toString();\n }\n\n if (source instanceof RegExp && target instanceof RegExp) {\n return source.source === target.source && source.flags === target.flags;\n }\n\n if (source instanceof Array && target instanceof Array) {\n return objEqualArray(source, target, options);\n }\n\n if (source instanceof Map && target instanceof Map) {\n return objEqualMap(source, target, options);\n }\n\n if (source instanceof Set && target instanceof Set) {\n return objEqualSet(source, target, options);\n }\n\n if (typeof source === \"object\" && typeof target === \"object\") {\n return objEqualObject(source as Record<string, unknown>, target as Record<string, unknown>, options);\n }\n\n return false;\n}\n\nfunction objEqualArray(source: unknown[], target: unknown[], options?: EqualOptions): boolean {\n if (source.length !== target.length) {\n return false;\n }\n\n if (options?.ignoreArrayIndex) {\n const matchedIndices = new Set<number>();\n\n if (options.onlyOneDepth) {\n return source.every((sourceItem) => {\n const idx = target.findIndex((t, i) => !matchedIndices.has(i) && t === sourceItem);\n if (idx !== -1) {\n matchedIndices.add(idx);\n return true;\n }\n return false;\n });\n } else {\n // \uC7AC\uADC0 \uD638\uCD9C \uC2DC topLevelIncludes/topLevelExcludes \uC635\uC158\uC740 \uCD5C\uC0C1\uC704 \uB808\uBCA8\uC5D0\uB9CC \uC801\uC6A9\uB418\uBBC0\uB85C \uC81C\uC678\n const recursiveOptions = { ignoreArrayIndex: options.ignoreArrayIndex, onlyOneDepth: options.onlyOneDepth };\n return source.every((sourceItem) => {\n const idx = target.findIndex((t, i) => !matchedIndices.has(i) && objEqual(t, sourceItem, recursiveOptions));\n if (idx !== -1) {\n matchedIndices.add(idx);\n return true;\n }\n return false;\n });\n }\n } else {\n if (options?.onlyOneDepth) {\n for (let i = 0; i < source.length; i++) {\n if (source[i] !== target[i]) {\n return false;\n }\n }\n } else {\n // \uC7AC\uADC0 \uD638\uCD9C \uC2DC topLevelIncludes/topLevelExcludes \uC635\uC158\uC740 \uCD5C\uC0C1\uC704 \uB808\uBCA8\uC5D0\uB9CC \uC801\uC6A9\uB418\uBBC0\uB85C \uC81C\uC678\n for (let i = 0; i < source.length; i++) {\n if (\n !objEqual(source[i], target[i], {\n ignoreArrayIndex: options?.ignoreArrayIndex,\n onlyOneDepth: options?.onlyOneDepth,\n })\n ) {\n return false;\n }\n }\n }\n }\n\n return true;\n}\n\n/**\n * Map \uAC1D\uCCB4 \uBE44\uAD50\n * @note \uBE44\uBB38\uC790\uC5F4 \uD0A4(\uAC1D\uCCB4, \uBC30\uC5F4 \uB4F1) \uCC98\uB9AC \uC2DC O(n\u00B2) \uBCF5\uC7A1\uB3C4 \uBC1C\uC0DD\n * @note \uB300\uB7C9 \uB370\uC774\uD130\uC758 \uACBD\uC6B0 onlyOneDepth: true \uC635\uC158 \uC0AC\uC6A9 \uAD8C\uC7A5 (\uCC38\uC870 \uBE44\uAD50\uB85C O(n)\uC73C\uB85C \uAC1C\uC120)\n */\nfunction objEqualMap(source: Map<unknown, unknown>, target: Map<unknown, unknown>, options?: EqualOptions): boolean {\n // Map \uBE44\uAD50 \uC2DC topLevelIncludes/topLevelExcludes \uC635\uC158\uC740 \uBB34\uC2DC\uB428 (object \uC18D\uC131 \uD0A4\uC5D0\uB9CC \uC801\uC6A9)\n const sourceKeys = Array.from(source.keys()).filter((key) => source.get(key) != null);\n const targetKeys = Array.from(target.keys()).filter((key) => target.get(key) != null);\n\n if (sourceKeys.length !== targetKeys.length) {\n return false;\n }\n\n const usedTargetKeys = new Set<number>();\n for (const sourceKey of sourceKeys) {\n // \uBB38\uC790\uC5F4 \uD0A4: \uC9C1\uC811 \uBE44\uAD50\n if (typeof sourceKey === \"string\") {\n const sourceValue = source.get(sourceKey);\n const targetValue = target.get(sourceKey);\n if (options?.onlyOneDepth) {\n if (sourceValue !== targetValue) return false;\n } else {\n if (\n !objEqual(sourceValue, targetValue, {\n ignoreArrayIndex: options?.ignoreArrayIndex,\n onlyOneDepth: options?.onlyOneDepth,\n })\n ) {\n return false;\n }\n }\n } else {\n // \uBE44\uBB38\uC790\uC5F4 \uD0A4: targetKeys\uC5D0\uC11C \uB3D9\uB4F1\uD55C \uD0A4 \uCC3E\uAE30\n let found = false;\n for (let i = 0; i < targetKeys.length; i++) {\n const targetKey = targetKeys[i];\n if (typeof targetKey === \"string\" || usedTargetKeys.has(i)) continue;\n if (options?.onlyOneDepth ? sourceKey === targetKey : objEqual(sourceKey, targetKey)) {\n usedTargetKeys.add(i);\n const sourceValue = source.get(sourceKey);\n const targetValue = target.get(targetKey);\n if (options?.onlyOneDepth) {\n if (sourceValue !== targetValue) return false;\n } else {\n if (\n !objEqual(sourceValue, targetValue, {\n ignoreArrayIndex: options?.ignoreArrayIndex,\n onlyOneDepth: options?.onlyOneDepth,\n })\n ) {\n return false;\n }\n }\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n }\n\n return true;\n}\n\nfunction objEqualObject(\n source: Record<string, unknown>,\n target: Record<string, unknown>,\n options?: EqualOptions,\n): boolean {\n const sourceKeys = Object.keys(source).filter(\n (key) =>\n (options?.topLevelIncludes === undefined || options.topLevelIncludes.includes(key)) &&\n !options?.topLevelExcludes?.includes(key) &&\n source[key] != null,\n );\n const targetKeys = Object.keys(target).filter(\n (key) =>\n (options?.topLevelIncludes === undefined || options.topLevelIncludes.includes(key)) &&\n !options?.topLevelExcludes?.includes(key) &&\n target[key] != null,\n );\n\n if (sourceKeys.length !== targetKeys.length) {\n return false;\n }\n\n for (const key of sourceKeys) {\n if (options?.onlyOneDepth) {\n if (source[key] !== target[key]) {\n return false;\n }\n } else {\n if (\n !objEqual(source[key], target[key], {\n ignoreArrayIndex: options?.ignoreArrayIndex,\n })\n ) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Set \uAE4A\uC740 \uBE44\uAD50\n * @note deep equal \uBE44\uAD50(`onlyOneDepth: false`)\uB294 O(n\u00B2) \uC2DC\uAC04 \uBCF5\uC7A1\uB3C4\uB97C \uAC00\uC9D0.\n * primitive Set\uC774\uB098 \uC131\uB2A5\uC774 \uC911\uC694\uD55C \uACBD\uC6B0 `onlyOneDepth: true` \uC0AC\uC6A9 \uAD8C\uC7A5\n */\nfunction objEqualSet(source: Set<unknown>, target: Set<unknown>, options?: EqualOptions): boolean {\n if (source.size !== target.size) {\n return false;\n }\n\n if (options?.onlyOneDepth) {\n for (const sourceItem of source) {\n if (!target.has(sourceItem)) {\n return false;\n }\n }\n } else {\n // deep equal: target \uBC30\uC5F4\uC744 \uB8E8\uD504 \uC678\uBD80\uC5D0\uC11C 1\uD68C\uB9CC \uC0DD\uC131\n // \uB9E4\uCE6D\uB41C \uC778\uB371\uC2A4\uB97C \uCD94\uC801\uD558\uC5EC \uC911\uBCF5 \uB9E4\uCE6D \uBC29\uC9C0\n const targetArr = [...target];\n const matchedIndices = new Set<number>();\n for (const sourceItem of source) {\n const idx = targetArr.findIndex((t, i) => !matchedIndices.has(i) && objEqual(sourceItem, t, options));\n if (idx === -1) {\n return false;\n }\n matchedIndices.add(idx);\n }\n }\n\n return true;\n}\n\n//#endregion\n\n//#region objMerge\n\n/** objMerge \uC635\uC158 \uD0C0\uC785 */\nexport interface ObjMergeOptions {\n /** \uBC30\uC5F4 \uCC98\uB9AC \uBC29\uC2DD. \"replace\": target\uC73C\uB85C \uB300\uCCB4(\uAE30\uBCF8), \"concat\": \uD569\uCE68(\uC911\uBCF5 \uC81C\uAC70) */\n arrayProcess?: \"replace\" | \"concat\";\n /** target\uC774 null\uC77C \uB54C \uD574\uB2F9 \uD0A4 \uC0AD\uC81C \uC5EC\uBD80 */\n useDelTargetNull?: boolean;\n}\n\n/**\n * \uAE4A\uC740 \uBCD1\uD569 (source\uB97C base\uB85C target\uC744 \uBCD1\uD569)\n *\n * @param source \uAE30\uC900 \uAC1D\uCCB4\n * @param target \uBCD1\uD569\uD560 \uAC1D\uCCB4\n * @param opt \uBCD1\uD569 \uC635\uC158\n * @param opt.arrayProcess \uBC30\uC5F4 \uCC98\uB9AC \uBC29\uC2DD\n * - `\"replace\"`: target \uBC30\uC5F4\uB85C \uB300\uCCB4 (\uAE30\uBCF8\uAC12)\n * - `\"concat\"`: source\uC640 target \uBC30\uC5F4\uC744 \uD569\uCE68 (Set\uC73C\uB85C \uC911\uBCF5 \uC81C\uAC70)\n * @param opt.useDelTargetNull target \uAC12\uC774 null\uC77C \uB54C \uD574\uB2F9 \uD0A4 \uC0AD\uC81C \uC5EC\uBD80\n * - `true`: target\uC774 null\uC774\uBA74 \uACB0\uACFC\uC5D0\uC11C \uD574\uB2F9 \uD0A4 \uC0AD\uC81C\n * - `false` \uB610\uB294 \uBBF8\uC9C0\uC815: source \uAC12 \uC720\uC9C0\n *\n * @note \uC6D0\uBCF8 \uAC1D\uCCB4\uB97C \uC218\uC815\uD558\uC9C0 \uC54A\uACE0 \uC0C8 \uAC1D\uCCB4\uB97C \uBC18\uD658\uD568 (\uBD88\uBCC0\uC131 \uBCF4\uC7A5)\n * @note arrayProcess=\"concat\" \uC0AC\uC6A9 \uC2DC Set\uC744 \uD1B5\uD574 \uC911\uBCF5\uC744 \uC81C\uAC70\uD558\uBA70,\n * \uAC1D\uCCB4 \uBC30\uC5F4\uC758 \uACBD\uC6B0 \uCC38\uC870(\uC8FC\uC18C) \uBE44\uAD50\uB85C \uC911\uBCF5\uC744 \uD310\uB2E8\uD568\n * @note \uD0C0\uC785\uC774 \uB2E4\uB978 \uACBD\uC6B0 target \uAC12\uC73C\uB85C \uB36E\uC5B4\uC500\n */\nexport function objMerge<T, P>(source: T, target: P, opt?: ObjMergeOptions): T & P {\n if (source == null) {\n return objClone(target) as T & P;\n }\n\n if (target === undefined) {\n return objClone(source) as T & P;\n }\n\n if (target === null) {\n return opt?.useDelTargetNull ? (undefined as T & P) : (objClone(source) as T & P);\n }\n\n if (typeof target !== \"object\") {\n return target as T & P;\n }\n\n if (\n target instanceof Date ||\n target instanceof DateTime ||\n target instanceof DateOnly ||\n target instanceof Time ||\n target instanceof Uuid ||\n target instanceof Uint8Array ||\n (opt?.arrayProcess === \"replace\" && target instanceof Array)\n ) {\n return objClone(target) as T & P;\n }\n\n // source\uAC00 object\uAC00 \uC544\uB2C8\uAC70\uB098, source\uC640 target\uC774 \uB2E4\uB978 \uC885\uB958\uC758 object\uBA74 target\uC73C\uB85C \uB36E\uC5B4\uC500\n if (typeof source !== \"object\" || source.constructor !== target.constructor) {\n return objClone(target) as T & P;\n }\n\n if (source instanceof Map && target instanceof Map) {\n const result = objClone(source);\n for (const key of target.keys()) {\n if (result.has(key)) {\n result.set(key, objMerge(result.get(key), target.get(key), opt));\n } else {\n result.set(key, objClone(target.get(key)));\n }\n }\n return result as T & P;\n }\n\n if (opt?.arrayProcess === \"concat\" && source instanceof Array && target instanceof Array) {\n let result = [...new Set([...source, ...target])];\n if (opt.useDelTargetNull) {\n result = result.filter((item) => item !== null);\n }\n return result as T & P;\n }\n\n const sourceRec = source as Record<string, unknown>;\n const targetRec = target as Record<string, unknown>;\n const resultRec = objClone(sourceRec);\n for (const key of Object.keys(target)) {\n resultRec[key] = objMerge(sourceRec[key], targetRec[key], opt);\n if (resultRec[key] === undefined) {\n delete resultRec[key];\n }\n }\n\n return resultRec as T & P;\n}\n\n/** merge3 \uC635\uC158 \uD0C0\uC785 */\nexport interface ObjMerge3KeyOptions {\n /** \uBE44\uAD50\uD560 \uD558\uC704 \uD0A4 \uBAA9\uB85D (equal\uC758 topLevelIncludes\uC640 \uB3D9\uC77C) */\n keys?: string[];\n /** \uBE44\uAD50\uC5D0\uC11C \uC81C\uC678\uD560 \uD558\uC704 \uD0A4 \uBAA9\uB85D */\n excludes?: string[];\n /** \uBC30\uC5F4 \uC21C\uC11C \uBB34\uC2DC \uC5EC\uBD80 */\n ignoreArrayIndex?: boolean;\n}\n\n/**\n * 3-way \uBCD1\uD569\n *\n * source, origin, target \uC138 \uAC1D\uCCB4\uB97C \uBE44\uAD50\uD558\uC5EC \uBCD1\uD569\uD569\uB2C8\uB2E4.\n * - source\uC640 origin\uC774 \uAC19\uACE0 target\uC774 \uB2E4\uB974\uBA74 \u2192 target \uAC12 \uC0AC\uC6A9\n * - target\uACFC origin\uC774 \uAC19\uACE0 source\uAC00 \uB2E4\uB974\uBA74 \u2192 source \uAC12 \uC0AC\uC6A9\n * - source\uC640 target\uC774 \uAC19\uC73C\uBA74 \u2192 \uD574\uB2F9 \uAC12 \uC0AC\uC6A9\n * - \uC138 \uAC12\uC774 \uBAA8\uB450 \uB2E4\uB974\uBA74 \u2192 \uCDA9\uB3CC \uBC1C\uC0DD (origin \uAC12 \uC720\uC9C0)\n *\n * @param source \uBCC0\uACBD\uB41C \uBC84\uC804 1\n * @param origin \uAE30\uC900 \uBC84\uC804 (\uACF5\uD1B5 \uC870\uC0C1)\n * @param target \uBCC0\uACBD\uB41C \uBC84\uC804 2\n * @param optionsObj \uD0A4\uBCC4 \uBE44\uAD50 \uC635\uC158. \uAC01 \uD0A4\uC5D0 \uB300\uD574 equal() \uBE44\uAD50 \uC635\uC158\uC744 \uAC1C\uBCC4 \uC9C0\uC815\n * - `keys`: \uBE44\uAD50\uD560 \uD558\uC704 \uD0A4 \uBAA9\uB85D (equal\uC758 topLevelIncludes\uC640 \uB3D9\uC77C)\n * - `excludes`: \uBE44\uAD50\uC5D0\uC11C \uC81C\uC678\uD560 \uD558\uC704 \uD0A4 \uBAA9\uB85D\n * - `ignoreArrayIndex`: \uBC30\uC5F4 \uC21C\uC11C \uBB34\uC2DC \uC5EC\uBD80\n * @returns conflict: \uCDA9\uB3CC \uBC1C\uC0DD \uC5EC\uBD80, result: \uBCD1\uD569 \uACB0\uACFC\n *\n * @example\n * const { conflict, result } = merge3(\n * { a: 1, b: 2 }, // source\n * { a: 1, b: 1 }, // origin\n * { a: 2, b: 1 }, // target\n * );\n * // conflict: false, result: { a: 2, b: 2 }\n */\nexport function objMerge3<\n S extends Record<string, unknown>,\n O extends Record<string, unknown>,\n T extends Record<string, unknown>,\n>(\n source: S,\n origin: O,\n target: T,\n optionsObj?: Record<string, ObjMerge3KeyOptions>,\n): {\n conflict: boolean;\n result: O & S & T;\n} {\n let conflict = false;\n const result = objClone(origin) as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(source), ...Object.keys(target), ...Object.keys(origin)]);\n for (const key of allKeys) {\n if (objEqual(source[key], result[key], optionsObj?.[key])) {\n result[key] = objClone(target[key]);\n } else if (objEqual(target[key], result[key], optionsObj?.[key])) {\n result[key] = objClone(source[key]);\n } else if (objEqual(source[key], target[key], optionsObj?.[key])) {\n result[key] = objClone(source[key]);\n } else {\n conflict = true;\n }\n }\n\n return {\n conflict,\n result: result as O & S & T,\n };\n}\n\n//#endregion\n\n//#region objOmit / objPick\n\n/**\n * \uAC1D\uCCB4\uC5D0\uC11C \uD2B9\uC815 \uD0A4\uB4E4\uC744 \uC81C\uC678\n * @param item \uC6D0\uBCF8 \uAC1D\uCCB4\n * @param omitKeys \uC81C\uC678\uD560 \uD0A4 \uBC30\uC5F4\n * @returns \uC9C0\uC815\uB41C \uD0A4\uAC00 \uC81C\uC678\uB41C \uC0C8 \uAC1D\uCCB4\n * @example\n * const user = { name: \"Alice\", age: 30, email: \"alice@example.com\" };\n * objOmit(user, [\"email\"]);\n * // { name: \"Alice\", age: 30 }\n */\nexport function objOmit<T extends Record<string, unknown>, K extends keyof T>(item: T, omitKeys: K[]): Omit<T, K> {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(item)) {\n if (!omitKeys.includes(key as K)) {\n result[key] = item[key];\n }\n }\n return result as Omit<T, K>;\n}\n\n/**\n * \uC870\uAC74\uC5D0 \uB9DE\uB294 \uD0A4\uB4E4\uC744 \uC81C\uC678\n * @internal\n * @param item \uC6D0\uBCF8 \uAC1D\uCCB4\n * @param omitKeyFn \uD0A4\uB97C \uBC1B\uC544 \uC81C\uC678 \uC5EC\uBD80\uB97C \uBC18\uD658\uD558\uB294 \uD568\uC218 (true\uBA74 \uC81C\uC678)\n * @returns \uC870\uAC74\uC5D0 \uB9DE\uB294 \uD0A4\uAC00 \uC81C\uC678\uB41C \uC0C8 \uAC1D\uCCB4\n * @example\n * const data = { name: \"Alice\", _internal: \"secret\", age: 30 };\n * objOmitByFilter(data, (key) => key.startsWith(\"_\"));\n * // { name: \"Alice\", age: 30 }\n */\nexport function objOmitByFilter<T extends Record<string, unknown>>(item: T, omitKeyFn: (key: keyof T) => boolean): T {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(item)) {\n if (!omitKeyFn(key)) {\n result[key] = item[key];\n }\n }\n return result as T;\n}\n\n/**\n * \uAC1D\uCCB4\uC5D0\uC11C \uD2B9\uC815 \uD0A4\uB4E4\uB9CC \uC120\uD0DD\n * @param item \uC6D0\uBCF8 \uAC1D\uCCB4\n * @param keys \uC120\uD0DD\uD560 \uD0A4 \uBC30\uC5F4\n * @returns \uC9C0\uC815\uB41C \uD0A4\uB9CC \uD3EC\uD568\uB41C \uC0C8 \uAC1D\uCCB4\n * @example\n * const user = { name: \"Alice\", age: 30, email: \"alice@example.com\" };\n * objPick(user, [\"name\", \"age\"]);\n * // { name: \"Alice\", age: 30 }\n */\nexport function objPick<T extends Record<string, unknown>, K extends keyof T>(item: T, keys: K[]): Pick<T, K> {\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n result[key as string] = item[key];\n }\n return result as Pick<T, K>;\n}\n\n//#endregion\n\n//#region objGetChainValue / objSetChainValue / objDeleteChainValue\n\n// \uC815\uADDC\uC2DD \uCE90\uC2F1 (\uBAA8\uB4C8 \uB85C\uB4DC \uC2DC 1\uD68C\uB9CC \uC0DD\uC131)\nconst chainSplitRegex = /[.[\\]]/g;\nconst chainCleanRegex = /[?!'\"]/g;\nconst chainNumericRegex = /^[0-9]*$/;\n\nfunction getChainSplits(chain: string): (string | number)[] {\n const split = chain\n .split(chainSplitRegex)\n .map((item) => item.replace(chainCleanRegex, \"\"))\n .filter((item) => Boolean(item));\n const result: (string | number)[] = [];\n for (const splitItem of split) {\n if (chainNumericRegex.test(splitItem)) {\n result.push(Number.parseInt(splitItem));\n } else {\n result.push(splitItem);\n }\n }\n\n return result;\n}\n\n/**\n * \uCCB4\uC778 \uACBD\uB85C\uB85C \uAC12 \uAC00\uC838\uC624\uAE30\n * @example objGetChainValue(obj, \"a.b[0].c\")\n */\nexport function objGetChainValue(obj: unknown, chain: string, optional: true): unknown | undefined;\nexport function objGetChainValue(obj: unknown, chain: string): unknown;\nexport function objGetChainValue(obj: unknown, chain: string, optional?: true): unknown | undefined {\n const splits = getChainSplits(chain);\n let result: unknown = obj;\n for (const splitItem of splits) {\n if (optional && result === undefined) {\n result = undefined;\n } else {\n result = (result as Record<string | number, unknown>)[splitItem];\n }\n }\n return result;\n}\n\n/**\n * depth\uB9CC\uD07C \uAC19\uC740 \uD0A4\uB85C \uB0B4\uB824\uAC00\uAE30\n * @internal\n * @param obj \uB300\uC0C1 \uAC1D\uCCB4\n * @param key \uB0B4\uB824\uAC08 \uD0A4\n * @param depth \uB0B4\uB824\uAC08 \uAE4A\uC774 (1 \uC774\uC0C1)\n * @param optional true\uBA74 \uC911\uAC04\uC5D0 null/undefined\uAC00 \uC788\uC5B4\uB3C4 \uC5D0\uB7EC \uC5C6\uC774 undefined \uBC18\uD658\n * @throws ArgumentError depth\uAC00 1 \uBBF8\uB9CC\uC77C \uACBD\uC6B0\n * @example objGetChainValueByDepth({ parent: { parent: { name: 'a' } } }, 'parent', 2) => { name: 'a' }\n */\nexport function objGetChainValueByDepth<T, K extends keyof T>(\n obj: T,\n key: K,\n depth: number,\n optional: true,\n): T[K] | undefined;\nexport function objGetChainValueByDepth<T, K extends keyof T>(obj: T, key: K, depth: number): T[K];\nexport function objGetChainValueByDepth<T, K extends keyof T>(\n obj: T,\n key: K,\n depth: number,\n optional?: true,\n): T[K] | undefined {\n if (depth < 1) {\n throw new ArgumentError(\"depth\uB294 1 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.\", { depth });\n }\n let result: unknown = obj;\n for (let i = 0; i < depth; i++) {\n if (optional && result == null) {\n result = undefined;\n } else {\n result = (result as Record<string, unknown>)[key as string];\n }\n }\n return result as T[K] | undefined;\n}\n\n/**\n * \uCCB4\uC778 \uACBD\uB85C\uB85C \uAC12 \uC124\uC815\n * @example objSetChainValue(obj, \"a.b[0].c\", value)\n */\nexport function objSetChainValue(obj: unknown, chain: string, value: unknown): void {\n const splits = getChainSplits(chain);\n if (splits.length === 0) {\n throw new ArgumentError(\"\uCCB4\uC778\uC774 \uBE44\uC5B4\uC788\uC2B5\uB2C8\uB2E4.\", { chain });\n }\n\n let curr: Record<string | number, unknown> = obj as Record<string | number, unknown>;\n for (const splitItem of splits.slice(0, -1)) {\n curr[splitItem] = curr[splitItem] ?? {};\n curr = curr[splitItem] as Record<string | number, unknown>;\n }\n\n const last = splits[splits.length - 1];\n curr[last] = value;\n}\n\n/**\n * \uCCB4\uC778 \uACBD\uB85C\uC758 \uAC12 \uC0AD\uC81C\n * @example objDeleteChainValue(obj, \"a.b[0].c\")\n */\nexport function objDeleteChainValue(obj: unknown, chain: string): void {\n const splits = getChainSplits(chain);\n if (splits.length === 0) {\n throw new ArgumentError(\"\uCCB4\uC778\uC774 \uBE44\uC5B4\uC788\uC2B5\uB2C8\uB2E4.\", { chain });\n }\n\n let curr: Record<string | number, unknown> = obj as Record<string | number, unknown>;\n for (const splitItem of splits.slice(0, -1)) {\n const next = curr[splitItem];\n // \uC911\uAC04 \uACBD\uB85C\uAC00 \uC5C6\uC73C\uBA74 \uC870\uC6A9\uD788 \uB9AC\uD134 (\uC0AD\uC81C\uD560 \uAC83\uC774 \uC5C6\uC74C)\n if (next == null || typeof next !== \"object\") {\n return;\n }\n curr = next as Record<string | number, unknown>;\n }\n\n const last = splits[splits.length - 1];\n delete curr[last];\n}\n\n//#endregion\n\n//#region objClearUndefined / objClear / objNullToUndefined / objUnflatten\n\n/**\n * \uAC1D\uCCB4\uC5D0\uC11C undefined \uAC12\uC744 \uAC00\uC9C4 \uD0A4 \uC0AD\uC81C\n * @internal\n *\n * @mutates \uC6D0\uBCF8 \uAC1D\uCCB4\uB97C \uC9C1\uC811 \uC218\uC815\uD568\n */\nexport function objClearUndefined<T extends object>(obj: T): T {\n const record = obj as Record<string, unknown>;\n for (const key of Object.keys(record)) {\n if (record[key] === undefined) {\n delete record[key];\n }\n }\n return obj;\n}\n\n/**\n * \uAC1D\uCCB4\uC758 \uBAA8\uB4E0 \uD0A4 \uC0AD\uC81C\n * @internal\n *\n * @mutates \uC6D0\uBCF8 \uAC1D\uCCB4\uB97C \uC9C1\uC811 \uC218\uC815\uD568\n */\nexport function objClear<T extends Record<string, unknown>>(obj: T): Record<string, never> {\n for (const key of Object.keys(obj)) {\n delete obj[key];\n }\n return obj as Record<string, never>;\n}\n\n/**\n * null\uC744 undefined\uB85C \uBCC0\uD658 (\uC7AC\uADC0\uC801)\n * @internal\n *\n * @mutates \uC6D0\uBCF8 \uBC30\uC5F4/\uAC1D\uCCB4\uB97C \uC9C1\uC811 \uC218\uC815\uD568\n */\nexport function objNullToUndefined<T>(obj: T): T | undefined {\n return objNullToUndefinedImpl(obj, new WeakSet());\n}\n\nfunction objNullToUndefinedImpl<T>(obj: T, seen: WeakSet<object>): T | undefined {\n if (obj == null) {\n return undefined;\n }\n\n if (\n obj instanceof Date ||\n obj instanceof DateTime ||\n obj instanceof DateOnly ||\n obj instanceof Time ||\n obj instanceof Uuid\n ) {\n return obj;\n }\n\n if (obj instanceof Array) {\n if (seen.has(obj)) return obj;\n seen.add(obj);\n for (let i = 0; i < obj.length; i++) {\n obj[i] = objNullToUndefinedImpl(obj[i], seen);\n }\n return obj;\n }\n\n if (typeof obj === \"object\") {\n if (seen.has(obj as object)) return obj;\n seen.add(obj as object);\n const objRec = obj as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n objRec[key] = objNullToUndefinedImpl(objRec[key], seen);\n }\n\n return obj;\n }\n\n return obj;\n}\n\n/**\n * flat\uB41C \uAC1D\uCCB4\uB97C nested \uAC1D\uCCB4\uB85C \uBCC0\uD658\n * @internal\n * @example objUnflatten({ \"a.b.c\": 1 }) => { a: { b: { c: 1 } } }\n */\nexport function objUnflatten(flatObj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const key in flatObj) {\n const parts = key.split(\".\");\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (i === parts.length - 1) {\n current[part] = flatObj[key];\n } else {\n if (!(part in current)) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n }\n }\n\n return result;\n}\n\n//#endregion\n\n//#region \uD0C0\uC785 \uC720\uD2F8\uB9AC\uD2F0\n\n/**\n * undefined\uB97C \uAC00\uC9C4 \uD504\uB85C\uD37C\uD2F0\uB97C optional\uB85C \uBCC0\uD658\n * @example { a: string; b: string | undefined } \u2192 { a: string; b?: string | undefined }\n */\nexport type ObjUndefToOptional<T> = {\n [K in keyof T as undefined extends T[K] ? K : never]?: T[K];\n} & { [K in keyof T as undefined extends T[K] ? never : K]: T[K] };\n\n/**\n * optional \uD504\uB85C\uD37C\uD2F0\uB97C required + undefined \uC720\uB2C8\uC628\uC73C\uB85C \uBCC0\uD658\n * @example { a: string; b?: string } \u2192 { a: string; b: string | undefined }\n */\nexport type ObjOptionalToUndef<T> = {\n [K in keyof T]-?: {} extends Pick<T, K> ? T[K] | undefined : T[K];\n};\n\n//#endregion\n\n/**\n * Object.keys\uC758 \uD0C0\uC785 \uC548\uC804\uD55C \uBC84\uC804\n * @param obj \uD0A4\uB97C \uCD94\uCD9C\uD560 \uAC1D\uCCB4\n * @returns \uAC1D\uCCB4\uC758 \uD0A4 \uBC30\uC5F4\n */\nexport function objKeys<T extends object>(obj: T): (keyof T)[] {\n return Object.keys(obj) as (keyof T)[];\n}\n\n/**\n * Object.entries\uC758 \uD0C0\uC785 \uC548\uC804\uD55C \uBC84\uC804\n * @param obj \uC5D4\uD2B8\uB9AC\uB97C \uCD94\uCD9C\uD560 \uAC1D\uCCB4\n * @returns [\uD0A4, \uAC12] \uD29C\uD50C \uBC30\uC5F4\n */\nexport function objEntries<T extends object>(obj: T): ObjEntries<T> {\n return Object.entries(obj) as ObjEntries<T>;\n}\n\n/**\n * Object.fromEntries\uC758 \uD0C0\uC785 \uC548\uC804\uD55C \uBC84\uC804\n * @param entries [\uD0A4, \uAC12] \uD29C\uD50C \uBC30\uC5F4\n * @returns \uC0DD\uC131\uB41C \uAC1D\uCCB4\n */\nexport function objFromEntries<T extends [string, unknown]>(entries: T[]): { [K in T[0]]: T[1] } {\n return Object.fromEntries(entries) as { [K in T[0]]: T[1] };\n}\n\ntype ObjEntries<T> = { [K in keyof T]: [K, T[K]] }[keyof T][];\n\n/**\n * \uAC1D\uCCB4\uC758 \uAC01 \uC5D4\uD2B8\uB9AC\uB97C \uBCC0\uD658\uD558\uC5EC \uC0C8 \uAC1D\uCCB4 \uBC18\uD658\n * @param obj \uBCC0\uD658\uD560 \uAC1D\uCCB4\n * @param fn \uBCC0\uD658 \uD568\uC218 (key, value) => [newKey, newValue]\n * @returns \uBCC0\uD658\uB41C \uD0A4\uC640 \uAC12\uC744 \uAC00\uC9C4 \uC0C8 \uAC1D\uCCB4\n * @example\n * const colors = { primary: \"255, 0, 0\", secondary: \"0, 255, 0\" };\n *\n * // \uAC12\uB9CC \uBCC0\uD658\n * objMap(colors, (key, rgb) => [null, `rgb(${rgb})`]);\n * // { primary: \"rgb(255, 0, 0)\", secondary: \"rgb(0, 255, 0)\" }\n *\n * // \uD0A4\uC640 \uAC12 \uBAA8\uB450 \uBCC0\uD658\n * objMap(colors, (key, rgb) => [`${key}Light`, `rgb(${rgb})`]);\n * // { primaryLight: \"rgb(255, 0, 0)\", secondaryLight: \"rgb(0, 255, 0)\" }\n */\nexport function objMap<T extends object, NK extends string, NV>(\n obj: T,\n fn: (key: keyof T, value: T[keyof T]) => [NK | null, NV],\n): Record<NK | Extract<keyof T, string>, NV> {\n return objMapImpl(obj, fn);\n}\n\nfunction objMapImpl<T extends object, NK extends string, NV>(\n obj: T,\n fn: (key: keyof T, value: T[keyof T]) => [NK | null, NV],\n): Record<string, NV> {\n const result: Record<string, NV> = {};\n for (const key of Object.keys(obj)) {\n const [newKey, newValue] = fn(key as keyof T, (obj as Record<string, T[keyof T]>)[key]);\n result[newKey ?? key] = newValue;\n }\n return result;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["result"]
7
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 경로 유틸리티 함수
3
+ * Node.js path 모듈 대체용 (브라우저 환경 지원)
4
+ *
5
+ * @note 이 유틸리티는 POSIX 스타일 경로(슬래시 `/`)만 지원합니다.
6
+ * Windows 백슬래시(`\`) 경로는 지원하지 않습니다.
7
+ * 브라우저 환경 및 Capacitor 플러그인용으로 설계되었습니다.
8
+ */
9
+ /**
10
+ * 경로 조합 (path.join 대체)
11
+ * @note POSIX 스타일 경로만 지원 (슬래시 `/`)
12
+ */
13
+ export declare function pathJoin(...segments: string[]): string;
14
+ /**
15
+ * 파일명 추출 (path.basename 대체)
16
+ */
17
+ export declare function pathBasename(filePath: string, ext?: string): string;
18
+ /**
19
+ * 확장자 추출 (path.extname 대체)
20
+ * @note 숨김 파일(예: `.gitignore`)은 빈 문자열을 반환합니다 (Node.js path.extname과 동일)
21
+ */
22
+ export declare function pathExtname(filePath: string): string;
23
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIpD"}