@voidhash/mimic-effect 1.0.0-beta.4 → 1.0.0-beta.5

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,5 +1,5 @@
1
1
 
2
- > @voidhash/mimic-effect@1.0.0-beta.4 build /home/runner/work/mimic/mimic/packages/mimic-effect
2
+ > @voidhash/mimic-effect@1.0.0-beta.5 build /home/runner/work/mimic/mimic/packages/mimic-effect
3
3
  > tsdown
4
4
 
5
5
  ℹ tsdown v0.18.2 powered by rolldown v1.0.0-beta.55
@@ -20,9 +20,9 @@
20
20
  ℹ [CJS] dist/Metrics.cjs  4.26 kB │ gzip: 1.04 kB
21
21
  ℹ [CJS] dist/MimicServerEngine.cjs  4.23 kB │ gzip: 1.34 kB
22
22
  ℹ [CJS] dist/Protocol.cjs  3.78 kB │ gzip: 1.14 kB
23
+ ℹ [CJS] dist/testing/assertions.cjs  3.74 kB │ gzip: 1.16 kB
23
24
  ℹ [CJS] dist/PresenceManager.cjs  3.72 kB │ gzip: 1.00 kB
24
25
  ℹ [CJS] dist/HotStorage.cjs  3.64 kB │ gzip: 1.21 kB
25
- ℹ [CJS] dist/testing/assertions.cjs  3.43 kB │ gzip: 1.04 kB
26
26
  ℹ [CJS] dist/MimicAuthService.cjs  2.27 kB │ gzip: 0.88 kB
27
27
  ℹ [CJS] dist/Errors.cjs  1.98 kB │ gzip: 0.61 kB
28
28
  ℹ [CJS] dist/ColdStorage.cjs  1.91 kB │ gzip: 0.77 kB
@@ -33,7 +33,7 @@
33
33
  ℹ [CJS] dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/toPropertyKey.cjs  0.37 kB │ gzip: 0.23 kB
34
34
  ℹ [CJS] dist/_virtual/rolldown_runtime.cjs  0.36 kB │ gzip: 0.25 kB
35
35
  ℹ [CJS] dist/testing/types.cjs  0.34 kB │ gzip: 0.23 kB
36
- ℹ [CJS] 25 files, total: 163.63 kB
36
+ ℹ [CJS] 25 files, total: 163.94 kB
37
37
  ℹ [CJS] dist/Protocol.d.cts.map 1.57 kB │ gzip: 0.70 kB
38
38
  ℹ [CJS] dist/Types.d.cts.map 1.41 kB │ gzip: 0.65 kB
39
39
  ℹ [CJS] dist/MimicServerEngine.d.cts.map 1.09 kB │ gzip: 0.50 kB
@@ -71,7 +71,7 @@
71
71
  ℹ [CJS] dist/MimicClusterServerEngine.d.cts 0.82 kB │ gzip: 0.33 kB
72
72
  ℹ [CJS] dist/MimicServer.d.cts 0.74 kB │ gzip: 0.31 kB
73
73
  ℹ [CJS] 36 files, total: 56.62 kB
74
- ✔ Build complete in 6416ms
74
+ ✔ Build complete in 6662ms
75
75
  ℹ [ESM] dist/index.mjs  1.38 kB │ gzip: 0.35 kB
76
76
  ℹ [ESM] dist/testing/index.mjs  0.60 kB │ gzip: 0.19 kB
77
77
  ℹ [ESM] dist/testing/HotStorageTestSuite.mjs.map 63.35 kB │ gzip: 8.67 kB
@@ -91,7 +91,7 @@
91
91
  ℹ [ESM] dist/MimicServer.mjs  9.63 kB │ gzip: 2.78 kB
92
92
  ℹ [ESM] dist/Protocol.mjs.map  9.18 kB │ gzip: 2.15 kB
93
93
  ℹ [ESM] dist/PresenceManager.mjs.map  9.11 kB │ gzip: 2.27 kB
