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
@@ -1245,11 +1245,35 @@ const createCustomPersister = (
1245
1245
  initialContent,
1246
1246
  startSaveFirst = false,
1247
1247
  ) => {
1248
- const [call1, call2] = startSaveFirst
1249
- ? [startAutoSave, startAutoLoad]
1250
- : [startAutoLoad, startAutoSave];
1251
- await call1(initialContent);
1252
- await call2(initialContent);
1248
+ const [call1, call2, stop1, stop2] = startSaveFirst
1249
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
1250
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
1251
+ const start1 = call1(initialContent);
1252
+ const generation1 = startSaveFirst
1253
+ ? autoSaveGeneration
1254
+ : autoLoadGeneration;
1255
+ await start1;
1256
+ const start2 = call2(initialContent);
1257
+ const generation2 = startSaveFirst
1258
+ ? autoLoadGeneration
1259
+ : autoSaveGeneration;
1260
+ try {
1261
+ await start2;
1262
+ } catch (error) {
1263
+ if (
1264
+ generation2 ==
1265
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
1266
+ ) {
1267
+ await tryCatchIgnore(stop2);
1268
+ }
1269
+ if (
1270
+ generation1 ==
1271
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
1272
+ ) {
1273
+ await tryCatchIgnore(stop1);
1274
+ }
1275
+ throw error;
1276
+ }
1253
1277
  return persister;
1254
1278
  };
1255
1279
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -261,6 +261,7 @@ const collForEach = (coll, cb) => coll?.forEach(cb);
261
261
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
262
262
 
263
263
  const ERROR_HLC = 13;
264
+ const ERROR_QUERY_SELECT_ALL_CYCLE = 16;
264
265
  const errorNew = (code, details) =>
