tinybase 8.6.0-beta.0 → 9.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/@types/_internal/queries/with-schemas/index.d.ts +1 -2
  2. package/@types/_internal/ui/with-schemas/index.d.ts +8 -16
  3. package/@types/mergeable-store/index.d.ts +4 -4
  4. package/@types/mergeable-store/with-schemas/index.d.ts +41 -17
  5. package/@types/persisters/index.d.ts +34 -13
  6. package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +9 -8
  7. package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +10 -10
  8. package/@types/persisters/with-schemas/index.d.ts +72 -30
  9. package/@types/queries/index.d.ts +5 -7
  10. package/@types/queries/with-schemas/index.d.ts +9 -15
  11. package/@types/store/index.d.ts +1 -2
  12. package/@types/store/with-schemas/index.d.ts +19 -29
  13. package/@types/synchronizers/synchronizer-ws-client/index.d.ts +9 -3
  14. package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +10 -3
  15. package/@types/synchronizers/synchronizer-ws-server/index.d.ts +15 -2
  16. package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +17 -2
  17. package/@types/synchronizers/synchronizer-ws-server-durable-object/index.d.ts +51 -0
  18. package/@types/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.d.ts +51 -0
  19. package/@types/ui-react/with-schemas/index.d.ts +3 -6
  20. package/@types/ui-react-dom/with-schemas/index.d.ts +6 -12
  21. package/@types/ui-react-dom-charts/with-schemas/index.d.ts +3 -4
  22. package/@types/ui-solid/with-schemas/index.d.ts +4 -8
  23. package/@types/ui-solid-dom/with-schemas/index.d.ts +6 -12
  24. package/@types/ui-svelte-dom/with-schemas/index.d.ts +6 -12
  25. package/index.js +67 -25
  26. package/indexes/index.js +6 -8
  27. package/indexes/with-schemas/index.js +6 -8
  28. package/mergeable-store/index.js +46 -6
  29. package/mergeable-store/with-schemas/index.js +46 -6
  30. package/metrics/index.js +6 -8
  31. package/metrics/with-schemas/index.js +6 -8
  32. package/min/index.js +1 -1
  33. package/min/index.js.gz +0 -0
  34. package/min/mergeable-store/index.js +1 -1
  35. package/min/mergeable-store/index.js.gz +0 -0
  36. package/min/mergeable-store/with-schemas/index.js +1 -1
  37. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  38. package/min/omni/index.js +1 -1
  39. package/min/omni/index.js.gz +0 -0
  40. package/min/omni/with-schemas/index.js +1 -1
  41. package/min/omni/with-schemas/index.js.gz +0 -0
  42. package/min/persisters/index.js +1 -1
  43. package/min/persisters/index.js.gz +0 -0
  44. package/min/persisters/persister-automerge/index.js +1 -1
  45. package/min/persisters/persister-automerge/index.js.gz +0 -0
  46. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  47. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  48. package/min/persisters/persister-browser/index.js +1 -1
  49. package/min/persisters/persister-browser/index.js.gz +0 -0
  50. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  51. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  52. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  53. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  54. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  55. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  56. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  57. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  58. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  59. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  60. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  61. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  62. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  63. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  64. package/min/persisters/persister-electric-sql/index.js +1 -1
  65. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  66. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  67. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  68. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  69. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  70. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  71. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  72. package/min/persisters/persister-file/index.js +1 -1
  73. package/min/persisters/persister-file/index.js.gz +0 -0
  74. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  75. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  76. package/min/persisters/persister-indexed-db/index.js +1 -1
  77. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  78. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  79. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  80. package/min/persisters/persister-libsql/index.js +1 -1
  81. package/min/persisters/persister-libsql/index.js.gz +0 -0
  82. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  83. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  84. package/min/persisters/persister-partykit-client/index.js +1 -1
  85. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  86. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  87. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  88. package/min/persisters/persister-pglite/index.js +1 -1
  89. package/min/persisters/persister-pglite/index.js.gz +0 -0
  90. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  91. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  92. package/min/persisters/persister-postgres/index.js +1 -1
  93. package/min/persisters/persister-postgres/index.js.gz +0 -0
  94. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  95. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  96. package/min/persisters/persister-powersync/index.js +1 -1
  97. package/min/persisters/persister-powersync/index.js.gz +0 -0
  98. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  99. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  100. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  101. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  102. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  103. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  104. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  105. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  106. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  107. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  108. package/min/persisters/persister-remote/index.js +1 -1
  109. package/min/persisters/persister-remote/index.js.gz +0 -0
  110. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  111. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  112. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  113. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  114. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  115. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  116. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  117. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  118. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  119. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  120. package/min/persisters/persister-sqlite3/index.js +1 -1
  121. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  122. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  123. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  124. package/min/persisters/persister-yjs/index.js +1 -1
  125. package/min/persisters/persister-yjs/index.js.gz +0 -0
  126. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  127. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  128. package/min/persisters/with-schemas/index.js +1 -1
  129. package/min/persisters/with-schemas/index.js.gz +0 -0
  130. package/min/queries/index.js +1 -1
  131. package/min/queries/index.js.gz +0 -0
  132. package/min/queries/with-schemas/index.js +1 -1
  133. package/min/queries/with-schemas/index.js.gz +0 -0
  134. package/min/store/index.js +1 -1
  135. package/min/store/index.js.gz +0 -0
  136. package/min/store/with-schemas/index.js +1 -1
  137. package/min/store/with-schemas/index.js.gz +0 -0
  138. package/min/synchronizers/index.js +1 -1
  139. package/min/synchronizers/index.js.gz +0 -0
  140. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  141. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  142. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  143. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  144. package/min/synchronizers/synchronizer-local/index.js +1 -1
  145. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  146. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  147. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  148. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  149. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  150. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  151. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  152. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  153. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  154. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  155. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  156. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  157. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  158. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  159. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  160. package/min/synchronizers/with-schemas/index.js +1 -1
  161. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  162. package/min/ui-react-inspector/index.js +1 -1
  163. package/min/ui-react-inspector/index.js.gz +0 -0
  164. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  165. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  166. package/min/ui-solid-inspector/index.js +1 -1
  167. package/min/ui-solid-inspector/index.js.gz +0 -0
  168. package/min/ui-solid-inspector/with-schemas/index.js +1 -1
  169. package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
  170. package/min/ui-svelte-inspector/index.js +1 -1
  171. package/min/ui-svelte-inspector/index.js.gz +0 -0
  172. package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
  173. package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
  174. package/min/with-schemas/index.js +1 -1
  175. package/min/with-schemas/index.js.gz +0 -0
  176. package/omni/index.js +364 -155
  177. package/omni/with-schemas/index.js +364 -155
  178. package/package.json +8 -8
  179. package/persisters/index.js +133 -40
  180. package/persisters/persister-automerge/index.js +4 -3
  181. package/persisters/persister-automerge/with-schemas/index.js +4 -3
  182. package/persisters/persister-browser/index.js +4 -3
  183. package/persisters/persister-browser/with-schemas/index.js +4 -3
  184. package/persisters/persister-cr-sqlite-wasm/index.js +133 -40
  185. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +133 -40
  186. package/persisters/persister-durable-object-sql-storage/index.js +275 -113
  187. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +275 -113
  188. package/persisters/persister-durable-object-storage/index.js +4 -3
  189. package/persisters/persister-durable-object-storage/with-schemas/index.js +4 -3
  190. package/persisters/persister-electric-sql/index.js +133 -40
  191. package/persisters/persister-electric-sql/with-schemas/index.js +133 -40
  192. package/persisters/persister-expo-sqlite/index.js +133 -40
  193. package/persisters/persister-expo-sqlite/with-schemas/index.js +133 -40
  194. package/persisters/persister-file/index.js +4 -3
  195. package/persisters/persister-file/with-schemas/index.js +4 -3
  196. package/persisters/persister-indexed-db/index.js +4 -3
  197. package/persisters/persister-indexed-db/with-schemas/index.js +4 -3
  198. package/persisters/persister-libsql/index.js +133 -40
  199. package/persisters/persister-libsql/with-schemas/index.js +133 -40
  200. package/persisters/persister-partykit-client/index.js +4 -3
  201. package/persisters/persister-partykit-client/with-schemas/index.js +4 -3
  202. package/persisters/persister-pglite/index.js +134 -40
  203. package/persisters/persister-pglite/with-schemas/index.js +134 -40
  204. package/persisters/persister-postgres/index.js +134 -40
  205. package/persisters/persister-postgres/with-schemas/index.js +134 -40
  206. package/persisters/persister-powersync/index.js +186 -120
  207. package/persisters/persister-powersync/with-schemas/index.js +186 -120
  208. package/persisters/persister-react-native-mmkv/index.js +4 -3
  209. package/persisters/persister-react-native-mmkv/with-schemas/index.js +4 -3
  210. package/persisters/persister-react-native-sqlite/index.js +133 -40
  211. package/persisters/persister-react-native-sqlite/with-schemas/index.js +133 -40
  212. package/persisters/persister-remote/index.js +4 -3
  213. package/persisters/persister-remote/with-schemas/index.js +4 -3
  214. package/persisters/persister-sqlite-bun/index.js +133 -40
  215. package/persisters/persister-sqlite-bun/with-schemas/index.js +133 -40
  216. package/persisters/persister-sqlite-wasm/index.js +133 -40
  217. package/persisters/persister-sqlite-wasm/with-schemas/index.js +133 -40
  218. package/persisters/persister-sqlite3/index.js +133 -40
  219. package/persisters/persister-sqlite3/with-schemas/index.js +133 -40
  220. package/persisters/persister-yjs/index.js +4 -3
  221. package/persisters/persister-yjs/with-schemas/index.js +4 -3
  222. package/persisters/with-schemas/index.js +133 -40
  223. package/queries/index.js +21 -19
  224. package/queries/with-schemas/index.js +21 -19
  225. package/readme.md +14 -14
  226. package/relationships/index.js +6 -8
  227. package/relationships/with-schemas/index.js +6 -8
  228. package/releases.md +72 -57
  229. package/store/index.js +33 -2
  230. package/store/with-schemas/index.js +33 -2
  231. package/synchronizers/index.js +4 -3
  232. package/synchronizers/synchronizer-broadcast-channel/index.js +4 -3
  233. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +4 -3
  234. package/synchronizers/synchronizer-local/index.js +4 -3
  235. package/synchronizers/synchronizer-local/with-schemas/index.js +4 -3
  236. package/synchronizers/synchronizer-ws-client/index.js +120 -45
  237. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +120 -45
  238. package/synchronizers/synchronizer-ws-server/index.js +116 -36
  239. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +116 -36
  240. package/synchronizers/synchronizer-ws-server-durable-object/index.js +125 -41
  241. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +125 -41
  242. package/synchronizers/with-schemas/index.js +4 -3
  243. package/ui-react-inspector/index.js +36 -5
  244. package/ui-react-inspector/with-schemas/index.js +36 -5
  245. package/ui-solid-inspector/index.js +36 -5
  246. package/ui-solid-inspector/with-schemas/index.js +36 -5
  247. package/ui-svelte/index.js +1 -1
  248. package/ui-svelte/with-schemas/index.js +1 -1
  249. package/ui-svelte-dom/index.js +2 -2
  250. package/ui-svelte-dom/with-schemas/index.js +2 -2
  251. package/ui-svelte-inspector/index.js +38 -7
  252. package/ui-svelte-inspector/with-schemas/index.js +38 -7
  253. package/with-schemas/index.js +67 -25
