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