Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 136 additions & 0 deletions .changeset/smooth-falcons-rush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
---
"@ledgerhq/hw-transport-node-hid-singleton": minor
"@ledgerhq/hw-transport-node-speculos-http": minor
"@ledgerhq/hw-transport-node-hid-noevents": minor
"@ledgerhq/react-native-hw-transport-ble": minor
"@ledgerhq/swift-bridge-hw-transport-ble": minor
"@ledgerhq/hw-transport-node-speculos": minor
"@ledgerhq/swift-bridge-hw-app-solana": minor
"@ledgerhq/swift-bridge-hw-app-eth": minor
"@ledgerhq/coin-tester-polkadot": minor
"@ledgerhq/coin-tester-bitcoin": minor
"@ledgerhq/hw-transport-node-hid": minor
"@ledgerhq/coin-tester-solana": minor
"@ledgerhq/hw-transport-web-ble": minor
"@ledgerhq/hw-transport-mocker": minor
"@ledgerhq/hw-transport-webhid": minor
"@ledgerhq/hw-transport-webusb": minor
"@ledgerhq/coin-module-boilerplate": minor
"@ledgerhq/hw-transport-vault": minor
"@ledgerhq/types-cryptoassets": minor
"@ledgerhq/coin-internet_computer": minor
"@ledgerhq/coin-tester-evm": minor
"@ledgerhq/hw-app-concordium": minor
"@ledgerhq/hw-app-multiversx": minor
"@ledgerhq/hw-transport-http": minor
"@ledgerhq/react-native-hid": minor
"@actions/generate-bot-super-report": minor
"@ledgerhq/hw-app-algorand": minor
"@ledgerhq/hw-app-exchange": minor
"@ledgerhq/hw-app-polkadot": minor
"@actions/mobile-performance-test": minor
"@ledgerhq/hw-app-canton": minor
"@ledgerhq/hw-app-cosmos": minor
"@ledgerhq/hw-app-hedera": minor
"@ledgerhq/hw-app-helium": minor
"@ledgerhq/hw-app-solana": minor
"@ledgerhq/types-devices": minor
"@ledgerhq/cryptoassets": minor
"@ledgerhq/hw-app-aptos": minor
"@ledgerhq/hw-app-kaspa": minor
"@ledgerhq/hw-app-tezos": minor
"@ledgerhq/hw-transport": minor
"@ledgerhq/hw-app-celo": minor
"@ledgerhq/hw-app-icon": minor
"@ledgerhq/hw-app-near": minor
"@ledgerhq/coin-concordium": minor
"@ledgerhq/coin-multiversx": minor
"@ledgerhq/hw-app-btc": minor
"@ledgerhq/hw-app-eth": minor
"@ledgerhq/hw-app-str": minor
"@ledgerhq/hw-app-sui": minor
"@ledgerhq/hw-app-trx": minor
"@ledgerhq/hw-app-vet": minor
"@ledgerhq/hw-app-xrp": minor
"@ledgerhq/types-live": minor
"@ledgerhq/zcash-shielded": minor
"@ledgerhq/hw-ledger-key-ring-protocol": minor
"@ledgerhq/coin-algorand": minor
"@ledgerhq/coin-filecoin": minor
"@ledgerhq/coin-polkadot": minor
"@ledgerhq/hw-bolos": minor
"@ledgerhq/coin-bitcoin": minor
"@ledgerhq/coin-cardano": minor
"@ledgerhq/coin-stellar": minor
"@ledgerhq/coin-vechain": minor
"@ledgerhq/devices": minor
"@ledgerhq/coin-canton": minor
"@ledgerhq/coin-casper": minor
"@ledgerhq/coin-cosmos": minor
"@ledgerhq/coin-hedera": minor
"@ledgerhq/coin-solana": minor
"@ledgerhq/coin-stacks": minor
"@ledgerhq/ledger-key-ring-protocol": minor
"@ledgerhq/errors": minor
"@ledgerhq/coin-modules-monitoring": minor
"@ledgerhq/coin-aptos": minor
"@ledgerhq/coin-kaspa": minor
"@ledgerhq/coin-tezos": minor
"@ledgerhq/coin-aleo": minor
"@ledgerhq/coin-celo": minor
"@ledgerhq/coin-icon": minor
"@ledgerhq/coin-mina": minor
"@ledgerhq/coin-near": minor
"@ledgerhq/coin-tron": minor
"@ledgerhq/logs": minor
"@ledgerhq/wallet-api-acre-module": minor
"@ledgerhq/coin-evm": minor
"@ledgerhq/coin-sui": minor
"@ledgerhq/coin-ton": minor
"@ledgerhq/coin-xrp": minor
"@ledgerhq/disable-network-setup": minor
"@ledgerhq/ledger-trust-service": minor
"@ledgerhq/live-currency-format": minor
"ledger-live-desktop": minor
"@ledgerhq/wallet-api-feature-flag-module": minor
"@ledgerhq/ledger-cal-service": minor
"live-mobile": minor
"@ledgerhq/live-common": minor
"@ledgerhq/live-countervalues": minor
"@ledgerhq/live-signer-canton": minor
"@ledgerhq/live-signer-solana": minor
"@ledgerhq/speculos-transport": minor
"@ledgerhq/native-ui": minor
"@features/market-banner": minor
"@ledgerhq/live-dmk-speculos": minor
"@ledgerhq/react-ui": minor
"@ledgerhq/dummy-wallet-app": minor
"@ledgerhq/live-dmk-desktop": minor
"@ledgerhq/live-signer-aleo": minor
"@ledgerhq/concordium-core": minor
"@ledgerhq/wallet-api-deeplink-module": minor
"@ledgerhq/wallet-api-exchange-module": minor
"@ledgerhq/live-dmk-mobile": minor
"@ledgerhq/live-dmk-shared": minor
"@ledgerhq/live-signer-evm": minor
"@ledgerhq/dummy-live-app": minor
"@ledgerhq/coin-framework": minor
"@ledgerhq/domain-service": minor
"@ledgerhq/device-react": minor
"@ledgerhq/live-network": minor
"@ledgerhq/coin-tester": minor
"@ledgerhq/device-core": minor
"@ledgerhq/live-config": minor
"@ledgerhq/live-github-bot": minor
"@ledgerhq/client-ids": minor
"@ledgerhq/web-tools": minor
"@ledgerhq/evm-tools": minor
"@ledgerhq/ledger-libs": minor
"@ledgerhq/actions-root": minor
"ledger-live-desktop-e2e-tests": minor
"@ledgerhq/psbtv2": minor
"ledger-live-mobile-e2e-tests": minor
"@ledgerhq/live-cli": minor
---

