@nordicsemiconductor/pc-nrfconnect-shared 60.0.0-pre2 → 78.0.0

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.
Files changed (515) hide show
  1. package/Changelog.md +3229 -0
  2. package/config/colors.js +46 -0
  3. package/config/eslintrc.js +190 -0
  4. package/config/jest.config.js +41 -0
  5. package/config/prettier.config.js +13 -0
  6. package/config/tailwind.config.js +25 -0
  7. package/config/tsconfig.json +16 -0
  8. package/dist/bootstrap.css +1 -1
  9. package/fw/bootloader/graviton_bootloader_v1.0.1-[nRF5_SDK_15.0.1-1.alpha_f76d012].zip +0 -0
  10. package/main/index.ts +30 -0
  11. package/mocks/deviceLibMock.ts +21 -0
  12. package/mocks/electronMock.ts +17 -0
  13. package/mocks/electronStoreMock.ts +19 -0
  14. package/mocks/emptyMock.ts +7 -0
  15. package/mocks/fileMock.ts +13 -0
  16. package/mocks/gaMock.ts +9 -0
  17. package/mocks/mockTests.test.ts +15 -0
  18. package/mocks/packageJsonMock.ts +10 -0
  19. package/mocks/remoteMock.ts +17 -0
  20. package/package.json +30 -20
  21. package/scripts/check-app-properties.ts +1 -1
  22. package/scripts/esbuild-bootstrap.js +15 -0
  23. package/scripts/esbuild-renderer.js +141 -0
  24. package/scripts/esbuild.js +3 -3
  25. package/scripts/installHusky.ts +17 -0
  26. package/scripts/nordic-publish.js +89 -0
  27. package/scripts/nordic-publish.ts +1 -1
  28. package/scripts/prepare-shared-release.ts +122 -0
  29. package/scripts/release-shared.test.ts +132 -0
  30. package/scripts/release-shared.ts +207 -0
  31. package/src/About/About.tsx +31 -0
  32. package/src/About/AboutButton.tsx +28 -0
  33. package/src/About/ApplicationCard.tsx +52 -0
  34. package/src/About/DeviceCard.tsx +76 -0
  35. package/src/About/DocumentationCard.tsx +21 -0
  36. package/src/About/DocumentationSection.tsx +24 -0
  37. package/src/About/Section.tsx +21 -0
  38. package/src/About/ShortcutButton.tsx +41 -0
  39. package/src/About/SupportCard.tsx +102 -0
  40. package/src/About/about.scss +40 -0
  41. package/src/About/shortcutSlice.ts +52 -0
  42. package/src/Alert/Alert.module.scss +29 -0
  43. package/src/Alert/Alert.tsx +37 -0
  44. package/src/App/App.test.tsx +47 -0
  45. package/src/App/App.tsx +252 -0
  46. package/src/App/ConnectedToStore.tsx +19 -0
  47. package/src/App/VisibilityBar.tsx +103 -0
  48. package/src/App/app.scss +83 -0
  49. package/src/App/appLayout.ts +94 -0
  50. package/src/App/preflight.scss +443 -0
  51. package/src/App/shared.scss +49 -0
  52. package/src/App/tailwind.css +12 -0
  53. package/src/App/visibility-bar.scss +55 -0
  54. package/src/Button/Button.tsx +76 -0
  55. package/src/Card/Card.tsx +26 -0
  56. package/src/Card/card.module.scss +28 -0
  57. package/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.tsx +58 -0
  58. package/src/Device/BrokenDeviceDialog/broken-device-dialog.scss +18 -0
  59. package/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.tsx +48 -0
  60. package/src/Device/DeviceSelector/BasicDeviceInfo.tsx +115 -0
  61. package/src/Device/DeviceSelector/DeviceIcon.tsx +27 -0
  62. package/src/Device/DeviceSelector/DeviceList/AnimatedList.tsx +62 -0
  63. package/src/Device/DeviceSelector/DeviceList/BrokenDevice.tsx +34 -0
  64. package/src/Device/DeviceSelector/DeviceList/Device.tsx +84 -0
  65. package/src/Device/DeviceSelector/DeviceList/DeviceList.tsx +113 -0
  66. package/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.tsx +28 -0
  67. package/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.tsx +65 -0
  68. package/src/Device/DeviceSelector/DeviceList/RenameDevice.tsx +22 -0
  69. package/src/Device/DeviceSelector/DeviceList/broken-device.scss +32 -0
  70. package/src/Device/DeviceSelector/DeviceList/device-list.scss +64 -0
  71. package/src/Device/DeviceSelector/DeviceList/device.scss +28 -0
  72. package/src/Device/DeviceSelector/DeviceList/edit-device-buttons.scss +31 -0
  73. package/src/Device/DeviceSelector/DeviceList/more-device-info.scss +33 -0
  74. package/src/Device/DeviceSelector/DeviceList/rename-device.scss +13 -0
  75. package/src/Device/DeviceSelector/DeviceSelector.test.tsx +342 -0
  76. package/src/Device/DeviceSelector/DeviceSelector.tsx +176 -0
  77. package/src/Device/DeviceSelector/Favorite.tsx +49 -0
  78. package/src/Device/DeviceSelector/SelectDevice.tsx +36 -0
  79. package/src/Device/DeviceSelector/SelectedDevice.tsx +65 -0
  80. package/src/Device/DeviceSelector/arrow-down.svg +1 -0
  81. package/src/Device/DeviceSelector/basic-device-info.scss +62 -0
  82. package/src/Device/DeviceSelector/device-icon.scss +27 -0
  83. package/src/Device/DeviceSelector/favorite.scss +17 -0
  84. package/src/Device/DeviceSelector/select-device.scss +38 -0
  85. package/src/Device/DeviceSelector/selected-device.scss +57 -0
  86. package/src/Device/DeviceSetup/DeviceSetupView.tsx +105 -0
  87. package/src/Device/deviceAutoSelectSlice.ts +150 -0
  88. package/src/Device/deviceInfo/deviceInfo.ts +254 -0
  89. package/src/Device/deviceInfo/nRF51-Series-logo.svg +1 -0
  90. package/src/Device/deviceInfo/nRF52-Series-logo.svg +1 -0
  91. package/src/Device/deviceInfo/nRF53-Series-logo.svg +1 -0
  92. package/src/Device/deviceInfo/nRF70-Series_no-background_RGB.svg +36 -0
  93. package/src/Device/deviceInfo/nRF91-Series-logo.svg +1 -0
  94. package/src/Device/deviceInfo/ppk-logo.svg +1 -0
  95. package/src/Device/deviceInfo/unknown-logo.svg +30 -0
  96. package/src/Device/deviceInfo/unknown-nordic-logo.svg +25 -0
  97. package/src/Device/deviceLibWrapper.test.ts +97 -0
  98. package/src/Device/deviceLibWrapper.ts +132 -0
  99. package/src/Device/deviceLister.test.ts +89 -0
  100. package/src/Device/deviceLister.ts +424 -0
  101. package/src/Device/deviceSetup.ts +259 -0
  102. package/src/Device/deviceSetupSlice.ts +94 -0
  103. package/src/Device/deviceSlice.ts +248 -0
  104. package/src/Device/dfu-cc.ts +162 -0
  105. package/src/Device/initPacket.ts +402 -0
  106. package/src/Device/jprogOperations.ts +206 -0
  107. package/src/Device/sdfuOperations.ts +607 -0
  108. package/src/Dialog/Dialog.test.tsx +134 -0
  109. package/src/Dialog/Dialog.tsx +236 -0
  110. package/src/Dialog/dialog.scss +56 -0
  111. package/src/Dropdown/Dropdown.module.scss +15 -0
  112. package/src/Dropdown/Dropdown.test.tsx +62 -0
  113. package/src/Dropdown/Dropdown.tsx +112 -0
  114. package/src/ErrorBoundary/ErrorBoundary.test.tsx +88 -0
  115. package/src/ErrorBoundary/ErrorBoundary.tsx +186 -0
  116. package/src/ErrorBoundary/bug.svg +1 -0
  117. package/src/ErrorBoundary/error-boundary.scss +102 -0
  118. package/src/ErrorDialog/ErrorDialog.test.tsx +70 -0
  119. package/src/ErrorDialog/ErrorDialog.tsx +94 -0
  120. package/src/ErrorDialog/error.scss +14 -0
  121. package/src/ErrorDialog/errorDialogSlice.test.ts +64 -0
  122. package/src/ErrorDialog/errorDialogSlice.ts +80 -0
  123. package/src/FactoryReset/FactoryResetButton.test.tsx +46 -0
  124. package/src/FactoryReset/FactoryResetButton.tsx +81 -0
  125. package/src/FlashMessage/FlashMessage.tsx +159 -0
  126. package/src/FlashMessage/FlashMessageSlice.ts +88 -0
  127. package/src/FlashMessage/flashMessage.css +32 -0
  128. package/src/InlineInput/InlineInput.tsx +170 -0
  129. package/src/InlineInput/NumberInlineInput.tsx +107 -0
  130. package/src/InlineInput/inline-input.scss +38 -0
  131. package/src/InlineInput/number-inline-input.scss +15 -0
  132. package/src/Log/LogEntry.tsx +62 -0
  133. package/src/Log/LogViewer.tsx +54 -0
  134. package/src/Log/log-entry.scss +30 -0
  135. package/src/Log/log-viewer.scss +24 -0
  136. package/src/Log/logSlice.ts +73 -0
  137. package/src/Log/syncLogToStore.ts +36 -0
  138. package/src/Logo/Logo.tsx +48 -0
  139. package/src/Logo/logo.scss +11 -0
  140. package/{dist/nordic-logo-blue-icon-only-H7BABN6D.png → src/Logo/nordic-logo-blue-icon-only.png} +0 -0
  141. package/{dist/nordic-logo-gray-icon-only-GATOTR3L.png → src/Logo/nordic-logo-gray-icon-only.png} +0 -0
  142. package/src/Main/Main.tsx +13 -0
  143. package/src/Main/main.scss +13 -0
  144. package/src/MasonryLayout/MasonryLayout.tsx +234 -0
  145. package/src/MasonryLayout/masonryLayout.module.scss +46 -0
  146. package/src/NavBar/NavBar.tsx +22 -0
  147. package/src/NavBar/NavMenu.test.tsx +41 -0
  148. package/src/NavBar/NavMenu.tsx +52 -0
  149. package/src/NavBar/NavMenuItem.tsx +39 -0
  150. package/src/NavBar/nav-bar.scss +27 -0
  151. package/src/NavBar/nav-menu-item.scss +29 -0
  152. package/src/NumberInputWithSlider/NumberInputSliderWithUnit.tsx +74 -0
  153. package/src/Panes/FeedbackPane.tsx +184 -0
  154. package/src/PseudoButton/PseudoButton.tsx +56 -0
  155. package/src/PseudoButton/pseudo-button.scss +11 -0
  156. package/src/SerialPort/ConflictingSettingsDialog.tsx +226 -0
  157. package/src/SerialPort/SerialPort.test.ts +50 -0
  158. package/src/SerialPort/SerialPort.ts +172 -0
  159. package/src/Shortcuts/Shortcut-item.scss +33 -0
  160. package/src/Shortcuts/Shortcut-modal.scss +20 -0
  161. package/src/Shortcuts/ShortcutItem.tsx +48 -0
  162. package/src/Shortcuts/ShortcutModal.tsx +67 -0
  163. package/src/SidePanel/Group.tsx +106 -0
  164. package/src/SidePanel/SidePanel.tsx +19 -0
  165. package/src/SidePanel/group.scss +42 -0
  166. package/src/SidePanel/sidepanel.scss +20 -0
  167. package/src/Slider/Bar.tsx +24 -0
  168. package/src/Slider/Factor.test.ts +48 -0
  169. package/src/Slider/Handle.tsx +121 -0
  170. package/src/Slider/Slider.test.tsx +25 -0
  171. package/src/Slider/Slider.tsx +91 -0
  172. package/src/Slider/Ticks.tsx +54 -0
  173. package/src/Slider/__snapshots__/Slider.test.tsx.snap +50 -0
  174. package/src/Slider/bar.scss +24 -0
  175. package/src/Slider/factor.ts +24 -0
  176. package/src/Slider/handle.scss +32 -0
  177. package/src/Slider/percentage.ts +67 -0
  178. package/src/Slider/range.ts +92 -0
  179. package/src/Slider/slider.scss +14 -0
  180. package/src/Slider/ticks.scss +28 -0
  181. package/src/Slider/variables.scss +16 -0
  182. package/src/StartStopButton/StartStopButton.tsx +60 -0
  183. package/src/StartStopButton/play-circle.svg +1 -0
  184. package/src/StartStopButton/start-stop-button.scss +47 -0
  185. package/src/StartStopButton/stop-circle.svg +1 -0
  186. package/src/StateSelector/StateSelector.tsx +64 -0
  187. package/src/StateSelector/state-selector.scss +38 -0
  188. package/src/Stepper/Stepper.tsx +138 -0
  189. package/src/Stepper/stepper.scss +127 -0
  190. package/src/Toggle/Toggle.tsx +120 -0
  191. package/src/Toggle/toggle.scss +109 -0
  192. package/src/bootstrap.scss +14 -0
  193. package/src/index.ts +150 -0
  194. package/src/logging/appTransport.test.ts +78 -0
  195. package/src/logging/appTransport.ts +41 -0
  196. package/src/logging/describeError.test.ts +38 -0
  197. package/src/logging/describeError.ts +56 -0
  198. package/src/logging/index.ts +103 -0
  199. package/src/logging/logBuffer.test.ts +41 -0
  200. package/src/logging/logBuffer.ts +24 -0
  201. package/src/logging/sendInitialLogMessages.ts +61 -0
  202. package/src/store.ts +67 -0
  203. package/src/svg.d.ts +15 -0
  204. package/src/utils/appDirs.ts +78 -0
  205. package/src/utils/bleChannels.ts +16 -0
  206. package/src/utils/classNames.test.ts +29 -0
  207. package/src/utils/classNames.ts +25 -0
  208. package/src/utils/colors.scss +46 -0
  209. package/src/utils/colors.ts +173 -0
  210. package/src/utils/describeVersion.ts +21 -0
  211. package/src/utils/environment.ts +6 -0
  212. package/src/utils/logLibVersions.ts +103 -0
  213. package/src/utils/open.ts +46 -0
  214. package/src/utils/packageJson.ts +60 -0
  215. package/src/utils/persistentStore.ts +144 -0
  216. package/src/utils/systemReport.ts +160 -0
  217. package/src/utils/truncateMiddle.test.ts +21 -0
  218. package/src/utils/truncateMiddle.ts +20 -0
  219. package/src/utils/usageData.ts +196 -0
  220. package/src/utils/useFocusedOnVisible.ts +26 -0
  221. package/src/utils/useHotKey.ts +62 -0
  222. package/src/utils/useStopwatch.test.tsx +311 -0
  223. package/src/utils/useStopwatch.ts +140 -0
  224. package/src/variables.scss +820 -0
  225. package/styles.scss +88 -0
  226. package/test/dispatchTo.ts +23 -0
  227. package/test/index.ts +7 -0
  228. package/test/jestResolver.js +28 -0
  229. package/test/setupTests.ts +27 -0
  230. package/test/testUtil.ts +20 -0
  231. package/test/testrenderer.tsx +39 -0
  232. package/typings/generated/{src/utils/AppTypes.d.ts → ipc/MetaFiles.d.ts} +10 -7
  233. package/typings/generated/ipc/MetaFiles.d.ts.map +1 -0
  234. package/typings/generated/ipc/appDetails.d.ts +19 -0
  235. package/typings/generated/ipc/appDetails.d.ts.map +1 -0
  236. package/typings/generated/ipc/apps.d.ts +67 -0
  237. package/typings/generated/ipc/apps.d.ts.map +1 -0
  238. package/typings/generated/ipc/infrastructure/mainToRenderer.d.ts +7 -0
  239. package/typings/generated/ipc/infrastructure/mainToRenderer.d.ts.map +1 -0
  240. package/typings/generated/ipc/infrastructure/rendererToMain.d.ts +7 -0
  241. package/typings/generated/ipc/infrastructure/rendererToMain.d.ts.map +1 -0
  242. package/typings/generated/ipc/openWindow.d.ts +19 -0
  243. package/typings/generated/ipc/openWindow.d.ts.map +1 -0
  244. package/typings/generated/ipc/preventSleep.d.ts +11 -0
  245. package/typings/generated/ipc/preventSleep.d.ts.map +1 -0
  246. package/typings/generated/ipc/serialPort.d.ts +49 -0
  247. package/typings/generated/ipc/serialPort.d.ts.map +1 -0
  248. package/typings/generated/ipc/sources.d.ts +15 -0
  249. package/typings/generated/ipc/sources.d.ts.map +1 -0
  250. package/typings/generated/main/index.d.ts +52 -21
  251. package/typings/generated/main/index.d.ts.map +1 -0
  252. package/typings/generated/src/About/About.d.ts +6 -2
  253. package/typings/generated/src/About/About.d.ts.map +1 -0
  254. package/typings/generated/src/About/AboutButton.d.ts +1 -0
  255. package/typings/generated/src/About/AboutButton.d.ts.map +1 -0
  256. package/typings/generated/src/About/ApplicationCard.d.ts +1 -0
  257. package/typings/generated/src/About/ApplicationCard.d.ts.map +1 -0
  258. package/typings/generated/src/About/DeviceCard.d.ts +1 -0
  259. package/typings/generated/src/About/DeviceCard.d.ts.map +1 -0
  260. package/typings/generated/src/About/DocumentationCard.d.ts +5 -2
  261. package/typings/generated/src/About/DocumentationCard.d.ts.map +1 -0
  262. package/typings/generated/src/About/DocumentationSection.d.ts +1 -0
  263. package/typings/generated/src/About/DocumentationSection.d.ts.map +1 -0
  264. package/typings/generated/src/About/Section.d.ts +1 -1
  265. package/typings/generated/src/About/Section.d.ts.map +1 -0
  266. package/typings/generated/src/About/ShortcutButton.d.ts +1 -0
  267. package/typings/generated/src/About/ShortcutButton.d.ts.map +1 -0
  268. package/typings/generated/src/About/SupportCard.d.ts +1 -0
  269. package/typings/generated/src/About/SupportCard.d.ts.map +1 -0
  270. package/typings/generated/src/About/shortcutSlice.d.ts +1 -0
  271. package/typings/generated/src/About/shortcutSlice.d.ts.map +1 -0
  272. package/typings/generated/src/Alert/Alert.d.ts +1 -0
  273. package/typings/generated/src/Alert/Alert.d.ts.map +1 -0
  274. package/typings/generated/src/App/App.d.ts +4 -0
  275. package/typings/generated/src/App/App.d.ts.map +1 -0
  276. package/typings/generated/src/App/App.test.d.ts +1 -0
  277. package/typings/generated/src/App/App.test.d.ts.map +1 -0
  278. package/typings/generated/src/App/ConnectedToStore.d.ts +1 -0
  279. package/typings/generated/src/App/ConnectedToStore.d.ts.map +1 -0
  280. package/typings/generated/src/App/VisibilityBar.d.ts +1 -0
  281. package/typings/generated/src/App/VisibilityBar.d.ts.map +1 -0
  282. package/typings/generated/src/App/appLayout.d.ts +1 -1
  283. package/typings/generated/src/App/appLayout.d.ts.map +1 -0
  284. package/typings/generated/src/Button/Button.d.ts +2 -1
  285. package/typings/generated/src/Button/Button.d.ts.map +1 -0
  286. package/typings/generated/src/Card/Card.d.ts +1 -0
  287. package/typings/generated/src/Card/Card.d.ts.map +1 -0
  288. package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts +1 -0
  289. package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts.map +1 -0
  290. package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts +1 -0
  291. package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts.map +1 -0
  292. package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts +1 -0
  293. package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts.map +1 -0
  294. package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts +1 -0
  295. package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts.map +1 -0
  296. package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts +1 -0
  297. package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts.map +1 -0
  298. package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts +1 -0
  299. package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts.map +1 -0
  300. package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts +1 -0
  301. package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts.map +1 -0
  302. package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts +1 -0
  303. package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts.map +1 -0
  304. package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts +1 -0
  305. package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts.map +1 -0
  306. package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts +1 -0
  307. package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts.map +1 -0
  308. package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts +1 -0
  309. package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts.map +1 -0
  310. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +1 -0
  311. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -0
  312. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts +1 -0
  313. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts.map +1 -0
  314. package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts +1 -0
  315. package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts.map +1 -0
  316. package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts +1 -0
  317. package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts.map +1 -0
  318. package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts +1 -0
  319. package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts.map +1 -0
  320. package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts +1 -0
  321. package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts.map +1 -0
  322. package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts +3 -1
  323. package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts.map +1 -0
  324. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +3 -1
  325. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts.map +1 -0
  326. package/typings/generated/src/Device/deviceLibWrapper.d.ts +1 -0
  327. package/typings/generated/src/Device/deviceLibWrapper.d.ts.map +1 -0
  328. package/typings/generated/src/Device/deviceLibWrapper.test.d.ts +1 -0
  329. package/typings/generated/src/Device/deviceLibWrapper.test.d.ts.map +1 -0
  330. package/typings/generated/src/Device/deviceLister.d.ts +4 -2
  331. package/typings/generated/src/Device/deviceLister.d.ts.map +1 -0
  332. package/typings/generated/src/Device/deviceLister.test.d.ts +1 -0
  333. package/typings/generated/src/Device/deviceLister.test.d.ts.map +1 -0
  334. package/typings/generated/src/Device/deviceSetup.d.ts +8 -7
  335. package/typings/generated/src/Device/deviceSetup.d.ts.map +1 -0
  336. package/typings/generated/src/Device/deviceSetupSlice.d.ts +1 -0
  337. package/typings/generated/src/Device/deviceSetupSlice.d.ts.map +1 -0
  338. package/typings/generated/src/Device/deviceSlice.d.ts +1 -0
  339. package/typings/generated/src/Device/deviceSlice.d.ts.map +1 -0
  340. package/typings/generated/src/Device/dfu-cc.d.ts +1 -0
  341. package/typings/generated/src/Device/dfu-cc.d.ts.map +1 -0
  342. package/typings/generated/src/Device/initPacket.d.ts +1 -0
  343. package/typings/generated/src/Device/initPacket.d.ts.map +1 -0
  344. package/typings/generated/src/Device/jprogOperations.d.ts +1 -0
  345. package/typings/generated/src/Device/jprogOperations.d.ts.map +1 -0
  346. package/typings/generated/src/Device/sdfuOperations.d.ts +4 -3
  347. package/typings/generated/src/Device/sdfuOperations.d.ts.map +1 -0
  348. package/typings/generated/src/Dialog/Dialog.d.ts +1 -0
  349. package/typings/generated/src/Dialog/Dialog.d.ts.map +1 -0
  350. package/typings/generated/src/Dialog/Dialog.test.d.ts +1 -0
  351. package/typings/generated/src/Dialog/Dialog.test.d.ts.map +1 -0
  352. package/typings/generated/src/Dropdown/Dropdown.d.ts +3 -1
  353. package/typings/generated/src/Dropdown/Dropdown.d.ts.map +1 -0
  354. package/typings/generated/src/Dropdown/Dropdown.test.d.ts +1 -0
  355. package/typings/generated/src/Dropdown/Dropdown.test.d.ts.map +1 -0
  356. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +1 -0
  357. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -0
  358. package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts +1 -0
  359. package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts.map +1 -0
  360. package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts +1 -0
  361. package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts.map +1 -0
  362. package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts +1 -0
  363. package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts.map +1 -0
  364. package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts +1 -0
  365. package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts.map +1 -0
  366. package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts +1 -0
  367. package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts.map +1 -0
  368. package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts +1 -0
  369. package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts.map +1 -0
  370. package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts +1 -0
  371. package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts.map +1 -0
  372. package/typings/generated/src/FlashMessage/FlashMessage.d.ts +5 -0
  373. package/typings/generated/src/FlashMessage/FlashMessage.d.ts.map +1 -0
  374. package/typings/generated/src/FlashMessage/FlashMessageSlice.d.ts +20 -0
  375. package/typings/generated/src/FlashMessage/FlashMessageSlice.d.ts.map +1 -0
  376. package/typings/generated/src/InlineInput/InlineInput.d.ts +1 -0
  377. package/typings/generated/src/InlineInput/InlineInput.d.ts.map +1 -0
  378. package/typings/generated/src/InlineInput/NumberInlineInput.d.ts +1 -0
  379. package/typings/generated/src/InlineInput/NumberInlineInput.d.ts.map +1 -0
  380. package/typings/generated/src/Log/LogEntry.d.ts +1 -0
  381. package/typings/generated/src/Log/LogEntry.d.ts.map +1 -0
  382. package/typings/generated/src/Log/LogViewer.d.ts +1 -0
  383. package/typings/generated/src/Log/LogViewer.d.ts.map +1 -0
  384. package/typings/generated/src/Log/logSlice.d.ts +1 -0
  385. package/typings/generated/src/Log/logSlice.d.ts.map +1 -0
  386. package/typings/generated/src/Log/syncLogToStore.d.ts +1 -0
  387. package/typings/generated/src/Log/syncLogToStore.d.ts.map +1 -0
  388. package/typings/generated/src/Logo/Logo.d.ts +1 -0
  389. package/typings/generated/src/Logo/Logo.d.ts.map +1 -0
  390. package/typings/generated/src/Main/Main.d.ts +1 -0
  391. package/typings/generated/src/Main/Main.d.ts.map +1 -0
  392. package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts +1 -0
  393. package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts.map +1 -0
  394. package/typings/generated/src/NavBar/NavBar.d.ts +1 -0
  395. package/typings/generated/src/NavBar/NavBar.d.ts.map +1 -0
  396. package/typings/generated/src/NavBar/NavMenu.d.ts +1 -0
  397. package/typings/generated/src/NavBar/NavMenu.d.ts.map +1 -0
  398. package/typings/generated/src/NavBar/NavMenu.test.d.ts +1 -0
  399. package/typings/generated/src/NavBar/NavMenu.test.d.ts.map +1 -0
  400. package/typings/generated/src/NavBar/NavMenuItem.d.ts +1 -1
  401. package/typings/generated/src/NavBar/NavMenuItem.d.ts.map +1 -0
  402. package/typings/generated/src/NumberInputWithSlider/NumberInputSliderWithUnit.d.ts +14 -0
  403. package/typings/generated/src/NumberInputWithSlider/NumberInputSliderWithUnit.d.ts.map +1 -0
  404. package/typings/generated/src/Panes/FeedbackPane.d.ts +5 -1
  405. package/typings/generated/src/Panes/FeedbackPane.d.ts.map +1 -0
  406. package/typings/generated/src/PseudoButton/PseudoButton.d.ts +1 -0
  407. package/typings/generated/src/PseudoButton/PseudoButton.d.ts.map +1 -0
  408. package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts +1 -0
  409. package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts.map +1 -0
  410. package/typings/generated/src/SerialPort/SerialPort.d.ts +7 -6
  411. package/typings/generated/src/SerialPort/SerialPort.d.ts.map +1 -0
  412. package/typings/generated/src/SerialPort/SerialPort.test.d.ts +1 -0
  413. package/typings/generated/src/SerialPort/SerialPort.test.d.ts.map +1 -0
  414. package/typings/generated/src/Shortcuts/ShortcutItem.d.ts +1 -0
  415. package/typings/generated/src/Shortcuts/ShortcutItem.d.ts.map +1 -0
  416. package/typings/generated/src/Shortcuts/ShortcutModal.d.ts +1 -0
  417. package/typings/generated/src/Shortcuts/ShortcutModal.d.ts.map +1 -0
  418. package/typings/generated/src/SidePanel/Group.d.ts +1 -0
  419. package/typings/generated/src/SidePanel/Group.d.ts.map +1 -0
  420. package/typings/generated/src/SidePanel/SidePanel.d.ts +1 -0
  421. package/typings/generated/src/SidePanel/SidePanel.d.ts.map +1 -0
  422. package/typings/generated/src/Slider/Bar.d.ts +1 -0
  423. package/typings/generated/src/Slider/Bar.d.ts.map +1 -0
  424. package/typings/generated/src/Slider/Factor.test.d.ts +1 -0
  425. package/typings/generated/src/Slider/Factor.test.d.ts.map +1 -0
  426. package/typings/generated/src/Slider/Handle.d.ts +1 -0
  427. package/typings/generated/src/Slider/Handle.d.ts.map +1 -0
  428. package/typings/generated/src/Slider/Slider.d.ts +1 -0
  429. package/typings/generated/src/Slider/Slider.d.ts.map +1 -0
  430. package/typings/generated/src/Slider/Slider.test.d.ts +1 -0
  431. package/typings/generated/src/Slider/Slider.test.d.ts.map +1 -0
  432. package/typings/generated/src/Slider/Ticks.d.ts +1 -0
  433. package/typings/generated/src/Slider/Ticks.d.ts.map +1 -0
  434. package/typings/generated/src/Slider/factor.d.ts +1 -0
  435. package/typings/generated/src/Slider/factor.d.ts.map +1 -0
  436. package/typings/generated/src/Slider/percentage.d.ts +1 -0
  437. package/typings/generated/src/Slider/percentage.d.ts.map +1 -0
  438. package/typings/generated/src/Slider/range.d.ts +1 -0
  439. package/typings/generated/src/Slider/range.d.ts.map +1 -0
  440. package/typings/generated/src/StartStopButton/StartStopButton.d.ts +1 -0
  441. package/typings/generated/src/StartStopButton/StartStopButton.d.ts.map +1 -0
  442. package/typings/generated/src/StateSelector/StateSelector.d.ts +1 -0
  443. package/typings/generated/src/StateSelector/StateSelector.d.ts.map +1 -0
  444. package/typings/generated/src/Stepper/Stepper.d.ts +1 -0
  445. package/typings/generated/src/Stepper/Stepper.d.ts.map +1 -0
  446. package/typings/generated/src/Toggle/Toggle.d.ts +1 -0
  447. package/typings/generated/src/Toggle/Toggle.d.ts.map +1 -0
  448. package/typings/generated/src/index.d.ts +12 -8
  449. package/typings/generated/src/index.d.ts.map +1 -0
  450. package/typings/generated/src/logging/appTransport.d.ts +1 -0
  451. package/typings/generated/src/logging/appTransport.d.ts.map +1 -0
  452. package/typings/generated/src/logging/appTransport.test.d.ts +1 -0
  453. package/typings/generated/src/logging/appTransport.test.d.ts.map +1 -0
  454. package/typings/generated/src/logging/describeError.d.ts +1 -0
  455. package/typings/generated/src/logging/describeError.d.ts.map +1 -0
  456. package/typings/generated/src/logging/describeError.test.d.ts +1 -0
  457. package/typings/generated/src/logging/describeError.test.d.ts.map +1 -0
  458. package/typings/generated/src/logging/index.d.ts +1 -0
  459. package/typings/generated/src/logging/index.d.ts.map +1 -0
  460. package/typings/generated/src/logging/logBuffer.d.ts +1 -0
  461. package/typings/generated/src/logging/logBuffer.d.ts.map +1 -0
  462. package/typings/generated/src/logging/logBuffer.test.d.ts +1 -0
  463. package/typings/generated/src/logging/logBuffer.test.d.ts.map +1 -0
  464. package/typings/generated/src/logging/sendInitialLogMessages.d.ts +2 -1
  465. package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -0
  466. package/typings/generated/src/store.d.ts +21 -18
  467. package/typings/generated/src/store.d.ts.map +1 -0
  468. package/typings/generated/src/utils/appDirs.d.ts +1 -0
  469. package/typings/generated/src/utils/appDirs.d.ts.map +1 -0
  470. package/typings/generated/src/utils/bleChannels.d.ts +1 -0
  471. package/typings/generated/src/utils/bleChannels.d.ts.map +1 -0
  472. package/typings/generated/src/utils/classNames.d.ts +1 -0
  473. package/typings/generated/src/utils/classNames.d.ts.map +1 -0
  474. package/typings/generated/src/utils/classNames.test.d.ts +1 -0
  475. package/typings/generated/src/utils/classNames.test.d.ts.map +1 -0
  476. package/typings/generated/src/utils/colors.d.ts +126 -3
  477. package/typings/generated/src/utils/colors.d.ts.map +1 -0
  478. package/typings/generated/src/utils/describeVersion.d.ts +1 -0
  479. package/typings/generated/src/utils/describeVersion.d.ts.map +1 -0
  480. package/typings/generated/src/utils/environment.d.ts +1 -0
  481. package/typings/generated/src/utils/environment.d.ts.map +1 -0
  482. package/typings/generated/src/utils/logLibVersions.d.ts +1 -0
  483. package/typings/generated/src/utils/logLibVersions.d.ts.map +1 -0
  484. package/typings/generated/src/utils/open.d.ts +1 -0
  485. package/typings/generated/src/utils/open.d.ts.map +1 -0
  486. package/typings/generated/src/utils/packageJson.d.ts +2 -1
  487. package/typings/generated/src/utils/packageJson.d.ts.map +1 -0
  488. package/typings/generated/src/utils/persistentStore.d.ts +1 -0
  489. package/typings/generated/src/utils/persistentStore.d.ts.map +1 -0
  490. package/typings/generated/src/utils/systemReport.d.ts +1 -0
  491. package/typings/generated/src/utils/systemReport.d.ts.map +1 -0
  492. package/typings/generated/src/utils/truncateMiddle.d.ts +1 -0
  493. package/typings/generated/src/utils/truncateMiddle.d.ts.map +1 -0
  494. package/typings/generated/src/utils/truncateMiddle.test.d.ts +1 -0
  495. package/typings/generated/src/utils/truncateMiddle.test.d.ts.map +1 -0
  496. package/typings/generated/src/utils/usageData.d.ts +4 -3
  497. package/typings/generated/src/utils/usageData.d.ts.map +1 -0
  498. package/typings/generated/src/utils/useFocusedOnVisible.d.ts +11 -0
  499. package/typings/generated/src/utils/useFocusedOnVisible.d.ts.map +1 -0
  500. package/typings/generated/src/utils/useHotKey.d.ts +1 -0
  501. package/typings/generated/src/utils/useHotKey.d.ts.map +1 -0
  502. package/typings/generated/src/utils/useStopwatch.d.ts +1 -0
  503. package/typings/generated/src/utils/useStopwatch.d.ts.map +1 -0
  504. package/typings/generated/src/utils/useStopwatch.test.d.ts +1 -0
  505. package/typings/generated/src/utils/useStopwatch.test.d.ts.map +1 -0
  506. package/typings/generated/test/dispatchTo.d.ts +1 -0
  507. package/typings/generated/test/dispatchTo.d.ts.map +1 -0
  508. package/typings/generated/test/testrenderer.d.ts +1 -0
  509. package/typings/generated/test/testrenderer.d.ts.map +1 -0
  510. package/dist/index.css +0 -1451
  511. package/dist/index.js +0 -122119
  512. package/tsconfig.json +0 -9
  513. package/typings/generated/src/About/documentationSlice.d.ts +0 -12
  514. package/typings/generated/src/OpenApp/openApp.d.ts +0 -7
  515. /package/{dist/nordic-logo-white-icon-only-XIZBW537.png → src/Logo/nordic-logo-white-icon-only.png} +0 -0
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import { ModuleVersion } from '@nordicsemiconductor/nrf-device-lib-js';
8
+
9
+ export default (version?: ModuleVersion) => {
10
+ if (version == null) {
11
+ return 'Unknown';
12
+ }
13
+
14
+ switch (version.versionFormat) {
15
+ case 'incremental':
16
+ case 'string':
17
+ return String(version.version);
18
+ case 'semantic':
19
+ return `${version.version.major}.${version.version.minor}.${version.version.patch}`;
20
+ }
21
+ };
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+ export const isDevelopment = process.env.NODE_ENV === 'development';
@@ -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 {
8
+ getModuleVersions,
9
+ ModuleVersion,
10
+ } from '@nordicsemiconductor/nrf-device-lib-js';
11
+ import { spawn } from 'child_process';
12
+ import os from 'os';
13
+
14
+ import {
15
+ getDeviceLibContext,
16
+ getModuleVersion,
17
+ } from '../Device/deviceLibWrapper';
18
+ import logger from '../logging';
19
+ import describeVersion from './describeVersion';
20
+
21
+ const log = (description: string, moduleVersion?: ModuleVersion) => {
22
+ if (moduleVersion == null) {
23
+ logger.warn(`Unable to detect version of ${description}.`);
24
+ } else {
25
+ logger.info(
26
+ `Using ${description} version: ${describeVersion(moduleVersion)}`
27
+ );
28
+ }
29
+ };
30
+
31
+ const pathEnvVariable = () => {
32
+ if (process.platform !== 'darwin') return process.env;
33
+
34
+ return {
35
+ ...process.env,
36
+ PATH: `/bin:/usr/bin:/usr/local/bin:${process.env.PATH}`,
37
+ };
38
+ };
39
+
40
+ const spawnAsync = (cmd: string, params?: string[]) =>
41
+ new Promise<string>((resolve, reject) => {
42
+ const codeProcess = spawn(cmd, params, {
43
+ shell: true,
44
+ env: pathEnvVariable(),
45
+ });
46
+ let stdout = '';
47
+ let stderr = '';
48
+ codeProcess.stdout.on('data', data => {
49
+ stdout += data;
50
+ });
51
+ codeProcess.stderr.on('data', data => {
52
+ stderr += data;
53
+ });
54
+
55
+ codeProcess.on('close', (code, signal) => {
56
+ if (stderr) console.log(stderr);
57
+ if (code === 0 && signal === null) {
58
+ return resolve(stdout);
59
+ }
60
+ return reject();
61
+ });
62
+ });
63
+
64
+ const checkJLinkArchitectureOnDarwin = async () => {
65
+ const stdout = await spawnAsync('file $(which JLinkExe)');
66
+ const universalMatch = 'Mach-O universal binary with 2 architectures';
67
+ const intelMatch = 'Mach-O 64-bit executable x86_64';
68
+ if (stdout.includes(universalMatch)) return 'universal';
69
+ if (stdout.includes(intelMatch)) return 'x86_64';
70
+ return 'arm';
71
+ };
72
+
73
+ export default async () => {
74
+ try {
75
+ const versions = await getModuleVersions(getDeviceLibContext());
76
+
77
+ log('nrf-device-lib-js', getModuleVersion('nrfdl-js', versions));
78
+ log('nrf-device-lib', getModuleVersion('nrfdl', versions));
79
+ log('nrfjprog DLL', getModuleVersion('jprog', versions));
80
+ log('JLink', getModuleVersion('JlinkARM', versions));
81
+ if (
82
+ process.platform === 'darwin' &&
83
+ os.cpus()[0].model.includes('Apple')
84
+ ) {
85
+ const JLinkArchOnDarwin = await checkJLinkArchitectureOnDarwin();
86
+
87
+ if (JLinkArchOnDarwin && JLinkArchOnDarwin !== 'universal') {
88
+ const JLinkInstallerVersion =
89
+ JLinkArchOnDarwin === 'arm'
90
+ ? '64-bit Apple M1 Installer'
91
+ : '64-bit Intel Installer';
92
+ logger.warn(
93
+ `It looks like you have installed JLink using ${JLinkInstallerVersion}, but currently we only support their Universal Installer for your system.`
94
+ );
95
+ logger.warn(
96
+ `Please install JLink: https://www.segger.com/downloads/jlink/JLink_MacOSX_V780c_universal.pkg`
97
+ );
98
+ }
99
+ }
100
+ } catch (error) {
101
+ logger.logError('Failed to get the library versions', error);
102
+ }
103
+ };
@@ -0,0 +1,46 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import childProcess from 'child_process';
8
+ import { shell } from 'electron';
9
+ import fs from 'fs';
10
+ import os from 'os';
11
+
12
+ /**
13
+ * Open a file in the default text application, depending on the user's OS.
14
+ *
15
+ * @param {string} filePath path to the file to open.
16
+ * @returns {void}
17
+ */
18
+ function openFile(filePath: string) {
19
+ const exists = fs.existsSync(filePath);
20
+ if (!exists) {
21
+ throw new Error(`Could not find file at path: ${filePath}`);
22
+ }
23
+
24
+ const escapedPath = filePath.replace(/ /g, '\\ ');
25
+
26
+ // Could not find a method that works on all three platforms:
27
+ // * shell.openItem works on Windows and Linux but not on OSX
28
+ // * childProcess.execSync works on OSX but not on Windows
29
+ if (os.type() === 'Darwin') {
30
+ childProcess.execSync(`open ${escapedPath}`);
31
+ } else {
32
+ shell.openPath(escapedPath);
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Open a URL in the user's default web browser.
38
+ *
39
+ * @param {string} url The URL to open.
40
+ * @returns {void}
41
+ */
42
+ function openUrl(url: string) {
43
+ shell.openExternal(url);
44
+ }
45
+
46
+ export { openFile, openUrl };
@@ -0,0 +1,60 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import { readFileSync } from 'fs';
8
+
9
+ /* Explanation for that cascade of eslint-disable-next-line and @ts-ignore:
10
+ '../../../../package.json' will resolve correctly when `shared` is used in
11
+ a real app, so it is fine.
12
+
13
+ When checking `shared` '../../../../package.json' will not be there, so we
14
+ need to disable the errors that occur in that case. That is done by the
15
+ second and third statement:
16
+ // @ts-ignore This will be available when the app uses it.
17
+ // eslint-disable-next-line import/no-unresolved
18
+
19
+ Usually we would not use `@ts-ignore` but rather `@ts-expect-error`. But
20
+ the latter is not possible for a different reason: When we type-check an
21
+ app that uses shared, that line will now be type-checked too and now
22
+ '../../../../package.json' actually is there, so `ts-expect-error` would
23
+ lead to an error, telling us that contrary to our expectation there is no
24
+ error there.
25
+
26
+ Because of that we have to use `@ts-ignore`. But that is usually forbidden
27
+ by the linting rules, so additionally we have to add that first line
28
+ eslint-disable-next-line @typescript-eslint/ban-ts-comment
29
+
30
+ Phew!
31
+ */
32
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
33
+ // @ts-ignore This will be available when the app uses it.
34
+ // eslint-disable-next-line import/no-unresolved
35
+ import packageJsons from '../../../../package.json';
36
+ import type { PackageJson } from '../../ipc/MetaFiles';
37
+
38
+ let packageJson: PackageJson = packageJsons;
39
+
40
+ export const loadPackageJson = (packageJsonPath: string) => {
41
+ try {
42
+ packageJson = JSON.parse(
43
+ readFileSync(packageJsonPath, 'utf8')
44
+ ) as PackageJson;
45
+ } catch (e) {
46
+ console.error(
47
+ 'Failed to read "package.json" of the app. Please tell the app developer to package it correctly.'
48
+ );
49
+ }
50
+ };
51
+
52
+ export default () => {
53
+ if (packageJson == null) {
54
+ throw new Error(`package.json was not read. This can be caused by one of two things:
55
+ - Either a programming error in the app that tries to use the content of package.json very early before it was loaded.
56
+ - Or if the app was packaged without a package.json, but in that case the launcher should not even launch this app.`);
57
+ }
58
+
59
+ return packageJson;
60
+ };
@@ -0,0 +1,144 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import type { AutoDetectTypes } from '@serialport/bindings-cpp';
8
+ import Store from 'electron-store';
9
+ import { SerialPortOpenOptions } from 'serialport';
10
+ import { v4 as uuid } from 'uuid';
11
+
12
+ import logger from '../logging';
13
+ import packageJson from './packageJson';
14
+
15
+ export interface SerialSettings {
16
+ serialPortOptions: Omit<SerialPortOpenOptions<AutoDetectTypes>, 'path'>;
17
+ lastUpdated: number;
18
+ vComIndex: number;
19
+ }
20
+
21
+ export interface TerminalSettings {
22
+ lineMode: boolean;
23
+ echoOnShell: boolean;
24
+ lineEnding: string;
25
+ clearOnSend: boolean;
26
+ }
27
+
28
+ const sharedStore = new Store<{
29
+ verboseLogging: boolean;
30
+ isSendingUsageData: boolean | undefined;
31
+ clientId?: string;
32
+ }>({
33
+ name: 'pc-nrfconnect-shared',
34
+ });
35
+
36
+ /* These nicknames are also read by the VS Code extension,
37
+ so changing e.g. the keys here would break the usage there. */
38
+ export const persistNickname = (serialNumber: string, nickname: string) =>
39
+ sharedStore.set(`${serialNumber}.name`, nickname);
40
+ export const getPersistedNickname = (serialNumber: string) =>
41
+ sharedStore.get(`${serialNumber}.name`, '') as string;
42
+
43
+ export const persistIsFavorite = (serialNumber: string, value: boolean) =>
44
+ sharedStore.set(`${serialNumber}.fav`, value);
45
+ export const getPersistedIsFavorite = (serialNumber: string) =>
46
+ sharedStore.get(`${serialNumber}.fav`, false) as boolean;
47
+
48
+ export const persistSerialPortSettings = (
49
+ serialNumber: string,
50
+ serialPortSettings: Omit<SerialSettings, 'lastUpdated'>
51
+ ) =>
52
+ sharedStore.set(`${serialNumber}.${packageJson().name}`, {
53
+ ...serialPortSettings,
54
+ lastUpdated: Date.now(),
55
+ });
56
+ export const getPersistedSerialPortSettings = (
57
+ serialNumber: string
58
+ ): SerialSettings | undefined => {
59
+ const appName = packageJson().name;
60
+ logger.info(
61
+ `Getting serialport options from persistent store ${serialNumber}.${appName}`
62
+ );
63
+ return sharedStore.get(`${serialNumber}.${appName}`);
64
+ };
65
+ export const persistTerminalSettings = (
66
+ serialNumber: string,
67
+ vComIndex: number,
68
+ terminalSettings: TerminalSettings
69
+ ) =>
70
+ sharedStore.set(
71
+ `${serialNumber}.vCom-${vComIndex}.TerminalSettings`,
72
+ terminalSettings
73
+ );
74
+ export const getPersistedTerminalSettings = (
75
+ serialNumber: string,
76
+ vComIndex: number
77
+ ): TerminalSettings | undefined => {
78
+ logger.info(
79
+ `Get terminal settings from persistent store ${serialNumber}.vCom-${vComIndex}.TerminalSettings`
80
+ );
81
+ return sharedStore.get(
82
+ `${serialNumber}.vCom-${vComIndex}.TerminalSettings`
83
+ );
84
+ };
85
+
86
+ export const persistIsSendingUsageData = (value: boolean) =>
87
+ sharedStore.set('isSendingUsageData', value);
88
+ export const getIsSendingUsageData = () =>
89
+ sharedStore.get('isSendingUsageData', undefined) as boolean | undefined;
90
+ export const deleteIsSendingUsageData = () =>
91
+ sharedStore.delete('isSendingUsageData');
92
+
93
+ const existingUsageDataClientId = () => sharedStore.get('clientId');
94
+ const newUsageDataClientId = () => {
95
+ const clientId = uuid();
96
+ sharedStore.set('clientId', clientId);
97
+
98
+ return clientId;
99
+ };
100
+ export const getUsageDataClientId = () =>
101
+ existingUsageDataClientId() ?? newUsageDataClientId();
102
+
103
+ export const persistIsLoggingVerbose = (value: boolean) =>
104
+ sharedStore.set('isLoggingVerbose', value);
105
+ export const getIsLoggingVerbose = () =>
106
+ sharedStore.get('isLoggingVerbose', false);
107
+
108
+ // This one must be initialised lazily, because the package.json is not read yet when this module is initialised.
109
+ // This can probably be changed when we bundle shared with the apps.
110
+ let appSpecificStore: Store | undefined;
111
+
112
+ interface SharedAppSpecificStoreSchema {
113
+ currentPane?: number;
114
+ }
115
+
116
+ export const getAppSpecificStore = <
117
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
118
+ StoreSchema extends Record<string, any>
119
+ >(
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
+ options?: Store.Options<any>
122
+ ) => {
123
+ if (appSpecificStore == null) {
124
+ appSpecificStore = new Store({
125
+ name: packageJson().name,
126
+ clearInvalidConfig: true,
127
+ // @ts-expect-error `electron-store` assumes the app is the version of the launcher, override this to be the same as the app version
128
+ projectVersion: packageJson().version,
129
+ ...options,
130
+ });
131
+ }
132
+
133
+ return appSpecificStore as Store<
134
+ StoreSchema & SharedAppSpecificStoreSchema
135
+ >;
136
+ };
137
+
138
+ export const persistCurrentPane = (currentPane: number) =>
139
+ getAppSpecificStore<SharedAppSpecificStoreSchema>().set(
140
+ `currentPane`,
141
+ currentPane
142
+ );
143
+ export const getPersistedCurrentPane = () =>
144
+ getAppSpecificStore<SharedAppSpecificStoreSchema>().get(`currentPane`);
@@ -0,0 +1,160 @@
1
+ /*
2
+ * Copyright (c) 2105 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import nrfDeviceLib from '@nordicsemiconductor/nrf-device-lib-js';
8
+ import fs from 'fs';
9
+ import { EOL } from 'os';
10
+ import path from 'path';
11
+ import pretty from 'prettysize';
12
+ import type Systeminformation from 'systeminformation';
13
+
14
+ import {
15
+ deviceInfo as getDeviceInfo,
16
+ productPageUrl,
17
+ } from '../Device/deviceInfo/deviceInfo';
18
+ import {
19
+ getDeviceLibContext,
20
+ getModuleVersion,
21
+ } from '../Device/deviceLibWrapper';
22
+ import { Device } from '../Device/deviceSlice';
23
+ import logger from '../logging';
24
+ import { getAppDataDir } from './appDirs';
25
+ import describeVersion from './describeVersion';
26
+ import { openFile } from './open';
27
+
28
+ const generalInfoReport = async () => {
29
+ // eslint-disable-next-line global-require
30
+ const si = require('systeminformation') as typeof Systeminformation;
31
+ const [
32
+ { manufacturer, model },
33
+ { vendor, version },
34
+ { platform, distro, release, arch },
35
+ { kernel, git, node, python, python3 },
36
+ {
37
+ manufacturer: cpuManufacturer,
38
+ brand,
39
+ speed,
40
+ cores,
41
+ physicalCores,
42
+ processors,
43
+ },
44
+ { total, free },
45
+ fsSize,
46
+ ] = await Promise.all([
47
+ si.system(),
48
+ si.bios(),
49
+ si.osInfo(),
50
+ si.versions(),
51
+ si.cpu(),
52
+ si.mem(),
53
+ si.fsSize(),
54
+ ]);
55
+
56
+ const versions = await nrfDeviceLib.getModuleVersions(
57
+ getDeviceLibContext()
58
+ );
59
+
60
+ return [
61
+ `- System: ${manufacturer} ${model}`,
62
+ `- BIOS: ${vendor} ${version}`,
63
+ `- CPU: ${processors} x ${cpuManufacturer} ${brand} ${speed} GHz` +
64
+ ` ${cores} cores (${physicalCores} physical)`,
65
+ `- Memory: ${pretty(free)} free of ${pretty(total)} total`,
66
+ `- Filesystem: ${fsSize[0].fs} (${fsSize[0].type})` +
67
+ ` ${pretty(Number(fsSize[0].size) || 0)}` +
68
+ ` ${fsSize[0].use.toFixed(1)}% used`,
69
+ '',
70
+ `- OS: ${distro} (${release}) ${platform} ${arch}`,
71
+ '',
72
+ '- Versions',
73
+ ` - kernel: ${kernel}`,
74
+ ` - git: ${git}`,
75
+ ` - node: ${node}`,
76
+ ` - python: ${python}`,
77
+ ` - python3: ${python3}`,
78
+ ` - nrf-device-lib-js: ${describeVersion(
79
+ getModuleVersion('nrfdl-js', versions)
80
+ )}`,
81
+ ` - nrf-device-lib: ${describeVersion(
82
+ getModuleVersion('nrfdl', versions)
83
+ )}`,
84
+ ` - nrfjprog DLL: ${describeVersion(
85
+ getModuleVersion('jprog', versions)
86
+ )}`,
87
+ ` - JLink: ${describeVersion(
88
+ getModuleVersion('JlinkARM', versions)
89
+ )}`,
90
+ '',
91
+ ];
92
+ };
93
+
94
+ const allDevicesReport = (allDevices: Device[] = []) => [
95
+ '- Connected devices:',
96
+ ...allDevices.map(
97
+ d =>
98
+ ` - ${d.serialNumber} ${d.boardVersion || ''}: ${d.serialPorts
99
+ ?.map(s => s.comName)
100
+ .join(', ')}`
101
+ ),
102
+ '',
103
+ ];
104
+
105
+ const currentDeviceReport = (device?: Device, currentSerialNumber?: string) => {
106
+ if (device == null) {
107
+ return [];
108
+ }
109
+
110
+ const deviceInfo = getDeviceInfo(device);
111
+
112
+ return [
113
+ '- Current device:',
114
+ ` - name: ${deviceInfo.name}`,
115
+ ` - serialNumber: ${currentSerialNumber}`,
116
+ ` - cores: ${deviceInfo.cores ?? 'Unknown'}`,
117
+ ` - website: ${productPageUrl(device) ?? 'Unknown'}`,
118
+ '',
119
+ ];
120
+ };
121
+
122
+ export const generateSystemReport = async (
123
+ timestamp: string,
124
+ allDevices?: Device[],
125
+ currentDevice?: Device,
126
+ currentSerialNumber?: string
127
+ ) =>
128
+ [
129
+ `# nRFConnect System Report - ${timestamp}`,
130
+ '',
131
+ ...(await generalInfoReport()),
132
+ ...allDevicesReport(allDevices),
133
+ ...currentDeviceReport(currentDevice, currentSerialNumber),
134
+ ].join(EOL);
135
+
136
+ export default async (
137
+ allDevices: Device[],
138
+ currentSerialNumber: string,
139
+ currentDevice: Device | null
140
+ ) => {
141
+ logger.info('Generating system report...');
142
+ const timestamp = new Date().toISOString().replace(/:/g, '-');
143
+ const report = await generateSystemReport(
144
+ timestamp,
145
+ allDevices,
146
+ currentDevice ?? undefined,
147
+ currentSerialNumber
148
+ );
149
+
150
+ const fileName = `nrfconnect-system-report-${timestamp}.txt`;
151
+ const filePath = path.resolve(getAppDataDir(), fileName);
152
+
153
+ try {
154
+ fs.writeFileSync(filePath, report);
155
+ logger.info(`System report: ${filePath}`);
156
+ openFile(filePath);
157
+ } catch (error) {
158
+ logger.logError('Failed to generate system report', error);
159
+ }
160
+ };
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import { truncateMiddle } from './truncateMiddle';
8
+
9
+ test('truncate strings when necessary', () => {
10
+ expect(
11
+ truncateMiddle('some long string with more than 36 characters')
12
+ ).toBe('some long string wit...36 characters');
13
+
14
+ expect(truncateMiddle('short string')).toBe('short string');
15
+
16
+ expect(truncateMiddle('string with 20 chars')).toBe('string with 20 chars');
17
+
18
+ expect(truncateMiddle('abc123def', 3, 3)).toBe('abc123def');
19
+
20
+ expect(truncateMiddle('abc1234efg', 3, 3)).toBe('abc...efg');
21
+ });
@@ -0,0 +1,20 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ const truncateMiddle = (str: string, clipStart = 20, clipEnd = 13) => {
8
+ const clipStartWithEllipsis = clipStart + 3;
9
+ if (str.length <= clipStartWithEllipsis + clipEnd) {
10
+ return str;
11
+ }
12
+ const rightHandStartingPoint =
13
+ str.length - Math.min(clipEnd, str.length - clipStartWithEllipsis);
14
+ return `${str.substring(0, clipStart)}...${str.substring(
15
+ rightHandStartingPoint,
16
+ str.length
17
+ )}`;
18
+ };
19
+
20
+ export { truncateMiddle };