@@ -49,6 +49,7 @@ const tryCatch = async (action, then1, then2) => {
49
49
  }
50
50
  };
51
51
 
52
+ const arrayHas = (array, value) => array.includes(value);
52
53
  const arrayForEach = (array, cb) => array.forEach(cb);
53
54
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
54
55
  const arrayMap = (array, cb) => array.map(cb);
@@ -340,13 +341,14 @@ const createCustomPersister = (
340
341
  const content = await getPersisted();
341
342
  if (isArray(content)) {
342
343
  setContentOrChanges(content);
343
- } else if (initialContent) {
344
+ } else if (isUndefined(content) && initialContent) {
344
345
  setDefaultContent(initialContent);
345
- } else {
346
+ } else if (!isUndefined(content)) {
346
347
  errorNew(`Content is not an array: ${content}`);
347
348
  }
348
349
  },
349
- () => {
350
+ (error) => {
351
+ onIgnoredError?.(error);
350
352
  if (initialContent) {
351
353
  setDefaultContent(initialContent);
352
354
  }
@@ -579,6 +581,8 @@ const DEFAULT_TABULAR_VALUES_CONFIG = {
579
581
  save: 0,
580
582
  [TABLE_NAME]: TINYBASE + '_values',
581
583
  };
584
+ const getValuesIn = (config) => (isArray(config) ? config : void 0);
585
+ const hasValues = (config) => isTrue(config) || isArray(config);
582
586
  const getDefaultedConfig = (configOrStoreTableName) =>
583
587
  objMerge(
584
588
  DEFAULT_CONFIG,
@@ -629,11 +633,15 @@ const getConfigStructures = (configOrStoreTableName) => {
629
633
  ];
630
634
  }
631
635
  const {tables: {load = {}, save = {}} = {}, values = {}} = config;
632
- const valuesConfig = slice(
633
- objValues(objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values)),
634
- 0,
635
- objSize(DEFAULT_TABULAR_VALUES_CONFIG),
636
- );
636
+ const valuesConfigObj = objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values);
637
+ const {load: valuesLoad, save: valuesSave} = valuesConfigObj;
638
+ const valuesConfig = [
639
+ hasValues(valuesLoad),
640
+ hasValues(valuesSave),
641
+ valuesConfigObj[TABLE_NAME],
642
+ getValuesIn(valuesLoad),
643
+ getValuesIn(valuesSave),
644
+ ];
637
645
  const valuesTable = valuesConfig[2];
