tinybase 5.0.0-beta.14 → 5.0.0-beta.15

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 (122) 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-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  18. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  19. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  20. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  21. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  22. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  23. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  24. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  25. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -1
  26. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  27. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -1
  28. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  29. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  30. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  31. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  32. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  33. package/lib/debug/persisters/persister-browser.js +4 -7
  34. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +55 -48
  35. package/lib/debug/persisters/persister-electric-sql.js +55 -48
  36. package/lib/debug/persisters/persister-expo-sqlite-next.js +55 -48
  37. package/lib/debug/persisters/persister-expo-sqlite.js +55 -48
  38. package/lib/debug/persisters/persister-file.js +3 -7
  39. package/lib/debug/persisters/persister-libsql.js +55 -48
  40. package/lib/debug/persisters/persister-powersync.js +55 -48
  41. package/lib/debug/persisters/persister-sqlite-wasm.js +55 -48
  42. package/lib/debug/persisters/persister-sqlite3.js +55 -48
  43. package/lib/debug/synchronizers/synchronizer-ws-client.js +3 -7
  44. package/lib/debug/ui-react-dom.js +3 -7
  45. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  46. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  47. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  48. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  49. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  50. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  51. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  52. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  53. package/lib/es6/persisters/persister-libsql.js +1 -1
  54. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  55. package/lib/es6/persisters/persister-powersync.js +1 -1
  56. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  57. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  58. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  59. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  60. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  61. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  62. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  63. package/lib/persisters/persister-electric-sql.js +1 -1
  64. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  65. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  66. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  67. package/lib/persisters/persister-expo-sqlite.js +1 -1
  68. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  69. package/lib/persisters/persister-libsql.js +1 -1
  70. package/lib/persisters/persister-libsql.js.gz +0 -0
  71. package/lib/persisters/persister-powersync.js +1 -1
  72. package/lib/persisters/persister-powersync.js.gz +0 -0
  73. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  74. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  75. package/lib/persisters/persister-sqlite3.js +1 -1
  76. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  77. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +1 -1
  78. package/lib/types/persisters/persister-expo-sqlite.d.ts +1 -1
  79. package/lib/types/persisters/persister-sqlite-wasm.d.ts +1 -1
  80. package/lib/types/persisters/persister-sqlite3.d.ts +1 -1
  81. package/lib/types/persisters.d.ts +18 -7
  82. package/lib/types/ui-react.d.ts +1 -1
  83. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +1 -1
  84. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +1 -1
  85. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +1 -1
  86. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +1 -1
  87. package/lib/types/with-schemas/persisters.d.ts +18 -7
  88. package/lib/types/with-schemas/ui-react.d.ts +1 -1
  89. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  90. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  91. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  92. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  93. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  94. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  95. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  96. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  97. package/lib/umd/persisters/persister-libsql.js +1 -1
  98. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  99. package/lib/umd/persisters/persister-powersync.js +1 -1
  100. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  101. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  102. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  103. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  104. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  105. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  106. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  107. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  108. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  109. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  110. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  111. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  112. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  113. package/lib/umd-es6/persisters/persister-libsql.js +1 -1
  114. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  115. package/lib/umd-es6/persisters/persister-powersync.js +1 -1
  116. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  117. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  118. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  119. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  120. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  121. package/package.json +24 -24
  122. package/readme.md +2 -2
@@ -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,
@@ -911,6 +917,7 @@ const createCrSqliteWasmPersister = (
911
917
  (removeListener) => removeListener(),
912
918
  onSqlCommand,
913
919
  onIgnoredError,
920
+ 1,
914
921
  db,
915
922
  );
916
923
 
@@ -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 arrayForEach = (array, cb) => array.forEach(cb);
30
25
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
31
26
  const arrayMap = (array, cb) => array.map(cb);
@@ -88,6 +83,11 @@ const mapMatch = (map, obj, set, del = mapSet) => {
88
83
  return map;
89
84
  };
90
85
 
