synapse-storage 4.1.1 → 4.1.2

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.
@@ -5,7 +5,7 @@ export declare function isEqual(a: any, b: any): boolean;
5
5
  /**
6
6
  * Finds all changed paths between two objects.
7
7
  */
8
- export declare function findChangedPaths(oldObj: any, newObj: any, prefix?: string, changedPaths?: Set<string>, visited?: WeakMap<any, boolean>): Set<string>;
8
+ export declare function findChangedPaths(oldObj: any, newObj: any, prefix?: string, changedPaths?: Set<string>, visited?: WeakMap<any, WeakSet<any>>): Set<string>;
9
9
  /**
10
10
  * Creates a lazy deep-clone of an object.
11
11
  * Shallow copy initially, structuredClone on first nested property access.
@@ -1 +1 @@
1
- {"version":3,"file":"state-diff.util.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/utils/state-diff.util.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO,CA0B/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,SAAK,EAAE,YAAY,GAAE,GAAG,CAAC,MAAM,CAAqB,EAAE,OAAO,wBAA8B,GAAG,GAAG,CAAC,MAAM,CAAC,CAkCzK;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAsB3E"}
1
+ {"version":3,"file":"state-diff.util.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/utils/state-diff.util.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO,CA0B/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,SAAK,EAAE,YAAY,GAAE,GAAG,CAAC,MAAM,CAAqB,EAAE,OAAO,6BAAmC,GAAG,GAAG,CAAC,MAAM,CAAC,CA2C9K;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAsB3E"}
@@ -32,8 +32,19 @@
32
32
  }
33
33
  return changedPaths;
34
34
  }
35
- if (visited.has(oldObj)) return changedPaths;
36
- visited.set(oldObj, true);
35
+ // Cycle/dedup guard keyed by the (oldObj, newObj) PAIR, not by oldObj alone.
36
+ // structuredClone deduplicates shared references, so a single `oldObj` can be
37
+ // reached via different paths leading to DIFFERENT `newObj`s. Keying on oldObj
38
+ // alone would skip the second, genuinely-changed branch entirely.
39
+ const seenNew = visited.get(oldObj);
40
+ if (seenNew) {
41
+ if (seenNew.has(newObj)) return changedPaths;
42
+ seenNew.add(newObj);
43
+ } else {
44
+ visited.set(oldObj, new WeakSet([
45
+ newObj
46
+ ]));
47
+ }
37
48
  const allKeys = new Set([
38
49
  ...Object.keys(oldObj || {}),
39
50
  ...Object.keys(newObj || {})
@@ -1 +1 @@
1
- {"version":3,"file":"core/storage/utils/state-diff.util.js","sources":["../../../../src/core/storage/utils/state-diff.util.ts"],"sourcesContent":["/**\n * Deep equality check for two values.\n */\nexport function isEqual(a: any, b: any): boolean {\n if (a === b) return true\n if (a == null || b == null) return a === b\n\n const typeA = typeof a\n const typeB = typeof b\n if (typeA !== typeB) return false\n if (typeA !== 'object') return a === b\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\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 (!isEqual(a[i], b[i])) return false\n }\n return true\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n\n return keysA.every((key) => Object.prototype.hasOwnProperty.call(b, key) && isEqual(a[key], b[key]))\n}\n\n/**\n * Finds all changed paths between two objects.\n */\nexport function findChangedPaths(oldObj: any, newObj: any, prefix = '', changedPaths: Set<string> = new Set<string>(), visited = new WeakMap<any, boolean>()): Set<string> {\n if (oldObj === newObj) return changedPaths\n\n if (typeof oldObj !== 'object' || typeof newObj !== 'object' || oldObj === null || newObj === null) {\n if (oldObj !== newObj) {\n changedPaths.add(prefix || '')\n }\n return changedPaths\n }\n\n if (visited.has(oldObj)) return changedPaths\n visited.set(oldObj, true)\n\n const allKeys = new Set([...Object.keys(oldObj || {}), ...Object.keys(newObj || {})])\n\n for (const key of allKeys) {\n const oldValue = oldObj[key]\n const newValue = newObj[key]\n if (oldValue === newValue) continue\n\n const path = prefix ? `${prefix}.${key}` : key\n\n if (oldValue && newValue && typeof oldValue === 'object' && typeof newValue === 'object' && !Array.isArray(oldValue) && !Array.isArray(newValue)) {\n findChangedPaths(oldValue, newValue, path, changedPaths, visited)\n } else if (Array.isArray(oldValue) && Array.isArray(newValue)) {\n if (!isEqual(oldValue, newValue)) {\n changedPaths.add(path)\n }\n } else if (!isEqual(oldValue, newValue)) {\n changedPaths.add(path)\n }\n }\n\n return changedPaths\n}\n\n/**\n * Creates a lazy deep-clone of an object.\n * Shallow copy initially, structuredClone on first nested property access.\n */\nexport function createLazyClone<T extends Record<string, any>>(source: T): T {\n const cloned = new Set<string>()\n const shallow = { ...source }\n\n return new Proxy(shallow, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && !cloned.has(prop)) {\n const val = target[prop as keyof typeof target]\n if (val !== null && typeof val === 'object') {\n cloned.add(prop)\n ;(target as any)[prop] = structuredClone(val)\n }\n }\n return Reflect.get(target, prop, receiver)\n },\n set(target, prop, value) {\n if (typeof prop === 'string') {\n cloned.add(prop)\n }\n return Reflect.set(target, prop, value)\n },\n }) as T\n}\n"],"names":["isEqual","a","b","typeA","typeB","Date","Array","i","keysA","Object","keysB","key","findChangedPaths","oldObj","newObj","prefix","changedPaths","Set","visited","WeakMap","allKeys","oldValue","newValue","path","createLazyClone","source","cloned","shallow","Proxy","target","prop","receiver","val","structuredClone","Reflect","value"],"mappings":"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"}
1
+ {"version":3,"file":"core/storage/utils/state-diff.util.js","sources":["../../../../src/core/storage/utils/state-diff.util.ts"],"sourcesContent":["/**\n * Deep equality check for two values.\n */\nexport function isEqual(a: any, b: any): boolean {\n if (a === b) return true\n if (a == null || b == null) return a === b\n\n const typeA = typeof a\n const typeB = typeof b\n if (typeA !== typeB) return false\n if (typeA !== 'object') return a === b\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\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 (!isEqual(a[i], b[i])) return false\n }\n return true\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n\n return keysA.every((key) => Object.prototype.hasOwnProperty.call(b, key) && isEqual(a[key], b[key]))\n}\n\n/**\n * Finds all changed paths between two objects.\n */\nexport function findChangedPaths(oldObj: any, newObj: any, prefix = '', changedPaths: Set<string> = new Set<string>(), visited = new WeakMap<any, WeakSet<any>>()): Set<string> {\n if (oldObj === newObj) return changedPaths\n\n if (typeof oldObj !== 'object' || typeof newObj !== 'object' || oldObj === null || newObj === null) {\n if (oldObj !== newObj) {\n changedPaths.add(prefix || '')\n }\n return changedPaths\n }\n\n // Cycle/dedup guard keyed by the (oldObj, newObj) PAIR, not by oldObj alone.\n // structuredClone deduplicates shared references, so a single `oldObj` can be\n // reached via different paths leading to DIFFERENT `newObj`s. Keying on oldObj\n // alone would skip the second, genuinely-changed branch entirely.\n const seenNew = visited.get(oldObj)\n if (seenNew) {\n if (seenNew.has(newObj)) return changedPaths\n seenNew.add(newObj)\n } else {\n visited.set(oldObj, new WeakSet([newObj]))\n }\n\n const allKeys = new Set([...Object.keys(oldObj || {}), ...Object.keys(newObj || {})])\n\n for (const key of allKeys) {\n const oldValue = oldObj[key]\n const newValue = newObj[key]\n if (oldValue === newValue) continue\n\n const path = prefix ? `${prefix}.${key}` : key\n\n if (oldValue && newValue && typeof oldValue === 'object' && typeof newValue === 'object' && !Array.isArray(oldValue) && !Array.isArray(newValue)) {\n findChangedPaths(oldValue, newValue, path, changedPaths, visited)\n } else if (Array.isArray(oldValue) && Array.isArray(newValue)) {\n if (!isEqual(oldValue, newValue)) {\n changedPaths.add(path)\n }\n } else if (!isEqual(oldValue, newValue)) {\n changedPaths.add(path)\n }\n }\n\n return changedPaths\n}\n\n/**\n * Creates a lazy deep-clone of an object.\n * Shallow copy initially, structuredClone on first nested property access.\n */\nexport function createLazyClone<T extends Record<string, any>>(source: T): T {\n const cloned = new Set<string>()\n const shallow = { ...source }\n\n return new Proxy(shallow, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && !cloned.has(prop)) {\n const val = target[prop as keyof typeof target]\n if (val !== null && typeof val === 'object') {\n cloned.add(prop)\n ;(target as any)[prop] = structuredClone(val)\n }\n }\n return Reflect.get(target, prop, receiver)\n },\n set(target, prop, value) {\n if (typeof prop === 'string') {\n cloned.add(prop)\n }\n return Reflect.set(target, prop, value)\n },\n }) as T\n}\n"],"names":["isEqual","a","b","typeA","typeB","Date","Array","i","keysA","Object","keysB","key","findChangedPaths","oldObj","newObj","prefix","changedPaths","Set","visited","WeakMap","seenNew","WeakSet","allKeys","oldValue","newValue","path","createLazyClone","source","cloned","shallow","Proxy","target","prop","receiver","val","structuredClone","Reflect","value"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synapse-storage",
3
- "version": "4.1.1",
3
+ "version": "4.1.2",
4
4
  "description": "Набор инструментов для управления состоянием и апи-запросами",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",