Skip to content

Commit

Permalink
Merge pull request #6525 from LedgerHQ/support/DSDK-207-extract
Browse files Browse the repository at this point in the history
[DSDK-207][Refacto] [LLCommon] Extract device-core and device-react in proper package
  • Loading branch information
jiyuzhuang committed Mar 29, 2024
2 parents e67bced + 3ce6802 commit 9cd6f7d
Show file tree
Hide file tree
Showing 91 changed files with 1,104 additions and 1,365 deletions.
2 changes: 1 addition & 1 deletion apps/cli/src/commands/device/customLockScreenLoad.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { deviceOpt } from "../../scan";
import {
CLSSupportedDeviceModelId,
isCustomLockScreenSupported,
} from "@ledgerhq/live-common/device-core/capabilities/isCustomLockScreenSupported";
} from "@ledgerhq/live-common/device/use-cases/isCustomLockScreenSupported";
import { DeviceModelId } from "@ledgerhq/types-devices";

type CustomLockScreenLoadJobOpts = ScanCommonOpts & {
Expand Down
6 changes: 4 additions & 2 deletions apps/cli/src/commands/device/deviceVersion.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { from } from "rxjs";
import { Observable, from } from "rxjs";
import { withDevice } from "@ledgerhq/live-common/hw/deviceAccess";
import { getVersion } from "@ledgerhq/live-common/device/use-cases/getVersionUseCase";
import { FirmwareInfoEntity } from "@ledgerhq/live-common/device/use-cases/getLatestFirmwareForDeviceUseCase";
import { deviceOpt } from "../../scan";

export default {
args: [deviceOpt],
job: ({
device,
}: Partial<{
device: string;
}>) => withDevice(device || "")(t => from(getVersion(t))),
}>): Observable<FirmwareInfoEntity> => withDevice(device || "")(t => from(getVersion(t))),
};
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import customLockScreenLoad from "@ledgerhq/live-common/hw/customLockScreenLoad"
import { mockedEventEmitter } from "~/renderer/components/debug/DebugMock";
import { DeviceModelId } from "@ledgerhq/types-devices";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device/use-cases/isCustomLockScreenSupported";
import { isCustomLockScreenSupported } from "@ledgerhq/live-common/device-core/capabilities/isCustomLockScreenSupported";
import { isCustomLockScreenSupported } from "@ledgerhq/live-common/device/use-cases/screenSpecs";