94
- ℹ [ESM] dist/testing/assertions.mjs.map  6.69 kB │ gzip: 1.78 kB
94
+ ℹ [ESM] dist/testing/assertions.mjs.map  7.31 kB │ gzip: 2.01 kB
95
95
  ℹ [ESM] dist/testing/FailingStorage.mjs  6.49 kB │ gzip: 1.52 kB
96
96
  ℹ [ESM] dist/Metrics.mjs.map  6.13 kB │ gzip: 1.43 kB
97
97
  ℹ [ESM] dist/MimicAuthService.mjs.map  6.09 kB │ gzip: 1.85 kB
@@ -100,10 +100,10 @@
100
100
  ℹ [ESM] dist/Errors.mjs.map  4.00 kB │ gzip: 1.05 kB
101
101
  ℹ [ESM] dist/Metrics.mjs  3.63 kB │ gzip: 1.01 kB
102
102
  ℹ [ESM] dist/HotStorage.mjs  3.52 kB │ gzip: 1.22 kB
103
+ ℹ [ESM] dist/testing/assertions.mjs  3.46 kB │ gzip: 1.15 kB
103
104
  ℹ [ESM] dist/PresenceManager.mjs  3.39 kB │ gzip: 1.01 kB
104
105
  ℹ [ESM] dist/Protocol.mjs  3.35 kB │ gzip: 1.06 kB
105
106
  ℹ [ESM] dist/testing/types.mjs.map  3.22 kB │ gzip: 1.15 kB
106
- ℹ [ESM] dist/testing/assertions.mjs  3.14 kB │ gzip: 1.03 kB
107
107
  ℹ [ESM] dist/MimicAuthService.mjs  2.23 kB │ gzip: 0.88 kB
108
108
  ℹ [ESM] dist/ColdStorage.mjs  1.85 kB │ gzip: 0.79 kB
109
109
  ℹ [ESM] dist/Errors.mjs  1.73 kB │ gzip: 0.61 kB
@@ -150,5 +150,5 @@
150
150
  ℹ [ESM] dist/testing/StorageIntegrationTestSuite.d.mts  1.43 kB │ gzip: 0.57 kB
151
151
  ℹ [ESM] dist/MimicClusterServerEngine.d.mts  0.82 kB │ gzip: 0.33 kB
152
152
  ℹ [ESM] dist/MimicServer.d.mts  0.74 kB │ gzip: 0.31 kB
153
- ℹ [ESM] 78 files, total: 513.37 kB
154
- ✔ Build complete in 6441ms
153
+ ℹ [ESM] 78 files, total: 514.30 kB
154
+ ✔ Build complete in 6682ms
@@ -9,12 +9,15 @@ let effect = require("effect");
9
9
  */
10
10
  /**
11
11
  * Deep equality check that handles objects, arrays, and primitives.
12
+ * Skips function properties since reconstructed objects (like OperationPath)
13
+ * will have new function instances even when the underlying data is identical.
12
14
  */
