@legendapp/state 3.0.0-beta.23 → 3.0.0-beta.26
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/index.js +6 -6
- package/index.mjs +6 -6
- package/package.json +14 -1
- package/persist-plugins/expo-sqlite.d.mts +19 -0
- package/persist-plugins/expo-sqlite.d.ts +19 -0
- package/persist-plugins/expo-sqlite.js +72 -0
- package/persist-plugins/expo-sqlite.mjs +69 -0
- package/react.d.mts +3 -1
- package/react.d.ts +3 -1
- package/sync.js +5 -0
- package/sync.mjs +5 -0
package/index.js
CHANGED
|
@@ -1601,7 +1601,7 @@ function setKey(node, key, newValue, level) {
|
|
|
1601
1601
|
setToObservable(childNode, newValue);
|
|
1602
1602
|
} else {
|
|
1603
1603
|
const { newValue: savedValue, prevValue, parentValue } = setNodeValue(childNode, newValue);
|
|
1604
|
-
const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
|
|
1604
|
+
const isPrim = isPrimitive(prevValue) || prevValue instanceof Date || isPrimitive(savedValue) || savedValue instanceof Date;
|
|
1605
1605
|
if (!isPrim) {
|
|
1606
1606
|
let parent = childNode;
|
|
1607
1607
|
do {
|
|
@@ -1677,7 +1677,7 @@ function handlerMapSet(node, p, value) {
|
|
|
1677
1677
|
} else if (isFunction(vProp)) {
|
|
1678
1678
|
return function(a, b, c) {
|
|
1679
1679
|
const l = arguments.length;
|
|
1680
|
-
const
|
|
1680
|
+
const valueMapOrSet = value;
|
|
1681
1681
|
if (p === "get") {
|
|
1682
1682
|
if (l > 0 && typeof a !== "boolean" && a !== optimized) {
|
|
1683
1683
|
return getProxy(node, a);
|
|
@@ -1691,14 +1691,14 @@ function handlerMapSet(node, p, value) {
|
|
|
1691
1691
|
return getProxy(node);
|
|
1692
1692
|
} else if (p === "delete") {
|
|
1693
1693
|
if (l > 0) {
|
|
1694
|
-
const prev = value.get ?
|
|
1694
|
+
const prev = value.get ? valueMapOrSet.get(a) : a;
|
|
1695
1695
|
deleteFn(node, a);
|
|
1696
1696
|
return prev !== void 0;
|
|
1697
1697
|
}
|
|
1698
1698
|
} else if (p === "clear") {
|
|
1699
|
-
const prev = new Map(
|
|
1700
|
-
const size =
|
|
1701
|
-
|
|
1699
|
+
const prev = isSet(valueMapOrSet) ? new Set(valueMapOrSet) : new Map(valueMapOrSet);
|
|
1700
|
+
const size = valueMapOrSet.size;
|
|
1701
|
+
valueMapOrSet.clear();
|
|
1702
1702
|
if (size) {
|
|
1703
1703
|
updateNodesAndNotify(node, value, prev);
|
|
1704
1704
|
}
|
package/index.mjs
CHANGED
|
@@ -1599,7 +1599,7 @@ function setKey(node, key, newValue, level) {
|
|
|
1599
1599
|
setToObservable(childNode, newValue);
|
|
1600
1600
|
} else {
|
|
1601
1601
|
const { newValue: savedValue, prevValue, parentValue } = setNodeValue(childNode, newValue);
|
|
1602
|
-
const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
|
|
1602
|
+
const isPrim = isPrimitive(prevValue) || prevValue instanceof Date || isPrimitive(savedValue) || savedValue instanceof Date;
|
|
1603
1603
|
if (!isPrim) {
|
|
1604
1604
|
let parent = childNode;
|
|
1605
1605
|
do {
|
|
@@ -1675,7 +1675,7 @@ function handlerMapSet(node, p, value) {
|
|
|
1675
1675
|
} else if (isFunction(vProp)) {
|
|
1676
1676
|
return function(a, b, c) {
|
|
1677
1677
|
const l = arguments.length;
|
|
1678
|
-
const
|
|
1678
|
+
const valueMapOrSet = value;
|
|
1679
1679
|
if (p === "get") {
|
|
1680
1680
|
if (l > 0 && typeof a !== "boolean" && a !== optimized) {
|
|
1681
1681
|
return getProxy(node, a);
|
|
@@ -1689,14 +1689,14 @@ function handlerMapSet(node, p, value) {
|
|
|
1689
1689
|
return getProxy(node);
|
|
1690
1690
|
} else if (p === "delete") {
|
|
1691
1691
|
if (l > 0) {
|
|
1692
|
-
const prev = value.get ?
|
|
1692
|
+
const prev = value.get ? valueMapOrSet.get(a) : a;
|
|
1693
1693
|
deleteFn(node, a);
|
|
1694
1694
|
return prev !== void 0;
|
|
1695
1695
|
}
|
|
1696
1696
|
} else if (p === "clear") {
|
|
1697
|
-
const prev = new Map(
|
|
1698
|
-
const size =
|
|
1699
|
-
|
|
1697
|
+
const prev = isSet(valueMapOrSet) ? new Set(valueMapOrSet) : new Map(valueMapOrSet);
|
|
1698
|
+
const size = valueMapOrSet.size;
|
|
1699
|
+
valueMapOrSet.clear();
|
|
1700
1700
|
if (size) {
|
|
1701
1701
|
updateNodesAndNotify(node, value, prev);
|
|
1702
1702
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@legendapp/state",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.26",
|
|
4
4
|
"description": "legend-state",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"private": false,
|
|
@@ -13,6 +13,14 @@
|
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"use-sync-external-store": "^1.2.2"
|
|
15
15
|
},
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"expo-sqlite": "^15.0.0"
|
|
18
|
+
},
|
|
19
|
+
"peerDependenciesMeta": {
|
|
20
|
+
"expo-sqlite": {
|
|
21
|
+
"optional": true
|
|
22
|
+
}
|
|
23
|
+
},
|
|
16
24
|
"author": "Legend <contact@legendapp.com> (https://github.com/LegendApp)",
|
|
17
25
|
"keywords": [
|
|
18
26
|
"react",
|
|
@@ -249,6 +257,11 @@
|
|
|
249
257
|
"require": "./persist-plugins/local-storage.js",
|
|
250
258
|
"types": "./persist-plugins/local-storage.d.ts"
|
|
251
259
|
},
|
|
260
|
+
"./persist-plugins/expo-sqlite": {
|
|
261
|
+
"import": "./persist-plugins/expo-sqlite.mjs",
|
|
262
|
+
"require": "./persist-plugins/expo-sqlite.js",
|
|
263
|
+
"types": "./persist-plugins/expo-sqlite.d.ts"
|
|
264
|
+
},
|
|
252
265
|
"./persist-plugins/async-storage": {
|
|
253
266
|
"import": "./persist-plugins/async-storage.mjs",
|
|
254
267
|
"require": "./persist-plugins/async-storage.js",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Change } from '@legendapp/state';
|
|
2
|
+
import { ObservablePersistPlugin, PersistMetadata } from '@legendapp/state/sync';
|
|
3
|
+
import { SQLiteStorage } from 'expo-sqlite/kv-store';
|
|
4
|
+
|
|
5
|
+
declare class ObservablePersistSqlite implements ObservablePersistPlugin {
|
|
6
|
+
private data;
|
|
7
|
+
private storage;
|
|
8
|
+
constructor(storage: SQLiteStorage);
|
|
9
|
+
getTable(table: string, init: any): any;
|
|
10
|
+
getMetadata(table: string): PersistMetadata;
|
|
11
|
+
set(table: string, changes: Change[]): void;
|
|
12
|
+
setMetadata(table: string, metadata: PersistMetadata): void;
|
|
13
|
+
deleteTable(table: string): undefined;
|
|
14
|
+
deleteMetadata(table: string): void;
|
|
15
|
+
private save;
|
|
16
|
+
}
|
|
17
|
+
declare function observablePersistSqlite(storage: SQLiteStorage): ObservablePersistSqlite;
|
|
18
|
+
|
|
19
|
+
export { ObservablePersistSqlite, observablePersistSqlite };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Change } from '@legendapp/state';
|
|
2
|
+
import { ObservablePersistPlugin, PersistMetadata } from '@legendapp/state/sync';
|
|
3
|
+
import { SQLiteStorage } from 'expo-sqlite/kv-store';
|
|
4
|
+
|
|
5
|
+
declare class ObservablePersistSqlite implements ObservablePersistPlugin {
|
|
6
|
+
private data;
|
|
7
|
+
private storage;
|
|
8
|
+
constructor(storage: SQLiteStorage);
|
|
9
|
+
getTable(table: string, init: any): any;
|
|
10
|
+
getMetadata(table: string): PersistMetadata;
|
|
11
|
+
set(table: string, changes: Change[]): void;
|
|
12
|
+
setMetadata(table: string, metadata: PersistMetadata): void;
|
|
13
|
+
deleteTable(table: string): undefined;
|
|
14
|
+
deleteMetadata(table: string): void;
|
|
15
|
+
private save;
|
|
16
|
+
}
|
|
17
|
+
declare function observablePersistSqlite(storage: SQLiteStorage): ObservablePersistSqlite;
|
|
18
|
+
|
|
19
|
+
export { ObservablePersistSqlite, observablePersistSqlite };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var state = require('@legendapp/state');
|
|
4
|
+
|
|
5
|
+
// src/persist-plugins/expo-sqlite.ts
|
|
6
|
+
var { safeParse, safeStringify } = state.internal;
|
|
7
|
+
var MetadataSuffix = "__m";
|
|
8
|
+
var ObservablePersistSqlite = class {
|
|
9
|
+
constructor(storage) {
|
|
10
|
+
this.data = {};
|
|
11
|
+
if (!storage) {
|
|
12
|
+
console.error(
|
|
13
|
+
"[legend-state] ObservablePersistSqlite failed to initialize. You need to pass the SQLiteStorage instance."
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
this.storage = storage;
|
|
17
|
+
}
|
|
18
|
+
getTable(table, init) {
|
|
19
|
+
if (!this.storage)
|
|
20
|
+
return void 0;
|
|
21
|
+
if (this.data[table] === void 0) {
|
|
22
|
+
try {
|
|
23
|
+
const value = this.storage.getItemSync(table);
|
|
24
|
+
this.data[table] = value ? safeParse(value) : init;
|
|
25
|
+
} catch (e) {
|
|
26
|
+
console.error("[legend-state] ObservablePersistSqlite failed to parse", table);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return this.data[table];
|
|
30
|
+
}
|
|
31
|
+
getMetadata(table) {
|
|
32
|
+
return this.getTable(table + MetadataSuffix, {});
|
|
33
|
+
}
|
|
34
|
+
set(table, changes) {
|
|
35
|
+
if (!this.data[table]) {
|
|
36
|
+
this.data[table] = {};
|
|
37
|
+
}
|
|
38
|
+
this.data[table] = state.applyChanges(this.data[table], changes);
|
|
39
|
+
this.save(table);
|
|
40
|
+
}
|
|
41
|
+
setMetadata(table, metadata) {
|
|
42
|
+
table = table + MetadataSuffix;
|
|
43
|
+
this.data[table] = metadata;
|
|
44
|
+
this.save(table);
|
|
45
|
+
}
|
|
46
|
+
deleteTable(table) {
|
|
47
|
+
if (!this.storage)
|
|
48
|
+
return void 0;
|
|
49
|
+
delete this.data[table];
|
|
50
|
+
this.storage.removeItemSync(table);
|
|
51
|
+
}
|
|
52
|
+
deleteMetadata(table) {
|
|
53
|
+
this.deleteTable(table + MetadataSuffix);
|
|
54
|
+
}
|
|
55
|
+
// Private
|
|
56
|
+
save(table) {
|
|
57
|
+
if (!this.storage)
|
|
58
|
+
return void 0;
|
|
59
|
+
const v = this.data[table];
|
|
60
|
+
if (v !== void 0 && v !== null) {
|
|
61
|
+
this.storage.setItemSync(table, safeStringify(v));
|
|
62
|
+
} else {
|
|
63
|
+
this.storage.removeItemSync(table);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
function observablePersistSqlite(storage) {
|
|
68
|
+
return new ObservablePersistSqlite(storage);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
exports.ObservablePersistSqlite = ObservablePersistSqlite;
|
|
72
|
+
exports.observablePersistSqlite = observablePersistSqlite;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { applyChanges, internal } from '@legendapp/state';
|
|
2
|
+
|
|
3
|
+
// src/persist-plugins/expo-sqlite.ts
|
|
4
|
+
var { safeParse, safeStringify } = internal;
|
|
5
|
+
var MetadataSuffix = "__m";
|
|
6
|
+
var ObservablePersistSqlite = class {
|
|
7
|
+
constructor(storage) {
|
|
8
|
+
this.data = {};
|
|
9
|
+
if (!storage) {
|
|
10
|
+
console.error(
|
|
11
|
+
"[legend-state] ObservablePersistSqlite failed to initialize. You need to pass the SQLiteStorage instance."
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
this.storage = storage;
|
|
15
|
+
}
|
|
16
|
+
getTable(table, init) {
|
|
17
|
+
if (!this.storage)
|
|
18
|
+
return void 0;
|
|
19
|
+
if (this.data[table] === void 0) {
|
|
20
|
+
try {
|
|
21
|
+
const value = this.storage.getItemSync(table);
|
|
22
|
+
this.data[table] = value ? safeParse(value) : init;
|
|
23
|
+
} catch (e) {
|
|
24
|
+
console.error("[legend-state] ObservablePersistSqlite failed to parse", table);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return this.data[table];
|
|
28
|
+
}
|
|
29
|
+
getMetadata(table) {
|
|
30
|
+
return this.getTable(table + MetadataSuffix, {});
|
|
31
|
+
}
|
|
32
|
+
set(table, changes) {
|
|
33
|
+
if (!this.data[table]) {
|
|
34
|
+
this.data[table] = {};
|
|
35
|
+
}
|
|
36
|
+
this.data[table] = applyChanges(this.data[table], changes);
|
|
37
|
+
this.save(table);
|
|
38
|
+
}
|
|
39
|
+
setMetadata(table, metadata) {
|
|
40
|
+
table = table + MetadataSuffix;
|
|
41
|
+
this.data[table] = metadata;
|
|
42
|
+
this.save(table);
|
|
43
|
+
}
|
|
44
|
+
deleteTable(table) {
|
|
45
|
+
if (!this.storage)
|
|
46
|
+
return void 0;
|
|
47
|
+
delete this.data[table];
|
|
48
|
+
this.storage.removeItemSync(table);
|
|
49
|
+
}
|
|
50
|
+
deleteMetadata(table) {
|
|
51
|
+
this.deleteTable(table + MetadataSuffix);
|
|
52
|
+
}
|
|
53
|
+
// Private
|
|
54
|
+
save(table) {
|
|
55
|
+
if (!this.storage)
|
|
56
|
+
return void 0;
|
|
57
|
+
const v = this.data[table];
|
|
58
|
+
if (v !== void 0 && v !== null) {
|
|
59
|
+
this.storage.setItemSync(table, safeStringify(v));
|
|
60
|
+
} else {
|
|
61
|
+
this.storage.removeItemSync(table);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
function observablePersistSqlite(storage) {
|
|
66
|
+
return new ObservablePersistSqlite(storage);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { ObservablePersistSqlite, observablePersistSqlite };
|
package/react.d.mts
CHANGED
|
@@ -46,7 +46,9 @@ interface PropsIfReady<T> {
|
|
|
46
46
|
interface PropsBase<T> {
|
|
47
47
|
else?: ReactNode | (() => ReactNode);
|
|
48
48
|
$value?: Observable<T>;
|
|
49
|
-
wrap?: FC
|
|
49
|
+
wrap?: FC<{
|
|
50
|
+
children: ReactNode;
|
|
51
|
+
}>;
|
|
50
52
|
children: ReactNode | ((value?: T) => ReactNode);
|
|
51
53
|
}
|
|
52
54
|
type Props<T> = PropsBase<T> & (PropsIf<T> | PropsIfReady<T>);
|
package/react.d.ts
CHANGED
|
@@ -46,7 +46,9 @@ interface PropsIfReady<T> {
|
|
|
46
46
|
interface PropsBase<T> {
|
|
47
47
|
else?: ReactNode | (() => ReactNode);
|
|
48
48
|
$value?: Observable<T>;
|
|
49
|
-
wrap?: FC
|
|
49
|
+
wrap?: FC<{
|
|
50
|
+
children: ReactNode;
|
|
51
|
+
}>;
|
|
50
52
|
children: ReactNode | ((value?: T) => ReactNode);
|
|
51
53
|
}
|
|
52
54
|
type Props<T> = PropsBase<T> & (PropsIf<T> | PropsIfReady<T>);
|
package/sync.js
CHANGED
|
@@ -835,6 +835,11 @@ async function loadLocal(value$, syncOptions, syncState$, localState) {
|
|
|
835
835
|
].filter(Boolean)
|
|
836
836
|
);
|
|
837
837
|
} else {
|
|
838
|
+
if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && persist && persist.plugin && !Object.hasOwn(persist, "name")) {
|
|
839
|
+
console.warn(
|
|
840
|
+
"[legend-state] Trying to syncObservable without `name` defined. Please include a `name` property in the `persist` configuration."
|
|
841
|
+
);
|
|
842
|
+
}
|
|
838
843
|
nodeValue.resetPersistence = () => prevResetPersistence == null ? void 0 : prevResetPersistence();
|
|
839
844
|
}
|
|
840
845
|
nodeValue.clearPersist = nodeValue.resetPersistence;
|
package/sync.mjs
CHANGED
|
@@ -833,6 +833,11 @@ async function loadLocal(value$, syncOptions, syncState$, localState) {
|
|
|
833
833
|
].filter(Boolean)
|
|
834
834
|
);
|
|
835
835
|
} else {
|
|
836
|
+
if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && persist && persist.plugin && !Object.hasOwn(persist, "name")) {
|
|
837
|
+
console.warn(
|
|
838
|
+
"[legend-state] Trying to syncObservable without `name` defined. Please include a `name` property in the `persist` configuration."
|
|
839
|
+
);
|
|
840
|
+
}
|
|
836
841
|
nodeValue.resetPersistence = () => prevResetPersistence == null ? void 0 : prevResetPersistence();
|
|
837
842
|
}
|
|
838
843
|
nodeValue.clearPersist = nodeValue.resetPersistence;
|