type Props = {
device?: Device | null | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { Theme, Flex } from "@ledgerhq/react-ui";
import FramedPicture from "../FramedPicture";
import { AnimationWrapper, Title } from "../../DeviceAction/rendering";
import { useTranslation } from "react-i18next";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device-core/capabilities/isCustomLockScreenSupported";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device/use-cases/isCustomLockScreenSupported";
import { getFramedPictureConfig } from "../framedPictureConfigs";

export const RenderImageLoadRequested = ({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useEffect, useState } from "react";
import { Alert, Flex, Text } from "@ledgerhq/react-ui";
import { ImageProcessingError } from "@ledgerhq/live-common/customImage/errors";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device-core/capabilities/isCustomLockScreenSupported";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device/use-cases/isCustomLockScreenSupported";
import { getScreenVisibleAreaDimensions } from "@ledgerhq/live-common/device/use-cases/screenSpecs";
import { ProcessorResult } from "~/renderer/components/CustomImage/ImageGrayscalePreview";
import { ImageBase64Data } from "~/renderer/components/CustomImage/types";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { isDeviceLocalizationSupported } from "@ledgerhq/live-common/device-core/commands/use-cases/isDeviceLocalizationSupported";
import { FirmwareUpdateContext } from "@ledgerhq/types-live";
import { DeviceModelId } from "@ledgerhq/devices";
import StepResetDevice, { StepResetFooter } from "../steps/00-step-reset-device";
Expand All @@ -8,6 +7,7 @@ import StepRestore from "../steps/02-step-restore";
import StepUpdating from "../steps/02-step-updating";
import StepConfirmation, { StepConfirmFooter } from "../steps/03-step-confirmation";
import { Step, StepId, STEPS } from "../types";
import { isDeviceLocalizationSupported } from "@ledgerhq/live-common/device/use-cases/isDeviceLocalizationSupported";

export const createFirmwareUpdateSteps = ({
firmware,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { catchError, map, tap } from "rxjs/operators";
import { DeviceBlocker } from "~/renderer/components/DeviceAction/DeviceBlocker";
import { StepProps } from "../types";
import manager from "@ledgerhq/live-common/manager/index";
import { isCustomLockScreenSupported } from "@ledgerhq/live-common/device-core/capabilities/isCustomLockScreenSupported";
import { isCustomLockScreenSupported } from "@ledgerhq/live-common/device/use-cases/screenSpecs";

const Container = styled(Box).attrs(() => ({
alignItems: "center",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import styled from "styled-components";
import { DeviceModelId } from "@ledgerhq/devices";
import { DeviceInfo, FirmwareUpdateContext } from "@ledgerhq/types-live";
import { hasFinalFirmware } from "@ledgerhq/live-common/hw/hasFinalFirmware";
import { isDeviceLocalizationSupported } from "@ledgerhq/live-common/device-core/commands/use-cases/isDeviceLocalizationSupported";
import { isDeviceLocalizationSupported } from "@ledgerhq/live-common/device/use-cases/isDeviceLocalizationSupported";
import firmwareUpdateMain from "@ledgerhq/live-common/hw/firmwareUpdate-main";
import { withDevicePolling } from "@ledgerhq/live-common/hw/deviceAccess";
import getDeviceInfo from "@ledgerhq/live-common/hw/getDeviceInfo";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { StepProps } from "../types";
import Language from "./restore/Language";
import CustomLockScreen from "./restore/CustomLockScreen";
import { Flex } from "@ledgerhq/react-ui";
import { isCustomLockScreenSupported } from "@ledgerhq/live-common/device-core/capabilities/isCustomLockScreenSupported";
import { isCustomLockScreenSupported } from "@ledgerhq/live-common/device/use-cases/screenSpecs";

/**
* Different device models or versions may restore more or less settings.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import StepContainer from "./StepContainer";
import { analyticsPageNames, analyticsFlowName } from "./shared";
import TrackPage from "~/renderer/analytics/TrackPage";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device/use-cases/isCustomLockScreenSupported";
import { getScreenVisibleAreaDimensions } from "@ledgerhq/live-common/device-core/customLockScreen/screenSpecs";
import { getScreenVisibleAreaDimensions } from "@ledgerhq/live-common/device/use-cases/screenSpecs";

type Props = StepProps & {
src?: ImageBase64Data;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { getDeviceAnimation } from "~/renderer/components/DeviceAction/animation
import source from "./sampleimage";
import { DeviceModelId } from "@ledgerhq/types-devices";
import { getFramedPictureConfig } from "~/renderer/components/CustomImage/framedPictureConfigs";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device-core/capabilities/isCustomLockScreenSupported";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device/use-cases/isCustomLockScreenSupported";
import DeviceModelPicker from "~/renderer/components/CustomImage/DeviceModelPicker";

const CustomLockScreenAssets = () => {
Expand Down
2 changes: 1 addition & 1 deletion apps/ledger-live-mobile/ios/ledgerlivemobile/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>3.31.0</string>
<string>3.40.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import Link from "../wrappedUi/Link";
import { screen, TrackScreen } from "~/analytics";
import { useStaxLoadImageDeviceAction } from "~/hooks/deviceActions";
import { SettingsSetLastSeenCustomImagePayload } from "~/actions/types";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device-core/capabilities/isCustomLockScreenSupported";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device/use-cases/isCustomLockScreenSupported";
import {
RenderImageCommitRequested,
RenderImageLoadRequested,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
FramedLottieWithContext,
} from "../CustomImage/FramedLottie";
import { useTranslation } from "react-i18next";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device-core/capabilities/isCustomLockScreenSupported";
import { CLSSupportedDeviceModelId } from "@ledgerhq/live-common/device/use-cases/isCustomLockScreenSupported";
import { DeviceModelId } from "@ledgerhq/types-devices";

const ImageLoadingGeneric: React.FC<{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { DeviceModelInfo } from "@ledgerhq/types-live";
import { StackNavigationProp } from "@react-navigation/stack";
import { ScreenName, NavigatorName } from "~/const";
import { FirmwareUpdateContextEntity } from "@ledgerhq/live-common/device-core/managerApi/entities/FirmwareUpdateContextEntity";
import { FirmwareUpdateContextEntity } from "@ledgerhq/live-common/device/use-cases/getLatestFirmwareForDeviceUseCase";
import { UpdateStep } from "~/screens/FirmwareUpdate";
import { Device } from "@ledgerhq/hw-transport";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { App, DeviceInfo, idsToLanguage } from "@ledgerhq/types-live";
import { Flex, Text, Button, Divider, IconsLegacy } from "@ledgerhq/native-ui";
import styled, { useTheme } from "styled-components/native";
import { ListAppsResult } from "@ledgerhq/live-common/apps/types";
import { isDeviceLocalizationSupported } from "@ledgerhq/live-common/device-core/commands/use-cases/isDeviceLocalizationSupported";
import { isDeviceLocalizationSupported } from "@ledgerhq/live-common/device/use-cases/isDeviceLocalizationSupported";
import { Device } from "@ledgerhq/live-common/hw/actions/types";
import { lastSeenCustomImageSelector } from "~/reducers/settings";
import DeviceAppStorage from "./DeviceAppStorage";
Expand Down
13 changes: 13 additions & 0 deletions libs/device-core/jest.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"transform": {
"^.+\\.(ts|tsx)?$": [
"ts-jest",
{
"globals": {
"isolatedModules": true
}
}
]
},
"testPathIgnorePatterns": ["lib/", "lib-es/"]
}
67 changes: 67 additions & 0 deletions libs/device-core/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
{
"name": "@ledgerhq/device-core",
"version": "0.1.0",
"description": "Ledger Live device core module",
"license": "Apache-2.0",
"keywords": [
"Ledger"
],
"repository": {
"type": "git",
"url": "https://github.com/LedgerHQ/ledger-live.git"
},
"bugs": {
"url": "https://github.com/LedgerHQ/ledger-live/issues"
},
"homepage": "https://github.com/LedgerHQ/ledger-live/tree/develop/libs/env",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"module": "lib-es/index.js",
"dependencies": {
"@ledgerhq/errors": "workspace:^",
"@ledgerhq/live-network": "workspace:^",
"@ledgerhq/hw-transport": "workspace:^",
"@ledgerhq/logs": "workspace:^",
"@ledgerhq/devices": "workspace:^",
"@ledgerhq/types-live": "workspace:^",
"sha.js": "^2.4.11",
"semver": "^7.3.5"
},
"devDependencies": {
"@testing-library/react": "14",
"@types/jest": "^29.5.10",
"@types/node": "^20.8.10",
"@types/semver": "7.5.7",
"@types/sha.js": "^2.4.4",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"ts-jest": "^29.1.1"
},
"scripts": {
"clean": "rimraf lib lib-es",
"build": "tsc && tsc -m ES6 --outDir lib-es",
"prewatch": "pnpm build",
"watch": "tsc --watch",
"lint": "eslint ./src --no-error-on-unmatched-pattern --ext .ts,.tsx --cache",
"lint:fix": "pnpm lint --fix",
"typecheck": "tsc --noEmit",
"unimported": "unimported",
"test": "jest"
},
"typesVersions": {
"*": {
"*.json": [
"*.json"
],
"*": [
"lib/*"
],
"lib/*": [
"lib/*"
],
"lib-es/*": [
"lib-es/*"
]
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { DeviceModelId } from "@ledgerhq/types-devices";
import { DeviceModelId } from "@ledgerhq/devices";
import { isEditDeviceNameSupported } from "./isEditDeviceNameSupported";

const supportedDevices = [DeviceModelId.stax, DeviceModelId.nanoX, DeviceModelId.europa];
Expand Down
33 changes: 33 additions & 0 deletions libs/device-core/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// src/managerApi/
export type { DeviceInfoEntity } from "./managerApi/entities/DeviceInfoEntity";
export type {
FinalFirmware,
OsuFirmware,
FirmwareUpdateContextEntity,
} from "./managerApi/entities/FirmwareUpdateContextEntity";
export type { ManagerApiRepository } from "./managerApi/repositories/ManagerApiRepository";
export { HttpManagerApiRepository } from "./managerApi/repositories/HttpManagerApiRepository";
export { StubManagerApiRepository } from "./managerApi/repositories/StubManagerApiRepository";
export { getLatestFirmwareForDevice } from "./managerApi/use-cases/getLatestFirmwareForDevice";
export { isDeviceLocalizationSupported } from "./commands/use-cases/isDeviceLocalizationSupported";
export { PROVIDERS, getProviderIdUseCase } from "./managerApi/use-cases/getProviderIdUseCase";
export { fetchMcus } from "./managerApi/use-cases/fetchMcus";
export { aDeviceInfoBuilder } from "./managerApi/entities/mocks/aDeviceInfo";
// src/commands/
export type { FirmwareInfoEntity } from "./commands/entities/FirmwareInfoEntity";
export { GET_VERSION_APDU } from "./commands/use-cases/getVersion";
export { parseGetVersionResponse } from "./commands/use-cases/parseGetVersionResponse";
export { getDeviceName } from "./commands/use-cases/getDeviceName";
export { isHardwareVersionSupported } from "./commands/use-cases/isHardwareVersionSupported";
export { isBootloaderVersionSupported } from "./commands/use-cases/isBootloaderVersionSupported";
export { getVersion } from "./commands/use-cases/getVersion";
// src/capabilities/
export {
type CLSSupportedDeviceModelId,
isCustomLockScreenSupported,
} from "./capabilities/isCustomLockScreenSupported";
export { isEditDeviceNameSupported } from "./capabilities/isEditDeviceNameSupported";
export { isSyncOnboardingSupported } from "./capabilities/isSyncOnboardingSupported";
export { supportedDeviceModelIds } from "./capabilities/isCustomLockScreenSupported";
// src/customLockScreen/
export * from "./customLockScreen/screenSpecs";
16 changes: 16 additions & 0 deletions libs/device-core/src/managerApi/entities/mocks/aDeviceInfo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { DeviceInfo } from "@ledgerhq/types-live";

export const aDeviceInfoBuilder = (props?: Partial<DeviceInfo>): DeviceInfo => {
return {
mcuVersion: "A_MCU_VERSION",
version: "A_VERSION",
majMin: "A_MAJ_MIN",
targetId: "0.0",
isBootloader: false,
isOSU: true,
providerName: undefined,
managerAllowed: false,
pinValidated: true,
...props,
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
} from "../entities/LanguagePackageEntity";
import { HttpManagerApiRepository } from "./HttpManagerApiRepository";

const getUserHashesModule = jest.requireActual("../../../user");
const getUserHashesModule = jest.requireActual("../use-cases/getUserHashes");
const networkModule = jest.requireActual("@ledgerhq/live-network/network");

describe("HttpManagerApiRepository", () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { makeLRUCache } from "@ledgerhq/live-network/cache";
import network from "@ledgerhq/live-network/network";
import { FirmwareNotRecognized, NetworkDown } from "@ledgerhq/errors";
import { getUserHashes } from "../../../user";
import { getUserHashes } from "../use-cases/getUserHashes";
import URL from "url";
import { ManagerApiRepository } from "./ManagerApiRepository";
import { FinalFirmware, OsuFirmware } from "../entities/FirmwareUpdateContextEntity";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { McuVersion } from "@ledgerhq/types-live";
import { ApplicationV2Entity } from "../entities/AppEntity";
import { DeviceInfoEntity } from "../entities/DeviceInfoEntity";
import { DeviceVersionEntity } from "../entities/DeviceVersionEntity";
Expand All @@ -13,7 +14,7 @@ export interface ManagerApiRepository {
userId: string;
}): Promise<OsuFirmware | null | undefined>;

fetchMcus(): Promise<any>; // TODO: type properly
fetchMcus(): Promise<McuVersion[]>;

getDeviceVersion({
targetId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { getLatestFirmwareForDevice } from "./getLatestFirmwareForDevice";
import { ManagerApiRepository } from "../repositories/ManagerApiRepository";
import { aDeviceInfoBuilder } from "../../../mock/fixtures/aDeviceInfo";
import { DeviceVersion, FinalFirmware, OsuFirmware } from "@ledgerhq/types-live";
import { DeviceVersion, FinalFirmware, McuVersion, OsuFirmware } from "@ledgerhq/types-live";
import { UnknownMCU } from "@ledgerhq/errors";
import { StubManagerApiRepository } from "../repositories/StubManagerApiRepository";
import { aDeviceInfoBuilder } from "../entities/mocks/aDeviceInfo";

jest.mock("../repositories/ManagerApiRepository");

describe("getLatestFirmwareForDevice", () => {
Expand Down Expand Up @@ -48,7 +49,7 @@ describe("getLatestFirmwareForDevice", () => {
.mockResolvedValue({ id: 42 } as DeviceVersion);
jest
.spyOn(mockedManagerApiRepository, "fetchMcus")
.mockResolvedValue(Promise.resolve([{ name: "42", id: 42 }]));
.mockResolvedValue(Promise.resolve([{ name: "42", id: 42 } as McuVersion]));
jest
.spyOn(mockedManagerApiRepository, "getCurrentFirmware")
.mockResolvedValue({ se_firmware: 21 } as FinalFirmware);
Expand Down Expand Up @@ -82,7 +83,7 @@ describe("getLatestFirmwareForDevice", () => {
.mockResolvedValue({ id: 42 } as DeviceVersion);
jest
.spyOn(mockedManagerApiRepository, "fetchMcus")
.mockResolvedValue(Promise.resolve([{ name: "42", id: "MCU_TEST" }]));
.mockResolvedValue(Promise.resolve([{ name: "42", id: 42 } as McuVersion]));
jest
.spyOn(mockedManagerApiRepository, "getCurrentFirmware")
.mockResolvedValue({ id: 21 } as FinalFirmware);
Expand Down Expand Up @@ -111,7 +112,7 @@ describe("getLatestFirmwareForDevice", () => {
.mockResolvedValue({ id: 42 } as DeviceVersion);
jest
.spyOn(mockedManagerApiRepository, "fetchMcus")
.mockResolvedValue(Promise.resolve([{ name: "42", id: 42 }]));
.mockResolvedValue(Promise.resolve([{ name: "42", id: 42 } as McuVersion]));
jest
.spyOn(mockedManagerApiRepository, "getCurrentFirmware")
.mockResolvedValue({ se_firmware: 21 } as FinalFirmware);
Expand Down Expand Up @@ -143,7 +144,7 @@ describe("getLatestFirmwareForDevice", () => {
const deviceInfo = aDeviceInfoBuilder({ mcuVersion: "42" });
jest
.spyOn(mockedManagerApiRepository, "fetchMcus")
.mockResolvedValue(Promise.resolve([{ name: "42", id: 42 }]));
.mockResolvedValue(Promise.resolve([{ name: "42", id: 42 } as McuVersion]));
jest
.spyOn(mockedManagerApiRepository, "getDeviceVersion")
.mockResolvedValue({ id: 42 } as DeviceVersion);
Expand Down Expand Up @@ -172,7 +173,7 @@ describe("getLatestFirmwareForDevice", () => {
const deviceInfo = aDeviceInfoBuilder({ mcuVersion: "42" });
jest
.spyOn(mockedManagerApiRepository, "fetchMcus")
.mockResolvedValue(Promise.resolve([{ name: "42", id: 42 }]));
.mockResolvedValue(Promise.resolve([{ name: "42", id: 42 } as McuVersion]));
jest
.spyOn(mockedManagerApiRepository, "getDeviceVersion")
.mockResolvedValue({ id: 42 } as DeviceVersion);
Expand Down

0 comments on commit 9cd6f7d

Please sign in to comment.