@hot-updater/react-native 0.30.5 → 0.30.7

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.
@@ -39,6 +39,9 @@ const createHotUpdaterStore = () => {
39
39
  } else if ("isUpdateDownloaded" in newState && typeof newState.isUpdateDownloaded === "boolean") {
40
40
  nextState.isUpdateDownloaded = newState.isUpdateDownloaded;
41
41
  }
42
+ if (state.progress === nextState.progress && state.isUpdateDownloaded === nextState.isUpdateDownloaded) {
43
+ return;
44
+ }
42
45
  state = nextState;
43
46
  emitChange();
44
47
  };
@@ -1 +1 @@
1
- {"version":3,"names":["_withSelector","_interopRequireDefault","require","_native","e","__esModule","default","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","createHotUpdaterStore","state","progress","isUpdateDownloaded","getSnapshot","listeners","Set","emitChange","listener","setState","newState","nextState","subscribe","add","delete","addListener","hotUpdaterStore","exports","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAAuC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAOvC,MAAM;EAAEG;AAAiC,CAAC,GAAGC,qBAA2B;AAExE,MAAMC,qBAAqB,GAAGA,CAAA,KAAM;EAClC,IAAIC,KAAsB,GAAG;IAC3BC,QAAQ,EAAE,CAAC;IACXC,kBAAkB,EAAE;EACtB,CAAC;EAED,MAAMC,WAAW,GAAGA,CAAA,KAAM;IACxB,OAAOH,KAAK;EACd,CAAC;EAED,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EAEvC,MAAMC,UAAU,GAAGA,CAAA,KAAM;IACvB,KAAK,MAAMC,QAAQ,IAAIH,SAAS,EAAE;MAChCG,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAMC,QAAQ,GAAIC,QAAkC,IAAK;IACvD;IACA,MAAMC,SAA0B,GAAG;MACjC,GAAGV,KAAK;MACR,GAAGS;IACL,CAAC;;IAED;IACA;IACA;IACA,IAAI,UAAU,IAAIA,QAAQ,IAAI,OAAOA,QAAQ,CAACR,QAAQ,KAAK,QAAQ,EAAE;MACnES,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACR,QAAQ,IAAI,CAAC;IACvD,CAAC,MAAM,IACL,oBAAoB,IAAIQ,QAAQ,IAChC,OAAOA,QAAQ,CAACP,kBAAkB,KAAK,SAAS,EAChD;MACAQ,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACP,kBAAkB;IAC5D;IAEAF,KAAK,GAAGU,SAAS;IACjBJ,UAAU,CAAC,CAAC;EACd,CAAC;EAED,MAAMK,SAAS,GAAIJ,QAAoB,IAAK;IAC1CH,SAAS,CAACQ,GAAG,CAACL,QAAQ,CAAC;IACvB,OAAO,MAAMH,SAAS,CAACS,MAAM,CAACN,QAAQ,CAAC;EACzC,CAAC;;EAED;EACA;EACA,IAAAO,mBAAW,EAAC,YAAY,EAAEN,QAAQ,CAAC;EAEnC,OAAO;IAAEL,WAAW;IAAEK,QAAQ;IAAEG;EAAU,CAAC;AAC7C,CAAC;AAEM,MAAMI,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAGhB,qBAAqB,CAAC,CAAC;AAE/C,MAAMkB,kBAAkB,GAAGA,CAChCC,QAA0C,GAAIC,QAAQ,IAAKA,QAAa,KACrE;EACH,OAAOtB,gCAAgC,CACrCkB,eAAe,CAACJ,SAAS,EACzBI,eAAe,CAACZ,WAAW,EAC3BY,eAAe,CAACZ,WAAW,EAC3Be,QACF,CAAC;AACH,CAAC;AAACF,OAAA,CAAAC,kBAAA,GAAAA,kBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_withSelector","_interopRequireDefault","require","_native","e","__esModule","default","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","createHotUpdaterStore","state","progress","isUpdateDownloaded","getSnapshot","listeners","Set","emitChange","listener","setState","newState","nextState","subscribe","add","delete","addListener","hotUpdaterStore","exports","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAAuC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAOvC,MAAM;EAAEG;AAAiC,CAAC,GAAGC,qBAA2B;AAExE,MAAMC,qBAAqB,GAAGA,CAAA,KAAM;EAClC,IAAIC,KAAsB,GAAG;IAC3BC,QAAQ,EAAE,CAAC;IACXC,kBAAkB,EAAE;EACtB,CAAC;EAED,MAAMC,WAAW,GAAGA,CAAA,KAAM;IACxB,OAAOH,KAAK;EACd,CAAC;EAED,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EAEvC,MAAMC,UAAU,GAAGA,CAAA,KAAM;IACvB,KAAK,MAAMC,QAAQ,IAAIH,SAAS,EAAE;MAChCG,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAMC,QAAQ,GAAIC,QAAkC,IAAK;IACvD;IACA,MAAMC,SAA0B,GAAG;MACjC,GAAGV,KAAK;MACR,GAAGS;IACL,CAAC;;IAED;IACA;IACA;IACA,IAAI,UAAU,IAAIA,QAAQ,IAAI,OAAOA,QAAQ,CAACR,QAAQ,KAAK,QAAQ,EAAE;MACnES,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACR,QAAQ,IAAI,CAAC;IACvD,CAAC,MAAM,IACL,oBAAoB,IAAIQ,QAAQ,IAChC,OAAOA,QAAQ,CAACP,kBAAkB,KAAK,SAAS,EAChD;MACAQ,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACP,kBAAkB;IAC5D;IAEA,IACEF,KAAK,CAACC,QAAQ,KAAKS,SAAS,CAACT,QAAQ,IACrCD,KAAK,CAACE,kBAAkB,KAAKQ,SAAS,CAACR,kBAAkB,EACzD;MACA;IACF;IAEAF,KAAK,GAAGU,SAAS;IACjBJ,UAAU,CAAC,CAAC;EACd,CAAC;EAED,MAAMK,SAAS,GAAIJ,QAAoB,IAAK;IAC1CH,SAAS,CAACQ,GAAG,CAACL,QAAQ,CAAC;IACvB,OAAO,MAAMH,SAAS,CAACS,MAAM,CAACN,QAAQ,CAAC;EACzC,CAAC;;EAED;EACA;EACA,IAAAO,mBAAW,EAAC,YAAY,EAAEN,QAAQ,CAAC;EAEnC,OAAO;IAAEL,WAAW;IAAEK,QAAQ;IAAEG;EAAU,CAAC;AAC7C,CAAC;AAEM,MAAMI,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAGhB,qBAAqB,CAAC,CAAC;AAE/C,MAAMkB,kBAAkB,GAAGA,CAChCC,QAA0C,GAAIC,QAAQ,IAAKA,QAAa,KACrE;EACH,OAAOtB,gCAAgC,CACrCkB,eAAe,CAACJ,SAAS,EACzBI,eAAe,CAACZ,WAAW,EAC3BY,eAAe,CAACZ,WAAW,EAC3Be,QACF,CAAC;AACH,CAAC;AAACF,OAAA,CAAAC,kBAAA,GAAAA,kBAAA","ignoreList":[]}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ var _vitest = require("vitest");
4
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
5
+ const addListenerMock = _vitest.vi.hoisted(() => _vitest.vi.fn());
6
+ _vitest.vi.mock("./native", () => ({
7
+ addListener: addListenerMock
8
+ }));
9
+ const importStore = async () => {
10
+ const {
11
+ hotUpdaterStore
12
+ } = await Promise.resolve().then(() => _interopRequireWildcard(require("./store")));
13
+ return hotUpdaterStore;
14
+ };
15
+ (0, _vitest.describe)("hotUpdaterStore", () => {
16
+ (0, _vitest.beforeEach)(() => {
17
+ _vitest.vi.resetModules();
18
+ addListenerMock.mockReset();
19
+ });
20
+ (0, _vitest.it)("does not notify subscribers when state values are unchanged", async () => {
21
+ const store = await importStore();
22
+ const listener = _vitest.vi.fn();
23
+ const unsubscribe = store.subscribe(listener);
24
+ store.setState({});
25
+ store.setState({
26
+ progress: 0
27
+ });
28
+ store.setState({
29
+ isUpdateDownloaded: false
30
+ });
31
+ (0, _vitest.expect)(listener).not.toHaveBeenCalled();
32
+ unsubscribe();
33
+ });
34
+ (0, _vitest.it)("notifies subscribers only when progress events change the snapshot", async () => {
35
+ const store = await importStore();
36
+ const listener = _vitest.vi.fn();
37
+ const progressListener = addListenerMock.mock.calls[0][1];
38
+ const unsubscribe = store.subscribe(listener);
39
+ progressListener({
40
+ progress: 0.5
41
+ });
42
+ progressListener({
43
+ progress: 0.5
44
+ });
45
+ progressListener({
46
+ progress: 1
47
+ });
48
+ store.setState({
49
+ isUpdateDownloaded: true
50
+ });
51
+ (0, _vitest.expect)(listener).toHaveBeenCalledTimes(2);
52
+ (0, _vitest.expect)(store.getSnapshot()).toEqual({
53
+ isUpdateDownloaded: true,
54
+ progress: 1
55
+ });
56
+ unsubscribe();
57
+ });
58
+ });
59
+ //# sourceMappingURL=store.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_vitest","require","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","addListenerMock","vi","hoisted","fn","mock","addListener","importStore","hotUpdaterStore","Promise","resolve","then","describe","beforeEach","resetModules","mockReset","it","store","listener","unsubscribe","subscribe","setState","progress","isUpdateDownloaded","expect","not","toHaveBeenCalled","progressListener","calls","toHaveBeenCalledTimes","getSnapshot","toEqual"],"sourceRoot":"../../src","sources":["store.spec.ts"],"mappings":"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","ignoreList":[]}
@@ -34,6 +34,9 @@ const createHotUpdaterStore = () => {
34
34
  } else if ("isUpdateDownloaded" in newState && typeof newState.isUpdateDownloaded === "boolean") {
35
35
  nextState.isUpdateDownloaded = newState.isUpdateDownloaded;
36
36
  }
37
+ if (state.progress === nextState.progress && state.isUpdateDownloaded === nextState.isUpdateDownloaded) {
38
+ return;
39
+ }
37
40
  state = nextState;
38
41
  emitChange();
39
42
  };
