tinybase 6.1.0-beta.3 → 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 +83 -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 +159 -0
  29. package/@types/persisters/persister-sqlite-bun/with-schemas/index.d.ts +178 -0
  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 +87 -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 -0
  119. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  120. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -0
  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 +46 -6
  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 +1171 -0
  205. package/persisters/persister-sqlite-bun/with-schemas/index.js +1171 -0
  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,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);
@@ -85,14 +97,21 @@ const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
85
97
  const SELECT = 'SELECT';
86
98
  const WHERE = 'WHERE';
87
99
  const TABLE = 'TABLE';
100
+ const INSERT = 'INSERT';
101
+ const DELETE = 'DELETE';
102
+ const UPDATE = 'UPDATE';
88
103
  const ALTER_TABLE = 'ALTER ' + TABLE;
89
- const DELETE_FROM = 'DELETE FROM';
90
- const SELECT_STAR_FROM = SELECT + '*FROM';
104
+ const FROM = 'FROM';
105
+ const DELETE_FROM = DELETE + ' ' + FROM;
106
+ const SELECT_STAR_FROM = SELECT + '*' + FROM;
91
107
  const PRAGMA = 'pragma_';
92
108
  const DATA_VERSION = 'data_version';
93
109
  const SCHEMA_VERSION = 'schema_version';
94
- const FROM = 'FROM ';
95
110
  const PRAGMA_TABLE = 'pragma_table_';
111
+ const CREATE = 'CREATE ';
112
+ const CREATE_TABLE = CREATE + TABLE;
113
+ const OR_REPLACE = 'OR REPLACE ';
114
+ const TABLE_NAME_PLACEHOLDER = '$tableName';
96
115
  const getWrappedCommand = (executeCommand, onSqlCommand) =>
97
116
  onSqlCommand
98
117
  ? async (sql, params) => {
@@ -100,7 +119,7 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
100
119
  return await executeCommand(sql, params);
101
120
  }
102
121
  : executeCommand;
103
- const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
122
+ const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
104
123
  const escapeColumnNames = (...columnNames) =>
105
124
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
106
125
  const getPlaceholders = (array, offset = [1]) =>
@@ -108,9 +127,14 @@ const getPlaceholders = (array, offset = [1]) =>
108
127
  arrayMap(array, () => '$' + offset[0]++),
109
128
  COMMA,
110
129
  );
130
+ const getWhereCondition = (tableName, condition = TRUE) =>
131
+ WHERE +
132
+ `(${strReplace(condition, TABLE_NAME_PLACEHOLDER, escapeId(tableName))})`;
111
133
 
112
134
  const mapNew = (entries) => new Map(entries);
113
135
  const mapGet = (map, key) => map?.get(key);
136
+ const mapForEach = (map, cb) =>
137
+ collForEach(map, (value, key) => cb(key, value));
114
138
  const mapMap = (coll, cb) =>
115
139
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
116
140
  const mapSet = (map, key, value) =>
@@ -157,6 +181,7 @@ const TABLE_ID = 'tableId';
157
181
  const TABLE_NAME = 'tableName';
158
182
  const DELETE_EMPTY_COLUMNS = 'deleteEmptyColumns';
159
183
  const DELETE_EMPTY_TABLE = 'deleteEmptyTable';
