tinybase 9.5.0 → 9.6.0-beta.1

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 (148) hide show
  1. package/@types/omni/index.d.ts +4 -0
  2. package/@types/omni/with-schemas/index.d.ts +4 -0
  3. package/@types/persisters/index.d.ts +8 -1
  4. package/@types/persisters/persister-better-sqlite3/index.d.ts +178 -0
  5. package/@types/persisters/persister-better-sqlite3/with-schemas/index.d.ts +202 -0
  6. package/@types/persisters/persister-capacitor-sqlite/index.d.ts +181 -0
  7. package/@types/persisters/persister-capacitor-sqlite/with-schemas/index.d.ts +205 -0
  8. package/@types/persisters/persister-indexed-db/index.d.ts +17 -9
  9. package/@types/persisters/persister-indexed-db/with-schemas/index.d.ts +18 -10
  10. package/@types/persisters/persister-libsql/index.d.ts +27 -0
  11. package/@types/persisters/persister-libsql/with-schemas/index.d.ts +27 -0
  12. package/@types/persisters/persister-pg/index.d.ts +197 -0
  13. package/@types/persisters/persister-pg/with-schemas/index.d.ts +222 -0
  14. package/@types/persisters/persister-supabase/index.d.ts +201 -0
  15. package/@types/persisters/persister-supabase/with-schemas/index.d.ts +217 -0
  16. package/@types/persisters/with-schemas/index.d.ts +8 -1
  17. package/@types/ui-react-dom/index.d.ts +10 -10
  18. package/@types/ui-react-dom/with-schemas/index.d.ts +10 -10
  19. package/@types/ui-react-dom-charts/index.d.ts +7 -7
  20. package/@types/ui-react-dom-charts/with-schemas/index.d.ts +7 -7
  21. package/@types/ui-react-inspector/index.d.ts +1 -1
  22. package/@types/ui-react-inspector/with-schemas/index.d.ts +1 -1
  23. package/@types/ui-solid-dom/index.d.ts +10 -10
  24. package/@types/ui-solid-dom/with-schemas/index.d.ts +10 -10
  25. package/@types/ui-solid-inspector/index.d.ts +1 -1
  26. package/@types/ui-solid-inspector/with-schemas/index.d.ts +1 -1
  27. package/@types/ui-svelte-dom/index.d.ts +10 -10
  28. package/@types/ui-svelte-dom/with-schemas/index.d.ts +10 -10
  29. package/@types/ui-svelte-inspector/index.d.ts +1 -1
  30. package/@types/ui-svelte-inspector/with-schemas/index.d.ts +1 -1
  31. package/agents.md +55 -2
  32. package/min/omni/index.js +1 -1
  33. package/min/omni/index.js.gz +0 -0
  34. package/min/omni/with-schemas/index.js +1 -1
  35. package/min/omni/with-schemas/index.js.gz +0 -0
  36. package/min/persisters/index.js +1 -1
  37. package/min/persisters/index.js.gz +0 -0
  38. package/min/persisters/persister-better-sqlite3/index.js +1 -0
  39. package/min/persisters/persister-better-sqlite3/index.js.gz +0 -0
  40. package/min/persisters/persister-better-sqlite3/with-schemas/index.js +1 -0
  41. package/min/persisters/persister-better-sqlite3/with-schemas/index.js.gz +0 -0
  42. package/min/persisters/persister-capacitor-sqlite/index.js +1 -0
  43. package/min/persisters/persister-capacitor-sqlite/index.js.gz +0 -0
  44. package/min/persisters/persister-capacitor-sqlite/with-schemas/index.js +1 -0
  45. package/min/persisters/persister-capacitor-sqlite/with-schemas/index.js.gz +0 -0
  46. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  47. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  48. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  49. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  50. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  51. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  52. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  53. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  54. package/min/persisters/persister-electric-sql/index.js +1 -1
  55. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  56. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  57. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  58. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  59. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  60. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  61. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  62. package/min/persisters/persister-indexed-db/index.js +1 -1
  63. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  64. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  65. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  66. package/min/persisters/persister-libsql/index.js +1 -1
  67. package/min/persisters/persister-libsql/index.js.gz +0 -0
  68. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  69. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  70. package/min/persisters/persister-pg/index.js +1 -0
  71. package/min/persisters/persister-pg/index.js.gz +0 -0
  72. package/min/persisters/persister-pg/with-schemas/index.js +1 -0
  73. package/min/persisters/persister-pg/with-schemas/index.js.gz +0 -0
  74. package/min/persisters/persister-pglite/index.js +1 -1
  75. package/min/persisters/persister-pglite/index.js.gz +0 -0
  76. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  77. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  78. package/min/persisters/persister-postgres/index.js +1 -1
  79. package/min/persisters/persister-postgres/index.js.gz +0 -0
  80. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  81. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  82. package/min/persisters/persister-powersync/index.js +1 -1
  83. package/min/persisters/persister-powersync/index.js.gz +0 -0
  84. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  85. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  86. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  87. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  88. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  89. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  90. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  91. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  92. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  93. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  94. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  95. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  96. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  97. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  98. package/min/persisters/persister-sqlite3/index.js +1 -1
  99. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  100. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  101. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  102. package/min/persisters/persister-supabase/index.js +1 -0
  103. package/min/persisters/persister-supabase/index.js.gz +0 -0
  104. package/min/persisters/persister-supabase/with-schemas/index.js +1 -0
  105. package/min/persisters/persister-supabase/with-schemas/index.js.gz +0 -0
  106. package/min/persisters/with-schemas/index.js +1 -1
  107. package/min/persisters/with-schemas/index.js.gz +0 -0
  108. package/omni/index.js +269 -34
  109. package/omni/with-schemas/index.js +269 -34
  110. package/package.json +164 -4
  111. package/persisters/index.js +23 -7
  112. package/persisters/persister-better-sqlite3/index.js +1767 -0
  113. package/persisters/persister-better-sqlite3/with-schemas/index.js +1767 -0
  114. package/persisters/persister-capacitor-sqlite/index.js +1769 -0
  115. package/persisters/persister-capacitor-sqlite/with-schemas/index.js +1769 -0
  116. package/persisters/persister-cr-sqlite-wasm/index.js +20 -6
  117. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +20 -6
  118. package/persisters/persister-durable-object-sql-storage/index.js +20 -7
  119. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +20 -7
  120. package/persisters/persister-electric-sql/index.js +20 -6
  121. package/persisters/persister-electric-sql/with-schemas/index.js +20 -6
  122. package/persisters/persister-expo-sqlite/index.js +20 -6
  123. package/persisters/persister-expo-sqlite/with-schemas/index.js +20 -6
  124. package/persisters/persister-indexed-db/index.js +48 -20
  125. package/persisters/persister-indexed-db/with-schemas/index.js +48 -20
  126. package/persisters/persister-libsql/index.js +20 -6
  127. package/persisters/persister-libsql/with-schemas/index.js +20 -6
  128. package/persisters/persister-pg/index.js +1905 -0
  129. package/persisters/persister-pg/with-schemas/index.js +1905 -0
  130. package/persisters/persister-pglite/index.js +20 -6
  131. package/persisters/persister-pglite/with-schemas/index.js +20 -6
  132. package/persisters/persister-postgres/index.js +20 -6
  133. package/persisters/persister-postgres/with-schemas/index.js +20 -6
  134. package/persisters/persister-powersync/index.js +27 -10
  135. package/persisters/persister-powersync/with-schemas/index.js +27 -10
  136. package/persisters/persister-react-native-sqlite/index.js +20 -6
  137. package/persisters/persister-react-native-sqlite/with-schemas/index.js +20 -6
  138. package/persisters/persister-sqlite-bun/index.js +20 -6
  139. package/persisters/persister-sqlite-bun/with-schemas/index.js +20 -6
  140. package/persisters/persister-sqlite-wasm/index.js +20 -6
  141. package/persisters/persister-sqlite-wasm/with-schemas/index.js +20 -6
  142. package/persisters/persister-sqlite3/index.js +20 -6
  143. package/persisters/persister-sqlite3/with-schemas/index.js +20 -6
  144. package/persisters/persister-supabase/index.js +883 -0
  145. package/persisters/persister-supabase/with-schemas/index.js +883 -0
  146. package/persisters/with-schemas/index.js +23 -7
  147. package/readme.md +14 -14
  148. package/releases.md +163 -66
