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);
@@ -208,6 +209,8 @@ const DEFAULT_TABULAR_VALUES_CONFIG = {
208
209
  save: 0,
209
210
  [TABLE_NAME]: TINYBASE + '_values',
210
211
  };
212
+ const getValuesIn = (config) => (isArray(config) ? config : void 0);
213
+ const hasValues = (config) => isTrue(config) || isArray(config);
211
214
  const getDefaultedConfig = (configOrStoreTableName) =>
212
215
  objMerge(
213
216
  DEFAULT_CONFIG,
@@ -258,11 +261,15 @@ const getConfigStructures = (configOrStoreTableName) => {
258
261
  ];
259
262
  }
260
263
  const {tables: {load = {}, save = {}} = {}, values = {}} = config;
261
- const valuesConfig = slice(
262
- objValues(objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values)),
263
- 0,
264
- objSize(DEFAULT_TABULAR_VALUES_CONFIG),
265
- );
264
+ const valuesConfigObj = objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values);
265
+ const {load: valuesLoad, save: valuesSave} = valuesConfigObj;
266
+ const valuesConfig = [
267
+ hasValues(valuesLoad),
268
+ hasValues(valuesSave),
269
+ valuesConfigObj[TABLE_NAME],
270
+ getValuesIn(valuesLoad),
271
+ getValuesIn(valuesSave),
272
+ ];
266
273
  const valuesTable = valuesConfig[2];
267
274
  const managedTableNames = setNew(valuesTable);
268
275
  const excludedTableNames = setNew(valuesTable);
@@ -506,13 +513,14 @@ const createCustomPersister = (
506
513
  const content = await getPersisted();
507
514
  if (isArray(content)) {
508
515
  setContentOrChanges(content);
509
- } else if (initialContent) {
516
+ } else if (isUndefined(content) && initialContent) {
510
517
  setDefaultContent(initialContent);
511
- } else {
518
+ } else if (!isUndefined(content)) {
512
519
  errorNew(`Content is not an array: ${content}`);
513
520
  }
514
521
  },