184
+ const CONDITION = 'condition';
160
185
  const DEFAULT_CONFIG = {
161
186
  mode: JSON$1,
162
187
  [AUTO_LOAD_INTERVAL_SECONDS]: 1,
@@ -224,29 +249,42 @@ const getConfigStructures = (configOrStoreTableName) => {
224
249
  const valuesTable = valuesConfig[2];
225
250
  const managedTableNames = setNew(valuesTable);
226
251
  const excludedTableNames = setNew(valuesTable);
227
- const tabularConfig = [
228
- getDefaultedTabularConfigMap(
229
- load,
230
- {[TABLE_ID]: null, [ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME},
231
- TABLE_ID,
232
- (tableName) => collHas(excludedTableNames, tableName),
233
- (tableName) => setAdd(managedTableNames, tableName),
234
- ),
235
- getDefaultedTabularConfigMap(
236
- save,
237
- {
238
- [TABLE_NAME]: null,
239
- [ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME,
240
- [DELETE_EMPTY_COLUMNS]: 0,
241
- [DELETE_EMPTY_TABLE]: 0,
242
- },
243
- TABLE_NAME,
244
- (_, tableName) => collHas(excludedTableNames, tableName),
245
- (_, tableName) => setAdd(managedTableNames, tableName),
246
- ),
247
- 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,
248
287
  ];
249
- return [0, autoLoadIntervalSeconds, tabularConfig, managedTableNames];
250
288
  };
251
289
 
252
290
  const jsonString = JSON.stringify;
@@ -412,12 +450,7 @@ const createCustomPersister = (
412
450
  while (
413
451
  !isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
414
452
  ) {
415
- try {
416
- await action();
417
- } catch (error) {
418
- /* istanbul ignore next */
419
- onIgnoredError?.(error);
420
- }
453
+ await tryCatch(action, onIgnoredError);
421
454
  }
422
455
  mapSet(scheduleRunning, scheduleId, 0);
423
456
  }
@@ -437,21 +470,23 @@ const createCustomPersister = (
437
470
  setStatus(1 /* Loading */);
438
471
  loads++;
439
472
  await schedule(async () => {
440
- try {
441
- const content = await getPersisted();
442
- if (isArray(content)) {
443
- setContentOrChanges(content);
444
- } else if (initialContent) {
445
- setDefaultContent(initialContent);
446
- } else {
447
- errorNew(`Content is not an array: ${content}`);
448
- }
449
- } catch (error) {
450
- onIgnoredError?.(error);
451
- if (initialContent) {
452
- setDefaultContent(initialContent);
453
- }
454
- }
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
+ );
455
490
  setStatus(0 /* Idle */);
456
491
  });
457
492
  }
@@ -460,29 +495,33 @@ const createCustomPersister = (
460
495
  const startAutoLoad = async (initialContent) => {
461
496
  stopAutoLoad();
462
497
  await load(initialContent);
463
- try {
464
- autoLoadHandle = await addPersisterListener(async (content, changes) => {
465
- if (changes || content) {
466
- /* istanbul ignore else */
467
- if (status != 2 /* Saving */) {
468
- setStatus(1 /* Loading */);
469
- loads++;
470
- setContentOrChanges(changes ?? content);
471
- setStatus(0 /* Idle */);
472
- }
473
- } else {
474
- await load();
475
- }
476
- });
477
- } catch (error) {
478
- /* istanbul ignore next */
479
- onIgnoredError?.(error);
480
- }
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
+ );
481
517
  return persister;
482
518
  };
483
- const stopAutoLoad = () => {
519
+ const stopAutoLoad = async () => {
484
520
  if (autoLoadHandle) {
485
- delPersisterListener(autoLoadHandle);
521
+ await tryCatch(
522
+ () => delPersisterListener(autoLoadHandle),
523
+ onIgnoredError,
524
+ );
486
525
  autoLoadHandle = void 0;
487
526
  }
488
527
  return persister;
@@ -494,12 +533,7 @@ const createCustomPersister = (
494
533
  setStatus(2 /* Saving */);
495
534
  saves++;
496
535
  await schedule(async () => {
497
- try {
498
- await setPersisted(getContent, changes);
499
- } catch (error) {
500
- /* istanbul ignore next */
501
- onIgnoredError?.(error);
502
- }
536
+ await tryCatch(() => setPersisted(getContent, changes), onIgnoredError);
503
537
  setStatus(0 /* Idle */);
504
538
  });
505
539
  }
@@ -516,7 +550,7 @@ const createCustomPersister = (
516
550
  });
517
551
  return persister;
518
552
  };
519
- const stopAutoSave = () => {
553
+ const stopAutoSave = async () => {
520
554
  if (autoSaveListenerId) {
521
555
  store.delListener(autoSaveListenerId);
522
556
  autoSaveListenerId = void 0;
@@ -537,9 +571,10 @@ const createCustomPersister = (
537
571
  return persister;
538
572
  };
539
573
  const getStore = () => store;
540
- const destroy = () => {
574
+ const destroy = async () => {
541
575
  arrayClear(mapGet(scheduleActions, scheduleId));
542
- return stopAutoLoad().stopAutoSave();
576
+ await persister.stopAutoLoad();
577
+ return await persister.stopAutoSave();
543
578
  };
544
579
  const getStats = () => ({loads, saves});
545
580
  const persister = {
@@ -583,13 +618,15 @@ const getCommandFunctions = (
583
618
  ({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
584
619
  );
585
620
  };
586
- const loadTable = async (tableName, rowIdColumnName) =>
621
+ const loadTable = async (tableName, rowIdColumnName, condition) =>
587
622
  canSelect(tableName, rowIdColumnName)
588
623
  ? objNew(
589
624
  arrayFilter(
590
625
  arrayMap(
591
626
  await databaseExecuteCommand(
592
- SELECT_STAR_FROM + escapeId(tableName),
627
+ SELECT_STAR_FROM +
628
+ escapeId(tableName) +
629
+ getWhereCondition(tableName, condition),
593
630
  ),
594
631
  (row) => [
595
632
  row[rowIdColumnName],
@@ -609,6 +646,7 @@ const getCommandFunctions = (
609
646
  deleteEmptyColumns,
610
647
  deleteEmptyTable,
611
648
  partial = false,
649
+ condition = TRUE,
612
650
  ) => {
613
651
  const settingColumnNameSet = setNew();
614
652
  objMap(content ?? {}, (contentRow) =>
@@ -620,6 +658,7 @@ const getCommandFunctions = (
620
658
  if (
621
659
  !partial &&
622
660
  deleteEmptyTable &&
661
+ condition == TRUE &&
623
662
  arrayIsEmpty(settingColumnNames) &&
624
663
  collHas(schemaMap, tableName)
625
664
  ) {
@@ -632,8 +671,7 @@ const getCommandFunctions = (
632
671
  if (!arrayIsEmpty(settingColumnNames)) {
633
672
  if (!collHas(schemaMap, tableName)) {
634
673
  await databaseExecuteCommand(
635
- 'CREATE ' +
636
- TABLE +
674
+ CREATE_TABLE +
637
675
  escapeId(tableName) +
638
676
  `(${escapeId(rowIdColumnName)}${columnType} PRIMARY KEY${arrayJoin(
639
677
  arrayMap(
@@ -696,7 +734,9 @@ const getCommandFunctions = (
696
734
  if (partial) {
697
735
  if (isUndefined(content)) {
698
736
  await databaseExecuteCommand(
699
- DELETE_FROM + escapeId(tableName) + WHERE + ' true',
737
+ DELETE_FROM +
738
+ escapeId(tableName) +
739
+ getWhereCondition(tableName, condition),
700
740
  );
701
741
  } else {
702
742
  await promiseAll(
@@ -705,9 +745,8 @@ const getCommandFunctions = (
705
745
  await databaseExecuteCommand(
706
746
  DELETE_FROM +
707
747
  escapeId(tableName) +
708
- WHERE +
709
- escapeId(rowIdColumnName) +
710
- '=$1',
748
+ getWhereCondition(tableName, condition) +
749
+ `AND(${escapeId(rowIdColumnName)}=$1)`,
711
750
  [rowId],
712
751
  );
713
752
  } else if (!arrayIsEmpty(settingColumnNames)) {
@@ -751,14 +790,15 @@ const getCommandFunctions = (
751
790
  await databaseExecuteCommand(
752
791
  DELETE_FROM +
753
792
  escapeId(tableName) +
754
- WHERE +
755
- escapeId(rowIdColumnName) +
756
- `NOT IN(${getPlaceholders(deleteRowIds)})`,
793
+ getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
794
+ `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
757
795
  deleteRowIds,
758
796
  );
759
797
  } else if (collHas(schemaMap, tableName)) {
760
798
  await databaseExecuteCommand(
761
- DELETE_FROM + escapeId(tableName) + WHERE + ' true',
799
+ DELETE_FROM +
800
+ escapeId(tableName) +
801
+ getWhereCondition(tableName, condition),
762
802
  );
763
803
  }
764
804
  }
@@ -766,11 +806,7 @@ const getCommandFunctions = (
766
806
  const transaction = async (actions) => {
767
807
  let result;
768
808
  await databaseExecuteCommand('BEGIN');
769
- try {
770
- result = await actions();
771
- } catch (error) {
772
- onIgnoredError?.(error);
773
- }
809
+ await tryCatch(async () => (result = await actions()), onIgnoredError);
774
810
  await databaseExecuteCommand('END');
775
811
  return result;
776
812
  };
@@ -785,7 +821,8 @@ const defaultUpsert = async (
785
821
  ) => {
786
822
  const offset = [1];
787
823
  await executeCommand(
788
- 'INSERT INTO' +
824
+ INSERT +
825
+ ' INTO' +
789
826
  escapeId(tableName) +
790
827
  '(' +
791
828
  escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
@@ -800,7 +837,7 @@ const defaultUpsert = async (
800
837
  ) +
801
838
  'ON CONFLICT(' +
802
839
  escapeId(rowIdColumnName) +
803
- ')DO UPDATE SET' +
840
+ `)DO ${UPDATE} SET` +
804
841
  arrayJoin(
805
842
  arrayMap(
806
843
  changingColumnNames,
@@ -822,7 +859,7 @@ const createJsonPersister = (
822
859
  addPersisterListener,
823
860
  delPersisterListener,
824
861
  onIgnoredError,
825
- destroyImpl,
862
+ extraDestroy,
826
863
  persist,
827
864
  [storeTableName, storeIdColumnName, storeColumnName],
828
865
  managedTableNames,
@@ -841,8 +878,8 @@ const createJsonPersister = (
841
878
  columnType,
842
879
  upsert,
843
880
  );
844
- const getPersisted = async () =>
845
- await transaction(async () => {
881
+ const getPersisted = () =>
882
+ transaction(async () => {
846
883
  await refreshSchema();
847
884
  return jsonParseWithUndefined(
848
885
  (await loadTable(storeTableName, storeIdColumnName))[SINGLE_ROW_ID]?.[
@@ -850,8 +887,8 @@ const createJsonPersister = (
850
887
  ] ?? 'null',
851
888
  );
852
889
  });
853
- const setPersisted = async (getContent) =>
854
- await transaction(async () => {
890
+ const setPersisted = (getContent) =>
891
+ transaction(async () => {
855
892
  await refreshSchema();
856
893
  await saveTable(
857
894
  storeTableName,
@@ -865,9 +902,10 @@ const createJsonPersister = (
865
902
  true,
866
903
  );
867
904
  });
868
- const destroy = () => {
869
- persister.stopAutoLoad().stopAutoSave();
870
- destroyImpl();
905
+ const destroy = async () => {
906
+ await persister.stopAutoLoad();
907
+ await persister.stopAutoSave();
908
+ extraDestroy();
871
909
  return persister;
872
910
  };
873
911
  const persister = createCustomPersister(
@@ -891,7 +929,7 @@ const createTabularPersister = (
891
929
  addPersisterListener,
892
930
  delPersisterListener,
893
931
  onIgnoredError,
894
- destroyImpl,
932
+ extraDestroy,
895
933
  persist,
896
934
  [
897
935
  tablesLoadConfig,
@@ -918,12 +956,18 @@ const createTabularPersister = (
918
956
  encode,
919
957
  decode,
920
958
  );
921
- const saveTables = async (tables, partial) =>
922
- await promiseAll(
959
+ const saveTables = (tables, partial) =>
960
+ promiseAll(
923
961
  mapMap(
924
962
  tablesSaveConfig,
925
963
  async (
926
- [tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
964
+ [
965
+ tableName,
966
+ rowIdColumnName,
967
+ deleteEmptyColumns,
968
+ deleteEmptyTable,
969
+ condition,
970
+ ],
927
971
  tableId,
928
972
  ) => {
929
973
  if (!partial || objHas(tables, tableId)) {
@@ -934,6 +978,7 @@ const createTabularPersister = (
934
978
  deleteEmptyColumns,
935
979
  deleteEmptyTable,
936
980
  partial,
981
+ condition,
937
982
  );
938
983
  }
939
984
  },
@@ -956,9 +1001,9 @@ const createTabularPersister = (
956
1001
  await promiseAll(
957
1002
  mapMap(
958
1003
  tablesLoadConfig,
959
- async ([tableId, rowIdColumnName], tableName) => [
1004
+ async ([tableId, rowIdColumnName, condition], tableName) => [
960
1005
  tableId,
961
- await loadTable(tableName, rowIdColumnName),
1006
+ await loadTable(tableName, rowIdColumnName, condition),
962
1007
  ],
963
1008
  ),
964
1009
  ),
@@ -971,8 +1016,8 @@ const createTabularPersister = (
971
1016
  SINGLE_ROW_ID
972
1017
  ]
973
1018
  : {};
974
- const getPersisted = async () =>
975
- await transaction(async () => {
1019
+ const getPersisted = () =>
1020
+ transaction(async () => {
976
1021
  await refreshSchema();
977
1022
  const tables = await loadTables();
978
1023
  const values = await loadValues();
@@ -980,8 +1025,8 @@ const createTabularPersister = (
980
1025
  ? [tables, values]
981
1026
  : void 0;
982
1027
  });
983
- const setPersisted = async (getContent, changes) =>
984
- await transaction(async () => {
1028
+ const setPersisted = (getContent, changes) =>
1029
+ transaction(async () => {
985
1030
  await refreshSchema();
986
1031
  if (!isUndefined(changes)) {
987
1032
  await saveTables(changes[0], true);
@@ -992,9 +1037,10 @@ const createTabularPersister = (
992
1037
  await saveValues(values);
993
1038
  }
994
1039
  });
995
- const destroy = () => {
996
- persister.stopAutoLoad().stopAutoSave();
997
- destroyImpl();
1040
+ const destroy = async () => {
1041
+ await persister.stopAutoLoad();
1042
+ await persister.stopAutoSave();
1043
+ extraDestroy();
998
1044
  return persister;
999
1045
  };
1000
1046
  const persister = createCustomPersister(
@@ -1039,22 +1085,24 @@ const createCustomSqlitePersister = (
1039
1085
  const addPersisterListener = (listener) => {
1040
1086
  let interval;
1041
1087
  const startPolling = () =>
1042
- (interval = startInterval(async () => {
1043
- try {
1044
- const [{d, s, c}] = await executeCommand(
1045
- // eslint-disable-next-line max-len
1046
- `${SELECT} ${DATA_VERSION} d,${SCHEMA_VERSION} s,TOTAL_CHANGES() c FROM ${PRAGMA}${DATA_VERSION} JOIN ${PRAGMA}${SCHEMA_VERSION}`,
1047
- );
1048
- if (d != dataVersion || s != schemaVersion || c != totalChanges) {
1049
- if (dataVersion != null) {
1050
- 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;
1051
1102
  }
1052
- dataVersion = d;
1053
- schemaVersion = s;
1054
- totalChanges = c;
1055
- }
1056
- } catch {}
1057
- }, autoLoadIntervalSeconds));
1103
+ }),
1104
+ autoLoadIntervalSeconds,
1105
+ ));
1058
1106
  const stopPolling = () => {
1059
1107
  dataVersion = schemaVersion = totalChanges = null;
1060
1108
  stopInterval(interval);
@@ -1086,8 +1134,8 @@ const createCustomSqlitePersister = (
1086
1134
  collValues(managedTableNamesSet),
1087
1135
  async (executeCommand2, managedTableNames) =>
1088
1136
  await executeCommand2(
1089
- // eslint-disable-next-line max-len
1090
- `${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`,
1091
1139
  managedTableNames,
1092
1140
  ),
1093
1141
  thing,
@@ -1137,7 +1185,7 @@ const createPowerSyncPersister = (
1137
1185
  },
1138
1186
  onSqlCommand,
1139
1187
  onIgnoredError,
1140
- () => 0,
1188
+ noop,
1141
1189
  1,
1142
1190
  // StoreOnly,
1143
1191
  powerSync,
@@ -1168,11 +1216,11 @@ const viewUpsert = async (
1168
1216
  const unchangingData = objNew(
1169
1217
  arrayMap(
1170
1218
  await executeCommand(
1171
- 'SELECT' +
1219
+ SELECT +
1172
1220
  escapeColumnNames(rowIdColumnName, ...unchangingColumnNames) +
1173
- 'FROM' +
1221
+ FROM +
1174
1222
  escapeId(tableName) +
1175
- 'WHERE' +
1223
+ WHERE +
1176
1224
  escapeId(rowIdColumnName) +
1177
1225
  'IN(' +
1178
1226
  getPlaceholders(ids) +
@@ -1194,7 +1242,10 @@ const viewUpsert = async (
1194
1242
  );
1195
1243
  }
1196
1244
  await executeCommand(
1197
- 'INSERT OR REPLACE INTO' +
1245
+ INSERT +
1246
+ ' ' +
1247
+ OR_REPLACE +
1248
+ 'INTO' +
1198
1249
  escapeId(tableName) +
1199
1250
  '(' +
1200
1251
  escapeColumnNames(