@multiplatform.one/store 6.0.4 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +50 -0
  2. package/dist/cjs/createStore.cjs +39 -0
  3. package/dist/cjs/createStore.native.js +43 -0
  4. package/dist/cjs/createStore.native.js.map +1 -0
  5. package/dist/cjs/index.cjs +43 -0
  6. package/dist/cjs/index.native.js +48 -0
  7. package/dist/cjs/index.native.js.map +1 -0
  8. package/dist/cjs/persist.cjs +60 -0
  9. package/dist/cjs/persist.native.js +65 -0
  10. package/dist/cjs/persist.native.js.map +1 -0
  11. package/dist/cjs/storage/index.cjs +43 -0
  12. package/dist/cjs/storage/index.native.js +81 -0
  13. package/dist/cjs/storage/index.native.js.map +1 -0
  14. package/dist/cjs/storage/index.tauri.cjs +49 -0
  15. package/dist/cjs/storage/index.tauri.native.js +53 -0
  16. package/dist/cjs/storage/index.tauri.native.js.map +1 -0
  17. package/dist/esm/createStore.mjs +14 -0
  18. package/dist/esm/createStore.mjs.map +1 -0
  19. package/dist/esm/createStore.native.js +15 -0
  20. package/dist/esm/createStore.native.js.map +1 -0
  21. package/dist/esm/index.mjs +11 -0
  22. package/dist/esm/index.mjs.map +1 -0
  23. package/dist/esm/index.native.js +13 -0
  24. package/dist/esm/index.native.js.map +1 -0
  25. package/dist/esm/persist.mjs +35 -0
  26. package/dist/esm/persist.mjs.map +1 -0
  27. package/dist/esm/persist.native.js +37 -0
  28. package/dist/esm/persist.native.js.map +1 -0
  29. package/dist/esm/storage/index.mjs +18 -0
  30. package/dist/esm/storage/index.mjs.map +1 -0
  31. package/dist/esm/storage/index.native.js +53 -0
  32. package/dist/esm/storage/index.native.js.map +1 -0
  33. package/dist/esm/storage/index.tauri.mjs +24 -0
  34. package/dist/esm/storage/index.tauri.mjs.map +1 -0
  35. package/dist/esm/storage/index.tauri.native.js +25 -0
  36. package/dist/esm/storage/index.tauri.native.js.map +1 -0
  37. package/package.json +23 -10
  38. package/src/createStoreGating.spec.ts +113 -0
  39. package/src/storage/storage.spec.ts +79 -0
  40. package/types/createStore.d.ts +10 -0
  41. package/types/createStore.d.ts.map +1 -0
  42. package/types/index.d.ts +10 -0
  43. package/types/index.d.ts.map +1 -0
  44. package/types/persist.d.ts +18 -0
  45. package/types/persist.d.ts.map +1 -0
  46. package/types/storage/index.d.ts +3 -0
  47. package/types/storage/index.d.ts.map +1 -0
  48. package/types/storage/index.native.d.ts +3 -0
  49. package/types/storage/index.native.d.ts.map +1 -0
  50. package/types/storage/index.tauri.d.ts +3 -0
  51. package/types/storage/index.tauri.d.ts.map +1 -0
