@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.
- package/lib/commonjs/store.js +3 -0
- package/lib/commonjs/store.js.map +1 -1
- package/lib/commonjs/store.spec.js +59 -0
- package/lib/commonjs/store.spec.js.map +1 -0
- package/lib/module/store.js +3 -0
- package/lib/module/store.js.map +1 -1
- package/lib/module/store.spec.js +58 -0
- package/lib/module/store.spec.js.map +1 -0
- package/lib/typescript/commonjs/store.d.ts.map +1 -1
- package/lib/typescript/module/store.d.ts.map +1 -1
- package/package.json +6 -6
- package/plugin/build/withHotUpdater.js +14 -9
- package/src/store.spec.ts +57 -0
- package/src/store.ts +7 -0
package/lib/commonjs/store.js
CHANGED
|
@@ -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":[]}
|
package/lib/module/store.js
CHANGED
|
@@ -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
|
};
|
package/lib/module/store.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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.
|
|
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.
|
|
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.
|
|
128
|
-
"@hot-updater/core": "0.30.
|
|
129
|
-
"@hot-updater/
|
|
130
|
-
"@hot-updater/
|
|
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
|
-
|
|
19
|
-
await (
|
|
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
|
|
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
|
|
63
|
-
const
|
|
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
|
|
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
|
|
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
|
};
|