tinybase 10.0.0-beta.1 → 10.0.0-beta.2

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 (149) hide show
  1. package/@types/common/index.d.ts +1 -0
  2. package/@types/common/with-schemas/index.d.ts +1 -0
  3. package/@types/indexes/index.d.ts +1 -0
  4. package/@types/indexes/with-schemas/index.d.ts +1 -0
  5. package/@types/metrics/index.d.ts +1 -0
  6. package/@types/metrics/with-schemas/index.d.ts +1 -0
  7. package/@types/omni/index.d.ts +1 -0
  8. package/@types/omni/with-schemas/index.d.ts +1 -0
  9. package/@types/persisters/index.d.ts +1 -0
  10. package/@types/persisters/persister-partykit-server/index.d.ts +17 -0
  11. package/@types/persisters/persister-partykit-server/with-schemas/index.d.ts +17 -0
  12. package/@types/persisters/persister-tinyjoin/index.d.ts +197 -0
  13. package/@types/persisters/persister-tinyjoin/with-schemas/index.d.ts +221 -0
  14. package/@types/persisters/with-schemas/index.d.ts +1 -0
  15. package/@types/queries/index.d.ts +3 -0
  16. package/@types/queries/with-schemas/index.d.ts +3 -0
  17. package/@types/relationships/index.d.ts +1 -0
  18. package/@types/relationships/with-schemas/index.d.ts +1 -0
  19. package/@types/store/index.d.ts +4 -0
  20. package/@types/store/with-schemas/index.d.ts +4 -0
  21. package/@types/ui-react/index.d.ts +2 -0
  22. package/@types/ui-react/with-schemas/index.d.ts +1 -0
  23. package/@types/ui-react-dom-charts/index.d.ts +7 -0
  24. package/@types/ui-react-dom-charts/with-schemas/index.d.ts +7 -0
  25. package/@types/ui-solid/index.d.ts +2 -0
  26. package/@types/ui-solid/with-schemas/index.d.ts +1 -0
  27. package/@types/ui-svelte/index.d.ts +23 -0
  28. package/@types/ui-svelte/with-schemas/index.d.ts +23 -0
  29. package/@types/ui-svelte-dom/index.d.ts +10 -0
  30. package/@types/ui-svelte-dom/with-schemas/index.d.ts +10 -0
  31. package/@types/ui-svelte-inspector/index.d.ts +1 -0
  32. package/@types/ui-svelte-inspector/with-schemas/index.d.ts +1 -0
  33. package/min/omni/index.js +1 -1
  34. package/min/omni/index.js.gz +0 -0
  35. package/min/omni/with-schemas/index.js +1 -1
  36. package/min/omni/with-schemas/index.js.gz +0 -0
  37. package/min/persisters/index.js +1 -1
  38. package/min/persisters/index.js.gz +0 -0
  39. package/min/persisters/persister-better-sqlite3/index.js +1 -1
  40. package/min/persisters/persister-better-sqlite3/index.js.gz +0 -0
  41. package/min/persisters/persister-better-sqlite3/with-schemas/index.js +1 -1
  42. package/min/persisters/persister-better-sqlite3/with-schemas/index.js.gz +0 -0
  43. package/min/persisters/persister-capacitor-sqlite/index.js +1 -1
  44. package/min/persisters/persister-capacitor-sqlite/index.js.gz +0 -0
  45. package/min/persisters/persister-capacitor-sqlite/with-schemas/index.js +1 -1
  46. package/min/persisters/persister-capacitor-sqlite/with-schemas/index.js.gz +0 -0
  47. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  48. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  49. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  50. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  51. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  52. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  53. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  54. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  55. package/min/persisters/persister-electric-sql/index.js +1 -1
  56. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  57. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  58. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  59. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  60. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  61. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  62. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  63. package/min/persisters/persister-libsql/index.js +1 -1
  64. package/min/persisters/persister-libsql/index.js.gz +0 -0
  65. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  66. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  67. package/min/persisters/persister-pg/index.js +1 -1
  68. package/min/persisters/persister-pg/index.js.gz +0 -0
  69. package/min/persisters/persister-pg/with-schemas/index.js +1 -1
  70. package/min/persisters/persister-pg/with-schemas/index.js.gz +0 -0
  71. package/min/persisters/persister-pglite/index.js +1 -1
  72. package/min/persisters/persister-pglite/index.js.gz +0 -0
  73. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  74. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  75. package/min/persisters/persister-postgres/index.js +1 -1
  76. package/min/persisters/persister-postgres/index.js.gz +0 -0
  77. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  78. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  79. package/min/persisters/persister-powersync/index.js +1 -1
  80. package/min/persisters/persister-powersync/index.js.gz +0 -0
  81. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  82. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  83. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  84. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  85. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  86. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  87. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  88. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  89. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  90. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  91. package/min/persisters/persister-sqlite-node/index.js +1 -1
  92. package/min/persisters/persister-sqlite-node/index.js.gz +0 -0
  93. package/min/persisters/persister-sqlite-node/with-schemas/index.js +1 -1
  94. package/min/persisters/persister-sqlite-node/with-schemas/index.js.gz +0 -0
  95. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  96. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  97. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  98. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  99. package/min/persisters/persister-sqlite3/index.js +1 -1
  100. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  101. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  102. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  103. package/min/persisters/persister-tinyjoin/index.js +1 -0
  104. package/min/persisters/persister-tinyjoin/index.js.gz +0 -0
  105. package/min/persisters/persister-tinyjoin/with-schemas/index.js +1 -0
  106. package/min/persisters/persister-tinyjoin/with-schemas/index.js.gz +0 -0
  107. package/min/persisters/with-schemas/index.js +1 -1
  108. package/min/persisters/with-schemas/index.js.gz +0 -0
  109. package/omni/index.js +146 -66
  110. package/omni/with-schemas/index.js +146 -66
  111. package/package.json +41 -1
  112. package/persisters/index.js +28 -13
  113. package/persisters/persister-better-sqlite3/index.js +70 -55
  114. package/persisters/persister-better-sqlite3/with-schemas/index.js +70 -55
  115. package/persisters/persister-capacitor-sqlite/index.js +70 -55
  116. package/persisters/persister-capacitor-sqlite/with-schemas/index.js +70 -55
  117. package/persisters/persister-cr-sqlite-wasm/index.js +70 -55
  118. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +70 -55
  119. package/persisters/persister-durable-object-sql-storage/index.js +28 -13
  120. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +28 -13
  121. package/persisters/persister-electric-sql/index.js +70 -55
  122. package/persisters/persister-electric-sql/with-schemas/index.js +70 -55
  123. package/persisters/persister-expo-sqlite/index.js +70 -55
  124. package/persisters/persister-expo-sqlite/with-schemas/index.js +70 -55
  125. package/persisters/persister-libsql/index.js +70 -55
  126. package/persisters/persister-libsql/with-schemas/index.js +70 -55
  127. package/persisters/persister-pg/index.js +77 -62
  128. package/persisters/persister-pg/with-schemas/index.js +77 -62
  129. package/persisters/persister-pglite/index.js +28 -13
  130. package/persisters/persister-pglite/with-schemas/index.js +28 -13
  131. package/persisters/persister-postgres/index.js +28 -13
  132. package/persisters/persister-postgres/with-schemas/index.js +28 -13
  133. package/persisters/persister-powersync/index.js +81 -66
  134. package/persisters/persister-powersync/with-schemas/index.js +81 -66
  135. package/persisters/persister-react-native-sqlite/index.js +70 -55
  136. package/persisters/persister-react-native-sqlite/with-schemas/index.js +70 -55
  137. package/persisters/persister-sqlite-bun/index.js +70 -55
  138. package/persisters/persister-sqlite-bun/with-schemas/index.js +70 -55
  139. package/persisters/persister-sqlite-node/index.js +70 -55
  140. package/persisters/persister-sqlite-node/with-schemas/index.js +70 -55
  141. package/persisters/persister-sqlite-wasm/index.js +70 -55
  142. package/persisters/persister-sqlite-wasm/with-schemas/index.js +70 -55
  143. package/persisters/persister-sqlite3/index.js +70 -55
  144. package/persisters/persister-sqlite3/with-schemas/index.js +70 -55
  145. package/persisters/persister-tinyjoin/index.js +1710 -0
  146. package/persisters/persister-tinyjoin/with-schemas/index.js +1710 -0
  147. package/persisters/with-schemas/index.js +28 -13
  148. package/readme.md +3 -3
  149. package/releases.md +20 -1