515
- () => {
522
+ (error) => {
523
+ onIgnoredError?.(error);
516
524
  if (initialContent) {
517
525
  setDefaultContent(initialContent);
518
526
  }
@@ -671,8 +679,18 @@ const getCommandFunctions = (
671
679
  ({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
672
680
  );
673
681
  };
674
- const loadTable = async (tableName, rowIdColumnName, condition) =>
675
- canSelect(tableName, rowIdColumnName)
682
+ const loadTable = async (
683
+ tableName,
684
+ rowIdColumnName,
685
+ condition,
686
+ contentSubIds,
687
+ ) => {
688
+ const contentSubIdSet = isUndefined(contentSubIds)
689
+ ? void 0
690
+ : setNew(contentSubIds);
691
+ const includeContentSubId = (contentSubId) =>
692
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
693
+ return canSelect(tableName, rowIdColumnName)
676
694
  ? objNew(
677
695
  arrayFilter(
678
696
  arrayMap(
@@ -681,17 +699,35 @@ const getCommandFunctions = (
681
699
  escapeId(tableName) +
682
700
  getWhereCondition(tableName, condition),
683
701
  ),
684
- (row) => [
685
- row[rowIdColumnName],
686
- decode
702
+ (row) => {
703
+ const rowId = row[rowIdColumnName];
704
+ const rowContent = decode
687
705
  ? objMap(objDel(row, rowIdColumnName), decode)
688
- : objDel(row, rowIdColumnName),
689
- ],
706
+ : objDel(row, rowIdColumnName);
707
+ return [
708
+ rowId,
709
+ isUndefined(contentSubIdSet)
710
+ ? rowContent
711
+ : objNew(
712
+ arrayFilter(
713
+ objToArray(
714
+ rowContent,
715
+ (cellOrValue, contentSubId) => [
716
+ contentSubId,
717
+ cellOrValue,
718
+ ],
719
+ ),
720
+ ([contentSubId]) => includeContentSubId(contentSubId),
721
+ ),
722
+ ),
723
+ ];
724
+ },
690
725
  ),
691
726
  (entry) => !isUndefined(entry[0]) && !objIsEmpty(entry[1]),
692
727
  ),
693
728
  )
694
729
  : {};
730
+ };
695
731
  const saveTable = async (
696
732
  tableName,
697
733
  rowIdColumnName,
@@ -700,15 +736,23 @@ const getCommandFunctions = (
700
736
  deleteEmptyTable,
701
737
  partial = false,
702
738
  condition = TRUE,
739
+ contentSubIds,
703
740
  ) => {
741
+ const contentSubIdSet = isUndefined(contentSubIds)
742
+ ? void 0
743
+ : setNew(contentSubIds);
744
+ const includeContentSubId = (contentSubId) =>
745
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
704
746
  const settingColumnNameSet = setNew();
705
747
  objMap(content ?? {}, (contentRow) =>
706
- arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
707
- setAdd(settingColumnNameSet, cellOrValueId),
748
+ arrayMap(
749
+ arrayFilter(objIds(contentRow ?? {}), includeContentSubId),
750
+ (cellOrValueId) => setAdd(settingColumnNameSet, cellOrValueId),
708
751
  ),
709
752
  );
710
753
  const settingColumnNames = collValues(settingColumnNameSet);
711
754
  if (
755
+ isUndefined(contentSubIdSet) &&
712
756
  !partial &&
713
757
  deleteEmptyTable &&
714
758
  condition == TRUE &&
@@ -720,7 +764,13 @@ const getCommandFunctions = (
720
764
  return;
721
765
  }
722
766
  const currentColumnNames = mapGet(schemaMap, tableName);
723
- const unaccountedColumnNames = setNew(collValues(currentColumnNames));
767
+ const unaccountedColumnNames = setNew(
768
+ arrayFilter(
769
+ collValues(currentColumnNames),
770
+ (columnName) =>
771
+ columnName == rowIdColumnName || includeContentSubId(columnName),
772
+ ),
773
+ );
724
774
  if (!arrayIsEmpty(settingColumnNames)) {
725
775
  if (!collHas(schemaMap, tableName)) {
726
776
  await databaseExecuteCommand(
@@ -786,11 +836,13 @@ const getCommandFunctions = (
786
836
  ]);
787
837
  if (partial) {
788
838
  if (isUndefined(content)) {
789
- await databaseExecuteCommand(
790
- DELETE_FROM +
791
- escapeId(tableName) +
792
- getWhereCondition(tableName, condition),
793
- );
839
+ if (isUndefined(contentSubIdSet)) {
840
+ await databaseExecuteCommand(
841
+ DELETE_FROM +
842
+ escapeId(tableName) +
843
+ getWhereCondition(tableName, condition),
844
+ );
845
+ }
794
846
  } else {
795
847
  await promiseAll(
796
848
  objToArray(content, async (row, rowId) => {
@@ -803,18 +855,24 @@ const getCommandFunctions = (
803
855
  [rowId],
804
856
  );
805
857
  } else if (!arrayIsEmpty(settingColumnNames)) {
806
- await upsert(
807
- databaseExecuteCommand,
808
- tableName,
809
- rowIdColumnName,
858
+ const changingColumnNames = arrayFilter(
810
859
  objIds(row),
811
- {
812
- [rowId]: encode
813
- ? arrayMap(objValues(row), encode)
814
- : objValues(row),
815
- },
816
- currentColumnNames,
860
+ includeContentSubId,
817
861
  );
862
+ if (!arrayIsEmpty(changingColumnNames)) {
863
+ await upsert(
864
+ databaseExecuteCommand,
865
+ tableName,
866
+ rowIdColumnName,
867
+ changingColumnNames,
868
+ {
869
+ [rowId]: arrayMap(changingColumnNames, (cellId) =>
870
+ encode ? encode(row[cellId]) : row[cellId],
871
+ ),
872
+ },
873
+ currentColumnNames,
874
+ );
875
+ }
818
876
  }
819
877
  }),
820
878
  );
@@ -823,7 +881,9 @@ const getCommandFunctions = (
823
881
  if (!arrayIsEmpty(settingColumnNames)) {
824
882
  const changingColumnNames = arrayFilter(
825
883
  collValues(mapGet(schemaMap, tableName)),
826
- (changingColumnName) => changingColumnName != rowIdColumnName,
884
+ (changingColumnName) =>
885
+ changingColumnName != rowIdColumnName &&
886
+ includeContentSubId(changingColumnName),
827
887
  );
828
888
  const rows = {};
829
889
  const deleteRowIds = [];
@@ -839,6 +899,7 @@ const getCommandFunctions = (
839
899
  rowIdColumnName,
840
900
  changingColumnNames,
841
901
  rows,
902
+ currentColumnNames,
842
903
  );
843
904
  await databaseExecuteCommand(
844
905
  DELETE_FROM +
@@ -847,7 +908,10 @@ const getCommandFunctions = (
847
908
  `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
848
909
  deleteRowIds,
849
910
  );
850
- } else if (collHas(schemaMap, tableName)) {
911
+ } else if (
912
+ isUndefined(contentSubIdSet) &&
913
+ collHas(schemaMap, tableName)
914
+ ) {
851
915
  await databaseExecuteCommand(
852
916
  DELETE_FROM +
853
917
  escapeId(tableName) +
@@ -986,7 +1050,13 @@ const createTabularPersister = (
986
1050
  [
987
1051
  tablesLoadConfig,
988
1052
  tablesSaveConfig,
989
- [valuesLoad, valuesSave, valuesTableName],
1053
+ [
1054
+ valuesLoad,
1055
+ valuesSave,
1056
+ valuesTableName,
1057
+ valuesLoadValueIds,
1058
+ valuesSaveValueIds,
1059
+ ],
990
1060
  ],
991
1061
  managedTableNames,
992
1062
  querySchema,
@@ -1036,15 +1106,33 @@ const createTabularPersister = (
1036
1106
  },
1037
1107
  ),
1038
1108
  );
1109
+ const getValuesSubset = (values, valueIds, partial) =>
1110
+ objNew(
1111
+ partial == true
1112
+ ? arrayFilter(
1113
+ objToArray(values, (value, valueId) => [valueId, value]),
1114
+ ([valueId]) => arrayHas(valueIds, valueId),
1115
+ )
1116
+ : arrayFilter(
1117
+ arrayMap(valueIds, (valueId) => [valueId, values[valueId]]),
1118
+ ([, value]) => !isUndefined(value),
1119
+ ),
1120
+ );
1039
1121
  const saveValues = async (values, partial) =>
1040
1122
  valuesSave
1041
1123
  ? await saveTable(
1042
1124
  valuesTableName,
1043
1125
  DEFAULT_ROW_ID_COLUMN_NAME,
1044
- {[SINGLE_ROW_ID]: values},
1126
+ {
1127
+ [SINGLE_ROW_ID]: isUndefined(valuesSaveValueIds)
1128
+ ? values
1129
+ : getValuesSubset(values, valuesSaveValueIds, partial),
1130
+ },
1045
1131
  true,
1046
1132
  true,
1047
1133
  partial,
1134
+ void 0,
1135
+ valuesSaveValueIds,
1048
1136
  )
1049
1137
  : null;
1050
1138
  const loadTables = async () =>
@@ -1064,9 +1152,14 @@ const createTabularPersister = (
1064
1152
  );
1065
1153
  const loadValues = async () =>
1066
1154
  valuesLoad
1067
- ? (await loadTable(valuesTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
1068
- SINGLE_ROW_ID
1069
- ]
1155
+ ? (
1156
+ await loadTable(
1157
+ valuesTableName,
1158
+ DEFAULT_ROW_ID_COLUMN_NAME,
1159
+ void 0,
1160
+ valuesLoadValueIds,
1161
+ )
1162
+ )[SINGLE_ROW_ID]
1070
1163
  : {};
1071
1164
  const getPersisted = () =>
1072
1165
  transaction(async () => {
@@ -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);
@@ -208,6 +209,8 @@ const DEFAULT_TABULAR_VALUES_CONFIG = {
208
209
  save: 0,
209
210
  [TABLE_NAME]: TINYBASE + '_values',
210
211
  };
212
+ const getValuesIn = (config) => (isArray(config) ? config : void 0);
213
+ const hasValues = (config) => isTrue(config) || isArray(config);
211
214
  const getDefaultedConfig = (configOrStoreTableName) =>
212
215
  objMerge(
213
216
  DEFAULT_CONFIG,
@@ -258,11 +261,15 @@ const getConfigStructures = (configOrStoreTableName) => {
258
261
  ];
259
262
  }
260
263
  const {tables: {load = {}, save = {}} = {}, values = {}} = config;
261
- const valuesConfig = slice(
262
- objValues(objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values)),
263
- 0,
264
- objSize(DEFAULT_TABULAR_VALUES_CONFIG),
265
- );
264
+ const valuesConfigObj = objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values);
265
+ const {load: valuesLoad, save: valuesSave} = valuesConfigObj;
266
+ const valuesConfig = [
267
+ hasValues(valuesLoad),
268
+ hasValues(valuesSave),
269
+ valuesConfigObj[TABLE_NAME],
270
+ getValuesIn(valuesLoad),
271
+ getValuesIn(valuesSave),
272
+ ];
266
273
  const valuesTable = valuesConfig[2];
267
274
  const managedTableNames = setNew(valuesTable);
268
275
  const excludedTableNames = setNew(valuesTable);
@@ -506,13 +513,14 @@ const createCustomPersister = (
506
513
  const content = await getPersisted();
507
514
  if (isArray(content)) {
508
515
  setContentOrChanges(content);
509
- } else if (initialContent) {
516
+ } else if (isUndefined(content) && initialContent) {
510
517
  setDefaultContent(initialContent);
511
- } else {
518
+ } else if (!isUndefined(content)) {
512
519
  errorNew(`Content is not an array: ${content}`);
513
520
  }
514
521
  },
515
- () => {
522
+ (error) => {
523
+ onIgnoredError?.(error);
516
524
  if (initialContent) {
517
525
  setDefaultContent(initialContent);
518
526
  }
@@ -671,8 +679,18 @@ const getCommandFunctions = (
671
679
  ({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
672
680
  );
673
681
  };
674
- const loadTable = async (tableName, rowIdColumnName, condition) =>
675
- canSelect(tableName, rowIdColumnName)
682
+ const loadTable = async (
683
+ tableName,
684
+ rowIdColumnName,
685
+ condition,
686
+ contentSubIds,
687
+ ) => {
688
+ const contentSubIdSet = isUndefined(contentSubIds)
689
+ ? void 0
690
+ : setNew(contentSubIds);
691
+ const includeContentSubId = (contentSubId) =>
692
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
693
+ return canSelect(tableName, rowIdColumnName)
676
694
  ? objNew(
677
695
  arrayFilter(
678
696
  arrayMap(
@@ -681,17 +699,35 @@ const getCommandFunctions = (
681
699
  escapeId(tableName) +
682
700
  getWhereCondition(tableName, condition),
683
701
  ),
684
- (row) => [
685
- row[rowIdColumnName],
686
- decode
702
+ (row) => {
703
+ const rowId = row[rowIdColumnName];
704
+ const rowContent = decode
687
705
  ? objMap(objDel(row, rowIdColumnName), decode)
688
- : objDel(row, rowIdColumnName),
689
- ],
706
+ : objDel(row, rowIdColumnName);
707
+ return [
708
+ rowId,
709
+ isUndefined(contentSubIdSet)
710
+ ? rowContent
711
+ : objNew(
712
+ arrayFilter(
713
+ objToArray(
714
+ rowContent,
715
+ (cellOrValue, contentSubId) => [
716
+ contentSubId,
717
+ cellOrValue,
718
+ ],
719
+ ),
720
+ ([contentSubId]) => includeContentSubId(contentSubId),
721
+ ),
722
+ ),
723
+ ];
724
+ },
690
725
  ),
691
726
  (entry) => !isUndefined(entry[0]) && !objIsEmpty(entry[1]),
692
727
  ),
693
728
  )
694
729
  : {};
730
+ };
695
731
  const saveTable = async (
696
732
  tableName,
697
733
  rowIdColumnName,
@@ -700,15 +736,23 @@ const getCommandFunctions = (
700
736
  deleteEmptyTable,
701
737
  partial = false,
702
738
  condition = TRUE,
739
+ contentSubIds,
703
740
  ) => {
741
+ const contentSubIdSet = isUndefined(contentSubIds)
742
+ ? void 0
743
+ : setNew(contentSubIds);
744
+ const includeContentSubId = (contentSubId) =>
745
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
704
746
  const settingColumnNameSet = setNew();
705
747
  objMap(content ?? {}, (contentRow) =>
706
- arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
707
- setAdd(settingColumnNameSet, cellOrValueId),
748
+ arrayMap(
749
+ arrayFilter(objIds(contentRow ?? {}), includeContentSubId),
750
+ (cellOrValueId) => setAdd(settingColumnNameSet, cellOrValueId),
708
751
  ),
709
752
  );
710
753
  const settingColumnNames = collValues(settingColumnNameSet);
711
754
  if (
755
+ isUndefined(contentSubIdSet) &&
712
756
  !partial &&
713
757
  deleteEmptyTable &&
714
758
  condition == TRUE &&
@@ -720,7 +764,13 @@ const getCommandFunctions = (
720
764
  return;
721
765
  }
722
766
  const currentColumnNames = mapGet(schemaMap, tableName);
723
- const unaccountedColumnNames = setNew(collValues(currentColumnNames));
767
+ const unaccountedColumnNames = setNew(
768
+ arrayFilter(
769
+ collValues(currentColumnNames),
770
+ (columnName) =>
771
+ columnName == rowIdColumnName || includeContentSubId(columnName),
772
+ ),
773
+ );
724
774
  if (!arrayIsEmpty(settingColumnNames)) {
725
775
  if (!collHas(schemaMap, tableName)) {
726
776
  await databaseExecuteCommand(
@@ -786,11 +836,13 @@ const getCommandFunctions = (
786
836
  ]);
787
837
  if (partial) {
788
838
  if (isUndefined(content)) {
789
- await databaseExecuteCommand(
790
- DELETE_FROM +
791
- escapeId(tableName) +
792
- getWhereCondition(tableName, condition),
793
- );
839
+ if (isUndefined(contentSubIdSet)) {
840
+ await databaseExecuteCommand(
841
+ DELETE_FROM +
842
+ escapeId(tableName) +
843
+ getWhereCondition(tableName, condition),
844
+ );
845
+ }
794
846
  } else {
795
847
  await promiseAll(
796
848
  objToArray(content, async (row, rowId) => {
@@ -803,18 +855,24 @@ const getCommandFunctions = (
803
855
  [rowId],
804
856
  );
805
857
  } else if (!arrayIsEmpty(settingColumnNames)) {
806
- await upsert(
807
- databaseExecuteCommand,
808
- tableName,
809
- rowIdColumnName,
858
+ const changingColumnNames = arrayFilter(
810
859
  objIds(row),
811
- {
812
- [rowId]: encode
813
- ? arrayMap(objValues(row), encode)
814
- : objValues(row),
815
- },
816
- currentColumnNames,
860
+ includeContentSubId,
817
861
  );
862
+ if (!arrayIsEmpty(changingColumnNames)) {
863
+ await upsert(
864
+ databaseExecuteCommand,
865
+ tableName,
866
+ rowIdColumnName,
867
+ changingColumnNames,
868
+ {
869
+ [rowId]: arrayMap(changingColumnNames, (cellId) =>
870
+ encode ? encode(row[cellId]) : row[cellId],
871
+ ),
872
+ },
873
+ currentColumnNames,
874
+ );
875
+ }
818
876
  }
819
877
  }),
820
878
  );
@@ -823,7 +881,9 @@ const getCommandFunctions = (
823
881
  if (!arrayIsEmpty(settingColumnNames)) {
824
882
  const changingColumnNames = arrayFilter(
825
883
  collValues(mapGet(schemaMap, tableName)),
826
- (changingColumnName) => changingColumnName != rowIdColumnName,
884
+ (changingColumnName) =>
885
+ changingColumnName != rowIdColumnName &&
886
+ includeContentSubId(changingColumnName),
827
887
  );
828
888
  const rows = {};
829
889
  const deleteRowIds = [];
@@ -839,6 +899,7 @@ const getCommandFunctions = (
839
899
  rowIdColumnName,
840
900
  changingColumnNames,
841
901
  rows,
902
+ currentColumnNames,
842
903
  );
843
904
  await databaseExecuteCommand(
844
905
  DELETE_FROM +
@@ -847,7 +908,10 @@ const getCommandFunctions = (
847
908
  `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
848
909
  deleteRowIds,
849
910
  );
850
- } else if (collHas(schemaMap, tableName)) {
911
+ } else if (
912
+ isUndefined(contentSubIdSet) &&
913
+ collHas(schemaMap, tableName)
914
+ ) {
851
915
  await databaseExecuteCommand(
852
916
  DELETE_FROM +
853
917
  escapeId(tableName) +
@@ -986,7 +1050,13 @@ const createTabularPersister = (
986
1050
  [
987
1051
  tablesLoadConfig,
988
1052
  tablesSaveConfig,
989
- [valuesLoad, valuesSave, valuesTableName],
1053
+ [
1054
+ valuesLoad,
1055
+ valuesSave,
1056
+ valuesTableName,
1057
+ valuesLoadValueIds,
1058
+ valuesSaveValueIds,
1059
+ ],
990
1060
  ],
991
1061
  managedTableNames,
992
1062
  querySchema,
@@ -1036,15 +1106,33 @@ const createTabularPersister = (
1036
1106
  },
1037
1107
  ),
1038
1108
  );
1109
+ const getValuesSubset = (values, valueIds, partial) =>
1110
+ objNew(
1111
+ partial == true
1112
+ ? arrayFilter(
1113
+ objToArray(values, (value, valueId) => [valueId, value]),
1114
+ ([valueId]) => arrayHas(valueIds, valueId),
1115
+ )
1116
+ : arrayFilter(
1117
+ arrayMap(valueIds, (valueId) => [valueId, values[valueId]]),
1118
+ ([, value]) => !isUndefined(value),
1119
+ ),
1120
+ );
1039
1121
  const saveValues = async (values, partial) =>
1040
1122
  valuesSave
1041
1123
  ? await saveTable(
1042
1124
  valuesTableName,
1043
1125
  DEFAULT_ROW_ID_COLUMN_NAME,
1044
- {[SINGLE_ROW_ID]: values},
1126
+ {
1127
+ [SINGLE_ROW_ID]: isUndefined(valuesSaveValueIds)
1128
+ ? values
1129
+ : getValuesSubset(values, valuesSaveValueIds, partial),
1130
+ },
1045
1131
  true,
1046
1132
  true,
1047
1133
  partial,
1134
+ void 0,
1135
+ valuesSaveValueIds,
1048
1136
  )
1049
1137
  : null;
1050
1138
  const loadTables = async () =>
@@ -1064,9 +1152,14 @@ const createTabularPersister = (
1064
1152
  );
1065
1153
  const loadValues = async () =>
1066
1154
  valuesLoad
1067
- ? (await loadTable(valuesTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
1068
- SINGLE_ROW_ID
1069
- ]
1155
+ ? (
1156
+ await loadTable(
1157
+ valuesTableName,
1158
+ DEFAULT_ROW_ID_COLUMN_NAME,
1159
+ void 0,
1160
+ valuesLoadValueIds,
1161
+ )
1162
+ )[SINGLE_ROW_ID]
1070
1163
  : {};
1071
1164
  const getPersisted = () =>
1072
1165
  transaction(async () => {
@@ -305,13 +305,14 @@ const createCustomPersister = (
305
305
  const content = await getPersisted();
306
306
  if (isArray(content)) {
307
307
  setContentOrChanges(content);
308
- } else if (initialContent) {
308
+ } else if (isUndefined(content) && initialContent) {
309
309
  setDefaultContent(initialContent);
310
- } else {
310
+ } else if (!isUndefined(content)) {
311
311
  errorNew(`Content is not an array: ${content}`);
312
312
  }
313
313
  },
314
- () => {
314
+ (error) => {
315
+ onIgnoredError?.(error);
315
316
  if (initialContent) {
316
317
  setDefaultContent(initialContent);
317
318
  }
@@ -305,13 +305,14 @@ const createCustomPersister = (
305
305
  const content = await getPersisted();
306
306
  if (isArray(content)) {
307
307
  setContentOrChanges(content);
308
- } else if (initialContent) {
308
+ } else if (isUndefined(content) && initialContent) {
309
309
  setDefaultContent(initialContent);
310
- } else {
310
+ } else if (!isUndefined(content)) {
311
311
  errorNew(`Content is not an array: ${content}`);
312
312
  }
313
313
  },
314
- () => {
314
+ (error) => {
315
+ onIgnoredError?.(error);
315
316
  if (initialContent) {
316
317
  setDefaultContent(initialContent);
317
318
  }