@@ -1 +1 @@
1
- {"version":3,"names":["useSyncExternalStoreExports","addListener","useSyncExternalStoreWithSelector","createHotUpdaterStore","state","progress","isUpdateDownloaded","getSnapshot","listeners","Set","emitChange","listener","setState","newState","nextState","subscribe","add","delete","hotUpdaterStore","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;AAAA,OAAOA,2BAA2B,MAAM,4CAA4C;AAEpF,SAASC,WAAW,QAAQ,aAAU;AAOtC,MAAM;EAAEC;AAAiC,CAAC,GAAGF,2BAA2B;AAExE,MAAMG,qBAAqB,GAAGA,CAAA,KAAM;EAClC,IAAIC,KAAsB,GAAG;IAC3BC,QAAQ,EAAE,CAAC;IACXC,kBAAkB,EAAE;EACtB,CAAC;EAED,MAAMC,WAAW,GAAGA,CAAA,KAAM;IACxB,OAAOH,KAAK;EACd,CAAC;EAED,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EAEvC,MAAMC,UAAU,GAAGA,CAAA,KAAM;IACvB,KAAK,MAAMC,QAAQ,IAAIH,SAAS,EAAE;MAChCG,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAMC,QAAQ,GAAIC,QAAkC,IAAK;IACvD;IACA,MAAMC,SAA0B,GAAG;MACjC,GAAGV,KAAK;MACR,GAAGS;IACL,CAAC;;IAED;IACA;IACA;IACA,IAAI,UAAU,IAAIA,QAAQ,IAAI,OAAOA,QAAQ,CAACR,QAAQ,KAAK,QAAQ,EAAE;MACnES,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACR,QAAQ,IAAI,CAAC;IACvD,CAAC,MAAM,IACL,oBAAoB,IAAIQ,QAAQ,IAChC,OAAOA,QAAQ,CAACP,kBAAkB,KAAK,SAAS,EAChD;MACAQ,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACP,kBAAkB;IAC5D;IAEAF,KAAK,GAAGU,SAAS;IACjBJ,UAAU,CAAC,CAAC;EACd,CAAC;EAED,MAAMK,SAAS,GAAIJ,QAAoB,IAAK;IAC1CH,SAAS,CAACQ,GAAG,CAACL,QAAQ,CAAC;IACvB,OAAO,MAAMH,SAAS,CAACS,MAAM,CAACN,QAAQ,CAAC;EACzC,CAAC;;EAED;EACA;EACAV,WAAW,CAAC,YAAY,EAAEW,QAAQ,CAAC;EAEnC,OAAO;IAAEL,WAAW;IAAEK,QAAQ;IAAEG;EAAU,CAAC;AAC7C,CAAC;AAED,OAAO,MAAMG,eAAe,GAAGf,qBAAqB,CAAC,CAAC;AAEtD,OAAO,MAAMgB,kBAAkB,GAAGA,CAChCC,QAA0C,GAAIC,QAAQ,IAAKA,QAAa,KACrE;EACH,OAAOnB,gCAAgC,CACrCgB,eAAe,CAACH,SAAS,EACzBG,eAAe,CAACX,WAAW,EAC3BW,eAAe,CAACX,WAAW,EAC3Ba,QACF,CAAC;AACH,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useSyncExternalStoreExports","addListener","useSyncExternalStoreWithSelector","createHotUpdaterStore","state","progress","isUpdateDownloaded","getSnapshot","listeners","Set","emitChange","listener","setState","newState","nextState","subscribe","add","delete","hotUpdaterStore","useHotUpdaterStore","selector","snapshot"],"sourceRoot":"../../src","sources":["store.ts"],"mappings":";;AAAA,OAAOA,2BAA2B,MAAM,4CAA4C;AAEpF,SAASC,WAAW,QAAQ,aAAU;AAOtC,MAAM;EAAEC;AAAiC,CAAC,GAAGF,2BAA2B;AAExE,MAAMG,qBAAqB,GAAGA,CAAA,KAAM;EAClC,IAAIC,KAAsB,GAAG;IAC3BC,QAAQ,EAAE,CAAC;IACXC,kBAAkB,EAAE;EACtB,CAAC;EAED,MAAMC,WAAW,GAAGA,CAAA,KAAM;IACxB,OAAOH,KAAK;EACd,CAAC;EAED,MAAMI,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EAEvC,MAAMC,UAAU,GAAGA,CAAA,KAAM;IACvB,KAAK,MAAMC,QAAQ,IAAIH,SAAS,EAAE;MAChCG,QAAQ,CAAC,CAAC;IACZ;EACF,CAAC;EAED,MAAMC,QAAQ,GAAIC,QAAkC,IAAK;IACvD;IACA,MAAMC,SAA0B,GAAG;MACjC,GAAGV,KAAK;MACR,GAAGS;IACL,CAAC;;IAED;IACA;IACA;IACA,IAAI,UAAU,IAAIA,QAAQ,IAAI,OAAOA,QAAQ,CAACR,QAAQ,KAAK,QAAQ,EAAE;MACnES,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACR,QAAQ,IAAI,CAAC;IACvD,CAAC,MAAM,IACL,oBAAoB,IAAIQ,QAAQ,IAChC,OAAOA,QAAQ,CAACP,kBAAkB,KAAK,SAAS,EAChD;MACAQ,SAAS,CAACR,kBAAkB,GAAGO,QAAQ,CAACP,kBAAkB;IAC5D;IAEA,IACEF,KAAK,CAACC,QAAQ,KAAKS,SAAS,CAACT,QAAQ,IACrCD,KAAK,CAACE,kBAAkB,KAAKQ,SAAS,CAACR,kBAAkB,EACzD;MACA;IACF;IAEAF,KAAK,GAAGU,SAAS;IACjBJ,UAAU,CAAC,CAAC;EACd,CAAC;EAED,MAAMK,SAAS,GAAIJ,QAAoB,IAAK;IAC1CH,SAAS,CAACQ,GAAG,CAACL,QAAQ,CAAC;IACvB,OAAO,MAAMH,SAAS,CAACS,MAAM,CAACN,QAAQ,CAAC;EACzC,CAAC;;EAED;EACA;EACAV,WAAW,CAAC,YAAY,EAAEW,QAAQ,CAAC;EAEnC,OAAO;IAAEL,WAAW;IAAEK,QAAQ;IAAEG;EAAU,CAAC;AAC7C,CAAC;AAED,OAAO,MAAMG,eAAe,GAAGf,qBAAqB,CAAC,CAAC;AAEtD,OAAO,MAAMgB,kBAAkB,GAAGA,CAChCC,QAA0C,GAAIC,QAAQ,IAAKA,QAAa,KACrE;EACH,OAAOnB,gCAAgC,CACrCgB,eAAe,CAACH,SAAS,EACzBG,eAAe,CAACX,WAAW,EAC3BW,eAAe,CAACX,WAAW,EAC3Ba,QACF,CAAC;AACH,CAAC","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ import { beforeEach, describe, expect, it, vi } from "vitest";
4
+ const addListenerMock = vi.hoisted(() => vi.fn());
5
+ vi.mock("./native", () => ({
6
+ addListener: addListenerMock
7
+ }));
8
+ const importStore = async () => {
9
+ const {
10
+ hotUpdaterStore
11
+ } = await import("./store");
12
+ return hotUpdaterStore;
13
+ };
14
+ describe("hotUpdaterStore", () => {
15
+ beforeEach(() => {
16
+ vi.resetModules();
17
+ addListenerMock.mockReset();
18
+ });
19
+ it("does not notify subscribers when state values are unchanged", async () => {
20
+ const store = await importStore();
21
+ const listener = vi.fn();
22
+ const unsubscribe = store.subscribe(listener);
23
+ store.setState({});
24
+ store.setState({
25
+ progress: 0
26
+ });
27
+ store.setState({
28
+ isUpdateDownloaded: false
29
+ });
30
+ expect(listener).not.toHaveBeenCalled();
31
+ unsubscribe();
32
+ });
33
+ it("notifies subscribers only when progress events change the snapshot", async () => {
34
+ const store = await importStore();
35
+ const listener = vi.fn();
36
+ const progressListener = addListenerMock.mock.calls[0][1];
37
+ const unsubscribe = store.subscribe(listener);
38
+ progressListener({
39
+ progress: 0.5
40
+ });
41
+ progressListener({
42
+ progress: 0.5
43
+ });
44
+ progressListener({
45
+ progress: 1
46
+ });
47
+ store.setState({
48
+ isUpdateDownloaded: true
49
+ });
50
+ expect(listener).toHaveBeenCalledTimes(2);
51
+ expect(store.getSnapshot()).toEqual({
52
+ isUpdateDownloaded: true,
53
+ progress: 1
54
+ });
55
+ unsubscribe();
56
+ });
57
+ });
58
+ //# sourceMappingURL=store.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["beforeEach","describe","expect","it","vi","addListenerMock","hoisted","fn","mock","addListener","importStore","hotUpdaterStore","resetModules","mockReset","store","listener","unsubscribe","subscribe","setState","progress","isUpdateDownloaded","not","toHaveBeenCalled","progressListener","calls","toHaveBeenCalledTimes","getSnapshot","toEqual"],"sourceRoot":"../../src","sources":["store.spec.ts"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,QAAQ;AAE7D,MAAMC,eAAe,GAAGD,EAAE,CAACE,OAAO,CAAC,MAAMF,EAAE,CAACG,EAAE,CAAC,CAAC,CAAC;AAEjDH,EAAE,CAACI,IAAI,CAAC,UAAU,EAAE,OAAO;EACzBC,WAAW,EAAEJ;AACf,CAAC,CAAC,CAAC;AAEH,MAAMK,WAAW,GAAG,MAAAA,CAAA,KAAY;EAC9B,MAAM;IAAEC;EAAgB,CAAC,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;EACnD,OAAOA,eAAe;AACxB,CAAC;AAEDV,QAAQ,CAAC,iBAAiB,EAAE,MAAM;EAChCD,UAAU,CAAC,MAAM;IACfI,EAAE,CAACQ,YAAY,CAAC,CAAC;IACjBP,eAAe,CAACQ,SAAS,CAAC,CAAC;EAC7B,CAAC,CAAC;EAEFV,EAAE,CAAC,6DAA6D,EAAE,YAAY;IAC5E,MAAMW,KAAK,GAAG,MAAMJ,WAAW,CAAC,CAAC;IACjC,MAAMK,QAAQ,GAAGX,EAAE,CAACG,EAAE,CAAC,CAAC;IAExB,MAAMS,WAAW,GAAGF,KAAK,CAACG,SAAS,CAACF,QAAQ,CAAC;IAE7CD,KAAK,CAACI,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClBJ,KAAK,CAACI,QAAQ,CAAC;MAAEC,QAAQ,EAAE;IAAE,CAAC,CAAC;IAC/BL,KAAK,CAACI,QAAQ,CAAC;MAAEE,kBAAkB,EAAE;IAAM,CAAC,CAAC;IAE7ClB,MAAM,CAACa,QAAQ,CAAC,CAACM,GAAG,CAACC,gBAAgB,CAAC,CAAC;IAEvCN,WAAW,CAAC,CAAC;EACf,CAAC,CAAC;EAEFb,EAAE,CAAC,oEAAoE,EAAE,YAAY;IACnF,MAAMW,KAAK,GAAG,MAAMJ,WAAW,CAAC,CAAC;IACjC,MAAMK,QAAQ,GAAGX,EAAE,CAACG,EAAE,CAAC,CAAC;IACxB,MAAMgB,gBAAgB,GAAGlB,eAAe,CAACG,IAAI,CAACgB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAE9C;IAEV,MAAMR,WAAW,GAAGF,KAAK,CAACG,SAAS,CAACF,QAAQ,CAAC;IAE7CQ,gBAAgB,CAAC;MAAEJ,QAAQ,EAAE;IAAI,CAAC,CAAC;IACnCI,gBAAgB,CAAC;MAAEJ,QAAQ,EAAE;IAAI,CAAC,CAAC;IACnCI,gBAAgB,CAAC;MAAEJ,QAAQ,EAAE;IAAE,CAAC,CAAC;IACjCL,KAAK,CAACI,QAAQ,CAAC;MAAEE,kBAAkB,EAAE;IAAK,CAAC,CAAC;IAE5ClB,MAAM,CAACa,QAAQ,CAAC,CAACU,qBAAqB,CAAC,CAAC,CAAC;IACzCvB,MAAM,CAACY,KAAK,CAACY,WAAW,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC;MAClCP,kBAAkB,EAAE,IAAI;MACxBD,QAAQ,EAAE;IACZ,CAAC,CAAC;IAEFH,WAAW,CAAC,CAAC;EACf,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAyDF,eAAO,MAAM,eAAe;;yBAnCE,OAAO,CAAC,eAAe,CAAC;0BAuBvB,MAAM,IAAI;CAYa,CAAC;AAEvD,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,eAAe,EACpD,WAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,CAA+B,MAQzE,CAAC"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAgEF,eAAO,MAAM,eAAe;;yBA1CE,OAAO,CAAC,eAAe,CAAC;0BA8BvB,MAAM,IAAI;CAYa,CAAC;AAEvD,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,eAAe,EACpD,WAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,CAA+B,MAQzE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAyDF,eAAO,MAAM,eAAe;;yBAnCE,OAAO,CAAC,eAAe,CAAC;0BAuBvB,MAAM,IAAI;CAYa,CAAC;AAEvD,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,eAAe,EACpD,WAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,CAA+B,MAQzE,CAAC"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/store.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAgEF,eAAO,MAAM,eAAe;;yBA1CE,OAAO,CAAC,eAAe,CAAC;0BA8BvB,MAAM,IAAI;CAYa,CAAC;AAEvD,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,eAAe,EACpD,WAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,CAA+B,MAQzE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hot-updater/react-native",
3
- "version": "0.30.5",
3
+ "version": "0.30.7",
4
4
  "description": "React Native OTA solution for self-hosted",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -120,14 +120,14 @@
120
120
  "react-native": "0.79.1",
121
121
  "react-native-builder-bob": "^0.40.10",
122
122
  "typescript": "^6.0.2",
123
- "hot-updater": "0.30.5"
123
+ "hot-updater": "0.30.7"
124
124
  },