@@ -0,0 +1,13 @@
1
+ import { createStore } from "./createStore.native.js";
2
+ import { storage } from "./storage/index.native.js";
3
+ import { createPersistStore } from "./persist.native.js";
4
+ import { Store, batch, createStore as createStore2 } from "@tanstack/store";
5
+ import { useStore } from "@tanstack/react-store";
6
+ import { useStore as tanstackUseStore } from "@tanstack/react-store";
7
+ function useStore2(store, selector) {
8
+ return tanstackUseStore(store, selector !== null && selector !== void 0 ? selector : function (s) {
9
+ return s;
10
+ });
11
+ }
12
+ export { Store, batch, createPersistStore, createStore, createStore2 as createTanStackStore, storage, useStore2 as useStore, useStore as useTanStackStore };
13
+ //# sourceMappingURL=index.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createStore","storage","createPersistStore","Store","batch","createStore2","useStore","tanstackUseStore","useStore2","store","selector","s"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,WAAA,QAAmB;AAE5B,SAASC,OAAA,QAAe;AAExB,SAASC,kBAAA,QAA0B;AAGnC,SAASC,KAAA,EAAOC,KAAA,EAAsBJ,WAAA,IAAfK,YAAA,QAA0C;AACjE,SAAqBC,QAAA,QAAwB;AAE7C,SAASA,QAAA,IAAYC,gBAAA,QAAwB;AAItC,SAASC,UACdC,KAAA,EACAC,QAAA,EACW;EACX,OAAOH,gBAAA,CAAiBE,KAAA,EAAmBC,QAAA,KAAa,IAAC,IAAMA,QAA0B,cAAAA,QAAA,aAAAC,CAAA;IAC3F,OAAAA,CAAA","ignoreList":[]}
@@ -0,0 +1,35 @@
1
+ import { Store } from "@tanstack/store";
2
+ function createPersistStore(initialState, persistOptions) {
3
+ const {
4
+ key,
5
+ storage,
6
+ serialize = JSON.stringify,
7
+ deserialize = JSON.parse
8
+ } = persistOptions;
9
+ let hydrated = false;
10
+ const store = new Store(initialState);
11
+ store.subscribe(() => {
12
+ if (hydrated) {
13
+ const serialized = serialize(store.state);
14
+ void Promise.resolve(storage.setItem(key, serialized));
15
+ }
16
+ });
17
+ const rehydrate = async () => {
18
+ const raw = await Promise.resolve(storage.getItem(key));
19
+ if (raw !== null) {
20
+ const deserialized = deserialize(raw);
21
+ store.setState(() => deserialized);
22
+ }
23
+ hydrated = true;
24
+ };
25
+ const clearPersistedState = async () => {
26
+ await Promise.resolve(storage.removeItem(key));
27
+ };
28
+ void rehydrate();
29
+ const persistStore = store;
30
+ persistStore.rehydrate = rehydrate;
31
+ persistStore.clearPersistedState = clearPersistedState;
32
+ return persistStore;
33
+ }
34
+ export { createPersistStore };
35
+ //# sourceMappingURL=persist.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Store","createPersistStore","initialState","persistOptions","key","storage","serialize","JSON","stringify","deserialize","parse","hydrated","store","subscribe","serialized","state","Promise","resolve","setItem","rehydrate","raw","getItem","deserialized","setState","clearPersistedState","removeItem","persistStore"],"sources":["../../src/persist.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAA,QAAa;AAoBf,SAASC,mBACdC,YAAA,EACAC,cAAA,EACsB;EACtB,MAAM;IAAEC,GAAA;IAAKC,OAAA;IAASC,SAAA,GAAYC,IAAA,CAAKC,SAAA;IAAWC,WAAA,GAAcF,IAAA,CAAKG;EAAM,IAAIP,cAAA;EAE/E,IAAIQ,QAAA,GAAW;EAEf,MAAMC,KAAA,GAAQ,IAAIZ,KAAA,CAAcE,YAAY;EAG5CU,KAAA,CAAMC,SAAA,CAAU,MAAM;IACpB,IAAIF,QAAA,EAAU;MACZ,MAAMG,UAAA,GAAaR,SAAA,CAAUM,KAAA,CAAMG,KAAK;MACxC,KAAKC,OAAA,CAAQC,OAAA,CAAQZ,OAAA,CAAQa,OAAA,CAAQd,GAAA,EAAKU,UAAU,CAAC;IACvD;EACF,CAAC;EAED,MAAMK,SAAA,GAAY,MAAAA,CAAA,KAA2B;IAC3C,MAAMC,GAAA,GAAM,MAAMJ,OAAA,CAAQC,OAAA,CAAQZ,OAAA,CAAQgB,OAAA,CAAQjB,GAAG,CAAC;IACtD,IAAIgB,GAAA,KAAQ,MAAM;MAChB,MAAME,YAAA,GAAeb,WAAA,CAAYW,GAAG;MACpCR,KAAA,CAAMW,QAAA,CAAS,MAAMD,YAAY;IACnC;IACAX,QAAA,GAAW;EACb;EAEA,MAAMa,mBAAA,GAAsB,MAAAA,CAAA,KAA2B;IACrD,MAAMR,OAAA,CAAQC,OAAA,CAAQZ,OAAA,CAAQoB,UAAA,CAAWrB,GAAG,CAAC;EAC/C;EAGA,KAAKe,SAAA,CAAU;EAEf,MAAMO,YAAA,GAAed,KAAA;EACrBc,YAAA,CAAaP,SAAA,GAAYA,SAAA;EACzBO,YAAA,CAAaF,mBAAA,GAAsBA,mBAAA;EAEnC,OAAOE,YAAA;AACT","ignoreList":[]}
@@ -0,0 +1,37 @@
1
+ import { Store } from "@tanstack/store";
2
+ function createPersistStore(initialState, persistOptions) {
3
+ var {
4
+ key,
5
+ storage,
6
+ serialize = JSON.stringify,
7
+ deserialize = JSON.parse
8
+ } = persistOptions;
9
+ var hydrated = false;
10
+ var store = new Store(initialState);
11
+ store.subscribe(function () {
12
+ if (hydrated) {
13
+ var serialized = serialize(store.state);
14
+ void Promise.resolve(storage.setItem(key, serialized));
15
+ }
16
+ });
17
+ var rehydrate = async function rehydrate2() {
18
+ var raw = await Promise.resolve(storage.getItem(key));
19
+ if (raw !== null) {
20
+ var deserialized = deserialize(raw);
21
+ store.setState(function () {
22
+ return deserialized;
23
+ });
24
+ }
25
+ hydrated = true;
26
+ };
27
+ var clearPersistedState = async function clearPersistedState2() {
28
+ await Promise.resolve(storage.removeItem(key));
29
+ };
30
+ void rehydrate();
31
+ var persistStore = store;
32
+ persistStore.rehydrate = rehydrate;
33
+ persistStore.clearPersistedState = clearPersistedState;
34
+ return persistStore;
35
+ }
36
+ export { createPersistStore };
37
+ //# sourceMappingURL=persist.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Store","createPersistStore","initialState","persistOptions","key","storage","serialize","JSON","stringify","deserialize","parse","hydrated","store","subscribe","serialized","state","Promise","resolve","setItem","rehydrate","rehydrate2","raw","getItem","deserialized","setState","clearPersistedState","clearPersistedState2","removeItem","persistStore"],"sources":["../../src/persist.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAA,QAAa;AAoBf,SAASC,mBACdC,YAAA,EACAC,cAAA,EACsB;EACtB;IAAMC,GAAE;IAAAC,OAAK;IAAAC,SAAS,GAAAC,IAAY,CAAAC,SAAK;IAAAC,WAAW,GAAAF,IAAc,CAAAG;EAAK,IAAMP,cAAI;EAE/E,IAAIQ,QAAA,GAAW;EAEf,IAAAC,KAAM,OAAQZ,KAAI,CAAAE,YAAc;EAGhCU,KAAA,CAAMC,SAAA,CAAU,YAAM;IACpB,IAAIF,QAAA,EAAU;MACZ,IAAAG,UAAM,GAAAR,SAAa,CAAAM,KAAU,CAAAG,KAAM;MACnC,KAAKC,OAAA,CAAQC,OAAA,CAAQZ,OAAA,CAAQa,OAAA,CAAQd,GAAA,EAAKU,UAAU,CAAC;IACvD;EACF,CAAC;EAED,IAAAK,SAAM,kBAAuCC,WAAA;IAC3C,IAAAC,GAAM,SAAML,OAAM,CAAAC,OAAQ,CAAAZ,OAAQ,CAAAiB,OAAQ,CAAAlB,GAAQ,EAAG;IACrD,IAAIiB,GAAA,KAAQ,MAAM;MAChB,IAAAE,YAAM,GAAAd,WAAe,CAAAY,GAAY;MACjCT,KAAA,CAAMY,QAAA,CAAS,YAAM;QACvB,OAAAD,YAAA;MACA;IACF;IAEAZ,QAAM;EACJ;EACF,IAAAc,mBAAA,kBAAAC,qBAAA;IAGA,MAAKV,OAAU,CAAAC,OAAA,CAAAZ,OAAA,CAAAsB,UAAA,CAAAvB,GAAA;EAEf;EACA,KAAAe,SAAa;EACb,IAAAS,YAAa,GAAAhB,KAAA;EAEbgB,YAAO,CAAAT,SAAA,GAAAA,SAAA;EACTS,YAAA,CAAAH,mBAAA,GAAAA,mBAAA","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ const noopStorage = {
2
+ getItem: () => null,
3
+ setItem: () => {},
4
+ removeItem: () => {}
5
+ };
6
+ function getStorage() {
7
+ if (typeof globalThis !== "undefined" && "localStorage" in globalThis && typeof globalThis.localStorage?.getItem === "function") {
8
+ return {
9
+ getItem: name => globalThis.localStorage.getItem(name) ?? null,
10
+ setItem: (name, value) => globalThis.localStorage.setItem(name, value),
11
+ removeItem: name => globalThis.localStorage.removeItem(name)
12
+ };
13
+ }
14
+ return noopStorage;
15
+ }
16
+ const storage = getStorage();
17
+ export { storage };
18
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["noopStorage","getItem","setItem","removeItem","getStorage","globalThis","localStorage","name","value","storage"],"sources":["../../../src/storage/index.ts"],"sourcesContent":[null],"mappings":"AAEA,MAAMA,WAAA,GAAuB;EAC3BC,OAAA,EAASA,CAAA,KAAM;EACfC,OAAA,EAASA,CAAA,KAAM,CAAC;EAChBC,UAAA,EAAYA,CAAA,KAAM,CAAC;AACrB;AAEA,SAASC,WAAA,EAAsB;EAC7B,IACE,OAAOC,UAAA,KAAe,eACtB,kBAAkBA,UAAA,IAClB,OAAOA,UAAA,CAAWC,YAAA,EAAcL,OAAA,KAAY,YAC5C;IACA,OAAO;MACLA,OAAA,EAAUM,IAAA,IAAiBF,UAAA,CAAWC,YAAA,CAAaL,OAAA,CAAQM,IAAI,KAAK;MACpEL,OAAA,EAASA,CAACK,IAAA,EAAcC,KAAA,KAAkBH,UAAA,CAAWC,YAAA,CAAaJ,OAAA,CAAQK,IAAA,EAAMC,KAAK;MACrFL,UAAA,EAAaI,IAAA,IAAiBF,UAAA,CAAWC,YAAA,CAAaH,UAAA,CAAWI,IAAI;IACvE;EACF;EACA,OAAOP,WAAA;AACT;AAEO,MAAMS,OAAA,GAAmBL,UAAA,CAAW","ignoreList":[]}
@@ -0,0 +1,53 @@
1
+ function createStorage() {
2
+ try {
3
+ var {
4
+ MMKV
5
+ } = require("react-native-mmkv");
6
+ var mmkv = new MMKV();
7
+ return {
8
+ getItem: function getItem(name) {
9
+ var _mmkv_getString;
10
+ return (_mmkv_getString = mmkv.getString(name)) !== null && _mmkv_getString !== void 0 ? _mmkv_getString : null;
11
+ },
12
+ setItem: function setItem(name, value) {
13
+ return mmkv.set(name, value);
14
+ },
15
+ removeItem: function removeItem(name) {
16
+ return mmkv.delete(name);
17
+ }
18
+ };
19
+ } catch (unused) {
20
+ try {
21
+ var AsyncStorage = require("@react-native-async-storage/async-storage").default;
22
+ if (AsyncStorage && typeof AsyncStorage.getItem === "function") {
23
+ return {
24
+ getItem: function getItem(name) {
25
+ return AsyncStorage.getItem(name);
26
+ },
27
+ setItem: function setItem(name, value) {
28
+ return AsyncStorage.setItem(name, value);
29
+ },
30
+ removeItem: function removeItem(name) {
31
+ return AsyncStorage.removeItem(name);
32
+ }
33
+ };
34
+ }
35
+ } catch (unused2) {}
36
+ var map = /* @__PURE__ */new Map();
37
+ return {
38
+ getItem: function getItem(name) {
39
+ var _map_get;
40
+ return (_map_get = map.get(name)) !== null && _map_get !== void 0 ? _map_get : null;
41
+ },
42
+ setItem: function setItem(name, value) {
43
+ map.set(name, value);
44
+ },
45
+ removeItem: function removeItem(name) {
46
+ map.delete(name);
47
+ }
48
+ };
49
+ }
50
+ }
51
+ var storage = createStorage();
52
+ export { storage };
53
+ //# sourceMappingURL=index.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createStorage","MMKV","require","mmkv","getItem","name","_mmkv_getString","getString","setItem","value","set","removeItem","delete","unused","AsyncStorage","default","unused2","map","Map","_map_get","get","storage"],"sources":["../../../src/storage/index.native.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,cAAA,EAAgB;EACrB,IAAI;IACA,IAAI;MAAEC;IAAK,IAAIC,OAAA,CAAQ,mBAAmB;IAC1C,IAAIC,IAAA,GAAO,IAAIF,IAAA,CAAK;IACpB,OAAO;MACHG,OAAA,EAAS,SAASA,QAAQC,IAAA,EAAM;QAC5B,IAAIC,eAAA;QACJ,QAAQA,eAAA,GAAkBH,IAAA,CAAKI,SAAA,CAAUF,IAAI,OAAO,QAAQC,eAAA,KAAoB,SAASA,eAAA,GAAkB;MAC/G;MACAE,OAAA,EAAS,SAASA,QAAQH,IAAA,EAAMI,KAAA,EAAO;QACnC,OAAON,IAAA,CAAKO,GAAA,CAAIL,IAAA,EAAMI,KAAK;MAC/B;MACAE,UAAA,EAAY,SAASA,WAAWN,IAAA,EAAM;QAClC,OAAOF,IAAA,CAAKS,MAAA,CAAOP,IAAI;MAC3B;IACJ;EACJ,SAASQ,MAAA,EAAQ;IACb,IAAI;MAEA,IAAIC,YAAA,GAAeZ,OAAA,CAAQ,2CAA2C,EAAEa,OAAA;MAExE,IAAID,YAAA,IAAgB,OAAOA,YAAA,CAAaV,OAAA,KAAY,YAAY;QAC5D,OAAO;UACHA,OAAA,EAAS,SAASA,QAAQC,IAAA,EAAM;YAC5B,OAAOS,YAAA,CAAaV,OAAA,CAAQC,IAAI;UACpC;UACAG,OAAA,EAAS,SAASA,QAAQH,IAAA,EAAMI,KAAA,EAAO;YACnC,OAAOK,YAAA,CAAaN,OAAA,CAAQH,IAAA,EAAMI,KAAK;UAC3C;UACAE,UAAA,EAAY,SAASA,WAAWN,IAAA,EAAM;YAClC,OAAOS,YAAA,CAAaH,UAAA,CAAWN,IAAI;UACvC;QACJ;MACJ;IACJ,SAASW,OAAA,EAAQ,CAAC;IAElB,IAAIC,GAAA,GAAM,mBAAIC,GAAA,CAAI;IAClB,OAAO;MACHd,OAAA,EAAS,SAASA,QAAQC,IAAA,EAAM;QAC5B,IAAIc,QAAA;QACJ,QAAQA,QAAA,GAAWF,GAAA,CAAIG,GAAA,CAAIf,IAAI,OAAO,QAAQc,QAAA,KAAa,SAASA,QAAA,GAAW;MACnF;MACAX,OAAA,EAAS,SAASA,QAAQH,IAAA,EAAMI,KAAA,EAAO;QACnCQ,GAAA,CAAIP,GAAA,CAAIL,IAAA,EAAMI,KAAK;MACvB;MACAE,UAAA,EAAY,SAASA,WAAWN,IAAA,EAAM;QAClCY,GAAA,CAAIL,MAAA,CAAOP,IAAI;MACnB;IACJ;EACJ;AACJ;AACO,IAAIgB,OAAA,GAAUrB,aAAA,CAAc","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ import { Store } from "@tauri-apps/plugin-store";
2
+ let storePromise = null;
3
+ function getStore() {
4
+ if (!storePromise) storePromise = Store.load("store.json");
5
+ return storePromise;
6
+ }
7
+ const storage = {
8
+ getItem: async name => {
9
+ const s = await getStore();
10
+ return (await s.get(name)) ?? null;
11
+ },
12
+ setItem: async (name, value) => {
13
+ const s = await getStore();
14
+ await s.set(name, value);
15
+ await s.save();
16
+ },
17
+ removeItem: async name => {
18
+ const s = await getStore();
19
+ await s.delete(name);
20
+ await s.save();
21
+ }
22
+ };
23
+ export { storage };
24
+ //# sourceMappingURL=index.tauri.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Store","storePromise","getStore","load","storage","getItem","name","s","get","setItem","value","set","save","removeItem","delete"],"sources":["../../../src/storage/index.tauri.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAA,QAAa;AAGtB,IAAIC,YAAA,GAAsC;AAE1C,SAASC,SAAA,EAA2B;EAClC,IAAI,CAACD,YAAA,EAAcA,YAAA,GAAeD,KAAA,CAAMG,IAAA,CAAK,YAAY;EACzD,OAAOF,YAAA;AACT;AAEO,MAAMG,OAAA,GAAmB;EAC9BC,OAAA,EAAS,MAAOC,IAAA,IAAiB;IAC/B,MAAMC,CAAA,GAAI,MAAML,QAAA,CAAS;IACzB,OAAQ,OAAMK,CAAA,CAAEC,GAAA,CAAYF,IAAI,MAAM;EACxC;EACAG,OAAA,EAAS,MAAAA,CAAOH,IAAA,EAAcI,KAAA,KAAkB;IAC9C,MAAMH,CAAA,GAAI,MAAML,QAAA,CAAS;IACzB,MAAMK,CAAA,CAAEI,GAAA,CAAIL,IAAA,EAAMI,KAAK;IACvB,MAAMH,CAAA,CAAEK,IAAA,CAAK;EACf;EACAC,UAAA,EAAY,MAAOP,IAAA,IAAiB;IAClC,MAAMC,CAAA,GAAI,MAAML,QAAA,CAAS;IACzB,MAAMK,CAAA,CAAEO,MAAA,CAAOR,IAAI;IACnB,MAAMC,CAAA,CAAEK,IAAA,CAAK;EACf;AACF","ignoreList":[]}
@@ -0,0 +1,25 @@
1
+ import { Store } from "@tauri-apps/plugin-store";
2
+ var storePromise = null;
3
+ function getStore() {
4
+ if (!storePromise) storePromise = Store.load("store.json");
5
+ return storePromise;
6
+ }
7
+ var storage = {
8
+ getItem: async function getItem(name) {
9
+ var _ref;
10
+ var s = await getStore();
11
+ return (_ref = await s.get(name)) !== null && _ref !== void 0 ? _ref : null;
12
+ },
13
+ setItem: async function setItem(name, value) {
14
+ var s = await getStore();
15
+ await s.set(name, value);
16
+ await s.save();
17
+ },
18
+ removeItem: async function removeItem(name) {
19
+ var s = await getStore();
20
+ await s.delete(name);
21
+ await s.save();
22
+ }
23
+ };
24
+ export { storage };
25
+ //# sourceMappingURL=index.tauri.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Store","storePromise","getStore","load","storage","getItem","name","_ref","s","get","setItem","value","set","save","removeItem","delete"],"sources":["../../../src/storage/index.tauri.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAA,QAAa;AAGtB,IAAIC,YAAA,GAAsC;AAE1C,SAASC,SAAA,EAA2B;EAClC,IAAI,CAACD,YAAA,EAAcA,YAAA,GAAeD,KAAA,CAAMG,IAAA,CAAK,YAAY;EACzD,OAAOF,YAAA;AACT;AAEO,IAAAG,OAAM;EACXC,OAAA,EAAS,eAAOA,OAAiBA,CAAAC,IAAA;IAC/B,IAAAC,IAAM;IACN,IAAAC,CAAA,GAAQ,MAAMN,QAAc,CAAI;IAClC,QAAAK,IAAA,SAAAC,CAAA,CAAAC,GAAA,CAAAH,IAAA,eAAAC,IAAA,cAAAA,IAAA;EACA;EACEG,OAAA,EAAM,eAAUA,OAASA,CAAAJ,IAAA,EAAAK,KAAA;IACzB,IAAAH,CAAA,GAAQ,MAAIN,QAAM,CAAK;IACvB,MAAMM,CAAA,CAAEI,GAAA,CAAAN,IAAK,EAAAK,KAAA;IACf,MAAAH,CAAA,CAAAK,IAAA;EACA;EACEC,UAAM,EAAI,eAAeA,WAAAR,IAAA;IACzB,IAAAE,CAAA,GAAQ,MAAAN,QAAW;IACnB,MAAMM,CAAA,CAAEO,MAAK,CAAAT,IAAA;IACf,MAAAE,CAAA,CAAAK,IAAA;EACF","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/store",
3
- "version": "6.0.4",
3
+ "version": "6.3.0",
4
4
  "description": "multiplatform.one TanStack Store with cross-platform persistent storage",
