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
@@ -66,6 +66,7 @@ const CHANGE = 'change';
66
66
  const CONNECTION = 'connection';
67
67
  const STORAGE = 'storage';
68
68
  const REQUIRED = 'required';
69
+ const M = 'm';
69
70
  const T = 't';
70
71
  const V = 'v';
71
72
  const UNDEFINED = '\uFFFC';
@@ -5152,9 +5153,11 @@ const escapeId = (str) =>
5152
5153
  const escapeIds = (...ids) => escapeId(arrayJoin(ids, '_'));
5153
5154
  const escapeColumnNames = (...columnNames) =>
5154
5155
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
5155
- const getPlaceholders = (array, offset = [1]) =>
5156
+ const numberedPlaceholder = (offset) => '$' + offset[0]++;
5157
+ const anonymousPlaceholder = () => '?';
5158
+ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
5156
5159
  arrayJoin(
5157
- arrayMap(array, () => '$' + offset[0]++),
5160
+ arrayMap(array, () => getPlaceholder(offset)),
5158
5161
  COMMA,
5159
5162
  );
5160
5163
  const getWhereCondition = (tableName, condition = TRUE) =>
@@ -5167,7 +5170,7 @@ const STORE = 'store';
5167
5170
  const JSON$1 = 'json';
5168
5171
  const STORE_TABLE_NAME = STORE + 'TableName';
5169
5172
  const STORE_ID_COLUMN_NAME = STORE + 'Id' + COLUMN_NAME;
5170
- const STORE_COLUMN_NAME = STORE + COLUMN_NAME;
5173
+ const STORE_COLUMN_NAME$1 = STORE + COLUMN_NAME;
5171
5174
  const AUTO_LOAD_INTERVAL_SECONDS = 'autoLoadIntervalSeconds';
5172
5175
  const ROW_ID_COLUMN_NAME = 'rowId' + COLUMN_NAME;
5173
5176
  const TABLE_ID = 'tableId';
@@ -5230,7 +5233,7 @@ const getConfigStructures = (configOrStoreTableName) => {
5230
5233
  [
5231
5234
  storeTableName,
5232
5235
  config[STORE_ID_COLUMN_NAME] ?? DEFAULT_ROW_ID_COLUMN_NAME,
5233
- config[STORE_COLUMN_NAME] ?? STORE,
5236
+ config[STORE_COLUMN_NAME$1] ?? STORE,
5234
5237
  ],
5235
5238
  setNew(storeTableName),
5236
5239
  ];
