From 1fe38ff19578316ff6d2a4b7c57a6d5594e1cf96 Mon Sep 17 00:00:00 2001 From: Sebastien David Date: Thu, 30 Jul 2026 16:23:53 +0200 Subject: [PATCH 1/2] feat(devtools): add debug ws to lwd --- apps/ledger-live-desktop/package.json | 2 + .../DevToolsScreen.integration.test.tsx | 17 + .../DevTools/screens/DevToolsScreen/index.tsx | 11 +- .../DevToolsScreen/useDevToolsRelay.ts | 23 ++ .../useDevToolsScreenViewModel.ts | 16 +- .../src/state-manager/configureStore.ts | 4 +- .../src/state-manager/sleepingListener.ts | 3 + pnpm-lock.yaml | 342 ++++-------------- 8 files changed, 133 insertions(+), 285 deletions(-) create mode 100644 apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsRelay.ts create mode 100644 apps/ledger-live-desktop/src/state-manager/sleepingListener.ts diff --git a/apps/ledger-live-desktop/package.json b/apps/ledger-live-desktop/package.json index 91208da88d72..2810b068fde0 100644 --- a/apps/ledger-live-desktop/package.json +++ b/apps/ledger-live-desktop/package.json @@ -74,6 +74,8 @@ "@domain/entity-large-screen-upsell-modal": "workspace:*", "@devtools/shell": "workspace:^", "@devtools/bindings": "workspace:*", + "@devtools/transport-panel": "workspace:*", + "@devtools/wire": "workspace:*", "@electron/fuses": "2.0.0", "@features/flow-card": "workspace:^", "@features/flow-contacts": "workspace:^", diff --git a/apps/ledger-live-desktop/src/mvvm/features/DevTools/__integrations__/DevToolsScreen.integration.test.tsx b/apps/ledger-live-desktop/src/mvvm/features/DevTools/__integrations__/DevToolsScreen.integration.test.tsx index d937a0bb0907..8d0a0df91148 100644 --- a/apps/ledger-live-desktop/src/mvvm/features/DevTools/__integrations__/DevToolsScreen.integration.test.tsx +++ b/apps/ledger-live-desktop/src/mvvm/features/DevTools/__integrations__/DevToolsScreen.integration.test.tsx @@ -7,6 +7,9 @@ jest.mock("react-router", () => ({ ...jest.requireActual("react-router"), useNavigate: () => mockNavigate, })); +jest.mock("@devtools/transport-panel", () => ({ + TransportPanel: () => null, +})); const devToolsSpy = jest.fn(); jest.mock("@devtools/shell", () => ({ @@ -24,6 +27,20 @@ jest.mock("@devtools/bindings", () => ({ useFeatureFlagsToolProps: () => ({ marker: "ff-props" }), })); +jest.mock("@devtools/wire", () => { + const wireState = { hubUrl: "ws://127.0.0.1:9090", role: "host" }; + return { + buildTransport: () => ({ + transport: {}, + subscribe: () => () => {}, + getState: () => wireState, + setHubUrl: jest.fn(), + }), + buildCopyStoreProtocol: () => ({}), + combineProtocols: (...args: unknown[]) => args[0], + }; +}); + describe("DevToolsScreen", () => { beforeEach(() => { mockNavigate.mockClear(); diff --git a/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/index.tsx b/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/index.tsx index 98e62f3dd62e..1fe332bbdb20 100644 --- a/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/index.tsx +++ b/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/index.tsx @@ -1,16 +1,23 @@ import React from "react"; import { DevTools } from "@devtools/shell"; +import { TransportPanel } from "@devtools/transport-panel"; import { useDevToolsScreenViewModel } from "./useDevToolsScreenViewModel"; export default function DevToolsScreen() { - const { config, onClose } = useDevToolsScreenViewModel(); + const { config, onClose, transport, hubUrl, setHubUrl, role } = useDevToolsScreenViewModel(); return (
- + + } + />
); } diff --git a/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsRelay.ts b/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsRelay.ts new file mode 100644 index 000000000000..22ba9e554800 --- /dev/null +++ b/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsRelay.ts @@ -0,0 +1,23 @@ +import { useSyncExternalStore } from "react"; +import { buildTransport, buildCopyStoreProtocol, combineProtocols } from "@devtools/wire"; +import { sleepingListener } from "~/state-manager/sleepingListener"; +import { useStore } from "LLD/hooks/redux"; + +const HUB_URL = "ws://127.0.0.1:9090"; +const ROLE = "host" as const; + +function buildRelay(store: ReturnType) { + return buildTransport( + { hubUrl: HUB_URL, role: ROLE, id: "lld" }, + combineProtocols(buildCopyStoreProtocol(store, sleepingListener, ROLE)), + ); +} + +let relay: ReturnType | undefined; + +export function useDevToolsRelay() { + const store = useStore(); + if (!relay) relay = buildRelay(store); + const wireState = useSyncExternalStore(relay.subscribe, relay.getState, relay.getState); + return { wire: relay, wireState }; +} diff --git a/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsScreenViewModel.ts b/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsScreenViewModel.ts index ddc6a94da281..8fc88d95609e 100644 --- a/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsScreenViewModel.ts +++ b/apps/ledger-live-desktop/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsScreenViewModel.ts @@ -2,13 +2,12 @@ import { useCallback, useMemo } from "react"; import { useNavigate } from "react-router"; import { useFeatureFlagsToolProps } from "@devtools/bindings"; import type { DevToolsConfig } from "@devtools/shell"; +import { useDevToolsRelay } from "./useDevToolsRelay"; -export function useDevToolsScreenViewModel(): { - config: DevToolsConfig; - onClose: () => void; -} { +export function useDevToolsScreenViewModel() { const navigate = useNavigate(); const featureFlagsToolProps = useFeatureFlagsToolProps(); + const { wire, wireState } = useDevToolsRelay(); const config: DevToolsConfig = useMemo( () => [{ id: "feature-flags", config: featureFlagsToolProps }], @@ -17,5 +16,12 @@ export function useDevToolsScreenViewModel(): { const onClose = useCallback(() => navigate(-1), [navigate]); - return { config, onClose }; + return { + config, + onClose, + transport: wire.transport, + hubUrl: wireState.hubUrl, + setHubUrl: wire.setHubUrl, + role: wireState.role, + }; } diff --git a/apps/ledger-live-desktop/src/state-manager/configureStore.ts b/apps/ledger-live-desktop/src/state-manager/configureStore.ts index 5973d52bdbc9..2cbb12fc11f8 100644 --- a/apps/ledger-live-desktop/src/state-manager/configureStore.ts +++ b/apps/ledger-live-desktop/src/state-manager/configureStore.ts @@ -21,6 +21,7 @@ import { createIdentitiesSyncMiddleware, pushDevicesApiExtra } from "@domain/api import { canPushDeviceIdsSelector, languageSelector } from "~/renderer/reducers/settings"; import { createFeatureFlagsMiddleware, type PartialFeatures } from "@shared/feature-flags"; import { fetchRemoteFlags as defaultFetchRemoteFlags } from "~/firebase/remoteConfig"; +import { sleepingListener } from "./sleepingListener"; type Props = { state?: State; dbMiddleware?: Middleware; @@ -116,7 +117,8 @@ const customCreateStore = ({ fetchRemoteFlags: fetchRemoteFlags ?? undefined, getAppLanguage: languageSelector, }), - ), + ) + .concat(sleepingListener.middleware), devTools: __DEV__, }); diff --git a/apps/ledger-live-desktop/src/state-manager/sleepingListener.ts b/apps/ledger-live-desktop/src/state-manager/sleepingListener.ts new file mode 100644 index 000000000000..bf5387b00138 --- /dev/null +++ b/apps/ledger-live-desktop/src/state-manager/sleepingListener.ts @@ -0,0 +1,3 @@ +import { createListenerMiddleware } from "@reduxjs/toolkit"; + +export const sleepingListener = createListenerMiddleware(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad1197f12144..48104b83ac1f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -821,9 +821,18 @@ importers: '@devtools/bindings': specifier: workspace:* version: link:../../devtools/bindings + '@devtools/protocols': + specifier: workspace:* + version: link:../../devtools/protocols '@devtools/shell': specifier: workspace:^ version: link:../../devtools/shell + '@devtools/transport-panel': + specifier: workspace:* + version: link:../../devtools/transport-panel + '@devtools/wire': + specifier: workspace:* + version: link:../../devtools/wire '@domain/api-altcoins-sentiment': specifier: workspace:^ version: link:../../domain/api/altcoins-sentiment @@ -2203,7 +2212,7 @@ importers: version: 18.0.1 '@react-native/babel-preset': specifier: 'catalog:' - version: 0.81.6(@babel/core@7.28.5) + version: 0.81.6 '@react-native/codegen': specifier: 'catalog:' version: 0.81.6(@babel/core@7.28.5) @@ -12951,7 +12960,7 @@ importers: version: 0.81.6 '@react-native/babel-preset': specifier: 'catalog:' - version: 0.81.6(@babel/core@7.28.5) + version: 0.81.6 '@rsbuild/core': specifier: 'catalog:' version: 2.0.9 @@ -12975,7 +12984,7 @@ importers: version: 10.4.4(@storybook/react@10.4.1(@types/react@19.0.14)(@typescript/typescript6@6.0.2)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.0.14)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)))(react-native@0.81.6(patch_hash=fbb22f6ab81c7336a446f504c4aef2f23fc558838854399c868c5590e29ac9f1)(@babel/core@7.28.5)(@react-native-community/cli@15.1.0(@typescript/typescript6@6.0.2))(@types/react@19.0.14)(metro-transform-worker@0.81.5)(metro@0.81.5)(react@19.1.4))(react@19.1.4)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.0.14)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)) '@storybook/addon-react-native-web': specifier: 'catalog:' - version: 0.0.29(@react-native/babel-preset@0.81.6(@babel/core@7.28.5))(babel-plugin-react-native-web@0.19.10)(metro-react-native-babel-preset@0.77.0(@babel/core@7.28.5))(react-dom@19.1.4(react@19.1.4))(react@19.1.4) + version: 0.0.29(@react-native/babel-preset@0.81.6)(babel-plugin-react-native-web@0.19.10)(metro-react-native-babel-preset@0.77.0(@babel/core@7.28.5))(react-dom@19.1.4(react@19.1.4))(react@19.1.4) '@storybook/jest': specifier: 'catalog:' version: 0.2.3 @@ -20618,8 +20627,6 @@ packages: '@react-native/babel-preset@0.81.6': resolution: {integrity: sha512-RtIr82ccPoyMLmIC3/vCG96MzRmIT+IzQkjCgTS5b93uAxiER9BS7+d1l7+zD00VanClt6CTBM4K4n6RCnAykg==} engines: {node: '>= 20.19.4'} - peerDependencies: - '@babel/core': '*' '@react-native/codegen@0.77.3': resolution: {integrity: sha512-Q6ZJCE7h6Z3v3DiEZUnqzHbgwF3ZILN+ACTx6qu/x2X1cL96AatKwdX92e0+7J9RFg6gdoFYJgRrW8Q6VnWZsQ==} @@ -22815,7 +22822,7 @@ packages: metro-react-native-babel-preset: '*' react: 19.1.4 react-dom: 19.1.4 - webpack: '*' + webpack: ^5.89.0 peerDependenciesMeta: '@react-native/babel-preset': optional: true @@ -34363,7 +34370,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qrcode-terminal@0.11.0: @@ -37251,10 +37257,6 @@ packages: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - undici@6.19.2: - resolution: {integrity: sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==} - engines: {node: '>=18.17'} - undici@6.21.1: resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==} engines: {node: '>=18.17'} @@ -40455,16 +40457,6 @@ snapshots: regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.5': - dependencies: - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.3 - lodash.debounce: 4.0.8 - resolve: 1.22.12 - transitivePeerDependencies: - - supports-color - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40540,14 +40532,6 @@ snapshots: '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.27.1': - dependencies: - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40695,10 +40679,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-export-default-from@7.25.9': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40785,19 +40765,11 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-dynamic-import@7.8.3': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-export-default-from@7.25.9': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40808,10 +40780,6 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow@7.27.1': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40954,14 +40922,6 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.28.0': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40980,14 +40940,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1': - dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41007,10 +40959,6 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.28.5': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41080,11 +41028,6 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.28.6 - '@babel/plugin-transform-computed-properties@7.27.1': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.28.6 - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41096,13 +41039,6 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring@7.28.5': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41155,24 +41091,12 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-flow-strip-types@7.27.1': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1 - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-for-of@7.27.1': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41190,14 +41114,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1': - dependencies: - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41217,19 +41133,11 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.27.1': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.28.5': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41281,11 +41189,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - dependencies: - '@babel/helper-create-regexp-features-plugin': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41306,10 +41209,6 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.27.1': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41322,16 +41221,6 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/plugin-transform-object-rest-spread@7.28.4': - dependencies: - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5 - '@babel/plugin-transform-parameters': 7.27.7 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41351,10 +41240,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41380,22 +41265,11 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-parameters@7.27.7': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.27.1': - dependencies: - '@babel/helper-create-class-features-plugin': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41413,14 +41287,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1': - dependencies: - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41440,10 +41306,6 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.28.0': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41456,19 +41318,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.9': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.25.9': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41485,16 +41339,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.27.1': - dependencies: - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41512,10 +41356,6 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.28.4': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41532,17 +41372,6 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-runtime@7.25.9': - dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - babel-plugin-polyfill-corejs2: 0.4.14 - babel-plugin-polyfill-corejs3: 0.10.6 - babel-plugin-polyfill-regenerator: 0.6.5 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41572,13 +41401,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-spread@7.27.1': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41592,10 +41414,6 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-sticky-regex@7.27.1': - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -43743,7 +43561,7 @@ snapshots: structured-headers: 0.4.1 tar: 7.4.3 terminal-link: 2.1.1 - undici: 6.19.2 + undici: 6.21.1 wrap-ansi: 7.0.0 ws: 8.21.0 transitivePeerDependencies: @@ -49731,55 +49549,6 @@ snapshots: - supports-color '@react-native/babel-preset@0.81.6': - dependencies: - '@babel/plugin-proposal-export-default-from': 7.25.9 - '@babel/plugin-syntax-dynamic-import': 7.8.3 - '@babel/plugin-syntax-export-default-from': 7.25.9 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 - '@babel/plugin-syntax-optional-chaining': 7.8.3 - '@babel/plugin-transform-arrow-functions': 7.27.1 - '@babel/plugin-transform-async-generator-functions': 7.28.0 - '@babel/plugin-transform-async-to-generator': 7.27.1 - '@babel/plugin-transform-block-scoping': 7.28.5 - '@babel/plugin-transform-class-properties': 7.27.1 - '@babel/plugin-transform-classes': 7.28.4 - '@babel/plugin-transform-computed-properties': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5 - '@babel/plugin-transform-flow-strip-types': 7.27.1 - '@babel/plugin-transform-for-of': 7.27.1 - '@babel/plugin-transform-function-name': 7.27.1 - '@babel/plugin-transform-literals': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators': 7.28.5 - '@babel/plugin-transform-modules-commonjs': 7.27.1 - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1 - '@babel/plugin-transform-numeric-separator': 7.27.1 - '@babel/plugin-transform-object-rest-spread': 7.28.4 - '@babel/plugin-transform-optional-catch-binding': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.5 - '@babel/plugin-transform-parameters': 7.27.7 - '@babel/plugin-transform-private-methods': 7.27.1 - '@babel/plugin-transform-private-property-in-object': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.28.0 - '@babel/plugin-transform-react-jsx': 7.27.1 - '@babel/plugin-transform-react-jsx-self': 7.25.9 - '@babel/plugin-transform-react-jsx-source': 7.25.9 - '@babel/plugin-transform-regenerator': 7.28.4 - '@babel/plugin-transform-runtime': 7.25.9 - '@babel/plugin-transform-shorthand-properties': 7.27.1 - '@babel/plugin-transform-spread': 7.27.1 - '@babel/plugin-transform-sticky-regex': 7.27.1 - '@babel/plugin-transform-typescript': 7.28.5 - '@babel/plugin-transform-unicode-regex': 7.27.1 - '@babel/template': 7.28.6 - '@react-native/babel-plugin-codegen': 0.81.6 - babel-plugin-syntax-hermes-parser: 0.29.1 - babel-plugin-transform-flow-enums: 0.0.2 - react-refresh: 0.14.2 - transitivePeerDependencies: - - supports-color - - '@react-native/babel-preset@0.81.6(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.28.5) @@ -53262,11 +53031,11 @@ snapshots: react-native: 0.81.6(patch_hash=fbb22f6ab81c7336a446f504c4aef2f23fc558838854399c868c5590e29ac9f1)(@babel/core@7.28.5)(@react-native-community/cli@15.1.0(@typescript/typescript6@6.0.2))(@types/react@19.0.14)(metro-transform-worker@0.81.5)(metro@0.81.5)(react@19.1.4) storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.0.14)(react-dom@19.1.4(react@19.1.4))(react@19.1.4) - '@storybook/addon-react-native-web@0.0.29(@react-native/babel-preset@0.81.6(@babel/core@7.28.5))(babel-plugin-react-native-web@0.19.10)(metro-react-native-babel-preset@0.77.0(@babel/core@7.28.5))(react-dom@19.1.4(react@19.1.4))(react@19.1.4)': + '@storybook/addon-react-native-web@0.0.29(@react-native/babel-preset@0.81.6)(babel-plugin-react-native-web@0.19.10)(metro-react-native-babel-preset@0.77.0(@babel/core@7.28.5))(react-dom@19.1.4(react@19.1.4))(react@19.1.4)': dependencies: babel-plugin-react-native-web: 0.19.10 optionalDependencies: - '@react-native/babel-preset': 0.81.6(@babel/core@7.28.5) + '@react-native/babel-preset': 0.81.6 metro-react-native-babel-preset: 0.77.0(@babel/core@7.28.5) react: 19.1.4 react-dom: 19.1.4(react@19.1.4) @@ -56867,14 +56636,6 @@ snapshots: reselect: 4.1.8 resolve: 1.22.8 - babel-plugin-polyfill-corejs2@0.4.14: - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): dependencies: '@babel/compat-data': 7.28.5 @@ -56884,13 +56645,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.6: - dependencies: - '@babel/helper-define-polyfill-provider': 0.6.5 - core-js-compat: 3.43.0 - transitivePeerDependencies: - - supports-color - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.28.5): dependencies: '@babel/core': 7.28.5 @@ -56907,12 +56661,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.5: - dependencies: - '@babel/helper-define-polyfill-provider': 0.6.5 - transitivePeerDependencies: - - supports-color - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): dependencies: '@babel/core': 7.28.5 @@ -56959,12 +56707,6 @@ snapshots: babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} - babel-plugin-transform-flow-enums@0.0.2: - dependencies: - '@babel/plugin-syntax-flow': 7.27.1 - transitivePeerDependencies: - - '@babel/core' - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.28.5): dependencies: '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) @@ -65963,7 +65705,7 @@ snapshots: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 - metro: 0.83.3 + metro: 0.83.3(metro-transform-worker@0.83.3) metro-babel-transformer: 0.83.3 metro-cache: 0.83.3 metro-cache-key: 0.83.3 @@ -66090,6 +65832,54 @@ snapshots: - supports-color - utf-8-validate + metro@0.83.3(metro-transform-worker@0.83.3): + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + accepts: 1.3.8 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.32.0 + image-size: 1.1.1 + invariant: 2.2.4 + jest-worker: 29.7.0(metro@0.83.3) + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-config: 0.83.3(metro-transform-worker@0.83.3) + metro-core: 0.83.3 + metro-file-map: 0.83.3(metro@0.83.3) + metro-resolver: 0.83.3 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + metro-symbolicate: 0.83.3 + metro-transform-plugins: 0.83.3 + metro-transform-worker: 0.83.3 + mime-types: 2.1.35 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.10 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - metro-transform-worker + - supports-color + - utf-8-validate + metro@0.83.7: dependencies: '@babel/code-frame': 7.29.0 @@ -72587,8 +72377,6 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - undici@6.19.2: {} - undici@6.21.1: {} undici@7.18.2: {} From 956d4a152187e6853b23fd72ab24e3f66c6c233d Mon Sep 17 00:00:00 2001 From: Sebastien David Date: Thu, 30 Jul 2026 16:24:13 +0200 Subject: [PATCH 2/2] feat(devtools): add debug ws to lwm --- .changeset/quiet-transport-wire.md | 6 + apps/ledger-live-mobile/package.json | 2 + .../DevToolsScreen.integration.test.tsx | 18 + .../DevTools/screens/DevToolsScreen/index.tsx | 14 +- .../DevToolsScreen/useDevToolsRelay.ts | 22 ++ .../useDevToolsScreenViewModel.ts | 18 +- .../src/state-manager/configureStore.ts | 4 +- .../src/state-manager/sleepingListener.ts | 3 + pnpm-lock.yaml | 333 +++++++++++++++--- 9 files changed, 352 insertions(+), 68 deletions(-) create mode 100644 .changeset/quiet-transport-wire.md create mode 100644 apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsRelay.ts create mode 100644 apps/ledger-live-mobile/src/state-manager/sleepingListener.ts diff --git a/.changeset/quiet-transport-wire.md b/.changeset/quiet-transport-wire.md new file mode 100644 index 000000000000..2db06da2b8f8 --- /dev/null +++ b/.changeset/quiet-transport-wire.md @@ -0,0 +1,6 @@ +--- +"ledger-live-desktop": minor +"live-mobile": minor +--- + +Add debug WebSocket transport to DevTools relay diff --git a/apps/ledger-live-mobile/package.json b/apps/ledger-live-mobile/package.json index d0ba2fa94e1a..8027af93885e 100644 --- a/apps/ledger-live-mobile/package.json +++ b/apps/ledger-live-mobile/package.json @@ -87,6 +87,8 @@ "@datadog/mobile-react-navigation": "2.8.2", "@devtools/bindings": "workspace:^", "@devtools/shell": "workspace:^", + "@devtools/transport-panel": "workspace:*", + "@devtools/wire": "workspace:*", "@domain/api-altcoins-sentiment": "workspace:^", "@domain/api-currency-fiat": "workspace:^", "@domain/api-currency-token": "workspace:^", diff --git a/apps/ledger-live-mobile/src/mvvm/features/DevTools/__integrations__/DevToolsScreen.integration.test.tsx b/apps/ledger-live-mobile/src/mvvm/features/DevTools/__integrations__/DevToolsScreen.integration.test.tsx index e66558741f42..85618c1f3bad 100644 --- a/apps/ledger-live-mobile/src/mvvm/features/DevTools/__integrations__/DevToolsScreen.integration.test.tsx +++ b/apps/ledger-live-mobile/src/mvvm/features/DevTools/__integrations__/DevToolsScreen.integration.test.tsx @@ -19,6 +19,24 @@ jest.mock( () => ({ useFeatureFlagsToolProps: () => ({ marker: "ff-props" }) }), { virtual: true }, ); +jest.mock("@devtools/transport-panel", () => ({ TransportPanel: () => null }), { virtual: true }); +jest.mock( + "@devtools/wire", + () => { + const wireState = { hubUrl: "ws://127.0.0.1:9090", role: "tool" }; + return { + buildTransport: () => ({ + transport: {}, + subscribe: () => () => {}, + getState: () => wireState, + setHubUrl: jest.fn(), + }), + buildCopyStoreProtocol: () => ({}), + combineProtocols: (...args: unknown[]) => args[0], + }; + }, + { virtual: true }, +); function withBottomInset(children: React.ReactNode) { return ( diff --git a/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/index.tsx b/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/index.tsx index a88e08195382..b672b8e1acca 100644 --- a/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/index.tsx +++ b/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/index.tsx @@ -1,9 +1,19 @@ import React from "react"; import { DevTools } from "@devtools/shell"; +import { TransportPanel } from "@devtools/transport-panel"; import { useDevToolsScreenViewModel } from "./useDevToolsScreenViewModel"; export default function DevToolsScreen() { - const { config, screenOptions } = useDevToolsScreenViewModel(); + const { config, screenOptions, transport, hubUrl, setHubUrl, role } = + useDevToolsScreenViewModel(); - return ; + return ( + + } + /> + ); } diff --git a/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsRelay.ts b/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsRelay.ts new file mode 100644 index 000000000000..36d1c8fc0d6e --- /dev/null +++ b/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsRelay.ts @@ -0,0 +1,22 @@ +import { useSyncExternalStore } from "react"; +import { buildTransport, buildCopyStoreProtocol, combineProtocols } from "@devtools/wire"; +import { store } from "~/state-manager/configureStore"; +import { sleepingListener } from "~/state-manager/sleepingListener"; + +const HUB_URL = "ws://127.0.0.1:9090"; +const ROLE = "host" as const; + +function buildRelay() { + return buildTransport( + { hubUrl: HUB_URL, role: ROLE, id: "lwm" }, + combineProtocols(buildCopyStoreProtocol(store, sleepingListener, ROLE)), + ); +} + +let relay: ReturnType | undefined; + +export function useDevToolsRelay() { + if (!relay) relay = buildRelay(); + const wireState = useSyncExternalStore(relay.subscribe, relay.getState, relay.getState); + return { wire: relay, wireState }; +} diff --git a/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsScreenViewModel.ts b/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsScreenViewModel.ts index 66856abe984d..fdda2a92f5d2 100644 --- a/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsScreenViewModel.ts +++ b/apps/ledger-live-mobile/src/mvvm/features/DevTools/screens/DevToolsScreen/useDevToolsScreenViewModel.ts @@ -5,22 +5,19 @@ import { useTheme } from "@ledgerhq/lumen-ui-rnative/styles"; import { getStackNavigationConfigV4 } from "LLM/components/Navigation"; import { useFeatureFlagsToolProps } from "@devtools/bindings"; import type { DevToolsConfig } from "@devtools/shell"; +import { useDevToolsRelay } from "./useDevToolsRelay"; -export function useDevToolsScreenViewModel(): { - config: DevToolsConfig; - screenOptions: NativeStackNavigationOptions; -} { +export function useDevToolsScreenViewModel() { const featureFlagsProps = useFeatureFlagsToolProps(); const { theme } = useTheme(); const { bottom } = useSafeAreaInsets(); + const { wire, wireState } = useDevToolsRelay(); const config: DevToolsConfig = useMemo( () => [{ id: "feature-flags", config: featureFlagsProps }], [featureFlagsProps], ); - // DevTools renders its own stack; reuse the app's config and add the bottom - // safe-area inset since DevTools only provides body content. const screenOptions: NativeStackNavigationOptions = useMemo(() => { const navConfig = getStackNavigationConfigV4(theme); return { @@ -29,5 +26,12 @@ export function useDevToolsScreenViewModel(): { }; }, [theme, bottom]); - return { config, screenOptions }; + return { + config, + screenOptions, + transport: wire.transport, + hubUrl: wireState.hubUrl, + setHubUrl: wire.setHubUrl, + role: wireState.role, + }; } diff --git a/apps/ledger-live-mobile/src/state-manager/configureStore.ts b/apps/ledger-live-mobile/src/state-manager/configureStore.ts index bac667603812..b33c19188811 100644 --- a/apps/ledger-live-mobile/src/state-manager/configureStore.ts +++ b/apps/ledger-live-mobile/src/state-manager/configureStore.ts @@ -24,6 +24,7 @@ import { altcoinsSentimentApiExtra } from "@domain/api-altcoins-sentiment"; import { payCardApiExtra } from "@domain/api-pay-card"; import { createFeatureFlagsMiddleware, type PartialFeatures } from "@shared/feature-flags"; import { fetchRemoteFlags } from "~/firebase/remoteConfig"; +import { sleepingListener } from "./sleepingListener"; import { createPkcePairWithExpoCrypto } from "~/helpers/pkce"; // This listenerMiddleware is cross-scope as it is preferable to have one instance per store @@ -102,7 +103,8 @@ export const store = configureStore({ fetchRemoteFlags, getAppLanguage: languageSelector, }), - ), + ) + .concat(sleepingListener.middleware), enhancers: getDefaultEnhancers => { const enhancers = getDefaultEnhancers(); diff --git a/apps/ledger-live-mobile/src/state-manager/sleepingListener.ts b/apps/ledger-live-mobile/src/state-manager/sleepingListener.ts new file mode 100644 index 000000000000..bf5387b00138 --- /dev/null +++ b/apps/ledger-live-mobile/src/state-manager/sleepingListener.ts @@ -0,0 +1,3 @@ +import { createListenerMiddleware } from "@reduxjs/toolkit"; + +export const sleepingListener = createListenerMiddleware(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 48104b83ac1f..5d4667077db3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -821,9 +821,6 @@ importers: '@devtools/bindings': specifier: workspace:* version: link:../../devtools/bindings - '@devtools/protocols': - specifier: workspace:* - version: link:../../devtools/protocols '@devtools/shell': specifier: workspace:^ version: link:../../devtools/shell @@ -1564,6 +1561,12 @@ importers: '@devtools/shell': specifier: workspace:^ version: link:../../devtools/shell + '@devtools/transport-panel': + specifier: workspace:* + version: link:../../devtools/transport-panel + '@devtools/wire': + specifier: workspace:* + version: link:../../devtools/wire '@domain/api-altcoins-sentiment': specifier: workspace:^ version: link:../../domain/api/altcoins-sentiment @@ -2212,7 +2215,7 @@ importers: version: 18.0.1 '@react-native/babel-preset': specifier: 'catalog:' - version: 0.81.6 + version: 0.81.6(@babel/core@7.28.5) '@react-native/codegen': specifier: 'catalog:' version: 0.81.6(@babel/core@7.28.5) @@ -12960,7 +12963,7 @@ importers: version: 0.81.6 '@react-native/babel-preset': specifier: 'catalog:' - version: 0.81.6 + version: 0.81.6(@babel/core@7.28.5) '@rsbuild/core': specifier: 'catalog:' version: 2.0.9 @@ -12984,7 +12987,7 @@ importers: version: 10.4.4(@storybook/react@10.4.1(@types/react@19.0.14)(@typescript/typescript6@6.0.2)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.0.14)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)))(react-native@0.81.6(patch_hash=fbb22f6ab81c7336a446f504c4aef2f23fc558838854399c868c5590e29ac9f1)(@babel/core@7.28.5)(@react-native-community/cli@15.1.0(@typescript/typescript6@6.0.2))(@types/react@19.0.14)(metro-transform-worker@0.81.5)(metro@0.81.5)(react@19.1.4))(react@19.1.4)(storybook@10.4.1(@testing-library/dom@10.4.1)(@types/react@19.0.14)(react-dom@19.1.4(react@19.1.4))(react@19.1.4)) '@storybook/addon-react-native-web': specifier: 'catalog:' - version: 0.0.29(@react-native/babel-preset@0.81.6)(babel-plugin-react-native-web@0.19.10)(metro-react-native-babel-preset@0.77.0(@babel/core@7.28.5))(react-dom@19.1.4(react@19.1.4))(react@19.1.4) + version: 0.0.29(@react-native/babel-preset@0.81.6(@babel/core@7.28.5))(babel-plugin-react-native-web@0.19.10)(metro-react-native-babel-preset@0.77.0(@babel/core@7.28.5))(react-dom@19.1.4(react@19.1.4))(react@19.1.4) '@storybook/jest': specifier: 'catalog:' version: 0.2.3 @@ -20627,6 +20630,8 @@ packages: '@react-native/babel-preset@0.81.6': resolution: {integrity: sha512-RtIr82ccPoyMLmIC3/vCG96MzRmIT+IzQkjCgTS5b93uAxiER9BS7+d1l7+zD00VanClt6CTBM4K4n6RCnAykg==} engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' '@react-native/codegen@0.77.3': resolution: {integrity: sha512-Q6ZJCE7h6Z3v3DiEZUnqzHbgwF3ZILN+ACTx6qu/x2X1cL96AatKwdX92e0+7J9RFg6gdoFYJgRrW8Q6VnWZsQ==} @@ -22822,7 +22827,7 @@ packages: metro-react-native-babel-preset: '*' react: 19.1.4 react-dom: 19.1.4 - webpack: ^5.89.0 + webpack: '*' peerDependenciesMeta: '@react-native/babel-preset': optional: true @@ -40457,6 +40462,16 @@ snapshots: regexpu-core: 6.2.0 semver: 6.3.1 + '@babel/helper-define-polyfill-provider@0.6.5': + dependencies: + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.12 + transitivePeerDependencies: + - supports-color + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40532,6 +40547,14 @@ snapshots: '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-remap-async-to-generator@7.27.1': + dependencies: + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40679,6 +40702,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-proposal-export-default-from@7.25.9': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40765,11 +40792,19 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-dynamic-import@7.8.3': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-export-default-from@7.25.9': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40780,6 +40815,10 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow@7.27.1': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40922,6 +40961,14 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-async-generator-functions@7.28.0': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40940,6 +40987,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-to-generator@7.27.1': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -40959,6 +41014,10 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-block-scoping@7.28.5': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41028,6 +41087,11 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.28.6 + '@babel/plugin-transform-computed-properties@7.27.1': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.28.6 + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41039,6 +41103,13 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring@7.28.5': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41091,12 +41162,24 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-flow-strip-types@7.27.1': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1 + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-for-of@7.27.1': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41114,6 +41197,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-function-name@7.27.1': + dependencies: + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41133,11 +41224,19 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-literals@7.27.1': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-logical-assignment-operators@7.28.5': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41189,6 +41288,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + dependencies: + '@babel/helper-create-regexp-features-plugin': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41209,6 +41313,10 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-numeric-separator@7.27.1': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41221,6 +41329,16 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/plugin-transform-object-rest-spread@7.28.4': + dependencies: + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.5 + '@babel/plugin-transform-parameters': 7.27.7 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41240,6 +41358,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-optional-catch-binding@7.27.1': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41265,11 +41387,22 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-parameters@7.27.7': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-private-methods@7.27.1': + dependencies: + '@babel/helper-create-class-features-plugin': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41287,6 +41420,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-property-in-object@7.27.1': + dependencies: + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41306,6 +41447,10 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-display-name@7.28.0': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41318,11 +41463,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx-self@7.25.9': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-source@7.25.9': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41339,6 +41492,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx@7.27.1': + dependencies: + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41356,6 +41519,10 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-regenerator@7.28.4': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41372,6 +41539,17 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-runtime@7.25.9': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.14 + babel-plugin-polyfill-corejs3: 0.10.6 + babel-plugin-polyfill-regenerator: 0.6.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41401,6 +41579,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-spread@7.27.1': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -41414,6 +41599,10 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-sticky-regex@7.27.1': + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -49549,6 +49738,55 @@ snapshots: - supports-color '@react-native/babel-preset@0.81.6': + dependencies: + '@babel/plugin-proposal-export-default-from': 7.25.9 + '@babel/plugin-syntax-dynamic-import': 7.8.3 + '@babel/plugin-syntax-export-default-from': 7.25.9 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3 + '@babel/plugin-transform-arrow-functions': 7.27.1 + '@babel/plugin-transform-async-generator-functions': 7.28.0 + '@babel/plugin-transform-async-to-generator': 7.27.1 + '@babel/plugin-transform-block-scoping': 7.28.5 + '@babel/plugin-transform-class-properties': 7.27.1 + '@babel/plugin-transform-classes': 7.28.4 + '@babel/plugin-transform-computed-properties': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.5 + '@babel/plugin-transform-flow-strip-types': 7.27.1 + '@babel/plugin-transform-for-of': 7.27.1 + '@babel/plugin-transform-function-name': 7.27.1 + '@babel/plugin-transform-literals': 7.27.1 + '@babel/plugin-transform-logical-assignment-operators': 7.28.5 + '@babel/plugin-transform-modules-commonjs': 7.27.1 + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1 + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1 + '@babel/plugin-transform-numeric-separator': 7.27.1 + '@babel/plugin-transform-object-rest-spread': 7.28.4 + '@babel/plugin-transform-optional-catch-binding': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.5 + '@babel/plugin-transform-parameters': 7.27.7 + '@babel/plugin-transform-private-methods': 7.27.1 + '@babel/plugin-transform-private-property-in-object': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0 + '@babel/plugin-transform-react-jsx': 7.27.1 + '@babel/plugin-transform-react-jsx-self': 7.25.9 + '@babel/plugin-transform-react-jsx-source': 7.25.9 + '@babel/plugin-transform-regenerator': 7.28.4 + '@babel/plugin-transform-runtime': 7.25.9 + '@babel/plugin-transform-shorthand-properties': 7.27.1 + '@babel/plugin-transform-spread': 7.27.1 + '@babel/plugin-transform-sticky-regex': 7.27.1 + '@babel/plugin-transform-typescript': 7.28.5 + '@babel/plugin-transform-unicode-regex': 7.27.1 + '@babel/template': 7.28.6 + '@react-native/babel-plugin-codegen': 0.81.6 + babel-plugin-syntax-hermes-parser: 0.29.1 + babel-plugin-transform-flow-enums: 0.0.2 + react-refresh: 0.14.2 + transitivePeerDependencies: + - supports-color + + '@react-native/babel-preset@0.81.6(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.28.5) @@ -53031,11 +53269,11 @@ snapshots: react-native: 0.81.6(patch_hash=fbb22f6ab81c7336a446f504c4aef2f23fc558838854399c868c5590e29ac9f1)(@babel/core@7.28.5)(@react-native-community/cli@15.1.0(@typescript/typescript6@6.0.2))(@types/react@19.0.14)(metro-transform-worker@0.81.5)(metro@0.81.5)(react@19.1.4) storybook: 10.4.1(@testing-library/dom@10.4.1)(@types/react@19.0.14)(react-dom@19.1.4(react@19.1.4))(react@19.1.4) - '@storybook/addon-react-native-web@0.0.29(@react-native/babel-preset@0.81.6)(babel-plugin-react-native-web@0.19.10)(metro-react-native-babel-preset@0.77.0(@babel/core@7.28.5))(react-dom@19.1.4(react@19.1.4))(react@19.1.4)': + '@storybook/addon-react-native-web@0.0.29(@react-native/babel-preset@0.81.6(@babel/core@7.28.5))(babel-plugin-react-native-web@0.19.10)(metro-react-native-babel-preset@0.77.0(@babel/core@7.28.5))(react-dom@19.1.4(react@19.1.4))(react@19.1.4)': dependencies: babel-plugin-react-native-web: 0.19.10 optionalDependencies: - '@react-native/babel-preset': 0.81.6 + '@react-native/babel-preset': 0.81.6(@babel/core@7.28.5) metro-react-native-babel-preset: 0.77.0(@babel/core@7.28.5) react: 19.1.4 react-dom: 19.1.4(react@19.1.4) @@ -56636,6 +56874,14 @@ snapshots: reselect: 4.1.8 resolve: 1.22.8 + babel-plugin-polyfill-corejs2@0.4.14: + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): dependencies: '@babel/compat-data': 7.28.5 @@ -56645,6 +56891,13 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs3@0.10.6: + dependencies: + '@babel/helper-define-polyfill-provider': 0.6.5 + core-js-compat: 3.43.0 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.28.5): dependencies: '@babel/core': 7.28.5 @@ -56661,6 +56914,12 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-regenerator@0.6.5: + dependencies: + '@babel/helper-define-polyfill-provider': 0.6.5 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): dependencies: '@babel/core': 7.28.5 @@ -56707,6 +56966,12 @@ snapshots: babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} + babel-plugin-transform-flow-enums@0.0.2: + dependencies: + '@babel/plugin-syntax-flow': 7.27.1 + transitivePeerDependencies: + - '@babel/core' + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.28.5): dependencies: '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) @@ -65705,7 +65970,7 @@ snapshots: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 - metro: 0.83.3(metro-transform-worker@0.83.3) + metro: 0.83.3 metro-babel-transformer: 0.83.3 metro-cache: 0.83.3 metro-cache-key: 0.83.3 @@ -65832,54 +66097,6 @@ snapshots: - supports-color - utf-8-validate - metro@0.83.3(metro-transform-worker@0.83.3): - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - accepts: 1.3.8 - chalk: 4.1.2 - ci-info: 2.0.0 - connect: 3.7.0 - debug: 4.4.3 - error-stack-parser: 2.1.4 - flow-enums-runtime: 0.0.6 - graceful-fs: 4.2.11 - hermes-parser: 0.32.0 - image-size: 1.1.1 - invariant: 2.2.4 - jest-worker: 29.7.0(metro@0.83.3) - jsc-safe-url: 0.2.4 - lodash.throttle: 4.1.1 - metro-babel-transformer: 0.83.3 - metro-cache: 0.83.3 - metro-cache-key: 0.83.3 - metro-config: 0.83.3(metro-transform-worker@0.83.3) - metro-core: 0.83.3 - metro-file-map: 0.83.3(metro@0.83.3) - metro-resolver: 0.83.3 - metro-runtime: 0.83.3 - metro-source-map: 0.83.3 - metro-symbolicate: 0.83.3 - metro-transform-plugins: 0.83.3 - metro-transform-worker: 0.83.3 - mime-types: 2.1.35 - nullthrows: 1.1.1 - serialize-error: 2.1.0 - source-map: 0.5.7 - throat: 5.0.0 - ws: 7.5.10 - yargs: 17.7.2 - transitivePeerDependencies: - - bufferutil - - metro-transform-worker - - supports-color - - utf-8-validate - metro@0.83.7: dependencies: '@babel/code-frame': 7.29.0