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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/@types/common/index.d.ts +1 -0
  2. package/@types/common/with-schemas/index.d.ts +1 -0
  3. package/@types/indexes/index.d.ts +1 -0
  4. package/@types/indexes/with-schemas/index.d.ts +1 -0
  5. package/@types/metrics/index.d.ts +1 -0
  6. package/@types/metrics/with-schemas/index.d.ts +1 -0
  7. package/@types/omni/index.d.ts +1 -0
  8. package/@types/omni/with-schemas/index.d.ts +1 -0
  9. package/@types/persisters/index.d.ts +1 -0
  10. package/@types/persisters/persister-partykit-server/index.d.ts +17 -0
  11. package/@types/persisters/persister-partykit-server/with-schemas/index.d.ts +17 -0
  12. package/@types/persisters/persister-tinyjoin/index.d.ts +197 -0
  13. package/@types/persisters/persister-tinyjoin/with-schemas/index.d.ts +221 -0
  14. package/@types/persisters/with-schemas/index.d.ts +1 -0
  15. package/@types/queries/index.d.ts +3 -0
  16. package/@types/queries/with-schemas/index.d.ts +3 -0
  17. package/@types/relationships/index.d.ts +1 -0
  18. package/@types/relationships/with-schemas/index.d.ts +1 -0
  19. package/@types/store/index.d.ts +4 -0
  20. package/@types/store/with-schemas/index.d.ts +4 -0
  21. package/@types/ui-react/index.d.ts +2 -0
  22. package/@types/ui-react/with-schemas/index.d.ts +1 -0
  23. package/@types/ui-react-dom-charts/index.d.ts +7 -0
  24. package/@types/ui-react-dom-charts/with-schemas/index.d.ts +7 -0
  25. package/@types/ui-solid/index.d.ts +2 -0
  26. package/@types/ui-solid/with-schemas/index.d.ts +1 -0
  27. package/@types/ui-svelte/index.d.ts +23 -0
  28. package/@types/ui-svelte/with-schemas/index.d.ts +23 -0
  29. package/@types/ui-svelte-dom/index.d.ts +10 -0
  30. package/@types/ui-svelte-dom/with-schemas/index.d.ts +10 -0
  31. package/@types/ui-svelte-inspector/index.d.ts +1 -0
  32. package/@types/ui-svelte-inspector/with-schemas/index.d.ts +1 -0
  33. package/min/omni/index.js +1 -1
  34. package/min/omni/index.js.gz +0 -0
  35. package/min/omni/with-schemas/index.js +1 -1
  36. package/min/omni/with-schemas/index.js.gz +0 -0
  37. package/min/persisters/index.js +1 -1
  38. package/min/persisters/index.js.gz +0 -0
  39. package/min/persisters/persister-better-sqlite3/index.js +1 -1
  40. package/min/persisters/persister-better-sqlite3/index.js.gz +0 -0
  41. package/min/persisters/persister-better-sqlite3/with-schemas/index.js +1 -1
  42. package/min/persisters/persister-better-sqlite3/with-schemas/index.js.gz +0 -0
  43. package/min/persisters/persister-capacitor-sqlite/index.js +1 -1
  44. package/min/persisters/persister-capacitor-sqlite/index.js.gz +0 -0
  45. package/min/persisters/persister-capacitor-sqlite/with-schemas/index.js +1 -1
  46. package/min/persisters/persister-capacitor-sqlite/with-schemas/index.js.gz +0 -0
  47. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  48. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  49. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  50. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  51. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  52. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  53. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  54. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  55. package/min/persisters/persister-electric-sql/index.js +1 -1
  56. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  57. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  58. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  59. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  60. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  61. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  62. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  63. package/min/persisters/persister-libsql/index.js +1 -1
  64. package/min/persisters/persister-libsql/index.js.gz +0 -0
  65. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  66. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  67. package/min/persisters/persister-pg/index.js +1 -1
  68. package/min/persisters/persister-pg/index.js.gz +0 -0
  69. package/min/persisters/persister-pg/with-schemas/index.js +1 -1
  70. package/min/persisters/persister-pg/with-schemas/index.js.gz +0 -0
  71. package/min/persisters/persister-pglite/index.js +1 -1
  72. package/min/persisters/persister-pglite/index.js.gz +0 -0
  73. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  74. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  75. package/min/persisters/persister-postgres/index.js +1 -1
  76. package/min/persisters/persister-postgres/index.js.gz +0 -0
  77. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  78. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  79. package/min/persisters/persister-powersync/index.js +1 -1
  80. package/min/persisters/persister-powersync/index.js.gz +0 -0
  81. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  82. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  83. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  84. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  85. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  86. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  87. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  88. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  89. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  90. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  91. package/min/persisters/persister-sqlite-node/index.js +1 -1
  92. package/min/persisters/persister-sqlite-node/index.js.gz +0 -0
  93. package/min/persisters/persister-sqlite-node/with-schemas/index.js +1 -1
  94. package/min/persisters/persister-sqlite-node/with-schemas/index.js.gz +0 -0
  95. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  96. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  97. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  98. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  99. package/min/persisters/persister-sqlite3/index.js +1 -1
  100. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  101. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  102. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  103. package/min/persisters/persister-tinyjoin/index.js +1 -0
  104. package/min/persisters/persister-tinyjoin/index.js.gz +0 -0
  105. package/min/persisters/persister-tinyjoin/with-schemas/index.js +1 -0
  106. package/min/persisters/persister-tinyjoin/with-schemas/index.js.gz +0 -0
  107. package/min/persisters/with-schemas/index.js +1 -1
  108. package/min/persisters/with-schemas/index.js.gz +0 -0
  109. package/omni/index.js +146 -66
  110. package/omni/with-schemas/index.js +146 -66
  111. package/package.json +41 -1
  112. package/persisters/index.js +28 -13
  113. package/persisters/persister-better-sqlite3/index.js +70 -55
  114. package/persisters/persister-better-sqlite3/with-schemas/index.js +70 -55
  115. package/persisters/persister-capacitor-sqlite/index.js +70 -55
  116. package/persisters/persister-capacitor-sqlite/with-schemas/index.js +70 -55
  117. package/persisters/persister-cr-sqlite-wasm/index.js +70 -55
  118. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +70 -55
  119. package/persisters/persister-durable-object-sql-storage/index.js +28 -13
  120. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +28 -13
  121. package/persisters/persister-electric-sql/index.js +70 -55
  122. package/persisters/persister-electric-sql/with-schemas/index.js +70 -55
  123. package/persisters/persister-expo-sqlite/index.js +70 -55
  124. package/persisters/persister-expo-sqlite/with-schemas/index.js +70 -55
  125. package/persisters/persister-libsql/index.js +70 -55
  126. package/persisters/persister-libsql/with-schemas/index.js +70 -55
  127. package/persisters/persister-pg/index.js +77 -62
  128. package/persisters/persister-pg/with-schemas/index.js +77 -62
  129. package/persisters/persister-pglite/index.js +28 -13
  130. package/persisters/persister-pglite/with-schemas/index.js +28 -13
  131. package/persisters/persister-postgres/index.js +28 -13
  132. package/persisters/persister-postgres/with-schemas/index.js +28 -13
  133. package/persisters/persister-powersync/index.js +81 -66
  134. package/persisters/persister-powersync/with-schemas/index.js +81 -66
  135. package/persisters/persister-react-native-sqlite/index.js +70 -55
  136. package/persisters/persister-react-native-sqlite/with-schemas/index.js +70 -55
  137. package/persisters/persister-sqlite-bun/index.js +70 -55
  138. package/persisters/persister-sqlite-bun/with-schemas/index.js +70 -55
  139. package/persisters/persister-sqlite-node/index.js +70 -55
  140. package/persisters/persister-sqlite-node/with-schemas/index.js +70 -55
  141. package/persisters/persister-sqlite-wasm/index.js +70 -55
  142. package/persisters/persister-sqlite-wasm/with-schemas/index.js +70 -55
  143. package/persisters/persister-sqlite3/index.js +70 -55
  144. package/persisters/persister-sqlite3/with-schemas/index.js +70 -55
  145. package/persisters/persister-tinyjoin/index.js +1710 -0
  146. package/persisters/persister-tinyjoin/with-schemas/index.js +1710 -0
  147. package/persisters/with-schemas/index.js +28 -13
  148. package/readme.md +3 -3
  149. package/releases.md +20 -1