265
266
  new Error(
266
267
  TINYBASE +
@@ -4476,6 +4477,51 @@ const createQueries = getCreateFunction((store) => {
4476
4477
  };
4477
4478
  const preStoreListenerIds = mapNew();
4478
4479
  const sourceStoreListenerIds = mapNew();
4480
+ const selectAllListenerIds = mapNew();
4481
+ const selectAllRetryListenerIds = mapNew();
4482
+ const selectAllQuerySources = mapNew();
4483
+ const referencedQueryIds = mapNew();
4484
+ const assertNoMappedSelectAllCycle = (queryId, nextQuerySources) => {
4485
+ const getQuerySources = (sourceQueryId) =>
4486
+ sourceQueryId === queryId
4487
+ ? nextQuerySources
4488
+ : mapGet(selectAllQuerySources, sourceQueryId);
4489
+ const reachesQuery = (
4490
+ sourceQueryId,
4491
+ targetQueryId,
4492
+ visitedQueryIds = setNew(),
4493
+ ) => {
4494
+ if (sourceQueryId === targetQueryId) {
4495
+ return true;
4496
+ }
4497
+ if (collHas(visitedQueryIds, sourceQueryId)) {
4498
+ return false;
4499
+ }
4500
+ setAdd(visitedQueryIds, sourceQueryId);
4501
+ return !collEvery(
4502
+ getQuerySources(sourceQueryId),
4503
+ (_changesCellId, nextQueryId) =>
4504
+ !reachesQuery(nextQueryId, targetQueryId, visitedQueryIds),
4505
+ );
4506
+ };
4507
+ const hasMappedCycle = (sourceQueryId, querySources) =>
4508
+ !collEvery(
4509
+ querySources,
4510
+ (changesCellId, nextQueryId) =>
4511
+ !changesCellId || !reachesQuery(nextQueryId, sourceQueryId),
4512
+ );
4513
+ if (
4514
+ hasMappedCycle(queryId, nextQuerySources) ||
4515
+ !collEvery(
4516
+ selectAllQuerySources,
4517
+ (querySources, sourceQueryId) =>
4518
+ sourceQueryId === queryId ||
4519
+ !hasMappedCycle(sourceQueryId, querySources),
4520
+ )
4521
+ ) {
4522
+ errorThrow(ERROR_QUERY_SELECT_ALL_CYCLE);
4523
+ }
4524
+ };
4479
4525
  const {
4480
4526
  _: [, addListener, callListeners],
4481
4527
  delListener: delListenerImpl,
@@ -4549,11 +4595,72 @@ const createQueries = getCreateFunction((store) => {
4549
4595
  resetStoreListeners(mapGet(sourceStoreListenerIds, queryId));
4550
4596
  mapSet(sourceStoreListenerIds, queryId);
4551
4597
  };
4552
- const isResultStoreReferenced = (resultStore2) =>
4598
+ const clearSelectAllRetryListeners = (queryId) =>
4599
+ ifNotUndefined(
4600
+ mapGet(selectAllRetryListenerIds, queryId),
4601
+ (listenerIds) => {
4602
+ mapForEach(listenerIds, (sourceStore, listenerIdsByTableId) =>
4603
+ mapForEach(listenerIdsByTableId, (_sourceTableId, listenerId) =>
4604
+ sourceStore.delListener(listenerId),
4605
+ ),
4606
+ );
4607
+ mapSet(selectAllRetryListenerIds, queryId);
4608
+ },
4609
+ );
4610
+ const addSelectAllRetryListener = (queryId, sourceStore, sourceTableId) => {
4611
+ const listenerIdsByTableId = mapEnsure(
4612
+ mapEnsure(selectAllRetryListenerIds, queryId, mapNew),
4613
+ sourceStore,
4614
+ mapNew,
4615
+ );
4616
+ mapEnsure(listenerIdsByTableId, sourceTableId, () =>
4617
+ sourceStore.addTableListener(sourceTableId, () =>
4618
+ setQueryDefinitionImpl(queryId),
4619
+ ),
4620
+ );
4621
+ };
4622
+ const syncSelectAllListeners = (queryId, nextSources = mapNew()) => {
4623
+ const listenerIds = mapEnsure(selectAllListenerIds, queryId, mapNew);
4624
+ mapForEach(listenerIds, (sourceStore, listenerIdsByTableId) => {
4625
+ mapForEach(listenerIdsByTableId, (sourceTableId, listenerId) =>
4626
+ collHas(mapGet(nextSources, sourceStore), sourceTableId)
4627
+ ? 0
4628
+ : (sourceStore.delListener(listenerId),
4629
+ mapSet(listenerIdsByTableId, sourceTableId)),
4630
+ );
4631
+ if (collIsEmpty(listenerIdsByTableId)) {
4632
+ mapSet(listenerIds, sourceStore);
4633
+ }
4634
+ });
4635
+ mapForEach(nextSources, (sourceStore, tableIds) => {
4636
+ const listenerIdsByTableId = mapEnsure(listenerIds, sourceStore, mapNew);
4637
+ collForEach(tableIds, (sourceTableId) =>
4638
+ mapEnsure(listenerIdsByTableId, sourceTableId, () =>
4639
+ sourceStore.addTableCellIdsListener(sourceTableId, () =>
4640
+ tryCatchSync(
4641
+ () => setQueryDefinitionImpl(queryId),
4642
+ (error) => {
4643
+ addSelectAllRetryListener(queryId, sourceStore, sourceTableId);
4644
+ throw error;
4645
+ },
4646
+ ),
4647
+ ),
4648
+ ),
4649
+ );
4650
+ });
4651
+ if (collIsEmpty(listenerIds)) {
4652
+ mapSet(selectAllListenerIds, queryId);
4653
+ }
4654
+ };
4655
+ const isResultStoreReferenced = (queryId, resultStore2) =>
4553
4656
  !(
4554
4657
  collEvery(routedResultListeners, ([, storeListenerIds]) =>
4555
4658
  collEvery(storeListenerIds, ([store2]) => store2 !== resultStore2),
4556
4659
  ) &&
4660
+ collEvery(
4661
+ referencedQueryIds,
4662
+ (queryIds) => !collHas(queryIds, queryId),
4663
+ ) &&
4557
4664
  arrayEvery(
4558
4665
  [preStoreListenerIds, sourceStoreListenerIds],
4559
4666
  (storeListenerIds) =>
@@ -4568,7 +4675,7 @@ const createQueries = getCreateFunction((store) => {
4568
4675
  hasQuery(queryId) ? 0 : mapSet(preStores, queryId),
4569
4676
  );
4570
4677
  mapForEach(resultStores, (queryId, resultStore2) =>
4571
- hasQuery(queryId) || isResultStoreReferenced(resultStore2)
4678
+ hasQuery(queryId) || isResultStoreReferenced(queryId, resultStore2)
4572
4679
  ? 0
4573
4680
  : mapSet(resultStores, queryId),
4574
4681
  );
@@ -4650,7 +4757,13 @@ const createQueries = getCreateFunction((store) => {
4650
4757
  const rootStore = asQuery ? getResultStore(tableId) : store;
4651
4758
  const resultStore2 = getResultStore(queryId);
4652
4759
  const paramValues = definition?.[3] ?? getParamValues(queryId);
4653
- const selectEntries = [];
4760
+ const nextReferencedQueryIds = stagedDefinition[4];
4761
+ if (asQuery) {
4762
+ setAdd(nextReferencedQueryIds, tableId);
4763
+ }
4764
+ const selectionEntries = [];
4765
+ let hasSelectAll = false;
4766
+ let selectCount = 0;
4654
4767
  const joinEntries = [
4655
4768
  [void 0, [tableId, void 0, void 0, [], mapNew(), rootStore]],
4656
4769
  ];
@@ -4662,21 +4775,39 @@ const createQueries = getCreateFunction((store) => {
4662
4775
  const joinedTableId = isTrue(arg1) ? arg2 : arg1;
4663
4776
  const joinedCellId = isTrue(arg1) ? arg3 : arg2;
4664
4777
  const selectEntry = isFunction(arg1)
4665
- ? [size(selectEntries) + EMPTY_STRING, arg1]
4778
+ ? [0, selectCount + EMPTY_STRING, arg1]
4666
4779
  : isUndefined(joinedCellId)
4667
- ? [arg1, (getTableCell) => getTableCell(arg1)]
4780
+ ? [0, arg1, (getTableCell) => getTableCell(arg1)]
4668
4781
  : [
4782
+ 0,
4669
4783
  joinedCellId,
4670
4784
  (getTableCell) =>
4671
4785
  isTrue(arg1)
4672
4786
  ? getTableCell(true, joinedTableId, joinedCellId)
4673
4787
  : getTableCell(joinedTableId, joinedCellId),
4674
4788
  ];
4675
- arrayPush(selectEntries, selectEntry);
4789
+ selectCount++;
4790
+ arrayPush(selectionEntries, selectEntry);
4676
4791
  return {
4677
- as: (selectedCellId) => (selectEntry[0] = selectedCellId),
4792
+ as: (selectedCellId) => (selectEntry[1] = selectedCellId),
4678
4793
  };
4679
4794
  };
4795
+ const selectAll = (arg1, arg2, arg3) => {
4796
+ hasSelectAll = true;
4797
+ const joinedTableId = isTrue(arg1) ? arg2 : arg1;
4798
+ const prefixOrMapper = isTrue(arg1) ? arg3 : arg2;
4799
+ arrayPush(selectionEntries, [
4800
+ 1,
4801
+ joinedTableId,
4802
+ isFunction(prefixOrMapper)
4803
+ ? prefixOrMapper
4804
+ : (cellId) => (prefixOrMapper ?? EMPTY_STRING) + cellId,
4805
+ isFunction(prefixOrMapper) ||
4806
+ (!isUndefined(prefixOrMapper) && prefixOrMapper !== EMPTY_STRING)
4807
+ ? 1
4808
+ : 0,
4809
+ ]);
4810
+ };
4680
4811
  const join = (arg1, arg2, arg3, arg4) => {
4681
4812
  const joinedTableId = isTrue(arg1) ? arg2 : arg1;
4682
4813
  const [fromJoinAlias, onArg] = isTrue(arg1)
@@ -4686,6 +4817,13 @@ const createQueries = getCreateFunction((store) => {
4686
4817
  : isUndefined(arg3) || isFunction(arg2)
4687
4818
  ? [void 0, arg2]
4688
4819
  : [arg2, arg3];
4820
+ const sourceIsQuery = isTrue(arg1);
4821
+ const sourceStore = sourceIsQuery
4822
+ ? getResultStore(joinedTableId)
4823
+ : store;
4824
+ if (sourceIsQuery) {
4825
+ setAdd(nextReferencedQueryIds, joinedTableId);
4826
+ }
4689
4827
  const joinEntry = [
4690
4828
  joinedTableId,
4691
4829
  [
@@ -4694,7 +4832,7 @@ const createQueries = getCreateFunction((store) => {
4694
4832
  isFunction(onArg) ? onArg : (getCell) => getCell(onArg),
4695
4833
  [],
4696
4834
  mapNew(),
4697
- isTrue(arg1) ? getResultStore(joinedTableId) : store,
4835
+ sourceStore,
4698
4836
  ],
4699
4837
  ];
4700
4838
  arrayPush(joinEntries, joinEntry);
@@ -4740,21 +4878,86 @@ const createQueries = getCreateFunction((store) => {
4740
4878
  : (getSelectedOrGroupedCell) =>
4741
4879
  getSelectedOrGroupedCell(arg1) === arg2,
4742
4880
  );
4743
- build({select, join, where, group, having, param});
4744
- resultStore2.delTable(queryId);
4745
- const selects = mapNew(selectEntries);
4746
- if (collIsEmpty(selects)) {
4747
- commit?.();
4748
- return queries;
4749
- }
4881
+ build({select, selectAll, join, where, group, having, param});
4750
4882
  const joins = mapNew(joinEntries);
4751
4883
  mapForEach(joins, (joinAlias, [, fromJoinAlias]) =>
4752
4884
  ifNotUndefined(mapGet(joins, fromJoinAlias), ({3: toJoinAliases2}) =>
4753
4885
  isUndefined(joinAlias) ? 0 : arrayPush(toJoinAliases2, joinAlias),
4754
4886
  ),
4755
4887
  );
4888
+ const isRootSelectAll = (joinedTableId) => isUndefined(joinedTableId);
4889
+ const getSelectAllJoin = (joinedTableId) =>
4890
+ mapGet(
4891
+ joins,
4892
+ isRootSelectAll(joinedTableId) ? void 0 : joinedTableId,
4893
+ );
4894
+ const nextSelectAllQuerySources = stagedDefinition[5];
4895
+ arrayForEach(
4896
+ selectionEntries,
4897
+ ([selectAll2, selectedOrJoinedTableId, , changesCellId = 0]) =>
4898
+ selectAll2
4899
+ ? ifNotUndefined(
4900
+ getSelectAllJoin(selectedOrJoinedTableId),
4901
+ ([sourceQueryId, , , , , sourceStore]) =>
4902
+ sourceStore === store
4903
+ ? 0
4904
+ : mapSet(
4905
+ nextSelectAllQuerySources,
4906
+ sourceQueryId,
4907
+ mapGet(nextSelectAllQuerySources, sourceQueryId) ||
4908
+ changesCellId
4909
+ ? 1
4910
+ : 0,
4911
+ ),
4912
+ )
4913
+ : 0,
4914
+ );
4915
+ assertNoMappedSelectAllCycle(queryId, nextSelectAllQuerySources);
4916
+ resultStore2.delTable(queryId);
4917
+ if (isEmpty(selectionEntries)) {
4918
+ commit?.();
4919
+ return queries;
4920
+ }
4756
4921
  const groups = mapNew(groupEntries);
4757
4922
  const hasGroupsOrHavings = !collIsEmpty(groups) || !isEmpty(havings);
4923
+ const selectEntries = [];
4924
+ const selectAllSources = stagedDefinition[3];
4925
+ arrayForEach(
4926
+ selectionEntries,
4927
+ ([selectAll2, selectedOrJoinedTableId, clauseOrMapper]) => {
4928
+ if (selectAll2) {
4929
+ if (hasGroupsOrHavings) {
4930
+ ifNotUndefined(
4931
+ getSelectAllJoin(selectedOrJoinedTableId),
4932
+ ([realTableId, , , , , sourceStore]) => {
4933
+ setAdd(
4934
+ mapEnsure(selectAllSources, sourceStore, setNew),
4935
+ realTableId,
4936
+ );
4937
+ arrayForEach(
4938
+ arraySort(sourceStore.getTableCellIds(realTableId)),
4939
+ (cellId) =>
4940
+ arrayPush(selectEntries, [
4941
+ clauseOrMapper(cellId),
4942
+ getUndefined,
4943
+ ]),
4944
+ );
4945
+ },
4946
+ );
4947
+ }
4948
+ } else {
4949
+ arrayPush(selectEntries, [
4950
+ selectedOrJoinedTableId,
4951
+ clauseOrMapper,
4952
+ ]);
4953
+ }
4954
+ },
4955
+ );
4956
+ const selects = mapNew(selectEntries);
4957
+ if (hasGroupsOrHavings && collIsEmpty(selects)) {
4958
+ commit?.();
4959
+ return queries;
4960
+ }
4758
4961
  const selectJoinWhereStore = hasGroupsOrHavings
4759
4962
  ? (stagedDefinition[2] = createStore())
4760
4963
  : resultStore2;
@@ -4933,18 +5136,85 @@ const createQueries = getCreateFunction((store) => {
4933
5136
  joinedCellId,
4934
5137
  );
4935
5138
  };
4936
- selectJoinWhereStore.transaction(() =>
4937
- arrayEvery(wheres, (where2) => where2(getJoinCell))
4938
- ? mapForEach(selects, (asCellId, tableCellGetter) =>
5139
+ const writeSelectAllRow = () => {
5140
+ const resultRow = objNew();
5141
+ arrayForEach(
5142
+ selectionEntries,
5143
+ ([selectAll2, selectedOrJoinedTableId, clauseOrMapper]) => {
5144
+ if (selectAll2) {
5145
+ ifNotUndefined(
5146
+ getSelectAllJoin(selectedOrJoinedTableId),
5147
+ ([realTableId, , , , remoteIdPairs, sourceStore]) => {
5148
+ const sourceRowId = isRootSelectAll(
5149
+ selectedOrJoinedTableId,
5150
+ )
5151
+ ? rootRowId
5152
+ : mapGet(remoteIdPairs, rootRowId)?.[0];
5153
+ ifNotUndefined(sourceRowId, (sourceRowId2) =>
5154
+ arrayForEach(
5155
+ arraySort(
5156
+ sourceStore.getCellIds(realTableId, sourceRowId2),
5157
+ ),
5158
+ (cellId) =>
5159
+ objSet(
5160
+ resultRow,
5161
+ clauseOrMapper(cellId),
5162
+ sourceStore.getCell(
5163
+ realTableId,
5164
+ sourceRowId2,
5165
+ cellId,
5166
+ ),
5167
+ ),
5168
+ ),
5169
+ );
5170
+ },
5171
+ );
5172
+ } else {
5173
+ const selectedCell = clauseOrMapper(getJoinCell, rootRowId);
5174
+ const selectedCellId = selectedOrJoinedTableId;
5175
+ if (isUndefined(selectedCell)) {
5176
+ objDel(resultRow, selectedCellId);
5177
+ } else {
5178
+ objSet(resultRow, selectedCellId, selectedCell);
5179
+ }
5180
+ }
5181
+ },
5182
+ );
5183
+ if (objIsEmpty(resultRow)) {
5184
+ selectJoinWhereStore.delRow(queryId, rootRowId);
5185
+ } else {
5186
+ selectJoinWhereStore.setRow(queryId, rootRowId, resultRow);
5187
+ }
5188
+ };
5189
+ selectJoinWhereStore.transaction(() => {
5190
+ if (!arrayEvery(wheres, (where2) => where2(getJoinCell))) {
5191
+ selectJoinWhereStore.delRow(queryId, rootRowId);
5192
+ } else if (hasGroupsOrHavings) {
5193
+ if (hasSelectAll) {
5194
+ writeSelectAllRow();
5195
+ } else {
5196
+ mapForEach(selects, (asCellId, tableCellGetter) =>
4939
5197
  selectJoinWhereStore._[5](
4940
5198
  queryId,
4941
5199
  rootRowId,
4942
5200
  asCellId,
4943
5201
  tableCellGetter(getJoinCell, rootRowId),
4944
5202
  ),
4945
- )
4946
- : selectJoinWhereStore.delRow(queryId, rootRowId),
4947
- );
5203
+ );
5204
+ }
5205
+ } else if (hasSelectAll) {
5206
+ writeSelectAllRow();
5207
+ } else {
5208
+ mapForEach(selects, (asCellId, tableCellGetter) =>
5209
+ selectJoinWhereStore._[5](
5210
+ queryId,
5211
+ rootRowId,
5212
+ asCellId,
5213
+ tableCellGetter(getJoinCell, rootRowId),
5214
+ ),
5215
+ );
5216
+ }
5217
+ });
4948
5218
  };
4949
5219
  const listenToTable = (
4950
5220
  rootRowId,
@@ -5063,7 +5333,14 @@ const createQueries = getCreateFunction((store) => {
5063
5333
  }),
5064
5334
  );
5065
5335
  const setQueryDefinitionImpl = (queryId, definition) => {
5066
- const stagedDefinition = [mapNew(), mapNew()];
5336
+ const stagedDefinition = [
5337
+ mapNew(),
5338
+ mapNew(),
5339
+ void 0,
5340
+ mapNew(),
5341
+ setNew(),
5342
+ mapNew(),
5343
+ ];
5067
5344
  let committed = false;
5068
5345
  tryCatchSync(
5069
5346
  () =>
@@ -5084,6 +5361,18 @@ const createQueries = getCreateFunction((store) => {
5084
5361
  collIsEmpty(stagedDefinition[1]) ? void 0 : stagedDefinition[1],
5085
5362
  );
5086
5363
  mapSet(preStores, queryId, stagedDefinition[2]);
5364
+ syncSelectAllListeners(queryId, stagedDefinition[3]);
5365
+ clearSelectAllRetryListeners(queryId);
5366
+ mapSet(
5367
+ referencedQueryIds,
5368
+ queryId,
5369
+ collIsEmpty(stagedDefinition[4]) ? void 0 : stagedDefinition[4],
5370
+ );
5371
+ mapSet(
5372
+ selectAllQuerySources,
5373
+ queryId,
5374
+ collIsEmpty(stagedDefinition[5]) ? void 0 : stagedDefinition[5],
5375
+ );
5087
5376
  committed = true;
5088
5377
  }),
5089
5378
  (error) => {
@@ -5133,6 +5422,10 @@ const createQueries = getCreateFunction((store) => {
5133
5422
  paramStore.delRow(PARAMS_TABLE, queryId);
5134
5423
  resetPreStores(queryId);
5135
5424
  resetSourceStores(queryId);
5425
+ syncSelectAllListeners(queryId);
5426
+ clearSelectAllRetryListeners(queryId);
5427
+ mapSet(referencedQueryIds, queryId);
5428
+ mapSet(selectAllQuerySources, queryId);
5136
5429
  delDefinition(queryId);
5137
5430
  cleanStores();
5138
5431
  return queries;