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