638
646
  const managedTableNames = setNew(valuesTable);
639
647
  const excludedTableNames = setNew(valuesTable);
@@ -695,8 +703,18 @@ const getCommandFunctions = (
695
703
  ({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
696
704
  );
697
705
  };
698
- const loadTable = async (tableName, rowIdColumnName, condition) =>
699
- canSelect(tableName, rowIdColumnName)
706
+ const loadTable = async (
707
+ tableName,
708
+ rowIdColumnName,
709
+ condition,
710
+ contentSubIds,
711
+ ) => {
712
+ const contentSubIdSet = isUndefined(contentSubIds)
713
+ ? void 0
714
+ : setNew(contentSubIds);
715
+ const includeContentSubId = (contentSubId) =>
716
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
717
+ return canSelect(tableName, rowIdColumnName)
700
718
  ? objNew(
701
719
  arrayFilter(
702
720
  arrayMap(
@@ -705,17 +723,35 @@ const getCommandFunctions = (
705
723
  escapeId(tableName) +
706
724
  getWhereCondition(tableName, condition),
707
725
  ),
708
- (row) => [
709
- row[rowIdColumnName],
710
- decode
726
+ (row) => {
727
+ const rowId = row[rowIdColumnName];
728
+ const rowContent = decode
711
729
  ? objMap(objDel(row, rowIdColumnName), decode)
712
- : objDel(row, rowIdColumnName),
713
- ],
730
+ : objDel(row, rowIdColumnName);
731
+ return [
732
+ rowId,
733
+ isUndefined(contentSubIdSet)
734
+ ? rowContent
735
+ : objNew(
736
+ arrayFilter(
737
+ objToArray(
738
+ rowContent,
739
+ (cellOrValue, contentSubId) => [
740
+ contentSubId,
741
+ cellOrValue,
742
+ ],
743
+ ),
744
+ ([contentSubId]) => includeContentSubId(contentSubId),
745
+ ),
746
+ ),
747
+ ];
748
+ },
714
749
  ),
715
750
  (entry) => !isUndefined(entry[0]) && !objIsEmpty(entry[1]),
716
751
  ),
717
752
  )
718
753
  : {};
754
+ };
719
755
  const saveTable = async (
720
756
  tableName,
721
757
  rowIdColumnName,
@@ -724,15 +760,23 @@ const getCommandFunctions = (
724
760
  deleteEmptyTable,
725
761
  partial = false,
726
762
  condition = TRUE,
763
+ contentSubIds,
727
764
  ) => {
765
+ const contentSubIdSet = isUndefined(contentSubIds)
766
+ ? void 0
767
+ : setNew(contentSubIds);
768
+ const includeContentSubId = (contentSubId) =>
769
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
728
770
  const settingColumnNameSet = setNew();
729
771
  objMap(content ?? {}, (contentRow) =>
730
- arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
731
- setAdd(settingColumnNameSet, cellOrValueId),
772
+ arrayMap(
773
+ arrayFilter(objIds(contentRow ?? {}), includeContentSubId),
774
+ (cellOrValueId) => setAdd(settingColumnNameSet, cellOrValueId),
732
775
  ),
733
776
  );
734
777
  const settingColumnNames = collValues(settingColumnNameSet);
735
778
  if (
779
+ isUndefined(contentSubIdSet) &&
736
780
  !partial &&
737
781
  deleteEmptyTable &&
738
782
  condition == TRUE &&
@@ -744,7 +788,13 @@ const getCommandFunctions = (
744
788
  return;
745
789
  }
746
790
  const currentColumnNames = mapGet(schemaMap, tableName);
747
- const unaccountedColumnNames = setNew(collValues(currentColumnNames));
791
+ const unaccountedColumnNames = setNew(
792
+ arrayFilter(
793
+ collValues(currentColumnNames),
794
+ (columnName) =>
795
+ columnName == rowIdColumnName || includeContentSubId(columnName),
796
+ ),
797
+ );
748
798
  if (!arrayIsEmpty(settingColumnNames)) {
749
799
  if (!collHas(schemaMap, tableName)) {
750
800
  await databaseExecuteCommand(
@@ -810,11 +860,13 @@ const getCommandFunctions = (
810
860
  ]);
811
861
  if (partial) {
812
862
  if (isUndefined(content)) {
813
- await databaseExecuteCommand(
814
- DELETE_FROM +
815
- escapeId(tableName) +
816
- getWhereCondition(tableName, condition),
817
- );
863
+ if (isUndefined(contentSubIdSet)) {
864
+ await databaseExecuteCommand(
865
+ DELETE_FROM +
866
+ escapeId(tableName) +
867
+ getWhereCondition(tableName, condition),
868
+ );
869
+ }
818
870
  } else {
819
871
  await promiseAll(
820
872
  objToArray(content, async (row, rowId) => {
@@ -827,18 +879,24 @@ const getCommandFunctions = (
827
879
  [rowId],
828
880
  );
829
881
  } else if (!arrayIsEmpty(settingColumnNames)) {
830
- await upsert(
831
- databaseExecuteCommand,
832
- tableName,
833
- rowIdColumnName,
882
+ const changingColumnNames = arrayFilter(
834
883
  objIds(row),
835
- {
836
- [rowId]: encode
837
- ? arrayMap(objValues(row), encode)
838
- : objValues(row),
839
- },
840
- currentColumnNames,
884
+ includeContentSubId,
841
885
  );
886
+ if (!arrayIsEmpty(changingColumnNames)) {
887
+ await upsert(
888
+ databaseExecuteCommand,
889
+ tableName,
890
+ rowIdColumnName,
891
+ changingColumnNames,
892
+ {
893
+ [rowId]: arrayMap(changingColumnNames, (cellId) =>
894
+ encode ? encode(row[cellId]) : row[cellId],
895
+ ),
896
+ },
897
+ currentColumnNames,
898
+ );
899
+ }
842
900
  }
843
901
  }),
844
902
  );
@@ -847,7 +905,9 @@ const getCommandFunctions = (
847
905
  if (!arrayIsEmpty(settingColumnNames)) {
848
906
  const changingColumnNames = arrayFilter(
849
907
  collValues(mapGet(schemaMap, tableName)),
850
- (changingColumnName) => changingColumnName != rowIdColumnName,
908
+ (changingColumnName) =>
909
+ changingColumnName != rowIdColumnName &&
910
+ includeContentSubId(changingColumnName),
851
911
  );
852
912
  const rows = {};
853
913
  const deleteRowIds = [];
@@ -863,6 +923,7 @@ const getCommandFunctions = (
863
923
  rowIdColumnName,
864
924
  changingColumnNames,
865
925
  rows,
926
+ currentColumnNames,
866
927
  );
867
928
  await databaseExecuteCommand(
868
929
  DELETE_FROM +
@@ -871,7 +932,10 @@ const getCommandFunctions = (
871
932
  `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
872
933
  deleteRowIds,
873
934
  );
874
- } else if (collHas(schemaMap, tableName)) {
935
+ } else if (
936
+ isUndefined(contentSubIdSet) &&
937
+ collHas(schemaMap, tableName)
938
+ ) {
875
939
  await databaseExecuteCommand(
876
940
  DELETE_FROM +
877
941
  escapeId(tableName) +
@@ -1010,7 +1074,13 @@ const createTabularPersister = (
1010
1074
  [
1011
1075
  tablesLoadConfig,
1012
1076
  tablesSaveConfig,
1013
- [valuesLoad, valuesSave, valuesTableName],
1077
+ [
1078
+ valuesLoad,
1079
+ valuesSave,
1080
+ valuesTableName,
1081
+ valuesLoadValueIds,
1082
+ valuesSaveValueIds,
1083
+ ],
1014
1084
  ],
1015
1085
  managedTableNames,
1016
1086
  querySchema,
@@ -1060,15 +1130,33 @@ const createTabularPersister = (
1060
1130
  },
1061
1131
  ),
1062
1132
  );
1133
+ const getValuesSubset = (values, valueIds, partial) =>
1134
+ objNew(
1135
+ partial == true
1136
+ ? arrayFilter(
1137
+ objToArray(values, (value, valueId) => [valueId, value]),
1138
+ ([valueId]) => arrayHas(valueIds, valueId),
1139
+ )
1140
+ : arrayFilter(
1141
+ arrayMap(valueIds, (valueId) => [valueId, values[valueId]]),
1142
+ ([, value]) => !isUndefined(value),
1143
+ ),
1144
+ );
1063
1145
  const saveValues = async (values, partial) =>
1064
1146
  valuesSave
1065
1147
  ? await saveTable(
1066
1148
  valuesTableName,
1067
1149
  DEFAULT_ROW_ID_COLUMN_NAME,
1068
- {[SINGLE_ROW_ID]: values},
1150
+ {
1151
+ [SINGLE_ROW_ID]: isUndefined(valuesSaveValueIds)
1152
+ ? values
1153
+ : getValuesSubset(values, valuesSaveValueIds, partial),
1154
+ },
1069
1155
  true,
1070
1156
  true,
1071
1157
  partial,
1158
+ void 0,
1159
+ valuesSaveValueIds,
1072
1160
  )
1073
1161
  : null;
1074
1162
  const loadTables = async () =>
@@ -1088,9 +1176,14 @@ const createTabularPersister = (
1088
1176
  );
1089
1177
  const loadValues = async () =>
1090
1178
  valuesLoad
1091
- ? (await loadTable(valuesTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
1092
- SINGLE_ROW_ID
1093
- ]
1179
+ ? (
1180
+ await loadTable(
1181
+ valuesTableName,
1182
+ DEFAULT_ROW_ID_COLUMN_NAME,
1183
+ void 0,
1184
+ valuesLoadValueIds,
1185
+ )
1186
+ )[SINGLE_ROW_ID]
1094
1187
  : {};
1095
1188
  const getPersisted = () =>
1096
1189
  transaction(async () => {
package/queries/index.js CHANGED
@@ -282,14 +282,12 @@ const getDefinableFunctions = (
282
282
  const newRowValue = hasRow(tableId, rowId)
283
283
  ? validateRowValue(getRowValue(getCell, rowId))
284
284
  : void 0;
285
- if (
286
- !(
287
- oldRowValue === newRowValue ||
288
- (isArray(oldRowValue) &&
289
- isArray(newRowValue) &&
290
- arrayIsEqual(oldRowValue, newRowValue))
291
- )
292
- ) {
285
+ if (!(
286
+ oldRowValue === newRowValue ||
287
+ (isArray(oldRowValue) &&
288
+ isArray(newRowValue) &&
289
+ arrayIsEqual(oldRowValue, newRowValue))
290
+ )) {
293
291
  mapSet(changedRowValues, rowId, [oldRowValue, newRowValue]);
294
292
  }
295
293
  if (!isUndefined(getSortKey)) {
@@ -380,9 +378,9 @@ const PARAMS_TABLE = '_';
380
378
  const PARAM_LISTENER_PREFIX = 'p';
381
379
  const createQueries = getCreateFunction((store) => {
382
380
  const createStore = store._[0];
383
- const preStore = createStore();
384
381
  const paramStore = createStore();
385
382
  const resultStore = createStore();
383
+ const preStores = mapNew();
386
384
  const resultStores = mapNew();
387
385
  const redefiningQueryIds = setNew();
388
386
  const routedResultListeners = mapNew();
@@ -425,12 +423,13 @@ const createQueries = getCreateFunction((store) => {
425
423
  );
426
424
  const getResultStore = (queryId) =>
427
425
  mapEnsure(resultStores, queryId, createStore);
428
- const addPreStoreListener = (preStore2, queryId, ...listenerIds) =>
426
+ const getPreStore = (queryId) => mapEnsure(preStores, queryId, createStore);
427
+ const addPreStoreListener = (preStore, queryId, ...listenerIds) =>
429
428
  arrayForEach(listenerIds, (listenerId) =>
430
429
  setAdd(
431
430
  mapEnsure(
432
431
  mapEnsure(preStoreListenerIds, queryId, mapNew),
433
- preStore2,
432
+ preStore,
434
433
  setNew,
435
434
  ),
436
435
  listenerId,
@@ -440,16 +439,17 @@ const createQueries = getCreateFunction((store) => {
440
439
  ifNotUndefined(
441
440
  mapGet(preStoreListenerIds, queryId),
442
441
  (queryPreStoreListenerIds) => {
443
- mapForEach(queryPreStoreListenerIds, (preStore2, listenerIds) =>
442
+ mapForEach(queryPreStoreListenerIds, (preStore, listenerIds) =>
444
443
  collForEach(listenerIds, (listenerId) =>
445
- preStore2.delListener(listenerId),
444
+ preStore.delListener(listenerId),
446
445
  ),
447
446
  );
448
447
  collClear(queryPreStoreListenerIds);
449
448
  },
450
449
  );
451
- arrayForEach([getResultStore(queryId), preStore], (store2) =>
452
- store2.delTable(queryId),
450
+ arrayForEach(
451
+ [getResultStore(queryId), mapGet(preStores, queryId)],
452
+ (store2) => store2?.delTable(queryId),
453
453
  );
454
454
  };
455
455
  const addSourceStoreListeners = (
@@ -677,10 +677,12 @@ const createQueries = getCreateFunction((store) => {
677
677
  ),
678
678
  );
679
679
  const groups = mapNew(groupEntries);
680
- let selectJoinWhereStore = preStore;
681
- if (collIsEmpty(groups) && arrayIsEmpty(havings)) {
682
- selectJoinWhereStore = resultStore2;
683
- } else {
680
+ const hasGroupsOrHavings =
681
+ !collIsEmpty(groups) || !arrayIsEmpty(havings);
682
+ const selectJoinWhereStore = hasGroupsOrHavings
683
+ ? getPreStore(queryId)
684
+ : resultStore2;
685
+ if (hasGroupsOrHavings) {
684
686
  synchronizeTransactions(queryId, selectJoinWhereStore, resultStore2);
685
687
  const groupedSelectedCellIds = mapNew();
686
688
  mapForEach(groups, (groupedCellId, [selectedCellId, aggregators]) =>
@@ -282,14 +282,12 @@ const getDefinableFunctions = (
282
282
  const newRowValue = hasRow(tableId, rowId)
283
283
  ? validateRowValue(getRowValue(getCell, rowId))
284
284
  : void 0;
285
- if (
286
- !(
287
- oldRowValue === newRowValue ||
288
- (isArray(oldRowValue) &&
289
- isArray(newRowValue) &&
290
- arrayIsEqual(oldRowValue, newRowValue))
291
- )
292
- ) {
285
+ if (!(
286
+ oldRowValue === newRowValue ||
287
+ (isArray(oldRowValue) &&
288
+ isArray(newRowValue) &&
289
+ arrayIsEqual(oldRowValue, newRowValue))
290
+ )) {
293
291
  mapSet(changedRowValues, rowId, [oldRowValue, newRowValue]);
294
292
  }
295
293
  if (!isUndefined(getSortKey)) {
@@ -380,9 +378,9 @@ const PARAMS_TABLE = '_';
380
378
  const PARAM_LISTENER_PREFIX = 'p';
381
379
  const createQueries = getCreateFunction((store) => {
382
380
  const createStore = store._[0];
383
- const preStore = createStore();
384
381
  const paramStore = createStore();
385
382
  const resultStore = createStore();
383
+ const preStores = mapNew();
386
384
  const resultStores = mapNew();
387
385
  const redefiningQueryIds = setNew();
388
386
  const routedResultListeners = mapNew();
@@ -425,12 +423,13 @@ const createQueries = getCreateFunction((store) => {
425
423
  );
426
424
  const getResultStore = (queryId) =>
427
425
  mapEnsure(resultStores, queryId, createStore);
428
- const addPreStoreListener = (preStore2, queryId, ...listenerIds) =>
426
+ const getPreStore = (queryId) => mapEnsure(preStores, queryId, createStore);
427
+ const addPreStoreListener = (preStore, queryId, ...listenerIds) =>
429
428
  arrayForEach(listenerIds, (listenerId) =>
430
429
  setAdd(
431
430
  mapEnsure(
432
431
  mapEnsure(preStoreListenerIds, queryId, mapNew),
433
- preStore2,
432
+ preStore,
434
433
  setNew,
435
434
  ),
436
435
  listenerId,
@@ -440,16 +439,17 @@ const createQueries = getCreateFunction((store) => {
440
439
  ifNotUndefined(
441
440
  mapGet(preStoreListenerIds, queryId),
442
441
  (queryPreStoreListenerIds) => {
443
- mapForEach(queryPreStoreListenerIds, (preStore2, listenerIds) =>
442
+ mapForEach(queryPreStoreListenerIds, (preStore, listenerIds) =>
444
443
  collForEach(listenerIds, (listenerId) =>
445
- preStore2.delListener(listenerId),
444
+ preStore.delListener(listenerId),
446
445
  ),
447
446
  );
448
447
  collClear(queryPreStoreListenerIds);
449
448
  },
450
449
  );
451
- arrayForEach([getResultStore(queryId), preStore], (store2) =>
452
- store2.delTable(queryId),
450
+ arrayForEach(
451
+ [getResultStore(queryId), mapGet(preStores, queryId)],
452
+ (store2) => store2?.delTable(queryId),
453
453
  );
454
454
  };
455
455
  const addSourceStoreListeners = (
@@ -677,10 +677,12 @@ const createQueries = getCreateFunction((store) => {
677
677
  ),
678
678
  );
679
679
  const groups = mapNew(groupEntries);
680
- let selectJoinWhereStore = preStore;
681
- if (collIsEmpty(groups) && arrayIsEmpty(havings)) {
682
- selectJoinWhereStore = resultStore2;
683
- } else {
680
+ const hasGroupsOrHavings =
681
+ !collIsEmpty(groups) || !arrayIsEmpty(havings);
682
+ const selectJoinWhereStore = hasGroupsOrHavings
683
+ ? getPreStore(queryId)
684
+ : resultStore2;
685
+ if (hasGroupsOrHavings) {
684
686
  synchronizeTransactions(queryId, selectJoinWhereStore, resultStore2);
685
687
  const groupedSelectedCellIds = mapNew();
686
688
  mapForEach(groups, (groupedCellId, [selectedCellId, aggregators]) =>