5
5
  "keywords": [
6
6
  "react",
@@ -18,23 +18,34 @@
18
18
  "author": "BitSpur <support@risserlabs.com> (https://risserlabs.com)",
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "https://gitlab.com/bitspur/multiplatform.one/multiplatform.one"
21
+ "url": "git+https://gitlab.com/bitspur/frappe/multiplatform.one.git",
22
+ "directory": "public/store"
22
23
  },
23
24
  "source": "src/index.ts",
24
25
  "files": [
25
- "src"
26
+ "dist",
27
+ "src",
28
+ "types",
29
+ "!types/.tsbuildinfo"
26
30
  ],
27
31
  "sideEffects": false,
28
32
  "main": "src/index.ts",
29
33
  "module": "src/index.ts",
30
- "types": "src/index.ts",
34
+ "types": "types/index.d.ts",
31
35
  "exports": {
32
36
  "./package.json": "./package.json",
33
37
  ".": {
34
- "types": "./src/index.ts",
35
- "import": "./src/index.ts",
36
- "require": "./src/index.ts",
37
- "default": "./src/index.ts"
38
+ "source": "./src/index.ts",
39
+ "react-native": {
40
+ "types": "./types/index.d.ts",
41
+ "import": "./dist/esm/index.native.js",
42
+ "require": "./dist/cjs/index.native.js",
43
+ "default": "./dist/esm/index.native.js"
44
+ },
45
+ "types": "./types/index.d.ts",
46
+ "import": "./dist/esm/index.mjs",
47
+ "require": "./dist/cjs/index.cjs",
48
+ "default": "./dist/cjs/index.cjs"
38
49
  }
39
50
  },