@@ -138,9 +138,10 @@ const escapeId = (str) =>
138
138
  );
139
139
  const escapeColumnNames = (...columnNames) =>
140
140
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
141
- const getPlaceholders = (array, offset = [1]) =>
141
+ const anonymousPlaceholder = () => '?';
142
+ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
142
143
  arrayJoin(
143
- arrayMap(array, () => '$' + offset[0]++),
144
+ arrayMap(array, () => getPlaceholder(offset)),
144
145
  COMMA,
145
146
  );
146
147
  const getWhereCondition = (tableName, condition = TRUE) =>
@@ -1002,6 +1003,7 @@ const getCommandFunctions = (
1002
1003
  managedTableNames,
1003
1004
  querySchema,
1004
1005
  columnType,
1006
+ getPlaceholder,
1005
1007
  upsert = defaultUpsert,
1006
1008
  encode,
1007
1009
  decode,
@@ -1212,7 +1214,7 @@ const getCommandFunctions = (
1212
1214
  DELETE_FROM +
1213
1215
  escapeId(tableName) +
1214
1216
  getWhereCondition(tableName, condition) +
1215
- `AND(${escapeId(rowIdColumnName)}=$1)`,
1217
+ `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1216
1218
  [rowId],
1217
1219
  );
1218
1220
  } else if (!isEmpty(settingColumnNames)) {
@@ -1231,6 +1233,7 @@ const getCommandFunctions = (
1231
1233
  encode ? encode(row[cellId]) : row[cellId],
1232
1234
  ),
1233
1235
  },
1236
+ getPlaceholder,
1234
1237
  currentColumnNames,
1235
1238
  );
1236
1239
  }
@@ -1264,13 +1267,14 @@ const getCommandFunctions = (
1264
1267
  rowIdColumnName,
1265
1268
  changingColumnNames,
1266
1269
  rows,
1270
+ getPlaceholder,
1267
1271
  currentColumnNames,
1268
1272
  );
1269
1273
  await executeCommand(
1270
1274
  DELETE_FROM +
1271
1275
  escapeId(tableName) +
1272
1276
  getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
1273
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
1277
+ `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1274
1278
  deleteRowIds,
1275
1279
  );
1276
1280
  } else if (
@@ -1313,6 +1317,7 @@ const defaultUpsert = async (
1313
1317
  rowIdColumnName,
1314
1318
  changingColumnNames,
1315
1319
  rows,
1320
+ getPlaceholder,
1316
1321
  ) => {
1317
1322
  const offset = [1];
1318
1323
  await executeCommand(
@@ -1326,7 +1331,11 @@ const defaultUpsert = async (
1326
1331
  objToArray(
1327
1332
  rows,
1328
1333
  (row) =>
1329
- '($' + offset[0]++ + ',' + getPlaceholders(row, offset) + ')',
1334
+ '(' +
1335
+ getPlaceholder(offset) +
1336
+ ',' +
1337
+ getPlaceholders(row, getPlaceholder, offset) +
1338
+ ')',
1330
1339
  ),
1331
1340
  COMMA,
1332
1341
  ) +
@@ -1362,6 +1371,7 @@ const createJsonPersister = (
1362
1371
  thing,
1363
1372
  getThing,
1364
1373
  columnType,
1374
+ getPlaceholder,
1365
1375
  upsert,
1366
1376
  _encode,
1367
1377
  _decode,
@@ -1373,6 +1383,7 @@ const createJsonPersister = (
1373
1383
  managedTableNames,
1374
1384
  querySchema,
1375
1385
  columnType,
1386
+ getPlaceholder,
1376
1387
  upsert,
1377
1388
  void 0,
1378
1389
  void 0,
@@ -1440,6 +1451,7 @@ const createTabularPersister = (
1440
1451
  thing,
1441
1452
  getThing,
1442
1453
  columnType,
1454
+ getPlaceholder,
1443
1455
  upsert,
1444
1456
  encode,
1445
1457
  decode,
@@ -1451,6 +1463,7 @@ const createTabularPersister = (
1451
1463
  managedTableNames,
1452
1464
  querySchema,
1453
1465
  columnType,
1466
+ getPlaceholder,
1454
1467
  upsert,
1455
1468
  encode,
1456
1469
  decode,
@@ -1710,12 +1723,13 @@ const createCustomSqlitePersister = (
1710
1723
  async (executeCommand2, managedTableNames) =>
1711
1724
  await executeCommand2(
1712
1725
  SELECT + // eslint-disable-next-line max-len
1713
- ` t.name tn,c.name cn,c.pk OR EXISTS(${SELECT} 1 FROM ${PRAGMA}index_list(t.name)i,${PRAGMA}index_info(i.name)ii ${WHERE} i."unique"=1 AND ii.name=c.name AND(${SELECT} count(*) FROM ${PRAGMA}index_info(i.name))=1)uq 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`,
1726
+ ` t.name tn,c.name cn,c.pk OR EXISTS(${SELECT} 1 FROM ${PRAGMA}index_list(t.name)i,${PRAGMA}index_info(i.name)ii ${WHERE} i."unique"=1 AND ii.name=c.name AND(${SELECT} count(*) FROM ${PRAGMA}index_info(i.name))=1)uq 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, anonymousPlaceholder)})ORDER BY t.name,c.name`,
1714
1727
  managedTableNames,
1715
1728
  ),
1716
1729
  thing,
1717
1730
  getThing,
1718
1731
  EMPTY_STRING,
1732
+ anonymousPlaceholder,
1719
1733
  upsert,
1720
1734
  (cellOrValue) =>
1721
1735
  isTrue(cellOrValue) ? 1 : isFalse(cellOrValue) ? 0 : cellOrValue,
@@ -140,9 +140,10 @@ const escapeId = (str) =>
140
140
  );
141
141
  const escapeColumnNames = (...columnNames) =>
142
142
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
143
- const getPlaceholders = (array, offset = [1]) =>
143
+ const anonymousPlaceholder = () => '?';
144
+ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
144
145
  arrayJoin(
145
- arrayMap(array, () => '$' + offset[0]++),
146
+ arrayMap(array, () => getPlaceholder(offset)),
146
147
  COMMA,
147
148
  );
148
149
  const getWhereCondition = (tableName, condition = TRUE) =>
@@ -1004,6 +1005,7 @@ const getCommandFunctions = (
1004
1005
  managedTableNames,
1005
1006
  querySchema,
1006
1007
  columnType,
1008
+ getPlaceholder,
1007
1009
  upsert = defaultUpsert,
1008
1010
  encode,
1009
1011
  decode,
@@ -1214,7 +1216,7 @@ const getCommandFunctions = (
1214
1216
  DELETE_FROM +
1215
1217
  escapeId(tableName) +
1216
1218
  getWhereCondition(tableName, condition) +
1217
- `AND(${escapeId(rowIdColumnName)}=$1)`,
1219
+ `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1218
1220
  [rowId],
1219
1221
  );
1220
1222
  } else if (!isEmpty(settingColumnNames)) {
@@ -1233,6 +1235,7 @@ const getCommandFunctions = (
1233
1235
  encode ? encode(row[cellId]) : row[cellId],
1234
1236
  ),
1235
1237
  },
1238
+ getPlaceholder,
1236
1239
  currentColumnNames,
1237
1240
  );
1238
1241
  }
@@ -1266,13 +1269,14 @@ const getCommandFunctions = (
1266
1269
  rowIdColumnName,
1267
1270
  changingColumnNames,
1268
1271
  rows,
1272
+ getPlaceholder,
1269
1273
  currentColumnNames,
1270
1274
  );
1271
1275
  await executeCommand(
1272
1276
  DELETE_FROM +
1273
1277
  escapeId(tableName) +
1274
1278
  getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
1275
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
1279
+ `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1276
1280
  deleteRowIds,
1277
1281
  );
1278
1282
  } else if (
@@ -1315,6 +1319,7 @@ const defaultUpsert = async (
1315
1319
  rowIdColumnName,
1316
1320
  changingColumnNames,
1317
1321
  rows,
1322
+ getPlaceholder,
1318
1323
  ) => {
1319
1324
  const offset = [1];
1320
1325
  await executeCommand(
@@ -1328,7 +1333,11 @@ const defaultUpsert = async (
1328
1333
  objToArray(
1329
1334
  rows,
1330
1335
  (row) =>
1331
- '($' + offset[0]++ + ',' + getPlaceholders(row, offset) + ')',
1336
+ '(' +
1337
+ getPlaceholder(offset) +
1338
+ ',' +
1339
+ getPlaceholders(row, getPlaceholder, offset) +
1340
+ ')',
1332
1341
  ),
1333
1342
  COMMA,
1334
1343
  ) +
@@ -1364,6 +1373,7 @@ const createJsonPersister = (
1364
1373
  thing,
1365
1374
  getThing,
1366
1375
  columnType,
1376
+ getPlaceholder,
1367
1377
  upsert,
1368
1378
  _encode,
1369
1379
  _decode,
@@ -1375,6 +1385,7 @@ const createJsonPersister = (
1375
1385
  managedTableNames,
1376
1386
  querySchema,
1377
1387
  columnType,
1388
+ getPlaceholder,
1378
1389
  upsert,
1379
1390
  void 0,
1380
1391
  void 0,
@@ -1442,6 +1453,7 @@ const createTabularPersister = (
1442
1453
  thing,
1443
1454
  getThing,
1444
1455
  columnType,
1456
+ getPlaceholder,
1445
1457
  upsert,
1446
1458
  encode,
1447
1459
  decode,
@@ -1453,6 +1465,7 @@ const createTabularPersister = (
1453
1465
  managedTableNames,
1454
1466
  querySchema,
1455
1467
  columnType,
1468
+ getPlaceholder,
1456
1469
  upsert,
1457
1470
  encode,
1458
1471
  decode,
@@ -1712,12 +1725,13 @@ const createCustomSqlitePersister = (
1712
1725
  async (executeCommand2, managedTableNames) =>
1713
1726
  await executeCommand2(
1714
1727
  SELECT + // eslint-disable-next-line max-len
1715
- ` t.name tn,c.name cn,c.pk OR EXISTS(${SELECT} 1 FROM ${PRAGMA}index_list(t.name)i,${PRAGMA}index_info(i.name)ii ${WHERE} i."unique"=1 AND ii.name=c.name AND(${SELECT} count(*) FROM ${PRAGMA}index_info(i.name))=1)uq 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`,
1728
+ ` t.name tn,c.name cn,c.pk OR EXISTS(${SELECT} 1 FROM ${PRAGMA}index_list(t.name)i,${PRAGMA}index_info(i.name)ii ${WHERE} i."unique"=1 AND ii.name=c.name AND(${SELECT} count(*) FROM ${PRAGMA}index_info(i.name))=1)uq 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, anonymousPlaceholder)})ORDER BY t.name,c.name`,
1716
1729
  managedTableNames,
1717
1730
  ),
1718
1731
  thing,
1719
1732
  getThing,
1720
1733
  EMPTY_STRING,
1734
+ anonymousPlaceholder,
1721
1735
  upsert,
1722
1736
  (cellOrValue) =>
1723
1737
  isTrue(cellOrValue) ? 1 : isFalse(cellOrValue) ? 0 : cellOrValue,
@@ -140,9 +140,10 @@ const escapeId = (str) =>
140
140
  );
141
141
  const escapeColumnNames = (...columnNames) =>
142
142
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
143
- const getPlaceholders = (array, offset = [1]) =>
143
+ const anonymousPlaceholder = () => '?';
144
+ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
144
145
  arrayJoin(
145
- arrayMap(array, () => '$' + offset[0]++),
146
+ arrayMap(array, () => getPlaceholder(offset)),
146
147
  COMMA,
147
148
  );
148
149
  const getWhereCondition = (tableName, condition = TRUE) =>
@@ -1004,6 +1005,7 @@ const getCommandFunctions = (
1004
1005
  managedTableNames,
1005
1006
  querySchema,
1006
1007
  columnType,
1008
+ getPlaceholder,
1007
1009
  upsert = defaultUpsert,
1008
1010
  encode,
1009
1011
  decode,
@@ -1214,7 +1216,7 @@ const getCommandFunctions = (
1214
1216
  DELETE_FROM +
1215
1217
  escapeId(tableName) +
1216
1218
  getWhereCondition(tableName, condition) +
1217
- `AND(${escapeId(rowIdColumnName)}=$1)`,
1219
+ `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1218
1220
  [rowId],
1219
1221
  );
1220
1222
  } else if (!isEmpty(settingColumnNames)) {
@@ -1233,6 +1235,7 @@ const getCommandFunctions = (
1233
1235
  encode ? encode(row[cellId]) : row[cellId],
1234
1236
  ),
1235
1237
  },
1238
+ getPlaceholder,
1236
1239
  currentColumnNames,
1237
1240
  );
1238
1241
  }
@@ -1266,13 +1269,14 @@ const getCommandFunctions = (
1266
1269
  rowIdColumnName,
1267
1270
  changingColumnNames,
1268
1271
  rows,
1272
+ getPlaceholder,
1269
1273
  currentColumnNames,
1270
1274
  );
1271
1275
  await executeCommand(
1272
1276
  DELETE_FROM +
1273
1277
  escapeId(tableName) +
1274
1278
  getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
1275
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
1279
+ `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1276
1280
  deleteRowIds,
1277
1281
  );
1278
1282
  } else if (
@@ -1315,6 +1319,7 @@ const defaultUpsert = async (
1315
1319
  rowIdColumnName,
1316
1320
  changingColumnNames,
1317
1321
  rows,
1322
+ getPlaceholder,
1318
1323
  ) => {
1319
1324
  const offset = [1];
1320
1325
  await executeCommand(
@@ -1328,7 +1333,11 @@ const defaultUpsert = async (
1328
1333
  objToArray(
1329
1334
  rows,
1330
1335
  (row) =>
1331
- '($' + offset[0]++ + ',' + getPlaceholders(row, offset) + ')',
1336
+ '(' +
1337
+ getPlaceholder(offset) +
1338
+ ',' +
1339
+ getPlaceholders(row, getPlaceholder, offset) +
1340
+ ')',
1332
1341
  ),
1333
1342
  COMMA,
1334
1343
  ) +
@@ -1364,6 +1373,7 @@ const createJsonPersister = (
1364
1373
  thing,
1365
1374
  getThing,
1366
1375
  columnType,
1376
+ getPlaceholder,
1367
1377
  upsert,
1368
1378
  _encode,
1369
1379
  _decode,
@@ -1375,6 +1385,7 @@ const createJsonPersister = (
1375
1385
  managedTableNames,
1376
1386
  querySchema,
1377
1387
  columnType,
1388
+ getPlaceholder,
1378
1389
  upsert,
1379
1390
  void 0,
1380
1391
  void 0,
@@ -1442,6 +1453,7 @@ const createTabularPersister = (
1442
1453
  thing,
1443
1454
  getThing,
1444
1455
  columnType,
1456
+ getPlaceholder,
1445
1457
  upsert,
1446
1458
  encode,
1447
1459
  decode,
@@ -1453,6 +1465,7 @@ const createTabularPersister = (
1453
1465
  managedTableNames,
1454
1466
  querySchema,
1455
1467
  columnType,
1468
+ getPlaceholder,
1456
1469
  upsert,
1457
1470
  encode,
1458
1471
  decode,
@@ -1712,12 +1725,13 @@ const createCustomSqlitePersister = (
1712
1725
  async (executeCommand2, managedTableNames) =>
1713
1726
  await executeCommand2(
1714
1727
  SELECT + // eslint-disable-next-line max-len
1715
- ` t.name tn,c.name cn,c.pk OR EXISTS(${SELECT} 1 FROM ${PRAGMA}index_list(t.name)i,${PRAGMA}index_info(i.name)ii ${WHERE} i."unique"=1 AND ii.name=c.name AND(${SELECT} count(*) FROM ${PRAGMA}index_info(i.name))=1)uq 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`,
1728
+ ` t.name tn,c.name cn,c.pk OR EXISTS(${SELECT} 1 FROM ${PRAGMA}index_list(t.name)i,${PRAGMA}index_info(i.name)ii ${WHERE} i."unique"=1 AND ii.name=c.name AND(${SELECT} count(*) FROM ${PRAGMA}index_info(i.name))=1)uq 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, anonymousPlaceholder)})ORDER BY t.name,c.name`,
1716
1729
  managedTableNames,
1717
1730
  ),
1718
1731
  thing,
1719
1732
  getThing,
1720
1733
  EMPTY_STRING,
1734
+ anonymousPlaceholder,
1721
1735
  upsert,
1722
1736
  (cellOrValue) =>
1723
1737
  isTrue(cellOrValue) ? 1 : isFalse(cellOrValue) ? 0 : cellOrValue,
@@ -1,5 +1,6 @@
1
1
  const TINYBASE = 'tinybase';
2
2
  const EMPTY_STRING = '';
3
+ const M = 'm';
3
4
  const T = 't';
4
5
  const V = 'v';
5
6
  const UNDEFINED = '\uFFFC';
@@ -773,7 +774,10 @@ const createCustomPersister = (
773
774
  return objFreeze(persister);
774
775
  };
775
776
 
776
- const OBJECT_STORE_NAMES = [T, V];
777
+ const CONTENT_OBJECT_STORE_NAMES = [T, V];
778
+ const MERGEABLE_OBJECT_STORE_NAMES = [M];
779
+ const OBJECT_STORE_NAMES = [...CONTENT_OBJECT_STORE_NAMES, M];
780
+ const VERSION = 3;
777
781
  const KEY_PATH = {keyPath: 'k'};
778
782
  const objectStoreMatch = async (objectStore, obj) => {
779
783
  const actions = objToArray(obj, (v, k) =>
@@ -799,6 +803,7 @@ const createIndexedDbPersister = (
799
803
  onIgnoredError,
800
804
  ) => {
801
805
  const forObjectStores = async (
806
+ objectStoreNames,
802
807
  forObjectStore,
803
808
  params = [],
804
809
  create = 0,
@@ -807,7 +812,7 @@ const createIndexedDbPersister = (
807
812
  promiseNew((resolve, reject) => {
808
813
  const request = (WINDOW ? WINDOW.indexedDB : indexedDB).open(
809
814
  dbName,
810
- create ? 2 : void 0,
815
+ create ? VERSION : void 0,
811
816
  );
812
817
  let blocked = 0;
813
818
  request.onupgradeneeded = () =>
@@ -828,7 +833,7 @@ const createIndexedDbPersister = (
828
833
  async () => {
829
834
  request.result.onversionchange = () => request.result.close();
830
835
  const transaction = request.result.transaction(
831
- OBJECT_STORE_NAMES,
836
+ objectStoreNames,
832
837
  mode,
833
838
  );
834
839
  const transactionComplete = promiseNew((resolve2, reject2) => {
@@ -838,7 +843,7 @@ const createIndexedDbPersister = (
838
843
  });
839
844
  const [result] = await promiseAll([
840
845
  promiseAll(
841
- arrayMap(OBJECT_STORE_NAMES, (objectStoreName, index) =>
846
+ arrayMap(objectStoreNames, (objectStoreName, index) =>
842
847
  forObjectStore(
843
848
  transaction.objectStore(objectStoreName),
844
849
  params[index],
@@ -857,22 +862,45 @@ const createIndexedDbPersister = (
857
862
  );
858
863
  request.onerror = () => reject(errorNew(ERROR_INDEXED_DB_OPEN));
859
864
  });
860
- const getPersisted = async () =>
861
- await forObjectStores(async (objectStore) =>
862
- objNew(
863
- arrayMap(await execObjectStore(objectStore, 'getAll'), ({k, v}) => [
864
- k,
865
- v,
866
- ]),
867
- ),
865
+ const getObjectStoreEntries = async (objectStore) =>
866
+ objNew(
867
+ arrayMap(await execObjectStore(objectStore, 'getAll'), ({k, v}) => [
868
+ k,
869
+ v,
870
+ ]),
868
871
  );
869
- const setPersisted = (getContent) =>
870
- forObjectStores(
871
- (objectStore, content) => objectStoreMatch(objectStore, content),
872
- getContent(),
873
- 1,
874
- 'readwrite',
872
+ const getPersisted = async () => {
873
+ if (!store.isMergeable()) {
874
+ return await forObjectStores(
875
+ CONTENT_OBJECT_STORE_NAMES,
876
+ getObjectStoreEntries,
877
+ );
878
+ }
879
+ const [mergeable] = await forObjectStores(
880
+ MERGEABLE_OBJECT_STORE_NAMES,
881
+ getObjectStoreEntries,
875
882
  );
883
+ return objHas(mergeable, T) ? [mergeable[T], mergeable[V]] : void 0;
884
+ };
885
+ const setPersisted = async (getContent) => {
886
+ const content = getContent();
887
+ await (store.isMergeable()
888
+ ? forObjectStores(
889
+ MERGEABLE_OBJECT_STORE_NAMES,
890
+ (objectStore, mergeable) => objectStoreMatch(objectStore, mergeable),
891
+ [{[T]: content[0], [V]: content[1]}],
892
+ 1,
893
+ 'readwrite',
894
+ )
895
+ : forObjectStores(
896
+ CONTENT_OBJECT_STORE_NAMES,
897
+ (objectStore, tablesOrValues) =>
898
+ objectStoreMatch(objectStore, tablesOrValues),
899
+ content,
900
+ 1,
901
+ 'readwrite',
902
+ ));
903
+ };
876
904
  const addPersisterListener = (listener) =>
877
905
  getPersisted().then((content) => {
878
906
  let active = 1;
@@ -915,8 +943,8 @@ const createIndexedDbPersister = (
915
943
  addPersisterListener,
916
944
  delPersisterListener,
917
945
  onIgnoredError,
918
- 1,
919
- // StoreOnly,
946
+ 3,
947
+ // StoreOrMergeableStore,
920
948
  {getDbName: () => dbName},
921
949
  );
922
950
  };
@@ -1,5 +1,6 @@
1
1
  const TINYBASE = 'tinybase';
2
2
  const EMPTY_STRING = '';
3
+ const M = 'm';
3
4
  const T = 't';
4
5
  const V = 'v';
5
6
  const UNDEFINED = '\uFFFC';
@@ -773,7 +774,10 @@ const createCustomPersister = (
773
774
  return objFreeze(persister);
774
775
  };
775
776
 
776
- const OBJECT_STORE_NAMES = [T, V];
777
+ const CONTENT_OBJECT_STORE_NAMES = [T, V];
778
+ const MERGEABLE_OBJECT_STORE_NAMES = [M];
779
+ const OBJECT_STORE_NAMES = [...CONTENT_OBJECT_STORE_NAMES, M];
780
+ const VERSION = 3;
777
781
  const KEY_PATH = {keyPath: 'k'};
778
782
  const objectStoreMatch = async (objectStore, obj) => {
779
783
  const actions = objToArray(obj, (v, k) =>
@@ -799,6 +803,7 @@ const createIndexedDbPersister = (
799
803
  onIgnoredError,
800
804
  ) => {
801
805
  const forObjectStores = async (
806
+ objectStoreNames,
802
807
  forObjectStore,
803
808
  params = [],
804
809
  create = 0,
@@ -807,7 +812,7 @@ const createIndexedDbPersister = (
807
812
  promiseNew((resolve, reject) => {
808
813
  const request = (WINDOW ? WINDOW.indexedDB : indexedDB).open(
809
814
  dbName,
810
- create ? 2 : void 0,
815
+ create ? VERSION : void 0,
811
816
  );
812
817
  let blocked = 0;
813
818
  request.onupgradeneeded = () =>
@@ -828,7 +833,7 @@ const createIndexedDbPersister = (
828
833
  async () => {
829
834
  request.result.onversionchange = () => request.result.close();
830
835
  const transaction = request.result.transaction(
831
- OBJECT_STORE_NAMES,
836
+ objectStoreNames,
832
837
  mode,
833
838
  );
834
839
  const transactionComplete = promiseNew((resolve2, reject2) => {
@@ -838,7 +843,7 @@ const createIndexedDbPersister = (
838
843
  });
839
844
  const [result] = await promiseAll([
840
845
  promiseAll(
841
- arrayMap(OBJECT_STORE_NAMES, (objectStoreName, index) =>
846
+ arrayMap(objectStoreNames, (objectStoreName, index) =>
842
847
  forObjectStore(
843
848
  transaction.objectStore(objectStoreName),
844
849
  params[index],
@@ -857,22 +862,45 @@ const createIndexedDbPersister = (
857
862
  );
858
863
  request.onerror = () => reject(errorNew(ERROR_INDEXED_DB_OPEN));
859
864
  });
860
- const getPersisted = async () =>
861
- await forObjectStores(async (objectStore) =>
862
- objNew(
863
- arrayMap(await execObjectStore(objectStore, 'getAll'), ({k, v}) => [
864
- k,
865
- v,
866
- ]),
867
- ),
865
+ const getObjectStoreEntries = async (objectStore) =>
866
+ objNew(
867
+ arrayMap(await execObjectStore(objectStore, 'getAll'), ({k, v}) => [
868
+ k,
869
+ v,
870
+ ]),
868
871
  );
869
- const setPersisted = (getContent) =>
870
- forObjectStores(
871
- (objectStore, content) => objectStoreMatch(objectStore, content),
872
- getContent(),
873
- 1,
874
- 'readwrite',
872
+ const getPersisted = async () => {
873
+ if (!store.isMergeable()) {
874
+ return await forObjectStores(
875
+ CONTENT_OBJECT_STORE_NAMES,
876
+ getObjectStoreEntries,
877
+ );
878
+ }
879
+ const [mergeable] = await forObjectStores(
880
+ MERGEABLE_OBJECT_STORE_NAMES,
881
+ getObjectStoreEntries,
875
882
  );
883
+ return objHas(mergeable, T) ? [mergeable[T], mergeable[V]] : void 0;
884
+ };
885
+ const setPersisted = async (getContent) => {
886
+ const content = getContent();
887
+ await (store.isMergeable()
888
+ ? forObjectStores(
889
+ MERGEABLE_OBJECT_STORE_NAMES,
890
+ (objectStore, mergeable) => objectStoreMatch(objectStore, mergeable),
891
+ [{[T]: content[0], [V]: content[1]}],
892
+ 1,
893
+ 'readwrite',
894
+ )
895
+ : forObjectStores(
896
+ CONTENT_OBJECT_STORE_NAMES,
897
+ (objectStore, tablesOrValues) =>
898
+ objectStoreMatch(objectStore, tablesOrValues),
899
+ content,
900
+ 1,
901
+ 'readwrite',
902
+ ));
903
+ };
876
904
  const addPersisterListener = (listener) =>
877
905
  getPersisted().then((content) => {
878
906
  let active = 1;
@@ -915,8 +943,8 @@ const createIndexedDbPersister = (
915
943
  addPersisterListener,
916
944
  delPersisterListener,
917
945
  onIgnoredError,
918
- 1,
919
- // StoreOnly,
946
+ 3,
947
+ // StoreOrMergeableStore,
920
948
  {getDbName: () => dbName},
921
949
  );
922
950
  };