@@ -5291,6 +5294,7 @@ const getCommandFunctions = (
5291
5294
  managedTableNames,
5292
5295
  querySchema,
5293
5296
  columnType,
5297
+ getPlaceholder,
5294
5298
  upsert = defaultUpsert,
5295
5299
  encode,
5296
5300
  decode,
@@ -5501,7 +5505,7 @@ const getCommandFunctions = (
5501
5505
  DELETE_FROM +
5502
5506
  escapeId(tableName) +
5503
5507
  getWhereCondition(tableName, condition) +
5504
- `AND(${escapeId(rowIdColumnName)}=$1)`,
5508
+ `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
5505
5509
  [rowId],
5506
5510
  );
5507
5511
  } else if (!isEmpty(settingColumnNames)) {
@@ -5520,6 +5524,7 @@ const getCommandFunctions = (
5520
5524
  encode ? encode(row[cellId]) : row[cellId],
5521
5525
  ),
5522
5526
  },
5527
+ getPlaceholder,
5523
5528
  currentColumnNames,
5524
5529
  );
5525
5530
  }
@@ -5553,13 +5558,14 @@ const getCommandFunctions = (
5553
5558
  rowIdColumnName,
5554
5559
  changingColumnNames,
5555
5560
  rows,
5561
+ getPlaceholder,
5556
5562
  currentColumnNames,
5557
5563
  );
5558
5564
  await executeCommand(
5559
5565
  DELETE_FROM +
5560
5566
  escapeId(tableName) +
5561
5567
  getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
5562
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
5568
+ `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
5563
5569
  deleteRowIds,
5564
5570
  );
5565
5571
  } else if (
@@ -5602,6 +5608,7 @@ const defaultUpsert = async (
5602
5608
  rowIdColumnName,
5603
5609
  changingColumnNames,
5604
5610
  rows,
5611
+ getPlaceholder,
5605
5612
  ) => {
5606
5613
  const offset = [1];
5607
5614
  await executeCommand(
@@ -5615,7 +5622,11 @@ const defaultUpsert = async (
5615
5622
  objToArray(
5616
5623
  rows,
5617
5624
  (row) =>
5618
- '($' + offset[0]++ + ',' + getPlaceholders(row, offset) + ')',
5625
+ '(' +
5626
+ getPlaceholder(offset) +
5627
+ ',' +
5628
+ getPlaceholders(row, getPlaceholder, offset) +
5629
+ ')',
5619
5630
  ),
5620
5631
  COMMA,
5621
5632
  ) +
@@ -5651,6 +5662,7 @@ const createJsonPersister = (
5651
5662
  thing,
5652
5663
  getThing,
5653
5664
  columnType,
5665
+ getPlaceholder,
5654
5666
  upsert,
5655
5667
  _encode,
5656
5668
  _decode,
@@ -5662,6 +5674,7 @@ const createJsonPersister = (
5662
5674
  managedTableNames,
5663
5675
  querySchema,
5664
5676
  columnType,
5677
+ getPlaceholder,
5665
5678
  upsert,
5666
5679
  void 0,
5667
5680
  void 0,
@@ -5729,6 +5742,7 @@ const createTabularPersister = (
5729
5742
  thing,
5730
5743
  getThing,
5731
5744
  columnType,
5745
+ getPlaceholder,
5732
5746
  upsert,
5733
5747
  encode,
5734
5748
  decode,
@@ -5740,6 +5754,7 @@ const createTabularPersister = (
5740
5754
  managedTableNames,
5741
5755
  querySchema,
5742
5756
  columnType,
5757
+ getPlaceholder,
5743
5758
  upsert,
5744
5759
  encode,
5745
5760
  decode,
@@ -6109,12 +6124,13 @@ const createCustomPostgreSqlPersister = (
6109
6124
  async (executeCommand2, managedTableNames) =>
6110
6125
  await executeCommand2(
6111
6126
  SELECT + // eslint-disable-next-line max-len
6112
- ` c.table_name tn,c.column_name cn,CASE WHEN tc.constraint_type IN('PRIMARY KEY','UNIQUE')AND(${SELECT} count(*) FROM information_schema.key_column_usage kcu2 ${WHERE} kcu2.constraint_schema=kcu.constraint_schema AND kcu2.constraint_name=kcu.constraint_name)=1 THEN 1 ELSE 0 END uq FROM information_schema.columns c LEFT JOIN information_schema.key_column_usage kcu ON kcu.table_schema=c.table_schema AND kcu.table_name=c.table_name AND kcu.column_name=c.column_name LEFT JOIN information_schema.table_constraints tc ON tc.constraint_schema=kcu.constraint_schema AND tc.constraint_name=kcu.constraint_name ${WHERE} c.table_schema='public'AND c.table_name IN(${getPlaceholders(managedTableNames)})`,
6127
+ ` c.table_name tn,c.column_name cn,CASE WHEN tc.constraint_type IN('PRIMARY KEY','UNIQUE')AND(${SELECT} count(*) FROM information_schema.key_column_usage kcu2 ${WHERE} kcu2.constraint_schema=kcu.constraint_schema AND kcu2.constraint_name=kcu.constraint_name)=1 THEN 1 ELSE 0 END uq FROM information_schema.columns c LEFT JOIN information_schema.key_column_usage kcu ON kcu.table_schema=c.table_schema AND kcu.table_name=c.table_name AND kcu.column_name=c.column_name LEFT JOIN information_schema.table_constraints tc ON tc.constraint_schema=kcu.constraint_schema AND tc.constraint_name=kcu.constraint_name ${WHERE} c.table_schema='public'AND c.table_name IN(${getPlaceholders(managedTableNames, numberedPlaceholder)})`,
6113
6128
  managedTableNames,
6114
6129
  ),
6115
6130
  thing,
6116
6131
  getThing,
6117
6132
  'text',
6133
+ numberedPlaceholder,
6118
6134
  void 0,
6119
6135
  (cellOrValue) => jsonString(cellOrValue),
6120
6136
  (field) => jsonParse(field),
@@ -6257,12 +6273,13 @@ const createCustomSqlitePersister = (
6257
6273
  async (executeCommand2, managedTableNames) =>
6258
6274
  await executeCommand2(
6259
6275
  SELECT + // eslint-disable-next-line max-len
6260
- ` 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`,
6276
+ ` 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`,
6261
6277
  managedTableNames,
6262
6278
  ),
6263
6279
  thing,
6264
6280
  getThing,
6265
6281
  EMPTY_STRING,
6282
+ anonymousPlaceholder,
6266
6283
  upsert,
6267
6284
  (cellOrValue) =>
6268
6285
  isTrue(cellOrValue) ? 1 : isFalse(cellOrValue) ? 0 : cellOrValue,
@@ -6446,6 +6463,32 @@ const createAutomergePersister = (
6446
6463
  );
6447
6464
  };
6448
6465
 
6466
+ const createBetterSqlite3Persister = (
6467
+ store,
6468
+ db,
6469
+ configOrStoreTableName,
6470
+ onSqlCommand,
6471
+ onIgnoredError,
6472
+ ) =>
6473
+ createCustomSqlitePersister(
6474
+ store,
6475
+ configOrStoreTableName,
6476
+ async (sql, params = []) => {
6477
+ const statement = db.prepare(sql);
6478
+ return statement.reader
6479
+ ? statement.all(...params)
6480
+ : (statement.run(...params), []);
6481
+ },
6482
+ () => noop,
6483
+ (unsubscribeFunction) => unsubscribeFunction(),
6484
+ onSqlCommand,
6485
+ onIgnoredError,
6486
+ noop,
6487
+ 3,
6488
+ // StoreOrMergeableStore,
6489
+ db,
6490
+ );
6491
+
6449
6492
  const createStoragePersister = (
6450
6493
  store,
6451
6494
  storageName,
@@ -6521,6 +6564,34 @@ const createOpfsPersister = (store, handle, onIgnoredError) => {
6521
6564
  );
6522
6565
  };
6523
6566
 
6567
+ const RETURNS_ROWS = /^\s*(SELECT|PRAGMA)/i;
6568
+ const createCapacitorSqlitePersister = (
6569
+ store,
6570
+ db,
6571
+ configOrStoreTableName,
6572
+ onSqlCommand,
6573
+ onIgnoredError,
6574
+ ) =>
6575
+ createCustomSqlitePersister(
6576
+ store,
6577
+ configOrStoreTableName,
6578
+ async (sql, params = []) => {
6579
+ if (test(RETURNS_ROWS, sql)) {
6580
+ return (await db.query(sql, params)).values ?? [];
6581
+ }
6582
+ await db.run(sql, params, false);
6583
+ return [];
6584
+ },
6585
+ () => noop,
6586
+ (unsubscribeFunction) => unsubscribeFunction(),
6587
+ onSqlCommand,
6588
+ onIgnoredError,
6589
+ noop,
6590
+ 3,
6591
+ // StoreOrMergeableStore,
6592
+ db,
6593
+ );
6594
+
6524
6595
  const createCrSqliteWasmPersister = (
6525
6596
  store,
6526
6597
  db,
@@ -6564,7 +6635,6 @@ const createDurableObjectSqlStoragePersister = (
6564
6635
  configOrStoreTableName,
6565
6636
  async (sql, params = []) => {
6566
6637
  if (!arrayHas(['BEGIN', 'END'], sql)) {
6567
- sql = strReplace(sql, /\$\d+/g, '?');
6568
6638
  return getSqlRows(sqlStorage, sql, ...params);
6569
6639
  }
6570
6640
  return [];
@@ -7080,7 +7150,10 @@ const createFilePersister = (store, filePath, onIgnoredError) => {
7080
7150
  );
7081
7151
  };
7082
7152
 
7083
- const OBJECT_STORE_NAMES = [T, V];
7153
+ const CONTENT_OBJECT_STORE_NAMES = [T, V];
7154
+ const MERGEABLE_OBJECT_STORE_NAMES = [M];
7155
+ const OBJECT_STORE_NAMES = [...CONTENT_OBJECT_STORE_NAMES, M];
7156
+ const VERSION = 3;
7084
7157
  const KEY_PATH = {keyPath: 'k'};
7085
7158
  const objectStoreMatch = async (objectStore, obj) => {
7086
7159
  const actions = objToArray(obj, (v, k) =>
@@ -7106,6 +7179,7 @@ const createIndexedDbPersister = (
7106
7179
  onIgnoredError,
7107
7180
  ) => {
7108
7181
  const forObjectStores = async (
7182
+ objectStoreNames,
7109
7183
  forObjectStore,
7110
7184
  params = [],
7111
7185
  create = 0,
@@ -7114,7 +7188,7 @@ const createIndexedDbPersister = (
7114
7188
  promiseNew((resolve, reject) => {
7115
7189
  const request = (WINDOW ? WINDOW.indexedDB : indexedDB).open(
7116
7190
  dbName,
7117
- create ? 2 : void 0,
7191
+ create ? VERSION : void 0,
7118
7192
  );
7119
7193
  let blocked = 0;
7120
7194
  request.onupgradeneeded = () =>
@@ -7135,7 +7209,7 @@ const createIndexedDbPersister = (
7135
7209
  async () => {
7136
7210
  request.result.onversionchange = () => request.result.close();
7137
7211
  const transaction = request.result.transaction(
7138
- OBJECT_STORE_NAMES,
7212
+ objectStoreNames,
7139
7213
  mode,
7140
7214
  );
7141
7215
  const transactionComplete = promiseNew((resolve2, reject2) => {
@@ -7145,7 +7219,7 @@ const createIndexedDbPersister = (
7145
7219
  });
7146
7220
  const [result] = await promiseAll([
7147
7221
  promiseAll(
7148
- arrayMap(OBJECT_STORE_NAMES, (objectStoreName, index) =>
7222
+ arrayMap(objectStoreNames, (objectStoreName, index) =>
7149
7223
  forObjectStore(
7150
7224
  transaction.objectStore(objectStoreName),
7151
7225
  params[index],
@@ -7164,22 +7238,45 @@ const createIndexedDbPersister = (
7164
7238
  );
7165
7239
  request.onerror = () => reject(errorNew(ERROR_INDEXED_DB_OPEN));
7166
7240
  });
7167
- const getPersisted = async () =>
7168
- await forObjectStores(async (objectStore) =>
7169
- objNew(
7170
- arrayMap(await execObjectStore(objectStore, 'getAll'), ({k, v}) => [
7171
- k,
7172
- v,
7173
- ]),
7174
- ),
7241
+ const getObjectStoreEntries = async (objectStore) =>
7242
+ objNew(
7243
+ arrayMap(await execObjectStore(objectStore, 'getAll'), ({k, v}) => [
7244
+ k,
7245
+ v,
7246
+ ]),
7175
7247
  );
7176
- const setPersisted = (getContent) =>
7177
- forObjectStores(
7178
- (objectStore, content) => objectStoreMatch(objectStore, content),
7179
- getContent(),
7180
- 1,
7181
- 'readwrite',
7248
+ const getPersisted = async () => {
7249
+ if (!store.isMergeable()) {
7250
+ return await forObjectStores(
7251
+ CONTENT_OBJECT_STORE_NAMES,
7252
+ getObjectStoreEntries,
7253
+ );
7254
+ }
7255
+ const [mergeable] = await forObjectStores(
7256
+ MERGEABLE_OBJECT_STORE_NAMES,
7257
+ getObjectStoreEntries,
7182
7258
  );
7259
+ return objHas(mergeable, T) ? [mergeable[T], mergeable[V]] : void 0;
7260
+ };
7261
+ const setPersisted = async (getContent) => {
7262
+ const content = getContent();
7263
+ await (store.isMergeable()
7264
+ ? forObjectStores(
7265
+ MERGEABLE_OBJECT_STORE_NAMES,
7266
+ (objectStore, mergeable) => objectStoreMatch(objectStore, mergeable),
7267
+ [{[T]: content[0], [V]: content[1]}],
7268
+ 1,
7269
+ 'readwrite',
7270
+ )
7271
+ : forObjectStores(
7272
+ CONTENT_OBJECT_STORE_NAMES,
7273
+ (objectStore, tablesOrValues) =>
7274
+ objectStoreMatch(objectStore, tablesOrValues),
7275
+ content,
7276
+ 1,
7277
+ 'readwrite',
7278
+ ));
7279
+ };
7183
7280
  const addPersisterListener = (listener) =>
7184
7281
  getPersisted().then((content) => {
7185
7282
  let active = 1;
@@ -7222,8 +7319,8 @@ const createIndexedDbPersister = (
7222
7319
  addPersisterListener,
7223
7320
  delPersisterListener,
7224
7321
  onIgnoredError,
7225
- 1,
7226
- // StoreOnly,
7322
+ 3,
7323
+ // StoreOrMergeableStore,
7227
7324
  {getDbName: () => dbName},
7228
7325
  );
7229
7326
  };
@@ -7709,6 +7806,68 @@ class TinyBasePartyKitServer {
7709
7806
  }
7710
7807
  }
7711
7808
 
7809
+ const isPool = (pg) => !isUndefined(pg?.idleCount);
7810
+ const reserveClient = async (pg, onIgnoredError) => {
7811
+ if (isPool(pg)) {
7812
+ const client = await pg.connect();
7813
+ client.on('error', onIgnoredError ?? noop);
7814
+ return [client, (discard) => client.release(discard)];
7815
+ }
7816
+ return [pg, noop];
7817
+ };
7818
+ const getSerializer = () => {
7819
+ let chain = promiseResolve();
7820
+ return (action) => (chain = chain.then(action, action));
7821
+ };
7822
+ const createPgPersister = async (
7823
+ store,
7824
+ pg,
7825
+ configOrStoreTableName,
7826
+ onSqlCommand,
7827
+ onIgnoredError,
7828
+ ) => {
7829
+ const [commandClient, releaseCommandClient] = await reserveClient(
7830
+ pg,
7831
+ onIgnoredError,
7832
+ );
7833
+ const serialize = getSerializer();
7834
+ try {
7835
+ return createCustomPostgreSqlPersister(
7836
+ store,
7837
+ configOrStoreTableName,
7838
+ (sql, params = []) =>
7839
+ serialize(async () => (await commandClient.query(sql, params)).rows),
7840
+ async (channel, listener) => {
7841
+ const handler = (notification) =>
7842
+ notification.channel == channel ? listener(notification.payload) : 0;
7843
+ const listenSql = escapeId(channel);
7844
+ const [client, release] = await reserveClient(pg, onIgnoredError);
7845
+ client.on('notification', handler);
7846
+ await client.query('LISTEN ' + listenSql);
7847
+ return async () => {
7848
+ client.off('notification', handler);
7849
+ if (isPool(pg)) {
7850
+ release(true);
7851
+ } else {
7852
+ await client.query('UNLISTEN ' + listenSql);
7853
+ }
7854
+ };
7855
+ },
7856
+ (unlisten) => tryCatch(unlisten, onIgnoredError),
7857
+ onSqlCommand,
7858
+ onIgnoredError,
7859
+ releaseCommandClient,
7860
+ 3,
7861
+ // StoreOrMergeableStore,
7862
+ pg,
7863
+ 'getPg',
7864
+ );
7865
+ } catch (error) {
7866
+ releaseCommandClient();
7867
+ throw error;
7868
+ }
7869
+ };
7870
+
7712
7871
  const createPglitePersister = async (
7713
7872
  store,
7714
7873
  pglite,
@@ -7810,14 +7969,17 @@ const powerSyncUpdateThenInsert = async (
7810
7969
  rowIdColumnName,
7811
7970
  changingColumnNames,
7812
7971
  rows,
7972
+ getPlaceholder,
7813
7973
  ) => {
7974
+ const updateOffset = [1];
7814
7975
  const assignments = arrayJoin(
7815
7976
  arrayMap(
7816
7977
  changingColumnNames,
7817
- (columnName, index) => escapeId(columnName) + '=$' + (index + 1),
7978
+ (columnName) => escapeId(columnName) + '=' + getPlaceholder(updateOffset),
7818
7979
  ),
7819
7980
  COMMA,
7820
7981
  );
7982
+ const rowIdPlaceholder = getPlaceholder(updateOffset);
7821
7983
  for (const [id, row] of objToArray(rows, (row2, id2) => [id2, row2])) {
7822
7984
  const rowParams = arrayMap(row, (value) => value ?? null);
7823
7985
  if (
@@ -7830,8 +7992,8 @@ const powerSyncUpdateThenInsert = async (
7830
7992
  ' ' +
7831
7993
  WHERE +
7832
7994
  escapeId(rowIdColumnName) +
7833
- '=$' +
7834
- (size(row) + 1) +
7995
+ '=' +
7996
+ rowIdPlaceholder +
7835
7997
  ' RETURNING' +
7836
7998
  escapeId(rowIdColumnName),
7837
7999
  [...rowParams, id],
@@ -7846,7 +8008,7 @@ const powerSyncUpdateThenInsert = async (
7846
8008
  '(' +
7847
8009
  escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
7848
8010
  ')VALUES(' +
7849
- getPlaceholders([id, ...row], offset) +
8011
+ getPlaceholders([id, ...row], getPlaceholder, offset) +
7850
8012
  ')',
7851
8013
  [id, ...rowParams],
7852
8014
  );
@@ -8110,6 +8272,75 @@ const createSqlite3Persister = (
8110
8272
  db,
8111
8273
  );
8112
8274
 
8275
+ const STORE_COLUMN_NAME = 'store';
8276
+ const PUBLIC_SCHEMA = 'public';
8277
+ const createSupabasePersister = (
8278
+ store,
8279
+ supabase,
8280
+ configOrStoreTableName,
8281
+ onIgnoredError,
8282
+ ) => {
8283
+ const config = isString(configOrStoreTableName)
8284
+ ? {storeTableName: configOrStoreTableName}
8285
+ : (configOrStoreTableName ?? {});
8286
+ const storeTableName = config.storeTableName ?? TINYBASE;
8287
+ const storeIdColumnName =
8288
+ config.storeIdColumnName ?? DEFAULT_ROW_ID_COLUMN_NAME;
8289
+ const storeColumnName = config.storeColumnName ?? STORE_COLUMN_NAME;
8290
+ const {autoLoadIntervalSeconds} = config;
8291
+ const getPersisted = async () => {
8292
+ const {data, error} = await supabase
8293
+ .from(storeTableName)
8294
+ .select(storeColumnName)
8295
+ .eq(storeIdColumnName, SINGLE_ROW_ID)
8296
+ .maybeSingle();
8297
+ if (error) {
8298
+ throw error;
8299
+ }
8300
+ return jsonParseWithUndefined(data?.[storeColumnName] ?? 'null');
8301
+ };
8302
+ const setPersisted = async (getContent) => {
8303
+ const {error} = await supabase.from(storeTableName).upsert(
8304
+ {
8305
+ [storeIdColumnName]: SINGLE_ROW_ID,
8306
+ [storeColumnName]: jsonStringWithUndefined(getContent() ?? null),
8307
+ },
8308
+ {onConflict: storeIdColumnName},
8309
+ );
8310
+ if (error) {
8311
+ throw error;
8312
+ }
8313
+ };
8314
+ const addPersisterListener = (listener) => [
8315
+ supabase
8316
+ .channel(TINYBASE + '_' + storeTableName + '_' + getUniqueId())
8317
+ .on(
8318
+ 'postgres_changes',
8319
+ {event: '*', schema: PUBLIC_SCHEMA, table: storeTableName},
8320
+ () => void listener(),
8321
+ )
8322
+ .subscribe((_status, error) => (error ? onIgnoredError?.(error) : 0)),
8323
+ isUndefined(autoLoadIntervalSeconds)
8324
+ ? void 0
8325
+ : startInterval(() => void listener(), autoLoadIntervalSeconds),
8326
+ ];
8327
+ const delPersisterListener = async ([channel, interval]) => {
8328
+ stopInterval(interval);
8329
+ await supabase.removeChannel(channel);
8330
+ };
8331
+ return createCustomPersister(
8332
+ store,
8333
+ getPersisted,
8334
+ setPersisted,
8335
+ addPersisterListener,
8336
+ delPersisterListener,
8337
+ onIgnoredError,
8338
+ 3,
8339
+ // StoreOrMergeableStore,
8340
+ {getSupabase: () => supabase},
8341
+ );
8342
+ };
8343
+
8113
8344
  const DELETE = 'delete';
8114
8345
  const getYMap = (yMap) =>
8115
8346
  yMap instanceof Map$1 ? yMap : errorThrow(ERROR_CONTENT);
@@ -12424,7 +12655,9 @@ export {
12424
12655
  addOrRemoveHash,
12425
12656
  broadcastChanges,
12426
12657
  createAutomergePersister,
12658
+ createBetterSqlite3Persister,
12427
12659
  createBroadcastChannelSynchronizer,
12660
+ createCapacitorSqlitePersister,
12428
12661
  createCheckpoints,
12429
12662
  createCrSqliteWasmPersister,
12430
12663
  createCustomPersister,
@@ -12447,6 +12680,7 @@ export {
12447
12680
  createOpfsPersister,
12448
12681
  createPartyKitPersister,
12449
12682
  createPglitePersister,
12683
+ createPgPersister,
12450
12684
  createPostgresPersister,
12451
12685
  createPowerSyncPersister,
12452
12686
  createQueries,
@@ -12459,6 +12693,7 @@ export {
12459
12693
  createSqliteBunPersister,
12460
12694
  createSqliteWasmPersister,
12461
12695
  createStore,
12696
+ createSupabasePersister,
12462
12697
  createWsServer,
12463
12698
  createWsServerSimple,
12464
12699
  createWsSynchronizer,