tinybase 9.4.0-beta.0 → 9.4.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 (225) hide show
  1. package/@types/persisters/index.d.ts +4 -0
  2. package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +9 -2
  3. package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +9 -2
  4. package/@types/persisters/with-schemas/index.d.ts +4 -0
  5. package/@types/queries/index.d.ts +145 -7
  6. package/@types/queries/with-schemas/index.d.ts +157 -7
  7. package/@types/synchronizers/synchronizer-ws-client/index.d.ts +7 -3
  8. package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +7 -3
  9. package/@types/synchronizers/synchronizer-ws-server/index.d.ts +9 -3
  10. package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +9 -3
  11. package/@types/synchronizers/synchronizer-ws-server-simple/index.d.ts +6 -3
  12. package/@types/synchronizers/synchronizer-ws-server-simple/with-schemas/index.d.ts +6 -3
  13. package/index.js +315 -22
  14. package/min/index.js +1 -1
  15. package/min/index.js.gz +0 -0
  16. package/min/omni/index.js +1 -1
  17. package/min/omni/index.js.gz +0 -0
  18. package/min/omni/with-schemas/index.js +1 -1
  19. package/min/omni/with-schemas/index.js.gz +0 -0
  20. package/min/persisters/index.js +1 -1
  21. package/min/persisters/index.js.gz +0 -0
  22. package/min/persisters/persister-automerge/index.js +1 -1
  23. package/min/persisters/persister-automerge/index.js.gz +0 -0
  24. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  25. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  26. package/min/persisters/persister-browser/index.js +1 -1
  27. package/min/persisters/persister-browser/index.js.gz +0 -0
  28. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  29. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  30. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  31. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  32. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  33. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  34. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  35. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  36. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  37. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  38. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  39. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  40. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  41. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  42. package/min/persisters/persister-electric-sql/index.js +1 -1
  43. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  44. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  45. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  46. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  47. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  48. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  49. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  50. package/min/persisters/persister-file/index.js +1 -1
  51. package/min/persisters/persister-file/index.js.gz +0 -0
  52. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  53. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  54. package/min/persisters/persister-indexed-db/index.js +1 -1
  55. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  56. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  57. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  58. package/min/persisters/persister-libsql/index.js +1 -1
  59. package/min/persisters/persister-libsql/index.js.gz +0 -0
  60. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  61. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  62. package/min/persisters/persister-partykit-client/index.js +1 -1
  63. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  64. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  65. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  66. package/min/persisters/persister-pglite/index.js +1 -1
  67. package/min/persisters/persister-pglite/index.js.gz +0 -0
  68. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  69. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  70. package/min/persisters/persister-postgres/index.js +1 -1
  71. package/min/persisters/persister-postgres/index.js.gz +0 -0
  72. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  73. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  74. package/min/persisters/persister-powersync/index.js +1 -1
  75. package/min/persisters/persister-powersync/index.js.gz +0 -0
  76. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  77. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  78. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  79. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  80. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  81. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  82. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  83. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  84. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  85. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  86. package/min/persisters/persister-remote/index.js +1 -1
  87. package/min/persisters/persister-remote/index.js.gz +0 -0
  88. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  89. package/min/persisters/persister-remote/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-yjs/index.js +1 -1
  103. package/min/persisters/persister-yjs/index.js.gz +0 -0
  104. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  105. package/min/persisters/persister-yjs/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/min/queries/index.js +1 -1
  109. package/min/queries/index.js.gz +0 -0
  110. package/min/queries/with-schemas/index.js +1 -1
  111. package/min/queries/with-schemas/index.js.gz +0 -0
  112. package/min/synchronizers/index.js +1 -1
  113. package/min/synchronizers/index.js.gz +0 -0
  114. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  115. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  116. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  117. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  118. package/min/synchronizers/synchronizer-local/index.js +1 -1
  119. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  120. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  121. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  122. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  123. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  124. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  125. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  126. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  127. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  128. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  129. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  130. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  131. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  132. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  133. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  134. package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  135. package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
  136. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  137. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
  138. package/min/synchronizers/with-schemas/index.js +1 -1
  139. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  140. package/min/ui-react-inspector/index.js +1 -1
  141. package/min/ui-react-inspector/index.js.gz +0 -0
  142. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  143. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  144. package/min/ui-solid-inspector/index.js +1 -1
  145. package/min/ui-solid-inspector/index.js.gz +0 -0
  146. package/min/ui-solid-inspector/with-schemas/index.js +1 -1
  147. package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
  148. package/min/ui-svelte-inspector/index.js +1 -1
  149. package/min/ui-svelte-inspector/index.js.gz +0 -0
  150. package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
  151. package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
  152. package/min/with-schemas/index.js +1 -1
  153. package/min/with-schemas/index.js.gz +0 -0
  154. package/omni/index.js +730 -127
  155. package/omni/with-schemas/index.js +730 -127
  156. package/package.json +8 -4
  157. package/persisters/index.js +49 -10
  158. package/persisters/persister-automerge/index.js +29 -5
  159. package/persisters/persister-automerge/with-schemas/index.js +29 -5
  160. package/persisters/persister-browser/index.js +29 -5
  161. package/persisters/persister-browser/with-schemas/index.js +29 -5
  162. package/persisters/persister-cr-sqlite-wasm/index.js +29 -5
  163. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +29 -5
  164. package/persisters/persister-durable-object-sql-storage/index.js +44 -8
  165. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +44 -8
  166. package/persisters/persister-durable-object-storage/index.js +31 -5
  167. package/persisters/persister-durable-object-storage/with-schemas/index.js +31 -5
  168. package/persisters/persister-electric-sql/index.js +29 -5
  169. package/persisters/persister-electric-sql/with-schemas/index.js +29 -5
  170. package/persisters/persister-expo-sqlite/index.js +29 -5
  171. package/persisters/persister-expo-sqlite/with-schemas/index.js +29 -5
  172. package/persisters/persister-file/index.js +31 -5
  173. package/persisters/persister-file/with-schemas/index.js +31 -5
  174. package/persisters/persister-indexed-db/index.js +29 -5
  175. package/persisters/persister-indexed-db/with-schemas/index.js +29 -5
  176. package/persisters/persister-libsql/index.js +29 -5
  177. package/persisters/persister-libsql/with-schemas/index.js +29 -5
  178. package/persisters/persister-partykit-client/index.js +31 -5
  179. package/persisters/persister-partykit-client/with-schemas/index.js +31 -5
  180. package/persisters/persister-pglite/index.js +49 -10
  181. package/persisters/persister-pglite/with-schemas/index.js +49 -10
  182. package/persisters/persister-postgres/index.js +49 -10
  183. package/persisters/persister-postgres/with-schemas/index.js +49 -10
  184. package/persisters/persister-powersync/index.js +29 -5
  185. package/persisters/persister-powersync/with-schemas/index.js +29 -5
  186. package/persisters/persister-react-native-mmkv/index.js +31 -5
  187. package/persisters/persister-react-native-mmkv/with-schemas/index.js +31 -5
  188. package/persisters/persister-react-native-sqlite/index.js +29 -5
  189. package/persisters/persister-react-native-sqlite/with-schemas/index.js +29 -5
  190. package/persisters/persister-remote/index.js +31 -5
  191. package/persisters/persister-remote/with-schemas/index.js +31 -5
  192. package/persisters/persister-sqlite-bun/index.js +29 -5
  193. package/persisters/persister-sqlite-bun/with-schemas/index.js +29 -5
  194. package/persisters/persister-sqlite-wasm/index.js +29 -5
  195. package/persisters/persister-sqlite-wasm/with-schemas/index.js +29 -5
  196. package/persisters/persister-sqlite3/index.js +29 -5
  197. package/persisters/persister-sqlite3/with-schemas/index.js +29 -5
  198. package/persisters/persister-yjs/index.js +29 -5
  199. package/persisters/persister-yjs/with-schemas/index.js +29 -5
  200. package/persisters/with-schemas/index.js +49 -10
  201. package/queries/index.js +334 -22
  202. package/queries/with-schemas/index.js +334 -22
  203. package/readme.md +14 -14
  204. package/releases.md +84 -67
  205. package/synchronizers/index.js +31 -5
  206. package/synchronizers/synchronizer-broadcast-channel/index.js +39 -13
  207. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +39 -13
  208. package/synchronizers/synchronizer-local/index.js +31 -5
  209. package/synchronizers/synchronizer-local/with-schemas/index.js +31 -5
  210. package/synchronizers/synchronizer-ws-client/index.js +220 -61
  211. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +220 -61
  212. package/synchronizers/synchronizer-ws-server/index.js +253 -73
  213. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +253 -73
  214. package/synchronizers/synchronizer-ws-server-durable-object/index.js +88 -40
  215. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +88 -40
  216. package/synchronizers/synchronizer-ws-server-simple/index.js +184 -60
  217. package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +184 -60
  218. package/synchronizers/with-schemas/index.js +31 -5
  219. package/ui-react-inspector/index.js +29 -5
  220. package/ui-react-inspector/with-schemas/index.js +29 -5
  221. package/ui-solid-inspector/index.js +29 -5
  222. package/ui-solid-inspector/with-schemas/index.js +29 -5
  223. package/ui-svelte-inspector/index.js +29 -5
  224. package/ui-svelte-inspector/with-schemas/index.js +29 -5
  225. package/with-schemas/index.js +315 -22
