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