@ledgerhq/dmk-ledger-wallet 0.0.0-develop-20260706002934 → 0.0.0-develop-20260707161641
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/cjs/api/device-action/OsUpdate/Backup/CreateBackupDeviceAction.test.js +1 -1
- package/lib/cjs/api/device-action/OsUpdate/Backup/CreateBackupDeviceAction.test.js.map +2 -2
- package/lib/cjs/api/device-action/OsUpdate/Backup/types.js.map +2 -2
- package/lib/cjs/package.json +1 -1
- package/lib/esm/api/device-action/OsUpdate/Backup/CreateBackupDeviceAction.test.js +1 -1
- package/lib/esm/api/device-action/OsUpdate/Backup/CreateBackupDeviceAction.test.js.map +2 -2
- package/lib/esm/api/device-action/OsUpdate/Backup/types.js.map +2 -2
- package/lib/esm/package.json +1 -1
- package/lib/types/api/device-action/OsUpdate/Backup/types.d.ts +2 -2
- package/lib/types/api/device-action/OsUpdate/Backup/types.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var s=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),I=require("xstate"),i=require("../../../device-action/__test-utils__/makeInternalApi"),d=require("../../../device-action/__test-utils__/testDeviceActionStates"),E=require("../../../device-action/OsUpdate/Backup/CreateBackupDeviceAction"),f=require("../../../device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors"),V=require("../../../device-action/OsUpdate/Backup/Substeps/BackupAppsStorage"),B=require("../../../device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen"),F=require("../../../device-action/OsUpdate/Backup/Substeps/GetIsOnboarded"),h=require("../../../device-action/OsUpdate/Backup/Substeps/GetLanguageId"),G=require("../../../device-action/OsUpdate/Backup/Substeps/GoToDashboard"),b=require("../../../device-action/OsUpdate/Backup/Substeps/ListInstalledApps"),C=require("../../../device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion"),e=require("../../../device-action/OsUpdate/Backup/types");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage");const t=p=>({status:s.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:s.UserInteractionRequired.None,step:p}}),w=p=>({status:s.DeviceActionStatus.Completed,output:{...p,createdAt:expect.any(Date)}}),L=p=>({status:s.DeviceActionStatus.Error,error:p}),R=p=>(0,I.createMachine)({initial:"ready",states:{ready:{after:{0:"done"},entry:(0,I.assign)({intermediateValue:()=>({requiredUserInteraction:s.UserInteractionRequired.None})})},done:{type:"final"}},output:p}),S=p=>R(()=>p);describe("BackupDeviceAction",()=>{const{getDeviceModel:p}=(0,i.makeDeviceActionInternalApiMock)();beforeEach(()=>{vi.resetAllMocks()});const A=(o="BOLOS")=>vi.mocked(C.waitForAppAndVersion).mockReturnValue(S((0,r.Right)({name:o,version:"1.0.0"}))),T=o=>{const n=[...o];vi.mocked(C.waitForAppAndVersion).mockReturnValue(R(()=>(0,r.Right)({name:n.shift()??"BOLOS",version:"1.0.0"})))},c=()=>vi.mocked(G.goToDashboard).mockReturnValue(S((0,r.Right)(void 0))),u=(o=!0)=>vi.mocked(F.getIsOnboarded).mockReturnValue(()=>Promise.resolve((0,r.Right)(o))),m=()=>vi.mocked(h.getLanguageId).mockReturnValue(()=>Promise.resolve((0,r.Right)(1))),k=()=>vi.mocked(b.listInstalledApps).mockReturnValue(S((0,r.Right)({installedApps:[{name:"TestApp",hash:"abc",hash_code_data:"code",flags:0}]}))),v=()=>vi.mocked(V.backupAppsStorage).mockReturnValue(()=>Promise.resolve((0,r.Right)([{appName:"TestApp",data:"
|
|
1
|
+
"use strict";var s=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),I=require("xstate"),i=require("../../../device-action/__test-utils__/makeInternalApi"),d=require("../../../device-action/__test-utils__/testDeviceActionStates"),E=require("../../../device-action/OsUpdate/Backup/CreateBackupDeviceAction"),f=require("../../../device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors"),V=require("../../../device-action/OsUpdate/Backup/Substeps/BackupAppsStorage"),B=require("../../../device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen"),F=require("../../../device-action/OsUpdate/Backup/Substeps/GetIsOnboarded"),h=require("../../../device-action/OsUpdate/Backup/Substeps/GetLanguageId"),G=require("../../../device-action/OsUpdate/Backup/Substeps/GoToDashboard"),b=require("../../../device-action/OsUpdate/Backup/Substeps/ListInstalledApps"),C=require("../../../device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion"),e=require("../../../device-action/OsUpdate/Backup/types");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage");const t=p=>({status:s.DeviceActionStatus.Pending,intermediateValue:{requiredUserInteraction:s.UserInteractionRequired.None,step:p}}),w=p=>({status:s.DeviceActionStatus.Completed,output:{...p,createdAt:expect.any(Date)}}),L=p=>({status:s.DeviceActionStatus.Error,error:p}),R=p=>(0,I.createMachine)({initial:"ready",states:{ready:{after:{0:"done"},entry:(0,I.assign)({intermediateValue:()=>({requiredUserInteraction:s.UserInteractionRequired.None})})},done:{type:"final"}},output:p}),S=p=>R(()=>p);describe("BackupDeviceAction",()=>{const{getDeviceModel:p}=(0,i.makeDeviceActionInternalApiMock)();beforeEach(()=>{vi.resetAllMocks()});const A=(o="BOLOS")=>vi.mocked(C.waitForAppAndVersion).mockReturnValue(S((0,r.Right)({name:o,version:"1.0.0"}))),T=o=>{const n=[...o];vi.mocked(C.waitForAppAndVersion).mockReturnValue(R(()=>(0,r.Right)({name:n.shift()??"BOLOS",version:"1.0.0"})))},c=()=>vi.mocked(G.goToDashboard).mockReturnValue(S((0,r.Right)(void 0))),u=(o=!0)=>vi.mocked(F.getIsOnboarded).mockReturnValue(()=>Promise.resolve((0,r.Right)(o))),m=()=>vi.mocked(h.getLanguageId).mockReturnValue(()=>Promise.resolve((0,r.Right)(1))),k=()=>vi.mocked(b.listInstalledApps).mockReturnValue(S((0,r.Right)({installedApps:[{name:"TestApp",hash:"abc",hash_code_data:"code",flags:0}]}))),v=()=>vi.mocked(V.backupAppsStorage).mockReturnValue(()=>Promise.resolve((0,r.Right)([{appName:"TestApp",data:"0xappData"}]))),D=()=>vi.mocked(B.downloadCustomLockScreenDevice).mockReturnValue(S((0,r.Right)({imageData:new Uint8Array([1,2]),imageHash:"0102"}))),O=()=>p.mockReturnValue({id:s.DeviceModelId.STAX}),y=()=>p.mockReturnValue({id:s.DeviceModelId.NANO_X}),l=()=>new E.CreateBackupDeviceAction({input:{unlockTimeout:3e4}});describe("Success",()=>{it("should complete the full backup flow for a CLS-supported device",()=>new Promise((o,n)=>{A(),c(),u(),m(),k(),v(),D(),O();const a=[t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.GetIsOnboarded),t(e.CreateBackupSteps.GetLanguage),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.BackupAppsStorage),t(e.CreateBackupSteps.DownloadCustomLockScreen),t(e.CreateBackupSteps.DownloadCustomLockScreen),w({languageId:1,installedApps:[{appName:"TestApp",data:"0xappData"}],clsHexImage:"0x0102"})];(0,d.testDeviceActionStates)(l(),a,(0,i.makeDeviceActionInternalApiMock)(),{onDone:o,onError:n})})),it("should skip ListInstalledApps and DownloadCustomLockScreen when device is unseeded",()=>new Promise((o,n)=>{A(),c(),u(!1),m(),k(),v(),D();const a=[t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.GetIsOnboarded),t(e.CreateBackupSteps.GetLanguage),w({languageId:1,installedApps:[],clsHexImage:void 0})];(0,d.testDeviceActionStates)(l(),a,(0,i.makeDeviceActionInternalApiMock)(),{onDone:o,onError:n})})),it("should skip DownloadCustomLockScreen for devices that do not support CLS",()=>new Promise((o,n)=>{A(),c(),u(),m(),k(),v(),D(),y();const a=[t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.GetIsOnboarded),t(e.CreateBackupSteps.GetLanguage),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.BackupAppsStorage),w({languageId:1,installedApps:[{appName:"TestApp",data:"0xappData"}],clsHexImage:void 0})];(0,d.testDeviceActionStates)(l(),a,(0,i.makeDeviceActionInternalApiMock)(),{onDone:o,onError:n})})),it("should go to dashboard and wait for app and version again when an app is open",()=>new Promise((o,n)=>{T(["Bitcoin","BOLOS"]),c(),u(),m(),k(),v(),D(),y();const a=[t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.GoToDashboard),t(e.CreateBackupSteps.GoToDashboard),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.GetIsOnboarded),t(e.CreateBackupSteps.GetLanguage),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.BackupAppsStorage),w({languageId:1,installedApps:[{appName:"TestApp",data:"0xappData"}],clsHexImage:void 0})];(0,d.testDeviceActionStates)(l(),a,(0,i.makeDeviceActionInternalApiMock)(),{onDone:o,onError:n})}))}),describe("Error",()=>{it("should go to Error when getLanguageId returns Left",()=>new Promise((o,n)=>{A(),c(),u(),k();const a=new f.GetLanguageIdError(new Error("command failed"));vi.mocked(h.getLanguageId).mockReturnValue(()=>Promise.resolve((0,r.Left)(a)));const g=[t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.GetIsOnboarded),t(e.CreateBackupSteps.GetLanguage),L(a)];(0,d.testDeviceActionStates)(l(),g,(0,i.makeDeviceActionInternalApiMock)(),{onDone:o,onError:n})})),it("should go to Error when listInstalledApps returns Left",()=>new Promise((o,n)=>{A(),c(),u(),m();const a=new s.UnknownDAError("listInstalledApps failed");vi.mocked(b.listInstalledApps).mockReturnValue(S((0,r.Left)(a)));const g=[t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.GetIsOnboarded),t(e.CreateBackupSteps.GetLanguage),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.ListInstalledApps),L(a)];(0,d.testDeviceActionStates)(l(),g,(0,i.makeDeviceActionInternalApiMock)(),{onDone:o,onError:n})})),it("should go to Error when backupAppsStorage returns Left",()=>new Promise((o,n)=>{A(),c(),u(),m(),k(),D();const a=new f.BackupAppsStorageError(new Error("storage failed"));vi.mocked(V.backupAppsStorage).mockReturnValue(()=>Promise.resolve((0,r.Left)(a)));const g=[t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.GetIsOnboarded),t(e.CreateBackupSteps.GetLanguage),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.BackupAppsStorage),L(a)];(0,d.testDeviceActionStates)(l(),g,(0,i.makeDeviceActionInternalApiMock)(),{onDone:o,onError:n})})),it("should go to Error when downloadCustomLockScreenDevice returns Left",()=>new Promise((o,n)=>{A(),c(),u(),m(),k(),v(),O();const a=new s.UnknownDAError("downloadCLS failed");vi.mocked(B.downloadCustomLockScreenDevice).mockReturnValue(S((0,r.Left)(a)));const g=[t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.WaitForAppAndVersion),t(e.CreateBackupSteps.GetIsOnboarded),t(e.CreateBackupSteps.GetLanguage),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.ListInstalledApps),t(e.CreateBackupSteps.BackupAppsStorage),t(e.CreateBackupSteps.DownloadCustomLockScreen),t(e.CreateBackupSteps.DownloadCustomLockScreen),L(a)];(0,d.testDeviceActionStates)(l(),g,(0,i.makeDeviceActionInternalApiMock)(),{onDone:o,onError:n})}))})});
|
|
2
2
|
//# sourceMappingURL=CreateBackupDeviceAction.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/OsUpdate/Backup/CreateBackupDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n DeviceActionStatus,\n DeviceModelId,\n type TransportDeviceModel,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { assign, createMachine } from \"xstate\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { CreateBackupDeviceAction } from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceAction\";\nimport {\n BackupAppsStorageError,\n GetLanguageIdError,\n} from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors\";\nimport { backupAppsStorage } from \"@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage\";\nimport { downloadCustomLockScreenDevice } from \"@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen\";\nimport { getIsOnboarded } from \"@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded\";\nimport { getLanguageId } from \"@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId\";\nimport { goToDashboard } from \"@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard\";\nimport { listInstalledApps } from \"@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps\";\nimport { waitForAppAndVersion } from \"@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion\";\nimport {\n type Backup,\n type CreateBackupDAError,\n type CreateBackupDAState,\n CreateBackupSteps,\n} from \"@api/device-action/OsUpdate/Backup/types\";\n\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage\");\n\n// \u2500\u2500\u2500 State builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst pendingState = (step: CreateBackupSteps): CreateBackupDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n },\n});\n\nconst completedState = (\n output: Omit<Backup, \"createdAt\">,\n): CreateBackupDAState => ({\n status: DeviceActionStatus.Completed,\n output: {\n ...output,\n createdAt: expect.any(Date) as Date,\n },\n});\n\nconst errorState = (error: CreateBackupDAError): CreateBackupDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\n\n// \u2500\u2500\u2500 Mock actor factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Creates a minimal XState machine that immediately completes (after 0 ms) with\n// the given Either output. The machine exposes the `intermediateValue` shape\n// required by the parent's `onSnapshot` handler.\n\nconst createMockActorMachineFromOutput = (\n output: () => Either<unknown, unknown>,\n) =>\n createMachine({\n initial: \"ready\",\n states: {\n ready: {\n after: { 0: \"done\" },\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n },\n done: { type: \"final\" },\n },\n output,\n });\n\nconst createMockActorMachine = (output: Either<unknown, unknown>) =>\n createMockActorMachineFromOutput(() => output);\n\n// \u2500\u2500\u2500 Fixtures \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// \u2500\u2500\u2500 Tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndescribe(\"BackupDeviceAction\", () => {\n const { getDeviceModel: getDeviceModelMock } =\n makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n // \u2500\u2500\u2500 Setup helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const setupWaitForAppAndVersion = (appName = \"BOLOS\") =>\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachine(\n Right({\n name: appName,\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n\n const setupWaitForAppAndVersionSequence = (appNames: string[]) => {\n const remainingAppNames = [...appNames];\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachineFromOutput(() =>\n Right({\n name: remainingAppNames.shift() ?? \"BOLOS\",\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n };\n\n const setupGoToDashboard = () =>\n vi\n .mocked(goToDashboard)\n .mockReturnValue(\n createMockActorMachine(Right(undefined)) as unknown as ReturnType<\n typeof goToDashboard\n >,\n );\n\n const setupGetIsOnboarded = (isDeviceOnboarded = true) =>\n vi\n .mocked(getIsOnboarded)\n .mockReturnValue(() => Promise.resolve(Right(isDeviceOnboarded)));\n\n const setupGetLanguageId = () =>\n vi.mocked(getLanguageId).mockReturnValue(() => Promise.resolve(Right(1)));\n\n const setupListInstalledApps = () =>\n vi.mocked(listInstalledApps).mockReturnValue(\n createMockActorMachine(\n Right({\n installedApps: [\n { name: \"TestApp\", hash: \"abc\", hash_code_data: \"code\", flags: 0 },\n ],\n }),\n ) as unknown as ReturnType<typeof listInstalledApps>,\n );\n\n const setupBackupAppsStorage = () =>\n vi\n .mocked(backupAppsStorage)\n .mockReturnValue(() =>\n Promise.resolve(Right([{ appName: \"TestApp\", data: \"appData\" }])),\n );\n\n const setupDownloadCls = () =>\n vi\n .mocked(downloadCustomLockScreenDevice)\n .mockReturnValue(\n createMockActorMachine(\n Right({ imageData: new Uint8Array([0x01, 0x02]), imageHash: \"0102\" }),\n ) as unknown as ReturnType<typeof downloadCustomLockScreenDevice>,\n );\n\n const setupStaxModel = () =>\n getDeviceModelMock.mockReturnValue({\n id: DeviceModelId.STAX,\n } as TransportDeviceModel);\n\n const setupNanoXModel = () =>\n getDeviceModelMock.mockReturnValue({\n id: DeviceModelId.NANO_X,\n } as TransportDeviceModel);\n\n const makeDeviceAction = () =>\n new CreateBackupDeviceAction({\n input: {\n unlockTimeout: 30_000,\n },\n });\n\n // \u2500\u2500\u2500 Success \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Success\", () => {\n it(\"should complete the full backup flow for a CLS-supported device\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls();\n setupStaxModel();\n\n // State transitions:\n // GetLanguage \u2192 ListInstalledApps (\u00D72: enter + onSnapshot)\n // \u2192 BackupAppsStorage \u2192 DownloadCustomLockScreen (\u00D72: enter + onSnapshot) \u2192 Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"appData\" }],\n clsHexImage: \"0x0102\",\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip ListInstalledApps and DownloadCustomLockScreen when device is unseeded\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded(false);\n setupGetLanguageId();\n setupListInstalledApps(); // registered in actors but never invoked (always guard fires first)\n setupBackupAppsStorage(); // registered in actors but never invoked\n setupDownloadCls(); // registered in actors but never invoked\n\n // CheckIfDeviceIsOnboarded.isDeviceOnboarded false \u2192 jumps directly to Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n completedState({\n languageId: 1,\n installedApps: [],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip DownloadCustomLockScreen for devices that do not support CLS\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls(); // registered in actors but never invoked (always guard fires first)\n setupNanoXModel();\n\n // CheckIfDeviceSupportCustomLockScreenFeature.isCustomLockScreenFeatureSupported false \u2192 Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"appData\" }],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to dashboard and wait for app and version again when an app is open\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersionSequence([\"Bitcoin\", \"BOLOS\"]);\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls(); // registered in actors but never invoked (always guard fires first)\n setupNanoXModel();\n\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GoToDashboard),\n pendingState(CreateBackupSteps.GoToDashboard),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"appData\" }],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n\n // \u2500\u2500\u2500 Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Error\", () => {\n it(\"should go to Error when getLanguageId returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupListInstalledApps(); // registered in actors but never invoked (always hasError guard fires first)\n const error = new GetLanguageIdError(new Error(\"command failed\"));\n vi.mocked(getLanguageId).mockReturnValue(() =>\n Promise.resolve(Left(error)),\n );\n\n // getLanguageId Left \u2192 CheckIfDeviceIsOnboarded.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when listInstalledApps returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n const error = new UnknownDAError(\"listInstalledApps failed\");\n vi.mocked(listInstalledApps).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof listInstalledApps\n >,\n );\n\n // listInstalledApps Left \u2192 BackupAppsStorage.always hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when backupAppsStorage returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupDownloadCls(); // registered in actors but never invoked (always hasError guard fires first)\n const error = new BackupAppsStorageError(new Error(\"storage failed\"));\n vi.mocked(backupAppsStorage).mockReturnValue(() =>\n Promise.resolve(Left(error)),\n );\n\n // backupAppsStorage Left \u2192 CheckIfDeviceSupportCustomLockScreenFeature.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when downloadCustomLockScreenDevice returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupStaxModel();\n const error = new UnknownDAError(\"downloadCLS failed\");\n vi.mocked(downloadCustomLockScreenDevice).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof downloadCustomLockScreenDevice\n >,\n );\n\n // downloadCustomLockScreen Left \u2192 CheckDownloadCustomLockScreen.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n});\n"],
|
|
5
|
-
"mappings": "aAAA,IAAAA,EAMO,2CACPC,EAAyC,qBACzCC,EAAsC,kBAEtCC,EAAgD,6DAChDC,EAAuC,oEACvCC,EAAyC,uEACzCC,EAGO,6EACPC,EAAkC,yEAClCC,EAA+C,gFAC/CC,EAA+B,sEAC/BC,EAA8B,qEAC9BC,EAA8B,qEAC9BC,EAAkC,yEAClCC,EAAqC,4EACrCC,EAKO,oDAEP,GAAG,KAAK,2DAA2D,EACnE,GAAG,KAAK,4DAA4D,EACpE,GAAG,KAAK,2DAA2D,EACnE,GAAG,KAAK,+DAA+D,EACvE,GAAG,KAAK,kEAAkE,EAC1E,GAAG,KAAK,sEAAsE,EAC9E,GAAG,KAAK,+DAA+D,EAIvE,MAAMC,EAAgBC,IAAkD,CACtE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAAA,CACF,CACF,GAEMC,EACJC,IACyB,CACzB,OAAQ,qBAAmB,UAC3B,OAAQ,CACN,GAAGA,EACH,UAAW,OAAO,IAAI,IAAI,CAC5B,CACF,GAEMC,EAAcC,IAAqD,CACvE,OAAQ,qBAAmB,MAC3B,MAAAA,CACF,GAQMC,EACJH,MAEA,iBAAc,CACZ,QAAS,QACT,OAAQ,CACN,MAAO,CACL,MAAO,CAAE,EAAG,MAAO,EACnB,SAAO,UAAO,CACZ,kBAAmB,KAAO,CACxB,wBAAyB,0BAAwB,IACnD,EACF,CAAC,CACH,EACA,KAAM,CAAE,KAAM,OAAQ,CACxB,EACA,OAAAA,CACF,CAAC,EAEGI,EAA0BJ,GAC9BG,EAAiC,IAAMH,CAAM,EAM/C,SAAS,qBAAsB,IAAM,CACnC,KAAM,CAAE,eAAgBK,CAAmB,KACzC,mCAAgC,EAElC,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAID,MAAMC,EAA4B,CAACC,EAAU,UAC3C,GAAG,OAAO,sBAAoB,EAAE,gBAC9BH,KACE,SAAM,CACJ,KAAMG,EACN,QAAS,OACX,CAAC,CACH,CACF,EAEIC,EAAqCC,GAAuB,CAChE,MAAMC,EAAoB,CAAC,GAAGD,CAAQ,EACtC,GAAG,OAAO,sBAAoB,EAAE,gBAC9BN,EAAiC,OAC/B,SAAM,CACJ,KAAMO,EAAkB,MAAM,GAAK,QACnC,QAAS,OACX,CAAC,CACH,CACF,CACF,EAEMC,EAAqB,IACzB,GACG,OAAO,eAAa,EACpB,gBACCP,KAAuB,SAAM,MAAS,CAAC,CAGzC,EAEEQ,EAAsB,CAACC,EAAoB,KAC/C,GACG,OAAO,gBAAc,EACrB,gBAAgB,IAAM,QAAQ,WAAQ,SAAMA,CAAiB,CAAC,CAAC,EAE9DC,EAAqB,IACzB,GAAG,OAAO,eAAa,EAAE,gBAAgB,IAAM,QAAQ,WAAQ,SAAM,CAAC,CAAC,CAAC,EAEpEC,EAAyB,IAC7B,GAAG,OAAO,mBAAiB,EAAE,gBAC3BX,KACE,SAAM,CACJ,cAAe,CACb,CAAE,KAAM,UAAW,KAAM,MAAO,eAAgB,OAAQ,MAAO,CAAE,CACnE,CACF,CAAC,CACH,CACF,EAEIY,EAAyB,IAC7B,GACG,OAAO,mBAAiB,EACxB,gBAAgB,IACf,QAAQ,WAAQ,SAAM,CAAC,CAAE,QAAS,UAAW,KAAM,
|
|
4
|
+
"sourcesContent": ["import {\n DeviceActionStatus,\n DeviceModelId,\n type TransportDeviceModel,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { assign, createMachine } from \"xstate\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { CreateBackupDeviceAction } from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceAction\";\nimport {\n BackupAppsStorageError,\n GetLanguageIdError,\n} from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors\";\nimport { backupAppsStorage } from \"@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage\";\nimport { downloadCustomLockScreenDevice } from \"@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen\";\nimport { getIsOnboarded } from \"@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded\";\nimport { getLanguageId } from \"@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId\";\nimport { goToDashboard } from \"@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard\";\nimport { listInstalledApps } from \"@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps\";\nimport { waitForAppAndVersion } from \"@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion\";\nimport {\n type Backup,\n type CreateBackupDAError,\n type CreateBackupDAState,\n CreateBackupSteps,\n} from \"@api/device-action/OsUpdate/Backup/types\";\n\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage\");\n\n// \u2500\u2500\u2500 State builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst pendingState = (step: CreateBackupSteps): CreateBackupDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n },\n});\n\nconst completedState = (\n output: Omit<Backup, \"createdAt\">,\n): CreateBackupDAState => ({\n status: DeviceActionStatus.Completed,\n output: {\n ...output,\n createdAt: expect.any(Date) as Date,\n },\n});\n\nconst errorState = (error: CreateBackupDAError): CreateBackupDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\n\n// \u2500\u2500\u2500 Mock actor factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Creates a minimal XState machine that immediately completes (after 0 ms) with\n// the given Either output. The machine exposes the `intermediateValue` shape\n// required by the parent's `onSnapshot` handler.\n\nconst createMockActorMachineFromOutput = (\n output: () => Either<unknown, unknown>,\n) =>\n createMachine({\n initial: \"ready\",\n states: {\n ready: {\n after: { 0: \"done\" },\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n },\n done: { type: \"final\" },\n },\n output,\n });\n\nconst createMockActorMachine = (output: Either<unknown, unknown>) =>\n createMockActorMachineFromOutput(() => output);\n\n// \u2500\u2500\u2500 Fixtures \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// \u2500\u2500\u2500 Tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndescribe(\"BackupDeviceAction\", () => {\n const { getDeviceModel: getDeviceModelMock } =\n makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n // \u2500\u2500\u2500 Setup helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const setupWaitForAppAndVersion = (appName = \"BOLOS\") =>\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachine(\n Right({\n name: appName,\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n\n const setupWaitForAppAndVersionSequence = (appNames: string[]) => {\n const remainingAppNames = [...appNames];\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachineFromOutput(() =>\n Right({\n name: remainingAppNames.shift() ?? \"BOLOS\",\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n };\n\n const setupGoToDashboard = () =>\n vi\n .mocked(goToDashboard)\n .mockReturnValue(\n createMockActorMachine(Right(undefined)) as unknown as ReturnType<\n typeof goToDashboard\n >,\n );\n\n const setupGetIsOnboarded = (isDeviceOnboarded = true) =>\n vi\n .mocked(getIsOnboarded)\n .mockReturnValue(() => Promise.resolve(Right(isDeviceOnboarded)));\n\n const setupGetLanguageId = () =>\n vi.mocked(getLanguageId).mockReturnValue(() => Promise.resolve(Right(1)));\n\n const setupListInstalledApps = () =>\n vi.mocked(listInstalledApps).mockReturnValue(\n createMockActorMachine(\n Right({\n installedApps: [\n { name: \"TestApp\", hash: \"abc\", hash_code_data: \"code\", flags: 0 },\n ],\n }),\n ) as unknown as ReturnType<typeof listInstalledApps>,\n );\n\n const setupBackupAppsStorage = () =>\n vi\n .mocked(backupAppsStorage)\n .mockReturnValue(() =>\n Promise.resolve(Right([{ appName: \"TestApp\", data: \"0xappData\" }])),\n );\n\n const setupDownloadCls = () =>\n vi\n .mocked(downloadCustomLockScreenDevice)\n .mockReturnValue(\n createMockActorMachine(\n Right({ imageData: new Uint8Array([0x01, 0x02]), imageHash: \"0102\" }),\n ) as unknown as ReturnType<typeof downloadCustomLockScreenDevice>,\n );\n\n const setupStaxModel = () =>\n getDeviceModelMock.mockReturnValue({\n id: DeviceModelId.STAX,\n } as TransportDeviceModel);\n\n const setupNanoXModel = () =>\n getDeviceModelMock.mockReturnValue({\n id: DeviceModelId.NANO_X,\n } as TransportDeviceModel);\n\n const makeDeviceAction = () =>\n new CreateBackupDeviceAction({\n input: {\n unlockTimeout: 30_000,\n },\n });\n\n // \u2500\u2500\u2500 Success \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Success\", () => {\n it(\"should complete the full backup flow for a CLS-supported device\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls();\n setupStaxModel();\n\n // State transitions:\n // GetLanguage \u2192 ListInstalledApps (\u00D72: enter + onSnapshot)\n // \u2192 BackupAppsStorage \u2192 DownloadCustomLockScreen (\u00D72: enter + onSnapshot) \u2192 Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"0xappData\" }],\n clsHexImage: \"0x0102\",\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip ListInstalledApps and DownloadCustomLockScreen when device is unseeded\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded(false);\n setupGetLanguageId();\n setupListInstalledApps(); // registered in actors but never invoked (always guard fires first)\n setupBackupAppsStorage(); // registered in actors but never invoked\n setupDownloadCls(); // registered in actors but never invoked\n\n // CheckIfDeviceIsOnboarded.isDeviceOnboarded false \u2192 jumps directly to Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n completedState({\n languageId: 1,\n installedApps: [],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip DownloadCustomLockScreen for devices that do not support CLS\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls(); // registered in actors but never invoked (always guard fires first)\n setupNanoXModel();\n\n // CheckIfDeviceSupportCustomLockScreenFeature.isCustomLockScreenFeatureSupported false \u2192 Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"0xappData\" }],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to dashboard and wait for app and version again when an app is open\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersionSequence([\"Bitcoin\", \"BOLOS\"]);\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls(); // registered in actors but never invoked (always guard fires first)\n setupNanoXModel();\n\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GoToDashboard),\n pendingState(CreateBackupSteps.GoToDashboard),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"0xappData\" }],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n\n // \u2500\u2500\u2500 Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Error\", () => {\n it(\"should go to Error when getLanguageId returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupListInstalledApps(); // registered in actors but never invoked (always hasError guard fires first)\n const error = new GetLanguageIdError(new Error(\"command failed\"));\n vi.mocked(getLanguageId).mockReturnValue(() =>\n Promise.resolve(Left(error)),\n );\n\n // getLanguageId Left \u2192 CheckIfDeviceIsOnboarded.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when listInstalledApps returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n const error = new UnknownDAError(\"listInstalledApps failed\");\n vi.mocked(listInstalledApps).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof listInstalledApps\n >,\n );\n\n // listInstalledApps Left \u2192 BackupAppsStorage.always hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when backupAppsStorage returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupDownloadCls(); // registered in actors but never invoked (always hasError guard fires first)\n const error = new BackupAppsStorageError(new Error(\"storage failed\"));\n vi.mocked(backupAppsStorage).mockReturnValue(() =>\n Promise.resolve(Left(error)),\n );\n\n // backupAppsStorage Left \u2192 CheckIfDeviceSupportCustomLockScreenFeature.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when downloadCustomLockScreenDevice returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupStaxModel();\n const error = new UnknownDAError(\"downloadCLS failed\");\n vi.mocked(downloadCustomLockScreenDevice).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof downloadCustomLockScreenDevice\n >,\n );\n\n // downloadCustomLockScreen Left \u2192 CheckDownloadCustomLockScreen.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_device_management_kit", "import_purify_ts", "import_xstate", "import_makeInternalApi", "import_testDeviceActionStates", "import_CreateBackupDeviceAction", "import_CreateBackupDeviceActionErrors", "import_BackupAppsStorage", "import_DownloadCustomLockScreen", "import_GetIsOnboarded", "import_GetLanguageId", "import_GoToDashboard", "import_ListInstalledApps", "import_WaitForAppAndVersion", "import_types", "pendingState", "step", "completedState", "output", "errorState", "error", "createMockActorMachineFromOutput", "createMockActorMachine", "getDeviceModelMock", "setupWaitForAppAndVersion", "appName", "setupWaitForAppAndVersionSequence", "appNames", "remainingAppNames", "setupGoToDashboard", "setupGetIsOnboarded", "isDeviceOnboarded", "setupGetLanguageId", "setupListInstalledApps", "setupBackupAppsStorage", "setupDownloadCls", "setupStaxModel", "setupNanoXModel", "makeDeviceAction", "resolve", "reject", "expectedStates"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/OsUpdate/Backup/types.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type DeviceActionState,\n type GoToDashboardDAError,\n type GoToDashboardDAIntermediateValue,\n type GoToDashboardDARequiredInteraction,\n type InstalledApp,\n type ListInstalledAppsDAError,\n type ListInstalledAppsDAIntermediateValue,\n type ListInstalledAppsDARequiredInteraction,\n type UserInteractionRequired,\n type WaitForAppAndVersionDAError,\n type WaitForAppAndVersionDAIntermediateValue,\n type WaitForAppAndVersionDARequiredInteraction,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n type DownloadCustomLockScreenDAError,\n type DownloadCustomLockScreenDAIntermediateValue,\n type DownloadCustomLockScreenDARequiredInteraction,\n} from \"@api/device-action/DownloadCustomLockScreen/types\";\nimport { type CreateBackupDeviceActionErrors } from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors\";\n\nexport type CreateBackupDAInput = {\n unlockTimeout: number;\n};\n\nexport type CreateBackupDAOutput = Backup;\n\nexport type CreateBackupDAError =\n | WaitForAppAndVersionDAError\n | GoToDashboardDAError\n | ListInstalledAppsDAError\n | DownloadCustomLockScreenDAError\n | CreateBackupDeviceActionErrors;\n\nexport type CreateBackupDAIntermediateValue = (\n | WaitForAppAndVersionDAIntermediateValue\n | GoToDashboardDAIntermediateValue\n | ListInstalledAppsDAIntermediateValue\n | DownloadCustomLockScreenDAIntermediateValue\n) & {\n step: CreateBackupSteps;\n};\n\nexport type CreateBackupDARequiredInteraction =\n | WaitForAppAndVersionDARequiredInteraction\n | GoToDashboardDARequiredInteraction\n | ListInstalledAppsDARequiredInteraction\n | DownloadCustomLockScreenDARequiredInteraction\n | UserInteractionRequired.None;\n\nexport type CreateBackupDAInternalState = {\n error: CreateBackupDAError | null;\n currentApp: string | null;\n isDeviceOnboarded: boolean;\n languageId: number | undefined;\n installedApps: InstalledApp[];\n backupApps: BackupApp[];\n clsHexImage: string | undefined;\n};\n\nexport type CreateBackupDAState = DeviceActionState<\n CreateBackupDAOutput,\n CreateBackupDAError,\n CreateBackupDAIntermediateValue\n>;\n\nexport enum CreateBackupSteps {\n Idle = \"idle\",\n WaitForAppAndVersion = \"waitForAppAndVersion\",\n GoToDashboard = \"goToDashboard\",\n GetIsOnboarded = \"getIsOnboarded\",\n GetLanguage = \"getLanguage\",\n ListInstalledApps = \"listInstalledApps\",\n BackupAppsStorage = \"backupAppsStorage\",\n DownloadCustomLockScreen = \"downloadCustomLockScreen\",\n}\n\nexport type BackupApp = {\n appName: string;\n data:
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceActionState,\n type GoToDashboardDAError,\n type GoToDashboardDAIntermediateValue,\n type GoToDashboardDARequiredInteraction,\n type HexaString,\n type InstalledApp,\n type ListInstalledAppsDAError,\n type ListInstalledAppsDAIntermediateValue,\n type ListInstalledAppsDARequiredInteraction,\n type UserInteractionRequired,\n type WaitForAppAndVersionDAError,\n type WaitForAppAndVersionDAIntermediateValue,\n type WaitForAppAndVersionDARequiredInteraction,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n type DownloadCustomLockScreenDAError,\n type DownloadCustomLockScreenDAIntermediateValue,\n type DownloadCustomLockScreenDARequiredInteraction,\n} from \"@api/device-action/DownloadCustomLockScreen/types\";\nimport { type CreateBackupDeviceActionErrors } from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors\";\n\nexport type CreateBackupDAInput = {\n unlockTimeout: number;\n};\n\nexport type CreateBackupDAOutput = Backup;\n\nexport type CreateBackupDAError =\n | WaitForAppAndVersionDAError\n | GoToDashboardDAError\n | ListInstalledAppsDAError\n | DownloadCustomLockScreenDAError\n | CreateBackupDeviceActionErrors;\n\nexport type CreateBackupDAIntermediateValue = (\n | WaitForAppAndVersionDAIntermediateValue\n | GoToDashboardDAIntermediateValue\n | ListInstalledAppsDAIntermediateValue\n | DownloadCustomLockScreenDAIntermediateValue\n) & {\n step: CreateBackupSteps;\n};\n\nexport type CreateBackupDARequiredInteraction =\n | WaitForAppAndVersionDARequiredInteraction\n | GoToDashboardDARequiredInteraction\n | ListInstalledAppsDARequiredInteraction\n | DownloadCustomLockScreenDARequiredInteraction\n | UserInteractionRequired.None;\n\nexport type CreateBackupDAInternalState = {\n error: CreateBackupDAError | null;\n currentApp: string | null;\n isDeviceOnboarded: boolean;\n languageId: number | undefined;\n installedApps: InstalledApp[];\n backupApps: BackupApp[];\n clsHexImage: string | undefined;\n};\n\nexport type CreateBackupDAState = DeviceActionState<\n CreateBackupDAOutput,\n CreateBackupDAError,\n CreateBackupDAIntermediateValue\n>;\n\nexport enum CreateBackupSteps {\n Idle = \"idle\",\n WaitForAppAndVersion = \"waitForAppAndVersion\",\n GoToDashboard = \"goToDashboard\",\n GetIsOnboarded = \"getIsOnboarded\",\n GetLanguage = \"getLanguage\",\n ListInstalledApps = \"listInstalledApps\",\n BackupAppsStorage = \"backupAppsStorage\",\n DownloadCustomLockScreen = \"downloadCustomLockScreen\",\n}\n\nexport type BackupApp = {\n appName: string;\n data: HexaString | undefined;\n};\n\nexport type Backup = {\n languageId: number | undefined;\n installedApps: BackupApp[];\n clsHexImage: string | undefined;\n createdAt: Date;\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,GAoEO,IAAKE,OACVA,EAAA,KAAO,OACPA,EAAA,qBAAuB,uBACvBA,EAAA,cAAgB,gBAChBA,EAAA,eAAiB,iBACjBA,EAAA,YAAc,cACdA,EAAA,kBAAoB,oBACpBA,EAAA,kBAAoB,oBACpBA,EAAA,yBAA2B,2BARjBA,OAAA",
|
|
6
6
|
"names": ["types_exports", "__export", "CreateBackupSteps", "__toCommonJS"]
|
|
7
7
|
}
|
package/lib/cjs/package.json
CHANGED
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
57
57
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
58
58
|
},
|
|
59
|
-
"version": "0.0.0-develop-
|
|
59
|
+
"version": "0.0.0-develop-20260707161641"
|
|
60
60
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DeviceActionStatus as I,DeviceModelId as B,UnknownDAError as h,UserInteractionRequired as F}from"@ledgerhq/device-management-kit";import{Left as D,Right as c}from"purify-ts";import{assign as T,createMachine as
|
|
1
|
+
import{DeviceActionStatus as I,DeviceModelId as B,UnknownDAError as h,UserInteractionRequired as F}from"@ledgerhq/device-management-kit";import{Left as D,Right as c}from"purify-ts";import{assign as T,createMachine as x}from"xstate";import{makeDeviceActionInternalApiMock as s}from"../../../device-action/__test-utils__/makeInternalApi";import{testDeviceActionStates as u}from"../../../device-action/__test-utils__/testDeviceActionStates";import{CreateBackupDeviceAction as W}from"../../../device-action/OsUpdate/Backup/CreateBackupDeviceAction";import{BackupAppsStorageError as M,GetLanguageIdError as P}from"../../../device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors";import{backupAppsStorage as b}from"../../../device-action/OsUpdate/Backup/Substeps/BackupAppsStorage";import{downloadCustomLockScreenDevice as C}from"../../../device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen";import{getIsOnboarded as U}from"../../../device-action/OsUpdate/Backup/Substeps/GetIsOnboarded";import{getLanguageId as O}from"../../../device-action/OsUpdate/Backup/Substeps/GetLanguageId";import{goToDashboard as N}from"../../../device-action/OsUpdate/Backup/Substeps/GoToDashboard";import{listInstalledApps as y}from"../../../device-action/OsUpdate/Backup/Substeps/ListInstalledApps";import{waitForAppAndVersion as E}from"../../../device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion";import{CreateBackupSteps as e}from"../../../device-action/OsUpdate/Backup/types";vi.mock("@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen");vi.mock("@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage");const t=r=>({status:I.Pending,intermediateValue:{requiredUserInteraction:F.None,step:r}}),w=r=>({status:I.Completed,output:{...r,createdAt:expect.any(Date)}}),L=r=>({status:I.Error,error:r}),G=r=>x({initial:"ready",states:{ready:{after:{0:"done"},entry:T({intermediateValue:()=>({requiredUserInteraction:F.None})})},done:{type:"final"}},output:r}),g=r=>G(()=>r);describe("BackupDeviceAction",()=>{const{getDeviceModel:r}=s();beforeEach(()=>{vi.resetAllMocks()});const l=(o="BOLOS")=>vi.mocked(E).mockReturnValue(g(c({name:o,version:"1.0.0"}))),R=o=>{const n=[...o];vi.mocked(E).mockReturnValue(G(()=>c({name:n.shift()??"BOLOS",version:"1.0.0"})))},p=()=>vi.mocked(N).mockReturnValue(g(c(void 0))),i=(o=!0)=>vi.mocked(U).mockReturnValue(()=>Promise.resolve(c(o))),A=()=>vi.mocked(O).mockReturnValue(()=>Promise.resolve(c(1))),m=()=>vi.mocked(y).mockReturnValue(g(c({installedApps:[{name:"TestApp",hash:"abc",hash_code_data:"code",flags:0}]}))),S=()=>vi.mocked(b).mockReturnValue(()=>Promise.resolve(c([{appName:"TestApp",data:"0xappData"}]))),v=()=>vi.mocked(C).mockReturnValue(g(c({imageData:new Uint8Array([1,2]),imageHash:"0102"}))),f=()=>r.mockReturnValue({id:B.STAX}),V=()=>r.mockReturnValue({id:B.NANO_X}),d=()=>new W({input:{unlockTimeout:3e4}});describe("Success",()=>{it("should complete the full backup flow for a CLS-supported device",()=>new Promise((o,n)=>{l(),p(),i(),A(),m(),S(),v(),f();const a=[t(e.WaitForAppAndVersion),t(e.WaitForAppAndVersion),t(e.GetIsOnboarded),t(e.GetLanguage),t(e.ListInstalledApps),t(e.ListInstalledApps),t(e.BackupAppsStorage),t(e.DownloadCustomLockScreen),t(e.DownloadCustomLockScreen),w({languageId:1,installedApps:[{appName:"TestApp",data:"0xappData"}],clsHexImage:"0x0102"})];u(d(),a,s(),{onDone:o,onError:n})})),it("should skip ListInstalledApps and DownloadCustomLockScreen when device is unseeded",()=>new Promise((o,n)=>{l(),p(),i(!1),A(),m(),S(),v();const a=[t(e.WaitForAppAndVersion),t(e.WaitForAppAndVersion),t(e.GetIsOnboarded),t(e.GetLanguage),w({languageId:1,installedApps:[],clsHexImage:void 0})];u(d(),a,s(),{onDone:o,onError:n})})),it("should skip DownloadCustomLockScreen for devices that do not support CLS",()=>new Promise((o,n)=>{l(),p(),i(),A(),m(),S(),v(),V();const a=[t(e.WaitForAppAndVersion),t(e.WaitForAppAndVersion),t(e.GetIsOnboarded),t(e.GetLanguage),t(e.ListInstalledApps),t(e.ListInstalledApps),t(e.BackupAppsStorage),w({languageId:1,installedApps:[{appName:"TestApp",data:"0xappData"}],clsHexImage:void 0})];u(d(),a,s(),{onDone:o,onError:n})})),it("should go to dashboard and wait for app and version again when an app is open",()=>new Promise((o,n)=>{R(["Bitcoin","BOLOS"]),p(),i(),A(),m(),S(),v(),V();const a=[t(e.WaitForAppAndVersion),t(e.WaitForAppAndVersion),t(e.GoToDashboard),t(e.GoToDashboard),t(e.WaitForAppAndVersion),t(e.WaitForAppAndVersion),t(e.GetIsOnboarded),t(e.GetLanguage),t(e.ListInstalledApps),t(e.ListInstalledApps),t(e.BackupAppsStorage),w({languageId:1,installedApps:[{appName:"TestApp",data:"0xappData"}],clsHexImage:void 0})];u(d(),a,s(),{onDone:o,onError:n})}))}),describe("Error",()=>{it("should go to Error when getLanguageId returns Left",()=>new Promise((o,n)=>{l(),p(),i(),m();const a=new P(new Error("command failed"));vi.mocked(O).mockReturnValue(()=>Promise.resolve(D(a)));const k=[t(e.WaitForAppAndVersion),t(e.WaitForAppAndVersion),t(e.GetIsOnboarded),t(e.GetLanguage),L(a)];u(d(),k,s(),{onDone:o,onError:n})})),it("should go to Error when listInstalledApps returns Left",()=>new Promise((o,n)=>{l(),p(),i(),A();const a=new h("listInstalledApps failed");vi.mocked(y).mockReturnValue(g(D(a)));const k=[t(e.WaitForAppAndVersion),t(e.WaitForAppAndVersion),t(e.GetIsOnboarded),t(e.GetLanguage),t(e.ListInstalledApps),t(e.ListInstalledApps),L(a)];u(d(),k,s(),{onDone:o,onError:n})})),it("should go to Error when backupAppsStorage returns Left",()=>new Promise((o,n)=>{l(),p(),i(),A(),m(),v();const a=new M(new Error("storage failed"));vi.mocked(b).mockReturnValue(()=>Promise.resolve(D(a)));const k=[t(e.WaitForAppAndVersion),t(e.WaitForAppAndVersion),t(e.GetIsOnboarded),t(e.GetLanguage),t(e.ListInstalledApps),t(e.ListInstalledApps),t(e.BackupAppsStorage),L(a)];u(d(),k,s(),{onDone:o,onError:n})})),it("should go to Error when downloadCustomLockScreenDevice returns Left",()=>new Promise((o,n)=>{l(),p(),i(),A(),m(),S(),f();const a=new h("downloadCLS failed");vi.mocked(C).mockReturnValue(g(D(a)));const k=[t(e.WaitForAppAndVersion),t(e.WaitForAppAndVersion),t(e.GetIsOnboarded),t(e.GetLanguage),t(e.ListInstalledApps),t(e.ListInstalledApps),t(e.BackupAppsStorage),t(e.DownloadCustomLockScreen),t(e.DownloadCustomLockScreen),L(a)];u(d(),k,s(),{onDone:o,onError:n})}))})});
|
|
2
2
|
//# sourceMappingURL=CreateBackupDeviceAction.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/OsUpdate/Backup/CreateBackupDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n DeviceActionStatus,\n DeviceModelId,\n type TransportDeviceModel,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { assign, createMachine } from \"xstate\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { CreateBackupDeviceAction } from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceAction\";\nimport {\n BackupAppsStorageError,\n GetLanguageIdError,\n} from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors\";\nimport { backupAppsStorage } from \"@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage\";\nimport { downloadCustomLockScreenDevice } from \"@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen\";\nimport { getIsOnboarded } from \"@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded\";\nimport { getLanguageId } from \"@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId\";\nimport { goToDashboard } from \"@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard\";\nimport { listInstalledApps } from \"@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps\";\nimport { waitForAppAndVersion } from \"@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion\";\nimport {\n type Backup,\n type CreateBackupDAError,\n type CreateBackupDAState,\n CreateBackupSteps,\n} from \"@api/device-action/OsUpdate/Backup/types\";\n\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage\");\n\n// \u2500\u2500\u2500 State builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst pendingState = (step: CreateBackupSteps): CreateBackupDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n },\n});\n\nconst completedState = (\n output: Omit<Backup, \"createdAt\">,\n): CreateBackupDAState => ({\n status: DeviceActionStatus.Completed,\n output: {\n ...output,\n createdAt: expect.any(Date) as Date,\n },\n});\n\nconst errorState = (error: CreateBackupDAError): CreateBackupDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\n\n// \u2500\u2500\u2500 Mock actor factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Creates a minimal XState machine that immediately completes (after 0 ms) with\n// the given Either output. The machine exposes the `intermediateValue` shape\n// required by the parent's `onSnapshot` handler.\n\nconst createMockActorMachineFromOutput = (\n output: () => Either<unknown, unknown>,\n) =>\n createMachine({\n initial: \"ready\",\n states: {\n ready: {\n after: { 0: \"done\" },\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n },\n done: { type: \"final\" },\n },\n output,\n });\n\nconst createMockActorMachine = (output: Either<unknown, unknown>) =>\n createMockActorMachineFromOutput(() => output);\n\n// \u2500\u2500\u2500 Fixtures \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// \u2500\u2500\u2500 Tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndescribe(\"BackupDeviceAction\", () => {\n const { getDeviceModel: getDeviceModelMock } =\n makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n // \u2500\u2500\u2500 Setup helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const setupWaitForAppAndVersion = (appName = \"BOLOS\") =>\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachine(\n Right({\n name: appName,\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n\n const setupWaitForAppAndVersionSequence = (appNames: string[]) => {\n const remainingAppNames = [...appNames];\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachineFromOutput(() =>\n Right({\n name: remainingAppNames.shift() ?? \"BOLOS\",\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n };\n\n const setupGoToDashboard = () =>\n vi\n .mocked(goToDashboard)\n .mockReturnValue(\n createMockActorMachine(Right(undefined)) as unknown as ReturnType<\n typeof goToDashboard\n >,\n );\n\n const setupGetIsOnboarded = (isDeviceOnboarded = true) =>\n vi\n .mocked(getIsOnboarded)\n .mockReturnValue(() => Promise.resolve(Right(isDeviceOnboarded)));\n\n const setupGetLanguageId = () =>\n vi.mocked(getLanguageId).mockReturnValue(() => Promise.resolve(Right(1)));\n\n const setupListInstalledApps = () =>\n vi.mocked(listInstalledApps).mockReturnValue(\n createMockActorMachine(\n Right({\n installedApps: [\n { name: \"TestApp\", hash: \"abc\", hash_code_data: \"code\", flags: 0 },\n ],\n }),\n ) as unknown as ReturnType<typeof listInstalledApps>,\n );\n\n const setupBackupAppsStorage = () =>\n vi\n .mocked(backupAppsStorage)\n .mockReturnValue(() =>\n Promise.resolve(Right([{ appName: \"TestApp\", data: \"appData\" }])),\n );\n\n const setupDownloadCls = () =>\n vi\n .mocked(downloadCustomLockScreenDevice)\n .mockReturnValue(\n createMockActorMachine(\n Right({ imageData: new Uint8Array([0x01, 0x02]), imageHash: \"0102\" }),\n ) as unknown as ReturnType<typeof downloadCustomLockScreenDevice>,\n );\n\n const setupStaxModel = () =>\n getDeviceModelMock.mockReturnValue({\n id: DeviceModelId.STAX,\n } as TransportDeviceModel);\n\n const setupNanoXModel = () =>\n getDeviceModelMock.mockReturnValue({\n id: DeviceModelId.NANO_X,\n } as TransportDeviceModel);\n\n const makeDeviceAction = () =>\n new CreateBackupDeviceAction({\n input: {\n unlockTimeout: 30_000,\n },\n });\n\n // \u2500\u2500\u2500 Success \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Success\", () => {\n it(\"should complete the full backup flow for a CLS-supported device\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls();\n setupStaxModel();\n\n // State transitions:\n // GetLanguage \u2192 ListInstalledApps (\u00D72: enter + onSnapshot)\n // \u2192 BackupAppsStorage \u2192 DownloadCustomLockScreen (\u00D72: enter + onSnapshot) \u2192 Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"appData\" }],\n clsHexImage: \"0x0102\",\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip ListInstalledApps and DownloadCustomLockScreen when device is unseeded\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded(false);\n setupGetLanguageId();\n setupListInstalledApps(); // registered in actors but never invoked (always guard fires first)\n setupBackupAppsStorage(); // registered in actors but never invoked\n setupDownloadCls(); // registered in actors but never invoked\n\n // CheckIfDeviceIsOnboarded.isDeviceOnboarded false \u2192 jumps directly to Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n completedState({\n languageId: 1,\n installedApps: [],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip DownloadCustomLockScreen for devices that do not support CLS\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls(); // registered in actors but never invoked (always guard fires first)\n setupNanoXModel();\n\n // CheckIfDeviceSupportCustomLockScreenFeature.isCustomLockScreenFeatureSupported false \u2192 Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"appData\" }],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to dashboard and wait for app and version again when an app is open\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersionSequence([\"Bitcoin\", \"BOLOS\"]);\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls(); // registered in actors but never invoked (always guard fires first)\n setupNanoXModel();\n\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GoToDashboard),\n pendingState(CreateBackupSteps.GoToDashboard),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"appData\" }],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n\n // \u2500\u2500\u2500 Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Error\", () => {\n it(\"should go to Error when getLanguageId returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupListInstalledApps(); // registered in actors but never invoked (always hasError guard fires first)\n const error = new GetLanguageIdError(new Error(\"command failed\"));\n vi.mocked(getLanguageId).mockReturnValue(() =>\n Promise.resolve(Left(error)),\n );\n\n // getLanguageId Left \u2192 CheckIfDeviceIsOnboarded.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when listInstalledApps returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n const error = new UnknownDAError(\"listInstalledApps failed\");\n vi.mocked(listInstalledApps).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof listInstalledApps\n >,\n );\n\n // listInstalledApps Left \u2192 BackupAppsStorage.always hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when backupAppsStorage returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupDownloadCls(); // registered in actors but never invoked (always hasError guard fires first)\n const error = new BackupAppsStorageError(new Error(\"storage failed\"));\n vi.mocked(backupAppsStorage).mockReturnValue(() =>\n Promise.resolve(Left(error)),\n );\n\n // backupAppsStorage Left \u2192 CheckIfDeviceSupportCustomLockScreenFeature.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when downloadCustomLockScreenDevice returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupStaxModel();\n const error = new UnknownDAError(\"downloadCLS failed\");\n vi.mocked(downloadCustomLockScreenDevice).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof downloadCustomLockScreenDevice\n >,\n );\n\n // downloadCustomLockScreen Left \u2192 CheckDownloadCustomLockScreen.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OACE,sBAAAA,EACA,iBAAAC,EAEA,kBAAAC,EACA,2BAAAC,MACK,kCACP,OAAsB,QAAAC,EAAM,SAAAC,MAAa,YACzC,OAAS,UAAAC,EAAQ,iBAAAC,MAAqB,SAEtC,OAAS,mCAAAC,MAAuC,oDAChD,OAAS,0BAAAC,MAA8B,2DACvC,OAAS,4BAAAC,MAAgC,8DACzC,OACE,0BAAAC,EACA,sBAAAC,MACK,oEACP,OAAS,qBAAAC,MAAyB,gEAClC,OAAS,kCAAAC,MAAsC,uEAC/C,OAAS,kBAAAC,MAAsB,6DAC/B,OAAS,iBAAAC,MAAqB,4DAC9B,OAAS,iBAAAC,MAAqB,4DAC9B,OAAS,qBAAAC,MAAyB,gEAClC,OAAS,wBAAAC,MAA4B,mEACrC,OAIE,qBAAAC,MACK,2CAEP,GAAG,KAAK,2DAA2D,EACnE,GAAG,KAAK,4DAA4D,EACpE,GAAG,KAAK,2DAA2D,EACnE,GAAG,KAAK,+DAA+D,EACvE,GAAG,KAAK,kEAAkE,EAC1E,GAAG,KAAK,sEAAsE,EAC9E,GAAG,KAAK,+DAA+D,EAIvE,MAAMC,EAAgBC,IAAkD,CACtE,OAAQtB,EAAmB,QAC3B,kBAAmB,CACjB,wBAAyBG,EAAwB,KACjD,KAAAmB,CACF,CACF,GAEMC,EACJC,IACyB,CACzB,OAAQxB,EAAmB,UAC3B,OAAQ,CACN,GAAGwB,EACH,UAAW,OAAO,IAAI,IAAI,CAC5B,CACF,GAEMC,EAAcC,IAAqD,CACvE,OAAQ1B,EAAmB,MAC3B,MAAA0B,CACF,GAQMC,EACJH,GAEAjB,EAAc,CACZ,QAAS,QACT,OAAQ,CACN,MAAO,CACL,MAAO,CAAE,EAAG,MAAO,EACnB,MAAOD,EAAO,CACZ,kBAAmB,KAAO,CACxB,wBAAyBH,EAAwB,IACnD,EACF,CAAC,CACH,EACA,KAAM,CAAE,KAAM,OAAQ,CACxB,EACA,OAAAqB,CACF,CAAC,EAEGI,EAA0BJ,GAC9BG,EAAiC,IAAMH,CAAM,EAM/C,SAAS,qBAAsB,IAAM,CACnC,KAAM,CAAE,eAAgBK,CAAmB,EACzCrB,EAAgC,EAElC,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAID,MAAMsB,EAA4B,CAACC,EAAU,UAC3C,GAAG,OAAOZ,CAAoB,EAAE,gBAC9BS,EACEvB,EAAM,CACJ,KAAM0B,EACN,QAAS,OACX,CAAC,CACH,CACF,EAEIC,EAAqCC,GAAuB,CAChE,MAAMC,EAAoB,CAAC,GAAGD,CAAQ,EACtC,GAAG,OAAOd,CAAoB,EAAE,gBAC9BQ,EAAiC,IAC/BtB,EAAM,CACJ,KAAM6B,EAAkB,MAAM,GAAK,QACnC,QAAS,OACX,CAAC,CACH,CACF,CACF,EAEMC,EAAqB,IACzB,GACG,OAAOlB,CAAa,EACpB,gBACCW,EAAuBvB,EAAM,MAAS,CAAC,CAGzC,EAEE+B,EAAsB,CAACC,EAAoB,KAC/C,GACG,OAAOtB,CAAc,EACrB,gBAAgB,IAAM,QAAQ,QAAQV,EAAMgC,CAAiB,CAAC,CAAC,EAE9DC,EAAqB,IACzB,GAAG,OAAOtB,CAAa,EAAE,gBAAgB,IAAM,QAAQ,QAAQX,EAAM,CAAC,CAAC,CAAC,EAEpEkC,EAAyB,IAC7B,GAAG,OAAOrB,CAAiB,EAAE,gBAC3BU,EACEvB,EAAM,CACJ,cAAe,CACb,CAAE,KAAM,UAAW,KAAM,MAAO,eAAgB,OAAQ,MAAO,CAAE,CACnE,CACF,CAAC,CACH,CACF,EAEImC,EAAyB,IAC7B,GACG,OAAO3B,CAAiB,EACxB,gBAAgB,IACf,QAAQ,QAAQR,EAAM,CAAC,CAAE,QAAS,UAAW,KAAM,
|
|
4
|
+
"sourcesContent": ["import {\n DeviceActionStatus,\n DeviceModelId,\n type TransportDeviceModel,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Either, Left, Right } from \"purify-ts\";\nimport { assign, createMachine } from \"xstate\";\n\nimport { makeDeviceActionInternalApiMock } from \"@api/device-action/__test-utils__/makeInternalApi\";\nimport { testDeviceActionStates } from \"@api/device-action/__test-utils__/testDeviceActionStates\";\nimport { CreateBackupDeviceAction } from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceAction\";\nimport {\n BackupAppsStorageError,\n GetLanguageIdError,\n} from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors\";\nimport { backupAppsStorage } from \"@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage\";\nimport { downloadCustomLockScreenDevice } from \"@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen\";\nimport { getIsOnboarded } from \"@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded\";\nimport { getLanguageId } from \"@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId\";\nimport { goToDashboard } from \"@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard\";\nimport { listInstalledApps } from \"@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps\";\nimport { waitForAppAndVersion } from \"@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion\";\nimport {\n type Backup,\n type CreateBackupDAError,\n type CreateBackupDAState,\n CreateBackupSteps,\n} from \"@api/device-action/OsUpdate/Backup/types\";\n\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GetLanguageId\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GetIsOnboarded\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/GoToDashboard\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/ListInstalledApps\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/WaitForAppAndVersion\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/DownloadCustomLockScreen\");\nvi.mock(\"@api/device-action/OsUpdate/Backup/Substeps/BackupAppsStorage\");\n\n// \u2500\u2500\u2500 State builders \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst pendingState = (step: CreateBackupSteps): CreateBackupDAState => ({\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step,\n },\n});\n\nconst completedState = (\n output: Omit<Backup, \"createdAt\">,\n): CreateBackupDAState => ({\n status: DeviceActionStatus.Completed,\n output: {\n ...output,\n createdAt: expect.any(Date) as Date,\n },\n});\n\nconst errorState = (error: CreateBackupDAError): CreateBackupDAState => ({\n status: DeviceActionStatus.Error,\n error,\n});\n\n// \u2500\u2500\u2500 Mock actor factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Creates a minimal XState machine that immediately completes (after 0 ms) with\n// the given Either output. The machine exposes the `intermediateValue` shape\n// required by the parent's `onSnapshot` handler.\n\nconst createMockActorMachineFromOutput = (\n output: () => Either<unknown, unknown>,\n) =>\n createMachine({\n initial: \"ready\",\n states: {\n ready: {\n after: { 0: \"done\" },\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n },\n done: { type: \"final\" },\n },\n output,\n });\n\nconst createMockActorMachine = (output: Either<unknown, unknown>) =>\n createMockActorMachineFromOutput(() => output);\n\n// \u2500\u2500\u2500 Fixtures \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// \u2500\u2500\u2500 Tests \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndescribe(\"BackupDeviceAction\", () => {\n const { getDeviceModel: getDeviceModelMock } =\n makeDeviceActionInternalApiMock();\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n // \u2500\u2500\u2500 Setup helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const setupWaitForAppAndVersion = (appName = \"BOLOS\") =>\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachine(\n Right({\n name: appName,\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n\n const setupWaitForAppAndVersionSequence = (appNames: string[]) => {\n const remainingAppNames = [...appNames];\n vi.mocked(waitForAppAndVersion).mockReturnValue(\n createMockActorMachineFromOutput(() =>\n Right({\n name: remainingAppNames.shift() ?? \"BOLOS\",\n version: \"1.0.0\",\n }),\n ) as unknown as ReturnType<typeof waitForAppAndVersion>,\n );\n };\n\n const setupGoToDashboard = () =>\n vi\n .mocked(goToDashboard)\n .mockReturnValue(\n createMockActorMachine(Right(undefined)) as unknown as ReturnType<\n typeof goToDashboard\n >,\n );\n\n const setupGetIsOnboarded = (isDeviceOnboarded = true) =>\n vi\n .mocked(getIsOnboarded)\n .mockReturnValue(() => Promise.resolve(Right(isDeviceOnboarded)));\n\n const setupGetLanguageId = () =>\n vi.mocked(getLanguageId).mockReturnValue(() => Promise.resolve(Right(1)));\n\n const setupListInstalledApps = () =>\n vi.mocked(listInstalledApps).mockReturnValue(\n createMockActorMachine(\n Right({\n installedApps: [\n { name: \"TestApp\", hash: \"abc\", hash_code_data: \"code\", flags: 0 },\n ],\n }),\n ) as unknown as ReturnType<typeof listInstalledApps>,\n );\n\n const setupBackupAppsStorage = () =>\n vi\n .mocked(backupAppsStorage)\n .mockReturnValue(() =>\n Promise.resolve(Right([{ appName: \"TestApp\", data: \"0xappData\" }])),\n );\n\n const setupDownloadCls = () =>\n vi\n .mocked(downloadCustomLockScreenDevice)\n .mockReturnValue(\n createMockActorMachine(\n Right({ imageData: new Uint8Array([0x01, 0x02]), imageHash: \"0102\" }),\n ) as unknown as ReturnType<typeof downloadCustomLockScreenDevice>,\n );\n\n const setupStaxModel = () =>\n getDeviceModelMock.mockReturnValue({\n id: DeviceModelId.STAX,\n } as TransportDeviceModel);\n\n const setupNanoXModel = () =>\n getDeviceModelMock.mockReturnValue({\n id: DeviceModelId.NANO_X,\n } as TransportDeviceModel);\n\n const makeDeviceAction = () =>\n new CreateBackupDeviceAction({\n input: {\n unlockTimeout: 30_000,\n },\n });\n\n // \u2500\u2500\u2500 Success \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Success\", () => {\n it(\"should complete the full backup flow for a CLS-supported device\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls();\n setupStaxModel();\n\n // State transitions:\n // GetLanguage \u2192 ListInstalledApps (\u00D72: enter + onSnapshot)\n // \u2192 BackupAppsStorage \u2192 DownloadCustomLockScreen (\u00D72: enter + onSnapshot) \u2192 Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"0xappData\" }],\n clsHexImage: \"0x0102\",\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip ListInstalledApps and DownloadCustomLockScreen when device is unseeded\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded(false);\n setupGetLanguageId();\n setupListInstalledApps(); // registered in actors but never invoked (always guard fires first)\n setupBackupAppsStorage(); // registered in actors but never invoked\n setupDownloadCls(); // registered in actors but never invoked\n\n // CheckIfDeviceIsOnboarded.isDeviceOnboarded false \u2192 jumps directly to Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n completedState({\n languageId: 1,\n installedApps: [],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should skip DownloadCustomLockScreen for devices that do not support CLS\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls(); // registered in actors but never invoked (always guard fires first)\n setupNanoXModel();\n\n // CheckIfDeviceSupportCustomLockScreenFeature.isCustomLockScreenFeatureSupported false \u2192 Success\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"0xappData\" }],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to dashboard and wait for app and version again when an app is open\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersionSequence([\"Bitcoin\", \"BOLOS\"]);\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupDownloadCls(); // registered in actors but never invoked (always guard fires first)\n setupNanoXModel();\n\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GoToDashboard),\n pendingState(CreateBackupSteps.GoToDashboard),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n completedState({\n languageId: 1,\n installedApps: [{ appName: \"TestApp\", data: \"0xappData\" }],\n clsHexImage: undefined,\n }),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n\n // \u2500\u2500\u2500 Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe(\"Error\", () => {\n it(\"should go to Error when getLanguageId returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupListInstalledApps(); // registered in actors but never invoked (always hasError guard fires first)\n const error = new GetLanguageIdError(new Error(\"command failed\"));\n vi.mocked(getLanguageId).mockReturnValue(() =>\n Promise.resolve(Left(error)),\n );\n\n // getLanguageId Left \u2192 CheckIfDeviceIsOnboarded.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when listInstalledApps returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n const error = new UnknownDAError(\"listInstalledApps failed\");\n vi.mocked(listInstalledApps).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof listInstalledApps\n >,\n );\n\n // listInstalledApps Left \u2192 BackupAppsStorage.always hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when backupAppsStorage returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupDownloadCls(); // registered in actors but never invoked (always hasError guard fires first)\n const error = new BackupAppsStorageError(new Error(\"storage failed\"));\n vi.mocked(backupAppsStorage).mockReturnValue(() =>\n Promise.resolve(Left(error)),\n );\n\n // backupAppsStorage Left \u2192 CheckIfDeviceSupportCustomLockScreenFeature.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n\n it(\"should go to Error when downloadCustomLockScreenDevice returns Left\", () =>\n new Promise<void>((resolve, reject) => {\n setupWaitForAppAndVersion();\n setupGoToDashboard();\n setupGetIsOnboarded();\n setupGetLanguageId();\n setupListInstalledApps();\n setupBackupAppsStorage();\n setupStaxModel();\n const error = new UnknownDAError(\"downloadCLS failed\");\n vi.mocked(downloadCustomLockScreenDevice).mockReturnValue(\n createMockActorMachine(Left(error)) as unknown as ReturnType<\n typeof downloadCustomLockScreenDevice\n >,\n );\n\n // downloadCustomLockScreen Left \u2192 CheckDownloadCustomLockScreen.hasError \u2192 Error\n const expectedStates: CreateBackupDAState[] = [\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.WaitForAppAndVersion),\n pendingState(CreateBackupSteps.GetIsOnboarded),\n pendingState(CreateBackupSteps.GetLanguage),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.ListInstalledApps),\n pendingState(CreateBackupSteps.BackupAppsStorage),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n pendingState(CreateBackupSteps.DownloadCustomLockScreen),\n errorState(error),\n ];\n\n testDeviceActionStates(\n makeDeviceAction(),\n expectedStates,\n makeDeviceActionInternalApiMock(),\n { onDone: resolve, onError: reject },\n );\n }));\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["DeviceActionStatus", "DeviceModelId", "UnknownDAError", "UserInteractionRequired", "Left", "Right", "assign", "createMachine", "makeDeviceActionInternalApiMock", "testDeviceActionStates", "CreateBackupDeviceAction", "BackupAppsStorageError", "GetLanguageIdError", "backupAppsStorage", "downloadCustomLockScreenDevice", "getIsOnboarded", "getLanguageId", "goToDashboard", "listInstalledApps", "waitForAppAndVersion", "CreateBackupSteps", "pendingState", "step", "completedState", "output", "errorState", "error", "createMockActorMachineFromOutput", "createMockActorMachine", "getDeviceModelMock", "setupWaitForAppAndVersion", "appName", "setupWaitForAppAndVersionSequence", "appNames", "remainingAppNames", "setupGoToDashboard", "setupGetIsOnboarded", "isDeviceOnboarded", "setupGetLanguageId", "setupListInstalledApps", "setupBackupAppsStorage", "setupDownloadCls", "setupStaxModel", "setupNanoXModel", "makeDeviceAction", "resolve", "reject", "expectedStates"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/api/device-action/OsUpdate/Backup/types.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type DeviceActionState,\n type GoToDashboardDAError,\n type GoToDashboardDAIntermediateValue,\n type GoToDashboardDARequiredInteraction,\n type InstalledApp,\n type ListInstalledAppsDAError,\n type ListInstalledAppsDAIntermediateValue,\n type ListInstalledAppsDARequiredInteraction,\n type UserInteractionRequired,\n type WaitForAppAndVersionDAError,\n type WaitForAppAndVersionDAIntermediateValue,\n type WaitForAppAndVersionDARequiredInteraction,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n type DownloadCustomLockScreenDAError,\n type DownloadCustomLockScreenDAIntermediateValue,\n type DownloadCustomLockScreenDARequiredInteraction,\n} from \"@api/device-action/DownloadCustomLockScreen/types\";\nimport { type CreateBackupDeviceActionErrors } from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors\";\n\nexport type CreateBackupDAInput = {\n unlockTimeout: number;\n};\n\nexport type CreateBackupDAOutput = Backup;\n\nexport type CreateBackupDAError =\n | WaitForAppAndVersionDAError\n | GoToDashboardDAError\n | ListInstalledAppsDAError\n | DownloadCustomLockScreenDAError\n | CreateBackupDeviceActionErrors;\n\nexport type CreateBackupDAIntermediateValue = (\n | WaitForAppAndVersionDAIntermediateValue\n | GoToDashboardDAIntermediateValue\n | ListInstalledAppsDAIntermediateValue\n | DownloadCustomLockScreenDAIntermediateValue\n) & {\n step: CreateBackupSteps;\n};\n\nexport type CreateBackupDARequiredInteraction =\n | WaitForAppAndVersionDARequiredInteraction\n | GoToDashboardDARequiredInteraction\n | ListInstalledAppsDARequiredInteraction\n | DownloadCustomLockScreenDARequiredInteraction\n | UserInteractionRequired.None;\n\nexport type CreateBackupDAInternalState = {\n error: CreateBackupDAError | null;\n currentApp: string | null;\n isDeviceOnboarded: boolean;\n languageId: number | undefined;\n installedApps: InstalledApp[];\n backupApps: BackupApp[];\n clsHexImage: string | undefined;\n};\n\nexport type CreateBackupDAState = DeviceActionState<\n CreateBackupDAOutput,\n CreateBackupDAError,\n CreateBackupDAIntermediateValue\n>;\n\nexport enum CreateBackupSteps {\n Idle = \"idle\",\n WaitForAppAndVersion = \"waitForAppAndVersion\",\n GoToDashboard = \"goToDashboard\",\n GetIsOnboarded = \"getIsOnboarded\",\n GetLanguage = \"getLanguage\",\n ListInstalledApps = \"listInstalledApps\",\n BackupAppsStorage = \"backupAppsStorage\",\n DownloadCustomLockScreen = \"downloadCustomLockScreen\",\n}\n\nexport type BackupApp = {\n appName: string;\n data:
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceActionState,\n type GoToDashboardDAError,\n type GoToDashboardDAIntermediateValue,\n type GoToDashboardDARequiredInteraction,\n type HexaString,\n type InstalledApp,\n type ListInstalledAppsDAError,\n type ListInstalledAppsDAIntermediateValue,\n type ListInstalledAppsDARequiredInteraction,\n type UserInteractionRequired,\n type WaitForAppAndVersionDAError,\n type WaitForAppAndVersionDAIntermediateValue,\n type WaitForAppAndVersionDARequiredInteraction,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n type DownloadCustomLockScreenDAError,\n type DownloadCustomLockScreenDAIntermediateValue,\n type DownloadCustomLockScreenDARequiredInteraction,\n} from \"@api/device-action/DownloadCustomLockScreen/types\";\nimport { type CreateBackupDeviceActionErrors } from \"@api/device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors\";\n\nexport type CreateBackupDAInput = {\n unlockTimeout: number;\n};\n\nexport type CreateBackupDAOutput = Backup;\n\nexport type CreateBackupDAError =\n | WaitForAppAndVersionDAError\n | GoToDashboardDAError\n | ListInstalledAppsDAError\n | DownloadCustomLockScreenDAError\n | CreateBackupDeviceActionErrors;\n\nexport type CreateBackupDAIntermediateValue = (\n | WaitForAppAndVersionDAIntermediateValue\n | GoToDashboardDAIntermediateValue\n | ListInstalledAppsDAIntermediateValue\n | DownloadCustomLockScreenDAIntermediateValue\n) & {\n step: CreateBackupSteps;\n};\n\nexport type CreateBackupDARequiredInteraction =\n | WaitForAppAndVersionDARequiredInteraction\n | GoToDashboardDARequiredInteraction\n | ListInstalledAppsDARequiredInteraction\n | DownloadCustomLockScreenDARequiredInteraction\n | UserInteractionRequired.None;\n\nexport type CreateBackupDAInternalState = {\n error: CreateBackupDAError | null;\n currentApp: string | null;\n isDeviceOnboarded: boolean;\n languageId: number | undefined;\n installedApps: InstalledApp[];\n backupApps: BackupApp[];\n clsHexImage: string | undefined;\n};\n\nexport type CreateBackupDAState = DeviceActionState<\n CreateBackupDAOutput,\n CreateBackupDAError,\n CreateBackupDAIntermediateValue\n>;\n\nexport enum CreateBackupSteps {\n Idle = \"idle\",\n WaitForAppAndVersion = \"waitForAppAndVersion\",\n GoToDashboard = \"goToDashboard\",\n GetIsOnboarded = \"getIsOnboarded\",\n GetLanguage = \"getLanguage\",\n ListInstalledApps = \"listInstalledApps\",\n BackupAppsStorage = \"backupAppsStorage\",\n DownloadCustomLockScreen = \"downloadCustomLockScreen\",\n}\n\nexport type BackupApp = {\n appName: string;\n data: HexaString | undefined;\n};\n\nexport type Backup = {\n languageId: number | undefined;\n installedApps: BackupApp[];\n clsHexImage: string | undefined;\n createdAt: Date;\n};\n"],
|
|
5
|
+
"mappings": "AAoEO,IAAKA,OACVA,EAAA,KAAO,OACPA,EAAA,qBAAuB,uBACvBA,EAAA,cAAgB,gBAChBA,EAAA,eAAiB,iBACjBA,EAAA,YAAc,cACdA,EAAA,kBAAoB,oBACpBA,EAAA,kBAAoB,oBACpBA,EAAA,yBAA2B,2BARjBA,OAAA",
|
|
6
6
|
"names": ["CreateBackupSteps"]
|
|
7
7
|
}
|
package/lib/esm/package.json
CHANGED
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
57
57
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
58
58
|
},
|
|
59
|
-
"version": "0.0.0-develop-
|
|
59
|
+
"version": "0.0.0-develop-20260707161641"
|
|
60
60
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DeviceActionState, type GoToDashboardDAError, type GoToDashboardDAIntermediateValue, type GoToDashboardDARequiredInteraction, type InstalledApp, type ListInstalledAppsDAError, type ListInstalledAppsDAIntermediateValue, type ListInstalledAppsDARequiredInteraction, type UserInteractionRequired, type WaitForAppAndVersionDAError, type WaitForAppAndVersionDAIntermediateValue, type WaitForAppAndVersionDARequiredInteraction } from "@ledgerhq/device-management-kit";
|
|
1
|
+
import { type DeviceActionState, type GoToDashboardDAError, type GoToDashboardDAIntermediateValue, type GoToDashboardDARequiredInteraction, type HexaString, type InstalledApp, type ListInstalledAppsDAError, type ListInstalledAppsDAIntermediateValue, type ListInstalledAppsDARequiredInteraction, type UserInteractionRequired, type WaitForAppAndVersionDAError, type WaitForAppAndVersionDAIntermediateValue, type WaitForAppAndVersionDARequiredInteraction } from "@ledgerhq/device-management-kit";
|
|
2
2
|
import { type DownloadCustomLockScreenDAError, type DownloadCustomLockScreenDAIntermediateValue, type DownloadCustomLockScreenDARequiredInteraction } from "../../../device-action/DownloadCustomLockScreen/types";
|
|
3
3
|
import { type CreateBackupDeviceActionErrors } from "../../../device-action/OsUpdate/Backup/CreateBackupDeviceActionErrors";
|
|
4
4
|
export type CreateBackupDAInput = {
|
|
@@ -32,7 +32,7 @@ export declare enum CreateBackupSteps {
|
|
|
32
32
|
}
|
|
33
33
|
export type BackupApp = {
|
|
34
34
|
appName: string;
|
|
35
|
-
data:
|
|
35
|
+
data: HexaString | undefined;
|
|
36
36
|
};
|
|
37
37
|
export type Backup = {
|
|
38
38
|
languageId: number | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/api/device-action/OsUpdate/Backup/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,gCAAgC,EACrC,KAAK,kCAAkC,EACvC,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,oCAAoC,EACzC,KAAK,sCAAsC,EAC3C,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,uCAAuC,EAC5C,KAAK,yCAAyC,EAC/C,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,2CAA2C,EAChD,KAAK,6CAA6C,EACnD,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,KAAK,8BAA8B,EAAE,MAAM,mEAAmE,CAAC;AAExH,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAE1C,MAAM,MAAM,mBAAmB,GAC3B,2BAA2B,GAC3B,oBAAoB,GACpB,wBAAwB,GACxB,+BAA+B,GAC/B,8BAA8B,CAAC;AAEnC,MAAM,MAAM,+BAA+B,GAAG,CAC1C,uCAAuC,GACvC,gCAAgC,GAChC,oCAAoC,GACpC,2CAA2C,CAC9C,GAAG;IACF,IAAI,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GACzC,yCAAyC,GACzC,kCAAkC,GAClC,sCAAsC,GACtC,6CAA6C,GAC7C,uBAAuB,CAAC,IAAI,CAAC;AAEjC,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CACjD,oBAAoB,EACpB,mBAAmB,EACnB,+BAA+B,CAChC,CAAC;AAEF,oBAAY,iBAAiB;IAC3B,IAAI,SAAS;IACb,oBAAoB,yBAAyB;IAC7C,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,WAAW,gBAAgB;IAC3B,iBAAiB,sBAAsB;IACvC,iBAAiB,sBAAsB;IACvC,wBAAwB,6BAA6B;CACtD;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/api/device-action/OsUpdate/Backup/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,gCAAgC,EACrC,KAAK,kCAAkC,EACvC,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,oCAAoC,EACzC,KAAK,sCAAsC,EAC3C,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,uCAAuC,EAC5C,KAAK,yCAAyC,EAC/C,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,2CAA2C,EAChD,KAAK,6CAA6C,EACnD,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,KAAK,8BAA8B,EAAE,MAAM,mEAAmE,CAAC;AAExH,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAE1C,MAAM,MAAM,mBAAmB,GAC3B,2BAA2B,GAC3B,oBAAoB,GACpB,wBAAwB,GACxB,+BAA+B,GAC/B,8BAA8B,CAAC;AAEnC,MAAM,MAAM,+BAA+B,GAAG,CAC1C,uCAAuC,GACvC,gCAAgC,GAChC,oCAAoC,GACpC,2CAA2C,CAC9C,GAAG;IACF,IAAI,EAAE,iBAAiB,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GACzC,yCAAyC,GACzC,kCAAkC,GAClC,sCAAsC,GACtC,6CAA6C,GAC7C,uBAAuB,CAAC,IAAI,CAAC;AAEjC,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CACjD,oBAAoB,EACpB,mBAAmB,EACnB,+BAA+B,CAChC,CAAC;AAEF,oBAAY,iBAAiB;IAC3B,IAAI,SAAS;IACb,oBAAoB,yBAAyB;IAC7C,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,WAAW,gBAAgB;IAC3B,iBAAiB,sBAAsB;IACvC,iBAAiB,sBAAsB;IACvC,wBAAwB,6BAA6B;CACtD;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC"}
|