package/queries/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  const getTypeOf = (thing) => typeof thing;
2
+ const TINYBASE = 'tinybase';
2
3
  const EMPTY_STRING = '';
3
4
  const STRING = getTypeOf(EMPTY_STRING);
4
5
  const BOOLEAN = getTypeOf(true);
@@ -53,6 +54,7 @@ const arrayEvery = (array, cb) => array.every(cb);
53
54
  const arrayIsEqual = (array1, array2) =>
54
55
  size(array1) === size(array2) &&
55
56
  arrayEvery(array1, (value1, index) => array2[index] === value1);
57
+ const arraySort = (array, sorter) => array.sort(sorter);
56
58
  const arrayForEach = (array, cb) => array.forEach(cb);
57
59
  const arraySum = (array) => arrayReduce(array, (i, j) => i + j, 0);
58
60
  const arrayMax = (array) =>
@@ -111,6 +113,10 @@ const objNew = (entries = []) => {
111
113
  arrayForEach(entries, ([id, value]) => objSet(obj, id, value));
112
114
  return obj;
113
115
  };
116
+ const objDel = (obj, id) => {
117
+ delete obj[id];
118
+ return obj;
119
+ };
114
120
  const objForEach = (obj, cb) =>
115
121
  arrayForEach(objIds(obj), (id) => cb(obj[id], id));
