tinybase 8.6.0-beta.0 → 9.0.0-beta.0
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.
- package/@types/_internal/queries/with-schemas/index.d.ts +1 -2
- package/@types/_internal/ui/with-schemas/index.d.ts +8 -16
- package/@types/persisters/index.d.ts +32 -12
- package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +9 -8
- package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +10 -10
- package/@types/persisters/with-schemas/index.d.ts +56 -20
- package/@types/queries/index.d.ts +1 -7
- package/@types/queries/with-schemas/index.d.ts +5 -15
- package/@types/store/index.d.ts +1 -2
- package/@types/store/with-schemas/index.d.ts +19 -29
- package/@types/synchronizers/synchronizer-ws-client/index.d.ts +9 -3
- package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +10 -3
- package/@types/synchronizers/synchronizer-ws-server/index.d.ts +15 -2
- package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +17 -2
- package/@types/synchronizers/synchronizer-ws-server-durable-object/index.d.ts +51 -0
- package/@types/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.d.ts +51 -0
- package/@types/ui-react/with-schemas/index.d.ts +3 -6
- package/@types/ui-react-dom/with-schemas/index.d.ts +6 -12
- package/@types/ui-react-dom-charts/with-schemas/index.d.ts +3 -4
- package/@types/ui-solid/with-schemas/index.d.ts +4 -8
- package/@types/ui-solid-dom/with-schemas/index.d.ts +6 -12
- package/@types/ui-svelte-dom/with-schemas/index.d.ts +6 -12
- package/index.js +21 -19
- package/indexes/index.js +6 -8
- package/indexes/with-schemas/index.js +6 -8
- package/metrics/index.js +6 -8
- package/metrics/with-schemas/index.js +6 -8
- package/min/index.js +1 -1
- package/min/index.js.gz +0 -0
- package/min/omni/index.js +1 -1
- package/min/omni/index.js.gz +0 -0
- package/min/omni/with-schemas/index.js +1 -1
- package/min/omni/with-schemas/index.js.gz +0 -0
- package/min/persisters/index.js +1 -1
- package/min/persisters/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/index.js +1 -1
- package/min/persisters/persister-electric-sql/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
- package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-libsql/index.js +1 -1
- package/min/persisters/persister-libsql/index.js.gz +0 -0
- package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
- package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pglite/index.js +1 -1
- package/min/persisters/persister-pglite/index.js.gz +0 -0
- package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
- package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-postgres/index.js +1 -1
- package/min/persisters/persister-postgres/index.js.gz +0 -0
- package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
- package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-powersync/index.js +1 -1
- package/min/persisters/persister-powersync/index.js.gz +0 -0
- package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
- package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/index.js +1 -1
- package/min/persisters/persister-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/with-schemas/index.js +1 -1
- package/min/persisters/with-schemas/index.js.gz +0 -0
- package/min/queries/index.js +1 -1
- package/min/queries/index.js.gz +0 -0
- package/min/queries/with-schemas/index.js +1 -1
- package/min/queries/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
- package/min/with-schemas/index.js +1 -1
- package/min/with-schemas/index.js.gz +0 -0
- package/omni/index.js +311 -141
- package/omni/with-schemas/index.js +311 -141
- package/package.json +7 -7
- package/persisters/index.js +129 -37
- package/persisters/persister-cr-sqlite-wasm/index.js +129 -37
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +129 -37
- package/persisters/persister-durable-object-sql-storage/index.js +271 -110
- package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +271 -110
- package/persisters/persister-electric-sql/index.js +129 -37
- package/persisters/persister-electric-sql/with-schemas/index.js +129 -37
- package/persisters/persister-expo-sqlite/index.js +129 -37
- package/persisters/persister-expo-sqlite/with-schemas/index.js +129 -37
- package/persisters/persister-libsql/index.js +129 -37
- package/persisters/persister-libsql/with-schemas/index.js +129 -37
- package/persisters/persister-pglite/index.js +130 -37
- package/persisters/persister-pglite/with-schemas/index.js +130 -37
- package/persisters/persister-postgres/index.js +130 -37
- package/persisters/persister-postgres/with-schemas/index.js +130 -37
- package/persisters/persister-powersync/index.js +182 -117
- package/persisters/persister-powersync/with-schemas/index.js +182 -117
- package/persisters/persister-react-native-sqlite/index.js +129 -37
- package/persisters/persister-react-native-sqlite/with-schemas/index.js +129 -37
- package/persisters/persister-sqlite-bun/index.js +129 -37
- package/persisters/persister-sqlite-bun/with-schemas/index.js +129 -37
- package/persisters/persister-sqlite-wasm/index.js +129 -37
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +129 -37
- package/persisters/persister-sqlite3/index.js +129 -37
- package/persisters/persister-sqlite3/with-schemas/index.js +129 -37
- package/persisters/with-schemas/index.js +129 -37
- package/queries/index.js +21 -19
- package/queries/with-schemas/index.js +21 -19
- package/readme.md +14 -14
- package/relationships/index.js +6 -8
- package/relationships/with-schemas/index.js +6 -8
- package/releases.md +57 -57
- package/synchronizers/synchronizer-ws-client/index.js +116 -42
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +116 -42
- package/synchronizers/synchronizer-ws-server/index.js +109 -28
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +109 -28
- package/synchronizers/synchronizer-ws-server-durable-object/index.js +122 -38
- package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +122 -38
- package/ui-svelte/index.js +1 -1
- package/ui-svelte/with-schemas/index.js +1 -1
- package/ui-svelte-dom/index.js +2 -2
- package/ui-svelte-dom/with-schemas/index.js +2 -2
- package/ui-svelte-inspector/index.js +2 -2
- package/ui-svelte-inspector/with-schemas/index.js +2 -2
- package/with-schemas/index.js +21 -19
|
@@ -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
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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);
|
|
@@ -674,8 +682,18 @@ const getCommandFunctions = (
|
|
|
674
682
|
({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
|
|
675
683
|
);
|
|
676
684
|
};
|
|
677
|
-
const loadTable = async (
|
|
678
|
-
|
|
685
|
+
const loadTable = async (
|
|
686
|
+
tableName,
|
|
687
|
+
rowIdColumnName,
|
|
688
|
+
condition,
|
|
689
|
+
contentSubIds,
|
|
690
|
+
) => {
|
|
691
|
+
const contentSubIdSet = isUndefined(contentSubIds)
|
|
692
|
+
? void 0
|
|
693
|
+
: setNew(contentSubIds);
|
|
694
|
+
const includeContentSubId = (contentSubId) =>
|
|
695
|
+
isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
|
|
696
|
+
return canSelect(tableName, rowIdColumnName)
|
|
679
697
|
? objNew(
|
|
680
698
|
arrayFilter(
|
|
681
699
|
arrayMap(
|
|
@@ -684,17 +702,35 @@ const getCommandFunctions = (
|
|
|
684
702
|
escapeId(tableName) +
|
|
685
703
|
getWhereCondition(tableName, condition),
|
|
686
704
|
),
|
|
687
|
-
(row) =>
|
|
688
|
-
row[rowIdColumnName]
|
|
689
|
-
decode
|
|
705
|
+
(row) => {
|
|
706
|
+
const rowId = row[rowIdColumnName];
|
|
707
|
+
const rowContent = decode
|
|
690
708
|
? objMap(objDel(row, rowIdColumnName), decode)
|
|
691
|
-
: objDel(row, rowIdColumnName)
|
|
692
|
-
|
|
709
|
+
: objDel(row, rowIdColumnName);
|
|
710
|
+
return [
|
|
711
|
+
rowId,
|
|
712
|
+
isUndefined(contentSubIdSet)
|
|
713
|
+
? rowContent
|
|
714
|
+
: objNew(
|
|
715
|
+
arrayFilter(
|
|
716
|
+
objToArray(
|
|
717
|
+
rowContent,
|
|
718
|
+
(cellOrValue, contentSubId) => [
|
|
719
|
+
contentSubId,
|
|
720
|
+
cellOrValue,
|
|
721
|
+
],
|
|
722
|
+
),
|
|
723
|
+
([contentSubId]) => includeContentSubId(contentSubId),
|
|
724
|
+
),
|
|
725
|
+
),
|
|
726
|
+
];
|
|
727
|
+
},
|
|
693
728
|
),
|
|
694
729
|
(entry) => !isUndefined(entry[0]) && !objIsEmpty(entry[1]),
|
|
695
730
|
),
|
|
696
731
|
)
|
|
697
732
|
: {};
|
|
733
|
+
};
|
|
698
734
|
const saveTable = async (
|
|
699
735
|
tableName,
|
|
700
736
|
rowIdColumnName,
|
|
@@ -703,15 +739,23 @@ const getCommandFunctions = (
|
|
|
703
739
|
deleteEmptyTable,
|
|
704
740
|
partial = false,
|
|
705
741
|
condition = TRUE,
|
|
742
|
+
contentSubIds,
|
|
706
743
|
) => {
|
|
744
|
+
const contentSubIdSet = isUndefined(contentSubIds)
|
|
745
|
+
? void 0
|
|
746
|
+
: setNew(contentSubIds);
|
|
747
|
+
const includeContentSubId = (contentSubId) =>
|
|
748
|
+
isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
|
|
707
749
|
const settingColumnNameSet = setNew();
|
|
708
750
|
objMap(content ?? {}, (contentRow) =>
|
|
709
|
-
arrayMap(
|
|
710
|
-
|
|
751
|
+
arrayMap(
|
|
752
|
+
arrayFilter(objIds(contentRow ?? {}), includeContentSubId),
|
|
753
|
+
(cellOrValueId) => setAdd(settingColumnNameSet, cellOrValueId),
|
|
711
754
|
),
|
|
712
755
|
);
|
|
713
756
|
const settingColumnNames = collValues(settingColumnNameSet);
|
|
714
757
|
if (
|
|
758
|
+
isUndefined(contentSubIdSet) &&
|
|
715
759
|
!partial &&
|
|
716
760
|
deleteEmptyTable &&
|
|
717
761
|
condition == TRUE &&
|
|
@@ -723,7 +767,13 @@ const getCommandFunctions = (
|
|
|
723
767
|
return;
|
|
724
768
|
}
|
|
725
769
|
const currentColumnNames = mapGet(schemaMap, tableName);
|
|
726
|
-
const unaccountedColumnNames = setNew(
|
|
770
|
+
const unaccountedColumnNames = setNew(
|
|
771
|
+
arrayFilter(
|
|
772
|
+
collValues(currentColumnNames),
|
|
773
|
+
(columnName) =>
|
|
774
|
+
columnName == rowIdColumnName || includeContentSubId(columnName),
|
|
775
|
+
),
|
|
776
|
+
);
|
|
727
777
|
if (!arrayIsEmpty(settingColumnNames)) {
|
|
728
778
|
if (!collHas(schemaMap, tableName)) {
|
|
729
779
|
await databaseExecuteCommand(
|
|
@@ -789,11 +839,13 @@ const getCommandFunctions = (
|
|
|
789
839
|
]);
|
|
790
840
|
if (partial) {
|
|
791
841
|
if (isUndefined(content)) {
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
842
|
+
if (isUndefined(contentSubIdSet)) {
|
|
843
|
+
await databaseExecuteCommand(
|
|
844
|
+
DELETE_FROM +
|
|
845
|
+
escapeId(tableName) +
|
|
846
|
+
getWhereCondition(tableName, condition),
|
|
847
|
+
);
|
|
848
|
+
}
|
|
797
849
|
} else {
|
|
798
850
|
await promiseAll(
|
|
799
851
|
objToArray(content, async (row, rowId) => {
|
|
@@ -806,18 +858,24 @@ const getCommandFunctions = (
|
|
|
806
858
|
[rowId],
|
|
807
859
|
);
|
|
808
860
|
} else if (!arrayIsEmpty(settingColumnNames)) {
|
|
809
|
-
|
|
810
|
-
databaseExecuteCommand,
|
|
811
|
-
tableName,
|
|
812
|
-
rowIdColumnName,
|
|
861
|
+
const changingColumnNames = arrayFilter(
|
|
813
862
|
objIds(row),
|
|
814
|
-
|
|
815
|
-
[rowId]: encode
|
|
816
|
-
? arrayMap(objValues(row), encode)
|
|
817
|
-
: objValues(row),
|
|
818
|
-
},
|
|
819
|
-
currentColumnNames,
|
|
863
|
+
includeContentSubId,
|
|
820
864
|
);
|
|
865
|
+
if (!arrayIsEmpty(changingColumnNames)) {
|
|
866
|
+
await upsert(
|
|
867
|
+
databaseExecuteCommand,
|
|
868
|
+
tableName,
|
|
869
|
+
rowIdColumnName,
|
|
870
|
+
changingColumnNames,
|
|
871
|
+
{
|
|
872
|
+
[rowId]: arrayMap(changingColumnNames, (cellId) =>
|
|
873
|
+
encode ? encode(row[cellId]) : row[cellId],
|
|
874
|
+
),
|
|
875
|
+
},
|
|
876
|
+
currentColumnNames,
|
|
877
|
+
);
|
|
878
|
+
}
|
|
821
879
|
}
|
|
822
880
|
}),
|
|
823
881
|
);
|
|
@@ -826,7 +884,9 @@ const getCommandFunctions = (
|
|
|
826
884
|
if (!arrayIsEmpty(settingColumnNames)) {
|
|
827
885
|
const changingColumnNames = arrayFilter(
|
|
828
886
|
collValues(mapGet(schemaMap, tableName)),
|
|
829
|
-
(changingColumnName) =>
|
|
887
|
+
(changingColumnName) =>
|
|
888
|
+
changingColumnName != rowIdColumnName &&
|
|
889
|
+
includeContentSubId(changingColumnName),
|
|
830
890
|
);
|
|
831
891
|
const rows = {};
|
|
832
892
|
const deleteRowIds = [];
|
|
@@ -842,6 +902,7 @@ const getCommandFunctions = (
|
|
|
842
902
|
rowIdColumnName,
|
|
843
903
|
changingColumnNames,
|
|
844
904
|
rows,
|
|
905
|
+
currentColumnNames,
|
|
845
906
|
);
|
|
846
907
|
await databaseExecuteCommand(
|
|
847
908
|
DELETE_FROM +
|
|
@@ -850,7 +911,10 @@ const getCommandFunctions = (
|
|
|
850
911
|
`AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
|
|
851
912
|
deleteRowIds,
|
|
852
913
|
);
|
|
853
|
-
} else if (
|
|
914
|
+
} else if (
|
|
915
|
+
isUndefined(contentSubIdSet) &&
|
|
916
|
+
collHas(schemaMap, tableName)
|
|
917
|
+
) {
|
|
854
918
|
await databaseExecuteCommand(
|
|
855
919
|
DELETE_FROM +
|
|
856
920
|
escapeId(tableName) +
|
|
@@ -989,7 +1053,13 @@ const createTabularPersister = (
|
|
|
989
1053
|
[
|
|
990
1054
|
tablesLoadConfig,
|
|
991
1055
|
tablesSaveConfig,
|
|
992
|
-
[
|
|
1056
|
+
[
|
|
1057
|
+
valuesLoad,
|
|
1058
|
+
valuesSave,
|
|
1059
|
+
valuesTableName,
|
|
1060
|
+
valuesLoadValueIds,
|
|
1061
|
+
valuesSaveValueIds,
|
|
1062
|
+
],
|
|
993
1063
|
],
|
|
994
1064
|
managedTableNames,
|
|
995
1065
|
querySchema,
|
|
@@ -1039,15 +1109,33 @@ const createTabularPersister = (
|
|
|
1039
1109
|
},
|
|
1040
1110
|
),
|
|
1041
1111
|
);
|
|
1112
|
+
const getValuesSubset = (values, valueIds, partial) =>
|
|
1113
|
+
objNew(
|
|
1114
|
+
partial == true
|
|
1115
|
+
? arrayFilter(
|
|
1116
|
+
objToArray(values, (value, valueId) => [valueId, value]),
|
|
1117
|
+
([valueId]) => arrayHas(valueIds, valueId),
|
|
1118
|
+
)
|
|
1119
|
+
: arrayFilter(
|
|
1120
|
+
arrayMap(valueIds, (valueId) => [valueId, values[valueId]]),
|
|
1121
|
+
([, value]) => !isUndefined(value),
|
|
1122
|
+
),
|
|
1123
|
+
);
|
|
1042
1124
|
const saveValues = async (values, partial) =>
|
|
1043
1125
|
valuesSave
|
|
1044
1126
|
? await saveTable(
|
|
1045
1127
|
valuesTableName,
|
|
1046
1128
|
DEFAULT_ROW_ID_COLUMN_NAME,
|
|
1047
|
-
{
|
|
1129
|
+
{
|
|
1130
|
+
[SINGLE_ROW_ID]: isUndefined(valuesSaveValueIds)
|
|
1131
|
+
? values
|
|
1132
|
+
: getValuesSubset(values, valuesSaveValueIds, partial),
|
|
1133
|
+
},
|
|
1048
1134
|
true,
|
|
1049
1135
|
true,
|
|
1050
1136
|
partial,
|
|
1137
|
+
void 0,
|
|
1138
|
+
valuesSaveValueIds,
|
|
1051
1139
|
)
|
|
1052
1140
|
: null;
|
|
1053
1141
|
const loadTables = async () =>
|
|
@@ -1067,9 +1155,14 @@ const createTabularPersister = (
|
|
|
1067
1155
|
);
|
|
1068
1156
|
const loadValues = async () =>
|
|
1069
1157
|
valuesLoad
|
|
1070
|
-
? (
|
|
1071
|
-
|
|
1072
|
-
|
|
1158
|
+
? (
|
|
1159
|
+
await loadTable(
|
|
1160
|
+
valuesTableName,
|
|
1161
|
+
DEFAULT_ROW_ID_COLUMN_NAME,
|
|
1162
|
+
void 0,
|
|
1163
|
+
valuesLoadValueIds,
|
|
1164
|
+
)
|
|
1165
|
+
)[SINGLE_ROW_ID]
|
|
1073
1166
|
: {};
|
|
1074
1167
|
const getPersisted = () =>
|
|
1075
1168
|
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
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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);
|
|
@@ -674,8 +682,18 @@ const getCommandFunctions = (
|
|
|
674
682
|
({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
|
|
675
683
|
);
|
|
676
684
|
};
|
|
677
|
-
const loadTable = async (
|
|
678
|
-
|
|
685
|
+
const loadTable = async (
|
|
686
|
+
tableName,
|
|
687
|
+
rowIdColumnName,
|
|
688
|
+
condition,
|
|
689
|
+
contentSubIds,
|
|
690
|
+
) => {
|
|
691
|
+
const contentSubIdSet = isUndefined(contentSubIds)
|
|
692
|
+
? void 0
|
|
693
|
+
: setNew(contentSubIds);
|
|
694
|
+
const includeContentSubId = (contentSubId) =>
|
|
695
|
+
isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
|
|
696
|
+
return canSelect(tableName, rowIdColumnName)
|
|
679
697
|
? objNew(
|
|
680
698
|
arrayFilter(
|
|
681
699
|
arrayMap(
|
|
@@ -684,17 +702,35 @@ const getCommandFunctions = (
|
|
|
684
702
|
escapeId(tableName) +
|
|
685
703
|
getWhereCondition(tableName, condition),
|
|
686
704
|
),
|
|
687
|
-
(row) =>
|
|
688
|
-
row[rowIdColumnName]
|
|
689
|
-
decode
|
|
705
|
+
(row) => {
|
|
706
|
+
const rowId = row[rowIdColumnName];
|
|
707
|
+
const rowContent = decode
|
|
690
708
|
? objMap(objDel(row, rowIdColumnName), decode)
|
|
691
|
-
: objDel(row, rowIdColumnName)
|
|
692
|
-
|
|
709
|
+
: objDel(row, rowIdColumnName);
|
|
710
|
+
return [
|
|
711
|
+
rowId,
|
|
712
|
+
isUndefined(contentSubIdSet)
|
|
713
|
+
? rowContent
|
|
714
|
+
: objNew(
|
|
715
|
+
arrayFilter(
|
|
716
|
+
objToArray(
|
|
717
|
+
rowContent,
|
|
718
|
+
(cellOrValue, contentSubId) => [
|
|
719
|
+
contentSubId,
|
|
720
|
+
cellOrValue,
|
|
721
|
+
],
|
|
722
|
+
),
|
|
723
|
+
([contentSubId]) => includeContentSubId(contentSubId),
|
|
724
|
+
),
|
|
725
|
+
),
|
|
726
|
+
];
|
|
727
|
+
},
|
|
693
728
|
),
|
|
694
729
|
(entry) => !isUndefined(entry[0]) && !objIsEmpty(entry[1]),
|
|
695
730
|
),
|
|
696
731
|
)
|
|
697
732
|
: {};
|
|
733
|
+
};
|
|
698
734
|
const saveTable = async (
|
|
699
735
|
tableName,
|
|
700
736
|
rowIdColumnName,
|
|
@@ -703,15 +739,23 @@ const getCommandFunctions = (
|
|
|
703
739
|
deleteEmptyTable,
|
|
704
740
|
partial = false,
|
|
705
741
|
condition = TRUE,
|
|
742
|
+
contentSubIds,
|
|
706
743
|
) => {
|
|
744
|
+
const contentSubIdSet = isUndefined(contentSubIds)
|
|
745
|
+
? void 0
|
|
746
|
+
: setNew(contentSubIds);
|
|
747
|
+
const includeContentSubId = (contentSubId) =>
|
|
748
|
+
isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
|
|
707
749
|
const settingColumnNameSet = setNew();
|
|
708
750
|
objMap(content ?? {}, (contentRow) =>
|
|
709
|
-
arrayMap(
|
|
710
|
-
|
|
751
|
+
arrayMap(
|
|
752
|
+
arrayFilter(objIds(contentRow ?? {}), includeContentSubId),
|
|
753
|
+
(cellOrValueId) => setAdd(settingColumnNameSet, cellOrValueId),
|
|
711
754
|
),
|
|
712
755
|
);
|
|
713
756
|
const settingColumnNames = collValues(settingColumnNameSet);
|
|
714
757
|
if (
|
|
758
|
+
isUndefined(contentSubIdSet) &&
|
|
715
759
|
!partial &&
|
|
716
760
|
deleteEmptyTable &&
|
|
717
761
|
condition == TRUE &&
|
|
@@ -723,7 +767,13 @@ const getCommandFunctions = (
|
|
|
723
767
|
return;
|
|
724
768
|
}
|
|
725
769
|
const currentColumnNames = mapGet(schemaMap, tableName);
|
|
726
|
-
const unaccountedColumnNames = setNew(
|
|
770
|
+
const unaccountedColumnNames = setNew(
|
|
771
|
+
arrayFilter(
|
|
772
|
+
collValues(currentColumnNames),
|
|
773
|
+
(columnName) =>
|
|
774
|
+
columnName == rowIdColumnName || includeContentSubId(columnName),
|
|
775
|
+
),
|
|
776
|
+
);
|
|
727
777
|
if (!arrayIsEmpty(settingColumnNames)) {
|
|
728
778
|
if (!collHas(schemaMap, tableName)) {
|
|
729
779
|
await databaseExecuteCommand(
|
|
@@ -789,11 +839,13 @@ const getCommandFunctions = (
|
|
|
789
839
|
]);
|
|
790
840
|
if (partial) {
|
|
791
841
|
if (isUndefined(content)) {
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
842
|
+
if (isUndefined(contentSubIdSet)) {
|
|
843
|
+
await databaseExecuteCommand(
|
|
844
|
+
DELETE_FROM +
|
|
845
|
+
escapeId(tableName) +
|
|
846
|
+
getWhereCondition(tableName, condition),
|
|
847
|
+
);
|
|
848
|
+
}
|
|
797
849
|
} else {
|
|
798
850
|
await promiseAll(
|
|
799
851
|
objToArray(content, async (row, rowId) => {
|
|
@@ -806,18 +858,24 @@ const getCommandFunctions = (
|
|
|
806
858
|
[rowId],
|
|
807
859
|
);
|
|
808
860
|
} else if (!arrayIsEmpty(settingColumnNames)) {
|
|
809
|
-
|
|
810
|
-
databaseExecuteCommand,
|
|
811
|
-
tableName,
|
|
812
|
-
rowIdColumnName,
|
|
861
|
+
const changingColumnNames = arrayFilter(
|
|
813
862
|
objIds(row),
|
|
814
|
-
|
|
815
|
-
[rowId]: encode
|
|
816
|
-
? arrayMap(objValues(row), encode)
|
|
817
|
-
: objValues(row),
|
|
818
|
-
},
|
|
819
|
-
currentColumnNames,
|
|
863
|
+
includeContentSubId,
|
|
820
864
|
);
|
|
865
|
+
if (!arrayIsEmpty(changingColumnNames)) {
|
|
866
|
+
await upsert(
|
|
867
|
+
databaseExecuteCommand,
|
|
868
|
+
tableName,
|
|
869
|
+
rowIdColumnName,
|
|
870
|
+
changingColumnNames,
|
|
871
|
+
{
|
|
872
|
+
[rowId]: arrayMap(changingColumnNames, (cellId) =>
|
|
873
|
+
encode ? encode(row[cellId]) : row[cellId],
|
|
874
|
+
),
|
|
875
|
+
},
|
|
876
|
+
currentColumnNames,
|
|
877
|
+
);
|
|
878
|
+
}
|
|
821
879
|
}
|
|
822
880
|
}),
|
|
823
881
|
);
|
|
@@ -826,7 +884,9 @@ const getCommandFunctions = (
|
|
|
826
884
|
if (!arrayIsEmpty(settingColumnNames)) {
|
|
827
885
|
const changingColumnNames = arrayFilter(
|
|
828
886
|
collValues(mapGet(schemaMap, tableName)),
|
|
829
|
-
(changingColumnName) =>
|
|
887
|
+
(changingColumnName) =>
|
|
888
|
+
changingColumnName != rowIdColumnName &&
|
|
889
|
+
includeContentSubId(changingColumnName),
|
|
830
890
|
);
|
|
831
891
|
const rows = {};
|
|
832
892
|
const deleteRowIds = [];
|
|
@@ -842,6 +902,7 @@ const getCommandFunctions = (
|
|
|
842
902
|
rowIdColumnName,
|
|
843
903
|
changingColumnNames,
|
|
844
904
|
rows,
|
|
905
|
+
currentColumnNames,
|
|
845
906
|
);
|
|
846
907
|
await databaseExecuteCommand(
|
|
847
908
|
DELETE_FROM +
|
|
@@ -850,7 +911,10 @@ const getCommandFunctions = (
|
|
|
850
911
|
`AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
|
|
851
912
|
deleteRowIds,
|
|
852
913
|
);
|
|
853
|
-
} else if (
|
|
914
|
+
} else if (
|
|
915
|
+
isUndefined(contentSubIdSet) &&
|
|
916
|
+
collHas(schemaMap, tableName)
|
|
917
|
+
) {
|
|
854
918
|
await databaseExecuteCommand(
|
|
855
919
|
DELETE_FROM +
|
|
856
920
|
escapeId(tableName) +
|
|
@@ -989,7 +1053,13 @@ const createTabularPersister = (
|
|
|
989
1053
|
[
|
|
990
1054
|
tablesLoadConfig,
|
|
991
1055
|
tablesSaveConfig,
|
|
992
|
-
[
|
|
1056
|
+
[
|
|
1057
|
+
valuesLoad,
|
|
1058
|
+
valuesSave,
|
|
1059
|
+
valuesTableName,
|
|
1060
|
+
valuesLoadValueIds,
|
|
1061
|
+
valuesSaveValueIds,
|
|
1062
|
+
],
|
|
993
1063
|
],
|
|
994
1064
|
managedTableNames,
|
|
995
1065
|
querySchema,
|
|
@@ -1039,15 +1109,33 @@ const createTabularPersister = (
|
|
|
1039
1109
|
},
|
|
1040
1110
|
),
|
|
1041
1111
|
);
|
|
1112
|
+
const getValuesSubset = (values, valueIds, partial) =>
|
|
1113
|
+
objNew(
|
|
1114
|
+
partial == true
|
|
1115
|
+
? arrayFilter(
|
|
1116
|
+
objToArray(values, (value, valueId) => [valueId, value]),
|
|
1117
|
+
([valueId]) => arrayHas(valueIds, valueId),
|
|
1118
|
+
)
|
|
1119
|
+
: arrayFilter(
|
|
1120
|
+
arrayMap(valueIds, (valueId) => [valueId, values[valueId]]),
|
|
1121
|
+
([, value]) => !isUndefined(value),
|
|
1122
|
+
),
|
|
1123
|
+
);
|
|
1042
1124
|
const saveValues = async (values, partial) =>
|
|
1043
1125
|
valuesSave
|
|
1044
1126
|
? await saveTable(
|
|
1045
1127
|
valuesTableName,
|
|
1046
1128
|
DEFAULT_ROW_ID_COLUMN_NAME,
|
|
1047
|
-
{
|
|
1129
|
+
{
|
|
1130
|
+
[SINGLE_ROW_ID]: isUndefined(valuesSaveValueIds)
|
|
1131
|
+
? values
|
|
1132
|
+
: getValuesSubset(values, valuesSaveValueIds, partial),
|
|
1133
|
+
},
|
|
1048
1134
|
true,
|
|
1049
1135
|
true,
|
|
1050
1136
|
partial,
|
|
1137
|
+
void 0,
|
|
1138
|
+
valuesSaveValueIds,
|
|
1051
1139
|
)
|
|
1052
1140
|
: null;
|
|
1053
1141
|
const loadTables = async () =>
|
|
@@ -1067,9 +1155,14 @@ const createTabularPersister = (
|
|
|
1067
1155
|
);
|
|
1068
1156
|
const loadValues = async () =>
|
|
1069
1157
|
valuesLoad
|
|
1070
|
-
? (
|
|
1071
|
-
|
|
1072
|
-
|
|
1158
|
+
? (
|
|
1159
|
+
await loadTable(
|
|
1160
|
+
valuesTableName,
|
|
1161
|
+
DEFAULT_ROW_ID_COLUMN_NAME,
|
|
1162
|
+
void 0,
|
|
1163
|
+
valuesLoadValueIds,
|
|
1164
|
+
)
|
|
1165
|
+
)[SINGLE_ROW_ID]
|
|
1073
1166
|
: {};
|
|
1074
1167
|
const getPersisted = () =>
|
|
1075
1168
|
transaction(async () => {
|