86
+ const SINGLE_ROW_ID = '_';
87
+ const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
88
+ const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
89
+ const SELECT = 'SELECT';
90
+
91
91
  const setNew = (entryOrEntries) =>
92
92
  new Set(
93
93
  isArray(entryOrEntries) || isUndefined(entryOrEntries)
@@ -379,11 +379,10 @@ const getPlaceholders = (array) =>
379
379
  COMMA,
380
380
  );
381
381
 
382
- const jsonStringWithMap = (obj) =>
383
- JSON.stringify(obj, (_key, value) =>
384
- isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
385
- );
386
- const jsonParse = JSON.parse;
382
+ const jsonStringWithUndefined = (obj) =>
383
+ JSON.stringify(obj, (_key, value) => (value === void 0 ? UNDEFINED : value));
384
+ const jsonParseWithUndefined = (str) =>
385
+ JSON.parse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
387
386
 
388
387
  const scheduleRunning = mapNew();
389
388
  const scheduleActions = mapNew();
@@ -569,14 +568,14 @@ const createCustomPersister = (
569
568
  return objFreeze(persister);
570
569
  };
571
570
 
572
- const STORE_COLUMN = 'store';
573
571
  const createJsonSqlitePersister = (
574
572
  store,
575
573
  cmd,
576
574
  addPersisterListener,
577
575
  delPersisterListener,
578
576
  onIgnoredError,
579
- [storeTableName],
577
+ supportedStoreType,
578
+ [storeTableName, storeIdColumnName, storeColumnName],
580
579
  managedTableNames,
581
580
  db,
582
581
  getThing,
@@ -587,10 +586,10 @@ const createJsonSqlitePersister = (
587
586
  const getPersisted = async () =>
588
587
  await transaction(async () => {
589
588
  await refreshSchema();
590
- return jsonParse(
591
- (await loadTable(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
592
- SINGLE_ROW_ID
593
- ]?.[STORE_COLUMN] ?? 'null',
589
+ return jsonParseWithUndefined(
590
+ (await loadTable(storeTableName, storeIdColumnName))[SINGLE_ROW_ID]?.[
591
+ storeColumnName
592
+ ] ?? 'null',
594
593
  );
595
594
  });
596
595
  const setPersisted = async (getContent) =>
@@ -598,10 +597,10 @@ const createJsonSqlitePersister = (
598
597
  await refreshSchema();
599
598
  await saveTable(
600
599
  storeTableName,
601
- DEFAULT_ROW_ID_COLUMN_NAME,
600
+ storeIdColumnName,
602
601
  {
603
602
  [SINGLE_ROW_ID]: {
604
- [STORE_COLUMN]: jsonStringWithMap(getContent() ?? null),
603
+ [storeColumnName]: jsonStringWithUndefined(getContent() ?? null),
605
604
  },
606
605
  },
607
606
  true,
@@ -615,7 +614,7 @@ const createJsonSqlitePersister = (
615
614
  addPersisterListener,
616
615
  delPersisterListener,
617
616
  onIgnoredError,
618
- 1,
617
+ supportedStoreType,
619
618
  {[getThing]: () => db},
620
619
  db,
621
620
  );
@@ -628,6 +627,7 @@ const createTabularSqlitePersister = (
628
627
  addPersisterListener,
629
628
  delPersisterListener,
630
629
  onIgnoredError,
630
+ supportedStoreType,
631
631
  [
632
632
  tablesLoadConfig,
633
633
  tablesSaveConfig,
@@ -721,17 +721,21 @@ const createTabularSqlitePersister = (
721
721
  addPersisterListener,
722
722
  delPersisterListener,
723
723
  onIgnoredError,
724
- 1,
724
+ supportedStoreType,
725
725
  {[getThing]: () => db},
726
726
  db,
727
727
  );
728
728
  return persister;
729
729
  };
730
730
 
731
+ const COLUMN_NAME = 'ColumnName';
732
+ const STORE = 'store';
731
733
  const JSON$1 = 'json';
734
+ const STORE_TABLE_NAME = STORE + 'TableName';
735
+ const STORE_ID_COLUMN_NAME = STORE + 'Id' + COLUMN_NAME;
736
+ const STORE_COLUMN_NAME = STORE + COLUMN_NAME;
732
737
  const AUTO_LOAD_INTERVAL_SECONDS = 'autoLoadIntervalSeconds';
733
- const STORE_TABLE_NAME = 'storeTableName';
734
- const ROW_ID_COLUMN_NAME = 'rowIdColumnName';
738
+ const ROW_ID_COLUMN_NAME = 'rowId' + COLUMN_NAME;
735
739
  const TABLE_ID = 'tableId';
736
740
  const TABLE_NAME = 'tableName';
737
741
  const DELETE_EMPTY_COLUMNS = 'deleteEmptyColumns';
@@ -756,7 +760,8 @@ const getDefaultedTabularConfigMap = (
756
760
  configsObj,
757
761
  defaultObj,
758
762
  tableField,
759
- filter,
763
+ exclude,
764
+ then,
760
765
  ) => {
761
766
  const configMap = mapNew();
762
767
  objToArray(configsObj, (configObj, id) => {
@@ -770,7 +775,8 @@ const getDefaultedTabularConfigMap = (
770
775
  0,
771
776
  objSize(defaultObj),
772
777
  );
773
- if (!isUndefined(defaultedConfig[0]) && !filter(id, defaultedConfig[0])) {
778
+ if (!isUndefined(defaultedConfig[0]) && !exclude(id, defaultedConfig[0])) {
779
+ then(id, defaultedConfig[0]);
774
780
  mapSet(configMap, id, defaultedConfig);
775
781
  }
776
782
  });
@@ -780,11 +786,15 @@ const getConfigStructures = (configOrStoreTableName) => {
780
786
  const config = getDefaultedConfig(configOrStoreTableName);
781
787
  const autoLoadIntervalSeconds = config[AUTO_LOAD_INTERVAL_SECONDS];
782
788
  if (config.mode == JSON$1) {
783
- const {storeTableName = TINYBASE} = config;
789
+ const storeTableName = config[STORE_TABLE_NAME] ?? TINYBASE;
784
790
  return [
785
791
  1,
786
792
  autoLoadIntervalSeconds,
787
- [storeTableName],
793
+ [
794
+ storeTableName,
795
+ config[STORE_ID_COLUMN_NAME] ?? DEFAULT_ROW_ID_COLUMN_NAME,
796
+ config[STORE_COLUMN_NAME] ?? STORE,
797
+ ],
788
798
  setNew(storeTableName),
789
799
  ];
790
800
  }
@@ -796,13 +806,14 @@ const getConfigStructures = (configOrStoreTableName) => {
796
806
  );
797
807
  const valuesTable = valuesConfig[2];
798
808
  const managedTableNames = setNew(valuesTable);
809
+ const excludedTableNames = setNew(valuesTable);
799
810
  const tabularConfig = [
800
811
  getDefaultedTabularConfigMap(
801
812
  load,
802
813
  {[TABLE_ID]: null, [ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME},
803
814
  TABLE_ID,
804
- (tableName) =>
805
- setAdd(managedTableNames, tableName) && tableName == valuesTable,
815
+ (tableName) => collHas(excludedTableNames, tableName),
816
+ (tableName) => setAdd(managedTableNames, tableName),
806
817
  ),
807
818
  getDefaultedTabularConfigMap(
808
819
  save,
@@ -813,15 +824,15 @@ const getConfigStructures = (configOrStoreTableName) => {
813
824
  [DELETE_EMPTY_TABLE]: 0,
814
825
  },
815
826
  TABLE_NAME,
816
- (_, tableName) =>
817
- setAdd(managedTableNames, tableName) && tableName == valuesTable,
827
+ (_, tableName) => collHas(excludedTableNames, tableName),
828
+ (_, tableName) => setAdd(managedTableNames, tableName),
818
829
  ),
819
830
  valuesConfig,
820
831
  ];
821
832
  return [0, autoLoadIntervalSeconds, tabularConfig, managedTableNames];
822
833
  };
823
834
 
824
- const PRAGMA = 'pragma ';
835
+ const PRAGMA = 'pragma_';
825
836
  const DATA_VERSION = 'data_version';
826
837
  const SCHEMA_VERSION = 'schema_version';
827
838
  const createSqlitePersister = (
@@ -832,6 +843,7 @@ const createSqlitePersister = (
832
843
  delUpdateListener,
833
844
  onSqlCommand,
834
845
  onIgnoredError,
846
+ supportedStoreType,
835
847
  db,
836
848
  getThing = 'getDb',
837
849
  useOnConflict,
@@ -839,7 +851,6 @@ const createSqlitePersister = (
839
851
  let dataVersion;
840
852
  let schemaVersion;
841
853
  let totalChanges;
842
- const CHANGES_COLUMN = 'c';
843
854
  const [
844
855
  isJson,
845
856
  autoLoadIntervalSeconds,
@@ -849,23 +860,17 @@ const createSqlitePersister = (
849
860
  const addPersisterListener = (listener) => [
850
861
  startInterval(async () => {
851
862
  try {
852
- const newDataVersion = (await cmd(PRAGMA + DATA_VERSION))[0][
853
- DATA_VERSION
854
- ];
855
- const newSchemaVersion = (await cmd(PRAGMA + SCHEMA_VERSION))[0][
856
- SCHEMA_VERSION
857
- ];
858
- const newTotalChanges = (
859
- await cmd(SELECT + ' TOTAL_CHANGES() ' + CHANGES_COLUMN)
860
- )[0][CHANGES_COLUMN];
863
+ const [{d, s, c}] = await cmd(
864
+ `SELECT ${DATA_VERSION} d,${SCHEMA_VERSION} s,TOTAL_CHANGES() c FROM ${PRAGMA}${DATA_VERSION} JOIN ${PRAGMA}${SCHEMA_VERSION}`,
865
+ );
861
866
  if (
862
- newDataVersion != (dataVersion ??= newDataVersion) ||
863
- newSchemaVersion != (schemaVersion ??= newSchemaVersion) ||
864
- newTotalChanges != (totalChanges ??= newTotalChanges)
867
+ d != (dataVersion ??= d) ||
868
+ s != (schemaVersion ??= s) ||
869
+ c != (totalChanges ??= c)
865
870
  ) {
866
871
  listener();
867
- dataVersion = newDataVersion;
868
- schemaVersion = newSchemaVersion;
872
+ dataVersion = d;
873
+ schemaVersion = s;
869
874
  }
870
875
  } catch {}
871
876
  }, autoLoadIntervalSeconds),
@@ -875,7 +880,7 @@ const createSqlitePersister = (
875
880
  ];
876
881
  const delPersisterListener = ([interval, listeningHandle]) => {
877
882
  stopInterval(interval);
878
- dataVersion = schemaVersion = null;
883
+ dataVersion = schemaVersion = totalChanges = null;
879
884
  delUpdateListener(listeningHandle);
880
885
  };
881
886
  return (isJson ? createJsonSqlitePersister : createTabularSqlitePersister)(
@@ -889,6 +894,7 @@ const createSqlitePersister = (
889
894
  addPersisterListener,
890
895
  delPersisterListener,
891
896
  onIgnoredError,
897
+ supportedStoreType,
892
898
  defaultedConfig,
893
899
  collValues(managedTableNamesSet),
894
900
  db,
@@ -918,6 +924,7 @@ const createElectricSqlPersister = (
918
924
  (unsubscribeFunction) => unsubscribeFunction(),
919
925
  onSqlCommand,
920
926
  onIgnoredError,
927
+ 1,
921
928
  electricClient,
922
929
  'getElectricClient',
923
930
  );