40
51
  "publishConfig": {
@@ -46,6 +57,7 @@
46
57
  "react-native-mmkv": "^4.3.1"
47
58
  },
48
59
  "devDependencies": {
60
+ "@tamagui/build": "2.0.0-rc.41",
49
61
  "@testing-library/jest-dom": "^6.9.1",
50
62
  "@testing-library/react": "^16.3.2",
51
63
  "@vitejs/plugin-react": "^6.0.1",
@@ -55,8 +67,8 @@
55
67
  "typescript": "~5.9.3",
56
68
  "vite": "^8.0.10",
57
69
  "vitest": "^4.1.5",
58
- "@multiplatform.one/config": "6.0.4",
59
- "@multiplatform.one/test-utils": "6.0.4"
70
+ "@multiplatform.one/config": "6.3.0",
71
+ "@multiplatform.one/test-utils": "6.3.0"
60
72
  },
61
73
  "peerDependencies": {
62
74
  "react": "^19.1.0"
@@ -68,6 +80,7 @@
68
80
  "node": ">=18.0.0"
69
81
  },
70
82
  "scripts": {
83
+ "build": "rm -rf dist types 2>/dev/null && tamagui-build --ts-project ./tsconfig.build.json --exclude '\\.spec\\.|\\.test\\.|\\.stories\\.'",
71
84
  "pretest": "node -e \"const p=require('path').resolve(__dirname,'../../node_modules/@testing-library/react/node_modules');['react','react-dom','scheduler'].forEach(d=>{try{require('fs').rmSync(p+'/'+d,{recursive:true,force:true})}catch{}})\"",
72
85
  "test": "vitest run --coverage --coverage.provider=v8 --coverage.reporter=text --coverage.reporter=lcov --coverage.reporter=html",
73
86
  "typecheck": "tsc --noEmit"
@@ -0,0 +1,113 @@
1
+ /**
2
+ * createStore persistence-gating specs — the factory decision consumers rely
3
+ * on: `persist: true` returns a PersistStore wired to storage (rehydrate /
4
+ * clearPersistedState / write-through), anything else returns a plain
5
+ * in-memory TanStack Store that never touches storage.
6
+ */
7
+
8
+ import { describe, expect, it, vi } from "vitest";
9
+ import { createStore } from "./createStore";
10
+ import type { PersistStore, Storage } from "./persist";
11
+
12
+ function createMockStorage(): Storage & { data: Map<string, string> } {
13
+ const data = new Map<string, string>();
14
+ return {
15
+ data,
16
+ getItem: vi.fn((key: string) => data.get(key) ?? null),
17
+ setItem: vi.fn((key: string, value: string) => {
18
+ data.set(key, value);
19
+ }),
20
+ removeItem: vi.fn((key: string) => {
21
+ data.delete(key);
22
+ }),
23
+ };
24
+ }
25
+
26
+ describe("createStore persistence gating", () => {
27
+ it("returns a plain store without persist methods by default", () => {
28
+ const store = createStore({ n: 1 });
29
+ expect(store.state).toEqual({ n: 1 });
30
+ expect((store as Partial<PersistStore<{ n: number }>>).rehydrate).toBeUndefined();
31
+ expect((store as Partial<PersistStore<{ n: number }>>).clearPersistedState).toBeUndefined();
32
+ });
33
+
34
+ it("never writes to storage when persist is off", () => {
35
+ const storage = createMockStorage();
36
+ const store = createStore({ n: 1 }, { name: "unpersisted", storage });
37
+ store.setState(() => ({ n: 2 }));
38
+ expect(storage.setItem).not.toHaveBeenCalled();
39
+ expect(storage.getItem).not.toHaveBeenCalled();
40
+ });
41
+
42
+ it("returns a persist store keyed by options.name when persist is on", async () => {
43
+ const storage = createMockStorage();
44
+ storage.data.set("settings", JSON.stringify({ n: 42 }));
45
+ const store = createStore(
46
+ { n: 0 },
47
+ { name: "settings", persist: true, storage },
48
+ ) as PersistStore<{ n: number }>;
49
+ expect(typeof store.rehydrate).toBe("function");
50
+ expect(typeof store.clearPersistedState).toBe("function");
51
+ await store.rehydrate();
52
+ expect(store.state).toEqual({ n: 42 });
53
+ expect(storage.getItem).toHaveBeenCalledWith("settings");
54
+ });
55
+
56
+ it("writes state changes through to the provided storage after hydration", async () => {
57
+ const storage = createMockStorage();
58
+ const store = createStore(
59
+ { n: 0 },
60
+ { name: "counter", persist: true, storage },
61
+ ) as PersistStore<{ n: number }>;
62
+ await store.rehydrate();
63
+ store.setState(() => ({ n: 7 }));
64
+ await vi.waitFor(() => {
65
+ expect(storage.setItem).toHaveBeenCalledWith("counter", JSON.stringify({ n: 7 }));
66
+ });
67
+ });
68
+
69
+ it("clearPersistedState removes exactly the store's key", async () => {
70
+ const storage = createMockStorage();
71
+ const store = createStore(
72
+ { n: 0 },
73
+ { name: "wipe-me", persist: true, storage },
74
+ ) as PersistStore<{ n: number }>;
75
+ await store.rehydrate();
76
+ await store.clearPersistedState();
77
+ expect(storage.removeItem).toHaveBeenCalledWith("wipe-me");
78
+ });
79
+
80
+ it("falls back to the default (localStorage-backed) storage when none is given", async () => {
81
+ // The shared setup replaces localStorage with a no-op stub; install a real
82
+ // in-memory one so the default adapter's lazy delegation is observable.
83
+ const data = new Map<string, string>([["default-backed", JSON.stringify({ n: 9 })]]);
84
+ const previous = globalThis.localStorage;
85
+ Object.defineProperty(globalThis, "localStorage", {
86
+ value: {
87
+ getItem: (name: string) => data.get(name) ?? null,
88
+ setItem: (name: string, value: string) => {
89
+ data.set(name, String(value));
90
+ },
91
+ removeItem: (name: string) => {
92
+ data.delete(name);
93
+ },
94
+ },
95
+ writable: true,
96
+ configurable: true,
97
+ });
98
+ try {
99
+ const store = createStore(
100
+ { n: 0 },
101
+ { name: "default-backed", persist: true },
102
+ ) as PersistStore<{ n: number }>;
103
+ await store.rehydrate();
104
+ expect(store.state).toEqual({ n: 9 });
105
+ } finally {
106
+ Object.defineProperty(globalThis, "localStorage", {
107
+ value: previous,
108
+ writable: true,
109
+ configurable: true,
110
+ });
111
+ }
112
+ });
113
+ });
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Default storage adapter specs — the persistence backend `createStore`
3
+ * silently wires in when `persist: true`. Locks down: the web adapter
4
+ * delegates to globalThis.localStorage (get/set/remove round-trip) and
5
+ * misses read as null, matching the `Storage` contract `createPersistStore`
6
+ * depends on for rehydration.
7
+ *
8
+ * The shared test setup replaces localStorage with a no-op stub, so these
9
+ * specs install a real in-memory localStorage first: the adapter reads
10
+ * `globalThis.localStorage` lazily on every call, which is exactly the
11
+ * delegation contract under test.
12
+ */
13
+
14
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
15
+ import { storage } from "./index";
16
+
17
+ const key = "mp-storage-spec-key";
18
+
19
+ function createLocalStorageStub() {
20
+ const data = new Map<string, string>();
21
+ return {
22
+ getItem: (name: string) => data.get(name) ?? null,
23
+ setItem: (name: string, value: string) => {
24
+ data.set(name, String(value));
25
+ },
26
+ removeItem: (name: string) => {
27
+ data.delete(name);
28
+ },
29
+ clear: () => data.clear(),
30
+ key: (index: number) => [...data.keys()][index] ?? null,
31
+ get length() {
32
+ return data.size;
33
+ },
34
+ };
35
+ }
36
+
37
+ let previousLocalStorage: unknown;
38
+
39
+ beforeEach(() => {
40
+ previousLocalStorage = globalThis.localStorage;
41
+ Object.defineProperty(globalThis, "localStorage", {
42
+ value: createLocalStorageStub(),
43
+ writable: true,
44
+ configurable: true,
45
+ });
46
+ });
47
+
48
+ afterEach(() => {
49
+ Object.defineProperty(globalThis, "localStorage", {
50
+ value: previousLocalStorage,
51
+ writable: true,
52
+ configurable: true,
53
+ });
54
+ });
55
+
56
+ describe("default storage adapter (web)", () => {
57
+ it("round-trips a value through localStorage", () => {
58
+ storage.setItem(key, "hello");
59
+ expect(globalThis.localStorage.getItem(key)).toBe("hello");
60
+ expect(storage.getItem(key)).toBe("hello");
61
+ });
62
+
63
+ it("returns null for a missing key (rehydrate no-op contract)", () => {
64
+ expect(storage.getItem("mp-storage-spec-missing")).toBeNull();
65
+ });
66
+
67
+ it("removes a value", () => {
68
+ storage.setItem(key, "to-remove");
69
+ storage.removeItem(key);
70
+ expect(storage.getItem(key)).toBeNull();
71
+ expect(globalThis.localStorage.getItem(key)).toBeNull();
72
+ });
73
+
74
+ it("overwrites an existing value on set", () => {
75
+ storage.setItem(key, "first");
76
+ storage.setItem(key, "second");
77
+ expect(storage.getItem(key)).toBe("second");
78
+ });
79
+ });
@@ -0,0 +1,10 @@
1
+ import { Store } from "@tanstack/store";
2
+ import { type PersistStore } from "./persist";
3
+ import type { Storage } from "./persist";
4
+ export type StoreOptions = {
5
+ name: string;
6
+ persist?: boolean;
7
+ storage?: Storage;
8
+ };
9
+ export declare function createStore<T>(initialState: T, options?: StoreOptions): Store<T> | PersistStore<T>;
10
+ //# sourceMappingURL=createStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStore.d.ts","sourceRoot":"","sources":["../src/createStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,WAAW,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,EAC3B,YAAY,EAAE,CAAC,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAQ5B"}
@@ -0,0 +1,10 @@
1
+ export { createStore } from "./createStore";
2
+ export type { StoreOptions } from "./createStore";
3
+ export { storage } from "./storage";
4
+ export type { Storage, PersistOptions, PersistStore } from "./persist";
5
+ export { createPersistStore } from "./persist";
6
+ export { Store, batch, createStore as createTanStackStore } from "@tanstack/store";
7
+ export { useStore as useTanStackStore } from "@tanstack/react-store";
8
+ import { type Store } from "@tanstack/store";
9
+ export declare function useStore<TState, TSelected = TState>(store: Store<TState>, selector?: (state: TState) => TSelected): TSelected;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAG/C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAK7C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EACjD,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,GACtC,SAAS,CAEX"}
@@ -0,0 +1,18 @@
1
+ import { Store } from "@tanstack/store";
2
+ export interface Storage {
3
+ getItem(key: string): string | null | Promise<string | null>;
4
+ setItem(key: string, value: string): void | Promise<void>;
5
+ removeItem(key: string): void | Promise<void>;
6
+ }
7
+ export interface PersistOptions<TState> {
8
+ key: string;
9
+ storage: Storage;
10
+ serialize?: (state: TState) => string;
11
+ deserialize?: (raw: string) => TState;
12
+ }
13
+ export interface PersistStore<TState> extends Store<TState> {
14
+ rehydrate(): Promise<void>;
15
+ clearPersistedState(): Promise<void>;
16
+ }
17
+ export declare function createPersistStore<TState>(initialState: TState, persistOptions: PersistOptions<TState>): PersistStore<TState>;
18
+ //# sourceMappingURL=persist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../src/persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc,CAAC,MAAM;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,YAAY,CAAC,MAAM,CAAE,SAAQ,KAAK,CAAC,MAAM,CAAC;IACzD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EACvC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,GACrC,YAAY,CAAC,MAAM,CAAC,CAoCtB"}
@@ -0,0 +1,3 @@
1
+ import type { Storage } from "../persist";
2
+ export declare const storage: Storage;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAuB1C,eAAO,MAAM,OAAO,EAAE,OAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Storage } from "../persist";
2
+ export declare const storage: Storage;
3
+ //# sourceMappingURL=index.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../src/storage/index.native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAsC1C,eAAO,MAAM,OAAO,EAAE,OAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Storage } from "../persist";
2
+ export declare const storage: Storage;
3
+ //# sourceMappingURL=index.tauri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.tauri.d.ts","sourceRoot":"","sources":["../../src/storage/index.tauri.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAS1C,eAAO,MAAM,OAAO,EAAE,OAerB,CAAC"}