@nordicsemiconductor/pc-nrfconnect-shared 60.0.0-pre1
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/.github/ISSUE_TEMPLATE/custom.md +10 -0
- package/.husky/pre-push +3 -0
- package/.renovaterc.json +10 -0
- package/Changelog.md +2973 -0
- package/LICENSE +35 -0
- package/README.md +11 -0
- package/azure-pipelines.yml +34 -0
- package/config/eslintrc.js +190 -0
- package/config/jest.config.js +41 -0
- package/config/prettier.config.js +13 -0
- package/config/tsconfig.json +15 -0
- package/fw/bootloader/graviton_bootloader_v1.0.1-[nRF5_SDK_15.0.1-1.alpha_f76d012].zip +0 -0
- package/jest.config.js +7 -0
- package/main/index.ts +32 -0
- package/mocks/deviceLibMock.ts +21 -0
- package/mocks/electronMock.ts +15 -0
- package/mocks/electronStoreMock.ts +19 -0
- package/mocks/emptyMock.ts +7 -0
- package/mocks/fileMock.ts +13 -0
- package/mocks/gaMock.ts +9 -0
- package/mocks/mockTests.test.ts +15 -0
- package/mocks/packageJsonMock.ts +10 -0
- package/mocks/remoteMock.ts +17 -0
- package/package.json +132 -0
- package/scripts/check-app-properties.ts +197 -0
- package/scripts/check-for-typescript.ts +41 -0
- package/scripts/esbuild-bootstrap.js +15 -0
- package/scripts/esbuild-renderer.js +131 -0
- package/scripts/esbuild.js +57 -0
- package/scripts/installHusky.ts +17 -0
- package/scripts/nordic-publish.ts +485 -0
- package/scripts/nrfconnect-license.ts +277 -0
- package/scripts/prepare-shared-release.ts +122 -0
- package/scripts/release-shared.test.ts +132 -0
- package/scripts/release-shared.ts +207 -0
- package/src/About/About.tsx +25 -0
- package/src/About/AboutButton.tsx +28 -0
- package/src/About/ApplicationCard.tsx +83 -0
- package/src/About/DeviceCard.tsx +74 -0
- package/src/About/DocumentationCard.tsx +18 -0
- package/src/About/DocumentationSection.tsx +24 -0
- package/src/About/Section.tsx +21 -0
- package/src/About/ShortcutButton.tsx +41 -0
- package/src/About/SupportCard.tsx +97 -0
- package/src/About/about.scss +40 -0
- package/src/About/documentationSlice.ts +41 -0
- package/src/About/section.scss +15 -0
- package/src/About/shortcutSlice.ts +52 -0
- package/src/Alert/Alert.module.scss +29 -0
- package/src/Alert/Alert.tsx +37 -0
- package/src/App/App.test.tsx +47 -0
- package/src/App/App.tsx +227 -0
- package/src/App/ConnectedToStore.tsx +19 -0
- package/src/App/VisibilityBar.tsx +103 -0
- package/src/App/app.scss +83 -0
- package/src/App/appLayout.ts +95 -0
- package/src/App/shared.scss +49 -0
- package/src/App/visibility-bar.scss +55 -0
- package/src/Button/Button.tsx +66 -0
- package/src/Button/button.module.scss +154 -0
- package/src/Card/Card.tsx +26 -0
- package/src/Card/card.module.scss +28 -0
- package/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.tsx +58 -0
- package/src/Device/BrokenDeviceDialog/broken-device-dialog.scss +18 -0
- package/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.tsx +48 -0
- package/src/Device/DeviceSelector/BasicDeviceInfo.tsx +115 -0
- package/src/Device/DeviceSelector/DeviceIcon.tsx +27 -0
- package/src/Device/DeviceSelector/DeviceList/AnimatedList.tsx +62 -0
- package/src/Device/DeviceSelector/DeviceList/BrokenDevice.tsx +34 -0
- package/src/Device/DeviceSelector/DeviceList/Device.tsx +84 -0
- package/src/Device/DeviceSelector/DeviceList/DeviceList.tsx +113 -0
- package/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.tsx +28 -0
- package/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.tsx +65 -0
- package/src/Device/DeviceSelector/DeviceList/RenameDevice.tsx +22 -0
- package/src/Device/DeviceSelector/DeviceList/broken-device.scss +32 -0
- package/src/Device/DeviceSelector/DeviceList/device-list.scss +64 -0
- package/src/Device/DeviceSelector/DeviceList/device.scss +28 -0
- package/src/Device/DeviceSelector/DeviceList/edit-device-buttons.scss +31 -0
- package/src/Device/DeviceSelector/DeviceList/more-device-info.scss +33 -0
- package/src/Device/DeviceSelector/DeviceList/rename-device.scss +13 -0
- package/src/Device/DeviceSelector/DeviceSelector.test.tsx +342 -0
- package/src/Device/DeviceSelector/DeviceSelector.tsx +173 -0
- package/src/Device/DeviceSelector/Favorite.tsx +49 -0
- package/src/Device/DeviceSelector/SelectDevice.tsx +36 -0
- package/src/Device/DeviceSelector/SelectedDevice.tsx +65 -0
- package/src/Device/DeviceSelector/arrow-down.svg +1 -0
- package/src/Device/DeviceSelector/basic-device-info.scss +62 -0
- package/src/Device/DeviceSelector/device-icon.scss +27 -0
- package/src/Device/DeviceSelector/favorite.scss +17 -0
- package/src/Device/DeviceSelector/select-device.scss +38 -0
- package/src/Device/DeviceSelector/selected-device.scss +57 -0
- package/src/Device/DeviceSetup/DeviceSetupView.tsx +102 -0
- package/src/Device/deviceAutoSelectSlice.ts +144 -0
- package/src/Device/deviceInfo/deviceInfo.ts +254 -0
- package/src/Device/deviceInfo/nRF51-Series-logo.svg +1 -0
- package/src/Device/deviceInfo/nRF52-Series-logo.svg +1 -0
- package/src/Device/deviceInfo/nRF53-Series-logo.svg +1 -0
- package/src/Device/deviceInfo/nRF70-Series_no-background_RGB.svg +36 -0
- package/src/Device/deviceInfo/nRF91-Series-logo.svg +1 -0
- package/src/Device/deviceInfo/ppk-logo.svg +1 -0
- package/src/Device/deviceInfo/unknown-logo.svg +30 -0
- package/src/Device/deviceInfo/unknown-nordic-logo.svg +25 -0
- package/src/Device/deviceLibWrapper.test.ts +97 -0
- package/src/Device/deviceLibWrapper.ts +133 -0
- package/src/Device/deviceLister.test.ts +89 -0
- package/src/Device/deviceLister.ts +396 -0
- package/src/Device/deviceSetup.ts +264 -0
- package/src/Device/deviceSetupSlice.ts +94 -0
- package/src/Device/deviceSlice.ts +248 -0
- package/src/Device/dfu-cc.ts +162 -0
- package/src/Device/initPacket.ts +402 -0
- package/src/Device/jprogOperations.ts +206 -0
- package/src/Device/sdfuOperations.ts +601 -0
- package/src/Dialog/Dialog.test.tsx +134 -0
- package/src/Dialog/Dialog.tsx +236 -0
- package/src/Dialog/dialog.scss +60 -0
- package/src/Dropdown/Dropdown.module.scss +83 -0
- package/src/Dropdown/Dropdown.test.tsx +62 -0
- package/src/Dropdown/Dropdown.tsx +106 -0
- package/src/ErrorBoundary/ErrorBoundary.test.tsx +105 -0
- package/src/ErrorBoundary/ErrorBoundary.tsx +186 -0
- package/src/ErrorBoundary/bug.svg +1 -0
- package/src/ErrorBoundary/error-boundary.scss +102 -0
- package/src/ErrorDialog/ErrorDialog.test.tsx +70 -0
- package/src/ErrorDialog/ErrorDialog.tsx +94 -0
- package/src/ErrorDialog/error.scss +14 -0
- package/src/ErrorDialog/errorDialogSlice.test.ts +64 -0
- package/src/ErrorDialog/errorDialogSlice.ts +80 -0
- package/src/FactoryReset/FactoryResetButton.test.tsx +46 -0
- package/src/FactoryReset/FactoryResetButton.tsx +81 -0
- package/src/InlineInput/InlineInput.tsx +170 -0
- package/src/InlineInput/NumberInlineInput.tsx +107 -0
- package/src/InlineInput/inline-input.scss +38 -0
- package/src/InlineInput/number-inline-input.scss +15 -0
- package/src/Log/LogEntry.tsx +62 -0
- package/src/Log/LogViewer.tsx +54 -0
- package/src/Log/log-entry.scss +30 -0
- package/src/Log/log-viewer.scss +24 -0
- package/src/Log/logSlice.ts +73 -0
- package/src/Log/syncLogToStore.ts +36 -0
- package/src/Logo/Logo.tsx +48 -0
- package/src/Logo/logo.scss +11 -0
- package/src/Logo/nordic-logo-blue-icon-only.png +0 -0
- package/src/Logo/nordic-logo-gray-icon-only.png +0 -0
- package/src/Logo/nordic-logo-white-icon-only.png +0 -0
- package/src/Main/Main.tsx +13 -0
- package/src/Main/main.scss +13 -0
- package/src/MasonryLayout/MasonryLayout.tsx +234 -0
- package/src/MasonryLayout/masonryLayout.module.scss +46 -0
- package/src/NavBar/NavBar.tsx +22 -0
- package/src/NavBar/NavMenu.test.tsx +41 -0
- package/src/NavBar/NavMenu.tsx +53 -0
- package/src/NavBar/NavMenuItem.tsx +41 -0
- package/src/NavBar/nav-bar.scss +26 -0
- package/src/NavBar/nav-menu-item.scss +34 -0
- package/src/OpenApp/openApp.ts +18 -0
- package/src/Panes/FeedbackPane.tsx +149 -0
- package/src/PseudoButton/PseudoButton.tsx +56 -0
- package/src/PseudoButton/pseudo-button.scss +11 -0
- package/src/SerialPort/ConflictingSettingsDialog.tsx +242 -0
- package/src/SerialPort/SerialPort.test.ts +54 -0
- package/src/SerialPort/SerialPort.ts +202 -0
- package/src/Shortcuts/Shortcut-item.scss +33 -0
- package/src/Shortcuts/Shortcut-modal.scss +20 -0
- package/src/Shortcuts/ShortcutItem.tsx +48 -0
- package/src/Shortcuts/ShortcutModal.tsx +67 -0
- package/src/SidePanel/Group.tsx +106 -0
- package/src/SidePanel/SidePanel.tsx +19 -0
- package/src/SidePanel/group.scss +42 -0
- package/src/SidePanel/sidepanel.scss +20 -0
- package/src/Slider/Bar.tsx +24 -0
- package/src/Slider/Factor.test.ts +48 -0
- package/src/Slider/Handle.tsx +121 -0
- package/src/Slider/Slider.test.tsx +25 -0
- package/src/Slider/Slider.tsx +91 -0
- package/src/Slider/Ticks.tsx +54 -0
- package/src/Slider/__snapshots__/Slider.test.tsx.snap +50 -0
- package/src/Slider/bar.scss +24 -0
- package/src/Slider/factor.ts +24 -0
- package/src/Slider/handle.scss +32 -0
- package/src/Slider/percentage.ts +67 -0
- package/src/Slider/range.ts +92 -0
- package/src/Slider/slider.scss +14 -0
- package/src/Slider/ticks.scss +28 -0
- package/src/Slider/variables.scss +16 -0
- package/src/StartStopButton/StartStopButton.tsx +60 -0
- package/src/StartStopButton/play-circle.svg +1 -0
- package/src/StartStopButton/start-stop-button.scss +47 -0
- package/src/StartStopButton/stop-circle.svg +1 -0
- package/src/StateSelector/StateSelector.tsx +64 -0
- package/src/StateSelector/state-selector.scss +38 -0
- package/src/Stepper/Stepper.tsx +139 -0
- package/src/Stepper/stepper.scss +127 -0
- package/src/Toggle/Toggle.tsx +120 -0
- package/src/Toggle/toggle.scss +109 -0
- package/src/bootstrap.scss +14 -0
- package/src/index.ts +146 -0
- package/src/logging/appTransport.test.ts +78 -0
- package/src/logging/appTransport.ts +41 -0
- package/src/logging/describeError.test.ts +38 -0
- package/src/logging/describeError.ts +56 -0
- package/src/logging/index.ts +103 -0
- package/src/logging/logBuffer.test.ts +41 -0
- package/src/logging/logBuffer.ts +24 -0
- package/src/logging/sendInitialLogMessages.ts +64 -0
- package/src/store.ts +60 -0
- package/src/svg.d.ts +15 -0
- package/src/utils/AppTypes.ts +60 -0
- package/src/utils/appDirs.ts +78 -0
- package/src/utils/bleChannels.ts +16 -0
- package/src/utils/classNames.test.ts +29 -0
- package/src/utils/classNames.ts +25 -0
- package/src/utils/colors.scss +46 -0
- package/src/utils/colors.ts +38 -0
- package/src/utils/describeVersion.ts +21 -0
- package/src/utils/environment.ts +6 -0
- package/src/utils/logLibVersions.ts +103 -0
- package/src/utils/open.ts +46 -0
- package/src/utils/packageJson.ts +60 -0
- package/src/utils/persistentStore.ts +144 -0
- package/src/utils/systemReport.ts +160 -0
- package/src/utils/truncateMiddle.test.ts +21 -0
- package/src/utils/truncateMiddle.ts +20 -0
- package/src/utils/usageData.ts +189 -0
- package/src/utils/useHotKey.ts +62 -0
- package/src/utils/useStopwatch.test.tsx +311 -0
- package/src/utils/useStopwatch.ts +140 -0
- package/src/variables.scss +820 -0
- package/styles.scss +88 -0
- package/test/dispatchTo.ts +23 -0
- package/test/index.ts +7 -0
- package/test/jestResolver.js +28 -0
- package/test/setupTests.ts +27 -0
- package/test/testUtil.ts +20 -0
- package/test/testrenderer.tsx +39 -0
- package/tsconfig.json +9 -0
- package/typings/externals.d.ts +31 -0
- package/typings/generated/main/index.d.ts +25 -0
- package/typings/generated/src/About/About.d.ts +4 -0
- package/typings/generated/src/About/AboutButton.d.ts +8 -0
- package/typings/generated/src/About/ApplicationCard.d.ts +3 -0
- package/typings/generated/src/About/DeviceCard.d.ts +3 -0
- package/typings/generated/src/About/DocumentationCard.d.ts +3 -0
- package/typings/generated/src/About/DocumentationSection.d.ts +9 -0
- package/typings/generated/src/About/Section.d.ts +8 -0
- package/typings/generated/src/About/ShortcutButton.d.ts +6 -0
- package/typings/generated/src/About/SupportCard.d.ts +3 -0
- package/typings/generated/src/About/documentationSlice.d.ts +12 -0
- package/typings/generated/src/About/shortcutSlice.d.ts +11 -0
- package/typings/generated/src/Alert/Alert.d.ts +10 -0
- package/typings/generated/src/App/App.d.ts +27 -0
- package/typings/generated/src/App/App.test.d.ts +1 -0
- package/typings/generated/src/App/ConnectedToStore.d.ts +7 -0
- package/typings/generated/src/App/VisibilityBar.d.ts +6 -0
- package/typings/generated/src/App/appLayout.d.ts +17 -0
- package/typings/generated/src/Button/Button.d.ts +13 -0
- package/typings/generated/src/Card/Card.d.ts +7 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts +4 -0
- package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts +12 -0
- package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts +11 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts +7 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts +10 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts +7 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts +10 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts +10 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts +9 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts +7 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts +6 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +20 -0
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts +1 -0
- package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts +9 -0
- package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts +8 -0
- package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts +7 -0
- package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts +3 -0
- package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts +28 -0
- package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +18 -0
- package/typings/generated/src/Device/deviceLibWrapper.d.ts +8 -0
- package/typings/generated/src/Device/deviceLibWrapper.test.d.ts +1 -0
- package/typings/generated/src/Device/deviceLister.d.ts +25 -0
- package/typings/generated/src/Device/deviceLister.test.d.ts +2 -0
- package/typings/generated/src/Device/deviceSetup.d.ts +40 -0
- package/typings/generated/src/Device/deviceSetupSlice.d.ts +20 -0
- package/typings/generated/src/Device/deviceSlice.d.ts +30 -0
- package/typings/generated/src/Device/dfu-cc.d.ts +3 -0
- package/typings/generated/src/Device/initPacket.d.ts +109 -0
- package/typings/generated/src/Device/jprogOperations.d.ts +2 -0
- package/typings/generated/src/Device/sdfuOperations.d.ts +14 -0
- package/typings/generated/src/Dialog/Dialog.d.ts +64 -0
- package/typings/generated/src/Dialog/Dialog.test.d.ts +1 -0
- package/typings/generated/src/Dropdown/Dropdown.d.ts +16 -0
- package/typings/generated/src/Dropdown/Dropdown.test.d.ts +1 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +26 -0
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts +4 -0
- package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts +1 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts +23 -0
- package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts +1 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts +12 -0
- package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts +1 -0
- package/typings/generated/src/InlineInput/InlineInput.d.ts +14 -0
- package/typings/generated/src/InlineInput/NumberInlineInput.d.ts +12 -0
- package/typings/generated/src/Log/LogEntry.d.ts +7 -0
- package/typings/generated/src/Log/LogViewer.d.ts +5 -0
- package/typings/generated/src/Log/logSlice.d.ts +12 -0
- package/typings/generated/src/Log/syncLogToStore.d.ts +11 -0
- package/typings/generated/src/Logo/Logo.d.ts +6 -0
- package/typings/generated/src/Main/Main.d.ts +6 -0
- package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts +14 -0
- package/typings/generated/src/NavBar/NavBar.d.ts +6 -0
- package/typings/generated/src/NavBar/NavMenu.d.ts +3 -0
- package/typings/generated/src/NavBar/NavMenu.test.d.ts +1 -0
- package/typings/generated/src/NavBar/NavMenuItem.d.ts +10 -0
- package/typings/generated/src/OpenApp/openApp.d.ts +7 -0
- package/typings/generated/src/Panes/FeedbackPane.d.ts +3 -0
- package/typings/generated/src/PseudoButton/PseudoButton.d.ts +10 -0
- package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts +13 -0
- package/typings/generated/src/SerialPort/SerialPort.d.ts +21 -0
- package/typings/generated/src/SerialPort/SerialPort.test.d.ts +1 -0
- package/typings/generated/src/Shortcuts/ShortcutItem.d.ts +8 -0
- package/typings/generated/src/Shortcuts/ShortcutModal.d.ts +8 -0
- package/typings/generated/src/SidePanel/Group.d.ts +16 -0
- package/typings/generated/src/SidePanel/SidePanel.d.ts +7 -0
- package/typings/generated/src/Slider/Bar.d.ts +7 -0
- package/typings/generated/src/Slider/Factor.test.d.ts +1 -0
- package/typings/generated/src/Slider/Handle.d.ts +13 -0
- package/typings/generated/src/Slider/Slider.d.ts +15 -0
- package/typings/generated/src/Slider/Slider.test.d.ts +1 -0
- package/typings/generated/src/Slider/Ticks.d.ts +12 -0
- package/typings/generated/src/Slider/factor.d.ts +1 -0
- package/typings/generated/src/Slider/percentage.d.ts +4 -0
- package/typings/generated/src/Slider/range.d.ts +13 -0
- package/typings/generated/src/StartStopButton/StartStopButton.d.ts +16 -0
- package/typings/generated/src/StateSelector/StateSelector.d.ts +15 -0
- package/typings/generated/src/Stepper/Stepper.d.ts +26 -0
- package/typings/generated/src/Toggle/Toggle.d.ts +19 -0
- package/typings/generated/src/index.d.ts +69 -0
- package/typings/generated/src/logging/appTransport.d.ts +12 -0
- package/typings/generated/src/logging/appTransport.test.d.ts +1 -0
- package/typings/generated/src/logging/describeError.d.ts +2 -0
- package/typings/generated/src/logging/describeError.test.d.ts +1 -0
- package/typings/generated/src/logging/index.d.ts +9 -0
- package/typings/generated/src/logging/logBuffer.d.ts +9 -0
- package/typings/generated/src/logging/logBuffer.test.d.ts +1 -0
- package/typings/generated/src/logging/sendInitialLogMessages.d.ts +2 -0
- package/typings/generated/src/store.d.ts +65 -0
- package/typings/generated/src/utils/AppTypes.d.ts +49 -0
- package/typings/generated/src/utils/appDirs.d.ts +35 -0
- package/typings/generated/src/utils/bleChannels.d.ts +6 -0
- package/typings/generated/src/utils/classNames.d.ts +17 -0
- package/typings/generated/src/utils/classNames.test.d.ts +1 -0
- package/typings/generated/src/utils/colors.d.ts +31 -0
- package/typings/generated/src/utils/describeVersion.d.ts +3 -0
- package/typings/generated/src/utils/environment.d.ts +1 -0
- package/typings/generated/src/utils/logLibVersions.d.ts +2 -0
- package/typings/generated/src/utils/open.d.ts +15 -0
- package/typings/generated/src/utils/packageJson.d.ts +4 -0
- package/typings/generated/src/utils/persistentStore.d.ts +35 -0
- package/typings/generated/src/utils/systemReport.d.ts +4 -0
- package/typings/generated/src/utils/truncateMiddle.d.ts +2 -0
- package/typings/generated/src/utils/truncateMiddle.test.d.ts +1 -0
- package/typings/generated/src/utils/usageData.d.ts +63 -0
- package/typings/generated/src/utils/useHotKey.d.ts +6 -0
- package/typings/generated/src/utils/useStopwatch.d.ts +22 -0
- package/typings/generated/src/utils/useStopwatch.test.d.ts +1 -0
- package/typings/generated/test/dispatchTo.d.ts +3 -0
- package/typings/generated/test/testrenderer.d.ts +5 -0
- package/typings/nrf-intel-hex.d.ts +58 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
@import './variables';
|
|
7
|
+
@import 'bootstrap/scss/bootstrap';
|
|
8
|
+
|
|
9
|
+
@each $color, $value in $theme-colors {
|
|
10
|
+
.btn-#{$color}, .btn-#{$color}.disabled, .btn-#{$color}:disabled {
|
|
11
|
+
border-color: $gray-200;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2015 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
import { hideDialog, showDialog } from './ErrorDialog/errorDialogSlice';
|
|
7
|
+
|
|
8
|
+
const ErrorDialogActions = { hideDialog, showDialog };
|
|
9
|
+
|
|
10
|
+
export { ErrorDialogActions };
|
|
11
|
+
|
|
12
|
+
export { default as App, type PaneProps } from './App/App';
|
|
13
|
+
export { default as Logo } from './Logo/Logo';
|
|
14
|
+
export {
|
|
15
|
+
default as DeviceSelector,
|
|
16
|
+
type Props as DeviceSelectorProps,
|
|
17
|
+
} from './Device/DeviceSelector/DeviceSelector';
|
|
18
|
+
export {
|
|
19
|
+
Dialog,
|
|
20
|
+
GenericDialog,
|
|
21
|
+
ConfirmationDialog,
|
|
22
|
+
InfoDialog,
|
|
23
|
+
ErrorDialog,
|
|
24
|
+
DialogButton,
|
|
25
|
+
} from './Dialog/Dialog';
|
|
26
|
+
export type { DialogButtonProps } from './Dialog/Dialog';
|
|
27
|
+
export { default as Slider } from './Slider/Slider';
|
|
28
|
+
export { Toggle } from './Toggle/Toggle';
|
|
29
|
+
export { default as RootErrorDialog } from './ErrorDialog/ErrorDialog';
|
|
30
|
+
export { Alert } from './Alert/Alert';
|
|
31
|
+
export { default as Main } from './Main/Main';
|
|
32
|
+
export { default as Button } from './Button/Button';
|
|
33
|
+
export type { ButtonVariants } from './Button/Button';
|
|
34
|
+
export { default as Card } from './Card/Card';
|
|
35
|
+
export { default as ErrorBoundary } from './ErrorBoundary/ErrorBoundary';
|
|
36
|
+
export { default as StateSelector } from './StateSelector/StateSelector';
|
|
37
|
+
export { default as Dropdown, type DropdownItem } from './Dropdown/Dropdown';
|
|
38
|
+
export { default as StartStopButton } from './StartStopButton/StartStopButton';
|
|
39
|
+
export { default as DocumentationSection } from './About/DocumentationSection';
|
|
40
|
+
export { default as Stepper } from './Stepper/Stepper';
|
|
41
|
+
export type { Step } from './Stepper/Stepper';
|
|
42
|
+
|
|
43
|
+
export { default as SidePanel } from './SidePanel/SidePanel';
|
|
44
|
+
export { Group, CollapsibleGroup } from './SidePanel/Group';
|
|
45
|
+
|
|
46
|
+
export { default as InlineInput } from './InlineInput/InlineInput';
|
|
47
|
+
export { default as NumberInlineInput } from './InlineInput/NumberInlineInput';
|
|
48
|
+
|
|
49
|
+
export { default as MasonryLayout } from './MasonryLayout/MasonryLayout';
|
|
50
|
+
|
|
51
|
+
export { default as useStopwatch } from './utils/useStopwatch';
|
|
52
|
+
|
|
53
|
+
export { reducer as errorDialogReducer } from './ErrorDialog/errorDialogSlice';
|
|
54
|
+
export { default as logger } from './logging';
|
|
55
|
+
export { default as bleChannels } from './utils/bleChannels';
|
|
56
|
+
export { colors } from './utils/colors';
|
|
57
|
+
|
|
58
|
+
export {
|
|
59
|
+
setAppDirs,
|
|
60
|
+
getAppDir,
|
|
61
|
+
getAppFile,
|
|
62
|
+
getAppDataDir,
|
|
63
|
+
getAppLogDir,
|
|
64
|
+
getUserDataDir,
|
|
65
|
+
} from './utils/appDirs';
|
|
66
|
+
|
|
67
|
+
export { openUrl } from './utils/open';
|
|
68
|
+
export { default as systemReport } from './utils/systemReport';
|
|
69
|
+
|
|
70
|
+
export { default as usageData } from './utils/usageData';
|
|
71
|
+
export { default as classNames } from './utils/classNames';
|
|
72
|
+
export { truncateMiddle } from './utils/truncateMiddle';
|
|
73
|
+
|
|
74
|
+
export { default as useHotKey } from './utils/useHotKey';
|
|
75
|
+
export { isDevelopment } from './utils/environment';
|
|
76
|
+
|
|
77
|
+
export { currentPane, setCurrentPane } from './App/appLayout';
|
|
78
|
+
|
|
79
|
+
export { isLoggingVerbose } from './Log/logSlice';
|
|
80
|
+
|
|
81
|
+
export {
|
|
82
|
+
getAppSpecificStore as getPersistentStore,
|
|
83
|
+
persistTerminalSettings,
|
|
84
|
+
getPersistedTerminalSettings,
|
|
85
|
+
} from './utils/persistentStore';
|
|
86
|
+
|
|
87
|
+
export { jprogDeviceSetup } from './Device/jprogOperations';
|
|
88
|
+
|
|
89
|
+
export { sdfuDeviceSetup } from './Device/sdfuOperations';
|
|
90
|
+
|
|
91
|
+
export {
|
|
92
|
+
selectedDevice,
|
|
93
|
+
getReadbackProtection,
|
|
94
|
+
persistSerialPortOptions,
|
|
95
|
+
type Device,
|
|
96
|
+
} from './Device/deviceSlice';
|
|
97
|
+
export {
|
|
98
|
+
setWaitForDevice,
|
|
99
|
+
clearWaitForDevice,
|
|
100
|
+
getAutoReselect,
|
|
101
|
+
getWaitingForDeviceTimeout,
|
|
102
|
+
getWaitingToAutoReselect,
|
|
103
|
+
getWaitForDevice,
|
|
104
|
+
} from './Device/deviceAutoSelectSlice';
|
|
105
|
+
export { deviceInfo } from './Device/deviceInfo/deviceInfo';
|
|
106
|
+
export { getDeviceLibContext } from './Device/deviceLibWrapper';
|
|
107
|
+
export { isDeviceInDFUBootloader } from './Device/sdfuOperations';
|
|
108
|
+
export {
|
|
109
|
+
default as sdfuOperations,
|
|
110
|
+
switchToBootloaderMode,
|
|
111
|
+
switchToApplicationMode,
|
|
112
|
+
} from './Device/sdfuOperations';
|
|
113
|
+
export {
|
|
114
|
+
defaultInitPacket,
|
|
115
|
+
type DfuImage,
|
|
116
|
+
FwType,
|
|
117
|
+
HashType,
|
|
118
|
+
} from './Device/initPacket';
|
|
119
|
+
|
|
120
|
+
export { default as describeError } from './logging/describeError';
|
|
121
|
+
|
|
122
|
+
export {
|
|
123
|
+
createSerialPort,
|
|
124
|
+
getSerialPortOptions,
|
|
125
|
+
type SerialPort,
|
|
126
|
+
} from './SerialPort/SerialPort';
|
|
127
|
+
export { default as ConflictingSettingsDialog } from './SerialPort/ConflictingSettingsDialog';
|
|
128
|
+
|
|
129
|
+
export { openAppWindow } from './OpenApp/openApp';
|
|
130
|
+
|
|
131
|
+
export type { NrfConnectState } from './store';
|
|
132
|
+
|
|
133
|
+
export {
|
|
134
|
+
type DeviceSetupConfig,
|
|
135
|
+
type DeviceSetup,
|
|
136
|
+
prepareDevice,
|
|
137
|
+
} from './Device/deviceSetup';
|
|
138
|
+
|
|
139
|
+
export type {
|
|
140
|
+
AppInfo,
|
|
141
|
+
AppVersions,
|
|
142
|
+
PackageJson,
|
|
143
|
+
SourceJson,
|
|
144
|
+
} from './utils/AppTypes';
|
|
145
|
+
|
|
146
|
+
export { default as FeedbackPane } from './Panes/FeedbackPane';
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2015 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import AppTransport from './appTransport';
|
|
8
|
+
|
|
9
|
+
describe('AppTransport', () => {
|
|
10
|
+
const info = {
|
|
11
|
+
message: 'Foobar message',
|
|
12
|
+
level: 'info',
|
|
13
|
+
timestamp: '2019-07-31T11:00:42.660Z',
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
it('should throw error if onLogEntry is not provided to constructor', () => {
|
|
17
|
+
expect(() => new AppTransport(<never>{})).toThrow();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should include message in log entry', () => {
|
|
21
|
+
const onLogEntry = jest.fn();
|
|
22
|
+
const appTransport = new AppTransport({ onLogEntry });
|
|
23
|
+
const { message } = info;
|
|
24
|
+
appTransport.log(info, () => {});
|
|
25
|
+
|
|
26
|
+
expect(onLogEntry).toHaveBeenCalledWith(
|
|
27
|
+
expect.objectContaining({
|
|
28
|
+
message,
|
|
29
|
+
})
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should include level in log entry', () => {
|
|
34
|
+
const onLogEntry = jest.fn();
|
|
35
|
+
const appTransport = new AppTransport({ onLogEntry });
|
|
36
|
+
const { level } = info;
|
|
37
|
+
|
|
38
|
+
appTransport.log(info, () => {});
|
|
39
|
+
|
|
40
|
+
expect(onLogEntry).toHaveBeenCalledWith(
|
|
41
|
+
expect.objectContaining({
|
|
42
|
+
level,
|
|
43
|
+
})
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('should include timestamp in log entry', () => {
|
|
48
|
+
const onLogEntry = jest.fn();
|
|
49
|
+
const appTransport = new AppTransport({ onLogEntry });
|
|
50
|
+
|
|
51
|
+
appTransport.log(info, () => {});
|
|
52
|
+
|
|
53
|
+
expect(typeof onLogEntry.mock.calls[0][0].timestamp).toBe('string');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should increment the log entry id', () => {
|
|
57
|
+
const onLogEntry = jest.fn();
|
|
58
|
+
const appTransport = new AppTransport({ onLogEntry });
|
|
59
|
+
|
|
60
|
+
appTransport.log(info, () => {});
|
|
61
|
+
appTransport.log(info, () => {});
|
|
62
|
+
appTransport.log(info, () => {});
|
|
63
|
+
|
|
64
|
+
expect(onLogEntry.mock.calls[0][0].id).toEqual(0);
|
|
65
|
+
expect(onLogEntry.mock.calls[1][0].id).toEqual(1);
|
|
66
|
+
expect(onLogEntry.mock.calls[2][0].id).toEqual(2);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should invoke the provided callback function when log completed', () => {
|
|
70
|
+
const onLogEntry = jest.fn();
|
|
71
|
+
const onLogDone = jest.fn();
|
|
72
|
+
const appTransport = new AppTransport({ onLogEntry });
|
|
73
|
+
|
|
74
|
+
appTransport.log(info, onLogDone);
|
|
75
|
+
|
|
76
|
+
expect(onLogDone).toHaveBeenCalled();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2015 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { LogEntry } from 'winston';
|
|
8
|
+
import Transport, { TransportStreamOptions } from 'winston-transport';
|
|
9
|
+
|
|
10
|
+
interface Options extends TransportStreamOptions {
|
|
11
|
+
onLogEntry: (entry: LogEntry) => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default class AppTransport extends Transport {
|
|
15
|
+
private onLogEntry: (entry: LogEntry) => void;
|
|
16
|
+
private entryCount: number;
|
|
17
|
+
|
|
18
|
+
constructor(options: Options) {
|
|
19
|
+
super(options);
|
|
20
|
+
|
|
21
|
+
if (!options.onLogEntry) {
|
|
22
|
+
throw new Error(
|
|
23
|
+
'Property onLogEntry was not provided to AppTransport'
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
this.onLogEntry = options.onLogEntry;
|
|
28
|
+
this.entryCount = 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
log({ level, message, timestamp }: LogEntry, next: () => void) {
|
|
32
|
+
this.onLogEntry({
|
|
33
|
+
id: this.entryCount,
|
|
34
|
+
timestamp,
|
|
35
|
+
level,
|
|
36
|
+
message,
|
|
37
|
+
});
|
|
38
|
+
this.entryCount += 1;
|
|
39
|
+
next();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import describeError from './describeError';
|
|
8
|
+
|
|
9
|
+
describe('a reasonable string representation for an error', () => {
|
|
10
|
+
it('is just that string for null or undefined', () => {
|
|
11
|
+
expect(describeError(null)).toBe('null');
|
|
12
|
+
expect(describeError(undefined)).toBe('undefined');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('uses the default string representation if it is an instance of Error', () => {
|
|
16
|
+
expect(describeError(URIError('Wrong'))).toBe('URIError: Wrong');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('uses the error message if one exists', () => {
|
|
20
|
+
expect(describeError({ message: 'a message' })).toBe('a message');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('stringifies the error if it is anything else', () => {
|
|
24
|
+
expect(describeError({ an: 'object' })).toBe('{"an":"object"}');
|
|
25
|
+
expect(describeError('a string message')).toBe('"a string message"');
|
|
26
|
+
expect(describeError(['some', 'array'])).toBe('["some","array"]');
|
|
27
|
+
expect(describeError(42)).toBe('42');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('appends the error origin', () => {
|
|
31
|
+
expect(
|
|
32
|
+
describeError({
|
|
33
|
+
message: 'a message',
|
|
34
|
+
origin: SyntaxError('something'),
|
|
35
|
+
})
|
|
36
|
+
).toBe('a message (Origin: SyntaxError: something)');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
interface MaybeWithMessageAndOrigin {
|
|
8
|
+
message?: string;
|
|
9
|
+
origin?: MaybeWithMessageAndOrigin;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function hasMaybeMessageAndOrigin(
|
|
13
|
+
error: unknown
|
|
14
|
+
): error is MaybeWithMessageAndOrigin {
|
|
15
|
+
return error != null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const describe = (error: MaybeWithMessageAndOrigin) => {
|
|
19
|
+
if (error instanceof Error) {
|
|
20
|
+
return String(error);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (error.message != null) {
|
|
24
|
+
return error.message;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return JSON.stringify(error);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const describeOrigin = (origin?: MaybeWithMessageAndOrigin) => {
|
|
31
|
+
if (origin == null) {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return ` (Origin: ${describe(origin)})`;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default (error: unknown) => {
|
|
39
|
+
if (error == null) {
|
|
40
|
+
return String(error);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Because we asserted that error is neither null nor undefined above, we
|
|
44
|
+
can access properties like `message` and `origin` from here on, without
|
|
45
|
+
fearing a "Cannot read property 'message' of null/undefined". But
|
|
46
|
+
TypeScript is not convinced of this. So here comes a statement with a
|
|
47
|
+
Error that should really never be thrown, just to convince TypeScript
|
|
48
|
+
of the fact that we can afterwards read the properties `message` and
|
|
49
|
+
`origin`.
|
|
50
|
+
*/
|
|
51
|
+
if (!hasMaybeMessageAndOrigin(error)) {
|
|
52
|
+
throw Error('Will never be thrown');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return describe(error) + describeOrigin(error.origin);
|
|
56
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2015 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { TransformableInfo } from 'logform';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { SPLAT } from 'triple-beam';
|
|
10
|
+
import { createLogger, format, LogEntry, Logger, transports } from 'winston';
|
|
11
|
+
import Transport from 'winston-transport';
|
|
12
|
+
|
|
13
|
+
import { getAppLogDir } from '../utils/appDirs';
|
|
14
|
+
import { openFile } from '../utils/open';
|
|
15
|
+
import AppTransport from './appTransport';
|
|
16
|
+
import describeError from './describeError';
|
|
17
|
+
import createLogBuffer from './logBuffer';
|
|
18
|
+
|
|
19
|
+
const isDevelopment = process.env.NODE_ENV === 'development';
|
|
20
|
+
|
|
21
|
+
const isConsoleAvailable = (() => {
|
|
22
|
+
try {
|
|
23
|
+
process.stdout.write('');
|
|
24
|
+
} catch (error) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
})();
|
|
29
|
+
|
|
30
|
+
const filePrefix = new Date().toISOString().replace(/:/gi, '_');
|
|
31
|
+
const logFilePath = () => path.join(getAppLogDir(), `${filePrefix}-log.txt`);
|
|
32
|
+
|
|
33
|
+
const logBuffer = createLogBuffer();
|
|
34
|
+
|
|
35
|
+
const logTransports: Transport[] = [
|
|
36
|
+
new AppTransport({
|
|
37
|
+
level: 'info',
|
|
38
|
+
onLogEntry: logBuffer.addEntry,
|
|
39
|
+
}),
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
if (isDevelopment && isConsoleAvailable) {
|
|
43
|
+
logTransports.push(new transports.Console({ level: 'silly' }));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface SharedLogger extends Logger {
|
|
47
|
+
initialise: () => void;
|
|
48
|
+
getAndClearEntries: () => LogEntry[];
|
|
49
|
+
openLogFile: () => void;
|
|
50
|
+
logError: (message: string, error: unknown) => void;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* This function is only needed, because our version of TypeScript still seems
|
|
54
|
+
unable to accept (unique) symbols as index types. As soon as we have
|
|
55
|
+
upgraded to a version that is capable of that, the invocations of this
|
|
56
|
+
function can be replaced by a simple `info[splat]` and this function can
|
|
57
|
+
be removed. */
|
|
58
|
+
const splat = (info: TransformableInfo) => info[SPLAT as unknown as string];
|
|
59
|
+
|
|
60
|
+
const logger = createLogger({
|
|
61
|
+
format: format.combine(
|
|
62
|
+
format(info => ({
|
|
63
|
+
...info,
|
|
64
|
+
message: splat(info)
|
|
65
|
+
? `${info.message} ${splat(info).join(' ')}`
|
|
66
|
+
: info.message,
|
|
67
|
+
}))(),
|
|
68
|
+
format.timestamp(),
|
|
69
|
+
format.printf(
|
|
70
|
+
({ timestamp, level, message }) =>
|
|
71
|
+
`${timestamp} ${level.toUpperCase()} ${message || ''}`
|
|
72
|
+
)
|
|
73
|
+
),
|
|
74
|
+
transports: logTransports,
|
|
75
|
+
}) as SharedLogger;
|
|
76
|
+
|
|
77
|
+
logger.initialise = () => {
|
|
78
|
+
logger.add(
|
|
79
|
+
new transports.File({
|
|
80
|
+
filename: logFilePath(),
|
|
81
|
+
level: 'debug',
|
|
82
|
+
})
|
|
83
|
+
);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
logger.getAndClearEntries = () => logBuffer.clear();
|
|
87
|
+
|
|
88
|
+
logger.openLogFile = () => {
|
|
89
|
+
try {
|
|
90
|
+
openFile(logFilePath());
|
|
91
|
+
} catch (error) {
|
|
92
|
+
logger.logError('Unable to open log file', error);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
logger.logError = (message: string, error: unknown) => {
|
|
97
|
+
const errorMessage =
|
|
98
|
+
error == null ? message : `${message}: ${describeError(error)}`;
|
|
99
|
+
|
|
100
|
+
logger.error(errorMessage);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export default logger;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2015 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import createLogBuffer from './logBuffer';
|
|
8
|
+
|
|
9
|
+
describe('logBuffer', () => {
|
|
10
|
+
let logBuffer: ReturnType<typeof createLogBuffer>;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
logBuffer = createLogBuffer();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should have no entries when buffer is empty', () => {
|
|
17
|
+
expect(logBuffer.size()).toEqual(0);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should have 1 entry when 1 entry has been added', () => {
|
|
21
|
+
logBuffer.addEntry({ id: 0, level: '', message: '' });
|
|
22
|
+
expect(logBuffer.size()).toEqual(1);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should return all added entries when clearing buffer', () => {
|
|
26
|
+
const inputEntries = [
|
|
27
|
+
{ id: 0, level: '', message: '' },
|
|
28
|
+
{ id: 1, level: '', message: '' },
|
|
29
|
+
];
|
|
30
|
+
logBuffer.addEntry(inputEntries[0]);
|
|
31
|
+
logBuffer.addEntry(inputEntries[1]);
|
|
32
|
+
const outputEntries = logBuffer.clear();
|
|
33
|
+
expect(outputEntries).toEqual(inputEntries);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should have no entries when buffer has been cleared', () => {
|
|
37
|
+
logBuffer.addEntry({ id: 0, level: '', message: '' });
|
|
38
|
+
logBuffer.clear();
|
|
39
|
+
expect(logBuffer.size()).toEqual(0);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2015 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { LogEntry } from 'winston';
|
|
8
|
+
|
|
9
|
+
class LogBuffer {
|
|
10
|
+
entries: LogEntry[] = [];
|
|
11
|
+
addEntry = (entry: LogEntry) => {
|
|
12
|
+
this.entries.push(entry);
|
|
13
|
+
};
|
|
14
|
+
clear() {
|
|
15
|
+
return this.entries.splice(0, this.size());
|
|
16
|
+
}
|
|
17
|
+
size() {
|
|
18
|
+
return this.entries.length;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const createLogBuffer = () => new LogBuffer();
|
|
23
|
+
|
|
24
|
+
export default createLogBuffer;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2015 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { getModuleVersions } from '@nordicsemiconductor/nrf-device-lib-js';
|
|
8
|
+
import { ipcRenderer } from 'electron';
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
getDeviceLibContext,
|
|
12
|
+
getModuleVersion,
|
|
13
|
+
} from '../Device/deviceLibWrapper';
|
|
14
|
+
import { getAppDataDir } from '../utils/appDirs';
|
|
15
|
+
import describeVersion from '../utils/describeVersion';
|
|
16
|
+
import logLibVersions from '../utils/logLibVersions';
|
|
17
|
+
import logger from '.';
|
|
18
|
+
|
|
19
|
+
let initialMessagesSent = false;
|
|
20
|
+
export default () => {
|
|
21
|
+
if (initialMessagesSent) return;
|
|
22
|
+
initialMessagesSent = true;
|
|
23
|
+
|
|
24
|
+
logLibVersions();
|
|
25
|
+
logger.debug(`Application data folder: ${getAppDataDir()}`);
|
|
26
|
+
|
|
27
|
+
ipcRenderer.once('app-details', async (_event, details) => {
|
|
28
|
+
const {
|
|
29
|
+
name,
|
|
30
|
+
currentVersion,
|
|
31
|
+
engineVersion,
|
|
32
|
+
coreVersion,
|
|
33
|
+
corePath,
|
|
34
|
+
isOfficial,
|
|
35
|
+
installed,
|
|
36
|
+
homeDir,
|
|
37
|
+
tmpDir,
|
|
38
|
+
bundledJlink,
|
|
39
|
+
} = details;
|
|
40
|
+
|
|
41
|
+
const official = isOfficial ? 'official' : 'local';
|
|
42
|
+
|
|
43
|
+
logger.debug(`App ${name} v${currentVersion} ${official}`);
|
|
44
|
+
logger.debug(`App path: ${installed.path}`);
|
|
45
|
+
logger.debug(
|
|
46
|
+
`nRFConnect ${coreVersion}, required by the app is (${engineVersion})`
|
|
47
|
+
);
|
|
48
|
+
logger.debug(`nRFConnect path: ${corePath}`);
|
|
49
|
+
logger.debug(`HomeDir: ${homeDir}`);
|
|
50
|
+
logger.debug(`TmpDir: ${tmpDir}`);
|
|
51
|
+
|
|
52
|
+
if (bundledJlink) {
|
|
53
|
+
const versions = await getModuleVersions(getDeviceLibContext());
|
|
54
|
+
const jlinkVersion = getModuleVersion('JlinkARM', versions);
|
|
55
|
+
|
|
56
|
+
if (!describeVersion(jlinkVersion).includes(bundledJlink)) {
|
|
57
|
+
logger.info(
|
|
58
|
+
`Installed JLink version does not match the provided version (${bundledJlink})`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
ipcRenderer.send('get-app-details');
|
|
64
|
+
};
|
package/src/store.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { configureStore } from '@reduxjs/toolkit';
|
|
8
|
+
import { Reducer } from 'redux';
|
|
9
|
+
|
|
10
|
+
import { reducer as documentation } from './About/documentationSlice';
|
|
11
|
+
import { reducer as shortcuts } from './About/shortcutSlice';
|
|
12
|
+
import { reducer as appLayout } from './App/appLayout';
|
|
13
|
+
import { reducer as brokenDeviceDialog } from './Device/BrokenDeviceDialog/brokenDeviceDialogSlice';
|
|
14
|
+
import { reducer as deviceAutoSelect } from './Device/deviceAutoSelectSlice';
|
|
15
|
+
import { reducer as deviceSetup } from './Device/deviceSetupSlice';
|
|
16
|
+
import { reducer as device } from './Device/deviceSlice';
|
|
17
|
+
import { reducer as errorDialog } from './ErrorDialog/errorDialogSlice';
|
|
18
|
+
import { reducer as log } from './Log/logSlice';
|
|
19
|
+
|
|
20
|
+
const ifBuiltForDevelopment = <X>(value: X) =>
|
|
21
|
+
process.env.NODE_ENV === 'development' ? value : undefined;
|
|
22
|
+
|
|
23
|
+
const noopReducer: Reducer = (state = null) => state;
|
|
24
|
+
|
|
25
|
+
export const rootReducerSpec = (appReducer: Reducer = noopReducer) => ({
|
|
26
|
+
app: appReducer,
|
|
27
|
+
appLayout,
|
|
28
|
+
device,
|
|
29
|
+
deviceSetup,
|
|
30
|
+
deviceAutoSelect,
|
|
31
|
+
brokenDeviceDialog,
|
|
32
|
+
errorDialog,
|
|
33
|
+
log,
|
|
34
|
+
documentation,
|
|
35
|
+
shortcuts,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const store = (appReducer?: Reducer) =>
|
|
39
|
+
configureStore({
|
|
40
|
+
reducer: rootReducerSpec(appReducer),
|
|
41
|
+
devTools: {
|
|
42
|
+
maxAge: ifBuiltForDevelopment(100),
|
|
43
|
+
serialize: ifBuiltForDevelopment(true),
|
|
44
|
+
},
|
|
45
|
+
middleware: getDefaultMiddleware =>
|
|
46
|
+
getDefaultMiddleware({
|
|
47
|
+
serializableCheck: false,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Needed only to infer the types below
|
|
52
|
+
const concreteStore = store();
|
|
53
|
+
export type RootState = ReturnType<typeof concreteStore.getState>;
|
|
54
|
+
export type AppDispatch = typeof concreteStore.dispatch;
|
|
55
|
+
|
|
56
|
+
export interface NrfConnectState<AppState> extends RootState {
|
|
57
|
+
app: AppState;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export default store;
|
package/src/svg.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021 Nordic Semiconductor ASA
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
declare module '!!@svgr!*.svg' {
|
|
8
|
+
const svg: React.ElementType;
|
|
9
|
+
export default svg;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
declare module '*.svg' {
|
|
13
|
+
const url: string;
|
|
14
|
+
export default url;
|
|
15
|
+
}
|