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