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.
- package/@types/omni/index.d.ts +4 -0
- package/@types/omni/with-schemas/index.d.ts +4 -0
- package/@types/persisters/index.d.ts +8 -1
- package/@types/persisters/persister-better-sqlite3/index.d.ts +178 -0
- package/@types/persisters/persister-better-sqlite3/with-schemas/index.d.ts +202 -0
- package/@types/persisters/persister-capacitor-sqlite/index.d.ts +181 -0
- package/@types/persisters/persister-capacitor-sqlite/with-schemas/index.d.ts +205 -0
- package/@types/persisters/persister-indexed-db/index.d.ts +17 -9
- package/@types/persisters/persister-indexed-db/with-schemas/index.d.ts +18 -10
- package/@types/persisters/persister-libsql/index.d.ts +27 -0
- package/@types/persisters/persister-libsql/with-schemas/index.d.ts +27 -0
- package/@types/persisters/persister-pg/index.d.ts +197 -0
- package/@types/persisters/persister-pg/with-schemas/index.d.ts +222 -0
- package/@types/persisters/persister-supabase/index.d.ts +201 -0
- package/@types/persisters/persister-supabase/with-schemas/index.d.ts +217 -0
- package/@types/persisters/with-schemas/index.d.ts +8 -1
- package/@types/ui-react-dom/index.d.ts +10 -10
- package/@types/ui-react-dom/with-schemas/index.d.ts +10 -10
- package/@types/ui-react-dom-charts/index.d.ts +7 -7
- package/@types/ui-react-dom-charts/with-schemas/index.d.ts +7 -7
- package/@types/ui-react-inspector/index.d.ts +1 -1
- package/@types/ui-react-inspector/with-schemas/index.d.ts +1 -1
- package/@types/ui-solid-dom/index.d.ts +10 -10
- package/@types/ui-solid-dom/with-schemas/index.d.ts +10 -10
- package/@types/ui-solid-inspector/index.d.ts +1 -1
- package/@types/ui-solid-inspector/with-schemas/index.d.ts +1 -1
- package/@types/ui-svelte-dom/index.d.ts +10 -10
- package/@types/ui-svelte-dom/with-schemas/index.d.ts +10 -10
- package/@types/ui-svelte-inspector/index.d.ts +1 -1
- package/@types/ui-svelte-inspector/with-schemas/index.d.ts +1 -1
- package/agents.md +55 -2
- package/min/omni/index.js +1 -1
- package/min/omni/index.js.gz +0 -0
- package/min/omni/with-schemas/index.js +1 -1
- package/min/omni/with-schemas/index.js.gz +0 -0
- package/min/persisters/index.js +1 -1
- package/min/persisters/index.js.gz +0 -0
- package/min/persisters/persister-better-sqlite3/index.js +1 -0
- package/min/persisters/persister-better-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-better-sqlite3/with-schemas/index.js +1 -0
- package/min/persisters/persister-better-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-capacitor-sqlite/index.js +1 -0
- package/min/persisters/persister-capacitor-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-capacitor-sqlite/with-schemas/index.js +1 -0
- package/min/persisters/persister-capacitor-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/index.js +1 -1
- package/min/persisters/persister-electric-sql/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
- package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/index.js +1 -1
- package/min/persisters/persister-indexed-db/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
- package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-libsql/index.js +1 -1
- package/min/persisters/persister-libsql/index.js.gz +0 -0
- package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
- package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pg/index.js +1 -0
- package/min/persisters/persister-pg/index.js.gz +0 -0
- package/min/persisters/persister-pg/with-schemas/index.js +1 -0
- package/min/persisters/persister-pg/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pglite/index.js +1 -1
- package/min/persisters/persister-pglite/index.js.gz +0 -0
- package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
- package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-postgres/index.js +1 -1
- package/min/persisters/persister-postgres/index.js.gz +0 -0
- package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
- package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-powersync/index.js +1 -1
- package/min/persisters/persister-powersync/index.js.gz +0 -0
- package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
- package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/index.js +1 -1
- package/min/persisters/persister-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-supabase/index.js +1 -0
- package/min/persisters/persister-supabase/index.js.gz +0 -0
- package/min/persisters/persister-supabase/with-schemas/index.js +1 -0
- package/min/persisters/persister-supabase/with-schemas/index.js.gz +0 -0
- package/min/persisters/with-schemas/index.js +1 -1
- package/min/persisters/with-schemas/index.js.gz +0 -0
- package/omni/index.js +269 -34
- package/omni/with-schemas/index.js +269 -34
- package/package.json +164 -4
- package/persisters/index.js +23 -7
- package/persisters/persister-better-sqlite3/index.js +1767 -0
- package/persisters/persister-better-sqlite3/with-schemas/index.js +1767 -0
- package/persisters/persister-capacitor-sqlite/index.js +1769 -0
- package/persisters/persister-capacitor-sqlite/with-schemas/index.js +1769 -0
- package/persisters/persister-cr-sqlite-wasm/index.js +20 -6
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +20 -6
- package/persisters/persister-durable-object-sql-storage/index.js +20 -7
- package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +20 -7
- package/persisters/persister-electric-sql/index.js +20 -6
- package/persisters/persister-electric-sql/with-schemas/index.js +20 -6
- package/persisters/persister-expo-sqlite/index.js +20 -6
- package/persisters/persister-expo-sqlite/with-schemas/index.js +20 -6
- package/persisters/persister-indexed-db/index.js +48 -20
- package/persisters/persister-indexed-db/with-schemas/index.js +48 -20
- package/persisters/persister-libsql/index.js +20 -6
- package/persisters/persister-libsql/with-schemas/index.js +20 -6
- package/persisters/persister-pg/index.js +1905 -0
- package/persisters/persister-pg/with-schemas/index.js +1905 -0
- package/persisters/persister-pglite/index.js +20 -6
- package/persisters/persister-pglite/with-schemas/index.js +20 -6
- package/persisters/persister-postgres/index.js +20 -6
- package/persisters/persister-postgres/with-schemas/index.js +20 -6
- package/persisters/persister-powersync/index.js +27 -10
- package/persisters/persister-powersync/with-schemas/index.js +27 -10
- package/persisters/persister-react-native-sqlite/index.js +20 -6
- package/persisters/persister-react-native-sqlite/with-schemas/index.js +20 -6
- package/persisters/persister-sqlite-bun/index.js +20 -6
- package/persisters/persister-sqlite-bun/with-schemas/index.js +20 -6
- package/persisters/persister-sqlite-wasm/index.js +20 -6
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +20 -6
- package/persisters/persister-sqlite3/index.js +20 -6
- package/persisters/persister-sqlite3/with-schemas/index.js +20 -6
- package/persisters/persister-supabase/index.js +883 -0
- package/persisters/persister-supabase/with-schemas/index.js +883 -0
- package/persisters/with-schemas/index.js +23 -7
- package/readme.md +14 -14
- 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
|
|
5156
|
+
const numberedPlaceholder = (offset) => '$' + offset[0]++;
|
|
5157
|
+
const anonymousPlaceholder = () => '?';
|
|
5158
|
+
const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
|
|
5156
5159
|
arrayJoin(
|
|
5157
|
-
arrayMap(array, () =>
|
|
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
|
-
'(
|
|
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
|
|
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 ?
|
|
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
|
-
|
|
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(
|
|
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
|
|
7168
|
-
|
|
7169
|
-
|
|
7170
|
-
|
|
7171
|
-
|
|
7172
|
-
|
|
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
|
|
7177
|
-
|
|
7178
|
-
|
|
7179
|
-
|
|
7180
|
-
|
|
7181
|
-
|
|
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
|
-
|
|
7226
|
-
//
|
|
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
|
|
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
|
-
|
|
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,
|