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
@@ -22,6 +22,7 @@ const GLOBAL = globalThis;
22
22
  const isNullish = (thing) => thing == null;
23
23
  const isUndefined = (thing) => thing === void 0;
24
24
  const isNull = (thing) => thing === null;
25
+ const isTrue = (thing) => thing === true;
25
26
  const ifNotNullish = getIfNotFunction(isNullish);
26
27
  const ifNotUndefined = getIfNotFunction(isUndefined);
27
28
  const isString = (thing) => getTypeOf(thing) == STRING;
@@ -42,6 +43,7 @@ const tryCatch = async (action, then1, then2) => {
42
43
  }
43
44
  };
44
45
 
46
+ const arrayHas = (array, value) => array.includes(value);
45
47
  const arrayForEach = (array, cb) => array.forEach(cb);
46
48
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
47
49
  const arrayMap = (array, cb) => array.map(cb);
@@ -227,6 +229,8 @@ const DEFAULT_TABULAR_VALUES_CONFIG = {
227
229
  save: 0,
228
230
  [TABLE_NAME]: TINYBASE + '_values',
229
231
  };
232
+ const getValuesIn = (config) => (isArray(config) ? config : void 0);
233
+ const hasValues = (config) => isTrue(config) || isArray(config);
230
234
  const getDefaultedConfig = (configOrStoreTableName) =>
231
235
  objMerge(
232
236
  DEFAULT_CONFIG,
@@ -277,11 +281,15 @@ const getConfigStructures = (configOrStoreTableName) => {
277
281
  ];
278
282
  }
279
283
  const {tables: {load = {}, save = {}} = {}, values = {}} = config;
280
- const valuesConfig = slice(
281
- objValues(objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values)),
282
- 0,
283
- objSize(DEFAULT_TABULAR_VALUES_CONFIG),
284
- );
284
+ const valuesConfigObj = objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values);
285
+ const {load: valuesLoad, save: valuesSave} = valuesConfigObj;
286
+ const valuesConfig = [
287
+ hasValues(valuesLoad),
288
+ hasValues(valuesSave),
289
+ valuesConfigObj[TABLE_NAME],
290
+ getValuesIn(valuesLoad),
291
+ getValuesIn(valuesSave),
292
+ ];
285
293
  const valuesTable = valuesConfig[2];
286
294
  const managedTableNames = setNew(valuesTable);
287
295
  const excludedTableNames = setNew(valuesTable);
@@ -509,13 +517,14 @@ const createCustomPersister = (
509
517
  const content = await getPersisted();
510
518
  if (isArray(content)) {
511
519
  setContentOrChanges(content);
512
- } else if (initialContent) {
520
+ } else if (isUndefined(content) && initialContent) {
513
521
  setDefaultContent(initialContent);
514
- } else {
522
+ } else if (!isUndefined(content)) {
515
523
  errorNew(`Content is not an array: ${content}`);
516
524
  }
517
525
  },