@@ -5163,10 +5163,74 @@ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
5163
5163
  arrayMap(array, () => getPlaceholder(offset)),
5164
5164
  COMMA,
5165
5165
  );
5166
- const getWhereCondition = (tableName, condition = TRUE) =>
5167
- WHERE + `(${replaceTableName(condition, escapeId(tableName))})`;
5166
+ const getWhere = (tableName, condition = TRUE, extraCondition) => {
5167
+ const conditions = arrayFilter(
5168
+ [
5169
+ condition == TRUE
5170
+ ? void 0
5171
+ : `(${replaceTableName(condition, escapeId(tableName))})`,
5172
+ extraCondition,
5173
+ ],
5174
+ (condition2) => !isUndefined(condition2),
5175
+ );
5176
+ return isEmpty(conditions)
5177
+ ? EMPTY_STRING
5178
+ : WHERE + arrayJoin(conditions, 'AND');
5179
+ };
5168
5180
  const replaceTableName = (condition, tableName) =>
5169
5181
  strReplace(condition, TABLE_NAME_PLACEHOLDER_REGEX, tableName);
5182
+ const updateThenInsertUpsert = async (
5183
+ executeCommand,
5184
+ tableName,
5185
+ rowIdColumnName,
5186
+ changingColumnNames,
5187
+ rows,
5188
+ getPlaceholder,
5189
+ ) => {
5190
+ const updateOffset = [1];
5191
+ const assignments = arrayJoin(
5192
+ arrayMap(
5193
+ changingColumnNames,
5194
+ (columnName) => escapeId(columnName) + '=' + getPlaceholder(updateOffset),
5195
+ ),
5196
+ COMMA,
5197
+ );
5198
+ const rowIdPlaceholder = getPlaceholder(updateOffset);
5199
+ for (const [id, row] of objToArray(rows, (row2, id2) => [id2, row2])) {
5200
+ const rowParams = arrayMap(row, (value) => value ?? null);
5201
+ if (
5202
+ isEmpty(
5203
+ await executeCommand(
5204
+ UPDATE +
5205
+ escapeId(tableName) +
5206
+ ' SET' +
5207
+ assignments +
5208
+ ' ' +
5209
+ WHERE +
5210
+ escapeId(rowIdColumnName) +
5211
+ '=' +
5212
+ rowIdPlaceholder +
5213
+ ' RETURNING' +
5214
+ escapeId(rowIdColumnName),
5215
+ [...rowParams, id],
5216
+ ),
5217
+ )
5218
+ ) {
5219
+ const offset = [1];
5220
+ await executeCommand(
5221
+ INSERT +
5222
+ ' INTO' +
5223
+ escapeId(tableName) +
5224
+ '(' +
5225
+ escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
5226
+ ')VALUES(' +
5227
+ getPlaceholders([id, ...row], getPlaceholder, offset) +
5228
+ ')',
5229
+ [id, ...rowParams],
5230
+ );
5231
+ }
5232
+ }
5233
+ };
5170
5234
 