Update TypeScript to latest 5.8.x
2 changes: 1 addition & 1 deletion apps/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
"@types/express": "4.17.21",
"@types/invariant": "2.2.37",
"@types/lodash": "4.17.7",
"@types/node": "22.10.10",
"@types/node": "catalog:",
"@types/pako": "2.0.3",
"@types/qrcode-terminal": "0.12.2",
"@types/ws": "8.5.10",
Expand Down
1 change: 0 additions & 1 deletion apps/cli/src/commands/device/managerListApps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ export default {
mergeMap(deviceInfo =>
listAppsUseCase(t, deviceInfo).pipe(
filter(e => e.type === "result"),
// @ts-expect-error we need better typings and safe guard to infer types
map(e => e.result),
repeat(benchmark ? 5 : 1),
),
Expand Down
7 changes: 7 additions & 0 deletions apps/ledger-live-desktop/index-types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,10 @@ interface Window {
// Add variables to the global scope (`declare const` does not seem to work here):

declare var api: Window["api"] | undefined; // eslint-disable-line no-var

// Allow custom properties on global/globalThis (tests, AppGeoBlocker, etc.)
declare global {
interface GlobalThis {
[key: string]: any;
}
}
Comment on lines +110 to +115
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

neat pick: Maybe we'll want to be explicit with the types of what we put in global, wdyt ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i'll create a ticket so we don't forget to refine this https://ledgerhq.atlassian.net/browse/LIVE-27126

3 changes: 2 additions & 1 deletion apps/ledger-live-desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@
"@types/color": "3.0.6",
"@types/invariant": "2.2.37",
"@types/jest": "catalog:",
"@types/node": "catalog:",
"@types/lodash": "4.17.0",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
Expand Down Expand Up @@ -257,7 +258,7 @@
"storybook-react-rsbuild": "3.2.2",
"tailwindcss": "catalog:",
"ts-node": "10.9.2",
"typescript": "5.4.3",
"typescript": "catalog:",
"yargs": "17.7.2"
}
}
17 changes: 13 additions & 4 deletions apps/ledger-live-desktop/src/main/cleanupUserData.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ describe("UserDataCleanup", () => {
fileEntry("app.json"),
directoryEntry("nested"),
fileEntry("other.txt"),
]);
] as unknown as Awaited<ReturnType<typeof fsPromises.readdir>>);
unlinkMock.mockResolvedValue(undefined);

