tinybase 6.1.0-beta.4 → 6.1.0-beta.5
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/@types/persisters/index.d.ts +82 -40
- package/@types/persisters/persister-automerge/index.d.ts +4 -4
- package/@types/persisters/persister-automerge/with-schemas/index.d.ts +4 -4
- package/@types/persisters/persister-browser/index.d.ts +4 -4
- package/@types/persisters/persister-browser/with-schemas/index.d.ts +4 -4
- package/@types/persisters/persister-cr-sqlite-wasm/index.d.ts +3 -3
- package/@types/persisters/persister-cr-sqlite-wasm/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-electric-sql/index.d.ts +3 -3
- package/@types/persisters/persister-electric-sql/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-expo-sqlite/index.d.ts +3 -3
- package/@types/persisters/persister-expo-sqlite/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-file/index.d.ts +2 -2
- package/@types/persisters/persister-file/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-indexed-db/index.d.ts +2 -2
- package/@types/persisters/persister-indexed-db/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-libsql/index.d.ts +3 -3
- package/@types/persisters/persister-libsql/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-partykit-client/index.d.ts +2 -2
- package/@types/persisters/persister-partykit-client/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-pglite/index.d.ts +3 -3
- package/@types/persisters/persister-pglite/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-postgres/index.d.ts +3 -3
- package/@types/persisters/persister-postgres/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-powersync/index.d.ts +3 -3
- package/@types/persisters/persister-powersync/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-remote/index.d.ts +2 -2
- package/@types/persisters/persister-remote/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-sqlite-bun/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite-bun/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite-wasm/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite-wasm/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite3/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite3/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-yjs/index.d.ts +4 -4
- package/@types/persisters/persister-yjs/with-schemas/index.d.ts +4 -4
- package/@types/persisters/with-schemas/index.d.ts +86 -42
- package/@types/synchronizers/index.d.ts +18 -16
- package/@types/synchronizers/synchronizer-broadcast-channel/index.d.ts +3 -3
- package/@types/synchronizers/synchronizer-broadcast-channel/with-schemas/index.d.ts +3 -3
- package/@types/synchronizers/synchronizer-local/index.d.ts +2 -2
- package/@types/synchronizers/synchronizer-local/with-schemas/index.d.ts +2 -2
- package/@types/synchronizers/synchronizer-ws-client/index.d.ts +5 -5
- package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +5 -5
- package/@types/synchronizers/synchronizer-ws-server/index.d.ts +37 -37
- package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +37 -37
- package/@types/synchronizers/synchronizer-ws-server-simple/index.d.ts +7 -7
- package/@types/synchronizers/synchronizer-ws-server-simple/with-schemas/index.d.ts +7 -7
- package/@types/synchronizers/with-schemas/index.d.ts +18 -16
- package/@types/ui-react/index.d.ts +2 -2
- package/@types/ui-react/with-schemas/index.d.ts +2 -2
- package/index.js +23 -17
- package/mergeable-store/index.js +23 -17
- package/mergeable-store/with-schemas/index.js +23 -17
- package/min/index.js +1 -1
- package/min/index.js.gz +0 -0
- package/min/mergeable-store/index.js +1 -1
- package/min/mergeable-store/index.js.gz +0 -0
- package/min/mergeable-store/with-schemas/index.js +1 -1
- package/min/mergeable-store/with-schemas/index.js.gz +0 -0
- package/min/persisters/index.js +1 -1
- package/min/persisters/index.js.gz +0 -0
- package/min/persisters/persister-automerge/index.js +1 -1
- package/min/persisters/persister-automerge/index.js.gz +0 -0
- package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-browser/index.js +1 -1
- package/min/persisters/persister-browser/index.js.gz +0 -0
- package/min/persisters/persister-browser/with-schemas/index.js +1 -1
- package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/index.js +1 -1
- package/min/persisters/persister-electric-sql/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
- package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-file/index.js +1 -1
- package/min/persisters/persister-file/index.js.gz +0 -0
- package/min/persisters/persister-file/with-schemas/index.js +1 -1
- package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/index.js +1 -1
- package/min/persisters/persister-indexed-db/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
- package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-libsql/index.js +1 -1
- package/min/persisters/persister-libsql/index.js.gz +0 -0
- package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
- package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/index.js +1 -1
- package/min/persisters/persister-partykit-client/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
- package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pglite/index.js +1 -1
- package/min/persisters/persister-pglite/index.js.gz +0 -0
- package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
- package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-postgres/index.js +1 -1
- package/min/persisters/persister-postgres/index.js.gz +0 -0
- package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
- package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-powersync/index.js +1 -1
- package/min/persisters/persister-powersync/index.js.gz +0 -0
- package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
- package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-remote/index.js +1 -1
- package/min/persisters/persister-remote/index.js.gz +0 -0
- package/min/persisters/persister-remote/with-schemas/index.js +1 -1
- package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/index.js +1 -1
- package/min/persisters/persister-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-yjs/index.js +1 -1
- package/min/persisters/persister-yjs/index.js.gz +0 -0
- package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
- package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
- package/min/persisters/with-schemas/index.js +1 -1
- package/min/persisters/with-schemas/index.js.gz +0 -0
- package/min/store/index.js +1 -1
- package/min/store/index.js.gz +0 -0
- package/min/store/with-schemas/index.js +1 -1
- package/min/store/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/index.js +1 -1
- package/min/synchronizers/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/index.js +1 -1
- package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/with-schemas/index.js +1 -1
- package/min/synchronizers/with-schemas/index.js.gz +0 -0
- package/min/ui-react-inspector/index.js +1 -1
- package/min/ui-react-inspector/index.js.gz +0 -0
- package/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/min/with-schemas/index.js +1 -1
- package/min/with-schemas/index.js.gz +0 -0
- package/package.json +8 -4
- package/persisters/index.js +293 -161
- package/persisters/persister-automerge/index.js +55 -50
- package/persisters/persister-automerge/with-schemas/index.js +55 -50
- package/persisters/persister-browser/index.js +56 -55
- package/persisters/persister-browser/with-schemas/index.js +56 -55
- package/persisters/persister-cr-sqlite-wasm/index.js +181 -134
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +181 -134
- package/persisters/persister-durable-object-storage/index.js +58 -53
- package/persisters/persister-durable-object-storage/with-schemas/index.js +58 -53
- package/persisters/persister-electric-sql/index.js +181 -134
- package/persisters/persister-electric-sql/with-schemas/index.js +181 -134
- package/persisters/persister-expo-sqlite/index.js +181 -134
- package/persisters/persister-expo-sqlite/with-schemas/index.js +181 -134
- package/persisters/persister-file/index.js +55 -50
- package/persisters/persister-file/with-schemas/index.js +55 -50
- package/persisters/persister-indexed-db/index.js +82 -78
- package/persisters/persister-indexed-db/with-schemas/index.js +82 -78
- package/persisters/persister-libsql/index.js +182 -135
- package/persisters/persister-libsql/with-schemas/index.js +182 -135
- package/persisters/persister-partykit-client/index.js +56 -51
- package/persisters/persister-partykit-client/with-schemas/index.js +56 -51
- package/persisters/persister-pglite/index.js +299 -173
- package/persisters/persister-pglite/with-schemas/index.js +299 -173
- package/persisters/persister-postgres/index.js +296 -171
- package/persisters/persister-postgres/with-schemas/index.js +296 -171
- package/persisters/persister-powersync/index.js +189 -138
- package/persisters/persister-powersync/with-schemas/index.js +189 -138
- package/persisters/persister-remote/index.js +55 -50
- package/persisters/persister-remote/with-schemas/index.js +55 -50
- package/persisters/persister-sqlite-bun/index.js +182 -135
- package/persisters/persister-sqlite-bun/with-schemas/index.js +182 -135
- package/persisters/persister-sqlite-wasm/index.js +182 -135
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +182 -135
- package/persisters/persister-sqlite3/index.js +181 -134
- package/persisters/persister-sqlite3/with-schemas/index.js +181 -134
- package/persisters/persister-yjs/index.js +55 -50
- package/persisters/persister-yjs/with-schemas/index.js +55 -50
- package/persisters/with-schemas/index.js +293 -161
- package/readme.md +2 -2
- package/releases.md +29 -1
- package/store/index.js +20 -15
- package/store/with-schemas/index.js +20 -15
- package/synchronizers/index.js +68 -63
- package/synchronizers/synchronizer-broadcast-channel/index.js +68 -63
- package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +68 -63
- package/synchronizers/synchronizer-local/index.js +68 -63
- package/synchronizers/synchronizer-local/with-schemas/index.js +68 -63
- package/synchronizers/synchronizer-ws-client/index.js +68 -63
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +68 -63
- package/synchronizers/synchronizer-ws-server/index.js +79 -70
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +79 -70
- package/synchronizers/synchronizer-ws-server-durable-object/index.js +69 -51
- package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +69 -51
- package/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/synchronizers/with-schemas/index.js +68 -63
- package/ui-react-inspector/index.js +68 -60
- package/ui-react-inspector/with-schemas/index.js +68 -60
- package/with-schemas/index.js +23 -17
|
@@ -3,7 +3,10 @@ const TINYBASE = 'tinybase';
|
|
|
3
3
|
const EMPTY_STRING = '';
|
|
4
4
|
const COMMA = ',';
|
|
5
5
|
const STRING = getTypeOf(EMPTY_STRING);
|
|
6
|
+
const TRUE = 'true';
|
|
6
7
|
const UNDEFINED = '\uFFFC';
|
|
8
|
+
const strReplace = (str, searchValue, replaceValue) =>
|
|
9
|
+
str.replace(searchValue, replaceValue);
|
|
7
10
|
|
|
8
11
|
const promise = Promise;
|
|
9
12
|
const THOUSAND = 1e3;
|
|
@@ -19,10 +22,19 @@ const isArray = (thing) => Array.isArray(thing);
|
|
|
19
22
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
20
23
|
const size = (arrayOrString) => arrayOrString.length;
|
|
21
24
|
const test = (regex, subject) => regex.test(subject);
|
|
25
|
+
const noop = () => {};
|
|
22
26
|
const promiseAll = async (promises) => promise.all(promises);
|
|
23
27
|
const errorNew = (message) => {
|
|
24
28
|
throw new Error(message);
|
|
25
29
|
};
|
|
30
|
+
const tryCatch = async (action, then1, then2) => {
|
|
31
|
+
try {
|
|
32
|
+
return await action();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
/* istanbul ignore next */
|
|
35
|
+
then1?.(error);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
26
38
|
|
|
27
39
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
28
40
|
const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
|
|
@@ -46,14 +58,20 @@ const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
|
|
|
46
58
|
const SELECT = 'SELECT';
|
|
47
59
|
const WHERE = 'WHERE';
|
|
48
60
|
const TABLE = 'TABLE';
|
|
61
|
+
const INSERT = 'INSERT';
|
|
62
|
+
const DELETE = 'DELETE';
|
|
63
|
+
const UPDATE = 'UPDATE';
|
|
49
64
|
const ALTER_TABLE = 'ALTER ' + TABLE;
|
|
50
|
-
const
|
|
51
|
-
const
|
|
65
|
+
const FROM = 'FROM';
|
|
66
|
+
const DELETE_FROM = DELETE + ' ' + FROM;
|
|
67
|
+
const SELECT_STAR_FROM = SELECT + '*' + FROM;
|
|
52
68
|
const PRAGMA = 'pragma_';
|
|
53
69
|
const DATA_VERSION = 'data_version';
|
|
54
70
|
const SCHEMA_VERSION = 'schema_version';
|
|
55
|
-
const FROM = 'FROM ';
|
|
56
71
|
const PRAGMA_TABLE = 'pragma_table_';
|
|
72
|
+
const CREATE = 'CREATE ';
|
|
73
|
+
const CREATE_TABLE = CREATE + TABLE;
|
|
74
|
+
const TABLE_NAME_PLACEHOLDER = '$tableName';
|
|
57
75
|
const getWrappedCommand = (executeCommand, onSqlCommand) =>
|
|
58
76
|
onSqlCommand
|
|
59
77
|
? async (sql, params) => {
|
|
@@ -61,7 +79,7 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
|
|
|
61
79
|
return await executeCommand(sql, params);
|
|
62
80
|
}
|
|
63
81
|
: executeCommand;
|
|
64
|
-
const escapeId = (str) => `"${str
|
|
82
|
+
const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
|
|
65
83
|
const escapeColumnNames = (...columnNames) =>
|
|
66
84
|
arrayJoin(arrayMap(columnNames, escapeId), COMMA);
|
|
67
85
|
const getPlaceholders = (array, offset = [1]) =>
|
|
@@ -69,6 +87,9 @@ const getPlaceholders = (array, offset = [1]) =>
|
|
|
69
87
|
arrayMap(array, () => '$' + offset[0]++),
|
|
70
88
|
COMMA,
|
|
71
89
|
);
|
|
90
|
+
const getWhereCondition = (tableName, condition = TRUE) =>
|
|
91
|
+
WHERE +
|
|
92
|
+
`(${strReplace(condition, TABLE_NAME_PLACEHOLDER, escapeId(tableName))})`;
|
|
72
93
|
|
|
73
94
|
const object = Object;
|
|
74
95
|
const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
|
|
@@ -103,6 +124,8 @@ const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
|
103
124
|
|
|
104
125
|
const mapNew = (entries) => new Map(entries);
|
|
105
126
|
const mapGet = (map, key) => map?.get(key);
|
|
127
|
+
const mapForEach = (map, cb) =>
|
|
128
|
+
collForEach(map, (value, key) => cb(key, value));
|
|
106
129
|
const mapMap = (coll, cb) =>
|
|
107
130
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
108
131
|
const mapSet = (map, key, value) =>
|
|
@@ -157,6 +180,7 @@ const TABLE_ID = 'tableId';
|
|
|
157
180
|
const TABLE_NAME = 'tableName';
|
|
158
181
|
const DELETE_EMPTY_COLUMNS = 'deleteEmptyColumns';
|
|
159
182
|
const DELETE_EMPTY_TABLE = 'deleteEmptyTable';
|
|
183
|
+
const CONDITION = 'condition';
|
|
160
184
|
const DEFAULT_CONFIG = {
|
|
161
185
|
mode: JSON$1,
|
|
162
186
|
[AUTO_LOAD_INTERVAL_SECONDS]: 1,
|
|
@@ -224,29 +248,42 @@ const getConfigStructures = (configOrStoreTableName) => {
|
|
|
224
248
|
const valuesTable = valuesConfig[2];
|
|
225
249
|
const managedTableNames = setNew(valuesTable);
|
|
226
250
|
const excludedTableNames = setNew(valuesTable);
|
|
227
|
-
const
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
251
|
+
const tablesLoadConfig = getDefaultedTabularConfigMap(
|
|
252
|
+
load,
|
|
253
|
+
{
|
|
254
|
+
[TABLE_ID]: null,
|
|
255
|
+
[ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME,
|
|
256
|
+
[CONDITION]: TRUE,
|
|
257
|
+
},
|
|
258
|
+
TABLE_ID,
|
|
259
|
+
(tableName) => collHas(excludedTableNames, tableName),
|
|
260
|
+
(tableName) => setAdd(managedTableNames, tableName),
|
|
261
|
+
);
|
|
262
|
+
const tablesSaveConfig = getDefaultedTabularConfigMap(
|
|
263
|
+
save,
|
|
264
|
+
{
|
|
265
|
+
[TABLE_NAME]: null,
|
|
266
|
+
[ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME,
|
|
267
|
+
[DELETE_EMPTY_COLUMNS]: 0,
|
|
268
|
+
[DELETE_EMPTY_TABLE]: 0,
|
|
269
|
+
[CONDITION]: null,
|
|
270
|
+
},
|
|
271
|
+
TABLE_NAME,
|
|
272
|
+
(_, tableName) => collHas(excludedTableNames, tableName),
|
|
273
|
+
(_, tableName) => setAdd(managedTableNames, tableName),
|
|
274
|
+
);
|
|
275
|
+
mapForEach(
|
|
276
|
+
tablesSaveConfig,
|
|
277
|
+
(_, tableSaveConfig) =>
|
|
278
|
+
(tableSaveConfig[4] ??=
|
|
279
|
+
mapGet(tablesLoadConfig, tableSaveConfig[0])?.[2] ?? TRUE),
|
|
280
|
+
);
|
|
281
|
+
return [
|
|
282
|
+
0,
|
|
283
|
+
autoLoadIntervalSeconds,
|
|
284
|
+
[tablesLoadConfig, tablesSaveConfig, valuesConfig],
|
|
285
|
+
managedTableNames,
|
|
248
286
|
];
|
|
249
|
-
return [0, autoLoadIntervalSeconds, tabularConfig, managedTableNames];
|
|
250
287
|
};
|
|
251
288
|
|
|
252
289
|
const jsonString = JSON.stringify;
|
|
@@ -412,12 +449,7 @@ const createCustomPersister = (
|
|
|
412
449
|
while (
|
|
413
450
|
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
414
451
|
) {
|
|
415
|
-
|
|
416
|
-
await action();
|
|
417
|
-
} catch (error) {
|
|
418
|
-
/* istanbul ignore next */
|
|
419
|
-
onIgnoredError?.(error);
|
|
420
|
-
}
|
|
452
|
+
await tryCatch(action, onIgnoredError);
|
|
421
453
|
}
|
|
422
454
|
mapSet(scheduleRunning, scheduleId, 0);
|
|
423
455
|
}
|
|
@@ -437,21 +469,23 @@ const createCustomPersister = (
|
|
|
437
469
|
setStatus(1 /* Loading */);
|
|
438
470
|
loads++;
|
|
439
471
|
await schedule(async () => {
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
472
|
+
await tryCatch(
|
|
473
|
+
async () => {
|
|
474
|
+
const content = await getPersisted();
|
|
475
|
+
if (isArray(content)) {
|
|
476
|
+
setContentOrChanges(content);
|
|
477
|
+
} else if (initialContent) {
|
|
478
|
+
setDefaultContent(initialContent);
|
|
479
|
+
} else {
|
|
480
|
+
errorNew(`Content is not an array: ${content}`);
|
|
481
|
+
}
|
|
482
|
+
},
|
|
483
|
+
() => {
|
|
484
|
+
if (initialContent) {
|
|
485
|
+
setDefaultContent(initialContent);
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
);
|
|
455
489
|
setStatus(0 /* Idle */);
|
|
456
490
|
});
|
|
457
491
|
}
|
|
@@ -460,29 +494,33 @@ const createCustomPersister = (
|
|
|
460
494
|
const startAutoLoad = async (initialContent) => {
|
|
461
495
|
stopAutoLoad();
|
|
462
496
|
await load(initialContent);
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
497
|
+
await tryCatch(
|
|
498
|
+
async () =>
|
|
499
|
+
(autoLoadHandle = await addPersisterListener(
|
|
500
|
+
async (content, changes) => {
|
|
501
|
+
if (changes || content) {
|
|
502
|
+
/* istanbul ignore else */
|
|
503
|
+
if (status != 2 /* Saving */) {
|
|
504
|
+
setStatus(1 /* Loading */);
|
|
505
|
+
loads++;
|
|
506
|
+
setContentOrChanges(changes ?? content);
|
|
507
|
+
setStatus(0 /* Idle */);
|
|
508
|
+
}
|
|
509
|
+
} else {
|
|
510
|
+
await load();
|
|
511
|
+
}
|
|
512
|
+
},
|
|
513
|
+
)),
|
|
514
|
+
onIgnoredError,
|
|
515
|
+
);
|
|
481
516
|
return persister;
|
|
482
517
|
};
|
|
483
|
-
const stopAutoLoad = () => {
|
|
518
|
+
const stopAutoLoad = async () => {
|
|
484
519
|
if (autoLoadHandle) {
|
|
485
|
-
|
|
520
|
+
await tryCatch(
|
|
521
|
+
() => delPersisterListener(autoLoadHandle),
|
|
522
|
+
onIgnoredError,
|
|
523
|
+
);
|
|
486
524
|
autoLoadHandle = void 0;
|
|
487
525
|
}
|
|
488
526
|
return persister;
|
|
@@ -494,12 +532,7 @@ const createCustomPersister = (
|
|
|
494
532
|
setStatus(2 /* Saving */);
|
|
495
533
|
saves++;
|
|
496
534
|
await schedule(async () => {
|
|
497
|
-
|
|
498
|
-
await setPersisted(getContent, changes);
|
|
499
|
-
} catch (error) {
|
|
500
|
-
/* istanbul ignore next */
|
|
501
|
-
onIgnoredError?.(error);
|
|
502
|
-
}
|
|
535
|
+
await tryCatch(() => setPersisted(getContent, changes), onIgnoredError);
|
|
503
536
|
setStatus(0 /* Idle */);
|
|
504
537
|
});
|
|
505
538
|
}
|
|
@@ -516,7 +549,7 @@ const createCustomPersister = (
|
|
|
516
549
|
});
|
|
517
550
|
return persister;
|
|
518
551
|
};
|
|
519
|
-
const stopAutoSave = () => {
|
|
552
|
+
const stopAutoSave = async () => {
|
|
520
553
|
if (autoSaveListenerId) {
|
|
521
554
|
store.delListener(autoSaveListenerId);
|
|
522
555
|
autoSaveListenerId = void 0;
|
|
@@ -537,9 +570,10 @@ const createCustomPersister = (
|
|
|
537
570
|
return persister;
|
|
538
571
|
};
|
|
539
572
|
const getStore = () => store;
|
|
540
|
-
const destroy = () => {
|
|
573
|
+
const destroy = async () => {
|
|
541
574
|
arrayClear(mapGet(scheduleActions, scheduleId));
|
|
542
|
-
|
|
575
|
+
await persister.stopAutoLoad();
|
|
576
|
+
return await persister.stopAutoSave();
|
|
543
577
|
};
|
|
544
578
|
const getStats = () => ({loads, saves});
|
|
545
579
|
const persister = {
|
|
@@ -583,13 +617,15 @@ const getCommandFunctions = (
|
|
|
583
617
|
({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
|
|
584
618
|
);
|
|
585
619
|
};
|
|
586
|
-
const loadTable = async (tableName, rowIdColumnName) =>
|
|
620
|
+
const loadTable = async (tableName, rowIdColumnName, condition) =>
|
|
587
621
|
canSelect(tableName, rowIdColumnName)
|
|
588
622
|
? objNew(
|
|
589
623
|
arrayFilter(
|
|
590
624
|
arrayMap(
|
|
591
625
|
await databaseExecuteCommand(
|
|
592
|
-
SELECT_STAR_FROM +
|
|
626
|
+
SELECT_STAR_FROM +
|
|
627
|
+
escapeId(tableName) +
|
|
628
|
+
getWhereCondition(tableName, condition),
|
|
593
629
|
),
|
|
594
630
|
(row) => [
|
|
595
631
|
row[rowIdColumnName],
|
|
@@ -609,6 +645,7 @@ const getCommandFunctions = (
|
|
|
609
645
|
deleteEmptyColumns,
|
|
610
646
|
deleteEmptyTable,
|
|
611
647
|
partial = false,
|
|
648
|
+
condition = TRUE,
|
|
612
649
|
) => {
|
|
613
650
|
const settingColumnNameSet = setNew();
|
|
614
651
|
objMap(content ?? {}, (contentRow) =>
|
|
@@ -620,6 +657,7 @@ const getCommandFunctions = (
|
|
|
620
657
|
if (
|
|
621
658
|
!partial &&
|
|
622
659
|
deleteEmptyTable &&
|
|
660
|
+
condition == TRUE &&
|
|
623
661
|
arrayIsEmpty(settingColumnNames) &&
|
|
624
662
|
collHas(schemaMap, tableName)
|
|
625
663
|
) {
|
|
@@ -632,8 +670,7 @@ const getCommandFunctions = (
|
|
|
632
670
|
if (!arrayIsEmpty(settingColumnNames)) {
|
|
633
671
|
if (!collHas(schemaMap, tableName)) {
|
|
634
672
|
await databaseExecuteCommand(
|
|
635
|
-
|
|
636
|
-
TABLE +
|
|
673
|
+
CREATE_TABLE +
|
|
637
674
|
escapeId(tableName) +
|
|
638
675
|
`(${escapeId(rowIdColumnName)}${columnType} PRIMARY KEY${arrayJoin(
|
|
639
676
|
arrayMap(
|
|
@@ -696,7 +733,9 @@ const getCommandFunctions = (
|
|
|
696
733
|
if (partial) {
|
|
697
734
|
if (isUndefined(content)) {
|
|
698
735
|
await databaseExecuteCommand(
|
|
699
|
-
DELETE_FROM +
|
|
736
|
+
DELETE_FROM +
|
|
737
|
+
escapeId(tableName) +
|
|
738
|
+
getWhereCondition(tableName, condition),
|
|
700
739
|
);
|
|
701
740
|
} else {
|
|
702
741
|
await promiseAll(
|
|
@@ -705,9 +744,8 @@ const getCommandFunctions = (
|
|
|
705
744
|
await databaseExecuteCommand(
|
|
706
745
|
DELETE_FROM +
|
|
707
746
|
escapeId(tableName) +
|
|
708
|
-
|
|
709
|
-
escapeId(rowIdColumnName)
|
|
710
|
-
'=$1',
|
|
747
|
+
getWhereCondition(tableName, condition) +
|
|
748
|
+
`AND(${escapeId(rowIdColumnName)}=$1)`,
|
|
711
749
|
[rowId],
|
|
712
750
|
);
|
|
713
751
|
} else if (!arrayIsEmpty(settingColumnNames)) {
|
|
@@ -751,14 +789,15 @@ const getCommandFunctions = (
|
|
|
751
789
|
await databaseExecuteCommand(
|
|
752
790
|
DELETE_FROM +
|
|
753
791
|
escapeId(tableName) +
|
|
754
|
-
|
|
755
|
-
escapeId(rowIdColumnName)
|
|
756
|
-
`NOT IN(${getPlaceholders(deleteRowIds)})`,
|
|
792
|
+
getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
|
|
793
|
+
`AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
|
|
757
794
|
deleteRowIds,
|
|
758
795
|
);
|
|
759
796
|
} else if (collHas(schemaMap, tableName)) {
|
|
760
797
|
await databaseExecuteCommand(
|
|
761
|
-
DELETE_FROM +
|
|
798
|
+
DELETE_FROM +
|
|
799
|
+
escapeId(tableName) +
|
|
800
|
+
getWhereCondition(tableName, condition),
|
|
762
801
|
);
|
|
763
802
|
}
|
|
764
803
|
}
|
|
@@ -766,11 +805,7 @@ const getCommandFunctions = (
|
|
|
766
805
|
const transaction = async (actions) => {
|
|
767
806
|
let result;
|
|
768
807
|
await databaseExecuteCommand('BEGIN');
|
|
769
|
-
|
|
770
|
-
result = await actions();
|
|
771
|
-
} catch (error) {
|
|
772
|
-
onIgnoredError?.(error);
|
|
773
|
-
}
|
|
808
|
+
await tryCatch(async () => (result = await actions()), onIgnoredError);
|
|
774
809
|
await databaseExecuteCommand('END');
|
|
775
810
|
return result;
|
|
776
811
|
};
|
|
@@ -785,7 +820,8 @@ const defaultUpsert = async (
|
|
|
785
820
|
) => {
|
|
786
821
|
const offset = [1];
|
|
787
822
|
await executeCommand(
|
|
788
|
-
|
|
823
|
+
INSERT +
|
|
824
|
+
' INTO' +
|
|
789
825
|
escapeId(tableName) +
|
|
790
826
|
'(' +
|
|
791
827
|
escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
|
|
@@ -800,7 +836,7 @@ const defaultUpsert = async (
|
|
|
800
836
|
) +
|
|
801
837
|
'ON CONFLICT(' +
|
|
802
838
|
escapeId(rowIdColumnName) +
|
|
803
|
-
|
|
839
|
+
`)DO ${UPDATE} SET` +
|
|
804
840
|
arrayJoin(
|
|
805
841
|
arrayMap(
|
|
806
842
|
changingColumnNames,
|
|
@@ -822,7 +858,7 @@ const createJsonPersister = (
|
|
|
822
858
|
addPersisterListener,
|
|
823
859
|
delPersisterListener,
|
|
824
860
|
onIgnoredError,
|
|
825
|
-
|
|
861
|
+
extraDestroy,
|
|
826
862
|
persist,
|
|
827
863
|
[storeTableName, storeIdColumnName, storeColumnName],
|
|
828
864
|
managedTableNames,
|
|
@@ -841,8 +877,8 @@ const createJsonPersister = (
|
|
|
841
877
|
columnType,
|
|
842
878
|
upsert,
|
|
843
879
|
);
|
|
844
|
-
const getPersisted =
|
|
845
|
-
|
|
880
|
+
const getPersisted = () =>
|
|
881
|
+
transaction(async () => {
|
|
846
882
|
await refreshSchema();
|
|
847
883
|
return jsonParseWithUndefined(
|
|
848
884
|
(await loadTable(storeTableName, storeIdColumnName))[SINGLE_ROW_ID]?.[
|
|
@@ -850,8 +886,8 @@ const createJsonPersister = (
|
|
|
850
886
|
] ?? 'null',
|
|
851
887
|
);
|
|
852
888
|
});
|
|
853
|
-
const setPersisted =
|
|
854
|
-
|
|
889
|
+
const setPersisted = (getContent) =>
|
|
890
|
+
transaction(async () => {
|
|
855
891
|
await refreshSchema();
|
|
856
892
|
await saveTable(
|
|
857
893
|
storeTableName,
|
|
@@ -865,9 +901,10 @@ const createJsonPersister = (
|
|
|
865
901
|
true,
|
|
866
902
|
);
|
|
867
903
|
});
|
|
868
|
-
const destroy = () => {
|
|
869
|
-
persister.stopAutoLoad()
|
|
870
|
-
|
|
904
|
+
const destroy = async () => {
|
|
905
|
+
await persister.stopAutoLoad();
|
|
906
|
+
await persister.stopAutoSave();
|
|
907
|
+
extraDestroy();
|
|
871
908
|
return persister;
|
|
872
909
|
};
|
|
873
910
|
const persister = createCustomPersister(
|
|
@@ -891,7 +928,7 @@ const createTabularPersister = (
|
|
|
891
928
|
addPersisterListener,
|
|
892
929
|
delPersisterListener,
|
|
893
930
|
onIgnoredError,
|
|
894
|
-
|
|
931
|
+
extraDestroy,
|
|
895
932
|
persist,
|
|
896
933
|
[
|
|
897
934
|
tablesLoadConfig,
|
|
@@ -918,12 +955,18 @@ const createTabularPersister = (
|
|
|
918
955
|
encode,
|
|
919
956
|
decode,
|
|
920
957
|
);
|
|
921
|
-
const saveTables =
|
|
922
|
-
|
|
958
|
+
const saveTables = (tables, partial) =>
|
|
959
|
+
promiseAll(
|
|
923
960
|
mapMap(
|
|
924
961
|
tablesSaveConfig,
|
|
925
962
|
async (
|
|
926
|
-
[
|
|
963
|
+
[
|
|
964
|
+
tableName,
|
|
965
|
+
rowIdColumnName,
|
|
966
|
+
deleteEmptyColumns,
|
|
967
|
+
deleteEmptyTable,
|
|
968
|
+
condition,
|
|
969
|
+
],
|
|
927
970
|
tableId,
|
|
928
971
|
) => {
|
|
929
972
|
if (!partial || objHas(tables, tableId)) {
|
|
@@ -934,6 +977,7 @@ const createTabularPersister = (
|
|
|
934
977
|
deleteEmptyColumns,
|
|
935
978
|
deleteEmptyTable,
|
|
936
979
|
partial,
|
|
980
|
+
condition,
|
|
937
981
|
);
|
|
938
982
|
}
|
|
939
983
|
},
|
|
@@ -956,9 +1000,9 @@ const createTabularPersister = (
|
|
|
956
1000
|
await promiseAll(
|
|
957
1001
|
mapMap(
|
|
958
1002
|
tablesLoadConfig,
|
|
959
|
-
async ([tableId, rowIdColumnName], tableName) => [
|
|
1003
|
+
async ([tableId, rowIdColumnName, condition], tableName) => [
|
|
960
1004
|
tableId,
|
|
961
|
-
await loadTable(tableName, rowIdColumnName),
|
|
1005
|
+
await loadTable(tableName, rowIdColumnName, condition),
|
|
962
1006
|
],
|
|
963
1007
|
),
|
|
964
1008
|
),
|
|
@@ -971,8 +1015,8 @@ const createTabularPersister = (
|
|
|
971
1015
|
SINGLE_ROW_ID
|
|
972
1016
|
]
|
|
973
1017
|
: {};
|
|
974
|
-
const getPersisted =
|
|
975
|
-
|
|
1018
|
+
const getPersisted = () =>
|
|
1019
|
+
transaction(async () => {
|
|
976
1020
|
await refreshSchema();
|
|
977
1021
|
const tables = await loadTables();
|
|
978
1022
|
const values = await loadValues();
|
|
@@ -980,8 +1024,8 @@ const createTabularPersister = (
|
|
|
980
1024
|
? [tables, values]
|
|
981
1025
|
: void 0;
|
|
982
1026
|
});
|
|
983
|
-
const setPersisted =
|
|
984
|
-
|
|
1027
|
+
const setPersisted = (getContent, changes) =>
|
|
1028
|
+
transaction(async () => {
|
|
985
1029
|
await refreshSchema();
|
|
986
1030
|
if (!isUndefined(changes)) {
|
|
987
1031
|
await saveTables(changes[0], true);
|
|
@@ -992,9 +1036,10 @@ const createTabularPersister = (
|
|
|
992
1036
|
await saveValues(values);
|
|
993
1037
|
}
|
|
994
1038
|
});
|
|
995
|
-
const destroy = () => {
|
|
996
|
-
persister.stopAutoLoad()
|
|
997
|
-
|
|
1039
|
+
const destroy = async () => {
|
|
1040
|
+
await persister.stopAutoLoad();
|
|
1041
|
+
await persister.stopAutoSave();
|
|
1042
|
+
extraDestroy();
|
|
998
1043
|
return persister;
|
|
999
1044
|
};
|
|
1000
1045
|
const persister = createCustomPersister(
|
|
@@ -1039,22 +1084,24 @@ const createCustomSqlitePersister = (
|
|
|
1039
1084
|
const addPersisterListener = (listener) => {
|
|
1040
1085
|
let interval;
|
|
1041
1086
|
const startPolling = () =>
|
|
1042
|
-
(interval = startInterval(
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
if (dataVersion !=
|
|
1050
|
-
|
|
1087
|
+
(interval = startInterval(
|
|
1088
|
+
() =>
|
|
1089
|
+
tryCatch(async () => {
|
|
1090
|
+
const [{d, s, c}] = await executeCommand(
|
|
1091
|
+
SELECT + // eslint-disable-next-line max-len
|
|
1092
|
+
` ${DATA_VERSION} d,${SCHEMA_VERSION} s,TOTAL_CHANGES() c FROM ${PRAGMA}${DATA_VERSION} JOIN ${PRAGMA}${SCHEMA_VERSION}`,
|
|
1093
|
+
);
|
|
1094
|
+
if (d != dataVersion || s != schemaVersion || c != totalChanges) {
|
|
1095
|
+
if (dataVersion != null) {
|
|
1096
|
+
listener();
|
|
1097
|
+
}
|
|
1098
|
+
dataVersion = d;
|
|
1099
|
+
schemaVersion = s;
|
|
1100
|
+
totalChanges = c;
|
|
1051
1101
|
}
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
}
|
|
1056
|
-
} catch {}
|
|
1057
|
-
}, autoLoadIntervalSeconds));
|
|
1102
|
+
}),
|
|
1103
|
+
autoLoadIntervalSeconds,
|
|
1104
|
+
));
|
|
1058
1105
|
const stopPolling = () => {
|
|
1059
1106
|
dataVersion = schemaVersion = totalChanges = null;
|
|
1060
1107
|
stopInterval(interval);
|
|
@@ -1086,8 +1133,8 @@ const createCustomSqlitePersister = (
|
|
|
1086
1133
|
collValues(managedTableNamesSet),
|
|
1087
1134
|
async (executeCommand2, managedTableNames) =>
|
|
1088
1135
|
await executeCommand2(
|
|
1089
|
-
// eslint-disable-next-line max-len
|
|
1090
|
-
|
|
1136
|
+
SELECT + // eslint-disable-next-line max-len
|
|
1137
|
+
` t.name tn,c.name cn FROM ${PRAGMA_TABLE}list()t,${PRAGMA_TABLE}info(t.name)c ${WHERE} t.schema='main'AND t.type IN('table','view')AND t.name IN(${getPlaceholders(managedTableNames)})ORDER BY t.name,c.name`,
|
|
1091
1138
|
managedTableNames,
|
|
1092
1139
|
),
|
|
1093
1140
|
thing,
|
|
@@ -1121,10 +1168,10 @@ const createSqliteWasmPersister = (
|
|
|
1121
1168
|
(_, _2, _3, tableName) => listener(tableName),
|
|
1122
1169
|
0,
|
|
1123
1170
|
),
|
|
1124
|
-
() => sqlite3.capi.sqlite3_update_hook(db,
|
|
1171
|
+
() => sqlite3.capi.sqlite3_update_hook(db, noop, 0),
|
|
1125
1172
|
onSqlCommand,
|
|
1126
1173
|
onIgnoredError,
|
|
1127
|
-
|
|
1174
|
+
noop,
|
|
1128
1175
|
3,
|
|
1129
1176
|
// StoreOrMergeableStore,
|
|
1130
1177
|
db,
|