tinybase 5.0.0-beta.2 → 5.0.0-beta.4
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/lib/cjs/mergeable-store.cjs +1 -1
- package/lib/cjs/mergeable-store.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-browser.cjs +1 -1
- package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-file.cjs +1 -1
- package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
- package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-remote.cjs +1 -1
- package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs/persisters.cjs +1 -1
- package/lib/cjs/persisters.cjs.gz +0 -0
- package/lib/cjs/store.cjs +1 -1
- package/lib/cjs/store.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs/tools.cjs +1 -1
- package/lib/cjs/tools.cjs.gz +0 -0
- package/lib/cjs/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs-es6/mergeable-store.cjs +1 -1
- package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs-es6/persisters.cjs +1 -1
- package/lib/cjs-es6/persisters.cjs.gz +0 -0
- package/lib/cjs-es6/store.cjs +1 -1
- package/lib/cjs-es6/store.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/tools.cjs +1 -1
- package/lib/cjs-es6/tools.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/debug/mergeable-store.js +223 -211
- package/lib/debug/persisters/persister-automerge.js +62 -41
- package/lib/debug/persisters/persister-browser.js +48 -16
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +97 -52
- package/lib/debug/persisters/persister-electric-sql.js +97 -52
- package/lib/debug/persisters/persister-expo-sqlite-next.js +97 -52
- package/lib/debug/persisters/persister-expo-sqlite.js +97 -52
- package/lib/debug/persisters/persister-file.js +47 -16
- package/lib/debug/persisters/persister-indexed-db.js +48 -18
- package/lib/debug/persisters/persister-partykit-client.js +46 -21
- package/lib/debug/persisters/persister-partykit-server.js +8 -18
- package/lib/debug/persisters/persister-remote.js +48 -16
- package/lib/debug/persisters/persister-sqlite-wasm.js +97 -52
- package/lib/debug/persisters/persister-sqlite3.js +97 -52
- package/lib/debug/persisters/persister-yjs.js +64 -40
- package/lib/debug/persisters.js +47 -16
- package/lib/debug/store.js +61 -83
- package/lib/debug/tinybase.js +264 -227
- package/lib/debug/tools.js +9 -11
- package/lib/debug/ui-react-dom.js +104 -99
- package/lib/es6/mergeable-store.js +1 -1
- package/lib/es6/mergeable-store.js.gz +0 -0
- package/lib/es6/persisters/persister-automerge.js +1 -1
- package/lib/es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/es6/persisters/persister-browser.js +1 -1
- package/lib/es6/persisters/persister-browser.js.gz +0 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-electric-sql.js +1 -1
- package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/es6/persisters/persister-file.js +1 -1
- package/lib/es6/persisters/persister-file.js.gz +0 -0
- package/lib/es6/persisters/persister-indexed-db.js +1 -1
- package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-client.js +1 -1
- package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-server.js +1 -1
- package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/es6/persisters/persister-remote.js +1 -1
- package/lib/es6/persisters/persister-remote.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite3.js +1 -1
- package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/es6/persisters/persister-yjs.js +1 -1
- package/lib/es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/es6/persisters.js +1 -1
- package/lib/es6/persisters.js.gz +0 -0
- package/lib/es6/store.js +1 -1
- package/lib/es6/store.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/es6/tools.js +1 -1
- package/lib/es6/tools.js.gz +0 -0
- package/lib/es6/ui-react-dom-debug.js +1 -1
- package/lib/es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/mergeable-store.js +1 -1
- package/lib/mergeable-store.js.gz +0 -0
- package/lib/persisters/persister-automerge.js +1 -1
- package/lib/persisters/persister-automerge.js.gz +0 -0
- package/lib/persisters/persister-browser.js +1 -1
- package/lib/persisters/persister-browser.js.gz +0 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-electric-sql.js +1 -1
- package/lib/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite.js +1 -1
- package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/persisters/persister-file.js +1 -1
- package/lib/persisters/persister-file.js.gz +0 -0
- package/lib/persisters/persister-indexed-db.js +1 -1
- package/lib/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/persisters/persister-partykit-client.js +1 -1
- package/lib/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/persisters/persister-partykit-server.js +1 -1
- package/lib/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/persisters/persister-remote.js +1 -1
- package/lib/persisters/persister-remote.js.gz +0 -0
- package/lib/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-sqlite3.js +1 -1
- package/lib/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/persisters/persister-yjs.js +1 -1
- package/lib/persisters/persister-yjs.js.gz +0 -0
- package/lib/persisters.js +1 -1
- package/lib/persisters.js.gz +0 -0
- package/lib/store.js +1 -1
- package/lib/store.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/tools.js +1 -1
- package/lib/tools.js.gz +0 -0
- package/lib/types/mergeable-store.d.ts +43 -13
- package/lib/types/persisters/persister-browser.d.ts +2 -2
- package/lib/types/persisters/persister-file.d.ts +1 -1
- package/lib/types/persisters/persister-partykit-server.d.ts +7 -8
- package/lib/types/persisters.d.ts +61 -30
- package/lib/types/store.d.ts +153 -111
- package/lib/types/tools.d.ts +2 -2
- package/lib/types/with-schemas/mergeable-store.d.ts +46 -13
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -2
- package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -1
- package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +10 -11
- package/lib/types/with-schemas/persisters.d.ts +88 -45
- package/lib/types/with-schemas/store.d.ts +165 -136
- package/lib/types/with-schemas/tools.d.ts +2 -2
- package/lib/umd/mergeable-store.js +1 -1
- package/lib/umd/mergeable-store.js.gz +0 -0
- package/lib/umd/persisters/persister-automerge.js +1 -1
- package/lib/umd/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd/persisters/persister-browser.js +1 -1
- package/lib/umd/persisters/persister-browser.js.gz +0 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-electric-sql.js +1 -1
- package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd/persisters/persister-file.js +1 -1
- package/lib/umd/persisters/persister-file.js.gz +0 -0
- package/lib/umd/persisters/persister-indexed-db.js +1 -1
- package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-client.js +1 -1
- package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-server.js +1 -1
- package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/umd/persisters/persister-remote.js +1 -1
- package/lib/umd/persisters/persister-remote.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite3.js +1 -1
- package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd/persisters/persister-yjs.js +1 -1
- package/lib/umd/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd/persisters.js +1 -1
- package/lib/umd/persisters.js.gz +0 -0
- package/lib/umd/store.js +1 -1
- package/lib/umd/store.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd/tools.js +1 -1
- package/lib/umd/tools.js.gz +0 -0
- package/lib/umd/ui-react-dom-debug.js +1 -1
- package/lib/umd/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd-es6/mergeable-store.js +1 -1
- package/lib/umd-es6/mergeable-store.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-automerge.js +1 -1
- package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-browser.js +1 -1
- package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
- package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-file.js +1 -1
- package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
- package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-remote.js +1 -1
- package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-yjs.js +1 -1
- package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd-es6/persisters.js +1 -1
- package/lib/umd-es6/persisters.js.gz +0 -0
- package/lib/umd-es6/store.js +1 -1
- package/lib/umd-es6/store.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/lib/umd-es6/tools.js +1 -1
- package/lib/umd-es6/tools.js.gz +0 -0
- package/lib/umd-es6/ui-react-dom-debug.js +1 -1
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/package.json +29 -25
- package/readme.md +2 -2
|
@@ -55,8 +55,7 @@ const isObject = (obj) =>
|
|
|
55
55
|
);
|
|
56
56
|
const objNew = (entries = []) => object.fromEntries(entries);
|
|
57
57
|
const objMerge = (...objs) => object.assign({}, ...objs);
|
|
58
|
-
const
|
|
59
|
-
const objHas = (obj, id) => !isUndefined(objGet(obj, id));
|
|
58
|
+
const objHas = (obj, id) => id in obj;
|
|
60
59
|
const objDel = (obj, id) => {
|
|
61
60
|
delete obj[id];
|
|
62
61
|
return obj;
|
|
@@ -99,7 +98,12 @@ const setAdd = (set, value) => set?.add(value);
|
|
|
99
98
|
const SELECT_STAR_FROM = SELECT + '*FROM';
|
|
100
99
|
const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
|
|
101
100
|
const WHERE = 'WHERE';
|
|
102
|
-
const getCommandFunctions = (
|
|
101
|
+
const getCommandFunctions = (
|
|
102
|
+
cmd,
|
|
103
|
+
managedTableNames,
|
|
104
|
+
onIgnoredError,
|
|
105
|
+
useOnConflict,
|
|
106
|
+
) => {
|
|
103
107
|
const schemaMap = mapNew();
|
|
104
108
|
const canSelect = (tableName, rowIdColumnName) =>
|
|
105
109
|
!isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
|
|
@@ -112,7 +116,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
112
116
|
await cmd(
|
|
113
117
|
'SELECT name ' +
|
|
114
118
|
FROM_PRAGMA_TABLE +
|
|
115
|
-
`list WHERE schema='main'AND
|
|
119
|
+
`list WHERE schema='main'AND(type='table'OR type='view')AND name IN(` +
|
|
116
120
|
getPlaceholders(managedTableNames) +
|
|
117
121
|
`)ORDER BY name`,
|
|
118
122
|
managedTableNames,
|
|
@@ -167,16 +171,18 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
167
171
|
const saveTable = async (
|
|
168
172
|
tableName,
|
|
169
173
|
rowIdColumnName,
|
|
170
|
-
|
|
174
|
+
content,
|
|
171
175
|
deleteEmptyColumns,
|
|
172
176
|
deleteEmptyTable,
|
|
173
177
|
partial = false,
|
|
174
178
|
) => {
|
|
175
|
-
const
|
|
176
|
-
objToArray(
|
|
177
|
-
arrayMap(objIds(
|
|
179
|
+
const tableCellOrValueIds = setNew();
|
|
180
|
+
objToArray(content ?? {}, (contentRow) =>
|
|
181
|
+
arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
|
|
182
|
+
setAdd(tableCellOrValueIds, cellOrValueId),
|
|
183
|
+
),
|
|
178
184
|
);
|
|
179
|
-
const tableColumnNames = collValues(
|
|
185
|
+
const tableColumnNames = collValues(tableCellOrValueIds);
|
|
180
186
|
if (
|
|
181
187
|
!partial &&
|
|
182
188
|
deleteEmptyTable &&
|
|
@@ -234,11 +240,11 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
234
240
|
]);
|
|
235
241
|
}
|
|
236
242
|
if (partial) {
|
|
237
|
-
if (isUndefined(
|
|
243
|
+
if (isUndefined(content)) {
|
|
238
244
|
await cmd('DELETE FROM' + escapeId(tableName) + 'WHERE 1');
|
|
239
245
|
} else {
|
|
240
246
|
await promiseAll(
|
|
241
|
-
objToArray(
|
|
247
|
+
objToArray(content, async (row, rowId) => {
|
|
242
248
|
if (isUndefined(row)) {
|
|
243
249
|
await cmd(
|
|
244
250
|
'DELETE FROM' +
|
|
@@ -249,10 +255,14 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
249
255
|
[rowId],
|
|
250
256
|
);
|
|
251
257
|
} else if (!arrayIsEmpty(tableColumnNames)) {
|
|
252
|
-
await upsert(
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
258
|
+
await upsert(
|
|
259
|
+
cmd,
|
|
260
|
+
tableName,
|
|
261
|
+
rowIdColumnName,
|
|
262
|
+
objIds(row),
|
|
263
|
+
[rowId, ...objValues(row)],
|
|
264
|
+
useOnConflict,
|
|
265
|
+
);
|
|
256
266
|
}
|
|
257
267
|
}),
|
|
258
268
|
);
|
|
@@ -265,7 +275,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
265
275
|
);
|
|
266
276
|
const args = [];
|
|
267
277
|
const deleteRowIds = [];
|
|
268
|
-
objToArray(
|
|
278
|
+
objToArray(content ?? {}, (row, rowId) => {
|
|
269
279
|
arrayPush(
|
|
270
280
|
args,
|
|
271
281
|
rowId,
|
|
@@ -314,9 +324,12 @@ const upsert = async (
|
|
|
314
324
|
rowIdColumnName,
|
|
315
325
|
changingColumnNames,
|
|
316
326
|
args,
|
|
327
|
+
useOnConflict = true,
|
|
317
328
|
) =>
|
|
318
329
|
await cmd(
|
|
319
|
-
'INSERT
|
|
330
|
+
'INSERT ' +
|
|
331
|
+
(useOnConflict ? EMPTY_STRING : 'OR REPLACE ') +
|
|
332
|
+
'INTO' +
|
|
320
333
|
escapeId(tableName) +
|
|
321
334
|
'(' +
|
|
322
335
|
escapeId(rowIdColumnName) +
|
|
@@ -334,18 +347,20 @@ const upsert = async (
|
|
|
334
347
|
),
|
|
335
348
|
1,
|
|
336
349
|
) +
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
350
|
+
(useOnConflict
|
|
351
|
+
? 'ON CONFLICT(' +
|
|
352
|
+
escapeId(rowIdColumnName) +
|
|
353
|
+
')DO UPDATE SET' +
|
|
354
|
+
arrayJoin(
|
|
355
|
+
arrayMap(
|
|
356
|
+
changingColumnNames,
|
|
357
|
+
(columnName) =>
|
|
358
|
+
escapeId(columnName) + '=excluded.' + escapeId(columnName),
|
|
359
|
+
),
|
|
360
|
+
COMMA,
|
|
361
|
+
)
|
|
362
|
+
: EMPTY_STRING),
|
|
363
|
+
arrayMap(args, (arg) => arg ?? null),
|
|
349
364
|
);
|
|
350
365
|
const getPlaceholders = (array) =>
|
|
351
366
|
arrayJoin(
|
|
@@ -361,6 +376,23 @@ const jsonParse = JSON.parse;
|
|
|
361
376
|
|
|
362
377
|
const scheduleRunning = mapNew();
|
|
363
378
|
const scheduleActions = mapNew();
|
|
379
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
380
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
381
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
382
|
+
? [
|
|
383
|
+
0,
|
|
384
|
+
store.getContent,
|
|
385
|
+
store.getTransactionChanges,
|
|
386
|
+
([changedTables, changedValues]) =>
|
|
387
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
388
|
+
]
|
|
389
|
+
: [
|
|
390
|
+
1,
|
|
391
|
+
store.getMergeableContent,
|
|
392
|
+
store.getTransactionMergeableChanges,
|
|
393
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
394
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
395
|
+
];
|
|
364
396
|
const createCustomPersister = (
|
|
365
397
|
store,
|
|
366
398
|
getPersisted,
|
|
@@ -368,6 +400,7 @@ const createCustomPersister = (
|
|
|
368
400
|
addPersisterListener,
|
|
369
401
|
delPersisterListener,
|
|
370
402
|
onIgnoredError,
|
|
403
|
+
supportsMergeableStore,
|
|
371
404
|
[getThing, thing] = [],
|
|
372
405
|
scheduleId = [],
|
|
373
406
|
) => {
|
|
@@ -380,6 +413,8 @@ const createCustomPersister = (
|
|
|
380
413
|
let listeningHandle;
|
|
381
414
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
382
415
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
416
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
417
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
383
418
|
const run = async () => {
|
|
384
419
|
/* istanbul ignore else */
|
|
385
420
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -415,7 +450,10 @@ const createCustomPersister = (
|
|
|
415
450
|
load: async (initialTables, initialValues) =>
|
|
416
451
|
await loadLock(async () => {
|
|
417
452
|
try {
|
|
418
|
-
|
|
453
|
+
const content = await getPersisted();
|
|
454
|
+
(isMergeableStore && isMergeable(content)
|
|
455
|
+
? store.setMergeableContent
|
|
456
|
+
: store.setContent)(content);
|
|
419
457
|
} catch {
|
|
420
458
|
store.setContent([initialTables, initialValues]);
|
|
421
459
|
}
|
|
@@ -425,16 +463,21 @@ const createCustomPersister = (
|
|
|
425
463
|
await persister.load(initialTables, initialValues);
|
|
426
464
|
listening = 1;
|
|
427
465
|
listeningHandle = addPersisterListener(
|
|
428
|
-
async (
|
|
429
|
-
if (
|
|
430
|
-
const
|
|
466
|
+
async (getContent2, getChanges2) => {
|
|
467
|
+
if (getChanges2) {
|
|
468
|
+
const changes = getChanges2();
|
|
431
469
|
await loadLock(async () =>
|
|
432
|
-
|
|
470
|
+
(isMergeableStore && isMergeable(changes)
|
|
471
|
+
? store.applyMergeableChanges
|
|
472
|
+
: store.applyChanges)(changes),
|
|
433
473
|
);
|
|
434
474
|
} else {
|
|
435
475
|
await loadLock(async () => {
|
|
436
476
|
try {
|
|
437
|
-
|
|
477
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
478
|
+
(isMergeableStore && isMergeable(content)
|
|
479
|
+
? store.setMergeableContent
|
|
480
|
+
: store.setContent)(content);
|
|
438
481
|
} catch (error) {
|
|
439
482
|
onIgnoredError?.(error);
|
|
440
483
|
}
|
|
@@ -452,7 +495,7 @@ const createCustomPersister = (
|
|
|
452
495
|
}
|
|
453
496
|
return persister;
|
|
454
497
|
},
|
|
455
|
-
save: async (
|
|
498
|
+
save: async (getChanges2) => {
|
|
456
499
|
/* istanbul ignore else */
|
|
457
500
|
if (loadSave != 1) {
|
|
458
501
|
loadSave = 2;
|
|
@@ -461,7 +504,7 @@ const createCustomPersister = (
|
|
|
461
504
|
}
|
|
462
505
|
await persister.schedule(async () => {
|
|
463
506
|
try {
|
|
464
|
-
await setPersisted(
|
|
507
|
+
await setPersisted(getContent, getChanges2);
|
|
465
508
|
} catch (error) {
|
|
466
509
|
/* istanbul ignore next */
|
|
467
510
|
onIgnoredError?.(error);
|
|
@@ -473,14 +516,12 @@ const createCustomPersister = (
|
|
|
473
516
|
},
|
|
474
517
|
startAutoSave: async () => {
|
|
475
518
|
await persister.stopAutoSave().save();
|
|
476
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
},
|
|
483
|
-
);
|
|
519
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
520
|
+
const changes = getChanges();
|
|
521
|
+
if (hasChanges(changes)) {
|
|
522
|
+
persister.save(() => changes);
|
|
523
|
+
}
|
|
524
|
+
});
|
|
484
525
|
return persister;
|
|
485
526
|
},
|
|
486
527
|
stopAutoSave: () => {
|
|
@@ -546,6 +587,7 @@ const createJsonSqlitePersister = (
|
|
|
546
587
|
addPersisterListener,
|
|
547
588
|
delPersisterListener,
|
|
548
589
|
onIgnoredError,
|
|
590
|
+
false,
|
|
549
591
|
[getThing, db],
|
|
550
592
|
db,
|
|
551
593
|
);
|
|
@@ -566,9 +608,10 @@ const createTabularSqlitePersister = (
|
|
|
566
608
|
managedTableNames,
|
|
567
609
|
db,
|
|
568
610
|
getThing,
|
|
611
|
+
useOnConflict,
|
|
569
612
|
) => {
|
|
570
613
|
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
571
|
-
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
614
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
|
|
572
615
|
const saveTables = async (tables, partial) =>
|
|
573
616
|
await promiseAll(
|
|
574
617
|
mapMap(
|
|
@@ -577,12 +620,11 @@ const createTabularSqlitePersister = (
|
|
|
577
620
|
[tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
|
|
578
621
|
tableId,
|
|
579
622
|
) => {
|
|
580
|
-
|
|
581
|
-
if (!partial || table !== void 0) {
|
|
623
|
+
if (!partial || objHas(tables, tableId)) {
|
|
582
624
|
await saveTable(
|
|
583
625
|
tableName,
|
|
584
626
|
rowIdColumnName,
|
|
585
|
-
|
|
627
|
+
tables[tableId],
|
|
586
628
|
deleteEmptyColumns,
|
|
587
629
|
deleteEmptyTable,
|
|
588
630
|
partial,
|
|
@@ -632,11 +674,11 @@ const createTabularSqlitePersister = (
|
|
|
632
674
|
? [tables, values]
|
|
633
675
|
: void 0;
|
|
634
676
|
});
|
|
635
|
-
const setPersisted = async (getContent,
|
|
677
|
+
const setPersisted = async (getContent, getChanges) =>
|
|
636
678
|
await transaction(async () => {
|
|
637
679
|
await refreshSchema();
|
|
638
|
-
if (!isUndefined(
|
|
639
|
-
const [tableChanges, valueChanges] =
|
|
680
|
+
if (!isUndefined(getChanges)) {
|
|
681
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
640
682
|
await saveTables(tableChanges, true);
|
|
641
683
|
await saveValues(valueChanges, true);
|
|
642
684
|
} else {
|
|
@@ -652,6 +694,7 @@ const createTabularSqlitePersister = (
|
|
|
652
694
|
addPersisterListener,
|
|
653
695
|
delPersisterListener,
|
|
654
696
|
onIgnoredError,
|
|
697
|
+
false,
|
|
655
698
|
[getThing, db],
|
|
656
699
|
db,
|
|
657
700
|
);
|
|
@@ -764,6 +807,7 @@ const createSqlitePersister = (
|
|
|
764
807
|
onIgnoredError,
|
|
765
808
|
db,
|
|
766
809
|
getThing = 'getDb',
|
|
810
|
+
useOnConflict,
|
|
767
811
|
) => {
|
|
768
812
|
let dataVersion;
|
|
769
813
|
let schemaVersion;
|
|
@@ -826,6 +870,7 @@ const createSqlitePersister = (
|
|
|
826
870
|
collValues(managedTableNamesSet),
|
|
827
871
|
db,
|
|
828
872
|
getThing,
|
|
873
|
+
useOnConflict,
|
|
829
874
|
);
|
|
830
875
|
};
|
|
831
876
|
|
|
@@ -56,8 +56,7 @@ const isObject = (obj) =>
|
|
|
56
56
|
);
|
|
57
57
|
const objNew = (entries = []) => object.fromEntries(entries);
|
|
58
58
|
const objMerge = (...objs) => object.assign({}, ...objs);
|
|
59
|
-
const
|
|
60
|
-
const objHas = (obj, id) => !isUndefined(objGet(obj, id));
|
|
59
|
+
const objHas = (obj, id) => id in obj;
|
|
61
60
|
const objDel = (obj, id) => {
|
|
62
61
|
delete obj[id];
|
|
63
62
|
return obj;
|
|
@@ -100,7 +99,12 @@ const setAdd = (set, value) => set?.add(value);
|
|
|
100
99
|
const SELECT_STAR_FROM = SELECT + '*FROM';
|
|
101
100
|
const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
|
|
102
101
|
const WHERE = 'WHERE';
|
|
103
|
-
const getCommandFunctions = (
|
|
102
|
+
const getCommandFunctions = (
|
|
103
|
+
cmd,
|
|
104
|
+
managedTableNames,
|
|
105
|
+
onIgnoredError,
|
|
106
|
+
useOnConflict,
|
|
107
|
+
) => {
|
|
104
108
|
const schemaMap = mapNew();
|
|
105
109
|
const canSelect = (tableName, rowIdColumnName) =>
|
|
106
110
|
!isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
|
|
@@ -113,7 +117,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
113
117
|
await cmd(
|
|
114
118
|
'SELECT name ' +
|
|
115
119
|
FROM_PRAGMA_TABLE +
|
|
116
|
-
`list WHERE schema='main'AND
|
|
120
|
+
`list WHERE schema='main'AND(type='table'OR type='view')AND name IN(` +
|
|
117
121
|
getPlaceholders(managedTableNames) +
|
|
118
122
|
`)ORDER BY name`,
|
|
119
123
|
managedTableNames,
|
|
@@ -168,16 +172,18 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
168
172
|
const saveTable = async (
|
|
169
173
|
tableName,
|
|
170
174
|
rowIdColumnName,
|
|
171
|
-
|
|
175
|
+
content,
|
|
172
176
|
deleteEmptyColumns,
|
|
173
177
|
deleteEmptyTable,
|
|
174
178
|
partial = false,
|
|
175
179
|
) => {
|
|
176
|
-
const
|
|
177
|
-
objToArray(
|
|
178
|
-
arrayMap(objIds(
|
|
180
|
+
const tableCellOrValueIds = setNew();
|
|
181
|
+
objToArray(content ?? {}, (contentRow) =>
|
|
182
|
+
arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
|
|
183
|
+
setAdd(tableCellOrValueIds, cellOrValueId),
|
|
184
|
+
),
|
|
179
185
|
);
|
|
180
|
-
const tableColumnNames = collValues(
|
|
186
|
+
const tableColumnNames = collValues(tableCellOrValueIds);
|
|
181
187
|
if (
|
|
182
188
|
!partial &&
|
|
183
189
|
deleteEmptyTable &&
|
|
@@ -235,11 +241,11 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
235
241
|
]);
|
|
236
242
|
}
|
|
237
243
|
if (partial) {
|
|
238
|
-
if (isUndefined(
|
|
244
|
+
if (isUndefined(content)) {
|
|
239
245
|
await cmd('DELETE FROM' + escapeId(tableName) + 'WHERE 1');
|
|
240
246
|
} else {
|
|
241
247
|
await promiseAll(
|
|
242
|
-
objToArray(
|
|
248
|
+
objToArray(content, async (row, rowId) => {
|
|
243
249
|
if (isUndefined(row)) {
|
|
244
250
|
await cmd(
|
|
245
251
|
'DELETE FROM' +
|
|
@@ -250,10 +256,14 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
250
256
|
[rowId],
|
|
251
257
|
);
|
|
252
258
|
} else if (!arrayIsEmpty(tableColumnNames)) {
|
|
253
|
-
await upsert(
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
259
|
+
await upsert(
|
|
260
|
+
cmd,
|
|
261
|
+
tableName,
|
|
262
|
+
rowIdColumnName,
|
|
263
|
+
objIds(row),
|
|
264
|
+
[rowId, ...objValues(row)],
|
|
265
|
+
useOnConflict,
|
|
266
|
+
);
|
|
257
267
|
}
|
|
258
268
|
}),
|
|
259
269
|
);
|
|
@@ -266,7 +276,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
266
276
|
);
|
|
267
277
|
const args = [];
|
|
268
278
|
const deleteRowIds = [];
|
|
269
|
-
objToArray(
|
|
279
|
+
objToArray(content ?? {}, (row, rowId) => {
|
|
270
280
|
arrayPush(
|
|
271
281
|
args,
|
|
272
282
|
rowId,
|
|
@@ -315,9 +325,12 @@ const upsert = async (
|
|
|
315
325
|
rowIdColumnName,
|
|
316
326
|
changingColumnNames,
|
|
317
327
|
args,
|
|
328
|
+
useOnConflict = true,
|
|
318
329
|
) =>
|
|
319
330
|
await cmd(
|
|
320
|
-
'INSERT
|
|
331
|
+
'INSERT ' +
|
|
332
|
+
(useOnConflict ? EMPTY_STRING : 'OR REPLACE ') +
|
|
333
|
+
'INTO' +
|
|
321
334
|
escapeId(tableName) +
|
|
322
335
|
'(' +
|
|
323
336
|
escapeId(rowIdColumnName) +
|
|
@@ -335,18 +348,20 @@ const upsert = async (
|
|
|
335
348
|
),
|
|
336
349
|
1,
|
|
337
350
|
) +
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
351
|
+
(useOnConflict
|
|
352
|
+
? 'ON CONFLICT(' +
|
|
353
|
+
escapeId(rowIdColumnName) +
|
|
354
|
+
')DO UPDATE SET' +
|
|
355
|
+
arrayJoin(
|
|
356
|
+
arrayMap(
|
|
357
|
+
changingColumnNames,
|
|
358
|
+
(columnName) =>
|
|
359
|
+
escapeId(columnName) + '=excluded.' + escapeId(columnName),
|
|
360
|
+
),
|
|
361
|
+
COMMA,
|
|
362
|
+
)
|
|
363
|
+
: EMPTY_STRING),
|
|
364
|
+
arrayMap(args, (arg) => arg ?? null),
|
|
350
365
|
);
|
|
351
366
|
const getPlaceholders = (array) =>
|
|
352
367
|
arrayJoin(
|
|
@@ -362,6 +377,23 @@ const jsonParse = JSON.parse;
|
|
|
362
377
|
|
|
363
378
|
const scheduleRunning = mapNew();
|
|
364
379
|
const scheduleActions = mapNew();
|
|
380
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
381
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
382
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
383
|
+
? [
|
|
384
|
+
0,
|
|
385
|
+
store.getContent,
|
|
386
|
+
store.getTransactionChanges,
|
|
387
|
+
([changedTables, changedValues]) =>
|
|
388
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
389
|
+
]
|
|
390
|
+
: [
|
|
391
|
+
1,
|
|
392
|
+
store.getMergeableContent,
|
|
393
|
+
store.getTransactionMergeableChanges,
|
|
394
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
395
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
396
|
+
];
|
|
365
397
|
const createCustomPersister = (
|
|
366
398
|
store,
|
|
367
399
|
getPersisted,
|
|
@@ -369,6 +401,7 @@ const createCustomPersister = (
|
|
|
369
401
|
addPersisterListener,
|
|
370
402
|
delPersisterListener,
|
|
371
403
|
onIgnoredError,
|
|
404
|
+
supportsMergeableStore,
|
|
372
405
|
[getThing, thing] = [],
|
|
373
406
|
scheduleId = [],
|
|
374
407
|
) => {
|
|
@@ -381,6 +414,8 @@ const createCustomPersister = (
|
|
|
381
414
|
let listeningHandle;
|
|
382
415
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
383
416
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
417
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
418
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
384
419
|
const run = async () => {
|
|
385
420
|
/* istanbul ignore else */
|
|
386
421
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -416,7 +451,10 @@ const createCustomPersister = (
|
|
|
416
451
|
load: async (initialTables, initialValues) =>
|
|
417
452
|
await loadLock(async () => {
|
|
418
453
|
try {
|
|
419
|
-
|
|
454
|
+
const content = await getPersisted();
|
|
455
|
+
(isMergeableStore && isMergeable(content)
|
|
456
|
+
? store.setMergeableContent
|
|
457
|
+
: store.setContent)(content);
|
|
420
458
|
} catch {
|
|
421
459
|
store.setContent([initialTables, initialValues]);
|
|
422
460
|
}
|
|
@@ -426,16 +464,21 @@ const createCustomPersister = (
|
|
|
426
464
|
await persister.load(initialTables, initialValues);
|
|
427
465
|
listening = 1;
|
|
428
466
|
listeningHandle = addPersisterListener(
|
|
429
|
-
async (
|
|
430
|
-
if (
|
|
431
|
-
const
|
|
467
|
+
async (getContent2, getChanges2) => {
|
|
468
|
+
if (getChanges2) {
|
|
469
|
+
const changes = getChanges2();
|
|
432
470
|
await loadLock(async () =>
|
|
433
|
-
|
|
471
|
+
(isMergeableStore && isMergeable(changes)
|
|
472
|
+
? store.applyMergeableChanges
|
|
473
|
+
: store.applyChanges)(changes),
|
|
434
474
|
);
|
|
435
475
|
} else {
|
|
436
476
|
await loadLock(async () => {
|
|
437
477
|
try {
|
|
438
|
-
|
|
478
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
479
|
+
(isMergeableStore && isMergeable(content)
|
|
480
|
+
? store.setMergeableContent
|
|
481
|
+
: store.setContent)(content);
|
|
439
482
|
} catch (error) {
|
|
440
483
|
onIgnoredError?.(error);
|
|
441
484
|
}
|
|
@@ -453,7 +496,7 @@ const createCustomPersister = (
|
|
|
453
496
|
}
|
|
454
497
|
return persister;
|
|
455
498
|
},
|
|
456
|
-
save: async (
|
|
499
|
+
save: async (getChanges2) => {
|
|
457
500
|
/* istanbul ignore else */
|
|
458
501
|
if (loadSave != 1) {
|
|
459
502
|
loadSave = 2;
|
|
@@ -462,7 +505,7 @@ const createCustomPersister = (
|
|
|
462
505
|
}
|
|
463
506
|
await persister.schedule(async () => {
|
|
464
507
|
try {
|
|
465
|
-
await setPersisted(
|
|
508
|
+
await setPersisted(getContent, getChanges2);
|
|
466
509
|
} catch (error) {
|
|
467
510
|
/* istanbul ignore next */
|
|
468
511
|
onIgnoredError?.(error);
|
|
@@ -474,14 +517,12 @@ const createCustomPersister = (
|
|
|
474
517
|
},
|
|
475
518
|
startAutoSave: async () => {
|
|
476
519
|
await persister.stopAutoSave().save();
|
|
477
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
},
|
|
484
|
-
);
|
|
520
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
521
|
+
const changes = getChanges();
|
|
522
|
+
if (hasChanges(changes)) {
|
|
523
|
+
persister.save(() => changes);
|
|
524
|
+
}
|
|
525
|
+
});
|
|
485
526
|
return persister;
|
|
486
527
|
},
|
|
487
528
|
stopAutoSave: () => {
|
|
@@ -547,6 +588,7 @@ const createJsonSqlitePersister = (
|
|
|
547
588
|
addPersisterListener,
|
|
548
589
|
delPersisterListener,
|
|
549
590
|
onIgnoredError,
|
|
591
|
+
false,
|
|
550
592
|
[getThing, db],
|
|
551
593
|
db,
|
|
552
594
|
);
|
|
@@ -567,9 +609,10 @@ const createTabularSqlitePersister = (
|
|
|
567
609
|
managedTableNames,
|
|
568
610
|
db,
|
|
569
611
|
getThing,
|
|
612
|
+
useOnConflict,
|
|
570
613
|
) => {
|
|
571
614
|
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
572
|
-
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
615
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
|
|
573
616
|
const saveTables = async (tables, partial) =>
|
|
574
617
|
await promiseAll(
|
|
575
618
|
mapMap(
|
|
@@ -578,12 +621,11 @@ const createTabularSqlitePersister = (
|
|
|
578
621
|
[tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
|
|
579
622
|
tableId,
|
|
580
623
|
) => {
|
|
581
|
-
|
|
582
|
-
if (!partial || table !== void 0) {
|
|
624
|
+
if (!partial || objHas(tables, tableId)) {
|
|
583
625
|
await saveTable(
|
|
584
626
|
tableName,
|
|
585
627
|
rowIdColumnName,
|
|
586
|
-
|
|
628
|
+
tables[tableId],
|
|
587
629
|
deleteEmptyColumns,
|
|
588
630
|
deleteEmptyTable,
|
|
589
631
|
partial,
|
|
@@ -633,11 +675,11 @@ const createTabularSqlitePersister = (
|
|
|
633
675
|
? [tables, values]
|
|
634
676
|
: void 0;
|
|
635
677
|
});
|
|
636
|
-
const setPersisted = async (getContent,
|
|
678
|
+
const setPersisted = async (getContent, getChanges) =>
|
|
637
679
|
await transaction(async () => {
|
|
638
680
|
await refreshSchema();
|
|
639
|
-
if (!isUndefined(
|
|
640
|
-
const [tableChanges, valueChanges] =
|
|
681
|
+
if (!isUndefined(getChanges)) {
|
|
682
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
641
683
|
await saveTables(tableChanges, true);
|
|
642
684
|
await saveValues(valueChanges, true);
|
|
643
685
|
} else {
|
|
@@ -653,6 +695,7 @@ const createTabularSqlitePersister = (
|
|
|
653
695
|
addPersisterListener,
|
|
654
696
|
delPersisterListener,
|
|
655
697
|
onIgnoredError,
|
|
698
|
+
false,
|
|
656
699
|
[getThing, db],
|
|
657
700
|
db,
|
|
658
701
|
);
|
|
@@ -765,6 +808,7 @@ const createSqlitePersister = (
|
|
|
765
808
|
onIgnoredError,
|
|
766
809
|
db,
|
|
767
810
|
getThing = 'getDb',
|
|
811
|
+
useOnConflict,
|
|
768
812
|
) => {
|
|
769
813
|
let dataVersion;
|
|
770
814
|
let schemaVersion;
|
|
@@ -827,6 +871,7 @@ const createSqlitePersister = (
|
|
|
827
871
|
collValues(managedTableNamesSet),
|
|
828
872
|
db,
|
|
829
873
|
getThing,
|
|
874
|
+
useOnConflict,
|
|
830
875
|
);
|
|
831
876
|
};
|
|
832
877
|
|