@ledgerhq/device-management-kit-devtools-ui 1.1.1
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/LICENSE.MD +202 -0
- package/lib/build/index.d.ts +2 -0
- package/lib/build/index.d.ts.map +1 -0
- package/lib/build/index.js +2 -0
- package/lib/build/index.js.map +1 -0
- package/lib/build/src/Dashboard.d.ts +5 -0
- package/lib/build/src/Dashboard.d.ts.map +1 -0
- package/lib/build/src/Dashboard.js +50 -0
- package/lib/build/src/Dashboard.js.map +1 -0
- package/lib/build/src/ErrorBoundary.d.ts +15 -0
- package/lib/build/src/ErrorBoundary.d.ts.map +1 -0
- package/lib/build/src/ErrorBoundary.js +23 -0
- package/lib/build/src/ErrorBoundary.js.map +1 -0
- package/lib/build/src/PluginEvents.d.ts +9 -0
- package/lib/build/src/PluginEvents.d.ts.map +1 -0
- package/lib/build/src/PluginEvents.js +2 -0
- package/lib/build/src/PluginEvents.js.map +1 -0
- package/lib/build/src/components/DashboardFooter.d.ts +8 -0
- package/lib/build/src/components/DashboardFooter.d.ts.map +1 -0
- package/lib/build/src/components/DashboardFooter.js +31 -0
- package/lib/build/src/components/DashboardFooter.js.map +1 -0
- package/lib/build/src/components/DashboardNavigationBar.d.ts +16 -0
- package/lib/build/src/components/DashboardNavigationBar.d.ts.map +1 -0
- package/lib/build/src/components/DashboardNavigationBar.js +85 -0
- package/lib/build/src/components/DashboardNavigationBar.js.map +1 -0
- package/lib/build/src/components/DebugDrawer.d.ts +18 -0
- package/lib/build/src/components/DebugDrawer.d.ts.map +1 -0
- package/lib/build/src/components/DebugDrawer.js +69 -0
- package/lib/build/src/components/DebugDrawer.js.map +1 -0
- package/lib/build/src/components/SplitView.d.ts +12 -0
- package/lib/build/src/components/SplitView.d.ts.map +1 -0
- package/lib/build/src/components/SplitView.js +50 -0
- package/lib/build/src/components/SplitView.js.map +1 -0
- package/lib/build/src/hooks/commandDispatcher.d.ts +28 -0
- package/lib/build/src/hooks/commandDispatcher.d.ts.map +1 -0
- package/lib/build/src/hooks/commandDispatcher.js +38 -0
- package/lib/build/src/hooks/commandDispatcher.js.map +1 -0
- package/lib/build/src/hooks/connectorMessageHandlers.d.ts +34 -0
- package/lib/build/src/hooks/connectorMessageHandlers.d.ts.map +1 -0
- package/lib/build/src/hooks/connectorMessageHandlers.js +85 -0
- package/lib/build/src/hooks/connectorMessageHandlers.js.map +1 -0
- package/lib/build/src/hooks/useConnectorMessages.d.ts +60 -0
- package/lib/build/src/hooks/useConnectorMessages.d.ts.map +1 -0
- package/lib/build/src/hooks/useConnectorMessages.js +138 -0
- package/lib/build/src/hooks/useConnectorMessages.js.map +1 -0
- package/lib/build/src/screens/debugDevTools/index.d.ts +17 -0
- package/lib/build/src/screens/debugDevTools/index.d.ts.map +1 -0
- package/lib/build/src/screens/debugDevTools/index.js +48 -0
- package/lib/build/src/screens/debugDevTools/index.js.map +1 -0
- package/lib/build/src/screens/inspector/ApduSender.d.ts +10 -0
- package/lib/build/src/screens/inspector/ApduSender.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/ApduSender.js +118 -0
- package/lib/build/src/screens/inspector/ApduSender.js.map +1 -0
- package/lib/build/src/screens/inspector/DeviceCard.d.ts +13 -0
- package/lib/build/src/screens/inspector/DeviceCard.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/DeviceCard.js +52 -0
- package/lib/build/src/screens/inspector/DeviceCard.js.map +1 -0
- package/lib/build/src/screens/inspector/DeviceDiscoverySection.d.ts +25 -0
- package/lib/build/src/screens/inspector/DeviceDiscoverySection.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/DeviceDiscoverySection.js +8 -0
- package/lib/build/src/screens/inspector/DeviceDiscoverySection.js.map +1 -0
- package/lib/build/src/screens/inspector/DiscoveredDeviceCard.d.ts +12 -0
- package/lib/build/src/screens/inspector/DiscoveredDeviceCard.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/DiscoveredDeviceCard.js +89 -0
- package/lib/build/src/screens/inspector/DiscoveredDeviceCard.js.map +1 -0
- package/lib/build/src/screens/inspector/MyLedgerProviderControl.d.ts +9 -0
- package/lib/build/src/screens/inspector/MyLedgerProviderControl.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/MyLedgerProviderControl.js +78 -0
- package/lib/build/src/screens/inspector/MyLedgerProviderControl.js.map +1 -0
- package/lib/build/src/screens/inspector/SessionsSection.d.ts +20 -0
- package/lib/build/src/screens/inspector/SessionsSection.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/SessionsSection.js +37 -0
- package/lib/build/src/screens/inspector/SessionsSection.js.map +1 -0
- package/lib/build/src/screens/inspector/index.d.ts +34 -0
- package/lib/build/src/screens/inspector/index.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/index.js +26 -0
- package/lib/build/src/screens/inspector/index.js.map +1 -0
- package/lib/build/src/screens/inspector/styles.d.ts +41 -0
- package/lib/build/src/screens/inspector/styles.d.ts.map +1 -0
- package/lib/build/src/screens/inspector/styles.js +266 -0
- package/lib/build/src/screens/inspector/styles.js.map +1 -0
- package/lib/build/src/screens/logger/FilterInput.d.ts +8 -0
- package/lib/build/src/screens/logger/FilterInput.d.ts.map +1 -0
- package/lib/build/src/screens/logger/FilterInput.js +179 -0
- package/lib/build/src/screens/logger/FilterInput.js.map +1 -0
- package/lib/build/src/screens/logger/LoggerOptions.d.ts +18 -0
- package/lib/build/src/screens/logger/LoggerOptions.d.ts.map +1 -0
- package/lib/build/src/screens/logger/LoggerOptions.js +75 -0
- package/lib/build/src/screens/logger/LoggerOptions.js.map +1 -0
- package/lib/build/src/screens/logger/LoggerToolbar.d.ts +19 -0
- package/lib/build/src/screens/logger/LoggerToolbar.d.ts.map +1 -0
- package/lib/build/src/screens/logger/LoggerToolbar.js +16 -0
- package/lib/build/src/screens/logger/LoggerToolbar.js.map +1 -0
- package/lib/build/src/screens/logger/SearchInput.d.ts +15 -0
- package/lib/build/src/screens/logger/SearchInput.d.ts.map +1 -0
- package/lib/build/src/screens/logger/SearchInput.js +93 -0
- package/lib/build/src/screens/logger/SearchInput.js.map +1 -0
- package/lib/build/src/screens/logger/filterUtils.d.ts +43 -0
- package/lib/build/src/screens/logger/filterUtils.d.ts.map +1 -0
- package/lib/build/src/screens/logger/filterUtils.js +125 -0
- package/lib/build/src/screens/logger/filterUtils.js.map +1 -0
- package/lib/build/src/screens/logger/filterUtils.test.d.ts +2 -0
- package/lib/build/src/screens/logger/filterUtils.test.d.ts.map +1 -0
- package/lib/build/src/screens/logger/filterUtils.test.js +300 -0
- package/lib/build/src/screens/logger/filterUtils.test.js.map +1 -0
- package/lib/build/src/screens/logger/index.d.ts +10 -0
- package/lib/build/src/screens/logger/index.d.ts.map +1 -0
- package/lib/build/src/screens/logger/index.js +86 -0
- package/lib/build/src/screens/logger/index.js.map +1 -0
- package/lib/build/src/screens/logger/inputStyles.d.ts +18 -0
- package/lib/build/src/screens/logger/inputStyles.d.ts.map +1 -0
- package/lib/build/src/screens/logger/inputStyles.js +46 -0
- package/lib/build/src/screens/logger/inputStyles.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/LogTableCells.d.ts +13 -0
- package/lib/build/src/screens/logger/logsTable/LogTableCells.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/LogTableCells.js +61 -0
- package/lib/build/src/screens/logger/logsTable/LogTableCells.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/ScrollDownButton.d.ts +8 -0
- package/lib/build/src/screens/logger/logsTable/ScrollDownButton.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/ScrollDownButton.js +20 -0
- package/lib/build/src/screens/logger/logsTable/ScrollDownButton.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableBody.d.ts +13 -0
- package/lib/build/src/screens/logger/logsTable/TableBody.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableBody.js +58 -0
- package/lib/build/src/screens/logger/logsTable/TableBody.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableColumns.d.ts +3 -0
- package/lib/build/src/screens/logger/logsTable/TableColumns.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableColumns.js +44 -0
- package/lib/build/src/screens/logger/logsTable/TableColumns.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableHeader.d.ts +9 -0
- package/lib/build/src/screens/logger/logsTable/TableHeader.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/TableHeader.js +53 -0
- package/lib/build/src/screens/logger/logsTable/TableHeader.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/constants.d.ts +21 -0
- package/lib/build/src/screens/logger/logsTable/constants.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/constants.js +21 -0
- package/lib/build/src/screens/logger/logsTable/constants.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/index.d.ts +11 -0
- package/lib/build/src/screens/logger/logsTable/index.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/index.js +116 -0
- package/lib/build/src/screens/logger/logsTable/index.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.d.ts +4 -0
- package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.js +17 -0
- package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useResizeObserver.d.ts +2 -0
- package/lib/build/src/screens/logger/logsTable/useResizeObserver.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useResizeObserver.js +28 -0
- package/lib/build/src/screens/logger/logsTable/useResizeObserver.js.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useScrollLogic.d.ts +12 -0
- package/lib/build/src/screens/logger/logsTable/useScrollLogic.d.ts.map +1 -0
- package/lib/build/src/screens/logger/logsTable/useScrollLogic.js +86 -0
- package/lib/build/src/screens/logger/logsTable/useScrollLogic.js.map +1 -0
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.d.ts +6 -0
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.d.ts.map +1 -0
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.js +17 -0
- package/lib/build/src/screens/logger/mapConnectorMessageToLogData.js.map +1 -0
- package/lib/build/src/screens/logger/types.d.ts +6 -0
- package/lib/build/src/screens/logger/types.d.ts.map +1 -0
- package/lib/build/src/screens/logger/types.js +2 -0
- package/lib/build/src/screens/logger/types.js.map +1 -0
- package/lib/build/src/screens/logger/useColumnSizeVars.d.ts +4 -0
- package/lib/build/src/screens/logger/useColumnSizeVars.d.ts.map +1 -0
- package/lib/build/src/screens/logger/useColumnSizeVars.js +17 -0
- package/lib/build/src/screens/logger/useColumnSizeVars.js.map +1 -0
- package/lib/build/src/screens/logger/useLogsDataAndOptions.d.ts +12 -0
- package/lib/build/src/screens/logger/useLogsDataAndOptions.d.ts.map +1 -0
- package/lib/build/src/screens/logger/useLogsDataAndOptions.js +36 -0
- package/lib/build/src/screens/logger/useLogsDataAndOptions.js.map +1 -0
- package/lib/build/src/screens/logger/useRecentFilters.d.ts +18 -0
- package/lib/build/src/screens/logger/useRecentFilters.d.ts.map +1 -0
- package/lib/build/src/screens/logger/useRecentFilters.js +96 -0
- package/lib/build/src/screens/logger/useRecentFilters.js.map +1 -0
- package/lib/build/src/screens/logger/useSearchState.d.ts +24 -0
- package/lib/build/src/screens/logger/useSearchState.d.ts.map +1 -0
- package/lib/build/src/screens/logger/useSearchState.js +74 -0
- package/lib/build/src/screens/logger/useSearchState.js.map +1 -0
- package/lib/build/src/shared/NotConnectedMessage.d.ts +9 -0
- package/lib/build/src/shared/NotConnectedMessage.d.ts.map +1 -0
- package/lib/build/src/shared/NotConnectedMessage.js +30 -0
- package/lib/build/src/shared/NotConnectedMessage.js.map +1 -0
- package/lib/build/src/shared/PluginEvents.d.ts +9 -0
- package/lib/build/src/shared/PluginEvents.d.ts.map +1 -0
- package/lib/build/src/shared/PluginEvents.js +2 -0
- package/lib/build/src/shared/PluginEvents.js.map +1 -0
- package/lib/build/tsconfig.build.tsbuildinfo +1 -0
- package/lib/cjs/index.js +2 -0
- package/lib/cjs/index.js.map +7 -0
- package/lib/cjs/package.json +73 -0
- package/lib/cjs/src/Dashboard.js +12 -0
- package/lib/cjs/src/Dashboard.js.map +7 -0
- package/lib/cjs/src/ErrorBoundary.js +2 -0
- package/lib/cjs/src/ErrorBoundary.js.map +7 -0
- package/lib/cjs/src/PluginEvents.js +2 -0
- package/lib/cjs/src/PluginEvents.js.map +7 -0
- package/lib/cjs/src/components/DashboardFooter.js +25 -0
- package/lib/cjs/src/components/DashboardFooter.js.map +7 -0
- package/lib/cjs/src/components/DashboardNavigationBar.js +64 -0
- package/lib/cjs/src/components/DashboardNavigationBar.js.map +7 -0
- package/lib/cjs/src/components/DebugDrawer.js +58 -0
- package/lib/cjs/src/components/DebugDrawer.js.map +7 -0
- package/lib/cjs/src/components/SplitView.js +37 -0
- package/lib/cjs/src/components/SplitView.js.map +7 -0
- package/lib/cjs/src/hooks/commandDispatcher.js +2 -0
- package/lib/cjs/src/hooks/commandDispatcher.js.map +7 -0
- package/lib/cjs/src/hooks/connectorMessageHandlers.js +2 -0
- package/lib/cjs/src/hooks/connectorMessageHandlers.js.map +7 -0
- package/lib/cjs/src/hooks/useConnectorMessages.js +2 -0
- package/lib/cjs/src/hooks/useConnectorMessages.js.map +7 -0
- package/lib/cjs/src/screens/debugDevTools/index.js +2 -0
- package/lib/cjs/src/screens/debugDevTools/index.js.map +7 -0
- package/lib/cjs/src/screens/inspector/ApduSender.js +79 -0
- package/lib/cjs/src/screens/inspector/ApduSender.js.map +7 -0
- package/lib/cjs/src/screens/inspector/DeviceCard.js +2 -0
- package/lib/cjs/src/screens/inspector/DeviceCard.js.map +7 -0
- package/lib/cjs/src/screens/inspector/DeviceDiscoverySection.js +2 -0
- package/lib/cjs/src/screens/inspector/DeviceDiscoverySection.js.map +7 -0
- package/lib/cjs/src/screens/inspector/DiscoveredDeviceCard.js +57 -0
- package/lib/cjs/src/screens/inspector/DiscoveredDeviceCard.js.map +7 -0
- package/lib/cjs/src/screens/inspector/MyLedgerProviderControl.js +40 -0
- package/lib/cjs/src/screens/inspector/MyLedgerProviderControl.js.map +7 -0
- package/lib/cjs/src/screens/inspector/SessionsSection.js +2 -0
- package/lib/cjs/src/screens/inspector/SessionsSection.js.map +7 -0
- package/lib/cjs/src/screens/inspector/index.js +9 -0
- package/lib/cjs/src/screens/inspector/index.js.map +7 -0
- package/lib/cjs/src/screens/inspector/styles.js +179 -0
- package/lib/cjs/src/screens/inspector/styles.js.map +7 -0
- package/lib/cjs/src/screens/logger/FilterInput.js +85 -0
- package/lib/cjs/src/screens/logger/FilterInput.js.map +7 -0
- package/lib/cjs/src/screens/logger/LoggerOptions.js +6 -0
- package/lib/cjs/src/screens/logger/LoggerOptions.js.map +7 -0
- package/lib/cjs/src/screens/logger/LoggerToolbar.js +9 -0
- package/lib/cjs/src/screens/logger/LoggerToolbar.js.map +7 -0
- package/lib/cjs/src/screens/logger/SearchInput.js +59 -0
- package/lib/cjs/src/screens/logger/SearchInput.js.map +7 -0
- package/lib/cjs/src/screens/logger/filterUtils.js +2 -0
- package/lib/cjs/src/screens/logger/filterUtils.js.map +7 -0
- package/lib/cjs/src/screens/logger/filterUtils.test.js +2 -0
- package/lib/cjs/src/screens/logger/filterUtils.test.js.map +7 -0
- package/lib/cjs/src/screens/logger/index.js +6 -0
- package/lib/cjs/src/screens/logger/index.js.map +7 -0
- package/lib/cjs/src/screens/logger/inputStyles.js +31 -0
- package/lib/cjs/src/screens/logger/inputStyles.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/LogTableCells.js +8 -0
- package/lib/cjs/src/screens/logger/logsTable/LogTableCells.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/ScrollDownButton.js +15 -0
- package/lib/cjs/src/screens/logger/logsTable/ScrollDownButton.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/TableBody.js +24 -0
- package/lib/cjs/src/screens/logger/logsTable/TableBody.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/TableColumns.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/TableColumns.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/TableHeader.js +33 -0
- package/lib/cjs/src/screens/logger/logsTable/TableHeader.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/constants.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/constants.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/index.js +26 -0
- package/lib/cjs/src/screens/logger/logsTable/index.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/useColumnSizeVars.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/useColumnSizeVars.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/useResizeObserver.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/useResizeObserver.js.map +7 -0
- package/lib/cjs/src/screens/logger/logsTable/useScrollLogic.js +2 -0
- package/lib/cjs/src/screens/logger/logsTable/useScrollLogic.js.map +7 -0
- package/lib/cjs/src/screens/logger/mapConnectorMessageToLogData.js +2 -0
- package/lib/cjs/src/screens/logger/mapConnectorMessageToLogData.js.map +7 -0
- package/lib/cjs/src/screens/logger/types.js +2 -0
- package/lib/cjs/src/screens/logger/types.js.map +7 -0
- package/lib/cjs/src/screens/logger/useColumnSizeVars.js +2 -0
- package/lib/cjs/src/screens/logger/useColumnSizeVars.js.map +7 -0
- package/lib/cjs/src/screens/logger/useLogsDataAndOptions.js +2 -0
- package/lib/cjs/src/screens/logger/useLogsDataAndOptions.js.map +7 -0
- package/lib/cjs/src/screens/logger/useRecentFilters.js +2 -0
- package/lib/cjs/src/screens/logger/useRecentFilters.js.map +7 -0
- package/lib/cjs/src/screens/logger/useSearchState.js +2 -0
- package/lib/cjs/src/screens/logger/useSearchState.js.map +7 -0
- package/lib/cjs/src/shared/NotConnectedMessage.js +24 -0
- package/lib/cjs/src/shared/NotConnectedMessage.js.map +7 -0
- package/lib/cjs/src/shared/PluginEvents.js +2 -0
- package/lib/cjs/src/shared/PluginEvents.js.map +7 -0
- package/lib/esm/index.js +2 -0
- package/lib/esm/index.js.map +7 -0
- package/lib/esm/package.json +73 -0
- package/lib/esm/src/Dashboard.js +12 -0
- package/lib/esm/src/Dashboard.js.map +7 -0
- package/lib/esm/src/ErrorBoundary.js +2 -0
- package/lib/esm/src/ErrorBoundary.js.map +7 -0
- package/lib/esm/src/PluginEvents.js +1 -0
- package/lib/esm/src/PluginEvents.js.map +7 -0
- package/lib/esm/src/components/DashboardFooter.js +25 -0
- package/lib/esm/src/components/DashboardFooter.js.map +7 -0
- package/lib/esm/src/components/DashboardNavigationBar.js +64 -0
- package/lib/esm/src/components/DashboardNavigationBar.js.map +7 -0
- package/lib/esm/src/components/DebugDrawer.js +58 -0
- package/lib/esm/src/components/DebugDrawer.js.map +7 -0
- package/lib/esm/src/components/SplitView.js +37 -0
- package/lib/esm/src/components/SplitView.js.map +7 -0
- package/lib/esm/src/hooks/commandDispatcher.js +2 -0
- package/lib/esm/src/hooks/commandDispatcher.js.map +7 -0
- package/lib/esm/src/hooks/connectorMessageHandlers.js +2 -0
- package/lib/esm/src/hooks/connectorMessageHandlers.js.map +7 -0
- package/lib/esm/src/hooks/useConnectorMessages.js +2 -0
- package/lib/esm/src/hooks/useConnectorMessages.js.map +7 -0
- package/lib/esm/src/screens/debugDevTools/index.js +2 -0
- package/lib/esm/src/screens/debugDevTools/index.js.map +7 -0
- package/lib/esm/src/screens/inspector/ApduSender.js +79 -0
- package/lib/esm/src/screens/inspector/ApduSender.js.map +7 -0
- package/lib/esm/src/screens/inspector/DeviceCard.js +2 -0
- package/lib/esm/src/screens/inspector/DeviceCard.js.map +7 -0
- package/lib/esm/src/screens/inspector/DeviceDiscoverySection.js +2 -0
- package/lib/esm/src/screens/inspector/DeviceDiscoverySection.js.map +7 -0
- package/lib/esm/src/screens/inspector/DiscoveredDeviceCard.js +57 -0
- package/lib/esm/src/screens/inspector/DiscoveredDeviceCard.js.map +7 -0
- package/lib/esm/src/screens/inspector/MyLedgerProviderControl.js +40 -0
- package/lib/esm/src/screens/inspector/MyLedgerProviderControl.js.map +7 -0
- package/lib/esm/src/screens/inspector/SessionsSection.js +2 -0
- package/lib/esm/src/screens/inspector/SessionsSection.js.map +7 -0
- package/lib/esm/src/screens/inspector/index.js +9 -0
- package/lib/esm/src/screens/inspector/index.js.map +7 -0
- package/lib/esm/src/screens/inspector/styles.js +179 -0
- package/lib/esm/src/screens/inspector/styles.js.map +7 -0
- package/lib/esm/src/screens/logger/FilterInput.js +85 -0
- package/lib/esm/src/screens/logger/FilterInput.js.map +7 -0
- package/lib/esm/src/screens/logger/LoggerOptions.js +6 -0
- package/lib/esm/src/screens/logger/LoggerOptions.js.map +7 -0
- package/lib/esm/src/screens/logger/LoggerToolbar.js +9 -0
- package/lib/esm/src/screens/logger/LoggerToolbar.js.map +7 -0
- package/lib/esm/src/screens/logger/SearchInput.js +59 -0
- package/lib/esm/src/screens/logger/SearchInput.js.map +7 -0
- package/lib/esm/src/screens/logger/filterUtils.js +2 -0
- package/lib/esm/src/screens/logger/filterUtils.js.map +7 -0
- package/lib/esm/src/screens/logger/filterUtils.test.js +2 -0
- package/lib/esm/src/screens/logger/filterUtils.test.js.map +7 -0
- package/lib/esm/src/screens/logger/index.js +6 -0
- package/lib/esm/src/screens/logger/index.js.map +7 -0
- package/lib/esm/src/screens/logger/inputStyles.js +31 -0
- package/lib/esm/src/screens/logger/inputStyles.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/LogTableCells.js +8 -0
- package/lib/esm/src/screens/logger/logsTable/LogTableCells.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/ScrollDownButton.js +15 -0
- package/lib/esm/src/screens/logger/logsTable/ScrollDownButton.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/TableBody.js +24 -0
- package/lib/esm/src/screens/logger/logsTable/TableBody.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/TableColumns.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/TableColumns.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/TableHeader.js +33 -0
- package/lib/esm/src/screens/logger/logsTable/TableHeader.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/constants.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/constants.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/index.js +26 -0
- package/lib/esm/src/screens/logger/logsTable/index.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/useColumnSizeVars.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/useColumnSizeVars.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/useResizeObserver.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/useResizeObserver.js.map +7 -0
- package/lib/esm/src/screens/logger/logsTable/useScrollLogic.js +2 -0
- package/lib/esm/src/screens/logger/logsTable/useScrollLogic.js.map +7 -0
- package/lib/esm/src/screens/logger/mapConnectorMessageToLogData.js +2 -0
- package/lib/esm/src/screens/logger/mapConnectorMessageToLogData.js.map +7 -0
- package/lib/esm/src/screens/logger/types.js +1 -0
- package/lib/esm/src/screens/logger/types.js.map +7 -0
- package/lib/esm/src/screens/logger/useColumnSizeVars.js +2 -0
- package/lib/esm/src/screens/logger/useColumnSizeVars.js.map +7 -0
- package/lib/esm/src/screens/logger/useLogsDataAndOptions.js +2 -0
- package/lib/esm/src/screens/logger/useLogsDataAndOptions.js.map +7 -0
- package/lib/esm/src/screens/logger/useRecentFilters.js +2 -0
- package/lib/esm/src/screens/logger/useRecentFilters.js.map +7 -0
- package/lib/esm/src/screens/logger/useSearchState.js +2 -0
- package/lib/esm/src/screens/logger/useSearchState.js.map +7 -0
- package/lib/esm/src/shared/NotConnectedMessage.js +24 -0
- package/lib/esm/src/shared/NotConnectedMessage.js.map +7 -0
- package/lib/esm/src/shared/PluginEvents.js +1 -0
- package/lib/esm/src/shared/PluginEvents.js.map +7 -0
- package/package.json +73 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import{useEffect as p,useState as l}from"react";import n from"styled-components";import{jsx as s,jsxs as v}from"react/jsx-runtime";const c=n.div`
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: row;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: 8px;
|
|
6
|
+
padding: 12px 16px;
|
|
7
|
+
background: #f5f5f5;
|
|
8
|
+
border-radius: 8px;
|
|
9
|
+
margin-bottom: 16px;
|
|
10
|
+
`,b=n.label`
|
|
11
|
+
font-size: 14px;
|
|
12
|
+
font-weight: 500;
|
|
13
|
+
color: #333;
|
|
14
|
+
`,x=n.input`
|
|
15
|
+
width: 80px;
|
|
16
|
+
padding: 6px 8px;
|
|
17
|
+
border: 1px solid #ddd;
|
|
18
|
+
border-radius: 4px;
|
|
19
|
+
font-size: 14px;
|
|
20
|
+
font-family: monospace;
|
|
21
|
+
|
|
22
|
+
&:focus {
|
|
23
|
+
outline: none;
|
|
24
|
+
border-color: #2196f3;
|
|
25
|
+
}
|
|
26
|
+
`,h=n.button`
|
|
27
|
+
padding: 4px 8px;
|
|
28
|
+
border: 1px solid #ddd;
|
|
29
|
+
border-radius: 4px;
|
|
30
|
+
background: white;
|
|
31
|
+
font-size: 14px;
|
|
32
|
+
cursor: pointer;
|
|
33
|
+
transition: all 0.15s ease;
|
|
34
|
+
|
|
35
|
+
&:hover {
|
|
36
|
+
background: #f0f0f0;
|
|
37
|
+
border-color: #bbb;
|
|
38
|
+
}
|
|
39
|
+
`,I=({currentValue:e,onGet:r,onSet:f})=>{const[u,t]=l(""),[a,i]=l(!1);return p(()=>{r()},[r]),p(()=>{e!==null&&!a&&t(String(e))},[e,a]),v(c,{children:[s(b,{htmlFor:"provider-input",children:"My Ledger API provider:"}),s(x,{id:"provider-input",type:"number",min:"0",value:u,onChange:g=>{const d=g.target.value;t(d),i(!0);const o=parseInt(d,10);!isNaN(o)&&o>=0&&String(o)===d&&f(o)},onBlur:()=>i(!1)}),s(h,{onClick:()=>{i(!1),r(),e!==null&&t(String(e))},title:"Refresh",children:"\u{1F504}"})]})};export{I as MyLedgerProviderControl};
|
|
40
|
+
//# sourceMappingURL=MyLedgerProviderControl.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/inspector/MyLedgerProviderControl.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #f5f5f5;\n border-radius: 8px;\n margin-bottom: 16px;\n`;\n\nconst Label = styled.label`\n font-size: 14px;\n font-weight: 500;\n color: #333;\n`;\n\nconst Input = styled.input`\n width: 80px;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n font-family: monospace;\n\n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n`;\n\nconst RefreshButton = styled.button`\n padding: 4px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n background: white;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover {\n background: #f0f0f0;\n border-color: #bbb;\n }\n`;\n\ntype MyLedgerProviderControlProps = {\n currentValue: number | null;\n onGet: () => void;\n onSet: (value: number) => void;\n};\n\nexport const MyLedgerProviderControl: React.FC<\n MyLedgerProviderControlProps\n> = ({ currentValue, onGet, onSet }) => {\n const [inputValue, setInputValue] = useState<string>(\"\");\n const [isEditing, setIsEditing] = useState(false);\n\n // Fetch provider value on mount\n useEffect(() => {\n onGet();\n }, [onGet]);\n\n // Sync input with current value when it changes from server (only if not actively editing)\n useEffect(() => {\n if (currentValue !== null && !isEditing) {\n setInputValue(String(currentValue));\n }\n }, [currentValue, isEditing]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setInputValue(value);\n setIsEditing(true);\n\n const parsed = parseInt(value, 10);\n if (!isNaN(parsed) && parsed >= 0 && String(parsed) === value) {\n onSet(parsed);\n }\n };\n\n const handleRefresh = () => {\n setIsEditing(false);\n onGet();\n // Immediately sync to current value if available\n if (currentValue !== null) {\n setInputValue(String(currentValue));\n }\n };\n\n return (\n <Container>\n <Label htmlFor=\"provider-input\">My Ledger API provider:</Label>\n <Input\n id=\"provider-input\"\n type=\"number\"\n min=\"0\"\n value={inputValue}\n onChange={handleChange}\n onBlur={() => setIsEditing(false)}\n />\n <RefreshButton onClick={handleRefresh} title=\"Refresh\">\n \uD83D\uDD04\n </RefreshButton>\n </Container>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAAA,OAAgB,aAAAA,EAAW,YAAAC,MAAgB,QAC3C,OAAOC,MAAY,oBA6Ff,OACE,OAAAC,EADF,QAAAC,MAAA,oBA3FJ,MAAMC,EAAYH,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWnBI,EAAQJ,EAAO;AAAA;AAAA;AAAA;AAAA,EAMfK,EAAQL,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcfM,EAAgBN,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBhBO,EAET,CAAC,CAAE,aAAAC,EAAc,MAAAC,EAAO,MAAAC,CAAM,IAAM,CACtC,KAAM,CAACC,EAAYC,CAAa,EAAIb,EAAiB,EAAE,EACjD,CAACc,EAAWC,CAAY,EAAIf,EAAS,EAAK,EAGhD,OAAAD,EAAU,IAAM,CACdW,EAAM,CACR,EAAG,CAACA,CAAK,CAAC,EAGVX,EAAU,IAAM,CACVU,IAAiB,MAAQ,CAACK,GAC5BD,EAAc,OAAOJ,CAAY,CAAC,CAEtC,EAAG,CAACA,EAAcK,CAAS,CAAC,EAuB1BX,EAACC,EAAA,CACC,UAAAF,EAACG,EAAA,CAAM,QAAQ,iBAAiB,mCAAuB,EACvDH,EAACI,EAAA,CACC,GAAG,iBACH,KAAK,SACL,IAAI,IACJ,MAAOM,EACP,SA5BgBI,GAA2C,CAC/D,MAAMC,EAAQD,EAAE,OAAO,MACvBH,EAAcI,CAAK,EACnBF,EAAa,EAAI,EAEjB,MAAMG,EAAS,SAASD,EAAO,EAAE,EAC7B,CAAC,MAAMC,CAAM,GAAKA,GAAU,GAAK,OAAOA,CAAM,IAAMD,GACtDN,EAAMO,CAAM,CAEhB,EAoBM,OAAQ,IAAMH,EAAa,EAAK,EAClC,EACAb,EAACK,EAAA,CAAc,QApBG,IAAM,CAC1BQ,EAAa,EAAK,EAClBL,EAAM,EAEFD,IAAiB,MACnBI,EAAc,OAAOJ,CAAY,CAAC,CAEtC,EAa2C,MAAM,UAAU,qBAEvD,GACF,CAEJ",
|
|
6
|
+
"names": ["useEffect", "useState", "styled", "jsx", "jsxs", "Container", "Label", "Input", "RefreshButton", "MyLedgerProviderControl", "currentValue", "onGet", "onSet", "inputValue", "setInputValue", "isEditing", "setIsEditing", "e", "value", "parsed"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useMemo as m}from"react";import{DeviceCard as S}from"./DeviceCard";import{CenteredMessage as l,DeviceList as g,SectionTitle as C,SubsectionTitle as f}from"./styles";import{Fragment as p,jsx as n,jsxs as o}from"react/jsx-runtime";const y=(t,s)=>{const i=s.get(t.sessionId);return i?i.deviceStatus!=="NOT CONNECTED":!0},R=({devices:t,sessionStates:s,onDisconnect:i,onSendApdu:a,apduResponses:v,isAnyDiscoveryActive:u})=>{const{activeDevices:c,disconnectedDevices:r}=m(()=>{const e=[],D=[];for(const d of t)y(d,s)?e.push(d):D.push(d);return{activeDevices:e,disconnectedDevices:D}},[t,s]);return t.length===0&&!u?n(l,{children:n("p",{children:"No devices connected yet."})}):o(p,{children:[c.length>0&&o(p,{children:[o(C,{children:["Active Sessions (",c.length,")"]}),n(g,{style:{marginBottom:16},children:c.map(e=>n(S,{device:e,state:s.get(e.sessionId),onDisconnect:()=>i(e.sessionId),onSendApdu:a,apduResponses:v},e.sessionId))})]}),r.length>0&&o(p,{children:[o(f,{children:["Inactive Sessions (",r.length,")"]}),n(g,{children:r.map(e=>n(S,{device:e,state:s.get(e.sessionId),onDisconnect:()=>i(e.sessionId),onSendApdu:a,apduResponses:v},e.sessionId))})]})]})};export{R as SessionsSection};
|
|
2
|
+
//# sourceMappingURL=SessionsSection.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/inspector/SessionsSection.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * @file SessionsSection\n *\n * Section of the Inspector that displays device sessions.\n * Shows active sessions (connected devices) and disconnected sessions separately.\n */\n\nimport React, { useMemo } from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type ApduResponse } from \"../../hooks/useConnectorMessages\";\nimport { DeviceCard } from \"./DeviceCard\";\nimport {\n CenteredMessage,\n DeviceList,\n SectionTitle,\n SubsectionTitle,\n} from \"./styles\";\n\ntype SessionsSectionProps = {\n devices: ConnectedDevice[];\n sessionStates: Map<string, DeviceSessionState>;\n onDisconnect: (sessionId: string) => void;\n onSendApdu: (sessionId: string, apduHex: string) => string;\n apduResponses: Map<string, ApduResponse>;\n isAnyDiscoveryActive: boolean;\n};\n\nconst isDeviceConnected = (\n device: ConnectedDevice,\n sessionStates: Map<string, DeviceSessionState>,\n): boolean => {\n const state = sessionStates.get(device.sessionId);\n if (!state) return true; // Assume connected if no state yet\n return state.deviceStatus !== \"NOT CONNECTED\";\n};\n\nexport const SessionsSection: React.FC<SessionsSectionProps> = ({\n devices,\n sessionStates,\n onDisconnect,\n onSendApdu,\n apduResponses,\n isAnyDiscoveryActive,\n}) => {\n const { activeDevices, disconnectedDevices } = useMemo(() => {\n const active: ConnectedDevice[] = [];\n const disconnected: ConnectedDevice[] = [];\n\n for (const device of devices) {\n if (isDeviceConnected(device, sessionStates)) {\n active.push(device);\n } else {\n disconnected.push(device);\n }\n }\n\n return { activeDevices: active, disconnectedDevices: disconnected };\n }, [devices, sessionStates]);\n\n // Empty state\n if (devices.length === 0 && !isAnyDiscoveryActive) {\n return (\n <CenteredMessage>\n <p>No devices connected yet.</p>\n </CenteredMessage>\n );\n }\n\n return (\n <>\n {/* Active Sessions */}\n {activeDevices.length > 0 && (\n <>\n <SectionTitle>Active Sessions ({activeDevices.length})</SectionTitle>\n <DeviceList style={{ marginBottom: 16 }}>\n {activeDevices.map((device) => (\n <DeviceCard\n key={device.sessionId}\n device={device}\n state={sessionStates.get(device.sessionId)}\n onDisconnect={() => onDisconnect(device.sessionId)}\n onSendApdu={onSendApdu}\n apduResponses={apduResponses}\n />\n ))}\n </DeviceList>\n </>\n )}\n\n {/* Disconnected Sessions */}\n {disconnectedDevices.length > 0 && (\n <>\n <SubsectionTitle>\n Inactive Sessions ({disconnectedDevices.length})\n </SubsectionTitle>\n <DeviceList>\n {disconnectedDevices.map((device) => (\n <DeviceCard\n key={device.sessionId}\n device={device}\n state={sessionStates.get(device.sessionId)}\n onDisconnect={() => onDisconnect(device.sessionId)}\n onSendApdu={onSendApdu}\n apduResponses={apduResponses}\n />\n ))}\n </DeviceList>\n </>\n )}\n </>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAOA,OAAgB,WAAAA,MAAe,QAO/B,OAAS,cAAAC,MAAkB,eAC3B,OACE,mBAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,mBAAAC,MACK,WA+CC,OASA,YAAAC,EATA,OAAAC,EAUE,QAAAC,MAVF,oBApCR,MAAMC,EAAoB,CACxBC,EACAC,IACY,CACZ,MAAMC,EAAQD,EAAc,IAAID,EAAO,SAAS,EAChD,OAAKE,EACEA,EAAM,eAAiB,gBADX,EAErB,EAEaC,EAAkD,CAAC,CAC9D,QAAAC,EACA,cAAAH,EACA,aAAAI,EACA,WAAAC,EACA,cAAAC,EACA,qBAAAC,CACF,IAAM,CACJ,KAAM,CAAE,cAAAC,EAAe,oBAAAC,CAAoB,EAAIpB,EAAQ,IAAM,CAC3D,MAAMqB,EAA4B,CAAC,EAC7BC,EAAkC,CAAC,EAEzC,UAAWZ,KAAUI,EACfL,EAAkBC,EAAQC,CAAa,EACzCU,EAAO,KAAKX,CAAM,EAElBY,EAAa,KAAKZ,CAAM,EAI5B,MAAO,CAAE,cAAeW,EAAQ,oBAAqBC,CAAa,CACpE,EAAG,CAACR,EAASH,CAAa,CAAC,EAG3B,OAAIG,EAAQ,SAAW,GAAK,CAACI,EAEzBX,EAACL,EAAA,CACC,SAAAK,EAAC,KAAE,qCAAyB,EAC9B,EAKFC,EAAAF,EAAA,CAEG,UAAAa,EAAc,OAAS,GACtBX,EAAAF,EAAA,CACE,UAAAE,EAACJ,EAAA,CAAa,8BAAkBe,EAAc,OAAO,KAAC,EACtDZ,EAACJ,EAAA,CAAW,MAAO,CAAE,aAAc,EAAG,EACnC,SAAAgB,EAAc,IAAKT,GAClBH,EAACN,EAAA,CAEC,OAAQS,EACR,MAAOC,EAAc,IAAID,EAAO,SAAS,EACzC,aAAc,IAAMK,EAAaL,EAAO,SAAS,EACjD,WAAYM,EACZ,cAAeC,GALVP,EAAO,SAMd,CACD,EACH,GACF,EAIDU,EAAoB,OAAS,GAC5BZ,EAAAF,EAAA,CACE,UAAAE,EAACH,EAAA,CAAgB,gCACKe,EAAoB,OAAO,KACjD,EACAb,EAACJ,EAAA,CACE,SAAAiB,EAAoB,IAAKV,GACxBH,EAACN,EAAA,CAEC,OAAQS,EACR,MAAOC,EAAc,IAAID,EAAO,SAAS,EACzC,aAAc,IAAMK,EAAaL,EAAO,SAAS,EACjD,WAAYM,EACZ,cAAeC,GALVP,EAAO,SAMd,CACD,EACH,GACF,GAEJ,CAEJ",
|
|
6
|
+
"names": ["useMemo", "DeviceCard", "CenteredMessage", "DeviceList", "SectionTitle", "SubsectionTitle", "Fragment", "jsx", "jsxs", "isDeviceConnected", "device", "sessionStates", "state", "SessionsSection", "devices", "onDisconnect", "onSendApdu", "apduResponses", "isAnyDiscoveryActive", "activeDevices", "disconnectedDevices", "active", "disconnected"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{INSPECTOR_COMMAND_TYPES as C}from"@ledgerhq/device-management-kit-devtools-core";import{NotConnectedMessage as I}from"../../shared/NotConnectedMessage";import{DeviceDiscoverySection as b}from"./DeviceDiscoverySection";import{MyLedgerProviderControl as A}from"./MyLedgerProviderControl";import{SessionsSection as M}from"./SessionsSection";import{Container as R}from"./styles";import{Fragment as P,jsx as e,jsxs as n}from"react/jsx-runtime";const E=`import { DevToolsDmkInspector } from "@ledgerhq/device-management-kit-devtools-core";
|
|
2
|
+
|
|
3
|
+
const dmk = new DeviceManagementKitBuilder()
|
|
4
|
+
.addLogger(logger)
|
|
5
|
+
.build();
|
|
6
|
+
|
|
7
|
+
// Enable inspector after DMK is built
|
|
8
|
+
new DevToolsDmkInspector(connector, dmk);`,w=({devices:s,sessionStates:t,discoveredDevices:r,isListening:o,isActivelyDiscovering:i,sendMessage:c,isConnected:d,startListening:p,stopListening:v,startDiscovering:a,stopDiscovering:D,connectDevice:g,providerValue:l,getProvider:m,setProvider:u,sendApdu:y,apduResponses:f})=>d?n(R,{children:[e(A,{currentValue:l,onGet:m,onSet:u}),e(b,{discoveredDevices:r,isListening:o,isActivelyDiscovering:i,startListening:p,stopListening:v,startDiscovering:a,stopDiscovering:D,connectDevice:g}),e(M,{devices:s,sessionStates:t,onDisconnect:S=>{c(C.DISCONNECT,JSON.stringify({sessionId:S}))},onSendApdu:y,apduResponses:f,isAnyDiscoveryActive:o||i})]}):e(I,{title:"Inspector not connected",description:n(P,{children:["To enable the Inspector, add ",e("code",{children:"DevToolsDmkInspector"})," to your app after building the DMK:"]}),codeExample:E});export{w as Inspector};
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/inspector/index.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * @file Inspector screen\n *\n * Main Inspector component that provides device management capabilities.\n * Composes several section components for a clear separation of concerns.\n */\n\nimport React from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n type DiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { INSPECTOR_COMMAND_TYPES } from \"@ledgerhq/device-management-kit-devtools-core\";\n\nimport { type ApduResponse } from \"../../hooks/useConnectorMessages\";\nimport { NotConnectedMessage } from \"../../shared/NotConnectedMessage\";\nimport { DeviceDiscoverySection } from \"./DeviceDiscoverySection\";\nimport { MyLedgerProviderControl } from \"./MyLedgerProviderControl\";\nimport { SessionsSection } from \"./SessionsSection\";\nimport { Container } from \"./styles\";\n\ntype InspectorProps = {\n devices: ConnectedDevice[];\n sessionStates: Map<string, DeviceSessionState>;\n discoveredDevices: DiscoveredDevice[];\n isListening: boolean;\n isActivelyDiscovering: boolean;\n sendMessage: (type: string, payload: string) => void;\n isConnected: boolean;\n startListening: () => void;\n stopListening: () => void;\n startDiscovering: () => void;\n stopDiscovering: () => void;\n connectDevice: (\n deviceId: string,\n sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n },\n ) => void;\n providerValue: number | null;\n getProvider: () => void;\n setProvider: (value: number) => void;\n sendApdu: (sessionId: string, apduHex: string) => string;\n apduResponses: Map<string, ApduResponse>;\n};\n\nconst INSPECTOR_CODE_EXAMPLE = `import { DevToolsDmkInspector } from \"@ledgerhq/device-management-kit-devtools-core\";\n\nconst dmk = new DeviceManagementKitBuilder()\n .addLogger(logger)\n .build();\n\n// Enable inspector after DMK is built\nnew DevToolsDmkInspector(connector, dmk);`;\n\nexport const Inspector: React.FC<InspectorProps> = ({\n devices,\n sessionStates,\n discoveredDevices,\n isListening,\n isActivelyDiscovering,\n sendMessage,\n isConnected,\n startListening,\n stopListening,\n startDiscovering,\n stopDiscovering,\n connectDevice,\n providerValue,\n getProvider,\n setProvider,\n sendApdu,\n apduResponses,\n}) => {\n if (!isConnected) {\n return (\n <NotConnectedMessage\n title=\"Inspector not connected\"\n description={\n <>\n To enable the Inspector, add <code>DevToolsDmkInspector</code> to\n your app after building the DMK:\n </>\n }\n codeExample={INSPECTOR_CODE_EXAMPLE}\n />\n );\n }\n\n const handleDisconnect = (sessionId: string) => {\n sendMessage(\n INSPECTOR_COMMAND_TYPES.DISCONNECT,\n JSON.stringify({ sessionId }),\n );\n };\n\n const isAnyDiscoveryActive = isListening || isActivelyDiscovering;\n\n return (\n <Container>\n <MyLedgerProviderControl\n currentValue={providerValue}\n onGet={getProvider}\n onSet={setProvider}\n />\n\n <DeviceDiscoverySection\n discoveredDevices={discoveredDevices}\n isListening={isListening}\n isActivelyDiscovering={isActivelyDiscovering}\n startListening={startListening}\n stopListening={stopListening}\n startDiscovering={startDiscovering}\n stopDiscovering={stopDiscovering}\n connectDevice={connectDevice}\n />\n\n <SessionsSection\n devices={devices}\n sessionStates={sessionStates}\n onDisconnect={handleDisconnect}\n onSendApdu={sendApdu}\n apduResponses={apduResponses}\n isAnyDiscoveryActive={isAnyDiscoveryActive}\n />\n </Container>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAaA,OAAS,2BAAAA,MAA+B,gDAGxC,OAAS,uBAAAC,MAA2B,mCACpC,OAAS,0BAAAC,MAA8B,2BACvC,OAAS,2BAAAC,MAA+B,4BACxC,OAAS,mBAAAC,MAAuB,oBAChC,OAAS,aAAAC,MAAiB,WA6DhB,mBAAAC,EAC+B,OAAAC,EAD/B,QAAAC,MAAA,oBAjCV,MAAMC,EAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CASlBC,EAAsC,CAAC,CAClD,QAAAC,EACA,cAAAC,EACA,kBAAAC,EACA,YAAAC,EACA,sBAAAC,EACA,YAAAC,EACA,YAAAC,EACA,eAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,YAAAC,EACA,YAAAC,EACA,SAAAC,EACA,cAAAC,CACF,IACOV,EAyBHT,EAACH,EAAA,CACC,UAAAE,EAACJ,EAAA,CACC,aAAcoB,EACd,MAAOC,EACP,MAAOC,EACT,EAEAlB,EAACL,EAAA,CACC,kBAAmBW,EACnB,YAAaC,EACb,sBAAuBC,EACvB,eAAgBG,EAChB,cAAeC,EACf,iBAAkBC,EAClB,gBAAiBC,EACjB,cAAeC,EACjB,EAEAf,EAACH,EAAA,CACC,QAASO,EACT,cAAeC,EACf,aA/BoBgB,GAAsB,CAC9CZ,EACEhB,EAAwB,WACxB,KAAK,UAAU,CAAE,UAAA4B,CAAU,CAAC,CAC9B,CACF,EA2BM,WAAYF,EACZ,cAAeC,EACf,qBA3BuBb,GAAeC,EA4BxC,GACF,EAjDER,EAACN,EAAA,CACC,MAAM,0BACN,YACEO,EAAAF,EAAA,CAAE,0CAC6BC,EAAC,QAAK,gCAAoB,EAAO,wCAEhE,EAEF,YAAaE,EACf",
|
|
6
|
+
"names": ["INSPECTOR_COMMAND_TYPES", "NotConnectedMessage", "DeviceDiscoverySection", "MyLedgerProviderControl", "SessionsSection", "Container", "Fragment", "jsx", "jsxs", "INSPECTOR_CODE_EXAMPLE", "Inspector", "devices", "sessionStates", "discoveredDevices", "isListening", "isActivelyDiscovering", "sendMessage", "isConnected", "startListening", "stopListening", "startDiscovering", "stopDiscovering", "connectDevice", "providerValue", "getProvider", "setProvider", "sendApdu", "apduResponses", "sessionId"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import e,{css as n}from"styled-components";const r=n`
|
|
2
|
+
color: white;
|
|
3
|
+
border: none;
|
|
4
|
+
border-radius: 4px;
|
|
5
|
+
padding: 4px 12px;
|
|
6
|
+
cursor: pointer;
|
|
7
|
+
font-size: 14px;
|
|
8
|
+
|
|
9
|
+
&:disabled {
|
|
10
|
+
cursor: not-allowed;
|
|
11
|
+
opacity: 0.6;
|
|
12
|
+
}
|
|
13
|
+
`,d=e.button`
|
|
14
|
+
${r}
|
|
15
|
+
background: ${({$variant:t})=>{switch(t){case"danger":return"#ff4444";case"success":return"#4CAF50";case"warning":return"#ff9800";case"primary":default:return"#2196F3"}}};
|
|
16
|
+
padding: ${({$size:t})=>t==="medium"?"8px 16px":"4px 12px"};
|
|
17
|
+
|
|
18
|
+
&:disabled {
|
|
19
|
+
background: #ccc;
|
|
20
|
+
}
|
|
21
|
+
`,a=e.div`
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
padding: 16px;
|
|
25
|
+
border-radius: 8px;
|
|
26
|
+
border: 1px solid
|
|
27
|
+
${({$variant:t})=>{switch(t){case"discovered":return"#cce5ff";case"disconnected":return"#ddd";default:return"#ddd"}}};
|
|
28
|
+
background: ${({$variant:t})=>{switch(t){case"discovered":return"#f0f7ff";case"disconnected":return"#f0f0f0";default:return"#fafafa"}}};
|
|
29
|
+
opacity: ${({$variant:t})=>t==="disconnected"?.6:1};
|
|
30
|
+
`,p=e.div`
|
|
31
|
+
display: flex;
|
|
32
|
+
justify-content: space-between;
|
|
33
|
+
align-items: center;
|
|
34
|
+
margin-bottom: 8px;
|
|
35
|
+
`,s=e.div`
|
|
36
|
+
display: flex;
|
|
37
|
+
align-items: center;
|
|
38
|
+
gap: 8px;
|
|
39
|
+
`,c=e.h5`
|
|
40
|
+
margin: 0;
|
|
41
|
+
font-size: 16px;
|
|
42
|
+
font-weight: 600;
|
|
43
|
+
`,x=e.div`
|
|
44
|
+
display: flex;
|
|
45
|
+
flex-direction: column;
|
|
46
|
+
gap: 4px;
|
|
47
|
+
`,l=e.div`
|
|
48
|
+
display: flex;
|
|
49
|
+
flex-direction: column;
|
|
50
|
+
margin-top: 12px;
|
|
51
|
+
padding-top: 12px;
|
|
52
|
+
border-top: 1px solid #eee;
|
|
53
|
+
`,f=e.p`
|
|
54
|
+
font-size: 12px;
|
|
55
|
+
color: #666;
|
|
56
|
+
margin: 0;
|
|
57
|
+
`,g=e.span`
|
|
58
|
+
font-size: 12px;
|
|
59
|
+
color: #999;
|
|
60
|
+
`,u=e.p`
|
|
61
|
+
font-size: 12px;
|
|
62
|
+
color: #999;
|
|
63
|
+
font-style: italic;
|
|
64
|
+
margin: 12px 0 0 0;
|
|
65
|
+
`,b=e.p`
|
|
66
|
+
font-size: 12px;
|
|
67
|
+
color: #666;
|
|
68
|
+
font-weight: 600;
|
|
69
|
+
margin: 0 0 4px 0;
|
|
70
|
+
`,m=e.div`
|
|
71
|
+
display: flex;
|
|
72
|
+
flex-direction: column;
|
|
73
|
+
margin-bottom: 16px;
|
|
74
|
+
padding-bottom: 16px;
|
|
75
|
+
border-bottom: 1px solid #eee;
|
|
76
|
+
`,y=e.h4`
|
|
77
|
+
margin: 0 0 12px 0;
|
|
78
|
+
font-size: 18px;
|
|
79
|
+
font-weight: 600;
|
|
80
|
+
`,w=e.h5`
|
|
81
|
+
margin: 0 0 12px 0;
|
|
82
|
+
font-size: 16px;
|
|
83
|
+
font-weight: 500;
|
|
84
|
+
color: #666;
|
|
85
|
+
`,h=e.div`
|
|
86
|
+
display: flex;
|
|
87
|
+
gap: 12px;
|
|
88
|
+
margin-bottom: 12px;
|
|
89
|
+
`,v=e.div`
|
|
90
|
+
display: flex;
|
|
91
|
+
flex-direction: column;
|
|
92
|
+
gap: 12px;
|
|
93
|
+
`,C=e.div`
|
|
94
|
+
display: flex;
|
|
95
|
+
flex-direction: column;
|
|
96
|
+
flex: 1;
|
|
97
|
+
padding: 16px;
|
|
98
|
+
overflow: auto;
|
|
99
|
+
`,$=e.div`
|
|
100
|
+
display: flex;
|
|
101
|
+
flex-direction: column;
|
|
102
|
+
align-items: center;
|
|
103
|
+
justify-content: center;
|
|
104
|
+
flex: 1;
|
|
105
|
+
padding: 24px;
|
|
106
|
+
opacity: 0.6;
|
|
107
|
+
`,o={success:{bg:"#e8f5e9",border:"#c8e6c9",text:"#2e7d32",dot:"#4CAF50"},warning:{bg:"#fff3e0",border:"#ffe0b2",text:"#e65100",dot:"#ff9800"},error:{bg:"#ffebee",border:"#ffcdd2",text:"#c62828",dot:"#ff4444"},info:{bg:"#e3f2fd",border:"#bbdefb",text:"#1565c0",dot:"#2196F3"},neutral:{bg:"#f5f5f5",border:"#e0e0e0",text:"#616161",dot:"#9e9e9e"}},z=e.span`
|
|
108
|
+
display: inline-flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
gap: 6px;
|
|
111
|
+
padding: 2px 10px;
|
|
112
|
+
border-radius: 12px;
|
|
113
|
+
font-size: 11px;
|
|
114
|
+
font-weight: 600;
|
|
115
|
+
text-transform: uppercase;
|
|
116
|
+
letter-spacing: 0.3px;
|
|
117
|
+
line-height: 18px;
|
|
118
|
+
white-space: nowrap;
|
|
119
|
+
background: ${({$variant:t})=>o[t].bg};
|
|
120
|
+
border: 1px solid ${({$variant:t})=>o[t].border};
|
|
121
|
+
color: ${({$variant:t})=>o[t].text};
|
|
122
|
+
|
|
123
|
+
&::before {
|
|
124
|
+
content: "";
|
|
125
|
+
display: inline-block;
|
|
126
|
+
width: 6px;
|
|
127
|
+
height: 6px;
|
|
128
|
+
border-radius: 50%;
|
|
129
|
+
background: ${({$variant:t})=>o[t].dot};
|
|
130
|
+
}
|
|
131
|
+
`,B=e.div`
|
|
132
|
+
display: flex;
|
|
133
|
+
flex-wrap: wrap;
|
|
134
|
+
gap: 6px;
|
|
135
|
+
align-items: center;
|
|
136
|
+
`,k=e.div`
|
|
137
|
+
display: flex;
|
|
138
|
+
align-items: center;
|
|
139
|
+
gap: 8px;
|
|
140
|
+
cursor: pointer;
|
|
141
|
+
user-select: none;
|
|
142
|
+
`,S=e.span`
|
|
143
|
+
font-size: 10px;
|
|
144
|
+
color: #666;
|
|
145
|
+
transition: transform 0.15s ease;
|
|
146
|
+
transform: rotate(${({$expanded:t})=>t?"90deg":"0deg"});
|
|
147
|
+
display: inline-flex;
|
|
148
|
+
align-items: center;
|
|
149
|
+
justify-content: center;
|
|
150
|
+
width: 16px;
|
|
151
|
+
height: 16px;
|
|
152
|
+
`,T=e.div`
|
|
153
|
+
display: ${({$expanded:t})=>t?"flex":"none"};
|
|
154
|
+
flex-direction: column;
|
|
155
|
+
gap: 8px;
|
|
156
|
+
`,j=e.div`
|
|
157
|
+
display: flex;
|
|
158
|
+
flex-direction: column;
|
|
159
|
+
align-items: center;
|
|
160
|
+
justify-content: center;
|
|
161
|
+
flex: 1;
|
|
162
|
+
padding: 24px;
|
|
163
|
+
opacity: 0.6;
|
|
164
|
+
`,F=e.h3`
|
|
165
|
+
margin: 0 0 16px 0;
|
|
166
|
+
font-size: 24px;
|
|
167
|
+
`,N=e.p`
|
|
168
|
+
text-align: center;
|
|
169
|
+
max-width: 500px;
|
|
170
|
+
margin: 0;
|
|
171
|
+
`,H=e.pre`
|
|
172
|
+
background: #f5f5f5;
|
|
173
|
+
padding: 16px;
|
|
174
|
+
border-radius: 8px;
|
|
175
|
+
margin-top: 16px;
|
|
176
|
+
font-size: 12px;
|
|
177
|
+
overflow: auto;
|
|
178
|
+
`;export{B as BadgeRow,d as Button,h as ButtonGroup,a as Card,x as CardBody,p as CardHeader,s as CardHeaderLeft,l as CardSection,c as CardTitle,$ as CenteredMessage,H as CodeBlock,T as CollapsibleContent,k as CollapsibleHeader,S as CollapsibleToggle,C as Container,v as DeviceList,u as ItalicNote,g as MutedText,j as NotConnectedContainer,N as NotConnectedDescription,F as NotConnectedTitle,m as Section,b as SectionLabel,y as SectionTitle,f as SmallText,z as StatusBadge,w as SubsectionTitle};
|
|
179
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/inspector/styles.ts"],
|
|
4
|
+
"sourcesContent": ["import styled, { css } from \"styled-components\";\n\n// Shared button styles\nconst buttonBase = css`\n color: white;\n border: none;\n border-radius: 4px;\n padding: 4px 12px;\n cursor: pointer;\n font-size: 14px;\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n`;\n\nexport const Button = styled.button<{\n $variant?: \"danger\" | \"success\" | \"primary\" | \"warning\";\n $size?: \"small\" | \"medium\";\n}>`\n ${buttonBase}\n background: ${({ $variant }) => {\n switch ($variant) {\n case \"danger\":\n return \"#ff4444\";\n case \"success\":\n return \"#4CAF50\";\n case \"warning\":\n return \"#ff9800\";\n case \"primary\":\n default:\n return \"#2196F3\";\n }\n }};\n padding: ${({ $size }) => ($size === \"medium\" ? \"8px 16px\" : \"4px 12px\")};\n\n &:disabled {\n background: #ccc;\n }\n`;\n\n// Card styles\nexport const Card = styled.div<{\n $variant?: \"default\" | \"discovered\" | \"disconnected\";\n}>`\n display: flex;\n flex-direction: column;\n padding: 16px;\n border-radius: 8px;\n border: 1px solid\n ${({ $variant }) => {\n switch ($variant) {\n case \"discovered\":\n return \"#cce5ff\";\n case \"disconnected\":\n return \"#ddd\";\n default:\n return \"#ddd\";\n }\n }};\n background: ${({ $variant }) => {\n switch ($variant) {\n case \"discovered\":\n return \"#f0f7ff\";\n case \"disconnected\":\n return \"#f0f0f0\";\n default:\n return \"#fafafa\";\n }\n }};\n opacity: ${({ $variant }) => ($variant === \"disconnected\" ? 0.6 : 1)};\n`;\n\nexport const CardHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n`;\n\nexport const CardHeaderLeft = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const CardTitle = styled.h5`\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n`;\n\nexport const CardBody = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nexport const CardSection = styled.div`\n display: flex;\n flex-direction: column;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #eee;\n`;\n\n// Text styles\nexport const SmallText = styled.p`\n font-size: 12px;\n color: #666;\n margin: 0;\n`;\n\nexport const MutedText = styled.span`\n font-size: 12px;\n color: #999;\n`;\n\nexport const ItalicNote = styled.p`\n font-size: 12px;\n color: #999;\n font-style: italic;\n margin: 12px 0 0 0;\n`;\n\nexport const SectionLabel = styled.p`\n font-size: 12px;\n color: #666;\n font-weight: 600;\n margin: 0 0 4px 0;\n`;\n\n// Section styles\nexport const Section = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n padding-bottom: 16px;\n border-bottom: 1px solid #eee;\n`;\n\nexport const SectionTitle = styled.h4`\n margin: 0 0 12px 0;\n font-size: 18px;\n font-weight: 600;\n`;\n\nexport const SubsectionTitle = styled.h5`\n margin: 0 0 12px 0;\n font-size: 16px;\n font-weight: 500;\n color: #666;\n`;\n\nexport const ButtonGroup = styled.div`\n display: flex;\n gap: 12px;\n margin-bottom: 12px;\n`;\n\nexport const DeviceList = styled.div`\n display: flex;\n flex-direction: column;\n gap: 12px;\n`;\n\n// Container styles\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n padding: 16px;\n overflow: auto;\n`;\n\nexport const CenteredMessage = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 24px;\n opacity: 0.6;\n`;\n\n// Status badge styles\ntype BadgeVariant = \"success\" | \"warning\" | \"error\" | \"info\" | \"neutral\";\n\nconst badgeColors: Record<\n BadgeVariant,\n { bg: string; border: string; text: string; dot: string }\n> = {\n success: {\n bg: \"#e8f5e9\",\n border: \"#c8e6c9\",\n text: \"#2e7d32\",\n dot: \"#4CAF50\",\n },\n warning: {\n bg: \"#fff3e0\",\n border: \"#ffe0b2\",\n text: \"#e65100\",\n dot: \"#ff9800\",\n },\n error: { bg: \"#ffebee\", border: \"#ffcdd2\", text: \"#c62828\", dot: \"#ff4444\" },\n info: { bg: \"#e3f2fd\", border: \"#bbdefb\", text: \"#1565c0\", dot: \"#2196F3\" },\n neutral: {\n bg: \"#f5f5f5\",\n border: \"#e0e0e0\",\n text: \"#616161\",\n dot: \"#9e9e9e\",\n },\n};\n\nexport const StatusBadge = styled.span<{ $variant: BadgeVariant }>`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n line-height: 18px;\n white-space: nowrap;\n background: ${({ $variant }) => badgeColors[$variant].bg};\n border: 1px solid ${({ $variant }) => badgeColors[$variant].border};\n color: ${({ $variant }) => badgeColors[$variant].text};\n\n &::before {\n content: \"\";\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: ${({ $variant }) => badgeColors[$variant].dot};\n }\n`;\n\nexport const BadgeRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n`;\n\n// Collapsible section styles\nexport const CollapsibleHeader = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n`;\n\nexport const CollapsibleToggle = styled.span<{ $expanded: boolean }>`\n font-size: 10px;\n color: #666;\n transition: transform 0.15s ease;\n transform: rotate(${({ $expanded }) => ($expanded ? \"90deg\" : \"0deg\")});\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n`;\n\nexport const CollapsibleContent = styled.div<{ $expanded: boolean }>`\n display: ${({ $expanded }) => ($expanded ? \"flex\" : \"none\")};\n flex-direction: column;\n gap: 8px;\n`;\n\n// NotConnected styles\nexport const NotConnectedContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 24px;\n opacity: 0.6;\n`;\n\nexport const NotConnectedTitle = styled.h3`\n margin: 0 0 16px 0;\n font-size: 24px;\n`;\n\nexport const NotConnectedDescription = styled.p`\n text-align: center;\n max-width: 500px;\n margin: 0;\n`;\n\nexport const CodeBlock = styled.pre`\n background: #f5f5f5;\n padding: 16px;\n border-radius: 8px;\n margin-top: 16px;\n font-size: 12px;\n overflow: auto;\n`;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["styled", "css", "buttonBase", "Button", "$variant", "$size", "Card", "CardHeader", "CardHeaderLeft", "CardTitle", "CardBody", "CardSection", "SmallText", "MutedText", "ItalicNote", "SectionLabel", "Section", "SectionTitle", "SubsectionTitle", "ButtonGroup", "DeviceList", "Container", "CenteredMessage", "badgeColors", "StatusBadge", "BadgeRow", "CollapsibleHeader", "CollapsibleToggle", "$expanded", "CollapsibleContent", "NotConnectedContainer", "NotConnectedTitle", "NotConnectedDescription", "CodeBlock"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import{useCallback as l,useEffect as B,useRef as v,useState as x}from"react";import{Icons as h}from"@ledgerhq/react-ui";import r from"styled-components";import{InputContainer as H,InputWrapper as $,StyledInput as z}from"./inputStyles";import{useRecentFilters as M}from"./useRecentFilters";import{jsx as o,jsxs as f}from"react/jsx-runtime";const S=r.div`
|
|
2
|
+
position: absolute;
|
|
3
|
+
top: 100%;
|
|
4
|
+
left: 0;
|
|
5
|
+
right: 0;
|
|
6
|
+
margin-top: 4px;
|
|
7
|
+
background-color: #fff;
|
|
8
|
+
border: 1px solid #ccc;
|
|
9
|
+
border-radius: 4px;
|
|
10
|
+
max-height: 300px;
|
|
11
|
+
overflow-y: auto;
|
|
12
|
+
z-index: 1000;
|
|
13
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
14
|
+
`,L=r.div`
|
|
15
|
+
padding: 6px 10px;
|
|
16
|
+
font-size: 10px;
|
|
17
|
+
color: #666;
|
|
18
|
+
text-transform: uppercase;
|
|
19
|
+
border-bottom: 1px solid #eee;
|
|
20
|
+
`,T=r.div`
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
justify-content: space-between;
|
|
24
|
+
padding: 8px 10px;
|
|
25
|
+
font-size: 12px;
|
|
26
|
+
font-family: monospace;
|
|
27
|
+
color: #333;
|
|
28
|
+
cursor: pointer;
|
|
29
|
+
background-color: ${({$highlighted:n})=>n?"#e8f0fe":"transparent"};
|
|
30
|
+
|
|
31
|
+
&:hover {
|
|
32
|
+
background-color: ${({$highlighted:n})=>n?"#e8f0fe":"#f5f5f5"};
|
|
33
|
+
}
|
|
34
|
+
`,K=r.span`
|
|
35
|
+
flex: 1;
|
|
36
|
+
overflow: hidden;
|
|
37
|
+
text-overflow: ellipsis;
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
`,P=r.button`
|
|
40
|
+
background: none;
|
|
41
|
+
border: none;
|
|
42
|
+
padding: 2px;
|
|
43
|
+
margin-left: 8px;
|
|
44
|
+
cursor: pointer;
|
|
45
|
+
opacity: 0.5;
|
|
46
|
+
color: #666;
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
|
|
50
|
+
&:hover {
|
|
51
|
+
opacity: 1;
|
|
52
|
+
}
|
|
53
|
+
`,X=r.div`
|
|
54
|
+
padding: 12px 10px;
|
|
55
|
+
font-size: 12px;
|
|
56
|
+
color: #999;
|
|
57
|
+
text-align: center;
|
|
58
|
+
`,A=r.button`
|
|
59
|
+
background: none;
|
|
60
|
+
border: none;
|
|
61
|
+
padding: 4px 8px;
|
|
62
|
+
cursor: pointer;
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
color: ${({$active:n})=>n?"#333":"#999"};
|
|
66
|
+
|
|
67
|
+
&:hover {
|
|
68
|
+
color: #333;
|
|
69
|
+
}
|
|
70
|
+
`,N=r.button`
|
|
71
|
+
background: none;
|
|
72
|
+
border: none;
|
|
73
|
+
padding: 4px;
|
|
74
|
+
cursor: pointer;
|
|
75
|
+
opacity: 0.5;
|
|
76
|
+
color: #666;
|
|
77
|
+
display: flex;
|
|
78
|
+
align-items: center;
|
|
79
|
+
justify-content: center;
|
|
80
|
+
|
|
81
|
+
&:hover {
|
|
82
|
+
opacity: 1;
|
|
83
|
+
}
|
|
84
|
+
`,J=({value:n,onChange:c})=>{const[i,d]=x(!1),[w,y]=x(!1),[a,p]=x(-1),{recentFilters:s,removeFilter:b}=M(n),g=v(null),u=v(null);B(()=>{const e=t=>{g.current&&!g.current.contains(t.target)&&d(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[]);const k=l(()=>{y(!0)},[]),D=l(()=>{d(e=>(e||p(-1),!e))},[]),F=l(()=>{y(!1)},[]),m=l(e=>{c(e),d(!1),p(-1),u.current?.focus()},[c]),I=l(e=>{e.key==="Escape"?i?(d(!1),p(-1)):u.current?.blur():e.key==="ArrowDown"?(e.preventDefault(),i&&s.length>0&&p(t=>t<s.length-1?t+1:t)):e.key==="ArrowUp"?(e.preventDefault(),i&&p(t=>t>-1?t-1:-1)):e.key==="Enter"&&i&&a>=0&&s[a]&&(e.preventDefault(),m(s[a]))},[i,s,a,m]),C=l((e,t)=>{e.stopPropagation(),b(t)},[b]),R=l(()=>{c(""),u.current?.focus()},[c]);return f(H,{ref:g,children:[f($,{$focused:w,children:[o(z,{ref:u,type:"text",placeholder:"Filter (e.g. error, -debug, /regex/)",value:n,onChange:e=>c(e.target.value),onFocus:k,onBlur:F,onKeyDown:I}),n&&o(N,{onClick:R,title:"Clear filter",children:o(h.Close,{size:"XS"})}),o(A,{type:"button",onClick:D,$active:i,title:"Recent filters",children:o(h.ChevronBigBottom,{size:"XS"})})]}),i&&f(S,{children:[o(L,{children:"Recent filters"}),s.length===0?o(X,{children:"No recent filters"}):s.map((e,t)=>f(T,{$highlighted:t===a,onClick:()=>m(e),children:[o(K,{children:e}),o(P,{onClick:E=>C(E,e),title:"Remove from recent",children:o(h.Close,{size:"XS"})})]},e))]})]})};export{J as FilterInput};
|
|
85
|
+
//# sourceMappingURL=FilterInput.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/logger/FilterInput.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Icons } from \"@ledgerhq/react-ui\";\nimport styled from \"styled-components\";\n\nimport { InputContainer, InputWrapper, StyledInput } from \"./inputStyles\";\nimport { useRecentFilters } from \"./useRecentFilters\";\n\nconst Dropdown = styled.div`\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n margin-top: 4px;\n background-color: #fff;\n border: 1px solid #ccc;\n border-radius: 4px;\n max-height: 300px;\n overflow-y: auto;\n z-index: 1000;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n`;\n\nconst DropdownHeader = styled.div`\n padding: 6px 10px;\n font-size: 10px;\n color: #666;\n text-transform: uppercase;\n border-bottom: 1px solid #eee;\n`;\n\nconst DropdownItem = styled.div<{ $highlighted?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 10px;\n font-size: 12px;\n font-family: monospace;\n color: #333;\n cursor: pointer;\n background-color: ${({ $highlighted }) =>\n $highlighted ? \"#e8f0fe\" : \"transparent\"};\n\n &:hover {\n background-color: ${({ $highlighted }) =>\n $highlighted ? \"#e8f0fe\" : \"#f5f5f5\"};\n }\n`;\n\nconst FilterText = styled.span`\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst RemoveButton = styled.button`\n background: none;\n border: none;\n padding: 2px;\n margin-left: 8px;\n cursor: pointer;\n opacity: 0.5;\n color: #666;\n display: flex;\n align-items: center;\n\n &:hover {\n opacity: 1;\n }\n`;\n\nconst EmptyMessage = styled.div`\n padding: 12px 10px;\n font-size: 12px;\n color: #999;\n text-align: center;\n`;\n\nconst HistoryButton = styled.button<{ $active?: boolean }>`\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n color: ${({ $active }) => ($active ? \"#333\" : \"#999\")};\n\n &:hover {\n color: #333;\n }\n`;\n\nconst ClearButton = styled.button`\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n opacity: 0.5;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &:hover {\n opacity: 1;\n }\n`;\n\ntype FilterInputProps = {\n value: string;\n onChange: (value: string) => void;\n};\n\nexport const FilterInput: React.FC<FilterInputProps> = ({\n value,\n onChange,\n}) => {\n const [showDropdown, setShowDropdown] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState<number>(-1);\n const { recentFilters, removeFilter } = useRecentFilters(value);\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setShowDropdown(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const handleFocus = useCallback(() => {\n setIsFocused(true);\n }, []);\n\n const toggleDropdown = useCallback(() => {\n setShowDropdown((prev) => {\n if (!prev) {\n setHighlightedIndex(-1);\n }\n return !prev;\n });\n }, []);\n\n const handleBlur = useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const handleSelectFilter = useCallback(\n (filter: string) => {\n onChange(filter);\n setShowDropdown(false);\n setHighlightedIndex(-1);\n inputRef.current?.focus();\n },\n [onChange],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Escape\") {\n if (showDropdown) {\n setShowDropdown(false);\n setHighlightedIndex(-1);\n } else {\n inputRef.current?.blur();\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (showDropdown && recentFilters.length > 0) {\n setHighlightedIndex((prev) =>\n prev < recentFilters.length - 1 ? prev + 1 : prev,\n );\n }\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (showDropdown) {\n setHighlightedIndex((prev) => (prev > -1 ? prev - 1 : -1));\n }\n } else if (e.key === \"Enter\") {\n if (\n showDropdown &&\n highlightedIndex >= 0 &&\n recentFilters[highlightedIndex]\n ) {\n e.preventDefault();\n handleSelectFilter(recentFilters[highlightedIndex]);\n }\n }\n },\n [showDropdown, recentFilters, highlightedIndex, handleSelectFilter],\n );\n\n const handleRemoveFilter = useCallback(\n (e: React.MouseEvent, filter: string) => {\n e.stopPropagation();\n removeFilter(filter);\n },\n [removeFilter],\n );\n\n const handleClear = useCallback(() => {\n onChange(\"\");\n inputRef.current?.focus();\n }, [onChange]);\n\n return (\n <InputContainer ref={containerRef}>\n <InputWrapper $focused={isFocused}>\n <StyledInput\n ref={inputRef}\n type=\"text\"\n placeholder=\"Filter (e.g. error, -debug, /regex/)\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n {value && (\n <ClearButton onClick={handleClear} title=\"Clear filter\">\n <Icons.Close size=\"XS\" />\n </ClearButton>\n )}\n <HistoryButton\n type=\"button\"\n onClick={toggleDropdown}\n $active={showDropdown}\n title=\"Recent filters\"\n >\n <Icons.ChevronBigBottom size=\"XS\" />\n </HistoryButton>\n </InputWrapper>\n {showDropdown && (\n <Dropdown>\n <DropdownHeader>Recent filters</DropdownHeader>\n {recentFilters.length === 0 ? (\n <EmptyMessage>No recent filters</EmptyMessage>\n ) : (\n recentFilters.map((filter, index) => (\n <DropdownItem\n key={filter}\n $highlighted={index === highlightedIndex}\n onClick={() => handleSelectFilter(filter)}\n >\n <FilterText>{filter}</FilterText>\n <RemoveButton\n onClick={(e) => handleRemoveFilter(e, filter)}\n title=\"Remove from recent\"\n >\n <Icons.Close size=\"XS\" />\n </RemoveButton>\n </DropdownItem>\n ))\n )}\n </Dropdown>\n )}\n </InputContainer>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useEffect", "useRef", "useState", "Icons", "styled", "InputContainer", "InputWrapper", "StyledInput", "useRecentFilters", "jsx", "jsxs", "Dropdown", "DropdownHeader", "DropdownItem", "$highlighted", "FilterText", "RemoveButton", "EmptyMessage", "HistoryButton", "$active", "ClearButton", "FilterInput", "value", "onChange", "showDropdown", "setShowDropdown", "isFocused", "setIsFocused", "highlightedIndex", "setHighlightedIndex", "recentFilters", "removeFilter", "containerRef", "inputRef", "handleClickOutside", "event", "handleFocus", "toggleDropdown", "prev", "handleBlur", "handleSelectFilter", "filter", "handleKeyDown", "handleRemoveFilter", "handleClear", "index", "e"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{Flex as s}from"@ledgerhq/react-ui";import{Typography as h}from"antd";import i from"styled-components";import{jsx as o,jsxs as a}from"react/jsx-runtime";const u={activeLevels:{debug:!0,info:!0,warning:!0,error:!0,fatal:!0},showTimestamp:!0,showTag:!0,includeTags:new Set,filterText:""},g=i(s).attrs({flexDirection:"column",alignItems:"flex-start",justifyContent:"flex-start"})``,p=i(h.Title).attrs({level:5})`
|
|
2
|
+
margin-bottom: 20px;
|
|
3
|
+
`,d=i(s).attrs({columnGap:4,flexDirection:"row",flexWrap:"wrap",flexGrow:1,overflow:"scroll"})``,c=i.input`
|
|
4
|
+
margin-right: 4px;
|
|
5
|
+
`,L=({options:e,setOptions:l,uniqueTags:n})=>a(s,{flexDirection:"column",borderRadius:8,padding:5,rowGap:5,children:[a(g,{children:[o(p,{style:{color:"white",whiteSpace:"nowrap"},children:"Log levels"}),a(d,{children:[a("label",{children:[o(c,{type:"checkbox",checked:Object.values(e.activeLevels).every(Boolean),onChange:t=>{const r=Object.fromEntries(Object.keys(e.activeLevels).map(m=>[m,t.target.checked]));l({...e,activeLevels:r})}}),"All"]}),["debug","info","warning","error","fatal"].map(t=>a("label",{children:[o(c,{type:"checkbox",checked:e.activeLevels[t],onChange:r=>{l({...e,activeLevels:{...e.activeLevels,[t]:r.target.checked}})}}),t]},t))]})]}),a(g,{children:[o(p,{style:{color:"white",whiteSpace:"nowrap"},children:"Tags"}),a(d,{children:[a("label",{children:[o(c,{type:"checkbox",checked:n.size===e.includeTags.size,onChange:t=>{t.target.checked?n.forEach(r=>e.includeTags.add(r)):e.includeTags.clear(),l({...e})}}),"All"]}),Array.from(n).map(t=>a("label",{children:[o(c,{type:"checkbox",checked:e.includeTags.has(t),onChange:r=>{r.target.checked?e.includeTags.add(t):e.includeTags.delete(t),l({...e})}}),t]},t))]})]})]});export{L as LoggerOptionsView,u as defaultLoggerOptions};
|
|
6
|
+
//# sourceMappingURL=LoggerOptions.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/logger/LoggerOptions.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport { Flex } from \"@ledgerhq/react-ui\";\nimport { Typography } from \"antd\";\nimport styled from \"styled-components\";\n\nimport { type LogData } from \"./types\";\n\nexport type LoggerOptions = {\n activeLevels: Record<LogData[\"verbosity\"], boolean>;\n showTimestamp: boolean;\n showTag: boolean;\n includeTags: Set<string>;\n filterText: string;\n};\n\ntype LoggerProps = {\n options: LoggerOptions;\n setOptions: (options: LoggerOptions) => void;\n uniqueTags: Set<string>;\n};\n\nexport const defaultLoggerOptions: LoggerOptions = {\n activeLevels: {\n debug: true,\n info: true,\n warning: true,\n error: true,\n fatal: true,\n },\n showTimestamp: true,\n showTag: true,\n includeTags: new Set(),\n filterText: \"\",\n};\n\nconst ParamContainer = styled(Flex).attrs({\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n justifyContent: \"flex-start\",\n})``;\n\nconst ParamTitle = styled(Typography.Title).attrs({\n level: 5,\n})`\n margin-bottom: 20px;\n`;\n\nconst OptionsContainer = styled(Flex).attrs({\n columnGap: 4,\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n flexGrow: 1,\n overflow: \"scroll\",\n})``;\n\nconst Input = styled.input`\n margin-right: 4px;\n`;\n\nexport const LoggerOptionsView: React.FC<LoggerProps> = ({\n options,\n setOptions,\n uniqueTags,\n}) => {\n return (\n <Flex flexDirection=\"column\" borderRadius={8} padding={5} rowGap={5}>\n <ParamContainer>\n <ParamTitle style={{ color: \"white\", whiteSpace: \"nowrap\" }}>\n Log levels\n </ParamTitle>\n <OptionsContainer>\n {/** checkbox to select all / unselect all verbosity*/}\n <label>\n <Input\n type=\"checkbox\"\n checked={Object.values(options.activeLevels).every(Boolean)}\n onChange={(e) => {\n const newActiveLevels = Object.fromEntries(\n Object.keys(options.activeLevels).map((level) => [\n level,\n e.target.checked,\n ]),\n );\n // setOptions({ ...options, activeLevels: newActiveLevels });\n setOptions({\n ...options,\n activeLevels:\n newActiveLevels as LoggerOptions[\"activeLevels\"],\n });\n }}\n />\n All\n </label>\n {[\"debug\", \"info\", \"warning\", \"error\", \"fatal\"].map((level) => (\n <label key={level}>\n <Input\n type=\"checkbox\"\n checked={options.activeLevels[level as LogData[\"verbosity\"]]}\n onChange={(e) => {\n setOptions({\n ...options,\n activeLevels: {\n ...options.activeLevels,\n [level as LogData[\"verbosity\"]]: e.target.checked,\n },\n });\n }}\n />\n {level}\n </label>\n ))}\n </OptionsContainer>\n </ParamContainer>\n {/* <ParamContainer>\n <ParamTitle>Columns</ParamTitle>\n <OptionsContainer>\n <label>\n <Input\n type=\"checkbox\"\n checked={options.showTimestamp}\n onChange={(e) => {\n setOptions({ ...options, showTimestamp: e.target.checked });\n }}\n />\n Timestamp\n </label>\n <label>\n <Input\n type=\"checkbox\"\n checked={options.showTag}\n onChange={(e) => {\n setOptions({ ...options, showTag: e.target.checked });\n }}\n />\n Tag\n </label>\n </OptionsContainer>\n </ParamContainer> */}\n <ParamContainer>\n <ParamTitle style={{ color: \"white\", whiteSpace: \"nowrap\" }}>\n Tags\n </ParamTitle>\n <OptionsContainer>\n <label>\n <Input\n type=\"checkbox\"\n checked={uniqueTags.size === options.includeTags.size}\n onChange={(e) => {\n if (e.target.checked) {\n uniqueTags.forEach((tag) => options.includeTags.add(tag));\n } else {\n options.includeTags.clear();\n }\n setOptions({ ...options });\n }}\n />\n All\n </label>\n {Array.from(uniqueTags).map((tag) => (\n <label key={tag}>\n <Input\n type=\"checkbox\"\n checked={options.includeTags.has(tag)}\n onChange={(e) => {\n if (e.target.checked) {\n options.includeTags.add(tag);\n } else {\n options.includeTags.delete(tag);\n }\n setOptions({ ...options });\n }}\n />\n {tag}\n </label>\n ))}\n </OptionsContainer>\n </ParamContainer>\n </Flex>\n );\n};\n"],
|
|
5
|
+
"mappings": "AACA,OAAS,QAAAA,MAAY,qBACrB,OAAS,cAAAC,MAAkB,OAC3B,OAAOC,MAAY,oBAgEX,cAAAC,EAKE,QAAAC,MALF,oBA9CD,MAAMC,EAAsC,CACjD,aAAc,CACZ,MAAO,GACP,KAAM,GACN,QAAS,GACT,MAAO,GACP,MAAO,EACT,EACA,cAAe,GACf,QAAS,GACT,YAAa,IAAI,IACjB,WAAY,EACd,EAEMC,EAAiBJ,EAAOF,CAAI,EAAE,MAAM,CACxC,cAAe,SACf,WAAY,aACZ,eAAgB,YAClB,CAAC,IAEKO,EAAaL,EAAOD,EAAW,KAAK,EAAE,MAAM,CAChD,MAAO,CACT,CAAC;AAAA;AAAA,EAIKO,EAAmBN,EAAOF,CAAI,EAAE,MAAM,CAC1C,UAAW,EACX,cAAe,MACf,SAAU,OACV,SAAU,EACV,SAAU,QACZ,CAAC,IAEKS,EAAQP,EAAO;AAAA;AAAA,EAIRQ,EAA2C,CAAC,CACvD,QAAAC,EACA,WAAAC,EACA,WAAAC,CACF,IAEIT,EAACJ,EAAA,CAAK,cAAc,SAAS,aAAc,EAAG,QAAS,EAAG,OAAQ,EAChE,UAAAI,EAACE,EAAA,CACC,UAAAH,EAACI,EAAA,CAAW,MAAO,CAAE,MAAO,QAAS,WAAY,QAAS,EAAG,sBAE7D,EACAH,EAACI,EAAA,CAEC,UAAAJ,EAAC,SACC,UAAAD,EAACM,EAAA,CACC,KAAK,WACL,QAAS,OAAO,OAAOE,EAAQ,YAAY,EAAE,MAAM,OAAO,EAC1D,SAAWG,GAAM,CACf,MAAMC,EAAkB,OAAO,YAC7B,OAAO,KAAKJ,EAAQ,YAAY,EAAE,IAAKK,GAAU,CAC/CA,EACAF,EAAE,OAAO,OACX,CAAC,CACH,EAEAF,EAAW,CACT,GAAGD,EACH,aACEI,CACJ,CAAC,CACH,EACF,EAAE,OAEJ,EACC,CAAC,QAAS,OAAQ,UAAW,QAAS,OAAO,EAAE,IAAKC,GACnDZ,EAAC,SACC,UAAAD,EAACM,EAAA,CACC,KAAK,WACL,QAASE,EAAQ,aAAaK,CAA6B,EAC3D,SAAWF,GAAM,CACfF,EAAW,CACT,GAAGD,EACH,aAAc,CACZ,GAAGA,EAAQ,aACX,CAACK,CAA6B,EAAGF,EAAE,OAAO,OAC5C,CACF,CAAC,CACH,EACF,EACCE,IAdSA,CAeZ,CACD,GACH,GACF,EA0BAZ,EAACE,EAAA,CACC,UAAAH,EAACI,EAAA,CAAW,MAAO,CAAE,MAAO,QAAS,WAAY,QAAS,EAAG,gBAE7D,EACAH,EAACI,EAAA,CACC,UAAAJ,EAAC,SACC,UAAAD,EAACM,EAAA,CACC,KAAK,WACL,QAASI,EAAW,OAASF,EAAQ,YAAY,KACjD,SAAWG,GAAM,CACXA,EAAE,OAAO,QACXD,EAAW,QAASI,GAAQN,EAAQ,YAAY,IAAIM,CAAG,CAAC,EAExDN,EAAQ,YAAY,MAAM,EAE5BC,EAAW,CAAE,GAAGD,CAAQ,CAAC,CAC3B,EACF,EAAE,OAEJ,EACC,MAAM,KAAKE,CAAU,EAAE,IAAKI,GAC3Bb,EAAC,SACC,UAAAD,EAACM,EAAA,CACC,KAAK,WACL,QAASE,EAAQ,YAAY,IAAIM,CAAG,EACpC,SAAWH,GAAM,CACXA,EAAE,OAAO,QACXH,EAAQ,YAAY,IAAIM,CAAG,EAE3BN,EAAQ,YAAY,OAAOM,CAAG,EAEhCL,EAAW,CAAE,GAAGD,CAAQ,CAAC,CAC3B,EACF,EACCM,IAbSA,CAcZ,CACD,GACH,GACF,GACF",
|
|
6
|
+
"names": ["Flex", "Typography", "styled", "jsx", "jsxs", "defaultLoggerOptions", "ParamContainer", "ParamTitle", "OptionsContainer", "Input", "LoggerOptionsView", "options", "setOptions", "uniqueTags", "e", "newActiveLevels", "level", "tag"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{Flex as C,Icons as e,Tooltip as S}from"@ledgerhq/react-ui";import x from"styled-components";import{FilterInput as L}from"./FilterInput";import{LoggerOptionsView as I}from"./LoggerOptions";import{SearchInput as T}from"./SearchInput";import{jsx as o,jsxs as y}from"react/jsx-runtime";const n=x.div`
|
|
2
|
+
opacity: 0.65;
|
|
3
|
+
cursor: pointer;
|
|
4
|
+
flex-shrink: 0;
|
|
5
|
+
&:hover {
|
|
6
|
+
opacity: 1;
|
|
7
|
+
}
|
|
8
|
+
`,w=({clearLogs:i,downloadLogs:a,options:t,setOptions:r,uniqueTags:c,searchQuery:s,onSearchChange:p,matchCount:u,currentMatchIndex:g,onSearchNext:l,onSearchPrevious:m,onSearchFirst:h,onSearchLast:d,searchInputRef:v})=>y(C,{flexDirection:"row",columnGap:5,alignItems:"center",flex:1,children:[o(n,{onClick:i,children:o(e.DeleteStop,{size:"S"})}),o(S,{trigger:"click",placement:"bottom",interactive:!0,content:o(I,{options:t,setOptions:r,uniqueTags:c}),children:o(n,{children:o(e.Settings,{size:"S"})})}),o(n,{onClick:a,children:o(e.Download,{size:"S"})}),o(L,{value:t.filterText,onChange:f=>r({...t,filterText:f})}),o(T,{value:s,onChange:p,matchCount:u,currentMatchIndex:g,onNext:l,onPrevious:m,onFirst:h,onLast:d,inputRef:v})]});export{w as LoggerToolbar};
|
|
9
|
+
//# sourceMappingURL=LoggerToolbar.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/logger/LoggerToolbar.tsx"],
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport { Flex, Icons, Tooltip } from \"@ledgerhq/react-ui\";\nimport styled from \"styled-components\";\n\nimport { FilterInput } from \"./FilterInput\";\nimport { type LoggerOptions, LoggerOptionsView } from \"./LoggerOptions\";\nimport { SearchInput } from \"./SearchInput\";\n\nconst ButtonContainer = styled.div`\n opacity: 0.65;\n cursor: pointer;\n flex-shrink: 0;\n &:hover {\n opacity: 1;\n }\n`;\n\nexport const LoggerToolbar: React.FC<{\n clearLogs: () => void;\n downloadLogs: () => void;\n options: LoggerOptions;\n setOptions: (options: LoggerOptions) => void;\n uniqueTags: Set<string>;\n searchQuery: string;\n onSearchChange: (query: string) => void;\n matchCount: number;\n currentMatchIndex: number;\n onSearchNext: () => void;\n onSearchPrevious: () => void;\n onSearchFirst: () => void;\n onSearchLast: () => void;\n searchInputRef?: React.RefObject<HTMLInputElement>;\n}> = ({\n clearLogs,\n downloadLogs,\n options,\n setOptions,\n uniqueTags,\n searchQuery,\n onSearchChange,\n matchCount,\n currentMatchIndex,\n onSearchNext,\n onSearchPrevious,\n onSearchFirst,\n onSearchLast,\n searchInputRef,\n}) => (\n <Flex flexDirection=\"row\" columnGap={5} alignItems=\"center\" flex={1}>\n <ButtonContainer onClick={clearLogs}>\n <Icons.DeleteStop size=\"S\" />\n </ButtonContainer>\n <Tooltip\n trigger=\"click\"\n placement=\"bottom\"\n interactive\n content={\n <LoggerOptionsView\n options={options}\n setOptions={setOptions}\n uniqueTags={uniqueTags}\n />\n }\n >\n <ButtonContainer>\n <Icons.Settings size=\"S\" />\n </ButtonContainer>\n </Tooltip>\n <ButtonContainer onClick={downloadLogs}>\n <Icons.Download size=\"S\" />\n </ButtonContainer>\n <FilterInput\n value={options.filterText}\n onChange={(filterText) => setOptions({ ...options, filterText })}\n />\n <SearchInput\n value={searchQuery}\n onChange={onSearchChange}\n matchCount={matchCount}\n currentMatchIndex={currentMatchIndex}\n onNext={onSearchNext}\n onPrevious={onSearchPrevious}\n onFirst={onSearchFirst}\n onLast={onSearchLast}\n inputRef={searchInputRef}\n />\n </Flex>\n);\n"],
|
|
5
|
+
"mappings": "AACA,OAAS,QAAAA,EAAM,SAAAC,EAAO,WAAAC,MAAe,qBACrC,OAAOC,MAAY,oBAEnB,OAAS,eAAAC,MAAmB,gBAC5B,OAA6B,qBAAAC,MAAyB,kBACtD,OAAS,eAAAC,MAAmB,gBA0C1B,OAEI,OAAAC,EAFJ,QAAAC,MAAA,oBAxCF,MAAMC,EAAkBN,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlBO,EAeR,CAAC,CACJ,UAAAC,EACA,aAAAC,EACA,QAAAC,EACA,WAAAC,EACA,WAAAC,EACA,YAAAC,EACA,eAAAC,EACA,WAAAC,EACA,kBAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,aAAAC,EACA,eAAAC,CACF,IACEhB,EAACR,EAAA,CAAK,cAAc,MAAM,UAAW,EAAG,WAAW,SAAS,KAAM,EAChE,UAAAO,EAACE,EAAA,CAAgB,QAASE,EACxB,SAAAJ,EAACN,EAAM,WAAN,CAAiB,KAAK,IAAI,EAC7B,EACAM,EAACL,EAAA,CACC,QAAQ,QACR,UAAU,SACV,YAAW,GACX,QACEK,EAACF,EAAA,CACC,QAASQ,EACT,WAAYC,EACZ,WAAYC,EACd,EAGF,SAAAR,EAACE,EAAA,CACC,SAAAF,EAACN,EAAM,SAAN,CAAe,KAAK,IAAI,EAC3B,EACF,EACAM,EAACE,EAAA,CAAgB,QAASG,EACxB,SAAAL,EAACN,EAAM,SAAN,CAAe,KAAK,IAAI,EAC3B,EACAM,EAACH,EAAA,CACC,MAAOS,EAAQ,WACf,SAAWY,GAAeX,EAAW,CAAE,GAAGD,EAAS,WAAAY,CAAW,CAAC,EACjE,EACAlB,EAACD,EAAA,CACC,MAAOU,EACP,SAAUC,EACV,WAAYC,EACZ,kBAAmBC,EACnB,OAAQC,EACR,WAAYC,EACZ,QAASC,EACT,OAAQC,EACR,SAAUC,EACZ,GACF",
|
|
6
|
+
"names": ["Flex", "Icons", "Tooltip", "styled", "FilterInput", "LoggerOptionsView", "SearchInput", "jsx", "jsxs", "ButtonContainer", "LoggerToolbar", "clearLogs", "downloadLogs", "options", "setOptions", "uniqueTags", "searchQuery", "onSearchChange", "matchCount", "currentMatchIndex", "onSearchNext", "onSearchPrevious", "onSearchFirst", "onSearchLast", "searchInputRef", "filterText"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import{useCallback as h,useRef as k,useState as R}from"react";import{Icons as t}from"@ledgerhq/react-ui";import c from"styled-components";import{InputContainer as z,InputWrapper as E,StyledInput as F}from"./inputStyles";import{jsx as e,jsxs as i}from"react/jsx-runtime";const M=c.span`
|
|
2
|
+
font-size: 11px;
|
|
3
|
+
color: #666;
|
|
4
|
+
white-space: nowrap;
|
|
5
|
+
padding: 0 4px;
|
|
6
|
+
`,a=c.button`
|
|
7
|
+
background: none;
|
|
8
|
+
border: none;
|
|
9
|
+
border-left: 1px solid #eee;
|
|
10
|
+
padding: 4px 6px;
|
|
11
|
+
cursor: pointer;
|
|
12
|
+
opacity: 0.65;
|
|
13
|
+
color: #333;
|
|
14
|
+
display: flex;
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
|
|
18
|
+
&:hover {
|
|
19
|
+
opacity: 1;
|
|
20
|
+
background-color: #f5f5f5;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&:disabled {
|
|
24
|
+
opacity: 0.3;
|
|
25
|
+
cursor: default;
|
|
26
|
+
&:hover {
|
|
27
|
+
background-color: transparent;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
`,X=c.button`
|
|
31
|
+
background: none;
|
|
32
|
+
border: none;
|
|
33
|
+
padding: 4px;
|
|
34
|
+
cursor: pointer;
|
|
35
|
+
opacity: 0.5;
|
|
36
|
+
color: #666;
|
|
37
|
+
display: flex;
|
|
38
|
+
align-items: center;
|
|
39
|
+
justify-content: center;
|
|
40
|
+
|
|
41
|
+
&:hover {
|
|
42
|
+
opacity: 1;
|
|
43
|
+
}
|
|
44
|
+
`,v=c.span`
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
align-items: center;
|
|
48
|
+
line-height: 0;
|
|
49
|
+
transform: scale(0.85);
|
|
50
|
+
|
|
51
|
+
svg {
|
|
52
|
+
display: block;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
svg:first-child {
|
|
56
|
+
margin-bottom: -8px;
|
|
57
|
+
}
|
|
58
|
+
`,w=({value:s,onChange:l,matchCount:d,currentMatchIndex:m,onNext:p,onPrevious:u,onFirst:C,onLast:b,inputRef:g})=>{const y=k(null),n=g??y,[B,f]=R(!1),I=h(o=>{o.key==="Enter"?(o.preventDefault(),o.shiftKey?u():p()):o.key==="Escape"&&n.current?.blur()},[p,u,n]),r=d>0,x=r?m+1:0,S=h(()=>{l(""),n.current?.focus()},[l,n]);return e(z,{children:i(E,{$focused:B,children:[e(F,{ref:n,type:"text",placeholder:"Search (Ctrl/Cmd+F)",value:s,onChange:o=>l(o.target.value),onFocus:()=>f(!0),onBlur:()=>f(!1),onKeyDown:I}),s&&e(X,{onClick:S,title:"Clear search",children:e(t.Close,{size:"XS"})}),s&&i(M,{children:[x,"/",d]}),e(a,{onClick:u,disabled:!r,title:"Previous match (Shift+Enter)",children:e(t.ChevronBigTop,{size:"XS"})}),e(a,{onClick:p,disabled:!r,title:"Next match (Enter)",children:e(t.ChevronBigBottom,{size:"XS"})}),e(a,{onClick:C,disabled:!r,title:"First match",children:i(v,{children:[e(t.ChevronBigTop,{size:"XS"}),e(t.ChevronBigTop,{size:"XS"})]})}),e(a,{onClick:b,disabled:!r,title:"Last match",children:i(v,{children:[e(t.ChevronBigBottom,{size:"XS"}),e(t.ChevronBigBottom,{size:"XS"})]})})]})})};export{w as SearchInput};
|
|
59
|
+
//# sourceMappingURL=SearchInput.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/logger/SearchInput.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useCallback, useRef, useState } from \"react\";\nimport { Icons } from \"@ledgerhq/react-ui\";\nimport styled from \"styled-components\";\n\nimport { InputContainer, InputWrapper, StyledInput } from \"./inputStyles\";\n\nconst MatchCounter = styled.span`\n font-size: 11px;\n color: #666;\n white-space: nowrap;\n padding: 0 4px;\n`;\n\nconst NavButton = styled.button`\n background: none;\n border: none;\n border-left: 1px solid #eee;\n padding: 4px 6px;\n cursor: pointer;\n opacity: 0.65;\n color: #333;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &:hover {\n opacity: 1;\n background-color: #f5f5f5;\n }\n\n &:disabled {\n opacity: 0.3;\n cursor: default;\n &:hover {\n background-color: transparent;\n }\n }\n`;\n\nconst ClearButton = styled.button`\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n opacity: 0.5;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &:hover {\n opacity: 1;\n }\n`;\n\nconst DoubleChevronWrapper = styled.span`\n display: flex;\n flex-direction: column;\n align-items: center;\n line-height: 0;\n transform: scale(0.85);\n\n svg {\n display: block;\n }\n\n svg:first-child {\n margin-bottom: -8px;\n }\n`;\n\ntype SearchInputProps = {\n value: string;\n onChange: (value: string) => void;\n matchCount: number;\n currentMatchIndex: number;\n onNext: () => void;\n onPrevious: () => void;\n onFirst: () => void;\n onLast: () => void;\n inputRef?: React.RefObject<HTMLInputElement>;\n};\n\nexport const SearchInput: React.FC<SearchInputProps> = ({\n value,\n onChange,\n matchCount,\n currentMatchIndex,\n onNext,\n onPrevious,\n onFirst,\n onLast,\n inputRef,\n}) => {\n const localRef = useRef<HTMLInputElement>(null);\n const effectiveRef = inputRef ?? localRef;\n const [isFocused, setIsFocused] = useState(false);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (e.shiftKey) {\n onPrevious();\n } else {\n onNext();\n }\n } else if (e.key === \"Escape\") {\n effectiveRef.current?.blur();\n }\n },\n [onNext, onPrevious, effectiveRef],\n );\n\n const hasMatches = matchCount > 0;\n const displayIndex = hasMatches ? currentMatchIndex + 1 : 0;\n\n const handleClear = useCallback(() => {\n onChange(\"\");\n effectiveRef.current?.focus();\n }, [onChange, effectiveRef]);\n\n return (\n <InputContainer>\n <InputWrapper $focused={isFocused}>\n <StyledInput\n ref={effectiveRef}\n type=\"text\"\n placeholder=\"Search (Ctrl/Cmd+F)\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onKeyDown={handleKeyDown}\n />\n {value && (\n <ClearButton onClick={handleClear} title=\"Clear search\">\n <Icons.Close size=\"XS\" />\n </ClearButton>\n )}\n {value && (\n <MatchCounter>\n {displayIndex}/{matchCount}\n </MatchCounter>\n )}\n <NavButton\n onClick={onPrevious}\n disabled={!hasMatches}\n title=\"Previous match (Shift+Enter)\"\n >\n <Icons.ChevronBigTop size=\"XS\" />\n </NavButton>\n <NavButton\n onClick={onNext}\n disabled={!hasMatches}\n title=\"Next match (Enter)\"\n >\n <Icons.ChevronBigBottom size=\"XS\" />\n </NavButton>\n <NavButton onClick={onFirst} disabled={!hasMatches} title=\"First match\">\n <DoubleChevronWrapper>\n <Icons.ChevronBigTop size=\"XS\" />\n <Icons.ChevronBigTop size=\"XS\" />\n </DoubleChevronWrapper>\n </NavButton>\n <NavButton onClick={onLast} disabled={!hasMatches} title=\"Last match\">\n <DoubleChevronWrapper>\n <Icons.ChevronBigBottom size=\"XS\" />\n <Icons.ChevronBigBottom size=\"XS\" />\n </DoubleChevronWrapper>\n </NavButton>\n </InputWrapper>\n </InputContainer>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useRef", "useState", "Icons", "styled", "InputContainer", "InputWrapper", "StyledInput", "jsx", "jsxs", "MatchCounter", "NavButton", "ClearButton", "DoubleChevronWrapper", "SearchInput", "value", "onChange", "matchCount", "currentMatchIndex", "onNext", "onPrevious", "onFirst", "onLast", "inputRef", "localRef", "effectiveRef", "isFocused", "setIsFocused", "handleKeyDown", "e", "hasMatches", "displayIndex", "handleClear"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function d(e){const r=e.trim();if(!r)return[];const s=[],c=/(-?)\/([^/]+)\/|(\S+)/g;let n;for(;(n=c.exec(r))!==null;)if(n[2]!==void 0){const t=n[1]==="-",i=n[2];try{const o=new RegExp(i,"i");s.push({type:"regex",pattern:o,exclude:t})}catch{const o=n[0],a=o.startsWith("-"),l=a?o.slice(1):o;l&&s.push({type:"keyword",value:l.toLowerCase(),exclude:a})}}else if(n[3]!==void 0){const t=n[3],i=t.startsWith("-"),o=i?t.slice(1):t;o&&s.push({type:"keyword",value:o.toLowerCase(),exclude:i})}return s}function f(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return""}}function p(e){return[e.tag,e.message,f(e.payload)].join(" ")}function u(e,r){return e.type==="keyword"?r.toLowerCase().includes(e.value):e.pattern.test(r)}function g(e,r){if(r.length===0)return!0;const s=p(e),c=r.filter(t=>!t.exclude),n=r.filter(t=>t.exclude);for(const t of c)if(!u(t,s))return!1;for(const t of n)if(u(t,s))return!1;return!0}export{g as matchesFilter,d as parseFilterQuery};
|
|
2
|
+
//# sourceMappingURL=filterUtils.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/screens/logger/filterUtils.ts"],
|
|
4
|
+
"sourcesContent": ["import { type LogData } from \"./types\";\n\n/**\n * Represents a parsed filter token.\n * - keyword: case-insensitive text match\n * - regex: regular expression match\n */\nexport type FilterToken =\n | { type: \"keyword\"; value: string; exclude: boolean }\n | { type: \"regex\"; pattern: RegExp; exclude: boolean };\n\n/**\n * Parses a Chrome DevTools-style filter query into tokens.\n *\n * Supported syntax:\n * - `keyword` - match logs containing \"keyword\" (case-insensitive)\n * - `word1 word2` - match logs containing both words (AND logic)\n * - `-keyword` - exclude logs containing \"keyword\"\n * - `/regex/` - match logs matching the regex pattern\n * - `-/regex/` - exclude logs matching the regex pattern\n *\n * @param query - The filter query string\n * @returns Array of parsed filter tokens\n */\nexport function parseFilterQuery(query: string): FilterToken[] {\n const trimmed = query.trim();\n if (!trimmed) {\n return [];\n }\n\n const tokens: FilterToken[] = [];\n\n // Regex to match tokens: either a regex pattern (/.../) or a word\n // This handles: -/regex/, /regex/, -keyword, keyword\n const tokenRegex = /(-?)\\/([^/]+)\\/|(\\S+)/g;\n let match: RegExpExecArray | null;\n\n while ((match = tokenRegex.exec(trimmed)) !== null) {\n if (match[2] !== undefined) {\n // Regex pattern: match[1] is the optional \"-\", match[2] is the pattern\n const exclude = match[1] === \"-\";\n const patternStr = match[2];\n\n try {\n const pattern = new RegExp(patternStr, \"i\");\n tokens.push({ type: \"regex\", pattern, exclude });\n } catch {\n // Invalid regex - treat the whole thing as a keyword\n const rawToken = match[0];\n const isExclude = rawToken.startsWith(\"-\");\n const value = isExclude ? rawToken.slice(1) : rawToken;\n if (value) {\n tokens.push({\n type: \"keyword\",\n value: value.toLowerCase(),\n exclude: isExclude,\n });\n }\n }\n } else if (match[3] !== undefined) {\n // Keyword: match[3] is the full token\n const token = match[3];\n const exclude = token.startsWith(\"-\");\n const value = exclude ? token.slice(1) : token;\n\n if (value) {\n tokens.push({ type: \"keyword\", value: value.toLowerCase(), exclude });\n }\n }\n }\n\n return tokens;\n}\n\n/**\n * Converts a log's payload to a searchable string.\n */\nfunction payloadToString(payload: LogData[\"payload\"]): string {\n if (typeof payload === \"string\") {\n return payload;\n }\n try {\n return JSON.stringify(payload);\n } catch {\n return \"\";\n }\n}\n\n/**\n * Creates a searchable text from a log entry.\n * Combines tag, message, and payload into a single string for matching.\n */\nfunction logToSearchableText(log: LogData): string {\n const parts = [log.tag, log.message, payloadToString(log.payload)];\n return parts.join(\" \");\n}\n\n/**\n * Tests if a single token matches the log text.\n */\nfunction tokenMatches(token: FilterToken, text: string): boolean {\n if (token.type === \"keyword\") {\n return text.toLowerCase().includes(token.value);\n } else {\n return token.pattern.test(text);\n }\n}\n\n/**\n * Checks if a log entry matches the filter tokens.\n *\n * Matching logic:\n * - All include tokens must match (AND logic)\n * - No exclude tokens must match\n * - If no tokens, returns true (matches all)\n *\n * @param log - The log entry to test\n * @param tokens - The parsed filter tokens\n * @returns true if the log matches the filter\n */\nexport function matchesFilter(log: LogData, tokens: FilterToken[]): boolean {\n if (tokens.length === 0) {\n return true;\n }\n\n const searchText = logToSearchableText(log);\n\n const includeTokens = tokens.filter((t) => !t.exclude);\n const excludeTokens = tokens.filter((t) => t.exclude);\n\n // All include tokens must match\n for (const token of includeTokens) {\n if (!tokenMatches(token, searchText)) {\n return false;\n }\n }\n\n // No exclude tokens must match\n for (const token of excludeTokens) {\n if (tokenMatches(token, searchText)) {\n return false;\n }\n }\n\n return true;\n}\n"],
|
|
5
|
+
"mappings": "AAwBO,SAASA,EAAiBC,EAA8B,CAC7D,MAAMC,EAAUD,EAAM,KAAK,EAC3B,GAAI,CAACC,EACH,MAAO,CAAC,EAGV,MAAMC,EAAwB,CAAC,EAIzBC,EAAa,yBACnB,IAAIC,EAEJ,MAAQA,EAAQD,EAAW,KAAKF,CAAO,KAAO,MAC5C,GAAIG,EAAM,CAAC,IAAM,OAAW,CAE1B,MAAMC,EAAUD,EAAM,CAAC,IAAM,IACvBE,EAAaF,EAAM,CAAC,EAE1B,GAAI,CACF,MAAMG,EAAU,IAAI,OAAOD,EAAY,GAAG,EAC1CJ,EAAO,KAAK,CAAE,KAAM,QAAS,QAAAK,EAAS,QAAAF,CAAQ,CAAC,CACjD,MAAQ,CAEN,MAAMG,EAAWJ,EAAM,CAAC,EAClBK,EAAYD,EAAS,WAAW,GAAG,EACnCE,EAAQD,EAAYD,EAAS,MAAM,CAAC,EAAIA,EAC1CE,GACFR,EAAO,KAAK,CACV,KAAM,UACN,MAAOQ,EAAM,YAAY,EACzB,QAASD,CACX,CAAC,CAEL,CACF,SAAWL,EAAM,CAAC,IAAM,OAAW,CAEjC,MAAMO,EAAQP,EAAM,CAAC,EACfC,EAAUM,EAAM,WAAW,GAAG,EAC9BD,EAAQL,EAAUM,EAAM,MAAM,CAAC,EAAIA,EAErCD,GACFR,EAAO,KAAK,CAAE,KAAM,UAAW,MAAOQ,EAAM,YAAY,EAAG,QAAAL,CAAQ,CAAC,CAExE,CAGF,OAAOH,CACT,CAKA,SAASU,EAAgBC,EAAqC,CAC5D,GAAI,OAAOA,GAAY,SACrB,OAAOA,EAET,GAAI,CACF,OAAO,KAAK,UAAUA,CAAO,CAC/B,MAAQ,CACN,MAAO,EACT,CACF,CAMA,SAASC,EAAoBC,EAAsB,CAEjD,MADc,CAACA,EAAI,IAAKA,EAAI,QAASH,EAAgBG,EAAI,OAAO,CAAC,EACpD,KAAK,GAAG,CACvB,CAKA,SAASC,EAAaL,EAAoBM,EAAuB,CAC/D,OAAIN,EAAM,OAAS,UACVM,EAAK,YAAY,EAAE,SAASN,EAAM,KAAK,EAEvCA,EAAM,QAAQ,KAAKM,CAAI,CAElC,CAcO,SAASC,EAAcH,EAAcb,EAAgC,CAC1E,GAAIA,EAAO,SAAW,EACpB,MAAO,GAGT,MAAMiB,EAAaL,EAAoBC,CAAG,EAEpCK,EAAgBlB,EAAO,OAAQ,GAAM,CAAC,EAAE,OAAO,EAC/CmB,EAAgBnB,EAAO,OAAQ,GAAM,EAAE,OAAO,EAGpD,UAAWS,KAASS,EAClB,GAAI,CAACJ,EAAaL,EAAOQ,CAAU,EACjC,MAAO,GAKX,UAAWR,KAASU,EAClB,GAAIL,EAAaL,EAAOQ,CAAU,EAChC,MAAO,GAIX,MAAO,EACT",
|
|
6
|
+
"names": ["parseFilterQuery", "query", "trimmed", "tokens", "tokenRegex", "match", "exclude", "patternStr", "pattern", "rawToken", "isExclude", "value", "token", "payloadToString", "payload", "logToSearchableText", "log", "tokenMatches", "text", "matchesFilter", "searchText", "includeTokens", "excludeTokens"]
|
|
7
|
+
}
|