13
15
  const isDeepEqual = (a, b) => {
14
16
  if (a === b) return true;
15
17
  if (a === null || b === null) return a === b;
16
18
  if (a === void 0 || b === void 0) return a === b;
17
19
  if (typeof a !== typeof b) return false;
20
+ if (typeof a === "function" && typeof b === "function") return true;
18
21
  if (typeof a === "number" && typeof b === "number") {
19
22
  if (Number.isNaN(a) && Number.isNaN(b)) return true;
20
23
  return a === b;
@@ -27,8 +30,8 @@ const isDeepEqual = (a, b) => {
27
30
  if (typeof a === "object" && typeof b === "object") {
28
31
  const aObj = a;
29
32
  const bObj = b;
30
- const aKeys = Object.keys(aObj);
31
- const bKeys = Object.keys(bObj);
33
+ const aKeys = Object.keys(aObj).filter((k) => typeof aObj[k] !== "function");
34
+ const bKeys = Object.keys(bObj).filter((k) => typeof bObj[k] !== "function");
32
35
  if (aKeys.length !== bKeys.length) return false;
33
36
  for (const key of aKeys) {
34
37
  if (!Object.prototype.hasOwnProperty.call(bObj, key)) return false;
@@ -9,12 +9,15 @@ import { Effect } from "effect";
9
9
  */
10
10
  /**
11
11
  * Deep equality check that handles objects, arrays, and primitives.
12
+ * Skips function properties since reconstructed objects (like OperationPath)
13
+ * will have new function instances even when the underlying data is identical.
12
14
  */
13
15
  const isDeepEqual = (a, b) => {
14
16
  if (a === b) return true;
15
17
  if (a === null || b === null) return a === b;
16
18
  if (a === void 0 || b === void 0) return a === b;
17
19
  if (typeof a !== typeof b) return false;
20
+ if (typeof a === "function" && typeof b === "function") return true;
18
21
  if (typeof a === "number" && typeof b === "number") {
19
22
  if (Number.isNaN(a) && Number.isNaN(b)) return true;
20
23
  return a === b;
@@ -27,8 +30,8 @@ const isDeepEqual = (a, b) => {
27
30
  if (typeof a === "object" && typeof b === "object") {
28
31
  const aObj = a;
29
32
  const bObj = b;
30
- const aKeys = Object.keys(aObj);
31
- const bKeys = Object.keys(bObj);
33
+ const aKeys = Object.keys(aObj).filter((k) => typeof aObj[k] !== "function");
34
+ const bKeys = Object.keys(bObj).filter((k) => typeof bObj[k] !== "function");
32
35
  if (aKeys.length !== bKeys.length) return false;
33
36
  for (const key of aKeys) {
34
37
  if (!Object.prototype.hasOwnProperty.call(bObj, key)) return false;
@@ -1 +1 @@
1
- {"version":3,"file":"assertions.mjs","names":[],"sources":["../../src/testing/assertions.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect/testing - Assertion Helpers\n *\n * Internal assertion helpers used by the test suites.\n */\nimport { Effect } from \"effect\";\nimport { TestError } from \"./types\";\n\n// =============================================================================\n// Deep Equality\n// =============================================================================\n\n/**\n * Deep equality check that handles objects, arrays, and primitives.\n */\nexport const isDeepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (a === null || b === null) return a === b;\n if (a === undefined || b === undefined) return a === b;\n\n if (typeof a !== typeof b) return false;\n\n if (typeof a === \"number\" && typeof b === \"number\") {\n if (Number.isNaN(a) && Number.isNaN(b)) return true;\n return a === b;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!isDeepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n if (typeof a === \"object\" && typeof b === \"object\") {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!Object.prototype.hasOwnProperty.call(bObj, key)) return false;\n if (!isDeepEqual(aObj[key], bObj[key])) return false;\n }\n\n return true;\n }\n\n return false;\n};\n\n// =============================================================================\n// Assertion Helpers\n// =============================================================================\n\n/**\n * Assert that two values are deeply equal.\n */\nexport const assertEqual = <T>(\n actual: T,\n expected: T,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (!isDeepEqual(actual, expected)) {\n yield* Effect.fail(new TestError({ message, expected, actual }));\n }\n });\n\n/**\n * Assert that a condition is true.\n */\nexport const assertTrue = (\n condition: boolean,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (!condition) {\n yield* Effect.fail(new TestError({ message }));\n }\n });\n\n/**\n * Assert that a condition is false.\n */\nexport const assertFalse = (\n condition: boolean,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (condition) {\n yield* Effect.fail(new TestError({ message }));\n }\n });\n\n/**\n * Assert that a value is undefined.\n */\nexport const assertUndefined = (\n value: unknown,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (value !== undefined) {\n yield* Effect.fail(\n new TestError({ message, expected: undefined, actual: value })\n );\n }\n });\n\n/**\n * Assert that a value is defined (not undefined).\n */\nexport const assertDefined = <T>(\n value: T | undefined,\n message: string\n): Effect.Effect<T, TestError> =>\n Effect.gen(function* () {\n if (value === undefined) {\n yield* Effect.fail(\n new TestError({ message, expected: \"defined value\", actual: undefined })\n );\n }\n return value as T;\n });\n\n/**\n * Assert that an array has the expected length.\n */\nexport const assertLength = <T>(\n array: T[],\n expectedLength: number,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (array.length !== expectedLength) {\n yield* Effect.fail(\n new TestError({\n message,\n expected: expectedLength,\n actual: array.length,\n })\n );\n }\n });\n\n/**\n * Assert that an array is empty.\n */\nexport const assertEmpty = <T>(\n array: T[],\n message: string\n): Effect.Effect<void, TestError> => assertLength(array, 0, message);\n\n/**\n * Assert that an array is sorted by a key.\n */\nexport const assertSortedBy = <T>(\n array: T[],\n key: keyof T,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n for (let i = 1; i < array.length; i++) {\n const prev = array[i - 1]![key];\n const curr = array[i]![key];\n if (prev > curr) {\n yield* Effect.fail(\n new TestError({\n message,\n expected: `array sorted by ${String(key)}`,\n actual: `element at index ${i - 1} (${prev}) > element at index ${i} (${curr})`,\n })\n );\n }\n }\n });\n"],"mappings":";;;;;;;;;;;;AAeA,MAAa,eAAe,GAAY,MAAwB;AAC9D,KAAI,MAAM,EAAG,QAAO;AAEpB,KAAI,MAAM,QAAQ,MAAM,KAAM,QAAO,MAAM;AAC3C,KAAI,MAAM,UAAa,MAAM,OAAW,QAAO,MAAM;AAErD,KAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAElC,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,MAAI,OAAO,MAAM,EAAE,IAAI,OAAO,MAAM,EAAE,CAAE,QAAO;AAC/C,SAAO,MAAM;;AAGf,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;AACxC,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,OAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,IAC5B,KAAI,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,CAAE,QAAO;AAEvC,SAAO;;AAGT,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;EAClD,MAAM,OAAO;EACb,MAAM,OAAO;EACb,MAAM,QAAQ,OAAO,KAAK,KAAK;EAC/B,MAAM,QAAQ,OAAO,KAAK,KAAK;AAE/B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAE1C,OAAK,MAAM,OAAO,OAAO;AACvB,OAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,IAAI,CAAE,QAAO;AAC7D,OAAI,CAAC,YAAY,KAAK,MAAM,KAAK,KAAK,CAAE,QAAO;;AAGjD,SAAO;;AAGT,QAAO;;;;;AAUT,MAAa,eACX,QACA,UACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,CAAC,YAAY,QAAQ,SAAS,CAChC,QAAO,OAAO,KAAK,IAAI,UAAU;EAAE;EAAS;EAAU;EAAQ,CAAC,CAAC;EAElE;;;;AAKJ,MAAa,cACX,WACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,CAAC,UACH,QAAO,OAAO,KAAK,IAAI,UAAU,EAAE,SAAS,CAAC,CAAC;EAEhD;;;;AAkBJ,MAAa,mBACX,OACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,UAAU,OACZ,QAAO,OAAO,KACZ,IAAI,UAAU;EAAE;EAAS,UAAU;EAAW,QAAQ;EAAO,CAAC,CAC/D;EAEH;;;;AAKJ,MAAa,iBACX,OACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,UAAU,OACZ,QAAO,OAAO,KACZ,IAAI,UAAU;EAAE;EAAS,UAAU;EAAiB,QAAQ;EAAW,CAAC,CACzE;AAEH,QAAO;EACP;;;;AAKJ,MAAa,gBACX,OACA,gBACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,MAAM,WAAW,eACnB,QAAO,OAAO,KACZ,IAAI,UAAU;EACZ;EACA,UAAU;EACV,QAAQ,MAAM;EACf,CAAC,CACH;EAEH;;;;AAKJ,MAAa,eACX,OACA,YACmC,aAAa,OAAO,GAAG,QAAQ;;;;AAKpE,MAAa,kBACX,OACA,KACA,YAEA,OAAO,IAAI,aAAa;AACtB,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,OAAO,MAAM,IAAI,GAAI;EAC3B,MAAM,OAAO,MAAM,GAAI;AACvB,MAAI,OAAO,KACT,QAAO,OAAO,KACZ,IAAI,UAAU;GACZ;GACA,UAAU,mBAAmB,OAAO,IAAI;GACxC,QAAQ,oBAAoB,IAAI,EAAE,IAAI,KAAK,uBAAuB,EAAE,IAAI,KAAK;GAC9E,CAAC,CACH;;EAGL"}
1
+ {"version":3,"file":"assertions.mjs","names":[],"sources":["../../src/testing/assertions.ts"],"sourcesContent":["/**\n * @voidhash/mimic-effect/testing - Assertion Helpers\n *\n * Internal assertion helpers used by the test suites.\n */\nimport { Effect } from \"effect\";\nimport { TestError } from \"./types\";\n\n// =============================================================================\n// Deep Equality\n// =============================================================================\n\n/**\n * Deep equality check that handles objects, arrays, and primitives.\n * Skips function properties since reconstructed objects (like OperationPath)\n * will have new function instances even when the underlying data is identical.\n */\nexport const isDeepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (a === null || b === null) return a === b;\n if (a === undefined || b === undefined) return a === b;\n\n if (typeof a !== typeof b) return false;\n\n // Skip function comparison - functions with same behavior but different references should be considered equal\n if (typeof a === \"function\" && typeof b === \"function\") return true;\n\n if (typeof a === \"number\" && typeof b === \"number\") {\n if (Number.isNaN(a) && Number.isNaN(b)) return true;\n return a === b;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!isDeepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n if (typeof a === \"object\" && typeof b === \"object\") {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n // Filter out function properties for comparison\n const aKeys = Object.keys(aObj).filter(k => typeof aObj[k] !== \"function\");\n const bKeys = Object.keys(bObj).filter(k => typeof bObj[k] !== \"function\");\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!Object.prototype.hasOwnProperty.call(bObj, key)) return false;\n if (!isDeepEqual(aObj[key], bObj[key])) return false;\n }\n\n return true;\n }\n\n return false;\n};\n\n// =============================================================================\n// Assertion Helpers\n// =============================================================================\n\n/**\n * Assert that two values are deeply equal.\n */\nexport const assertEqual = <T>(\n actual: T,\n expected: T,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (!isDeepEqual(actual, expected)) {\n yield* Effect.fail(new TestError({ message, expected, actual }));\n }\n });\n\n/**\n * Assert that a condition is true.\n */\nexport const assertTrue = (\n condition: boolean,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (!condition) {\n yield* Effect.fail(new TestError({ message }));\n }\n });\n\n/**\n * Assert that a condition is false.\n */\nexport const assertFalse = (\n condition: boolean,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (condition) {\n yield* Effect.fail(new TestError({ message }));\n }\n });\n\n/**\n * Assert that a value is undefined.\n */\nexport const assertUndefined = (\n value: unknown,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (value !== undefined) {\n yield* Effect.fail(\n new TestError({ message, expected: undefined, actual: value })\n );\n }\n });\n\n/**\n * Assert that a value is defined (not undefined).\n */\nexport const assertDefined = <T>(\n value: T | undefined,\n message: string\n): Effect.Effect<T, TestError> =>\n Effect.gen(function* () {\n if (value === undefined) {\n yield* Effect.fail(\n new TestError({ message, expected: \"defined value\", actual: undefined })\n );\n }\n return value as T;\n });\n\n/**\n * Assert that an array has the expected length.\n */\nexport const assertLength = <T>(\n array: T[],\n expectedLength: number,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n if (array.length !== expectedLength) {\n yield* Effect.fail(\n new TestError({\n message,\n expected: expectedLength,\n actual: array.length,\n })\n );\n }\n });\n\n/**\n * Assert that an array is empty.\n */\nexport const assertEmpty = <T>(\n array: T[],\n message: string\n): Effect.Effect<void, TestError> => assertLength(array, 0, message);\n\n/**\n * Assert that an array is sorted by a key.\n */\nexport const assertSortedBy = <T>(\n array: T[],\n key: keyof T,\n message: string\n): Effect.Effect<void, TestError> =>\n Effect.gen(function* () {\n for (let i = 1; i < array.length; i++) {\n const prev = array[i - 1]![key];\n const curr = array[i]![key];\n if (prev > curr) {\n yield* Effect.fail(\n new TestError({\n message,\n expected: `array sorted by ${String(key)}`,\n actual: `element at index ${i - 1} (${prev}) > element at index ${i} (${curr})`,\n })\n );\n }\n }\n });\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAa,eAAe,GAAY,MAAwB;AAC9D,KAAI,MAAM,EAAG,QAAO;AAEpB,KAAI,MAAM,QAAQ,MAAM,KAAM,QAAO,MAAM;AAC3C,KAAI,MAAM,UAAa,MAAM,OAAW,QAAO,MAAM;AAErD,KAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAGlC,KAAI,OAAO,MAAM,cAAc,OAAO,MAAM,WAAY,QAAO;AAE/D,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,MAAI,OAAO,MAAM,EAAE,IAAI,OAAO,MAAM,EAAE,CAAE,QAAO;AAC/C,SAAO,MAAM;;AAGf,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;AACxC,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,OAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,IAC5B,KAAI,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,CAAE,QAAO;AAEvC,SAAO;;AAGT,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;EAClD,MAAM,OAAO;EACb,MAAM,OAAO;EAGb,MAAM,QAAQ,OAAO,KAAK,KAAK,CAAC,QAAO,MAAK,OAAO,KAAK,OAAO,WAAW;EAC1E,MAAM,QAAQ,OAAO,KAAK,KAAK,CAAC,QAAO,MAAK,OAAO,KAAK,OAAO,WAAW;AAE1E,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAE1C,OAAK,MAAM,OAAO,OAAO;AACvB,OAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,IAAI,CAAE,QAAO;AAC7D,OAAI,CAAC,YAAY,KAAK,MAAM,KAAK,KAAK,CAAE,QAAO;;AAGjD,SAAO;;AAGT,QAAO;;;;;AAUT,MAAa,eACX,QACA,UACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,CAAC,YAAY,QAAQ,SAAS,CAChC,QAAO,OAAO,KAAK,IAAI,UAAU;EAAE;EAAS;EAAU;EAAQ,CAAC,CAAC;EAElE;;;;AAKJ,MAAa,cACX,WACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,CAAC,UACH,QAAO,OAAO,KAAK,IAAI,UAAU,EAAE,SAAS,CAAC,CAAC;EAEhD;;;;AAkBJ,MAAa,mBACX,OACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,UAAU,OACZ,QAAO,OAAO,KACZ,IAAI,UAAU;EAAE;EAAS,UAAU;EAAW,QAAQ;EAAO,CAAC,CAC/D;EAEH;;;;AAKJ,MAAa,iBACX,OACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,UAAU,OACZ,QAAO,OAAO,KACZ,IAAI,UAAU;EAAE;EAAS,UAAU;EAAiB,QAAQ;EAAW,CAAC,CACzE;AAEH,QAAO;EACP;;;;AAKJ,MAAa,gBACX,OACA,gBACA,YAEA,OAAO,IAAI,aAAa;AACtB,KAAI,MAAM,WAAW,eACnB,QAAO,OAAO,KACZ,IAAI,UAAU;EACZ;EACA,UAAU;EACV,QAAQ,MAAM;EACf,CAAC,CACH;EAEH;;;;AAKJ,MAAa,eACX,OACA,YACmC,aAAa,OAAO,GAAG,QAAQ;;;;AAKpE,MAAa,kBACX,OACA,KACA,YAEA,OAAO,IAAI,aAAa;AACtB,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,OAAO,MAAM,IAAI,GAAI;EAC3B,MAAM,OAAO,MAAM,GAAI;AACvB,MAAI,OAAO,KACT,QAAO,OAAO,KACZ,IAAI,UAAU;GACZ;GACA,UAAU,mBAAmB,OAAO,IAAI;GACxC,QAAQ,oBAAoB,IAAI,EAAE,IAAI,KAAK,uBAAuB,EAAE,IAAI,KAAK;GAC9E,CAAC,CACH;;EAGL"}
@@ -1,10 +1,10 @@
1
1
  import { Effect } from "effect";
2
- import * as effect_Types0 from "effect/Types";
3
- import * as effect_Cause0 from "effect/Cause";
2
+ import * as effect_Types7 from "effect/Types";
3
+ import * as effect_Cause7 from "effect/Cause";
4
4
 
5
5
  //#region src/testing/types.d.ts
6
6
 
7
- declare const TestError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }) => effect_Cause0.YieldableError & {
7
+ declare const TestError_base: new <A extends Record<string, any> = {}>(args: effect_Types7.Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }) => effect_Cause7.YieldableError & {
8
8
  readonly _tag: "TestError";
9
9
  } & Readonly<A>;
10
10
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voidhash/mimic-effect",
3
- "version": "1.0.0-beta.4",
3
+ "version": "1.0.0-beta.5",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,14 +26,14 @@
26
26
  "typescript": "5.8.3",
27
27
  "vite-tsconfig-paths": "^5.1.4",
28
28
  "vitest": "^3.2.4",
29
- "@voidhash/tsconfig": "1.0.0-beta.4"
29
+ "@voidhash/tsconfig": "1.0.0-beta.5"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "@effect/platform": "^0.93.8",
33
33
  "@effect/cluster": "^0.55.0",
34
34
  "@effect/rpc": "^0.72.2",
35
35
  "effect": "^3.19.12",
36
- "@voidhash/mimic": "1.0.0-beta.4"
36
+ "@voidhash/mimic": "1.0.0-beta.5"
37
37
  },
38
38
  "peerDependenciesMeta": {
39
39
  "@effect/cluster": {
@@ -12,6 +12,8 @@ import { TestError } from "./types";
12
12
 
13
13
  /**
14
14
  * Deep equality check that handles objects, arrays, and primitives.
15
+ * Skips function properties since reconstructed objects (like OperationPath)
16
+ * will have new function instances even when the underlying data is identical.
15
17
  */
16
18
  export const isDeepEqual = (a: unknown, b: unknown): boolean => {
17
19
  if (a === b) return true;
@@ -21,6 +23,9 @@ export const isDeepEqual = (a: unknown, b: unknown): boolean => {
21
23
 
22
24
  if (typeof a !== typeof b) return false;
23
25
 
26
+ // Skip function comparison - functions with same behavior but different references should be considered equal
27
+ if (typeof a === "function" && typeof b === "function") return true;
28
+
24
29
  if (typeof a === "number" && typeof b === "number") {
25
30
  if (Number.isNaN(a) && Number.isNaN(b)) return true;
26
31
  return a === b;
@@ -37,8 +42,10 @@ export const isDeepEqual = (a: unknown, b: unknown): boolean => {
37
42
  if (typeof a === "object" && typeof b === "object") {
38
43
  const aObj = a as Record<string, unknown>;
39
44
  const bObj = b as Record<string, unknown>;
40
- const aKeys = Object.keys(aObj);
41
- const bKeys = Object.keys(bObj);
45
+
46
+ // Filter out function properties for comparison
47
+ const aKeys = Object.keys(aObj).filter(k => typeof aObj[k] !== "function");
48
+ const bKeys = Object.keys(bObj).filter(k => typeof bObj[k] !== "function");
42
49
 
43
50
  if (aKeys.length !== bKeys.length) return false;
44
51