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.
Files changed (135) hide show
  1. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  2. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  3. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  4. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  5. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  6. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  7. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  8. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-libsql.cjs +1 -1
  10. package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-powersync.cjs +1 -1
  12. package/lib/cjs/persisters/persister-powersync.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  14. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  16. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  17. package/lib/cjs/ui-react.cjs +1 -1
  18. package/lib/cjs/ui-react.cjs.gz +0 -0
  19. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  20. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  21. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  22. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  23. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  24. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  25. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  26. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  27. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -1
  28. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  29. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -1
  30. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  31. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  32. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  33. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  34. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  35. package/lib/cjs-es6/ui-react.cjs +1 -1
  36. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  37. package/lib/debug/persisters/persister-browser.js +4 -7
  38. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +55 -48
  39. package/lib/debug/persisters/persister-electric-sql.js +55 -48
  40. package/lib/debug/persisters/persister-expo-sqlite-next.js +55 -48
  41. package/lib/debug/persisters/persister-expo-sqlite.js +55 -48
  42. package/lib/debug/persisters/persister-file.js +3 -7
  43. package/lib/debug/persisters/persister-libsql.js +55 -48
  44. package/lib/debug/persisters/persister-powersync.js +55 -48
  45. package/lib/debug/persisters/persister-sqlite-wasm.js +55 -48
  46. package/lib/debug/persisters/persister-sqlite3.js +55 -48
  47. package/lib/debug/synchronizers/synchronizer-ws-client.js +3 -7
  48. package/lib/debug/ui-react-dom.js +3 -7
  49. package/lib/debug/ui-react.js +6 -5
  50. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  51. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  52. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  53. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  54. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  55. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  56. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  57. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  58. package/lib/es6/persisters/persister-libsql.js +1 -1
  59. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  60. package/lib/es6/persisters/persister-powersync.js +1 -1
  61. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  62. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  63. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  64. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  65. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  66. package/lib/es6/ui-react.js +1 -1
  67. package/lib/es6/ui-react.js.gz +0 -0
  68. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  69. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  70. package/lib/persisters/persister-electric-sql.js +1 -1
  71. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  72. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  73. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  74. package/lib/persisters/persister-expo-sqlite.js +1 -1
  75. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  76. package/lib/persisters/persister-libsql.js +1 -1
  77. package/lib/persisters/persister-libsql.js.gz +0 -0
  78. package/lib/persisters/persister-powersync.js +1 -1
  79. package/lib/persisters/persister-powersync.js.gz +0 -0
  80. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  81. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  82. package/lib/persisters/persister-sqlite3.js +1 -1
  83. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  84. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +1 -1
  85. package/lib/types/persisters/persister-expo-sqlite.d.ts +1 -1
  86. package/lib/types/persisters/persister-sqlite-wasm.d.ts +1 -1
  87. package/lib/types/persisters/persister-sqlite3.d.ts +1 -1
  88. package/lib/types/persisters.d.ts +18 -7
  89. package/lib/types/ui-react.d.ts +26 -25
  90. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +1 -1
  91. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +1 -1
  92. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +1 -1
  93. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +1 -1
  94. package/lib/types/with-schemas/persisters.d.ts +18 -7
  95. package/lib/types/with-schemas/ui-react.d.ts +33 -32
  96. package/lib/ui-react.js +1 -1
  97. package/lib/ui-react.js.gz +0 -0
  98. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  99. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  100. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  101. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  102. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  103. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  104. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  105. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  106. package/lib/umd/persisters/persister-libsql.js +1 -1
  107. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  108. package/lib/umd/persisters/persister-powersync.js +1 -1
  109. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  110. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  111. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  112. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  113. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  114. package/lib/umd/ui-react.js +1 -1
  115. package/lib/umd/ui-react.js.gz +0 -0
  116. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  117. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  118. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  119. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  120. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  121. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  122. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  123. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  124. package/lib/umd-es6/persisters/persister-libsql.js +1 -1
  125. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  126. package/lib/umd-es6/persisters/persister-powersync.js +1 -1
  127. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  128. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  129. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  130. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  131. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  132. package/lib/umd-es6/ui-react.js +1 -1
  133. package/lib/umd-es6/ui-react.js.gz +0 -0
  134. package/package.json +26 -26
  135. 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 jsonStringWithMap = (obj) =>
