cry-synced-db-client 0.1.134 → 0.1.135

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Versions
2
2
 
3
+ ## 0.1.135 (2026-04-20)
4
+
5
+ - Conflict resolution: server wins on primitive field conflicts when `external._rev > local._rev`
6
+ - Previously local always won for overlapping primitive fields during conflict merge
7
+ - New rule applies recursively to object elements inside arrays (via `mergeObjectArrays` → `mergeObjects`)
8
+ - Arrays still unionize; nested objects without `_rev` keep local-wins behavior
9
+ - Affects dirty-conflict resolution path ([SyncEngine.resolveCollectionConflict](src/db/sync/SyncEngine.ts))
10
+
3
11
  ## 0.1.126 (2026-04-08)
4
12
 
5
13
  - Eviction: remove out-of-scope records from Dexie and in-mem cache
package/dist/index.js CHANGED
@@ -2319,6 +2319,7 @@ function resolveConflict(local, external) {
2319
2319
  }
2320
2320
  function mergeObjects(local, external) {
2321
2321
  const result = __spreadValues({}, local);
2322
+ const serverWinsOnConflict = typeof local._rev === "number" && typeof external._rev === "number" && external._rev > local._rev;
2322
2323
  for (const key of Object.keys(external)) {
2323
2324
  if (key === "_id" || key === "_dirty") {
2324
2325
  continue;
@@ -2336,6 +2337,8 @@ function mergeObjects(local, external) {
2336
2337
  result[key] = mergeArrays(localValue, externalValue);
2337
2338
  } else if (isPlainObject3(localValue) && isPlainObject3(externalValue)) {
2338
2339
  result[key] = mergeObjects(localValue, externalValue);
2340
+ } else if (serverWinsOnConflict) {
2341
+ result[key] = externalValue;
2339
2342
  }
2340
2343
  }
2341
2344
  return result;
@@ -5,13 +5,15 @@ import type { DbEntity } from "../types/DbEntity";
5
5
  * 1. Če ima lokalni objekt _rev in ima objekt s serverja nižji ali isti _rev, ignoriramo server
6
6
  * 2. Polja, ki niso array in niso object:
7
7
  * - če lokalna verzija nima polja, zunanja pa ga ima, polje dodamo
8
- * - če imata oba objekta polje, vrednost s serverja zavržemo
8
+ * - če imata oba objekta polje:
9
+ * - če external._rev > local._rev (oba definirana), zmaga server
10
+ * - sicer ohranimo lokalno vrednost
9
11
  * 3. Polja tipa array:
10
12
  * - če lokalni objekt nima polja, ga dodamo
11
13
  * - če je tip podatkov string[], shranimo deduplicirano unijo
12
14
  * - če je tip podatkov Object[]:
13
15
  * - elemente brez _id dodamo v lokalni array
14
- * - objekte z _id primerjamo rekurzivno
16
+ * - objekte z _id primerjamo rekurzivno (rekurzija uporabi isto _rev pravilo)
15
17
  * 4. Če je tip podatkov Record<string, Object>:
16
18
  * - za vsak key, ki ga ni v lokalnem objektu, dodamo vrednost
17
19
  * - za vsak key, ki obstaja, primerjamo rekurzivno
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cry-synced-db-client",
3
- "version": "0.1.134",
3
+ "version": "0.1.135",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",