@shirudo/ddd-kit 0.16.0 → 1.0.0-rc.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.
@@ -1,2 +1,242 @@
1
- var K=Object.defineProperty;var l=(t,o)=>K(t,"name",{value:o,configurable:true});function j(t,o){if(o.endsWith("Array]")||ArrayBuffer.isView(t)||o==="[object ArrayBuffer]"||o==="[object SharedArrayBuffer]")return true;let n=t.constructor;if(n&&typeof n=="function"){let y=n.name;if(y&&typeof globalThis<"u"&&y in globalThis&&globalThis[y]===n){let e=Object.getPrototypeOf(t);if(e!==Object.prototype&&e!==null)return true}}return new Set(["[object Date]","[object RegExp]","[object Map]","[object Set]","[object WeakMap]","[object WeakSet]","[object Promise]","[object Error]","[object Boolean]","[object Number]","[object String]"]).has(o)}l(j,"isBuiltInObject");var d=Object.prototype,O=d.toString,P=d.hasOwnProperty;function x(t,o){return m(t,o,new WeakMap)}l(x,"deepEqual");function m(t,o,n){if(t===o)return true;let i=typeof t,y=typeof o;if(i!=="object"||t===null||y!=="object"||o===null)return i==="number"&&y==="number"?Number.isNaN(t)&&Number.isNaN(o):false;let e=t,r=o,g=n.get(e);if(g!==void 0)return g===r;if(n.set(e,r),ArrayBuffer.isView(e)||ArrayBuffer.isView(r)){if(!ArrayBuffer.isView(e)||!ArrayBuffer.isView(r))return false;let a=O.call(e),c=O.call(r);if(a!==c)return false;if(a==="[object DataView]"){let p=e,h=r;if(p.byteLength!==h.byteLength)return false;let S=p.byteLength;for(let k=0;k<S;k++)if(p.getUint8(k)!==h.getUint8(k))return false;return true}let s=e,f=r,u=s.length;if(u!==f.length)return false;for(let p=0;p<u;p++)if(s[p]!==f[p])return false;return true}let b=O.call(e),w=O.call(r);if(b!==w)return false;switch(b){case "[object Array]":{let a=e,c=r,s=a.length;if(s!==c.length)return false;for(let f=0;f<s;f++)if(!m(a[f],c[f],n))return false;return true}case "[object Map]":{let a=e,c=r;if(a.size!==c.size)return false;for(let[s,f]of a){if(!c.has(s))return false;let u=c.get(s);if(!m(f,u,n))return false}return true}case "[object Set]":{let a=e,c=r;if(a.size!==c.size)return false;for(let s of a)if(!c.has(s))return false;return true}case "[object Date]":{let a=e.getTime(),c=r.getTime();return a===c}case "[object RegExp]":{let a=e,c=r;return a.source===c.source&&a.flags===c.flags}case "[object Boolean]":case "[object Number]":case "[object String]":return e.valueOf()===r.valueOf();default:{if(j(e,b)&&j(r,w))return e===r;let a=Object.keys(e),c=Object.keys(r),s=Object.getOwnPropertySymbols(e),f=Object.getOwnPropertySymbols(r);if(a.length!==c.length||s.length!==f.length)return false;for(let u of a)if(!P.call(r,u))return false;for(let u of s)if(!Object.getOwnPropertySymbols(r).includes(u))return false;for(let u of a)if(!m(e[u],r[u],n))return false;for(let u of s)if(!m(e[u],r[u],n))return false;return true}}}l(m,"deepEqualInner");function A(t,o){return B(t,o,[],new WeakMap)}l(A,"deepOmit");function B(t,o,n,i){if(t===null||typeof t!=="object")return t;let e=t,r=i.get(e);if(r!==void 0)return r;let g=Object.prototype.toString.call(e);if(g==="[object Array]"){let s=e,f=new Array(s.length);i.set(e,f);for(let u=0;u<s.length;u++)n.push(u),f[u]=B(s[u],o,n,i),n.pop();return f}if(j(e,g))return t;let b=Object.create(Object.getPrototypeOf(e));i.set(e,b);let w=Object.keys(e),a=Object.getOwnPropertySymbols(e),c=[...w,...a];for(let s of c)D(s,n,o)||(n.push(s),b[s]=B(e[s],o,n,i),n.pop());return b}l(B,"omitInternal");function D(t,o,n){return !!(n.ignoreKeys?.includes(t)||n.ignoreKeyPredicate?.(t,o))}l(D,"shouldIgnoreKey");function U(t,o,n){let i=A(t,n),y=A(o,n);return x(i,y)}l(U,"deepEqualExcept");export{x as deepEqual,U as deepEqualExcept,A as deepOmit,j as isBuiltInObject};//# sourceMappingURL=utils-array.js.map
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/utils/array/is-built-in.ts
5
+ function isBuiltInObject(obj, tag) {
6
+ if (tag.endsWith("Array]")) {
7
+ return true;
8
+ }
9
+ if (ArrayBuffer.isView(obj)) {
10
+ return true;
11
+ }
12
+ if (tag === "[object ArrayBuffer]" || tag === "[object SharedArrayBuffer]") {
13
+ return true;
14
+ }
15
+ const objConstructor = obj.constructor;
16
+ if (objConstructor && typeof objConstructor === "function") {
17
+ const constructorName = objConstructor.name;
18
+ if (constructorName && typeof globalThis !== "undefined" && constructorName in globalThis && globalThis[constructorName] === objConstructor) {
19
+ const proto = Object.getPrototypeOf(obj);
20
+ if (proto !== Object.prototype && proto !== null) {
21
+ return true;
22
+ }
23
+ }
24
+ }
25
+ const knownBuiltInTags = /* @__PURE__ */ new Set([
26
+ "[object Date]",
27
+ "[object RegExp]",
28
+ "[object Map]",
29
+ "[object Set]",
30
+ "[object WeakMap]",
31
+ "[object WeakSet]",
32
+ "[object Promise]",
33
+ "[object Error]",
34
+ "[object Boolean]",
35
+ "[object Number]",
36
+ "[object String]"
37
+ ]);
38
+ return knownBuiltInTags.has(tag);
39
+ }
40
+ __name(isBuiltInObject, "isBuiltInObject");
41
+
42
+ // src/utils/array/deep-equal.ts
43
+ var objProto = Object.prototype;
44
+ var objToString = objProto.toString;
45
+ var objHasOwn = objProto.hasOwnProperty;
46
+ function deepEqual(a, b) {
47
+ return deepEqualInner(a, b, /* @__PURE__ */ new WeakMap());
48
+ }
49
+ __name(deepEqual, "deepEqual");
50
+ function deepEqualInner(a, b, visited) {
51
+ if (a === b) return true;
52
+ const typeA = typeof a;
53
+ const typeB = typeof b;
54
+ if (typeA !== "object" || a === null || typeB !== "object" || b === null) {
55
+ if (typeA === "number" && typeB === "number") {
56
+ return Number.isNaN(a) && Number.isNaN(b);
57
+ }
58
+ return false;
59
+ }
60
+ const objA = a;
61
+ const objB = b;
62
+ const cached = visited.get(objA);
63
+ if (cached !== void 0) {
64
+ return cached === objB;
65
+ }
66
+ visited.set(objA, objB);
67
+ if (ArrayBuffer.isView(objA) || ArrayBuffer.isView(objB)) {
68
+ if (!ArrayBuffer.isView(objA) || !ArrayBuffer.isView(objB)) return false;
69
+ const tagA2 = objToString.call(objA);
70
+ const tagB2 = objToString.call(objB);
71
+ if (tagA2 !== tagB2) return false;
72
+ if (tagA2 === "[object DataView]") {
73
+ const viewA = objA;
74
+ const viewB = objB;
75
+ if (viewA.byteLength !== viewB.byteLength) return false;
76
+ const len2 = viewA.byteLength;
77
+ for (let i = 0; i < len2; i++) {
78
+ if (viewA.getUint8(i) !== viewB.getUint8(i)) return false;
79
+ }
80
+ return true;
81
+ }
82
+ const arrA = objA;
83
+ const arrB = objB;
84
+ const len = arrA.length;
85
+ if (len !== arrB.length) return false;
86
+ for (let i = 0; i < len; i++) {
87
+ if (arrA[i] !== arrB[i]) return false;
88
+ }
89
+ return true;
90
+ }
91
+ const tagA = objToString.call(objA);
92
+ const tagB = objToString.call(objB);
93
+ if (tagA !== tagB) return false;
94
+ switch (tagA) {
95
+ case "[object Array]": {
96
+ const arrA = objA;
97
+ const arrB = objB;
98
+ const len = arrA.length;
99
+ if (len !== arrB.length) return false;
100
+ for (let i = 0; i < len; i++) {
101
+ if (!deepEqualInner(arrA[i], arrB[i], visited)) return false;
102
+ }
103
+ return true;
104
+ }
105
+ case "[object Map]": {
106
+ const mapA = objA;
107
+ const mapB = objB;
108
+ if (mapA.size !== mapB.size) return false;
109
+ for (const [key, valA] of mapA) {
110
+ if (!mapB.has(key)) return false;
111
+ const valB = mapB.get(key);
112
+ if (!deepEqualInner(valA, valB, visited)) return false;
113
+ }
114
+ return true;
115
+ }
116
+ case "[object Set]": {
117
+ const setA = objA;
118
+ const setB = objB;
119
+ if (setA.size !== setB.size) return false;
120
+ for (const value of setA) {
121
+ if (!setB.has(value)) return false;
122
+ }
123
+ return true;
124
+ }
125
+ case "[object Date]": {
126
+ const timeA = objA.getTime();
127
+ const timeB = objB.getTime();
128
+ return timeA === timeB;
129
+ }
130
+ case "[object RegExp]": {
131
+ const regA = objA;
132
+ const regB = objB;
133
+ return regA.source === regB.source && regA.flags === regB.flags;
134
+ }
135
+ case "[object Boolean]":
136
+ case "[object Number]":
137
+ case "[object String]": {
138
+ return objA.valueOf() === objB.valueOf();
139
+ }
140
+ default: {
141
+ if (isBuiltInObject(objA, tagA) && isBuiltInObject(objB, tagB)) {
142
+ return objA === objB;
143
+ }
144
+ const stringKeysA = Object.keys(objA);
145
+ const stringKeysB = Object.keys(objB);
146
+ const symbolKeysA = Object.getOwnPropertySymbols(objA);
147
+ const symbolKeysB = Object.getOwnPropertySymbols(objB);
148
+ if (stringKeysA.length !== stringKeysB.length) return false;
149
+ if (symbolKeysA.length !== symbolKeysB.length) return false;
150
+ for (const key of stringKeysA) {
151
+ if (!objHasOwn.call(objB, key)) return false;
152
+ }
153
+ for (const key of symbolKeysA) {
154
+ if (!Object.getOwnPropertySymbols(objB).includes(key)) return false;
155
+ }
156
+ for (const key of stringKeysA) {
157
+ if (!deepEqualInner(objA[key], objB[key], visited)) {
158
+ return false;
159
+ }
160
+ }
161
+ for (const key of symbolKeysA) {
162
+ if (!deepEqualInner(objA[key], objB[key], visited)) {
163
+ return false;
164
+ }
165
+ }
166
+ return true;
167
+ }
168
+ }
169
+ }
170
+ __name(deepEqualInner, "deepEqualInner");
171
+
172
+ // src/utils/array/deep-omit.ts
173
+ function deepOmit(value, options) {
174
+ const visited = /* @__PURE__ */ new WeakMap();
175
+ return omitInternal(value, options, [], visited);
176
+ }
177
+ __name(deepOmit, "deepOmit");
178
+ function omitInternal(value, options, path, visited) {
179
+ if (value === null) return value;
180
+ const type = typeof value;
181
+ if (type !== "object") return value;
182
+ const obj = value;
183
+ const cached = visited.get(obj);
184
+ if (cached !== void 0) {
185
+ return cached;
186
+ }
187
+ const tag = Object.prototype.toString.call(obj);
188
+ if (tag === "[object Array]") {
189
+ const arr = obj;
190
+ const clone2 = new Array(arr.length);
191
+ visited.set(obj, clone2);
192
+ for (let i = 0; i < arr.length; i++) {
193
+ path.push(i);
194
+ clone2[i] = omitInternal(arr[i], options, path, visited);
195
+ path.pop();
196
+ }
197
+ return clone2;
198
+ }
199
+ if (isBuiltInObject(obj, tag)) {
200
+ return value;
201
+ }
202
+ const clone = Object.create(Object.getPrototypeOf(obj));
203
+ visited.set(obj, clone);
204
+ const stringKeys = Object.keys(obj);
205
+ const symbolKeys = Object.getOwnPropertySymbols(obj);
206
+ const keys = [...stringKeys, ...symbolKeys];
207
+ for (const key of keys) {
208
+ if (shouldIgnoreKey(key, path, options)) continue;
209
+ path.push(key);
210
+ clone[key] = omitInternal(
211
+ obj[key],
212
+ options,
213
+ path,
214
+ visited
215
+ );
216
+ path.pop();
217
+ }
218
+ return clone;
219
+ }
220
+ __name(omitInternal, "omitInternal");
221
+ function shouldIgnoreKey(key, path, options) {
222
+ if (options.ignoreKeys?.includes(key)) {
223
+ return true;
224
+ }
225
+ if (options.ignoreKeyPredicate?.(key, path)) {
226
+ return true;
227
+ }
228
+ return false;
229
+ }
230
+ __name(shouldIgnoreKey, "shouldIgnoreKey");
231
+
232
+ // src/utils/array/deep-equal-except.ts
233
+ function deepEqualExcept(a, b, options) {
234
+ const prunedA = deepOmit(a, options);
235
+ const prunedB = deepOmit(b, options);
236
+ return deepEqual(prunedA, prunedB);
237
+ }
238
+ __name(deepEqualExcept, "deepEqualExcept");
239
+
240
+ export { deepEqual, deepEqualExcept, deepOmit, isBuiltInObject };
241
+ //# sourceMappingURL=utils-array.js.map
2
242
  //# sourceMappingURL=utils-array.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/array/is-built-in.ts","../src/utils/array/deep-equal.ts","../src/utils/array/deep-omit.ts","../src/utils/array/deep-equal-except.ts"],"names":["isBuiltInObject","obj","tag","objConstructor","constructorName","proto","__name","objProto","objToString","objHasOwn","deepEqual","a","b","deepEqualInner","visited","typeA","typeB","objA","objB","cached","tagA","tagB","viewA","viewB","len","i","arrA","arrB","mapA","mapB","key","valA","valB","setA","setB","value","timeA","timeB","regA","regB","stringKeysA","stringKeysB","symbolKeysA","symbolKeysB","deepOmit","options","omitInternal","path","arr","clone","stringKeys","symbolKeys","keys","shouldIgnoreKey","deepEqualExcept","prunedA","prunedB"],"mappings":"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","file":"utils-array.js","sourcesContent":["/**\n * Checks if an object is a built-in JavaScript type that should be treated atomically.\n * This function automatically detects built-ins without requiring manual maintenance.\n *\n * Detection strategy:\n * 1. TypedArrays: Check if tag ends with \"Array]\" (covers all current and future TypedArrays)\n * 2. ArrayBuffer views: Use ArrayBuffer.isView() (covers DataView and all TypedArrays)\n * 3. Built-in constructors: Check if constructor exists in global scope and matches known patterns\n * 4. Tag-based: Fallback to tag matching for known built-ins\n *\n * @param obj - The object to check\n * @param tag - The result of `Object.prototype.toString.call(obj)`\n * @returns `true` if the object is a built-in type, `false` otherwise\n */\nexport function isBuiltInObject(obj: object, tag: string): boolean {\n\t// 1. TypedArrays: all end with \"Array]\" - future-proof for new TypedArrays\n\tif (tag.endsWith(\"Array]\")) {\n\t\treturn true;\n\t}\n\n\t// 2. ArrayBuffer views: covers DataView and all TypedArrays (future-proof)\n\tif (ArrayBuffer.isView(obj)) {\n\t\treturn true;\n\t}\n\n\t// 3. ArrayBuffer and SharedArrayBuffer\n\tif (tag === \"[object ArrayBuffer]\" || tag === \"[object SharedArrayBuffer]\") {\n\t\treturn true;\n\t}\n\n\t// 4. Check if constructor exists in global scope (future-proof for new globals)\n\tconst objConstructor = (obj as { constructor?: unknown }).constructor;\n\tif (objConstructor && typeof objConstructor === \"function\") {\n\t\tconst constructorName = objConstructor.name;\n\t\t// Check if it's a known global constructor\n\t\t// This covers: Date, RegExp, Map, Set, WeakMap, WeakSet, Promise, Error, etc.\n\t\tif (\n\t\t\tconstructorName &&\n\t\t\ttypeof globalThis !== \"undefined\" &&\n\t\t\tconstructorName in globalThis &&\n\t\t\t(globalThis as Record<string, unknown>)[constructorName] === objConstructor\n\t\t) {\n\t\t\t// Additional check: ensure it's not a user-defined class with same name\n\t\t\t// Built-ins typically have non-enumerable properties and specific prototypes\n\t\t\tconst proto = Object.getPrototypeOf(obj);\n\t\t\tif (proto !== Object.prototype && proto !== null) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// 5. Tag-based fallback for known built-ins (covers edge cases)\n\tconst knownBuiltInTags = new Set([\n\t\t\"[object Date]\",\n\t\t\"[object RegExp]\",\n\t\t\"[object Map]\",\n\t\t\"[object Set]\",\n\t\t\"[object WeakMap]\",\n\t\t\"[object WeakSet]\",\n\t\t\"[object Promise]\",\n\t\t\"[object Error]\",\n\t\t\"[object Boolean]\",\n\t\t\"[object Number]\",\n\t\t\"[object String]\",\n\t]);\n\n\treturn knownBuiltInTags.has(tag);\n}\n\n","import { isBuiltInObject } from \"./is-built-in\";\n\nconst objProto = Object.prototype;\nconst objToString = objProto.toString;\nconst objHasOwn = objProto.hasOwnProperty;\n\n/**\n * Performs a deep equality check between two values.\n *\n * This function compares values recursively, handling:\n * - Primitives (with special handling for NaN)\n * - Arrays (nested arrays supported)\n * - Objects (plain objects and class instances)\n * - TypedArrays (Uint8Array, Int32Array, etc.)\n * - DataView\n * - Maps and Sets\n * - Dates and RegExp\n * - Wrapper objects (Boolean, Number, String)\n * - Circular references (detected and handled)\n *\n * @param a - The first value to compare\n * @param b - The second value to compare\n * @returns `true` if the values are deeply equal, `false` otherwise\n *\n * @example\n * ```ts\n * deepEqual([1, 2, 3], [1, 2, 3]); // true\n * deepEqual({ a: 1, b: [2, 3] }, { a: 1, b: [2, 3] }); // true\n * deepEqual(NaN, NaN); // true\n * deepEqual([1, 2], [1, 2, 3]); // false\n * ```\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n\treturn deepEqualInner(a, b, new WeakMap<object, object>());\n}\n\n/**\n * Internal recursive function for deep equality comparison.\n * Tracks visited objects to detect and handle circular references.\n *\n * @param a - The first value to compare\n * @param b - The second value to compare\n * @param visited - WeakMap to track visited object pairs and detect cycles\n * @returns `true` if the values are deeply equal, `false` otherwise\n * @internal\n */\nfunction deepEqualInner(\n\ta: unknown,\n\tb: unknown,\n\tvisited: WeakMap<object, object>\n): boolean {\n\t// 1. Fast path: reference equality\n\tif (a === b) return true;\n\n\tconst typeA = typeof a;\n\tconst typeB = typeof b;\n\n\t// 2. If one is not an object → primitive / function\n\tif (typeA !== \"object\" || a === null || typeB !== \"object\" || b === null) {\n\t\t// Special case: NaN should be equal\n\t\tif (typeA === \"number\" && typeB === \"number\") {\n\t\t\treturn Number.isNaN(a as number) && Number.isNaN(b as number);\n\t\t}\n\t\t// Everything else is directly unequal with !== (including functions)\n\t\treturn false;\n\t}\n\n\t// From here on: both are non-null objects\n\n\tconst objA = a as object;\n\tconst objB = b as object;\n\n\t// 3. Cycles: already seen pair?\n\tconst cached = visited.get(objA);\n\tif (cached !== undefined) {\n\t\t// If we already paired this A with a different B → unequal\n\t\treturn cached === objB;\n\t}\n\tvisited.set(objA, objB);\n\n\t// 4. Handle Typed Arrays / DataView first\n\tif (ArrayBuffer.isView(objA) || ArrayBuffer.isView(objB)) {\n\t\tif (!ArrayBuffer.isView(objA) || !ArrayBuffer.isView(objB)) return false;\n\n\t\tconst tagA = objToString.call(objA);\n\t\tconst tagB = objToString.call(objB);\n\t\tif (tagA !== tagB) return false;\n\n\t\t// DataView: compare byte by byte\n\t\tif (tagA === \"[object DataView]\") {\n\t\t\tconst viewA = objA as DataView;\n\t\t\tconst viewB = objB as DataView;\n\t\t\tif (viewA.byteLength !== viewB.byteLength) return false;\n\n\t\t\tconst len = viewA.byteLength;\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tif (viewA.getUint8(i) !== viewB.getUint8(i)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t// Typed Arrays: element by element\n\t\tconst arrA = objA as unknown as ArrayLike<unknown>;\n\t\tconst arrB = objB as unknown as ArrayLike<unknown>;\n\n\t\tconst len = arrA.length;\n\t\tif (len !== arrB.length) return false;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tif ((arrA as any)[i] !== (arrB as any)[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// 5. Tag-based type detection (robust across realms)\n\tconst tagA = objToString.call(objA);\n\tconst tagB = objToString.call(objB);\n\tif (tagA !== tagB) return false;\n\n\tswitch (tagA) {\n\t\tcase \"[object Array]\": {\n\t\t\tconst arrA = objA as unknown[];\n\t\t\tconst arrB = objB as unknown[];\n\t\t\tconst len = arrA.length;\n\t\t\tif (len !== arrB.length) return false;\n\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tif (!deepEqualInner(arrA[i], arrB[i], visited)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Map]\": {\n\t\t\tconst mapA = objA as Map<unknown, unknown>;\n\t\t\tconst mapB = objB as Map<unknown, unknown>;\n\n\t\t\tif (mapA.size !== mapB.size) return false;\n\n\t\t\tfor (const [key, valA] of mapA) {\n\t\t\t\t// Map keys according to JS semantics: reference / SameValueZero\n\t\t\t\tif (!mapB.has(key)) return false;\n\t\t\t\tconst valB = mapB.get(key);\n\t\t\t\tif (!deepEqualInner(valA, valB, visited)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Set]\": {\n\t\t\tconst setA = objA as Set<unknown>;\n\t\t\tconst setB = objB as Set<unknown>;\n\n\t\t\tif (setA.size !== setB.size) return false;\n\n\t\t\t// Set elements: same reference (JS semantics)\n\t\t\tfor (const value of setA) {\n\t\t\t\tif (!setB.has(value)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Date]\": {\n\t\t\tconst timeA = (objA as Date).getTime();\n\t\t\tconst timeB = (objB as Date).getTime();\n\t\t\treturn timeA === timeB;\n\t\t}\n\n\t\tcase \"[object RegExp]\": {\n\t\t\tconst regA = objA as RegExp;\n\t\t\tconst regB = objB as RegExp;\n\t\t\treturn regA.source === regB.source && regA.flags === regB.flags;\n\t\t}\n\n\t\tcase \"[object Boolean]\":\n\t\tcase \"[object Number]\":\n\t\tcase \"[object String]\": {\n\t\t\t// Wrapper objects (new Boolean/Number/String)\n\t\t\treturn (objA as any).valueOf() === (objB as any).valueOf();\n\t\t}\n\n\t\tdefault: {\n\t\t\t// 6. Check if this is an unhandled built-in type (future-proof)\n\t\t\t// If both are built-ins but not handled above, they should be compared by reference\n\t\t\t// (since we don't know their internal structure)\n\t\t\tif (isBuiltInObject(objA, tagA) && isBuiltInObject(objB, tagB)) {\n\t\t\t\t// Unhandled built-in types: compare by reference as fallback\n\t\t\t\t// This ensures new built-ins don't fall through to plain object comparison\n\t\t\t\treturn objA === objB;\n\t\t\t}\n\n\t\t\t// 7. Fallback: plain / custom objects → compare own enumerable keys + values\n\t\t\tconst stringKeysA = Object.keys(objA as any);\n\t\t\tconst stringKeysB = Object.keys(objB as any);\n\t\t\tconst symbolKeysA = Object.getOwnPropertySymbols(objA as any);\n\t\t\tconst symbolKeysB = Object.getOwnPropertySymbols(objB as any);\n\n\t\t\t// Compare string keys count\n\t\t\tif (stringKeysA.length !== stringKeysB.length) return false;\n\t\t\t// Compare symbol keys count\n\t\t\tif (symbolKeysA.length !== symbolKeysB.length) return false;\n\n\t\t\t// Check all string keys exist in both objects\n\t\t\tfor (const key of stringKeysA) {\n\t\t\t\tif (!objHasOwn.call(objB, key)) return false;\n\t\t\t}\n\n\t\t\t// Check all symbol keys exist in both objects\n\t\t\tfor (const key of symbolKeysA) {\n\t\t\t\tif (!Object.getOwnPropertySymbols(objB as any).includes(key)) return false;\n\t\t\t}\n\n\t\t\t// Compare string key values\n\t\t\tfor (const key of stringKeysA) {\n\t\t\t\tif (!deepEqualInner((objA as any)[key], (objB as any)[key], visited)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Compare symbol key values\n\t\t\tfor (const key of symbolKeysA) {\n\t\t\t\tif (!deepEqualInner((objA as any)[key], (objB as any)[key], visited)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n}\n","import { isBuiltInObject } from \"./is-built-in\";\n\nexport type Key = string | symbol;\nexport type PathSegment = string | number | symbol;\n\nexport interface DeepOmitOptions {\n\t/**\n\t * Keys to ignore everywhere in the object tree.\n\t * Only applies to object properties, not Map/Set/TypedArray contents.\n\t */\n\treadonly ignoreKeys?: readonly Key[];\n\n\t/**\n\t * Fine-grained control: Key + path (without current key).\n\t * Example path: [\"user\", \"meta\", 0, \"data\"]\n\t */\n\treadonly ignoreKeyPredicate?: (\n\t\tkey: Key,\n\t\tpath: readonly PathSegment[],\n\t) => boolean;\n}\n\n/**\n * Creates a deep copy of `value` with certain keys removed according to the provided rules.\n *\n * This function recursively traverses the object tree and removes keys that match\n * the criteria specified in `options`. Built-in types (Date, Map, Set, TypedArrays, etc.)\n * are treated atomically and not modified.\n *\n * @param value - The value to create a deep copy from\n * @param options - Options specifying which keys to ignore\n * @returns A deep copy of `value` with specified keys removed\n *\n * @example\n * ```ts\n * const obj = { a: 1, b: { c: 2, d: 3 } };\n * const result = deepOmit(obj, { ignoreKeys: ['d'] });\n * // result: { a: 1, b: { c: 2 } }\n * ```\n */\nexport function deepOmit<T>(value: T, options: DeepOmitOptions): T {\n\tconst visited = new WeakMap<object, unknown>();\n\treturn omitInternal(value, options, [], visited) as T;\n}\n\nfunction omitInternal(\n\tvalue: unknown,\n\toptions: DeepOmitOptions,\n\tpath: PathSegment[],\n\tvisited: WeakMap<object, unknown>,\n): unknown {\n\tif (value === null) return value;\n\tconst type = typeof value;\n\n\t// Primitives and functions are passed through unchanged\n\tif (type !== \"object\") return value;\n\n\tconst obj = value as object;\n\n\t// Cycles: return cached value if already visited\n\tconst cached = visited.get(obj);\n\tif (cached !== undefined) {\n\t\treturn cached;\n\t}\n\n\tconst tag = Object.prototype.toString.call(obj);\n\n\t// Arrays: recursively process elements\n\tif (tag === \"[object Array]\") {\n\t\tconst arr = obj as unknown[];\n\t\tconst clone: unknown[] = new Array(arr.length);\n\t\tvisited.set(obj, clone);\n\n\t\tfor (let i = 0; i < arr.length; i++) {\n\t\t\tpath.push(i);\n\t\t\tclone[i] = omitInternal(arr[i], options, path, visited);\n\t\t\tpath.pop();\n\t\t}\n\t\treturn clone;\n\t}\n\n\t// Built-ins: treat atomically, no key filtering inside\n\t// Future-proof detection: check if object is a built-in type\n\tif (isBuiltInObject(obj, tag)) {\n\t\treturn value;\n\t}\n\n\t// Plain / Custom Objects: filter keys, recursively process values\n\tconst clone = Object.create(Object.getPrototypeOf(obj));\n\tvisited.set(obj, clone);\n\n\tconst stringKeys = Object.keys(obj);\n\tconst symbolKeys = Object.getOwnPropertySymbols(obj);\n\tconst keys: Key[] = [...stringKeys, ...symbolKeys];\n\n\tfor (const key of keys) {\n\t\tif (shouldIgnoreKey(key, path, options)) continue;\n\n\t\tpath.push(key);\n\t\t(clone as Record<PropertyKey, unknown>)[key] = omitInternal(\n\t\t\t(obj as Record<PropertyKey, unknown>)[key],\n\t\t\toptions,\n\t\t\tpath,\n\t\t\tvisited,\n\t\t);\n\t\tpath.pop();\n\t}\n\n\treturn clone;\n}\n\nfunction shouldIgnoreKey(\n\tkey: Key,\n\tpath: readonly PathSegment[],\n\toptions: DeepOmitOptions,\n): boolean {\n\tif (options.ignoreKeys?.includes(key)) {\n\t\treturn true;\n\t}\n\tif (options.ignoreKeyPredicate?.(key, path)) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n","import { deepEqual } from \"./deep-equal\";\nimport { type DeepOmitOptions, deepOmit } from \"./deep-omit\";\n\nexport type DeepEqualExceptOptions = DeepOmitOptions;\n\n/**\n * Performs a deep equality comparison between two values after omitting specified keys.\n * \n * This function first removes the specified keys from both values using `deepOmit`,\n * then performs a deep equality check using `deepEqual`.\n * \n * @param a - The first value to compare\n * @param b - The second value to compare\n * @param options - Options specifying which keys to omit before comparison\n * @returns `true` if the values are deeply equal after omitting specified keys, `false` otherwise\n * \n * @example\n * ```ts\n * const obj1 = { id: 1, name: \"Alice\", updatedAt: \"2024-01-01\" };\n * const obj2 = { id: 2, name: \"Alice\", updatedAt: \"2024-01-02\" };\n * \n * deepEqualExcept(obj1, obj2, { ignoreKeys: [\"id\", \"updatedAt\"] }); // true\n * ```\n */\nexport function deepEqualExcept(\n\ta: unknown,\n\tb: unknown,\n\toptions: DeepEqualExceptOptions,\n): boolean {\n\tconst prunedA = deepOmit(a, options);\n\tconst prunedB = deepOmit(b, options);\n\treturn deepEqual(prunedA, prunedB);\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/array/is-built-in.ts","../src/utils/array/deep-equal.ts","../src/utils/array/deep-omit.ts","../src/utils/array/deep-equal-except.ts"],"names":["tagA","tagB","len","clone"],"mappings":"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","file":"utils-array.js","sourcesContent":["/**\n * Checks if an object is a built-in JavaScript type that should be treated atomically.\n * This function automatically detects built-ins without requiring manual maintenance.\n *\n * Detection strategy:\n * 1. TypedArrays: Check if tag ends with \"Array]\" (covers all current and future TypedArrays)\n * 2. ArrayBuffer views: Use ArrayBuffer.isView() (covers DataView and all TypedArrays)\n * 3. Built-in constructors: Check if constructor exists in global scope and matches known patterns\n * 4. Tag-based: Fallback to tag matching for known built-ins\n *\n * @param obj - The object to check\n * @param tag - The result of `Object.prototype.toString.call(obj)`\n * @returns `true` if the object is a built-in type, `false` otherwise\n */\nexport function isBuiltInObject(obj: object, tag: string): boolean {\n\t// 1. TypedArrays: all end with \"Array]\" - future-proof for new TypedArrays\n\tif (tag.endsWith(\"Array]\")) {\n\t\treturn true;\n\t}\n\n\t// 2. ArrayBuffer views: covers DataView and all TypedArrays (future-proof)\n\tif (ArrayBuffer.isView(obj)) {\n\t\treturn true;\n\t}\n\n\t// 3. ArrayBuffer and SharedArrayBuffer\n\tif (tag === \"[object ArrayBuffer]\" || tag === \"[object SharedArrayBuffer]\") {\n\t\treturn true;\n\t}\n\n\t// 4. Check if constructor exists in global scope (future-proof for new globals)\n\tconst objConstructor = (obj as { constructor?: unknown }).constructor;\n\tif (objConstructor && typeof objConstructor === \"function\") {\n\t\tconst constructorName = objConstructor.name;\n\t\t// Check if it's a known global constructor\n\t\t// This covers: Date, RegExp, Map, Set, WeakMap, WeakSet, Promise, Error, etc.\n\t\tif (\n\t\t\tconstructorName &&\n\t\t\ttypeof globalThis !== \"undefined\" &&\n\t\t\tconstructorName in globalThis &&\n\t\t\t(globalThis as Record<string, unknown>)[constructorName] === objConstructor\n\t\t) {\n\t\t\t// Additional check: ensure it's not a user-defined class with same name\n\t\t\t// Built-ins typically have non-enumerable properties and specific prototypes\n\t\t\tconst proto = Object.getPrototypeOf(obj);\n\t\t\tif (proto !== Object.prototype && proto !== null) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// 5. Tag-based fallback for known built-ins (covers edge cases)\n\tconst knownBuiltInTags = new Set([\n\t\t\"[object Date]\",\n\t\t\"[object RegExp]\",\n\t\t\"[object Map]\",\n\t\t\"[object Set]\",\n\t\t\"[object WeakMap]\",\n\t\t\"[object WeakSet]\",\n\t\t\"[object Promise]\",\n\t\t\"[object Error]\",\n\t\t\"[object Boolean]\",\n\t\t\"[object Number]\",\n\t\t\"[object String]\",\n\t]);\n\n\treturn knownBuiltInTags.has(tag);\n}\n\n","import { isBuiltInObject } from \"./is-built-in\";\n\nconst objProto = Object.prototype;\nconst objToString = objProto.toString;\nconst objHasOwn = objProto.hasOwnProperty;\n\n/**\n * Performs a deep equality check between two values.\n *\n * This function compares values recursively, handling:\n * - Primitives (with special handling for NaN)\n * - Arrays (nested arrays supported)\n * - Objects (plain objects and class instances)\n * - TypedArrays (Uint8Array, Int32Array, etc.)\n * - DataView\n * - Maps and Sets\n * - Dates and RegExp\n * - Wrapper objects (Boolean, Number, String)\n * - Circular references (detected and handled)\n *\n * @param a - The first value to compare\n * @param b - The second value to compare\n * @returns `true` if the values are deeply equal, `false` otherwise\n *\n * @example\n * ```ts\n * deepEqual([1, 2, 3], [1, 2, 3]); // true\n * deepEqual({ a: 1, b: [2, 3] }, { a: 1, b: [2, 3] }); // true\n * deepEqual(NaN, NaN); // true\n * deepEqual([1, 2], [1, 2, 3]); // false\n * ```\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n\treturn deepEqualInner(a, b, new WeakMap<object, object>());\n}\n\n/**\n * Internal recursive function for deep equality comparison.\n * Tracks visited objects to detect and handle circular references.\n *\n * @param a - The first value to compare\n * @param b - The second value to compare\n * @param visited - WeakMap to track visited object pairs and detect cycles\n * @returns `true` if the values are deeply equal, `false` otherwise\n * @internal\n */\nfunction deepEqualInner(\n\ta: unknown,\n\tb: unknown,\n\tvisited: WeakMap<object, object>\n): boolean {\n\t// 1. Fast path: reference equality\n\tif (a === b) return true;\n\n\tconst typeA = typeof a;\n\tconst typeB = typeof b;\n\n\t// 2. If one is not an object → primitive / function\n\tif (typeA !== \"object\" || a === null || typeB !== \"object\" || b === null) {\n\t\t// Special case: NaN should be equal\n\t\tif (typeA === \"number\" && typeB === \"number\") {\n\t\t\treturn Number.isNaN(a as number) && Number.isNaN(b as number);\n\t\t}\n\t\t// Everything else is directly unequal with !== (including functions)\n\t\treturn false;\n\t}\n\n\t// From here on: both are non-null objects\n\n\tconst objA = a as object;\n\tconst objB = b as object;\n\n\t// 3. Cycles: already seen pair?\n\tconst cached = visited.get(objA);\n\tif (cached !== undefined) {\n\t\t// If we already paired this A with a different B → unequal\n\t\treturn cached === objB;\n\t}\n\tvisited.set(objA, objB);\n\n\t// 4. Handle Typed Arrays / DataView first\n\tif (ArrayBuffer.isView(objA) || ArrayBuffer.isView(objB)) {\n\t\tif (!ArrayBuffer.isView(objA) || !ArrayBuffer.isView(objB)) return false;\n\n\t\tconst tagA = objToString.call(objA);\n\t\tconst tagB = objToString.call(objB);\n\t\tif (tagA !== tagB) return false;\n\n\t\t// DataView: compare byte by byte\n\t\tif (tagA === \"[object DataView]\") {\n\t\t\tconst viewA = objA as DataView;\n\t\t\tconst viewB = objB as DataView;\n\t\t\tif (viewA.byteLength !== viewB.byteLength) return false;\n\n\t\t\tconst len = viewA.byteLength;\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tif (viewA.getUint8(i) !== viewB.getUint8(i)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t// Typed Arrays: element by element\n\t\tconst arrA = objA as unknown as ArrayLike<unknown>;\n\t\tconst arrB = objB as unknown as ArrayLike<unknown>;\n\n\t\tconst len = arrA.length;\n\t\tif (len !== arrB.length) return false;\n\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tif ((arrA as any)[i] !== (arrB as any)[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// 5. Tag-based type detection (robust across realms)\n\tconst tagA = objToString.call(objA);\n\tconst tagB = objToString.call(objB);\n\tif (tagA !== tagB) return false;\n\n\tswitch (tagA) {\n\t\tcase \"[object Array]\": {\n\t\t\tconst arrA = objA as unknown[];\n\t\t\tconst arrB = objB as unknown[];\n\t\t\tconst len = arrA.length;\n\t\t\tif (len !== arrB.length) return false;\n\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tif (!deepEqualInner(arrA[i], arrB[i], visited)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Map]\": {\n\t\t\tconst mapA = objA as Map<unknown, unknown>;\n\t\t\tconst mapB = objB as Map<unknown, unknown>;\n\n\t\t\tif (mapA.size !== mapB.size) return false;\n\n\t\t\tfor (const [key, valA] of mapA) {\n\t\t\t\t// Map keys according to JS semantics: reference / SameValueZero\n\t\t\t\tif (!mapB.has(key)) return false;\n\t\t\t\tconst valB = mapB.get(key);\n\t\t\t\tif (!deepEqualInner(valA, valB, visited)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Set]\": {\n\t\t\tconst setA = objA as Set<unknown>;\n\t\t\tconst setB = objB as Set<unknown>;\n\n\t\t\tif (setA.size !== setB.size) return false;\n\n\t\t\t// Set elements: same reference (JS semantics)\n\t\t\tfor (const value of setA) {\n\t\t\t\tif (!setB.has(value)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"[object Date]\": {\n\t\t\tconst timeA = (objA as Date).getTime();\n\t\t\tconst timeB = (objB as Date).getTime();\n\t\t\treturn timeA === timeB;\n\t\t}\n\n\t\tcase \"[object RegExp]\": {\n\t\t\tconst regA = objA as RegExp;\n\t\t\tconst regB = objB as RegExp;\n\t\t\treturn regA.source === regB.source && regA.flags === regB.flags;\n\t\t}\n\n\t\tcase \"[object Boolean]\":\n\t\tcase \"[object Number]\":\n\t\tcase \"[object String]\": {\n\t\t\t// Wrapper objects (new Boolean/Number/String)\n\t\t\treturn (objA as any).valueOf() === (objB as any).valueOf();\n\t\t}\n\n\t\tdefault: {\n\t\t\t// 6. Check if this is an unhandled built-in type (future-proof)\n\t\t\t// If both are built-ins but not handled above, they should be compared by reference\n\t\t\t// (since we don't know their internal structure)\n\t\t\tif (isBuiltInObject(objA, tagA) && isBuiltInObject(objB, tagB)) {\n\t\t\t\t// Unhandled built-in types: compare by reference as fallback\n\t\t\t\t// This ensures new built-ins don't fall through to plain object comparison\n\t\t\t\treturn objA === objB;\n\t\t\t}\n\n\t\t\t// 7. Fallback: plain / custom objects → compare own enumerable keys + values\n\t\t\tconst stringKeysA = Object.keys(objA as any);\n\t\t\tconst stringKeysB = Object.keys(objB as any);\n\t\t\tconst symbolKeysA = Object.getOwnPropertySymbols(objA as any);\n\t\t\tconst symbolKeysB = Object.getOwnPropertySymbols(objB as any);\n\n\t\t\t// Compare string keys count\n\t\t\tif (stringKeysA.length !== stringKeysB.length) return false;\n\t\t\t// Compare symbol keys count\n\t\t\tif (symbolKeysA.length !== symbolKeysB.length) return false;\n\n\t\t\t// Check all string keys exist in both objects\n\t\t\tfor (const key of stringKeysA) {\n\t\t\t\tif (!objHasOwn.call(objB, key)) return false;\n\t\t\t}\n\n\t\t\t// Check all symbol keys exist in both objects\n\t\t\tfor (const key of symbolKeysA) {\n\t\t\t\tif (!Object.getOwnPropertySymbols(objB as any).includes(key)) return false;\n\t\t\t}\n\n\t\t\t// Compare string key values\n\t\t\tfor (const key of stringKeysA) {\n\t\t\t\tif (!deepEqualInner((objA as any)[key], (objB as any)[key], visited)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Compare symbol key values\n\t\t\tfor (const key of symbolKeysA) {\n\t\t\t\tif (!deepEqualInner((objA as any)[key], (objB as any)[key], visited)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n}\n","import { isBuiltInObject } from \"./is-built-in\";\n\nexport type Key = string | symbol;\nexport type PathSegment = string | number | symbol;\n\nexport interface DeepOmitOptions {\n\t/**\n\t * Keys to ignore everywhere in the object tree.\n\t * Only applies to object properties, not Map/Set/TypedArray contents.\n\t */\n\treadonly ignoreKeys?: readonly Key[];\n\n\t/**\n\t * Fine-grained control: Key + path (without current key).\n\t * Example path: [\"user\", \"meta\", 0, \"data\"]\n\t */\n\treadonly ignoreKeyPredicate?: (\n\t\tkey: Key,\n\t\tpath: readonly PathSegment[],\n\t) => boolean;\n}\n\n/**\n * Creates a deep copy of `value` with certain keys removed according to the provided rules.\n *\n * This function recursively traverses the object tree and removes keys that match\n * the criteria specified in `options`. Built-in types (Date, Map, Set, TypedArrays, etc.)\n * are treated atomically and not modified.\n *\n * @param value - The value to create a deep copy from\n * @param options - Options specifying which keys to ignore\n * @returns A deep copy of `value` with specified keys removed\n *\n * @example\n * ```ts\n * const obj = { a: 1, b: { c: 2, d: 3 } };\n * const result = deepOmit(obj, { ignoreKeys: ['d'] });\n * // result: { a: 1, b: { c: 2 } }\n * ```\n */\nexport function deepOmit<T>(value: T, options: DeepOmitOptions): T {\n\tconst visited = new WeakMap<object, unknown>();\n\treturn omitInternal(value, options, [], visited) as T;\n}\n\nfunction omitInternal(\n\tvalue: unknown,\n\toptions: DeepOmitOptions,\n\tpath: PathSegment[],\n\tvisited: WeakMap<object, unknown>,\n): unknown {\n\tif (value === null) return value;\n\tconst type = typeof value;\n\n\t// Primitives and functions are passed through unchanged\n\tif (type !== \"object\") return value;\n\n\tconst obj = value as object;\n\n\t// Cycles: return cached value if already visited\n\tconst cached = visited.get(obj);\n\tif (cached !== undefined) {\n\t\treturn cached;\n\t}\n\n\tconst tag = Object.prototype.toString.call(obj);\n\n\t// Arrays: recursively process elements\n\tif (tag === \"[object Array]\") {\n\t\tconst arr = obj as unknown[];\n\t\tconst clone: unknown[] = new Array(arr.length);\n\t\tvisited.set(obj, clone);\n\n\t\tfor (let i = 0; i < arr.length; i++) {\n\t\t\tpath.push(i);\n\t\t\tclone[i] = omitInternal(arr[i], options, path, visited);\n\t\t\tpath.pop();\n\t\t}\n\t\treturn clone;\n\t}\n\n\t// Built-ins: treat atomically, no key filtering inside\n\t// Future-proof detection: check if object is a built-in type\n\tif (isBuiltInObject(obj, tag)) {\n\t\treturn value;\n\t}\n\n\t// Plain / Custom Objects: filter keys, recursively process values\n\tconst clone = Object.create(Object.getPrototypeOf(obj));\n\tvisited.set(obj, clone);\n\n\tconst stringKeys = Object.keys(obj);\n\tconst symbolKeys = Object.getOwnPropertySymbols(obj);\n\tconst keys: Key[] = [...stringKeys, ...symbolKeys];\n\n\tfor (const key of keys) {\n\t\tif (shouldIgnoreKey(key, path, options)) continue;\n\n\t\tpath.push(key);\n\t\t(clone as Record<PropertyKey, unknown>)[key] = omitInternal(\n\t\t\t(obj as Record<PropertyKey, unknown>)[key],\n\t\t\toptions,\n\t\t\tpath,\n\t\t\tvisited,\n\t\t);\n\t\tpath.pop();\n\t}\n\n\treturn clone;\n}\n\nfunction shouldIgnoreKey(\n\tkey: Key,\n\tpath: readonly PathSegment[],\n\toptions: DeepOmitOptions,\n): boolean {\n\tif (options.ignoreKeys?.includes(key)) {\n\t\treturn true;\n\t}\n\tif (options.ignoreKeyPredicate?.(key, path)) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n","import { deepEqual } from \"./deep-equal\";\nimport { type DeepOmitOptions, deepOmit } from \"./deep-omit\";\n\nexport type DeepEqualExceptOptions = DeepOmitOptions;\n\n/**\n * Performs a deep equality comparison between two values after omitting specified keys.\n * \n * This function first removes the specified keys from both values using `deepOmit`,\n * then performs a deep equality check using `deepEqual`.\n * \n * @param a - The first value to compare\n * @param b - The second value to compare\n * @param options - Options specifying which keys to omit before comparison\n * @returns `true` if the values are deeply equal after omitting specified keys, `false` otherwise\n * \n * @example\n * ```ts\n * const obj1 = { id: 1, name: \"Alice\", updatedAt: \"2024-01-01\" };\n * const obj2 = { id: 2, name: \"Alice\", updatedAt: \"2024-01-02\" };\n * \n * deepEqualExcept(obj1, obj2, { ignoreKeys: [\"id\", \"updatedAt\"] }); // true\n * ```\n */\nexport function deepEqualExcept(\n\ta: unknown,\n\tb: unknown,\n\toptions: DeepEqualExceptOptions,\n): boolean {\n\tconst prunedA = deepOmit(a, options);\n\tconst prunedB = deepOmit(b, options);\n\treturn deepEqual(prunedA, prunedB);\n}\n"]}
package/dist/utils.js CHANGED
@@ -1,2 +1,3 @@
1
+
1
2
  //# sourceMappingURL=utils.js.map
2
3
  //# sourceMappingURL=utils.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shirudo/ddd-kit",
3
- "version": "0.16.0",
3
+ "version": "1.0.0-rc.1",
4
4
  "description": "Composable TypeScript toolkit for tactical DDD",
5
5
  "type": "module",
6
6
  "repository": {