384
- JSON.stringify(obj, (_key, value) =>
385
- isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
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
- [storeTableName],
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 jsonParse(
592
- (await loadTable(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
593
- SINGLE_ROW_ID
594
- ]?.[STORE_COLUMN] ?? 'null',
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
- DEFAULT_ROW_ID_COLUMN_NAME,
601
+ storeIdColumnName,
603
602
  {
604
603
  [SINGLE_ROW_ID]: {
605
- [STORE_COLUMN]: jsonStringWithMap(getContent() ?? null),
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
- 1,
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
- 1,
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 STORE_TABLE_NAME = 'storeTableName';
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
- filter,
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]) && !filter(id, 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 {storeTableName = TINYBASE} = config;
790
+ const storeTableName = config[STORE_TABLE_NAME] ?? TINYBASE;
785
791
  return [
786
792
  1,
787
793
  autoLoadIntervalSeconds,
788
- [storeTableName],
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
- setAdd(managedTableNames, tableName) && tableName == valuesTable,
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
- setAdd(managedTableNames, tableName) && tableName == valuesTable,
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 = '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 newDataVersion = (await cmd(PRAGMA + DATA_VERSION))[0][
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
- newDataVersion != (dataVersion ??= newDataVersion) ||
864
- newSchemaVersion != (schemaVersion ??= newSchemaVersion) ||
865
- newTotalChanges != (totalChanges ??= newTotalChanges)
868
+ d != (dataVersion ??= d) ||
869
+ s != (schemaVersion ??= s) ||
870
+ c != (totalChanges ??= c)
866
871
  ) {
867
872
  listener();
868
- dataVersion = newDataVersion;
869
- schemaVersion = newSchemaVersion;
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 jsonStringWithMap = (obj) =>
382
- JSON.stringify(obj, (_key, value) =>
383
- isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
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
- [storeTableName],
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 jsonParse(
590
- (await loadTable(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
591
- SINGLE_ROW_ID
592
- ]?.[STORE_COLUMN] ?? 'null',
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
- DEFAULT_ROW_ID_COLUMN_NAME,
599
+ storeIdColumnName,
601
600
  {
602
601
  [SINGLE_ROW_ID]: {
603
- [STORE_COLUMN]: jsonStringWithMap(getContent() ?? null),
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
- 1,
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
- 1,
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 STORE_TABLE_NAME = 'storeTableName';
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
- filter,
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]) && !filter(id, 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 {storeTableName = TINYBASE} = config;
788
+ const storeTableName = config[STORE_TABLE_NAME] ?? TINYBASE;
783
789
  return [
784
790
  1,
785
791
  autoLoadIntervalSeconds,
786
- [storeTableName],
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
- setAdd(managedTableNames, tableName) && tableName == valuesTable,
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
- setAdd(managedTableNames, tableName) && tableName == valuesTable,
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 = '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 newDataVersion = (await cmd(PRAGMA + DATA_VERSION))[0][
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
- newDataVersion != (dataVersion ??= newDataVersion) ||
862
- newSchemaVersion != (schemaVersion ??= newSchemaVersion) ||
863
- newTotalChanges != (totalChanges ??= newTotalChanges)
866
+ d != (dataVersion ??= d) ||
867
+ s != (schemaVersion ??= s) ||
868
+ c != (totalChanges ??= c)
864
869
  ) {
865
870
  listener();
866
- dataVersion = newDataVersion;
867
- schemaVersion = newSchemaVersion;
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);