125
125
  "dependencies": {
126
126
  "use-sync-external-store": "1.5.0",
127
- "@hot-updater/cli-tools": "0.30.5",
128
- "@hot-updater/core": "0.30.5",
129
- "@hot-updater/plugin-core": "0.30.5",
130
- "@hot-updater/js": "0.30.5"
127
+ "@hot-updater/cli-tools": "0.30.7",
128
+ "@hot-updater/core": "0.30.7",
129
+ "@hot-updater/js": "0.30.7",
130
+ "@hot-updater/plugin-core": "0.30.7"
131
131
  },
132
132
  "scripts": {
133
133
  "build": "bob build && tsc -p plugin/tsconfig.build.json",
@@ -5,18 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const promises_1 = require("node:fs/promises");
7
7
  const path_1 = __importDefault(require("path"));
8
- const cli_tools_1 = require("@hot-updater/cli-tools");
9
8
  const config_plugins_1 = require("expo/config-plugins");
10
- const hot_updater_1 = require("hot-updater");
11
9
  const package_json_1 = __importDefault(require("../../package.json"));
12
10
  const transformers_1 = require("./transformers");
11
+ const loadCliTools = () => import("@hot-updater/cli-tools");
12
+ const loadHotUpdater = () => import("hot-updater");
13
13
  let fingerprintCache = null;
14
14
  const getFingerprint = async () => {
15
15
  if (fingerprintCache) {
16
16
  return fingerprintCache;
17
17
  }
18
- fingerprintCache = await (0, hot_updater_1.generateFingerprints)();
19
- await (0, hot_updater_1.createFingerprintJSON)(fingerprintCache);
18
+ const { createFingerprintJSON, generateFingerprints } = await loadHotUpdater();
19
+ fingerprintCache = await generateFingerprints();
20
+ await createFingerprintJSON(fingerprintCache);
20
21
  return fingerprintCache;
21
22
  };
22
23
  /**
@@ -36,7 +37,8 @@ const getPublicKeyFromConfig = async (signingConfig) => {
36
37
  const envPrivateKey = process.env.HOT_UPDATER_PRIVATE_KEY;
37
38
  if (envPrivateKey) {
38
39
  try {
39
- const publicKeyPEM = (0, hot_updater_1.getPublicKeyFromPrivate)(envPrivateKey);
40
+ const { getPublicKeyFromPrivate } = await loadHotUpdater();
41
+ const publicKeyPEM = getPublicKeyFromPrivate(envPrivateKey);
40
42
  console.log("[hot-updater] Using public key extracted from HOT_UPDATER_PRIVATE_KEY environment variable");
41
43
  return publicKeyPEM.trim();
42
44
  }
@@ -59,8 +61,9 @@ const getPublicKeyFromConfig = async (signingConfig) => {
59
61
  const publicKeyPath = privateKeyPath.replace(/private-key\.pem$/, "public-key.pem");
60
62
  try {
61
63
  // Priority 2: Private key file (existing method)
62
- const privateKeyPEM = await (0, hot_updater_1.loadPrivateKey)(privateKeyPath);
63
- const publicKeyPEM = (0, hot_updater_1.getPublicKeyFromPrivate)(privateKeyPEM);
64
+ const { getPublicKeyFromPrivate, loadPrivateKey } = await loadHotUpdater();
65
+ const privateKeyPEM = await loadPrivateKey(privateKeyPath);
66
+ const publicKeyPEM = getPublicKeyFromPrivate(privateKeyPEM);
64
67
  console.log(`[hot-updater] Extracted public key from ${privateKeyPath}`);
65
68
  return publicKeyPEM.trim();
66
69
  }
@@ -118,7 +121,8 @@ const withHotUpdaterConfigAsync = (props) => (config) => {
118
121
  // === iOS: Add channel and fingerprint to Info.plist ===
119
122
  modifiedConfig = (0, config_plugins_1.withInfoPlist)(modifiedConfig, async (cfg) => {
120
123
  let fingerprintHash = null;
121
- const config = await (0, cli_tools_1.loadConfig)(null);
124
+ const { loadConfig } = await loadCliTools();
125
+ const config = await loadConfig(null);
122
126
  if (config.updateStrategy !== "appVersion") {
123
127
  const fingerprint = await getFingerprint();
124
128
  fingerprintHash = fingerprint.ios.hash;
@@ -137,7 +141,8 @@ const withHotUpdaterConfigAsync = (props) => (config) => {
137
141
  // === Android: Add channel and fingerprint to strings.xml ===
138
142
  modifiedConfig = (0, config_plugins_1.withStringsXml)(modifiedConfig, async (cfg) => {
139
143
  let fingerprintHash = null;
140
- const config = await (0, cli_tools_1.loadConfig)(null);
144
+ const { loadConfig } = await loadCliTools();
145
+ const config = await loadConfig(null);
141
146
  if (config.updateStrategy !== "appVersion") {
142
147
  const fingerprint = await getFingerprint();
143
148
  fingerprintHash = fingerprint.android.hash;
@@ -0,0 +1,57 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+
3
+ const addListenerMock = vi.hoisted(() => vi.fn());
4
+
5
+ vi.mock("./native", () => ({
6
+ addListener: addListenerMock,
7
+ }));
8
+
9
+ const importStore = async () => {
10
+ const { hotUpdaterStore } = await import("./store");
11
+ return hotUpdaterStore;
12
+ };
13
+
14
+ describe("hotUpdaterStore", () => {
15
+ beforeEach(() => {
16
+ vi.resetModules();
17
+ addListenerMock.mockReset();
18
+ });
19
+
20
+ it("does not notify subscribers when state values are unchanged", async () => {
21
+ const store = await importStore();
22
+ const listener = vi.fn();
23
+
24
+ const unsubscribe = store.subscribe(listener);
25
+
26
+ store.setState({});
27
+ store.setState({ progress: 0 });
28
+ store.setState({ isUpdateDownloaded: false });
29
+
30
+ expect(listener).not.toHaveBeenCalled();
31
+
32
+ unsubscribe();
33
+ });
34
+
35
+ it("notifies subscribers only when progress events change the snapshot", async () => {
36
+ const store = await importStore();
37
+ const listener = vi.fn();
38
+ const progressListener = addListenerMock.mock.calls[0][1] as (state: {
39
+ progress: number;
40
+ }) => void;
41
+
42
+ const unsubscribe = store.subscribe(listener);
43
+
44
+ progressListener({ progress: 0.5 });
45
+ progressListener({ progress: 0.5 });
46
+ progressListener({ progress: 1 });
47
+ store.setState({ isUpdateDownloaded: true });
48
+
49
+ expect(listener).toHaveBeenCalledTimes(2);
50
+ expect(store.getSnapshot()).toEqual({
51
+ isUpdateDownloaded: true,
52
+ progress: 1,
53
+ });
54
+
55
+ unsubscribe();
56
+ });
57
+ });
package/src/store.ts CHANGED
@@ -46,6 +46,13 @@ const createHotUpdaterStore = () => {
46
46
  nextState.isUpdateDownloaded = newState.isUpdateDownloaded;
47
47
  }
48
48
 
49
+ if (
50
+ state.progress === nextState.progress &&
51
+ state.isUpdateDownloaded === nextState.isUpdateDownloaded
52
+ ) {
53
+ return;
54
+ }
55
+
49
56
  state = nextState;
50
57
  emitChange();
51
58
  };