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 +8 -0
- package/dist/index.js +3 -0
- package/dist/src/utils/conflictResolution.d.ts +4 -2
- package/package.json +1 -1
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
|
|
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
|