518
- () => {
526
+ (error) => {
527
+ onIgnoredError?.(error);
519
528
  if (initialContent) {
520
529
  setDefaultContent(initialContent);
521
530
  }
@@ -674,8 +683,18 @@ const getCommandFunctions = (
674
683
  ({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
675
684
  );
676
685
  };
677
- const loadTable = async (tableName, rowIdColumnName, condition) =>
678
- canSelect(tableName, rowIdColumnName)
686
+ const loadTable = async (
687
+ tableName,
688
+ rowIdColumnName,
689
+ condition,
690
+ contentSubIds,
691
+ ) => {
692
+ const contentSubIdSet = isUndefined(contentSubIds)
693
+ ? void 0
694
+ : setNew(contentSubIds);
695
+ const includeContentSubId = (contentSubId) =>
696
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
697
+ return canSelect(tableName, rowIdColumnName)
679
698
  ? objNew(
680
699
  arrayFilter(
681
700
  arrayMap(
@@ -684,17 +703,35 @@ const getCommandFunctions = (
684
703
  escapeId(tableName) +
685
704
  getWhereCondition(tableName, condition),
686
705
  ),
687
- (row) => [
688
- row[rowIdColumnName],
689
- decode
706
+ (row) => {
707
+ const rowId = row[rowIdColumnName];
708
+ const rowContent = decode
690
709
  ? objMap(objDel(row, rowIdColumnName), decode)
691
- : objDel(row, rowIdColumnName),
692
- ],
710
+ : objDel(row, rowIdColumnName);
711
+ return [
712
+ rowId,
713
+ isUndefined(contentSubIdSet)
714
+ ? rowContent
715
+ : objNew(
716
+ arrayFilter(
717
+ objToArray(
718
+ rowContent,
719
+ (cellOrValue, contentSubId) => [
720
+ contentSubId,
721
+ cellOrValue,
722
+ ],
723
+ ),
724
+ ([contentSubId]) => includeContentSubId(contentSubId),
725
+ ),
726
+ ),
727
+ ];
728
+ },
693
729
  ),
694
730
  (entry) => !isUndefined(entry[0]) && !objIsEmpty(entry[1]),
695
731
  ),
696
732
  )
697
733
  : {};
734
+ };
698
735
  const saveTable = async (
699
736
  tableName,
700
737
  rowIdColumnName,
@@ -703,15 +740,23 @@ const getCommandFunctions = (
703
740
  deleteEmptyTable,
704
741
  partial = false,
705
742
  condition = TRUE,
743
+ contentSubIds,
706
744
  ) => {
745
+ const contentSubIdSet = isUndefined(contentSubIds)
746
+ ? void 0
747
+ : setNew(contentSubIds);
748
+ const includeContentSubId = (contentSubId) =>
749
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
707
750
  const settingColumnNameSet = setNew();
708
751
  objMap(content ?? {}, (contentRow) =>
709
- arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
710
- setAdd(settingColumnNameSet, cellOrValueId),
752
+ arrayMap(
753
+ arrayFilter(objIds(contentRow ?? {}), includeContentSubId),
754
+ (cellOrValueId) => setAdd(settingColumnNameSet, cellOrValueId),
711
755
  ),
712
756
  );
713
757
  const settingColumnNames = collValues(settingColumnNameSet);
714
758
  if (
759
+ isUndefined(contentSubIdSet) &&
715
760
  !partial &&
716
761
  deleteEmptyTable &&
717
762
  condition == TRUE &&
@@ -723,7 +768,13 @@ const getCommandFunctions = (
723
768
  return;
724
769
  }
725
770
  const currentColumnNames = mapGet(schemaMap, tableName);
726
- const unaccountedColumnNames = setNew(collValues(currentColumnNames));
771
+ const unaccountedColumnNames = setNew(
772
+ arrayFilter(
773
+ collValues(currentColumnNames),
774
+ (columnName) =>
775
+ columnName == rowIdColumnName || includeContentSubId(columnName),
776
+ ),
777
+ );
727
778
  if (!arrayIsEmpty(settingColumnNames)) {
728
779
  if (!collHas(schemaMap, tableName)) {
729
780
  await databaseExecuteCommand(
@@ -789,11 +840,13 @@ const getCommandFunctions = (
789
840
  ]);
790
841
  if (partial) {
791
842
  if (isUndefined(content)) {
792
- await databaseExecuteCommand(
793
- DELETE_FROM +
794
- escapeId(tableName) +
795
- getWhereCondition(tableName, condition),
796
- );
843
+ if (isUndefined(contentSubIdSet)) {
844
+ await databaseExecuteCommand(
845
+ DELETE_FROM +
846
+ escapeId(tableName) +
847
+ getWhereCondition(tableName, condition),
848
+ );
849
+ }
797
850
  } else {
798
851
  await promiseAll(
799
852
  objToArray(content, async (row, rowId) => {
@@ -806,18 +859,24 @@ const getCommandFunctions = (
806
859
  [rowId],
807
860
  );
808
861
  } else if (!arrayIsEmpty(settingColumnNames)) {
809
- await upsert(
810
- databaseExecuteCommand,
811
- tableName,
812
- rowIdColumnName,
862
+ const changingColumnNames = arrayFilter(
813
863
  objIds(row),
814
- {
815
- [rowId]: encode
816
- ? arrayMap(objValues(row), encode)
817
- : objValues(row),
818
- },
819
- currentColumnNames,
864
+ includeContentSubId,
820
865
  );
866
+ if (!arrayIsEmpty(changingColumnNames)) {
867
+ await upsert(
868
+ databaseExecuteCommand,
869
+ tableName,
870
+ rowIdColumnName,
871
+ changingColumnNames,
872
+ {
873
+ [rowId]: arrayMap(changingColumnNames, (cellId) =>
874
+ encode ? encode(row[cellId]) : row[cellId],
875
+ ),
876
+ },
877
+ currentColumnNames,
878
+ );
879
+ }
821
880
  }
822
881
  }),
823
882
  );
@@ -826,7 +885,9 @@ const getCommandFunctions = (
826
885
  if (!arrayIsEmpty(settingColumnNames)) {
827
886
  const changingColumnNames = arrayFilter(
828
887
  collValues(mapGet(schemaMap, tableName)),
829
- (changingColumnName) => changingColumnName != rowIdColumnName,
888
+ (changingColumnName) =>
889
+ changingColumnName != rowIdColumnName &&
890
+ includeContentSubId(changingColumnName),
830
891
  );
831
892
  const rows = {};
832
893
  const deleteRowIds = [];
@@ -842,6 +903,7 @@ const getCommandFunctions = (
842
903
  rowIdColumnName,
843
904
  changingColumnNames,
844
905
  rows,
906
+ currentColumnNames,
845
907
  );
846
908
  await databaseExecuteCommand(
847
909
  DELETE_FROM +
@@ -850,7 +912,10 @@ const getCommandFunctions = (
850
912
  `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
851
913
  deleteRowIds,
852
914
  );
853
- } else if (collHas(schemaMap, tableName)) {
915
+ } else if (
916
+ isUndefined(contentSubIdSet) &&
917
+ collHas(schemaMap, tableName)
918
+ ) {
854
919
  await databaseExecuteCommand(
855
920
  DELETE_FROM +
856
921
  escapeId(tableName) +
@@ -989,7 +1054,13 @@ const createTabularPersister = (
989
1054
  [
990
1055
  tablesLoadConfig,
991
1056
  tablesSaveConfig,
992
- [valuesLoad, valuesSave, valuesTableName],
1057
+ [
1058
+ valuesLoad,
1059
+ valuesSave,
1060
+ valuesTableName,
1061
+ valuesLoadValueIds,
1062
+ valuesSaveValueIds,
1063
+ ],
993
1064
  ],
994
1065
  managedTableNames,
995
1066
  querySchema,
@@ -1039,15 +1110,33 @@ const createTabularPersister = (
1039
1110
  },
1040
1111
  ),
1041
1112
  );
1113
+ const getValuesSubset = (values, valueIds, partial) =>
1114
+ objNew(
1115
+ partial == true
1116
+ ? arrayFilter(
1117
+ objToArray(values, (value, valueId) => [valueId, value]),
1118
+ ([valueId]) => arrayHas(valueIds, valueId),
1119
+ )
1120
+ : arrayFilter(
1121
+ arrayMap(valueIds, (valueId) => [valueId, values[valueId]]),
1122
+ ([, value]) => !isUndefined(value),
1123
+ ),
1124
+ );
1042
1125
  const saveValues = async (values, partial) =>
1043
1126
  valuesSave
1044
1127
  ? await saveTable(
1045
1128
  valuesTableName,
1046
1129
  DEFAULT_ROW_ID_COLUMN_NAME,
1047
- {[SINGLE_ROW_ID]: values},
1130
+ {
1131
+ [SINGLE_ROW_ID]: isUndefined(valuesSaveValueIds)
1132
+ ? values
1133
+ : getValuesSubset(values, valuesSaveValueIds, partial),
1134
+ },
1048
1135
  true,
1049
1136
  true,
1050
1137
  partial,
1138
+ void 0,
1139
+ valuesSaveValueIds,
1051
1140
  )
1052
1141
  : null;
1053
1142
  const loadTables = async () =>
@@ -1067,9 +1156,14 @@ const createTabularPersister = (
1067
1156
  );
1068
1157
  const loadValues = async () =>
1069
1158
  valuesLoad
1070
- ? (await loadTable(valuesTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
1071
- SINGLE_ROW_ID
1072
- ]
1159
+ ? (
1160
+ await loadTable(
1161
+ valuesTableName,
1162
+ DEFAULT_ROW_ID_COLUMN_NAME,
1163
+ void 0,
1164
+ valuesLoadValueIds,
1165
+ )
1166
+ )[SINGLE_ROW_ID]
1073
1167
  : {};
1074
1168
  const getPersisted = () =>
1075
1169
  transaction(async () => {
@@ -22,6 +22,7 @@ const GLOBAL = globalThis;
22
22
  const isNullish = (thing) => thing == null;
23
23
  const isUndefined = (thing) => thing === void 0;
24
24
  const isNull = (thing) => thing === null;
25
+ const isTrue = (thing) => thing === true;
25
26
  const ifNotNullish = getIfNotFunction(isNullish);
26
27
  const ifNotUndefined = getIfNotFunction(isUndefined);
27
28
  const isString = (thing) => getTypeOf(thing) == STRING;
@@ -42,6 +43,7 @@ const tryCatch = async (action, then1, then2) => {
42
43
  }
43
44
  };
44
45
 
46
+ const arrayHas = (array, value) => array.includes(value);
45
47
  const arrayForEach = (array, cb) => array.forEach(cb);
46
48
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
47
49
  const arrayMap = (array, cb) => array.map(cb);
@@ -227,6 +229,8 @@ const DEFAULT_TABULAR_VALUES_CONFIG = {
227
229
  save: 0,
228
230
  [TABLE_NAME]: TINYBASE + '_values',
229
231
  };
232
+ const getValuesIn = (config) => (isArray(config) ? config : void 0);
233
+ const hasValues = (config) => isTrue(config) || isArray(config);
230
234
  const getDefaultedConfig = (configOrStoreTableName) =>
231
235
  objMerge(
232
236
  DEFAULT_CONFIG,
@@ -277,11 +281,15 @@ const getConfigStructures = (configOrStoreTableName) => {
277
281
  ];
278
282
  }
279
283
  const {tables: {load = {}, save = {}} = {}, values = {}} = config;
280
- const valuesConfig = slice(
281
- objValues(objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values)),
282
- 0,
283
- objSize(DEFAULT_TABULAR_VALUES_CONFIG),
284
- );
284
+ const valuesConfigObj = objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values);
285
+ const {load: valuesLoad, save: valuesSave} = valuesConfigObj;
286
+ const valuesConfig = [
287
+ hasValues(valuesLoad),
288
+ hasValues(valuesSave),
289
+ valuesConfigObj[TABLE_NAME],
290
+ getValuesIn(valuesLoad),
291
+ getValuesIn(valuesSave),
292
+ ];
285
293
  const valuesTable = valuesConfig[2];
286
294
  const managedTableNames = setNew(valuesTable);
287
295
  const excludedTableNames = setNew(valuesTable);
@@ -509,13 +517,14 @@ const createCustomPersister = (
509
517
  const content = await getPersisted();
510
518
  if (isArray(content)) {
511
519
  setContentOrChanges(content);
512
- } else if (initialContent) {
520
+ } else if (isUndefined(content) && initialContent) {
513
521
  setDefaultContent(initialContent);
514
- } else {
522
+ } else if (!isUndefined(content)) {
515
523
  errorNew(`Content is not an array: ${content}`);
516
524
  }
517
525
  },
518
- () => {
526
+ (error) => {
527
+ onIgnoredError?.(error);
519
528
  if (initialContent) {
520
529
  setDefaultContent(initialContent);
521
530
  }
@@ -674,8 +683,18 @@ const getCommandFunctions = (
674
683
  ({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
675
684
  );
676
685
  };
677
- const loadTable = async (tableName, rowIdColumnName, condition) =>
678
- canSelect(tableName, rowIdColumnName)
686
+ const loadTable = async (
687
+ tableName,
688
+ rowIdColumnName,
689
+ condition,
690
+ contentSubIds,
691
+ ) => {
692
+ const contentSubIdSet = isUndefined(contentSubIds)
693
+ ? void 0
694
+ : setNew(contentSubIds);
695
+ const includeContentSubId = (contentSubId) =>
696
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
697
+ return canSelect(tableName, rowIdColumnName)
679
698
  ? objNew(
680
699
  arrayFilter(
681
700
  arrayMap(
@@ -684,17 +703,35 @@ const getCommandFunctions = (
684
703
  escapeId(tableName) +
685
704
  getWhereCondition(tableName, condition),
686
705
  ),
687
- (row) => [
688
- row[rowIdColumnName],
689
- decode
706
+ (row) => {
707
+ const rowId = row[rowIdColumnName];
708
+ const rowContent = decode
690
709
  ? objMap(objDel(row, rowIdColumnName), decode)
691
- : objDel(row, rowIdColumnName),
692
- ],
710
+ : objDel(row, rowIdColumnName);
711
+ return [
712
+ rowId,
713
+ isUndefined(contentSubIdSet)
714
+ ? rowContent
715
+ : objNew(
716
+ arrayFilter(
717
+ objToArray(
718
+ rowContent,
719
+ (cellOrValue, contentSubId) => [
720
+ contentSubId,
721
+ cellOrValue,
722
+ ],
723
+ ),
724
+ ([contentSubId]) => includeContentSubId(contentSubId),
725
+ ),
726
+ ),
727
+ ];
728
+ },
693
729
  ),
694
730
  (entry) => !isUndefined(entry[0]) && !objIsEmpty(entry[1]),
695
731
  ),
696
732
  )
697
733
  : {};
734
+ };
698
735
  const saveTable = async (
699
736
  tableName,
700
737
  rowIdColumnName,
@@ -703,15 +740,23 @@ const getCommandFunctions = (
703
740
  deleteEmptyTable,
704
741
  partial = false,
705
742
  condition = TRUE,
743
+ contentSubIds,
706
744
  ) => {
745
+ const contentSubIdSet = isUndefined(contentSubIds)
746
+ ? void 0
747
+ : setNew(contentSubIds);
748
+ const includeContentSubId = (contentSubId) =>
749
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
707
750
  const settingColumnNameSet = setNew();
708
751
  objMap(content ?? {}, (contentRow) =>
709
- arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
710
- setAdd(settingColumnNameSet, cellOrValueId),
752
+ arrayMap(
753
+ arrayFilter(objIds(contentRow ?? {}), includeContentSubId),
754
+ (cellOrValueId) => setAdd(settingColumnNameSet, cellOrValueId),
711
755
  ),
712
756
  );
713
757
  const settingColumnNames = collValues(settingColumnNameSet);
714
758
  if (
759
+ isUndefined(contentSubIdSet) &&
715
760
  !partial &&
716
761
  deleteEmptyTable &&
717
762
  condition == TRUE &&
@@ -723,7 +768,13 @@ const getCommandFunctions = (
723
768
  return;
724
769
  }
725
770
  const currentColumnNames = mapGet(schemaMap, tableName);
726
- const unaccountedColumnNames = setNew(collValues(currentColumnNames));
771
+ const unaccountedColumnNames = setNew(
772
+ arrayFilter(
773
+ collValues(currentColumnNames),
774
+ (columnName) =>
775
+ columnName == rowIdColumnName || includeContentSubId(columnName),
776
+ ),
777
+ );
727
778
  if (!arrayIsEmpty(settingColumnNames)) {
728
779
  if (!collHas(schemaMap, tableName)) {
729
780
  await databaseExecuteCommand(
@@ -789,11 +840,13 @@ const getCommandFunctions = (
789
840
  ]);
790
841
  if (partial) {
791
842
  if (isUndefined(content)) {
792
- await databaseExecuteCommand(
793
- DELETE_FROM +
794
- escapeId(tableName) +
795
- getWhereCondition(tableName, condition),
796
- );
843
+ if (isUndefined(contentSubIdSet)) {
844
+ await databaseExecuteCommand(
845
+ DELETE_FROM +
846
+ escapeId(tableName) +
847
+ getWhereCondition(tableName, condition),
848
+ );
849
+ }
797
850
  } else {
798
851
  await promiseAll(
799
852
  objToArray(content, async (row, rowId) => {
@@ -806,18 +859,24 @@ const getCommandFunctions = (
806
859
  [rowId],
807
860
  );
808
861
  } else if (!arrayIsEmpty(settingColumnNames)) {
809
- await upsert(
810
- databaseExecuteCommand,
811
- tableName,
812
- rowIdColumnName,
862
+ const changingColumnNames = arrayFilter(
813
863
  objIds(row),
814
- {
815
- [rowId]: encode
816
- ? arrayMap(objValues(row), encode)
817
- : objValues(row),
818
- },
819
- currentColumnNames,
864
+ includeContentSubId,
820
865
  );
866
+ if (!arrayIsEmpty(changingColumnNames)) {
867
+ await upsert(
868
+ databaseExecuteCommand,
869
+ tableName,
870
+ rowIdColumnName,
871
+ changingColumnNames,
872
+ {
873
+ [rowId]: arrayMap(changingColumnNames, (cellId) =>
874
+ encode ? encode(row[cellId]) : row[cellId],
875
+ ),
876
+ },
877
+ currentColumnNames,
878
+ );
879
+ }
821
880
  }
822
881
  }),
823
882
  );
@@ -826,7 +885,9 @@ const getCommandFunctions = (
826
885
  if (!arrayIsEmpty(settingColumnNames)) {
827
886
  const changingColumnNames = arrayFilter(
828
887
  collValues(mapGet(schemaMap, tableName)),
829
- (changingColumnName) => changingColumnName != rowIdColumnName,
888
+ (changingColumnName) =>
889
+ changingColumnName != rowIdColumnName &&
890
+ includeContentSubId(changingColumnName),
830
891
  );
831
892
  const rows = {};
832
893
  const deleteRowIds = [];
@@ -842,6 +903,7 @@ const getCommandFunctions = (
842
903
  rowIdColumnName,
843
904
  changingColumnNames,
844
905
  rows,
906
+ currentColumnNames,
845
907
  );
846
908
  await databaseExecuteCommand(
847
909
  DELETE_FROM +
@@ -850,7 +912,10 @@ const getCommandFunctions = (
850
912
  `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
851
913
  deleteRowIds,
852
914
  );
853
- } else if (collHas(schemaMap, tableName)) {
915
+ } else if (
916
+ isUndefined(contentSubIdSet) &&
917
+ collHas(schemaMap, tableName)
918
+ ) {
854
919
  await databaseExecuteCommand(
855
920
  DELETE_FROM +
856
921
  escapeId(tableName) +
@@ -989,7 +1054,13 @@ const createTabularPersister = (
989
1054
  [
990
1055
  tablesLoadConfig,
991
1056
  tablesSaveConfig,
992
- [valuesLoad, valuesSave, valuesTableName],
1057
+ [
1058
+ valuesLoad,
1059
+ valuesSave,
1060
+ valuesTableName,
1061
+ valuesLoadValueIds,
1062
+ valuesSaveValueIds,
1063
+ ],
993
1064
  ],
994
1065
  managedTableNames,
995
1066
  querySchema,
@@ -1039,15 +1110,33 @@ const createTabularPersister = (
1039
1110
  },
1040
1111
  ),
1041
1112
  );
1113
+ const getValuesSubset = (values, valueIds, partial) =>
1114
+ objNew(
1115
+ partial == true
1116
+ ? arrayFilter(
1117
+ objToArray(values, (value, valueId) => [valueId, value]),
1118
+ ([valueId]) => arrayHas(valueIds, valueId),
1119
+ )
1120
+ : arrayFilter(
1121
+ arrayMap(valueIds, (valueId) => [valueId, values[valueId]]),
1122
+ ([, value]) => !isUndefined(value),
1123
+ ),
1124
+ );
1042
1125
  const saveValues = async (values, partial) =>
1043
1126
  valuesSave
1044
1127
  ? await saveTable(
1045
1128
  valuesTableName,
1046
1129
  DEFAULT_ROW_ID_COLUMN_NAME,
1047
- {[SINGLE_ROW_ID]: values},
1130
+ {
1131
+ [SINGLE_ROW_ID]: isUndefined(valuesSaveValueIds)
1132
+ ? values
1133
+ : getValuesSubset(values, valuesSaveValueIds, partial),
1134
+ },
1048
1135
  true,
1049
1136
  true,
1050
1137
  partial,
1138
+ void 0,
1139
+ valuesSaveValueIds,
1051
1140
  )
1052
1141
  : null;
1053
1142
  const loadTables = async () =>
@@ -1067,9 +1156,14 @@ const createTabularPersister = (
1067
1156
  );
1068
1157
  const loadValues = async () =>
1069
1158
  valuesLoad
1070
- ? (await loadTable(valuesTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
1071
- SINGLE_ROW_ID
1072
- ]
1159
+ ? (
1160
+ await loadTable(
1161
+ valuesTableName,
1162
+ DEFAULT_ROW_ID_COLUMN_NAME,
1163
+ void 0,
1164
+ valuesLoadValueIds,
1165
+ )
1166
+ )[SINGLE_ROW_ID]
1073
1167
  : {};
1074
1168
  const getPersisted = () =>
1075
1169
  transaction(async () => {