5171
5235
  const COLUMN_NAME = 'ColumnName';
5172
5236
  const STORE = 'store';
@@ -5339,7 +5403,7 @@ const getCommandFunctions = (
5339
5403
  await executeCommand(
5340
5404
  SELECT_STAR_FROM +
5341
5405
  escapeId(tableName) +
5342
- getWhereCondition(tableName, condition),
5406
+ getWhere(tableName, condition),
5343
5407
  ),
5344
5408
  (row) => {
5345
5409
  const rowId = row[rowIdColumnName];
@@ -5495,9 +5559,7 @@ const getCommandFunctions = (
5495
5559
  if (isUndefined(content)) {
5496
5560
  if (isUndefined(contentSubIdSet)) {
5497
5561
  await executeCommand(
5498
- DELETE_FROM +
5499
- escapeId(tableName) +
5500
- getWhereCondition(tableName, condition),
5562
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
5501
5563
  );
5502
5564
  }
5503
5565
  } else {
@@ -5507,8 +5569,11 @@ const getCommandFunctions = (
5507
5569
  await executeCommand(
5508
5570
  DELETE_FROM +
5509
5571
  escapeId(tableName) +
5510
- getWhereCondition(tableName, condition) +
5511
- `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
5572
+ getWhere(
5573
+ tableName,
5574
+ condition,
5575
+ `(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
5576
+ ),
5512
5577
  [rowId],
5513
5578
  );
5514
5579
  } else if (!isEmpty(settingColumnNames)) {
@@ -5567,8 +5632,12 @@ const getCommandFunctions = (
5567
5632
  await executeCommand(
5568
5633
  DELETE_FROM +
5569
5634
  escapeId(tableName) +
5570
- getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
5571
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
5635
+ getWhere(
5636
+ tableName,
5637
+ condition,
5638
+ // eslint-disable-next-line max-len
5639
+ `${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
5640
+ ),
5572
5641
  deleteRowIds,
5573
5642
  );
5574
5643
  } else if (
@@ -5576,9 +5645,7 @@ const getCommandFunctions = (
5576
5645
  collHas(schemaMap, tableName)
5577
5646
  ) {
5578
5647
  await executeCommand(
5579
- DELETE_FROM +
5580
- escapeId(tableName) +
5581
- getWhereCondition(tableName, condition),
5648
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
5582
5649
  );
5583
5650
  }
5584
5651
  }
@@ -7961,61 +8028,9 @@ const createPowerSyncPersister = (
7961
8028
  // StoreOnly,
7962
8029
  powerSync,
7963
8030
  'getPowerSync',
7964
- powerSyncUpdateThenInsert,
8031
+ updateThenInsertUpsert,
7965
8032
  );
7966
8033
  };
7967
- const powerSyncUpdateThenInsert = async (
7968
- executeCommand,
7969
- tableName,
7970
- rowIdColumnName,
7971
- changingColumnNames,
7972
- rows,
7973
- getPlaceholder,
7974
- ) => {
7975
- const updateOffset = [1];
7976
- const assignments = arrayJoin(
7977
- arrayMap(
7978
- changingColumnNames,
7979
- (columnName) => escapeId(columnName) + '=' + getPlaceholder(updateOffset),
7980
- ),
7981
- COMMA,
7982
- );
7983
- const rowIdPlaceholder = getPlaceholder(updateOffset);
7984
- for (const [id, row] of objToArray(rows, (row2, id2) => [id2, row2])) {
7985
- const rowParams = arrayMap(row, (value) => value ?? null);
7986
- if (
7987
- isEmpty(
7988
- await executeCommand(
7989
- UPDATE +
7990
- escapeId(tableName) +
7991
- ' SET' +
7992
- assignments +
7993
- ' ' +
7994
- WHERE +
7995
- escapeId(rowIdColumnName) +
7996
- '=' +
7997
- rowIdPlaceholder +
7998
- ' RETURNING' +
7999
- escapeId(rowIdColumnName),
8000
- [...rowParams, id],
8001
- ),
8002
- )
8003
- ) {
8004
- const offset = [1];
8005
- await executeCommand(
8006
- INSERT +
8007
- ' INTO' +
8008
- escapeId(tableName) +
8009
- '(' +
8010
- escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
8011
- ')VALUES(' +
8012
- getPlaceholders([id, ...row], getPlaceholder, offset) +
8013
- ')',
8014
- [id, ...rowParams],
8015
- );
8016
- }
8017
- }
8018
- };
8019
8034
 
8020
8035
  const createReactNativeMmkvPersister = (
8021
8036
  store,
@@ -8363,6 +8378,70 @@ const createSupabasePersister = (
8363
8378
  );
8364
8379
  };
8365
8380
 
8381
+ const LIMIT_0 = 'LIMIT 0';
8382
+ const createTinyJoinPersister = (
8383
+ store,
8384
+ tinyJoin,
8385
+ configOrStoreTableName,
8386
+ onSqlCommand,
8387
+ onIgnoredError,
8388
+ ) => {
8389
+ const executeCommand = getWrappedCommand(
8390
+ async (sql, params = []) => (await tinyJoin.query(sql, params)).rows,
8391
+ onSqlCommand,
8392
+ );
8393
+ const [isJson, , defaultedConfig, managedTableNamesSet] = getConfigStructures(
8394
+ configOrStoreTableName,
8395
+ );
8396
+ if (!isJson && store.isMergeable()) {
8397
+ errorThrow(ERROR_STORE_TYPE);
8398
+ }
8399
+ const managedTableNames = collValues(managedTableNamesSet);
8400
+ const querySchema = async () => {
8401
+ const schema = [];
8402
+ await promiseAll(
8403
+ arrayMap(managedTableNames, async (tn) => {
8404
+ const sql = SELECT_STAR_FROM + escapeId(tn) + LIMIT_0;
8405
+ onSqlCommand?.(sql);
8406
+ await tryCatchIgnore(async () =>
8407
+ arrayForEach((await tinyJoin.query(sql)).fields, ({name}) =>
8408
+ arrayPush(schema, {tn, cn: name}),
8409
+ ),
8410
+ );
8411
+ }),
8412
+ );
8413
+ return schema;
8414
+ };
8415
+ const addPersisterListener = (listener) =>
8416
+ tinyJoin.subscribe(
8417
+ {tables: managedTableNames},
8418
+ () => void tryCatchIgnore(listener, onIgnoredError),
8419
+ );
8420
+ const delPersisterListener = (unsubscribe) => unsubscribe();
8421
+ const executeTransaction = (actions) => actions(executeCommand);
8422
+ return (isJson ? createJsonPersister : createTabularPersister)(
8423
+ store,
8424
+ executeCommand,
8425
+ addPersisterListener,
8426
+ delPersisterListener,
8427
+ onIgnoredError,
8428
+ noop,
8429
+ 3,
8430
+ // StoreOrMergeableStore,
8431
+ defaultedConfig,
8432
+ managedTableNames,
8433
+ querySchema,
8434
+ tinyJoin,
8435
+ 'getTinyJoin',
8436
+ 'text',
8437
+ numberedPlaceholder,
8438
+ updateThenInsertUpsert,
8439
+ (cellOrValue) => jsonString(cellOrValue),
8440
+ (field) => jsonParse(field),
8441
+ executeTransaction,
8442
+ );
8443
+ };
8444
+
8366
8445
  const DELETE = 'delete';
8367
8446
  const getYMap = (yMap) =>
8368
8447
  yMap instanceof Map$1 ? yMap : errorThrow(ERROR_CONTENT);
@@ -12747,6 +12826,7 @@ export {
12747
12826
  createSqliteWasmPersister,
12748
12827
  createStore,
12749
12828
  createSupabasePersister,
12829
+ createTinyJoinPersister,
12750
12830
  createWsServer,
12751
12831
  createWsServerSimple,
12752
12832
  createWsSynchronizer,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tinybase",
3
- "version": "10.0.0-beta.1",
3
+ "version": "10.0.0-beta.2",
4
4
  "author": "jamesgpearce",
5
5
  "repository": {
6
6
  "type": "git",
@@ -61,6 +61,7 @@
61
61
  "solid-js": "^1.9.15",
62
62
  "sqlite3": "^6.0.1",
63
63
  "svelte": "^5.57.0",
64
+ "tinyjoin": "^0.1.0",
64
65
  "valibot": "^1.5.0",
65
66
  "ws": "^8.21.3",
66
67
  "yjs": "^13.6.32",
@@ -151,6 +152,9 @@
151
152
  "svelte": {
152
153
  "optional": true
153
154
  },
155
+ "tinyjoin": {
156
+ "optional": true
157
+ },
154
158
  "valibot": {
155
159
  "optional": true
156
160
  },
@@ -384,6 +388,12 @@
384
388
  "persisters/persister-supabase/with-schemas": [
385
389
  "./@types/persisters/persister-supabase/with-schemas/index.d.ts"
386
390
  ],
391
+ "persisters/persister-tinyjoin": [
392
+ "./@types/persisters/persister-tinyjoin/index.d.ts"
393
+ ],
394
+ "persisters/persister-tinyjoin/with-schemas": [
395
+ "./@types/persisters/persister-tinyjoin/with-schemas/index.d.ts"
396
+ ],
387
397
  "persisters/persister-yjs": [
388
398
  "./@types/persisters/persister-yjs/index.d.ts"
389
399
  ],
@@ -762,6 +772,12 @@
762
772
  "min/persisters/persister-supabase/with-schemas": [
763
773
  "./@types/persisters/persister-supabase/with-schemas/index.d.ts"
764
774
  ],
775
+ "min/persisters/persister-tinyjoin": [
776
+ "./@types/persisters/persister-tinyjoin/index.d.ts"
777
+ ],
778
+ "min/persisters/persister-tinyjoin/with-schemas": [
779
+ "./@types/persisters/persister-tinyjoin/with-schemas/index.d.ts"
780
+ ],
765
781
  "min/persisters/persister-yjs": [
766
782
  "./@types/persisters/persister-yjs/index.d.ts"
767
783
  ],
@@ -1353,6 +1369,18 @@
1353
1369
  "default": "./persisters/persister-supabase/index.js"
1354
1370
  }
1355
1371
  },
1372
+ "./persisters/persister-tinyjoin": {
1373
+ "default": {
1374
+ "types": "./@types/persisters/persister-tinyjoin/index.d.ts",
1375
+ "default": "./persisters/persister-tinyjoin/index.js"
1376
+ }
1377
+ },
1378
+ "./persisters/persister-tinyjoin/with-schemas": {
1379
+ "default": {
1380
+ "types": "./@types/persisters/persister-tinyjoin/with-schemas/index.d.ts",
1381
+ "default": "./persisters/persister-tinyjoin/index.js"
1382
+ }
1383
+ },
1356
1384
  "./persisters/persister-yjs": {
1357
1385
  "default": {
1358
1386
  "types": "./@types/persisters/persister-yjs/index.d.ts",
@@ -2093,6 +2121,18 @@
2093
2121
  "default": "./min/persisters/persister-supabase/index.js"
2094
2122
  }
2095
2123
  },
2124
+ "./min/persisters/persister-tinyjoin": {
2125
+ "default": {
2126
+ "types": "./@types/persisters/persister-tinyjoin/index.d.ts",
2127
+ "default": "./min/persisters/persister-tinyjoin/index.js"
2128
+ }
2129
+ },
2130
+ "./min/persisters/persister-tinyjoin/with-schemas": {
2131
+ "default": {
2132
+ "types": "./@types/persisters/persister-tinyjoin/with-schemas/index.d.ts",
2133
+ "default": "./min/persisters/persister-tinyjoin/index.js"
2134
+ }
2135
+ },
2096
2136
  "./min/persisters/persister-yjs": {
2097
2137
  "default": {
2098
2138
  "types": "./@types/persisters/persister-yjs/index.d.ts",
@@ -883,8 +883,20 @@ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
883
883
  arrayMap(array, () => getPlaceholder(offset)),
884
884
  COMMA,
885
885
  );
886
- const getWhereCondition = (tableName, condition = TRUE) =>
887
- WHERE + `(${replaceTableName(condition, escapeId(tableName))})`;
886
+ const getWhere = (tableName, condition = TRUE, extraCondition) => {
887
+ const conditions = arrayFilter(
888
+ [
889
+ condition == TRUE
890
+ ? void 0
891
+ : `(${replaceTableName(condition, escapeId(tableName))})`,
892
+ extraCondition,
893
+ ],
894
+ (condition2) => !isUndefined(condition2),
895
+ );
896
+ return isEmpty(conditions)
897
+ ? EMPTY_STRING
898
+ : WHERE + arrayJoin(conditions, 'AND');
899
+ };
888
900
  const replaceTableName = (condition, tableName) =>
889
901
  strReplace(condition, TABLE_NAME_PLACEHOLDER_REGEX, tableName);
890
902
 
@@ -1059,7 +1071,7 @@ const getCommandFunctions = (
1059
1071
  await executeCommand(
1060
1072
  SELECT_STAR_FROM +
1061
1073
  escapeId(tableName) +
1062
- getWhereCondition(tableName, condition),
1074
+ getWhere(tableName, condition),
1063
1075
  ),
1064
1076
  (row) => {
1065
1077
  const rowId = row[rowIdColumnName];
@@ -1215,9 +1227,7 @@ const getCommandFunctions = (
1215
1227
  if (isUndefined(content)) {
1216
1228
  if (isUndefined(contentSubIdSet)) {
1217
1229
  await executeCommand(
1218
- DELETE_FROM +
1219
- escapeId(tableName) +
1220
- getWhereCondition(tableName, condition),
1230
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1221
1231
  );
1222
1232
  }
1223
1233
  } else {
@@ -1227,8 +1237,11 @@ const getCommandFunctions = (
1227
1237
  await executeCommand(
1228
1238
  DELETE_FROM +
1229
1239
  escapeId(tableName) +
1230
- getWhereCondition(tableName, condition) +
1231
- `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1240
+ getWhere(
1241
+ tableName,
1242
+ condition,
1243
+ `(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1244
+ ),
1232
1245
  [rowId],
1233
1246
  );
1234
1247
  } else if (!isEmpty(settingColumnNames)) {
@@ -1287,8 +1300,12 @@ const getCommandFunctions = (
1287
1300
  await executeCommand(
1288
1301
  DELETE_FROM +
1289
1302
  escapeId(tableName) +
1290
- getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
1291
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1303
+ getWhere(
1304
+ tableName,
1305
+ condition,
1306
+ // eslint-disable-next-line max-len
1307
+ `${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1308
+ ),
1292
1309
  deleteRowIds,
1293
1310
  );
1294
1311
  } else if (
@@ -1296,9 +1313,7 @@ const getCommandFunctions = (
1296
1313
  collHas(schemaMap, tableName)
1297
1314
  ) {
1298
1315
  await executeCommand(
1299
- DELETE_FROM +
1300
- escapeId(tableName) +
1301
- getWhereCondition(tableName, condition),
1316
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1302
1317
  );
1303
1318
  }
1304
1319
  }
@@ -105,50 +105,6 @@ const arrayClear = (array, to = size(array)) => array.splice(0, to);
105
105
  const arrayPush = (array, ...values) => array.push(...values);
106
106
  const arrayShift = (array) => array.shift();
107
107
 
108
- const SINGLE_ROW_ID = '_';
109
- const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
110
- const SELECT = 'SELECT';
111
- const WHERE = 'WHERE';
112
- const TABLE = 'TABLE';
113
- const INSERT = 'INSERT';
114
- const DELETE = 'DELETE';
115
- const UPDATE = 'UPDATE';
116
- const ALTER_TABLE = 'ALTER ' + TABLE;
117
- const FROM = 'FROM';
118
- const DELETE_FROM = DELETE + ' ' + FROM;
119
- const SELECT_STAR_FROM = SELECT + '*' + FROM;
120
- const PRAGMA = 'pragma_';
121
- const DATA_VERSION = 'data_version';
122
- const SCHEMA_VERSION = 'schema_version';
123
- const PRAGMA_TABLE = 'pragma_table_';
124
- const CREATE = 'CREATE ';
125
- const CREATE_TABLE = CREATE + TABLE;
126
- const TABLE_NAME_PLACEHOLDER_REGEX = /\$tableName/g;
127
- const getWrappedCommand = (executeCommand, onSqlCommand) =>
128
- onSqlCommand
129
- ? async (sql, params) => {
130
- onSqlCommand(sql, params);
131
- return await executeCommand(sql, params);
132
- }
133
- : executeCommand;
134
- const escapeId = (str) =>
135
- arrayJoin(
136
- arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
137
- DOT,
138
- );
139
- const escapeColumnNames = (...columnNames) =>
140
- arrayJoin(arrayMap(columnNames, escapeId), COMMA);
141
- const anonymousPlaceholder = () => '?';
142
- const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
143
- arrayJoin(
144
- arrayMap(array, () => getPlaceholder(offset)),
145
- COMMA,
146
- );
147
- const getWhereCondition = (tableName, condition = TRUE) =>
148
- WHERE + `(${replaceTableName(condition, escapeId(tableName))})`;
149
- const replaceTableName = (condition, tableName) =>
150
- strReplace(condition, TABLE_NAME_PLACEHOLDER_REGEX, tableName);
151
-
152
108
  const object = Object;
153
109
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
154
110
  const objEntries = object.entries;
@@ -198,6 +154,62 @@ const objValues = (obj) => object.values(obj);
198
154
  const objSize = (obj) => size(objIds(obj));
199
155
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
200
156
 
157
+ const SINGLE_ROW_ID = '_';
158
+ const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
159
+ const SELECT = 'SELECT';
160
+ const WHERE = 'WHERE';
161
+ const TABLE = 'TABLE';
162
+ const INSERT = 'INSERT';
163
+ const DELETE = 'DELETE';
164
+ const UPDATE = 'UPDATE';
165
+ const ALTER_TABLE = 'ALTER ' + TABLE;
166
+ const FROM = 'FROM';
167
+ const DELETE_FROM = DELETE + ' ' + FROM;
168
+ const SELECT_STAR_FROM = SELECT + '*' + FROM;
169
+ const PRAGMA = 'pragma_';
170
+ const DATA_VERSION = 'data_version';
171
+ const SCHEMA_VERSION = 'schema_version';
172
+ const PRAGMA_TABLE = 'pragma_table_';
173
+ const CREATE = 'CREATE ';
174
+ const CREATE_TABLE = CREATE + TABLE;
175
+ const TABLE_NAME_PLACEHOLDER_REGEX = /\$tableName/g;
176
+ const getWrappedCommand = (executeCommand, onSqlCommand) =>
177
+ onSqlCommand
178
+ ? async (sql, params) => {
179
+ onSqlCommand(sql, params);
180
+ return await executeCommand(sql, params);
181
+ }
182
+ : executeCommand;
183
+ const escapeId = (str) =>
184
+ arrayJoin(
185
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
186
+ DOT,
187
+ );
188
+ const escapeColumnNames = (...columnNames) =>
189
+ arrayJoin(arrayMap(columnNames, escapeId), COMMA);
190
+ const anonymousPlaceholder = () => '?';
191
+ const getPlaceholders = (array, getPlaceholder, offset = [1]) =>
192
+ arrayJoin(
193
+ arrayMap(array, () => getPlaceholder(offset)),
194
+ COMMA,
195
+ );
196
+ const getWhere = (tableName, condition = TRUE, extraCondition) => {
197
+ const conditions = arrayFilter(
198
+ [
199
+ condition == TRUE
200
+ ? void 0
201
+ : `(${replaceTableName(condition, escapeId(tableName))})`,
202
+ extraCondition,
203
+ ],
204
+ (condition2) => !isUndefined(condition2),
205
+ );
206
+ return isEmpty(conditions)
207
+ ? EMPTY_STRING
208
+ : WHERE + arrayJoin(conditions, 'AND');
209
+ };
210
+ const replaceTableName = (condition, tableName) =>
211
+ strReplace(condition, TABLE_NAME_PLACEHOLDER_REGEX, tableName);
212
+
201
213
  const map = Map;
202
214
  const mapNew = (entries) => new map(entries);
203
215
  const mapGet = (map2, key) => map2?.get(key);
@@ -1045,7 +1057,7 @@ const getCommandFunctions = (
1045
1057
  await executeCommand(
1046
1058
  SELECT_STAR_FROM +
1047
1059
  escapeId(tableName) +
1048
- getWhereCondition(tableName, condition),
1060
+ getWhere(tableName, condition),
1049
1061
  ),
1050
1062
  (row) => {
1051
1063
  const rowId = row[rowIdColumnName];
@@ -1201,9 +1213,7 @@ const getCommandFunctions = (
1201
1213
  if (isUndefined(content)) {
1202
1214
  if (isUndefined(contentSubIdSet)) {
1203
1215
  await executeCommand(
1204
- DELETE_FROM +
1205
- escapeId(tableName) +
1206
- getWhereCondition(tableName, condition),
1216
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1207
1217
  );
1208
1218
  }
1209
1219
  } else {
@@ -1213,8 +1223,11 @@ const getCommandFunctions = (
1213
1223
  await executeCommand(
1214
1224
  DELETE_FROM +
1215
1225
  escapeId(tableName) +
1216
- getWhereCondition(tableName, condition) +
1217
- `AND(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1226
+ getWhere(
1227
+ tableName,
1228
+ condition,
1229
+ `(${escapeId(rowIdColumnName)}=${getPlaceholder([1])})`,
1230
+ ),
1218
1231
  [rowId],
1219
1232
  );
1220
1233
  } else if (!isEmpty(settingColumnNames)) {
@@ -1273,8 +1286,12 @@ const getCommandFunctions = (
1273
1286
  await executeCommand(
1274
1287
  DELETE_FROM +
1275
1288
  escapeId(tableName) +
1276
- getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
1277
- `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1289
+ getWhere(
1290
+ tableName,
1291
+ condition,
1292
+ // eslint-disable-next-line max-len
1293
+ `${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds, getPlaceholder)})`,
1294
+ ),
1278
1295
  deleteRowIds,
1279
1296
  );
1280
1297
  } else if (
@@ -1282,9 +1299,7 @@ const getCommandFunctions = (
1282
1299
  collHas(schemaMap, tableName)
1283
1300
  ) {
1284
1301
  await executeCommand(
1285
- DELETE_FROM +
1286
- escapeId(tableName) +
1287
- getWhereCondition(tableName, condition),
1302
+ DELETE_FROM + escapeId(tableName) + getWhere(tableName, condition),
1288
1303
  );
1289
1304
  }
1290
1305
  }