116
122
  const objSize = (obj) => size(objIds(obj));
@@ -246,6 +252,20 @@ const getCellOrValueType = (cellOrValue) => {
246
252
  const encodeIfJson = (value) =>
247
253
  isObject(value) || isArray(value) ? JSON_PREFIX + jsonString(value) : value;
248
254
 
255
+ const ERROR_QUERY_SELECT_ALL_CYCLE = 16;
256
+ const errorNew = (code, details) =>
257
+ new Error(
258
+ TINYBASE +
259
+ ':' +
260
+ code +
261
+ (isUndefined(details)
262
+ ? EMPTY_STRING
263
+ : /* istanbul ignore next */
264
+ ':' + details),
265
+ );
266
+ const errorThrow = (code, details) => {
267
+ throw errorNew(code, details);
268
+ };
249
269
  const tryCatchSync = (action, onError) => {
250
270
  try {
251
271
  return action();
@@ -464,6 +484,51 @@ const createQueries = getCreateFunction((store) => {
464
484
  };
465
485
  const preStoreListenerIds = mapNew();
466
486
  const sourceStoreListenerIds = mapNew();
487
+ const selectAllListenerIds = mapNew();
488
+ const selectAllRetryListenerIds = mapNew();
489
+ const selectAllQuerySources = mapNew();
490
+ const referencedQueryIds = mapNew();
491
+ const assertNoMappedSelectAllCycle = (queryId, nextQuerySources) => {
492
+ const getQuerySources = (sourceQueryId) =>
493
+ sourceQueryId === queryId
494
+ ? nextQuerySources
495
+ : mapGet(selectAllQuerySources, sourceQueryId);
496
+ const reachesQuery = (
497
+ sourceQueryId,
498
+ targetQueryId,
499
+ visitedQueryIds = setNew(),
500
+ ) => {
501
+ if (sourceQueryId === targetQueryId) {
502
+ return true;
503
+ }
504
+ if (collHas(visitedQueryIds, sourceQueryId)) {
505
+ return false;
506
+ }
507
+ setAdd(visitedQueryIds, sourceQueryId);
508
+ return !collEvery(
509
+ getQuerySources(sourceQueryId),
510
+ (_changesCellId, nextQueryId) =>
511
+ !reachesQuery(nextQueryId, targetQueryId, visitedQueryIds),
512
+ );
513
+ };
514
+ const hasMappedCycle = (sourceQueryId, querySources) =>
515
+ !collEvery(
516
+ querySources,
517
+ (changesCellId, nextQueryId) =>
518
+ !changesCellId || !reachesQuery(nextQueryId, sourceQueryId),
519
+ );
520
+ if (
521
+ hasMappedCycle(queryId, nextQuerySources) ||
522
+ !collEvery(
523
+ selectAllQuerySources,
524
+ (querySources, sourceQueryId) =>
525
+ sourceQueryId === queryId ||
526
+ !hasMappedCycle(sourceQueryId, querySources),
527
+ )
528
+ ) {
529
+ errorThrow(ERROR_QUERY_SELECT_ALL_CYCLE);
530
+ }
531
+ };
467
532
  const {
468
533
  _: [, addListener, callListeners],
469
534
  delListener: delListenerImpl,
@@ -537,11 +602,72 @@ const createQueries = getCreateFunction((store) => {
537
602
  resetStoreListeners(mapGet(sourceStoreListenerIds, queryId));
538
603
  mapSet(sourceStoreListenerIds, queryId);
539
604
  };
540
- const isResultStoreReferenced = (resultStore2) =>
605
+ const clearSelectAllRetryListeners = (queryId) =>
606
+ ifNotUndefined(
607
+ mapGet(selectAllRetryListenerIds, queryId),
608
+ (listenerIds) => {
609
+ mapForEach(listenerIds, (sourceStore, listenerIdsByTableId) =>
610
+ mapForEach(listenerIdsByTableId, (_sourceTableId, listenerId) =>
611
+ sourceStore.delListener(listenerId),
612
+ ),
613
+ );
614
+ mapSet(selectAllRetryListenerIds, queryId);
615
+ },
616
+ );
617
+ const addSelectAllRetryListener = (queryId, sourceStore, sourceTableId) => {
618
+ const listenerIdsByTableId = mapEnsure(
619
+ mapEnsure(selectAllRetryListenerIds, queryId, mapNew),
620
+ sourceStore,
621
+ mapNew,
622
+ );
623
+ mapEnsure(listenerIdsByTableId, sourceTableId, () =>
624
+ sourceStore.addTableListener(sourceTableId, () =>
625
+ setQueryDefinitionImpl(queryId),
626
+ ),
627
+ );
628
+ };
629
+ const syncSelectAllListeners = (queryId, nextSources = mapNew()) => {
630
+ const listenerIds = mapEnsure(selectAllListenerIds, queryId, mapNew);
631
+ mapForEach(listenerIds, (sourceStore, listenerIdsByTableId) => {
632
+ mapForEach(listenerIdsByTableId, (sourceTableId, listenerId) =>
633
+ collHas(mapGet(nextSources, sourceStore), sourceTableId)
634
+ ? 0
635
+ : (sourceStore.delListener(listenerId),
636
+ mapSet(listenerIdsByTableId, sourceTableId)),
637
+ );
638
+ if (collIsEmpty(listenerIdsByTableId)) {
639
+ mapSet(listenerIds, sourceStore);
640
+ }
641
+ });
642
+ mapForEach(nextSources, (sourceStore, tableIds) => {
643
+ const listenerIdsByTableId = mapEnsure(listenerIds, sourceStore, mapNew);
644
+ collForEach(tableIds, (sourceTableId) =>
645
+ mapEnsure(listenerIdsByTableId, sourceTableId, () =>
646
+ sourceStore.addTableCellIdsListener(sourceTableId, () =>
647
+ tryCatchSync(
648
+ () => setQueryDefinitionImpl(queryId),
649
+ (error) => {
650
+ addSelectAllRetryListener(queryId, sourceStore, sourceTableId);
651
+ throw error;
652
+ },
653
+ ),
654
+ ),
655
+ ),
656
+ );
657
+ });
658
+ if (collIsEmpty(listenerIds)) {
659
+ mapSet(selectAllListenerIds, queryId);
660
+ }
661
+ };
662
+ const isResultStoreReferenced = (queryId, resultStore2) =>
541
663
  !(
542
664
  collEvery(routedResultListeners, ([, storeListenerIds]) =>
543
665
  collEvery(storeListenerIds, ([store2]) => store2 !== resultStore2),
544
666
  ) &&
667
+ collEvery(
668
+ referencedQueryIds,
669
+ (queryIds) => !collHas(queryIds, queryId),
670
+ ) &&
545
671
  arrayEvery(
546
672
  [preStoreListenerIds, sourceStoreListenerIds],
547
673
  (storeListenerIds) =>
@@ -556,7 +682,7 @@ const createQueries = getCreateFunction((store) => {
556
682
  hasQuery(queryId) ? 0 : mapSet(preStores, queryId),
557
683
  );
558
684
  mapForEach(resultStores, (queryId, resultStore2) =>
559
- hasQuery(queryId) || isResultStoreReferenced(resultStore2)
685
+ hasQuery(queryId) || isResultStoreReferenced(queryId, resultStore2)
560
686
  ? 0
561
687
  : mapSet(resultStores, queryId),
562
688
  );
@@ -638,7 +764,13 @@ const createQueries = getCreateFunction((store) => {
638
764
  const rootStore = asQuery ? getResultStore(tableId) : store;
639
765
  const resultStore2 = getResultStore(queryId);
640
766
  const paramValues = definition?.[3] ?? getParamValues(queryId);
641
- const selectEntries = [];
767
+ const nextReferencedQueryIds = stagedDefinition[4];
768
+ if (asQuery) {
769
+ setAdd(nextReferencedQueryIds, tableId);
770
+ }
771
+ const selectionEntries = [];
772
+ let hasSelectAll = false;
773
+ let selectCount = 0;
642
774
  const joinEntries = [
643
775
  [void 0, [tableId, void 0, void 0, [], mapNew(), rootStore]],
644
776
  ];
@@ -650,21 +782,39 @@ const createQueries = getCreateFunction((store) => {
650
782
  const joinedTableId = isTrue(arg1) ? arg2 : arg1;
651
783
  const joinedCellId = isTrue(arg1) ? arg3 : arg2;
652
784
  const selectEntry = isFunction(arg1)
653
- ? [size(selectEntries) + EMPTY_STRING, arg1]
785
+ ? [0, selectCount + EMPTY_STRING, arg1]
654
786
  : isUndefined(joinedCellId)
655
- ? [arg1, (getTableCell) => getTableCell(arg1)]
787
+ ? [0, arg1, (getTableCell) => getTableCell(arg1)]
656
788
  : [
789
+ 0,
657
790
  joinedCellId,
658
791
  (getTableCell) =>
659
792
  isTrue(arg1)
660
793
  ? getTableCell(true, joinedTableId, joinedCellId)
661
794
  : getTableCell(joinedTableId, joinedCellId),
662
795
  ];
663
- arrayPush(selectEntries, selectEntry);
796
+ selectCount++;
797
+ arrayPush(selectionEntries, selectEntry);
664
798
  return {
665
- as: (selectedCellId) => (selectEntry[0] = selectedCellId),
799
+ as: (selectedCellId) => (selectEntry[1] = selectedCellId),
666
800
  };
667
801
  };
802
+ const selectAll = (arg1, arg2, arg3) => {
803
+ hasSelectAll = true;
804
+ const joinedTableId = isTrue(arg1) ? arg2 : arg1;
805
+ const prefixOrMapper = isTrue(arg1) ? arg3 : arg2;
806
+ arrayPush(selectionEntries, [
807
+ 1,
808
+ joinedTableId,
809
+ isFunction(prefixOrMapper)
810
+ ? prefixOrMapper
811
+ : (cellId) => (prefixOrMapper ?? EMPTY_STRING) + cellId,
812
+ isFunction(prefixOrMapper) ||
813
+ (!isUndefined(prefixOrMapper) && prefixOrMapper !== EMPTY_STRING)
814
+ ? 1
815
+ : 0,
816
+ ]);
817
+ };
668
818
  const join = (arg1, arg2, arg3, arg4) => {
669
819
  const joinedTableId = isTrue(arg1) ? arg2 : arg1;
670
820
  const [fromJoinAlias, onArg] = isTrue(arg1)
@@ -674,6 +824,13 @@ const createQueries = getCreateFunction((store) => {
674
824
  : isUndefined(arg3) || isFunction(arg2)
675
825
  ? [void 0, arg2]
676
826
  : [arg2, arg3];
827
+ const sourceIsQuery = isTrue(arg1);
828
+ const sourceStore = sourceIsQuery
829
+ ? getResultStore(joinedTableId)
830
+ : store;
831
+ if (sourceIsQuery) {
832
+ setAdd(nextReferencedQueryIds, joinedTableId);
833
+ }
677
834
  const joinEntry = [
678
835
  joinedTableId,
679
836
  [
@@ -682,7 +839,7 @@ const createQueries = getCreateFunction((store) => {
682
839
  isFunction(onArg) ? onArg : (getCell) => getCell(onArg),
683
840
  [],
684
841
  mapNew(),
685
- isTrue(arg1) ? getResultStore(joinedTableId) : store,
842
+ sourceStore,
686
843
  ],
687
844
  ];
688
845
  arrayPush(joinEntries, joinEntry);
@@ -728,21 +885,86 @@ const createQueries = getCreateFunction((store) => {
728
885
  : (getSelectedOrGroupedCell) =>
729
886
  getSelectedOrGroupedCell(arg1) === arg2,
730
887
  );
731
- build({select, join, where, group, having, param});
732
- resultStore2.delTable(queryId);
733
- const selects = mapNew(selectEntries);
734
- if (collIsEmpty(selects)) {
735
- commit?.();
736
- return queries;
737
- }
888
+ build({select, selectAll, join, where, group, having, param});
738
889
  const joins = mapNew(joinEntries);
739
890
  mapForEach(joins, (joinAlias, [, fromJoinAlias]) =>
740
891
  ifNotUndefined(mapGet(joins, fromJoinAlias), ({3: toJoinAliases2}) =>
741
892
  isUndefined(joinAlias) ? 0 : arrayPush(toJoinAliases2, joinAlias),
742
893
  ),
743
894
  );
895
+ const isRootSelectAll = (joinedTableId) => isUndefined(joinedTableId);
896
+ const getSelectAllJoin = (joinedTableId) =>
897
+ mapGet(
898
+ joins,
899
+ isRootSelectAll(joinedTableId) ? void 0 : joinedTableId,
900
+ );
901
+ const nextSelectAllQuerySources = stagedDefinition[5];
902
+ arrayForEach(
903
+ selectionEntries,
904
+ ([selectAll2, selectedOrJoinedTableId, , changesCellId = 0]) =>
905
+ selectAll2
906
+ ? ifNotUndefined(
907
+ getSelectAllJoin(selectedOrJoinedTableId),
908
+ ([sourceQueryId, , , , , sourceStore]) =>
909
+ sourceStore === store
910
+ ? 0
911
+ : mapSet(
912
+ nextSelectAllQuerySources,
913
+ sourceQueryId,
914
+ mapGet(nextSelectAllQuerySources, sourceQueryId) ||
915
+ changesCellId
916
+ ? 1
917
+ : 0,
918
+ ),
919
+ )
920
+ : 0,
921
+ );
922
+ assertNoMappedSelectAllCycle(queryId, nextSelectAllQuerySources);
923
+ resultStore2.delTable(queryId);
924
+ if (isEmpty(selectionEntries)) {
925
+ commit?.();
926
+ return queries;
927
+ }
744
928
  const groups = mapNew(groupEntries);
745
929
  const hasGroupsOrHavings = !collIsEmpty(groups) || !isEmpty(havings);
930
+ const selectEntries = [];
931
+ const selectAllSources = stagedDefinition[3];
932
+ arrayForEach(
933
+ selectionEntries,
934
+ ([selectAll2, selectedOrJoinedTableId, clauseOrMapper]) => {
935
+ if (selectAll2) {
936
+ if (hasGroupsOrHavings) {
937
+ ifNotUndefined(
938
+ getSelectAllJoin(selectedOrJoinedTableId),
939
+ ([realTableId, , , , , sourceStore]) => {
940
+ setAdd(
941
+ mapEnsure(selectAllSources, sourceStore, setNew),
942
+ realTableId,
943
+ );
944
+ arrayForEach(
945
+ arraySort(sourceStore.getTableCellIds(realTableId)),
946
+ (cellId) =>
947
+ arrayPush(selectEntries, [
948
+ clauseOrMapper(cellId),
949
+ getUndefined,
950
+ ]),
951
+ );
952
+ },
953
+ );
954
+ }
955
+ } else {
956
+ arrayPush(selectEntries, [
957
+ selectedOrJoinedTableId,
958
+ clauseOrMapper,
959
+ ]);
960
+ }
961
+ },
962
+ );
963
+ const selects = mapNew(selectEntries);
964
+ if (hasGroupsOrHavings && collIsEmpty(selects)) {
965
+ commit?.();
966
+ return queries;
967
+ }
746
968
  const selectJoinWhereStore = hasGroupsOrHavings
747
969
  ? (stagedDefinition[2] = createStore())
748
970
  : resultStore2;
@@ -921,18 +1143,85 @@ const createQueries = getCreateFunction((store) => {
921
1143
  joinedCellId,
922
1144
  );
923
1145
  };
924
- selectJoinWhereStore.transaction(() =>
925
- arrayEvery(wheres, (where2) => where2(getJoinCell))
926
- ? mapForEach(selects, (asCellId, tableCellGetter) =>
1146
+ const writeSelectAllRow = () => {
1147
+ const resultRow = objNew();
1148
+ arrayForEach(
1149
+ selectionEntries,
1150
+ ([selectAll2, selectedOrJoinedTableId, clauseOrMapper]) => {
1151
+ if (selectAll2) {
1152
+ ifNotUndefined(
1153
+ getSelectAllJoin(selectedOrJoinedTableId),
1154
+ ([realTableId, , , , remoteIdPairs, sourceStore]) => {
1155
+ const sourceRowId = isRootSelectAll(
1156
+ selectedOrJoinedTableId,
1157
+ )
1158
+ ? rootRowId
1159
+ : mapGet(remoteIdPairs, rootRowId)?.[0];
1160
+ ifNotUndefined(sourceRowId, (sourceRowId2) =>
1161
+ arrayForEach(
1162
+ arraySort(
1163
+ sourceStore.getCellIds(realTableId, sourceRowId2),
1164
+ ),
1165
+ (cellId) =>
1166
+ objSet(
1167
+ resultRow,
1168
+ clauseOrMapper(cellId),
1169
+ sourceStore.getCell(
1170
+ realTableId,
1171
+ sourceRowId2,
1172
+ cellId,
1173
+ ),
1174
+ ),
1175
+ ),
1176
+ );
1177
+ },
1178
+ );
1179
+ } else {
1180
+ const selectedCell = clauseOrMapper(getJoinCell, rootRowId);
1181
+ const selectedCellId = selectedOrJoinedTableId;
1182
+ if (isUndefined(selectedCell)) {
1183
+ objDel(resultRow, selectedCellId);
1184
+ } else {
1185
+ objSet(resultRow, selectedCellId, selectedCell);
1186
+ }
1187
+ }
1188
+ },
1189
+ );
1190
+ if (objIsEmpty(resultRow)) {
1191
+ selectJoinWhereStore.delRow(queryId, rootRowId);
1192
+ } else {
1193
+ selectJoinWhereStore.setRow(queryId, rootRowId, resultRow);
1194
+ }
1195
+ };
1196
+ selectJoinWhereStore.transaction(() => {
1197
+ if (!arrayEvery(wheres, (where2) => where2(getJoinCell))) {
1198
+ selectJoinWhereStore.delRow(queryId, rootRowId);
1199
+ } else if (hasGroupsOrHavings) {
1200
+ if (hasSelectAll) {
1201
+ writeSelectAllRow();
1202
+ } else {
1203
+ mapForEach(selects, (asCellId, tableCellGetter) =>
927
1204
  selectJoinWhereStore._[5](
928
1205
  queryId,
929
1206
  rootRowId,
930
1207
  asCellId,
931
1208
  tableCellGetter(getJoinCell, rootRowId),
932
1209
  ),
933
- )
934
- : selectJoinWhereStore.delRow(queryId, rootRowId),
935
- );
1210
+ );
1211
+ }
1212
+ } else if (hasSelectAll) {
1213
+ writeSelectAllRow();
1214
+ } else {
1215
+ mapForEach(selects, (asCellId, tableCellGetter) =>
1216
+ selectJoinWhereStore._[5](
1217
+ queryId,
1218
+ rootRowId,
1219
+ asCellId,
1220
+ tableCellGetter(getJoinCell, rootRowId),
1221
+ ),
1222
+ );
1223
+ }
1224
+ });
936
1225
  };
937
1226
  const listenToTable = (
938
1227
  rootRowId,
@@ -1051,7 +1340,14 @@ const createQueries = getCreateFunction((store) => {
1051
1340
  }),
1052
1341
  );
1053
1342
  const setQueryDefinitionImpl = (queryId, definition) => {
1054
- const stagedDefinition = [mapNew(), mapNew()];
1343
+ const stagedDefinition = [
1344
+ mapNew(),
1345
+ mapNew(),
1346
+ void 0,
1347
+ mapNew(),
1348
+ setNew(),
1349
+ mapNew(),
1350
+ ];
1055
1351
  let committed = false;
1056
1352
  tryCatchSync(
1057
1353
  () =>
@@ -1072,6 +1368,18 @@ const createQueries = getCreateFunction((store) => {
1072
1368
  collIsEmpty(stagedDefinition[1]) ? void 0 : stagedDefinition[1],
1073
1369
  );
1074
1370
  mapSet(preStores, queryId, stagedDefinition[2]);
1371
+ syncSelectAllListeners(queryId, stagedDefinition[3]);
1372
+ clearSelectAllRetryListeners(queryId);
1373
+ mapSet(
1374
+ referencedQueryIds,
1375
+ queryId,
1376
+ collIsEmpty(stagedDefinition[4]) ? void 0 : stagedDefinition[4],
1377
+ );
1378
+ mapSet(
1379
+ selectAllQuerySources,
1380
+ queryId,
1381
+ collIsEmpty(stagedDefinition[5]) ? void 0 : stagedDefinition[5],
1382
+ );
1075
1383
  committed = true;
1076
1384
  }),
1077
1385
  (error) => {
@@ -1121,6 +1429,10 @@ const createQueries = getCreateFunction((store) => {
1121
1429
  paramStore.delRow(PARAMS_TABLE, queryId);
1122
1430
  resetPreStores(queryId);
1123
1431
  resetSourceStores(queryId);
1432
+ syncSelectAllListeners(queryId);
1433
+ clearSelectAllRetryListeners(queryId);
1434
+ mapSet(referencedQueryIds, queryId);
1435
+ mapSet(selectAllQuerySources, queryId);
1124
1436
  delDefinition(queryId);
1125
1437
  cleanStores();
1126
1438
  return queries;