tinybase 5.0.0-beta.14 → 5.0.0-beta.16
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/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-libsql.cjs +1 -1
- package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-powersync.cjs +1 -1
- package/lib/cjs/persisters/persister-powersync.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs/ui-react.cjs +1 -1
- package/lib/cjs/ui-react.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react.cjs +1 -1
- package/lib/cjs-es6/ui-react.cjs.gz +0 -0
- package/lib/debug/persisters/persister-browser.js +4 -7
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +55 -48
- package/lib/debug/persisters/persister-electric-sql.js +55 -48
- package/lib/debug/persisters/persister-expo-sqlite-next.js +55 -48
- package/lib/debug/persisters/persister-expo-sqlite.js +55 -48
- package/lib/debug/persisters/persister-file.js +3 -7
- package/lib/debug/persisters/persister-libsql.js +55 -48
- package/lib/debug/persisters/persister-powersync.js +55 -48
- package/lib/debug/persisters/persister-sqlite-wasm.js +55 -48
- package/lib/debug/persisters/persister-sqlite3.js +55 -48
- package/lib/debug/synchronizers/synchronizer-ws-client.js +3 -7
- package/lib/debug/ui-react-dom.js +3 -7
- package/lib/debug/ui-react.js +6 -5
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-electric-sql.js +1 -1
- package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/es6/persisters/persister-libsql.js +1 -1
- package/lib/es6/persisters/persister-libsql.js.gz +0 -0
- package/lib/es6/persisters/persister-powersync.js +1 -1
- package/lib/es6/persisters/persister-powersync.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite3.js +1 -1
- package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/es6/ui-react.js +1 -1
- package/lib/es6/ui-react.js.gz +0 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-electric-sql.js +1 -1
- package/lib/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite.js +1 -1
- package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/persisters/persister-libsql.js +1 -1
- package/lib/persisters/persister-libsql.js.gz +0 -0
- package/lib/persisters/persister-powersync.js +1 -1
- package/lib/persisters/persister-powersync.js.gz +0 -0
- package/lib/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-sqlite3.js +1 -1
- package/lib/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/types/persisters/persister-expo-sqlite-next.d.ts +1 -1
- package/lib/types/persisters/persister-expo-sqlite.d.ts +1 -1
- package/lib/types/persisters/persister-sqlite-wasm.d.ts +1 -1
- package/lib/types/persisters/persister-sqlite3.d.ts +1 -1
- package/lib/types/persisters.d.ts +18 -7
- package/lib/types/ui-react.d.ts +26 -25
- package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +1 -1
- package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +1 -1
- package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +1 -1
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +1 -1
- package/lib/types/with-schemas/persisters.d.ts +18 -7
- package/lib/types/with-schemas/ui-react.d.ts +33 -32
- package/lib/ui-react.js +1 -1
- package/lib/ui-react.js.gz +0 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-electric-sql.js +1 -1
- package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd/persisters/persister-libsql.js +1 -1
- package/lib/umd/persisters/persister-libsql.js.gz +0 -0
- package/lib/umd/persisters/persister-powersync.js +1 -1
- package/lib/umd/persisters/persister-powersync.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite3.js +1 -1
- package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd/ui-react.js +1 -1
- package/lib/umd/ui-react.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
- package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-libsql.js +1 -1
- package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-powersync.js +1 -1
- package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd-es6/ui-react.js +1 -1
- package/lib/umd-es6/ui-react.js.gz +0 -0
- package/package.json +26 -26
- package/readme.md +2 -2
|
@@ -5,6 +5,7 @@ const TINYBASE = 'tinybase';
|
|
|
5
5
|
const EMPTY_STRING = '';
|
|
6
6
|
const COMMA = ',';
|
|
7
7
|
const STRING = getTypeOf(EMPTY_STRING);
|
|
8
|
+
const UNDEFINED = '\uFFFC';
|
|
8
9
|
const strRepeat = (str, count) => str.repeat(count);
|
|
9
10
|
|
|
10
11
|
const promise = Promise;
|
|
@@ -13,7 +14,6 @@ const startInterval = (callback, sec, immediate) => {
|
|
|
13
14
|
return setInterval(callback, sec * 1e3);
|
|
14
15
|
};
|
|
15
16
|
const stopInterval = clearInterval;
|
|
16
|
-
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
17
17
|
const isUndefined = (thing) => thing == void 0;
|
|
18
18
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
19
19
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
@@ -23,11 +23,6 @@ const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
|
23
23
|
const size = (arrayOrString) => arrayOrString.length;
|
|
24
24
|
const promiseAll = async (promises) => promise.all(promises);
|
|
25
25
|
|
|
26
|
-
const SINGLE_ROW_ID = '_';
|
|
27
|
-
const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
|
|
28
|
-
const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
|
|
29
|
-
const SELECT = 'SELECT';
|
|
30
|
-
|
|
31
26
|
const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
|
|
32
27
|
const arrayMap = (array, cb) => array.map(cb);
|
|
33
28
|
const arrayIsEmpty = (array) => size(array) == 0;
|
|
@@ -89,6 +84,11 @@ const mapMatch = (map, obj, set, del = mapSet) => {
|
|
|
89
84
|
return map;
|
|
90
85
|
};
|
|
91
86
|
|
|
87
|
+
const SINGLE_ROW_ID = '_';
|
|
88
|
+
const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
|
|
89
|
+
const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
|
|
90
|
+
const SELECT = 'SELECT';
|
|
91
|
+
|
|
92
92
|
const setNew = (entryOrEntries) =>
|
|
93
93
|
new Set(
|
|
94
94
|
isArray(entryOrEntries) || isUndefined(entryOrEntries)
|
|
@@ -380,11 +380,10 @@ const getPlaceholders = (array) =>
|
|
|
380
380
|
COMMA,
|
|
381
381
|
);
|
|
382
382
|
|
|
383
|
-
const
|
|
384
|
-
JSON.stringify(obj, (_key, value) =>
|
|
385
|
-
|
|
386
|
-
);
|
|
387
|
-
const jsonParse = JSON.parse;
|
|
383
|
+
const jsonStringWithUndefined = (obj) =>
|
|
384
|
+
JSON.stringify(obj, (_key, value) => (value === void 0 ? UNDEFINED : value));
|
|
385
|
+
const jsonParseWithUndefined = (str) =>
|
|
386
|
+
JSON.parse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
|
|
388
387
|
|
|
389
388
|
const scheduleRunning = mapNew();
|
|
390
389
|
const scheduleActions = mapNew();
|
|
@@ -570,14 +569,14 @@ const createCustomPersister = (
|
|
|
570
569
|
return objFreeze(persister);
|
|
571
570
|
};
|
|
572
571
|
|
|
573
|
-
const STORE_COLUMN = 'store';
|
|
574
572
|
const createJsonSqlitePersister = (
|
|
575
573
|
store,
|
|
576
574
|
cmd,
|
|
577
575
|
addPersisterListener,
|
|
578
576
|
delPersisterListener,
|
|
579
577
|
onIgnoredError,
|
|
580
|
-
|
|
578
|
+
supportedStoreType,
|
|
579
|
+
[storeTableName, storeIdColumnName, storeColumnName],
|
|
581
580
|
managedTableNames,
|
|
582
581
|
db,
|
|
583
582
|
getThing,
|
|
@@ -588,10 +587,10 @@ const createJsonSqlitePersister = (
|
|
|
588
587
|
const getPersisted = async () =>
|
|
589
588
|
await transaction(async () => {
|
|
590
589
|
await refreshSchema();
|
|
591
|
-
return
|
|
592
|
-
(await loadTable(storeTableName,
|
|
593
|
-
|
|
594
|
-
]
|
|
590
|
+
return jsonParseWithUndefined(
|
|
591
|
+
(await loadTable(storeTableName, storeIdColumnName))[SINGLE_ROW_ID]?.[
|
|
592
|
+
storeColumnName
|
|
593
|
+
] ?? 'null',
|
|
595
594
|
);
|
|
596
595
|
});
|
|
597
596
|
const setPersisted = async (getContent) =>
|
|
@@ -599,10 +598,10 @@ const createJsonSqlitePersister = (
|
|
|
599
598
|
await refreshSchema();
|
|
600
599
|
await saveTable(
|
|
601
600
|
storeTableName,
|
|
602
|
-
|
|
601
|
+
storeIdColumnName,
|
|
603
602
|
{
|
|
604
603
|
[SINGLE_ROW_ID]: {
|
|
605
|
-
[
|
|
604
|
+
[storeColumnName]: jsonStringWithUndefined(getContent() ?? null),
|
|
606
605
|
},
|
|
607
606
|
},
|
|
608
607
|
true,
|
|
@@ -616,7 +615,7 @@ const createJsonSqlitePersister = (
|
|
|
616
615
|
addPersisterListener,
|
|
617
616
|
delPersisterListener,
|
|
618
617
|
onIgnoredError,
|
|
619
|
-
|
|
618
|
+
supportedStoreType,
|
|
620
619
|
{[getThing]: () => db},
|
|
621
620
|
db,
|
|
622
621
|
);
|
|
@@ -629,6 +628,7 @@ const createTabularSqlitePersister = (
|
|
|
629
628
|
addPersisterListener,
|
|
630
629
|
delPersisterListener,
|
|
631
630
|
onIgnoredError,
|
|
631
|
+
supportedStoreType,
|
|
632
632
|
[
|
|
633
633
|
tablesLoadConfig,
|
|
634
634
|
tablesSaveConfig,
|
|
@@ -722,17 +722,21 @@ const createTabularSqlitePersister = (
|
|
|
722
722
|
addPersisterListener,
|
|
723
723
|
delPersisterListener,
|
|
724
724
|
onIgnoredError,
|
|
725
|
-
|
|
725
|
+
supportedStoreType,
|
|
726
726
|
{[getThing]: () => db},
|
|
727
727
|
db,
|
|
728
728
|
);
|
|
729
729
|
return persister;
|
|
730
730
|
};
|
|
731
731
|
|
|
732
|
+
const COLUMN_NAME = 'ColumnName';
|
|
733
|
+
const STORE = 'store';
|
|
732
734
|
const JSON$1 = 'json';
|
|
735
|
+
const STORE_TABLE_NAME = STORE + 'TableName';
|
|
736
|
+
const STORE_ID_COLUMN_NAME = STORE + 'Id' + COLUMN_NAME;
|
|
737
|
+
const STORE_COLUMN_NAME = STORE + COLUMN_NAME;
|
|
733
738
|
const AUTO_LOAD_INTERVAL_SECONDS = 'autoLoadIntervalSeconds';
|
|
734
|
-
const
|
|
735
|
-
const ROW_ID_COLUMN_NAME = 'rowIdColumnName';
|
|
739
|
+
const ROW_ID_COLUMN_NAME = 'rowId' + COLUMN_NAME;
|
|
736
740
|
const TABLE_ID = 'tableId';
|
|
737
741
|
const TABLE_NAME = 'tableName';
|
|
738
742
|
const DELETE_EMPTY_COLUMNS = 'deleteEmptyColumns';
|
|
@@ -757,7 +761,8 @@ const getDefaultedTabularConfigMap = (
|
|
|
757
761
|
configsObj,
|
|
758
762
|
defaultObj,
|
|
759
763
|
tableField,
|
|
760
|
-
|
|
764
|
+
exclude,
|
|
765
|
+
then,
|
|
761
766
|
) => {
|
|
762
767
|
const configMap = mapNew();
|
|
763
768
|
objToArray(configsObj, (configObj, id) => {
|
|
@@ -771,7 +776,8 @@ const getDefaultedTabularConfigMap = (
|
|
|
771
776
|
0,
|
|
772
777
|
objSize(defaultObj),
|
|
773
778
|
);
|
|
774
|
-
if (!isUndefined(defaultedConfig[0]) && !
|
|
779
|
+
if (!isUndefined(defaultedConfig[0]) && !exclude(id, defaultedConfig[0])) {
|
|
780
|
+
then(id, defaultedConfig[0]);
|
|
775
781
|
mapSet(configMap, id, defaultedConfig);
|
|
776
782
|
}
|
|
777
783
|
});
|
|
@@ -781,11 +787,15 @@ const getConfigStructures = (configOrStoreTableName) => {
|
|
|
781
787
|
const config = getDefaultedConfig(configOrStoreTableName);
|
|
782
788
|
const autoLoadIntervalSeconds = config[AUTO_LOAD_INTERVAL_SECONDS];
|
|
783
789
|
if (config.mode == JSON$1) {
|
|
784
|
-
const
|
|
790
|
+
const storeTableName = config[STORE_TABLE_NAME] ?? TINYBASE;
|
|
785
791
|
return [
|
|
786
792
|
1,
|
|
787
793
|
autoLoadIntervalSeconds,
|
|
788
|
-
[
|
|
794
|
+
[
|
|
795
|
+
storeTableName,
|
|
796
|
+
config[STORE_ID_COLUMN_NAME] ?? DEFAULT_ROW_ID_COLUMN_NAME,
|
|
797
|
+
config[STORE_COLUMN_NAME] ?? STORE,
|
|
798
|
+
],
|
|
789
799
|
setNew(storeTableName),
|
|
790
800
|
];
|
|
791
801
|
}
|
|
@@ -797,13 +807,14 @@ const getConfigStructures = (configOrStoreTableName) => {
|
|
|
797
807
|
);
|
|
798
808
|
const valuesTable = valuesConfig[2];
|
|
799
809
|
const managedTableNames = setNew(valuesTable);
|
|
810
|
+
const excludedTableNames = setNew(valuesTable);
|
|
800
811
|
const tabularConfig = [
|
|
801
812
|
getDefaultedTabularConfigMap(
|
|
802
813
|
load,
|
|
803
814
|
{[TABLE_ID]: null, [ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME},
|
|
804
815
|
TABLE_ID,
|
|
805
|
-
(tableName) =>
|
|
806
|
-
|
|
816
|
+
(tableName) => collHas(excludedTableNames, tableName),
|
|
817
|
+
(tableName) => setAdd(managedTableNames, tableName),
|
|
807
818
|
),
|
|
808
819
|
getDefaultedTabularConfigMap(
|
|
809
820
|
save,
|
|
@@ -814,15 +825,15 @@ const getConfigStructures = (configOrStoreTableName) => {
|
|
|
814
825
|
[DELETE_EMPTY_TABLE]: 0,
|
|
815
826
|
},
|
|
816
827
|
TABLE_NAME,
|
|
817
|
-
(_, tableName) =>
|
|
818
|
-
|
|
828
|
+
(_, tableName) => collHas(excludedTableNames, tableName),
|
|
829
|
+
(_, tableName) => setAdd(managedTableNames, tableName),
|
|
819
830
|
),
|
|
820
831
|
valuesConfig,
|
|
821
832
|
];
|
|
822
833
|
return [0, autoLoadIntervalSeconds, tabularConfig, managedTableNames];
|
|
823
834
|
};
|
|
824
835
|
|
|
825
|
-
const PRAGMA = '
|
|
836
|
+
const PRAGMA = 'pragma_';
|
|
826
837
|
const DATA_VERSION = 'data_version';
|
|
827
838
|
const SCHEMA_VERSION = 'schema_version';
|
|
828
839
|
const createSqlitePersister = (
|
|
@@ -833,6 +844,7 @@ const createSqlitePersister = (
|
|
|
833
844
|
delUpdateListener,
|
|
834
845
|
onSqlCommand,
|
|
835
846
|
onIgnoredError,
|
|
847
|
+
supportedStoreType,
|
|
836
848
|
db,
|
|
837
849
|
getThing = 'getDb',
|
|
838
850
|
useOnConflict,
|
|
@@ -840,7 +852,6 @@ const createSqlitePersister = (
|
|
|
840
852
|
let dataVersion;
|
|
841
853
|
let schemaVersion;
|
|
842
854
|
let totalChanges;
|
|
843
|
-
const CHANGES_COLUMN = 'c';
|
|
844
855
|
const [
|
|
845
856
|
isJson,
|
|
846
857
|
autoLoadIntervalSeconds,
|
|
@@ -850,23 +861,17 @@ const createSqlitePersister = (
|
|
|
850
861
|
const addPersisterListener = (listener) => [
|
|
851
862
|
startInterval(async () => {
|
|
852
863
|
try {
|
|
853
|
-
const
|
|
854
|
-
DATA_VERSION
|
|
855
|
-
|
|
856
|
-
const newSchemaVersion = (await cmd(PRAGMA + SCHEMA_VERSION))[0][
|
|
857
|
-
SCHEMA_VERSION
|
|
858
|
-
];
|
|
859
|
-
const newTotalChanges = (
|
|
860
|
-
await cmd(SELECT + ' TOTAL_CHANGES() ' + CHANGES_COLUMN)
|
|
861
|
-
)[0][CHANGES_COLUMN];
|
|
864
|
+
const [{d, s, c}] = await cmd(
|
|
865
|
+
`SELECT ${DATA_VERSION} d,${SCHEMA_VERSION} s,TOTAL_CHANGES() c FROM ${PRAGMA}${DATA_VERSION} JOIN ${PRAGMA}${SCHEMA_VERSION}`,
|
|
866
|
+
);
|
|
862
867
|
if (
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
868
|
+
d != (dataVersion ??= d) ||
|
|
869
|
+
s != (schemaVersion ??= s) ||
|
|
870
|
+
c != (totalChanges ??= c)
|
|
866
871
|
) {
|
|
867
872
|
listener();
|
|
868
|
-
dataVersion =
|
|
869
|
-
schemaVersion =
|
|
873
|
+
dataVersion = d;
|
|
874
|
+
schemaVersion = s;
|
|
870
875
|
}
|
|
871
876
|
} catch {}
|
|
872
877
|
}, autoLoadIntervalSeconds),
|
|
@@ -876,7 +881,7 @@ const createSqlitePersister = (
|
|
|
876
881
|
];
|
|
877
882
|
const delPersisterListener = ([interval, listeningHandle]) => {
|
|
878
883
|
stopInterval(interval);
|
|
879
|
-
dataVersion = schemaVersion = null;
|
|
884
|
+
dataVersion = schemaVersion = totalChanges = null;
|
|
880
885
|
delUpdateListener(listeningHandle);
|
|
881
886
|
};
|
|
882
887
|
return (isJson ? createJsonSqlitePersister : createTabularSqlitePersister)(
|
|
@@ -890,6 +895,7 @@ const createSqlitePersister = (
|
|
|
890
895
|
addPersisterListener,
|
|
891
896
|
delPersisterListener,
|
|
892
897
|
onIgnoredError,
|
|
898
|
+
supportedStoreType,
|
|
893
899
|
defaultedConfig,
|
|
894
900
|
collValues(managedTableNamesSet),
|
|
895
901
|
db,
|
|
@@ -914,6 +920,7 @@ const createExpoSqliteNextPersister = (
|
|
|
914
920
|
(subscription) => subscription.remove(),
|
|
915
921
|
onSqlCommand,
|
|
916
922
|
onIgnoredError,
|
|
923
|
+
3,
|
|
917
924
|
db,
|
|
918
925
|
);
|
|
919
926
|
|
|
@@ -3,6 +3,7 @@ const TINYBASE = 'tinybase';
|
|
|
3
3
|
const EMPTY_STRING = '';
|
|
4
4
|
const COMMA = ',';
|
|
5
5
|
const STRING = getTypeOf(EMPTY_STRING);
|
|
6
|
+
const UNDEFINED = '\uFFFC';
|
|
6
7
|
const strRepeat = (str, count) => str.repeat(count);
|
|
7
8
|
|
|
8
9
|
const promise = Promise;
|
|
@@ -11,7 +12,6 @@ const startInterval = (callback, sec, immediate) => {
|
|
|
11
12
|
return setInterval(callback, sec * 1e3);
|
|
12
13
|
};
|
|
13
14
|
const stopInterval = clearInterval;
|
|
14
|
-
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
15
15
|
const isUndefined = (thing) => thing == void 0;
|
|
16
16
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
17
17
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
@@ -21,11 +21,6 @@ const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
|
21
21
|
const size = (arrayOrString) => arrayOrString.length;
|
|
22
22
|
const promiseAll = async (promises) => promise.all(promises);
|
|
23
23
|
|
|
24
|
-
const SINGLE_ROW_ID = '_';
|
|
25
|
-
const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
|
|
26
|
-
const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
|
|
27
|
-
const SELECT = 'SELECT';
|
|
28
|
-
|
|
29
24
|
const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
|
|
30
25
|
const arrayMap = (array, cb) => array.map(cb);
|
|
31
26
|
const arrayIsEmpty = (array) => size(array) == 0;
|
|
@@ -87,6 +82,11 @@ const mapMatch = (map, obj, set, del = mapSet) => {
|
|
|
87
82
|
return map;
|
|
88
83
|
};
|
|
89
84
|
|
|
85
|
+
const SINGLE_ROW_ID = '_';
|
|
86
|
+
const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
|
|
87
|
+
const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
|
|
88
|
+
const SELECT = 'SELECT';
|
|
89
|
+
|
|
90
90
|
const setNew = (entryOrEntries) =>
|
|
91
91
|
new Set(
|
|
92
92
|
isArray(entryOrEntries) || isUndefined(entryOrEntries)
|
|
@@ -378,11 +378,10 @@ const getPlaceholders = (array) =>
|
|
|
378
378
|
COMMA,
|
|
379
379
|
);
|
|
380
380
|
|
|
381
|
-
const
|
|
382
|
-
JSON.stringify(obj, (_key, value) =>
|
|
383
|
-
|
|
384
|
-
);
|
|
385
|
-
const jsonParse = JSON.parse;
|
|
381
|
+
const jsonStringWithUndefined = (obj) =>
|
|
382
|
+
JSON.stringify(obj, (_key, value) => (value === void 0 ? UNDEFINED : value));
|
|
383
|
+
const jsonParseWithUndefined = (str) =>
|
|
384
|
+
JSON.parse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
|
|
386
385
|
|
|
387
386
|
const scheduleRunning = mapNew();
|
|
388
387
|
const scheduleActions = mapNew();
|
|
@@ -568,14 +567,14 @@ const createCustomPersister = (
|
|
|
568
567
|
return objFreeze(persister);
|
|
569
568
|
};
|
|
570
569
|
|
|
571
|
-
const STORE_COLUMN = 'store';
|
|
572
570
|
const createJsonSqlitePersister = (
|
|
573
571
|
store,
|
|
574
572
|
cmd,
|
|
575
573
|
addPersisterListener,
|
|
576
574
|
delPersisterListener,
|
|
577
575
|
onIgnoredError,
|
|
578
|
-
|
|
576
|
+
supportedStoreType,
|
|
577
|
+
[storeTableName, storeIdColumnName, storeColumnName],
|
|
579
578
|
managedTableNames,
|
|
580
579
|
db,
|
|
581
580
|
getThing,
|
|
@@ -586,10 +585,10 @@ const createJsonSqlitePersister = (
|
|
|
586
585
|
const getPersisted = async () =>
|
|
587
586
|
await transaction(async () => {
|
|
588
587
|
await refreshSchema();
|
|
589
|
-
return
|
|
590
|
-
(await loadTable(storeTableName,
|
|
591
|
-
|
|
592
|
-
]
|
|
588
|
+
return jsonParseWithUndefined(
|
|
589
|
+
(await loadTable(storeTableName, storeIdColumnName))[SINGLE_ROW_ID]?.[
|
|
590
|
+
storeColumnName
|
|
591
|
+
] ?? 'null',
|
|
593
592
|
);
|
|
594
593
|
});
|
|
595
594
|
const setPersisted = async (getContent) =>
|
|
@@ -597,10 +596,10 @@ const createJsonSqlitePersister = (
|
|
|
597
596
|
await refreshSchema();
|
|
598
597
|
await saveTable(
|
|
599
598
|
storeTableName,
|
|
600
|
-
|
|
599
|
+
storeIdColumnName,
|
|
601
600
|
{
|
|
602
601
|
[SINGLE_ROW_ID]: {
|
|
603
|
-
[
|
|
602
|
+
[storeColumnName]: jsonStringWithUndefined(getContent() ?? null),
|
|
604
603
|
},
|
|
605
604
|
},
|
|
606
605
|
true,
|
|
@@ -614,7 +613,7 @@ const createJsonSqlitePersister = (
|
|
|
614
613
|
addPersisterListener,
|
|
615
614
|
delPersisterListener,
|
|
616
615
|
onIgnoredError,
|
|
617
|
-
|
|
616
|
+
supportedStoreType,
|
|
618
617
|
{[getThing]: () => db},
|
|
619
618
|
db,
|
|
620
619
|
);
|
|
@@ -627,6 +626,7 @@ const createTabularSqlitePersister = (
|
|
|
627
626
|
addPersisterListener,
|
|
628
627
|
delPersisterListener,
|
|
629
628
|
onIgnoredError,
|
|
629
|
+
supportedStoreType,
|
|
630
630
|
[
|
|
631
631
|
tablesLoadConfig,
|
|
632
632
|
tablesSaveConfig,
|
|
@@ -720,17 +720,21 @@ const createTabularSqlitePersister = (
|
|
|
720
720
|
addPersisterListener,
|
|
721
721
|
delPersisterListener,
|
|
722
722
|
onIgnoredError,
|
|
723
|
-
|
|
723
|
+
supportedStoreType,
|
|
724
724
|
{[getThing]: () => db},
|
|
725
725
|
db,
|
|
726
726
|
);
|
|
727
727
|
return persister;
|
|
728
728
|
};
|
|
729
729
|
|
|
730
|
+
const COLUMN_NAME = 'ColumnName';
|
|
731
|
+
const STORE = 'store';
|
|
730
732
|
const JSON$1 = 'json';
|
|
733
|
+
const STORE_TABLE_NAME = STORE + 'TableName';
|
|
734
|
+
const STORE_ID_COLUMN_NAME = STORE + 'Id' + COLUMN_NAME;
|
|
735
|
+
const STORE_COLUMN_NAME = STORE + COLUMN_NAME;
|
|
731
736
|
const AUTO_LOAD_INTERVAL_SECONDS = 'autoLoadIntervalSeconds';
|
|
732
|
-
const
|
|
733
|
-
const ROW_ID_COLUMN_NAME = 'rowIdColumnName';
|
|
737
|
+
const ROW_ID_COLUMN_NAME = 'rowId' + COLUMN_NAME;
|
|
734
738
|
const TABLE_ID = 'tableId';
|
|
735
739
|
const TABLE_NAME = 'tableName';
|
|
736
740
|
const DELETE_EMPTY_COLUMNS = 'deleteEmptyColumns';
|
|
@@ -755,7 +759,8 @@ const getDefaultedTabularConfigMap = (
|
|
|
755
759
|
configsObj,
|
|
756
760
|
defaultObj,
|
|
757
761
|
tableField,
|
|
758
|
-
|
|
762
|
+
exclude,
|
|
763
|
+
then,
|
|
759
764
|
) => {
|
|
760
765
|
const configMap = mapNew();
|
|
761
766
|
objToArray(configsObj, (configObj, id) => {
|
|
@@ -769,7 +774,8 @@ const getDefaultedTabularConfigMap = (
|
|
|
769
774
|
0,
|
|
770
775
|
objSize(defaultObj),
|
|
771
776
|
);
|
|
772
|
-
if (!isUndefined(defaultedConfig[0]) && !
|
|
777
|
+
if (!isUndefined(defaultedConfig[0]) && !exclude(id, defaultedConfig[0])) {
|
|
778
|
+
then(id, defaultedConfig[0]);
|
|
773
779
|
mapSet(configMap, id, defaultedConfig);
|
|
774
780
|
}
|
|
775
781
|
});
|
|
@@ -779,11 +785,15 @@ const getConfigStructures = (configOrStoreTableName) => {
|
|
|
779
785
|
const config = getDefaultedConfig(configOrStoreTableName);
|
|
780
786
|
const autoLoadIntervalSeconds = config[AUTO_LOAD_INTERVAL_SECONDS];
|
|
781
787
|
if (config.mode == JSON$1) {
|
|
782
|
-
const
|
|
788
|
+
const storeTableName = config[STORE_TABLE_NAME] ?? TINYBASE;
|
|
783
789
|
return [
|
|
784
790
|
1,
|
|
785
791
|
autoLoadIntervalSeconds,
|
|
786
|
-
[
|
|
792
|
+
[
|
|
793
|
+
storeTableName,
|
|
794
|
+
config[STORE_ID_COLUMN_NAME] ?? DEFAULT_ROW_ID_COLUMN_NAME,
|
|
795
|
+
config[STORE_COLUMN_NAME] ?? STORE,
|
|
796
|
+
],
|
|
787
797
|
setNew(storeTableName),
|
|
788
798
|
];
|
|
789
799
|
}
|
|
@@ -795,13 +805,14 @@ const getConfigStructures = (configOrStoreTableName) => {
|
|
|
795
805
|
);
|
|
796
806
|
const valuesTable = valuesConfig[2];
|
|
797
807
|
const managedTableNames = setNew(valuesTable);
|
|
808
|
+
const excludedTableNames = setNew(valuesTable);
|
|
798
809
|
const tabularConfig = [
|
|
799
810
|
getDefaultedTabularConfigMap(
|
|
800
811
|
load,
|
|
801
812
|
{[TABLE_ID]: null, [ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME},
|
|
802
813
|
TABLE_ID,
|
|
803
|
-
(tableName) =>
|
|
804
|
-
|
|
814
|
+
(tableName) => collHas(excludedTableNames, tableName),
|
|
815
|
+
(tableName) => setAdd(managedTableNames, tableName),
|
|
805
816
|
),
|
|
806
817
|
getDefaultedTabularConfigMap(
|
|
807
818
|
save,
|
|
@@ -812,15 +823,15 @@ const getConfigStructures = (configOrStoreTableName) => {
|
|
|
812
823
|
[DELETE_EMPTY_TABLE]: 0,
|
|
813
824
|
},
|
|
814
825
|
TABLE_NAME,
|
|
815
|
-
(_, tableName) =>
|
|
816
|
-
|
|
826
|
+
(_, tableName) => collHas(excludedTableNames, tableName),
|
|
827
|
+
(_, tableName) => setAdd(managedTableNames, tableName),
|
|
817
828
|
),
|
|
818
829
|
valuesConfig,
|
|
819
830
|
];
|
|
820
831
|
return [0, autoLoadIntervalSeconds, tabularConfig, managedTableNames];
|
|
821
832
|
};
|
|
822
833
|
|
|
823
|
-
const PRAGMA = '
|
|
834
|
+
const PRAGMA = 'pragma_';
|
|
824
835
|
const DATA_VERSION = 'data_version';
|
|
825
836
|
const SCHEMA_VERSION = 'schema_version';
|
|
826
837
|
const createSqlitePersister = (
|
|
@@ -831,6 +842,7 @@ const createSqlitePersister = (
|
|
|
831
842
|
delUpdateListener,
|
|
832
843
|
onSqlCommand,
|
|
833
844
|
onIgnoredError,
|
|
845
|
+
supportedStoreType,
|
|
834
846
|
db,
|
|
835
847
|
getThing = 'getDb',
|
|
836
848
|
useOnConflict,
|
|
@@ -838,7 +850,6 @@ const createSqlitePersister = (
|
|
|
838
850
|
let dataVersion;
|
|
839
851
|
let schemaVersion;
|
|
840
852
|
let totalChanges;
|
|
841
|
-
const CHANGES_COLUMN = 'c';
|
|
842
853
|
const [
|
|
843
854
|
isJson,
|
|
844
855
|
autoLoadIntervalSeconds,
|
|
@@ -848,23 +859,17 @@ const createSqlitePersister = (
|
|
|
848
859
|
const addPersisterListener = (listener) => [
|
|
849
860
|
startInterval(async () => {
|
|
850
861
|
try {
|
|
851
|
-
const
|
|
852
|
-
DATA_VERSION
|
|
853
|
-
|
|
854
|
-
const newSchemaVersion = (await cmd(PRAGMA + SCHEMA_VERSION))[0][
|
|
855
|
-
SCHEMA_VERSION
|
|
856
|
-
];
|
|
857
|
-
const newTotalChanges = (
|
|
858
|
-
await cmd(SELECT + ' TOTAL_CHANGES() ' + CHANGES_COLUMN)
|
|
859
|
-
)[0][CHANGES_COLUMN];
|
|
862
|
+
const [{d, s, c}] = await cmd(
|
|
863
|
+
`SELECT ${DATA_VERSION} d,${SCHEMA_VERSION} s,TOTAL_CHANGES() c FROM ${PRAGMA}${DATA_VERSION} JOIN ${PRAGMA}${SCHEMA_VERSION}`,
|
|
864
|
+
);
|
|
860
865
|
if (
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
866
|
+
d != (dataVersion ??= d) ||
|
|
867
|
+
s != (schemaVersion ??= s) ||
|
|
868
|
+
c != (totalChanges ??= c)
|
|
864
869
|
) {
|
|
865
870
|
listener();
|
|
866
|
-
dataVersion =
|
|
867
|
-
schemaVersion =
|
|
871
|
+
dataVersion = d;
|
|
872
|
+
schemaVersion = s;
|
|
868
873
|
}
|
|
869
874
|
} catch {}
|
|
870
875
|
}, autoLoadIntervalSeconds),
|
|
@@ -874,7 +879,7 @@ const createSqlitePersister = (
|
|
|
874
879
|
];
|
|
875
880
|
const delPersisterListener = ([interval, listeningHandle]) => {
|
|
876
881
|
stopInterval(interval);
|
|
877
|
-
dataVersion = schemaVersion = null;
|
|
882
|
+
dataVersion = schemaVersion = totalChanges = null;
|
|
878
883
|
delUpdateListener(listeningHandle);
|
|
879
884
|
};
|
|
880
885
|
return (isJson ? createJsonSqlitePersister : createTabularSqlitePersister)(
|
|
@@ -888,6 +893,7 @@ const createSqlitePersister = (
|
|
|
888
893
|
addPersisterListener,
|
|
889
894
|
delPersisterListener,
|
|
890
895
|
onIgnoredError,
|
|
896
|
+
supportedStoreType,
|
|
891
897
|
defaultedConfig,
|
|
892
898
|
collValues(managedTableNamesSet),
|
|
893
899
|
db,
|
|
@@ -912,6 +918,7 @@ const createExpoSqlitePersister = (
|
|
|
912
918
|
(subscription) => subscription.remove(),
|
|
913
919
|
onSqlCommand,
|
|
914
920
|
onIgnoredError,
|
|
921
|
+
3,
|
|
915
922
|
db,
|
|
916
923
|
);
|
|
917
924
|
|
|
@@ -2,6 +2,7 @@ import {watch} from 'fs';
|
|
|
2
2
|
import {readFile, writeFile} from 'fs/promises';
|
|
3
3
|
|
|
4
4
|
const UTF8 = 'utf8';
|
|
5
|
+
const UNDEFINED = '\uFFFC';
|
|
5
6
|
|
|
6
7
|
const isUndefined = (thing) => thing == void 0;
|
|
7
8
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
@@ -29,15 +30,10 @@ const objFreeze = object.freeze;
|
|
|
29
30
|
const objSize = (obj) => size(objIds(obj));
|
|
30
31
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
31
32
|
|
|
32
|
-
const UNDEFINED_MARKER = '\uFFFC';
|
|
33
33
|
const jsonStringWithUndefined = (obj) =>
|
|
34
|
-
JSON.stringify(obj, (_key, value) =>
|
|
35
|
-
value === void 0 ? UNDEFINED_MARKER : value,
|
|
36
|
-
);
|
|
34
|
+
JSON.stringify(obj, (_key, value) => (value === void 0 ? UNDEFINED : value));
|
|
37
35
|
const jsonParseWithUndefined = (str) =>
|
|
38
|
-
JSON.parse(str, (_key, value) =>
|
|
39
|
-
value === UNDEFINED_MARKER ? void 0 : value,
|
|
40
|
-
);
|
|
36
|
+
JSON.parse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
|
|
41
37
|
|
|
42
38
|
const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
|
|
43
39
|
const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
|