const cleanup = new UserDataCleanup("/tmp/userdata", {
Expand All @@ -97,7 +97,10 @@ describe("UserDataCleanup", () => {
});

it("supports custom regex patterns", async () => {
readdirMock.mockResolvedValue([fileEntry("keep.json"), fileEntry("extra.tmp")]);
readdirMock.mockResolvedValue([
fileEntry("keep.json"),
fileEntry("extra.tmp"),
] as unknown as Awaited<ReturnType<typeof fsPromises.readdir>>);
unlinkMock.mockResolvedValue(undefined);

const cleanup = new UserDataCleanup("/data", { patterns: [/\.tmp$/] });
Expand All @@ -108,7 +111,10 @@ describe("UserDataCleanup", () => {
});

it("does nothing when no files match", async () => {
readdirMock.mockResolvedValue([fileEntry("app.json"), fileEntry("keep.json")]);
readdirMock.mockResolvedValue([
fileEntry("app.json"),
fileEntry("keep.json"),
] as unknown as Awaited<ReturnType<typeof fsPromises.readdir>>);

const cleanup = new UserDataCleanup("/tmp/userdata", {
patterns: [/^app\.json\..+$/],
Expand All @@ -120,7 +126,10 @@ describe("UserDataCleanup", () => {
});

it("logs failures when cleanup fails", async () => {
readdirMock.mockResolvedValue([fileEntry("app.json.1"), fileEntry("app.json.2")]);
readdirMock.mockResolvedValue([
fileEntry("app.json.1"),
fileEntry("app.json.2"),
] as unknown as Awaited<ReturnType<typeof fsPromises.readdir>>);
unlinkMock.mockRejectedValueOnce(new Error("nope"));
unlinkMock.mockResolvedValueOnce(undefined);

Expand Down
9 changes: 7 additions & 2 deletions apps/ledger-live-desktop/src/main/db/crypto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,12 @@ export const decryptData = (raw: string, encryptionKey: string) => {
}
log("db/crypto", "fallback to deprecated API");

// if not, then we fallback to the deprecated API
const decipher = crypto.createDecipher(ENCRYPTION_ALGORITHM, encryptionKey);
// createDecipher removed from @types/node 22 (deprecated in Node) but still exists at runtime
// for now, we accept the legacy usage (production code) but we prioritize fixing it via ticket LIVE-27113
const decipher = (
crypto as unknown as {
createDecipher: (alg: string, key: string) => ReturnType<typeof crypto.createDecipheriv>;
}
).createDecipher(ENCRYPTION_ALGORITHM, encryptionKey);
return Buffer.concat([decipher.update(data), decipher.final()]).toString("utf8");
};
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export function SendFlowLayout({ isOpen, onClose }: SendFlowLayoutProps) {
)}
<SendHeader />
{StepComponent && (
<div key={wizard.currentStep} className="animate-fade-in flex min-h-0 flex-1 flex-col">
<div key={wizard.currentStep} className="flex min-h-0 flex-1 animate-fade-in flex-col">
<StepComponent />
</div>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const ErrorContent = ({ error }: ErrorContentProps) => {

return (
<div
className="flex flex-col items-center gap-24 -mt-12"
className="-mt-12 flex flex-col items-center gap-24"
data-testid="send-confirmation-error-content"
>
<Spot appearance="error" size={72} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const InfoContent = ({ titleKey, descriptionKey }: InfoContentProps) => {

return (
<div
className="flex flex-col items-center gap-24 -mt-12"
className="-mt-12 flex flex-col items-center gap-24"
data-testid="send-confirmation-info-content"
>
<Spot appearance="info" size={72} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export const SuccessContent = () => {

return (
<div
className="flex flex-col items-center gap-24 -mt-12"
className="-mt-12 flex flex-col items-center gap-24"
data-testid="send-confirmation-success-content"
>
<Spot appearance="check" size={72} />
Expand Down
10 changes: 10 additions & 0 deletions apps/ledger-live-mobile/global.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/**
* Allow custom properties on global (e2e setup, polyfills, HermesInternal, etc.)
* without "Element implicitly has an 'any' type" when typechecking with strict global types.
*/
declare global {
interface GlobalThis {
[key: string]: any;
}
}
export {};
Loading
Loading