@@ -255,8 +255,20 @@ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
255
255
  arrayMap(array, () => getPlaceholder(offset)),
256
256
  COMMA,
257
257
  );
258
- const getWhereCondition = (tableName, condition = TRUE) =>
259
- WHERE + `(${replaceTableName(condition, escapeId(tableName))})`;
258
+ const getWhere = (tableName, condition = TRUE, extraCondition) => {
259
+ const conditions = arrayFilter(
260
+ [
261
+ condition == TRUE
262
+ ? void 0
263
+ : `(${replaceTableName(condition, escapeId(tableName))})`,
264
+ extraCondition,
265
+ ],
266
+ (condition2) => !isUndefined(condition2),
267
+ );
268
+ return isEmpty(conditions)
269
+ ? EMPTY_STRING
270
+ : WHERE + arrayJoin(conditions, 'AND');
271
+ };
260
272
  const replaceTableName = (condition, tableName) =>
261
273
  strReplace(condition, TABLE_NAME_PLACEHOLDER_REGEX, tableName);
262
274
 
@@ -1037,7 +1049,7 @@ const getCommandFunctions = (
1037
1049
  await executeCommand(
1038
1050
  SELECT_STAR_FROM +
1039
1051
  escapeId(tableName) +
1040
- getWhereCondition(tableName, condition),
1052
+ getWhere(tableName, condition),
1041
1053
  ),
1042
1054
  (row) => {
1043
1055
  const rowId = row[rowIdColumnName];
@@ -1193,9 +1205,7 @@ const getCommandFunctions = (
1193
1205
  if (isUndefined(content)) {
1194
1206
  if (isUndefined(contentSubIdSet)) {
1195
1207
  await executeCommand(
1196
- DELETE_FROM +
1197
- escapeId(tableName) +
1198
- getWhereCondition(tableName, condition),
1208
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1199
1209
  );
1200
1210
  }
1201
1211
  } else {
@@ -1205,8 +1215,11 @@ const getCommandFunctions = (
1205
1215
  await executeCommand(
1206
1216
  DELETE_FROM +
1207
1217
  escapeId(tableName) +
1208
- getWhereCondition(tableName, condition) +
1209
- `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1218
+ getWhere(
1219
+ tableName,
1220
+ condition,
1221
+ `(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1222
+ ),
1210
1223
  [rowId],
1211
1224
  );
1212
1225
  } else if (!isEmpty(settingColumnNames)) {
@@ -1265,8 +1278,12 @@ const getCommandFunctions = (
1265
1278
  await executeCommand(
1266
1279
  DELETE_FROM +
1267
1280
  escapeId(tableName) +
1268
- getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
1269
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1281
+ getWhere(
1282
+ tableName,
1283
+ condition,
1284
+ // eslint-disable-next-line max-len
1285
+ `${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1286
+ ),
1270
1287
  deleteRowIds,
1271
1288
  );
1272
1289
  } else if (
@@ -1274,9 +1291,7 @@ const getCommandFunctions = (
1274
1291
  collHas(schemaMap, tableName)
1275
1292
  ) {
1276
1293
  await executeCommand(
1277
- DELETE_FROM +
1278
- escapeId(tableName) +
1279
- getWhereCondition(tableName, condition),
1294
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1280
1295
  );
1281
1296
  }
1282
1297
  }
@@ -185,10 +185,74 @@ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
185
185
  arrayMap(array, () => getPlaceholder(offset)),
186
186
  COMMA,
187
187
  );
188
- const getWhereCondition = (tableName, condition = TRUE) =>
189
- WHERE + `(${replaceTableName(condition, escapeId(tableName))})`;
188
+ const getWhere = (tableName, condition = TRUE, extraCondition) => {
189
+ const conditions = arrayFilter(
190
+ [
191
+ condition == TRUE
192
+ ? void 0
193
+ : `(${replaceTableName(condition, escapeId(tableName))})`,
194
+ extraCondition,
195
+ ],
196
+ (condition2) => !isUndefined(condition2),
197
+ );
198
+ return isEmpty(conditions)
199
+ ? EMPTY_STRING
200
+ : WHERE + arrayJoin(conditions, 'AND');
201
+ };
190
202
  const replaceTableName = (condition, tableName) =>
191
203
  strReplace(condition, TABLE_NAME_PLACEHOLDER_REGEX, tableName);
204
+ const updateThenInsertUpsert = async (
205
+ executeCommand,
206
+ tableName,
207
+ rowIdColumnName,
208
+ changingColumnNames,
209
+ rows,
210
+ getPlaceholder,
211
+ ) => {
212
+ const updateOffset = [1];
213
+ const assignments = arrayJoin(
214
+ arrayMap(
215
+ changingColumnNames,
216
+ (columnName) => escapeId(columnName) + '=' + getPlaceholder(updateOffset),
217
+ ),
218
+ COMMA,
219
+ );
220
+ const rowIdPlaceholder = getPlaceholder(updateOffset);
221
+ for (const [id, row] of objToArray(rows, (row2, id2) => [id2, row2])) {
222
+ const rowParams = arrayMap(row, (value) => value ?? null);
223
+ if (
224
+ isEmpty(
225
+ await executeCommand(
226
+ UPDATE +
227
+ escapeId(tableName) +
228
+ ' SET' +
229
+ assignments +
230
+ ' ' +
231
+ WHERE +
232
+ escapeId(rowIdColumnName) +
233
+ '=' +
234
+ rowIdPlaceholder +
235
+ ' RETURNING' +
236
+ escapeId(rowIdColumnName),
237
+ [...rowParams, id],
238
+ ),
239
+ )
240
+ ) {
241
+ const offset = [1];
242
+ await executeCommand(
243
+ INSERT +
244
+ ' INTO' +
245
+ escapeId(tableName) +
246
+ '(' +
247
+ escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
248
+ ')VALUES(' +
249
+ getPlaceholders([id, ...row], getPlaceholder, offset) +
250
+ ')',
251
+ [id, ...rowParams],
252
+ );
253
+ }
254
+ }
255
+ };
192
256
 
193
257
  const collSize = (coll) => coll?.size ?? 0;
194
258
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -1045,7 +1109,7 @@ const getCommandFunctions = (
1045
1109
  await executeCommand(
1046
1110
  SELECT_STAR_FROM +
1047
1111
  escapeId(tableName) +
1048
- getWhereCondition(tableName, condition),
1112
+ getWhere(tableName, condition),
1049
1113
  ),
1050
1114
  (row) => {
1051
1115
  const rowId = row[rowIdColumnName];
@@ -1201,9 +1265,7 @@ const getCommandFunctions = (
1201
1265
  if (isUndefined(content)) {
1202
1266
  if (isUndefined(contentSubIdSet)) {
1203
1267
  await executeCommand(
1204
- DELETE_FROM +
1205
- escapeId(tableName) +
1206
- getWhereCondition(tableName, condition),
1268
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1207
1269
  );
1208
1270
  }
1209
1271
  } else {
@@ -1213,8 +1275,11 @@ const getCommandFunctions = (
1213
1275
  await executeCommand(
1214
1276
  DELETE_FROM +
1215
1277
  escapeId(tableName) +
1216
- getWhereCondition(tableName, condition) +
1217
- `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1278
+ getWhere(
1279
+ tableName,
1280
+ condition,
1281
+ `(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1282
+ ),
1218
1283
  [rowId],
1219
1284
  );
1220
1285
  } else if (!isEmpty(settingColumnNames)) {
@@ -1273,8 +1338,12 @@ const getCommandFunctions = (
1273
1338
  await executeCommand(
1274
1339
  DELETE_FROM +
1275
1340
  escapeId(tableName) +
1276
- getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
1277
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1341
+ getWhere(
1342
+ tableName,
1343
+ condition,
1344
+ // eslint-disable-next-line max-len
1345
+ `${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1346
+ ),
1278
1347
  deleteRowIds,
1279
1348
  );
1280
1349
  } else if (
@@ -1282,9 +1351,7 @@ const getCommandFunctions = (
1282
1351
  collHas(schemaMap, tableName)
1283
1352
  ) {
1284
1353
  await executeCommand(
1285
- DELETE_FROM +
1286
- escapeId(tableName) +
1287
- getWhereCondition(tableName, condition),
1354
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1288
1355
  );
1289
1356
  }
1290
1357
  }
@@ -1779,60 +1846,8 @@ const createPowerSyncPersister = (
1779
1846
  // StoreOnly,
1780
1847
  powerSync,
1781
1848
  'getPowerSync',
1782
- powerSyncUpdateThenInsert,
1783
- );
1784
- };
1785
- const powerSyncUpdateThenInsert = async (
1786
- executeCommand,
1787
- tableName,
1788
- rowIdColumnName,
1789
- changingColumnNames,
1790
- rows,
1791
- getPlaceholder,
1792
- ) => {
1793
- const updateOffset = [1];
1794
- const assignments = arrayJoin(
1795
- arrayMap(
1796
- changingColumnNames,
1797
- (columnName) => escapeId(columnName) + '=' + getPlaceholder(updateOffset),
1798
- ),
1799
- COMMA,
1849
+ updateThenInsertUpsert,
1800
1850
  );
1801
- const rowIdPlaceholder = getPlaceholder(updateOffset);
1802
- for (const [id, row] of objToArray(rows, (row2, id2) => [id2, row2])) {
1803
- const rowParams = arrayMap(row, (value) => value ?? null);
1804
- if (
1805
- isEmpty(
1806
- await executeCommand(
1807
- UPDATE +
1808
- escapeId(tableName) +
1809
- ' SET' +
1810
- assignments +
1811
- ' ' +
1812
- WHERE +
1813
- escapeId(rowIdColumnName) +
1814
- '=' +
1815
- rowIdPlaceholder +
1816
- ' RETURNING' +
1817
- escapeId(rowIdColumnName),
1818
- [...rowParams, id],
1819
- ),
1820
- )
1821
- ) {
1822
- const offset = [1];
1823
- await executeCommand(
1824
- INSERT +
1825
- ' INTO' +
1826
- escapeId(tableName) +
1827
- '(' +
1828
- escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
1829
- ')VALUES(' +
1830
- getPlaceholders([id, ...row], getPlaceholder, offset) +
1831
- ')',
1832
- [id, ...rowParams],
1833
- );
1834
- }
1835
- }
1836
1851
  };
1837
1852
 
1838
1853
  export {createPowerSyncPersister};
@@ -185,10 +185,74 @@ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
185
185
  arrayMap(array, () => getPlaceholder(offset)),
186
186
  COMMA,
187
187
  );
188
- const getWhereCondition = (tableName, condition = TRUE) =>
189
- WHERE + `(${replaceTableName(condition, escapeId(tableName))})`;
188
+ const getWhere = (tableName, condition = TRUE, extraCondition) => {
189
+ const conditions = arrayFilter(
190
+ [
191
+ condition == TRUE
192
+ ? void 0
193
+ : `(${replaceTableName(condition, escapeId(tableName))})`,
194
+ extraCondition,
195
+ ],
196
+ (condition2) => !isUndefined(condition2),
197
+ );
198
+ return isEmpty(conditions)
199
+ ? EMPTY_STRING
200
+ : WHERE + arrayJoin(conditions, 'AND');
201
+ };
190
202
  const replaceTableName = (condition, tableName) =>
191
203
  strReplace(condition, TABLE_NAME_PLACEHOLDER_REGEX, tableName);
204
+ const updateThenInsertUpsert = async (
205
+ executeCommand,
206
+ tableName,
207
+ rowIdColumnName,
208
+ changingColumnNames,
209
+ rows,
210
+ getPlaceholder,
211
+ ) => {
212
+ const updateOffset = [1];
213
+ const assignments = arrayJoin(
214
+ arrayMap(
215
+ changingColumnNames,
216
+ (columnName) => escapeId(columnName) + '=' + getPlaceholder(updateOffset),
217
+ ),
218
+ COMMA,
219
+ );
220
+ const rowIdPlaceholder = getPlaceholder(updateOffset);
221
+ for (const [id, row] of objToArray(rows, (row2, id2) => [id2, row2])) {
222
+ const rowParams = arrayMap(row, (value) => value ?? null);
223
+ if (
224
+ isEmpty(
225
+ await executeCommand(
226
+ UPDATE +
227
+ escapeId(tableName) +
228
+ ' SET' +
229
+ assignments +
230
+ ' ' +
231
+ WHERE +
232
+ escapeId(rowIdColumnName) +
233
+ '=' +
234
+ rowIdPlaceholder +
235
+ ' RETURNING' +
236
+ escapeId(rowIdColumnName),
237
+ [...rowParams, id],
238
+ ),
239
+ )
240
+ ) {
241
+ const offset = [1];
242
+ await executeCommand(
243
+ INSERT +
244
+ ' INTO' +
245
+ escapeId(tableName) +
246
+ '(' +
247
+ escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
248
+ ')VALUES(' +
249
+ getPlaceholders([id, ...row], getPlaceholder, offset) +
250
+ ')',
251
+ [id, ...rowParams],
252
+ );
253
+ }
254
+ }
255
+ };
192
256
 
193
257
  const collSize = (coll) => coll?.size ?? 0;
194
258
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -1045,7 +1109,7 @@ const getCommandFunctions = (
1045
1109
  await executeCommand(
1046
1110
  SELECT_STAR_FROM +
1047
1111
  escapeId(tableName) +
1048
- getWhereCondition(tableName, condition),
1112
+ getWhere(tableName, condition),
1049
1113
  ),
1050
1114
  (row) => {
1051
1115
  const rowId = row[rowIdColumnName];
@@ -1201,9 +1265,7 @@ const getCommandFunctions = (
1201
1265
  if (isUndefined(content)) {
1202
1266
  if (isUndefined(contentSubIdSet)) {
1203
1267
  await executeCommand(
1204
- DELETE_FROM +
1205
- escapeId(tableName) +
1206
- getWhereCondition(tableName, condition),
1268
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1207
1269
  );
1208
1270
  }
1209
1271
  } else {
@@ -1213,8 +1275,11 @@ const getCommandFunctions = (
1213
1275
  await executeCommand(
1214
1276
  DELETE_FROM +
1215
1277
  escapeId(tableName) +
1216
- getWhereCondition(tableName, condition) +
1217
- `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1278
+ getWhere(
1279
+ tableName,
1280
+ condition,
1281
+ `(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1282
+ ),
1218
1283
  [rowId],
1219
1284
  );
1220
1285
  } else if (!isEmpty(settingColumnNames)) {
@@ -1273,8 +1338,12 @@ const getCommandFunctions = (
1273
1338
  await executeCommand(
1274
1339
  DELETE_FROM +
1275
1340
  escapeId(tableName) +
1276
- getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
1277
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1341
+ getWhere(
1342
+ tableName,
1343
+ condition,
1344
+ // eslint-disable-next-line max-len
1345
+ `${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1346
+ ),
1278
1347
  deleteRowIds,
1279
1348
  );
1280
1349
  } else if (
@@ -1282,9 +1351,7 @@ const getCommandFunctions = (
1282
1351
  collHas(schemaMap, tableName)
1283
1352
  ) {
1284
1353
  await executeCommand(
1285
- DELETE_FROM +
1286
- escapeId(tableName) +
1287
- getWhereCondition(tableName, condition),
1354
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1288
1355
  );
1289
1356
  }
1290
1357
  }
@@ -1779,60 +1846,8 @@ const createPowerSyncPersister = (
1779
1846
  // StoreOnly,
1780
1847
  powerSync,
1781
1848
  'getPowerSync',
1782
- powerSyncUpdateThenInsert,
1783
- );
1784
- };
1785
- const powerSyncUpdateThenInsert = async (
1786
- executeCommand,
1787
- tableName,
1788
- rowIdColumnName,
1789
- changingColumnNames,
1790
- rows,
1791
- getPlaceholder,
1792
- ) => {
1793
- const updateOffset = [1];
1794
- const assignments = arrayJoin(
1795
- arrayMap(
1796
- changingColumnNames,
1797
- (columnName) => escapeId(columnName) + '=' + getPlaceholder(updateOffset),
1798
- ),
1799
- COMMA,
1849
+ updateThenInsertUpsert,
1800
1850
  );
1801
- const rowIdPlaceholder = getPlaceholder(updateOffset);
1802
- for (const [id, row] of objToArray(rows, (row2, id2) => [id2, row2])) {
1803
- const rowParams = arrayMap(row, (value) => value ?? null);
1804
- if (
1805
- isEmpty(
1806
- await executeCommand(
1807
- UPDATE +
1808
- escapeId(tableName) +
1809
- ' SET' +
1810
- assignments +
1811
- ' ' +
1812
- WHERE +
1813
- escapeId(rowIdColumnName) +
1814
- '=' +
1815
- rowIdPlaceholder +
1816
- ' RETURNING' +
1817
- escapeId(rowIdColumnName),
1818
- [...rowParams, id],
1819
- ),
1820
- )
1821
- ) {
1822
- const offset = [1];
1823
- await executeCommand(
1824
- INSERT +
1825
- ' INTO' +
1826
- escapeId(tableName) +
1827
- '(' +
1828
- escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
1829
- ')VALUES(' +
1830
- getPlaceholders([id, ...row], getPlaceholder, offset) +
1831
- ')',
1832
- [id, ...rowParams],
1833
- );
1834
- }
1835
- }
1836
1851
  };
1837
1852
 
1838
1853
  export {createPowerSyncPersister};
@@ -105,50 +105,6 @@ const arrayClear = (array, to = size(array)) => array.splice(0, to);
105
105
  const arrayPush = (array, ...values) => array.push(...values);
106
106
  const arrayShift = (array) => array.shift();
107
107
 
108
- const SINGLE_ROW_ID = '_';
109
- const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
110
- const SELECT = 'SELECT';
111
- const WHERE = 'WHERE';
112
- const TABLE = 'TABLE';
113
- const INSERT = 'INSERT';
114
- const DELETE = 'DELETE';
115
- const UPDATE = 'UPDATE';
116
- const ALTER_TABLE = 'ALTER ' + TABLE;
117
- const FROM = 'FROM';
118
- const DELETE_FROM = DELETE + ' ' + FROM;
119
- const SELECT_STAR_FROM = SELECT + '*' + FROM;
120
- const PRAGMA = 'pragma_';
121
- const DATA_VERSION = 'data_version';
122
- const SCHEMA_VERSION = 'schema_version';
123
- const PRAGMA_TABLE = 'pragma_table_';
124
- const CREATE = 'CREATE ';
125
- const CREATE_TABLE = CREATE + TABLE;
126
- const TABLE_NAME_PLACEHOLDER_REGEX = /\$tableName/g;
127
- const getWrappedCommand = (executeCommand, onSqlCommand) =>
128
- onSqlCommand
129
- ? async (sql, params) => {
130
- onSqlCommand(sql, params);
131
- return await executeCommand(sql, params);
132
- }
133
- : executeCommand;
134
- const escapeId = (str) =>
135
- arrayJoin(
136
- arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
137
- DOT,
138
- );
139
- const escapeColumnNames = (...columnNames) =>
140
- arrayJoin(arrayMap(columnNames, escapeId), COMMA);
141
- const anonymousPlaceholder = () => '?';
142
- const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
143
- arrayJoin(
144
- arrayMap(array, () => getPlaceholder(offset)),
145
- COMMA,
146
- );
147
- const getWhereCondition = (tableName, condition = TRUE) =>
148
- WHERE + `(${replaceTableName(condition, escapeId(tableName))})`;
149
- const replaceTableName = (condition, tableName) =>
150
- strReplace(condition, TABLE_NAME_PLACEHOLDER_REGEX, tableName);
151
-
152
108
  const object = Object;
153
109
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
154
110
  const objEntries = object.entries;
@@ -198,6 +154,62 @@ const objValues = (obj) => object.values(obj);
198
154
  const objSize = (obj) => size(objIds(obj));
199
155
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
200
156
 
157
+ const SINGLE_ROW_ID = '_';
158
+ const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
159
+ const SELECT = 'SELECT';
160
+ const WHERE = 'WHERE';
161
+ const TABLE = 'TABLE';
162
+ const INSERT = 'INSERT';
163
+ const DELETE = 'DELETE';
164
+ const UPDATE = 'UPDATE';
165
+ const ALTER_TABLE = 'ALTER ' + TABLE;
166
+ const FROM = 'FROM';
167
+ const DELETE_FROM = DELETE + ' ' + FROM;
168
+ const SELECT_STAR_FROM = SELECT + '*' + FROM;
169
+ const PRAGMA = 'pragma_';
170
+ const DATA_VERSION = 'data_version';
171
+ const SCHEMA_VERSION = 'schema_version';
172
+ const PRAGMA_TABLE = 'pragma_table_';
173
+ const CREATE = 'CREATE ';
174
+ const CREATE_TABLE = CREATE + TABLE;
175
+ const TABLE_NAME_PLACEHOLDER_REGEX = /\$tableName/g;
176
+ const getWrappedCommand = (executeCommand, onSqlCommand) =>
177
+ onSqlCommand
178
+ ? async (sql, params) => {
179
+ onSqlCommand(sql, params);
180
+ return await executeCommand(sql, params);
181
+ }
182
+ : executeCommand;
183
+ const escapeId = (str) =>
184
+ arrayJoin(
185
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
186
+ DOT,
187
+ );
188
+ const escapeColumnNames = (...columnNames) =>
189
+ arrayJoin(arrayMap(columnNames, escapeId), COMMA);
190
+ const anonymousPlaceholder = () => '?';
191
+ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
192
+ arrayJoin(
193
+ arrayMap(array, () => getPlaceholder(offset)),
194
+ COMMA,
195
+ );
196
+ const getWhere = (tableName, condition = TRUE, extraCondition) => {
197
+ const conditions = arrayFilter(
198
+ [
199
+ condition == TRUE
200
+ ? void 0
201
+ : `(${replaceTableName(condition, escapeId(tableName))})`,
202
+ extraCondition,
203
+ ],
204
+ (condition2) => !isUndefined(condition2),
205
+ );
206
+ return isEmpty(conditions)
207
+ ? EMPTY_STRING
208
+ : WHERE + arrayJoin(conditions, 'AND');
209
+ };
210
+ const replaceTableName = (condition, tableName) =>
211
+ strReplace(condition, TABLE_NAME_PLACEHOLDER_REGEX, tableName);
212
+
201
213
  const map = Map;
202
214
  const mapNew = (entries) => new map(entries);
203
215
  const mapGet = (map2, key) => map2?.get(key);
@@ -1045,7 +1057,7 @@ const getCommandFunctions = (
1045
1057
  await executeCommand(
1046
1058
  SELECT_STAR_FROM +
1047
1059
  escapeId(tableName) +
1048
- getWhereCondition(tableName, condition),
1060
+ getWhere(tableName, condition),
1049
1061
  ),
1050
1062
  (row) => {
1051
1063
  const rowId = row[rowIdColumnName];
@@ -1201,9 +1213,7 @@ const getCommandFunctions = (
1201
1213
  if (isUndefined(content)) {
1202
1214
  if (isUndefined(contentSubIdSet)) {
1203
1215
  await executeCommand(
1204
- DELETE_FROM +
1205
- escapeId(tableName) +
1206
- getWhereCondition(tableName, condition),
1216
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1207
1217
  );
1208
1218
  }
1209
1219
  } else {
@@ -1213,8 +1223,11 @@ const getCommandFunctions = (
1213
1223
  await executeCommand(
1214
1224
  DELETE_FROM +
1215
1225
  escapeId(tableName) +
1216
- getWhereCondition(tableName, condition) +
1217
- `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1226
+ getWhere(
1227
+ tableName,
1228
+ condition,
1229
+ `(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1230
+ ),
1218
1231
  [rowId],
1219
1232
  );
1220
1233
  } else if (!isEmpty(settingColumnNames)) {
@@ -1273,8 +1286,12 @@ const getCommandFunctions = (
1273
1286
  await executeCommand(
1274
1287
  DELETE_FROM +
1275
1288
  escapeId(tableName) +
1276
- getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
1277
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1289
+ getWhere(
1290
+ tableName,
1291
+ condition,
1292
+ // eslint-disable-next-line max-len
1293
+ `${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1294
+ ),
1278
1295
  deleteRowIds,
1279
1296
  );
1280
1297
  } else if (
@@ -1282,9 +1299,7 @@ const getCommandFunctions = (
1282
1299
  collHas(schemaMap, tableName)
1283
1300
  ) {
1284
1301
  await executeCommand(
1285
- DELETE_FROM +
1286
- escapeId(tableName) +
1287
- getWhereCondition(tableName, condition),
1302
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1288
1303
  );
1289
1304
  }
1290
1305
  }