@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.
Files changed (367) hide show
  1. package/.github/ISSUE_TEMPLATE/custom.md +10 -0
  2. package/.husky/pre-push +3 -0
  3. package/.renovaterc.json +10 -0
  4. package/Changelog.md +2973 -0
  5. package/LICENSE +35 -0
  6. package/README.md +11 -0
  7. package/azure-pipelines.yml +34 -0
  8. package/config/eslintrc.js +190 -0
  9. package/config/jest.config.js +41 -0
  10. package/config/prettier.config.js +13 -0
  11. package/config/tsconfig.json +15 -0
  12. package/fw/bootloader/graviton_bootloader_v1.0.1-[nRF5_SDK_15.0.1-1.alpha_f76d012].zip +0 -0
  13. package/jest.config.js +7 -0
  14. package/main/index.ts +32 -0
  15. package/mocks/deviceLibMock.ts +21 -0
  16. package/mocks/electronMock.ts +15 -0
  17. package/mocks/electronStoreMock.ts +19 -0
  18. package/mocks/emptyMock.ts +7 -0
  19. package/mocks/fileMock.ts +13 -0
  20. package/mocks/gaMock.ts +9 -0
  21. package/mocks/mockTests.test.ts +15 -0
  22. package/mocks/packageJsonMock.ts +10 -0
  23. package/mocks/remoteMock.ts +17 -0
  24. package/package.json +132 -0
  25. package/scripts/check-app-properties.ts +197 -0
  26. package/scripts/check-for-typescript.ts +41 -0
  27. package/scripts/esbuild-bootstrap.js +15 -0
  28. package/scripts/esbuild-renderer.js +131 -0
  29. package/scripts/esbuild.js +57 -0
  30. package/scripts/installHusky.ts +17 -0
  31. package/scripts/nordic-publish.ts +485 -0
  32. package/scripts/nrfconnect-license.ts +277 -0
  33. package/scripts/prepare-shared-release.ts +122 -0
  34. package/scripts/release-shared.test.ts +132 -0
  35. package/scripts/release-shared.ts +207 -0
  36. package/src/About/About.tsx +25 -0
  37. package/src/About/AboutButton.tsx +28 -0
  38. package/src/About/ApplicationCard.tsx +83 -0
  39. package/src/About/DeviceCard.tsx +74 -0
  40. package/src/About/DocumentationCard.tsx +18 -0
  41. package/src/About/DocumentationSection.tsx +24 -0
  42. package/src/About/Section.tsx +21 -0
  43. package/src/About/ShortcutButton.tsx +41 -0
  44. package/src/About/SupportCard.tsx +97 -0
  45. package/src/About/about.scss +40 -0
  46. package/src/About/documentationSlice.ts +41 -0
  47. package/src/About/section.scss +15 -0
  48. package/src/About/shortcutSlice.ts +52 -0
  49. package/src/Alert/Alert.module.scss +29 -0
  50. package/src/Alert/Alert.tsx +37 -0
  51. package/src/App/App.test.tsx +47 -0
  52. package/src/App/App.tsx +227 -0
  53. package/src/App/ConnectedToStore.tsx +19 -0
  54. package/src/App/VisibilityBar.tsx +103 -0
  55. package/src/App/app.scss +83 -0
  56. package/src/App/appLayout.ts +95 -0
  57. package/src/App/shared.scss +49 -0
  58. package/src/App/visibility-bar.scss +55 -0
  59. package/src/Button/Button.tsx +66 -0
  60. package/src/Button/button.module.scss +154 -0
  61. package/src/Card/Card.tsx +26 -0
  62. package/src/Card/card.module.scss +28 -0
  63. package/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.tsx +58 -0
  64. package/src/Device/BrokenDeviceDialog/broken-device-dialog.scss +18 -0
  65. package/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.tsx +48 -0
  66. package/src/Device/DeviceSelector/BasicDeviceInfo.tsx +115 -0
  67. package/src/Device/DeviceSelector/DeviceIcon.tsx +27 -0
  68. package/src/Device/DeviceSelector/DeviceList/AnimatedList.tsx +62 -0
  69. package/src/Device/DeviceSelector/DeviceList/BrokenDevice.tsx +34 -0
  70. package/src/Device/DeviceSelector/DeviceList/Device.tsx +84 -0
  71. package/src/Device/DeviceSelector/DeviceList/DeviceList.tsx +113 -0
  72. package/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.tsx +28 -0
  73. package/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.tsx +65 -0
  74. package/src/Device/DeviceSelector/DeviceList/RenameDevice.tsx +22 -0
  75. package/src/Device/DeviceSelector/DeviceList/broken-device.scss +32 -0
  76. package/src/Device/DeviceSelector/DeviceList/device-list.scss +64 -0
  77. package/src/Device/DeviceSelector/DeviceList/device.scss +28 -0
  78. package/src/Device/DeviceSelector/DeviceList/edit-device-buttons.scss +31 -0
  79. package/src/Device/DeviceSelector/DeviceList/more-device-info.scss +33 -0
  80. package/src/Device/DeviceSelector/DeviceList/rename-device.scss +13 -0
  81. package/src/Device/DeviceSelector/DeviceSelector.test.tsx +342 -0
  82. package/src/Device/DeviceSelector/DeviceSelector.tsx +173 -0
  83. package/src/Device/DeviceSelector/Favorite.tsx +49 -0
  84. package/src/Device/DeviceSelector/SelectDevice.tsx +36 -0
  85. package/src/Device/DeviceSelector/SelectedDevice.tsx +65 -0
  86. package/src/Device/DeviceSelector/arrow-down.svg +1 -0
  87. package/src/Device/DeviceSelector/basic-device-info.scss +62 -0
  88. package/src/Device/DeviceSelector/device-icon.scss +27 -0
  89. package/src/Device/DeviceSelector/favorite.scss +17 -0
  90. package/src/Device/DeviceSelector/select-device.scss +38 -0
  91. package/src/Device/DeviceSelector/selected-device.scss +57 -0
  92. package/src/Device/DeviceSetup/DeviceSetupView.tsx +102 -0
  93. package/src/Device/deviceAutoSelectSlice.ts +144 -0
  94. package/src/Device/deviceInfo/deviceInfo.ts +254 -0
  95. package/src/Device/deviceInfo/nRF51-Series-logo.svg +1 -0
  96. package/src/Device/deviceInfo/nRF52-Series-logo.svg +1 -0
  97. package/src/Device/deviceInfo/nRF53-Series-logo.svg +1 -0
  98. package/src/Device/deviceInfo/nRF70-Series_no-background_RGB.svg +36 -0
  99. package/src/Device/deviceInfo/nRF91-Series-logo.svg +1 -0
  100. package/src/Device/deviceInfo/ppk-logo.svg +1 -0
  101. package/src/Device/deviceInfo/unknown-logo.svg +30 -0
  102. package/src/Device/deviceInfo/unknown-nordic-logo.svg +25 -0
  103. package/src/Device/deviceLibWrapper.test.ts +97 -0
  104. package/src/Device/deviceLibWrapper.ts +133 -0
  105. package/src/Device/deviceLister.test.ts +89 -0
  106. package/src/Device/deviceLister.ts +396 -0
  107. package/src/Device/deviceSetup.ts +264 -0
  108. package/src/Device/deviceSetupSlice.ts +94 -0
  109. package/src/Device/deviceSlice.ts +248 -0
  110. package/src/Device/dfu-cc.ts +162 -0
  111. package/src/Device/initPacket.ts +402 -0
  112. package/src/Device/jprogOperations.ts +206 -0
  113. package/src/Device/sdfuOperations.ts +601 -0
  114. package/src/Dialog/Dialog.test.tsx +134 -0
  115. package/src/Dialog/Dialog.tsx +236 -0
  116. package/src/Dialog/dialog.scss +60 -0
  117. package/src/Dropdown/Dropdown.module.scss +83 -0
  118. package/src/Dropdown/Dropdown.test.tsx +62 -0
  119. package/src/Dropdown/Dropdown.tsx +106 -0
  120. package/src/ErrorBoundary/ErrorBoundary.test.tsx +105 -0
  121. package/src/ErrorBoundary/ErrorBoundary.tsx +186 -0
  122. package/src/ErrorBoundary/bug.svg +1 -0
  123. package/src/ErrorBoundary/error-boundary.scss +102 -0
  124. package/src/ErrorDialog/ErrorDialog.test.tsx +70 -0
  125. package/src/ErrorDialog/ErrorDialog.tsx +94 -0
  126. package/src/ErrorDialog/error.scss +14 -0
  127. package/src/ErrorDialog/errorDialogSlice.test.ts +64 -0
  128. package/src/ErrorDialog/errorDialogSlice.ts +80 -0
  129. package/src/FactoryReset/FactoryResetButton.test.tsx +46 -0
  130. package/src/FactoryReset/FactoryResetButton.tsx +81 -0
  131. package/src/InlineInput/InlineInput.tsx +170 -0
  132. package/src/InlineInput/NumberInlineInput.tsx +107 -0
  133. package/src/InlineInput/inline-input.scss +38 -0
  134. package/src/InlineInput/number-inline-input.scss +15 -0
  135. package/src/Log/LogEntry.tsx +62 -0
  136. package/src/Log/LogViewer.tsx +54 -0
  137. package/src/Log/log-entry.scss +30 -0
  138. package/src/Log/log-viewer.scss +24 -0
  139. package/src/Log/logSlice.ts +73 -0
  140. package/src/Log/syncLogToStore.ts +36 -0
  141. package/src/Logo/Logo.tsx +48 -0
  142. package/src/Logo/logo.scss +11 -0
  143. package/src/Logo/nordic-logo-blue-icon-only.png +0 -0
  144. package/src/Logo/nordic-logo-gray-icon-only.png +0 -0
  145. package/src/Logo/nordic-logo-white-icon-only.png +0 -0
  146. package/src/Main/Main.tsx +13 -0
  147. package/src/Main/main.scss +13 -0
  148. package/src/MasonryLayout/MasonryLayout.tsx +234 -0
  149. package/src/MasonryLayout/masonryLayout.module.scss +46 -0
  150. package/src/NavBar/NavBar.tsx +22 -0
  151. package/src/NavBar/NavMenu.test.tsx +41 -0
  152. package/src/NavBar/NavMenu.tsx +53 -0
  153. package/src/NavBar/NavMenuItem.tsx +41 -0
  154. package/src/NavBar/nav-bar.scss +26 -0
  155. package/src/NavBar/nav-menu-item.scss +34 -0
  156. package/src/OpenApp/openApp.ts +18 -0
  157. package/src/Panes/FeedbackPane.tsx +149 -0
  158. package/src/PseudoButton/PseudoButton.tsx +56 -0
  159. package/src/PseudoButton/pseudo-button.scss +11 -0
  160. package/src/SerialPort/ConflictingSettingsDialog.tsx +242 -0
  161. package/src/SerialPort/SerialPort.test.ts +54 -0
  162. package/src/SerialPort/SerialPort.ts +202 -0
  163. package/src/Shortcuts/Shortcut-item.scss +33 -0
  164. package/src/Shortcuts/Shortcut-modal.scss +20 -0
  165. package/src/Shortcuts/ShortcutItem.tsx +48 -0
  166. package/src/Shortcuts/ShortcutModal.tsx +67 -0
  167. package/src/SidePanel/Group.tsx +106 -0
  168. package/src/SidePanel/SidePanel.tsx +19 -0
  169. package/src/SidePanel/group.scss +42 -0
  170. package/src/SidePanel/sidepanel.scss +20 -0
  171. package/src/Slider/Bar.tsx +24 -0
  172. package/src/Slider/Factor.test.ts +48 -0
  173. package/src/Slider/Handle.tsx +121 -0
  174. package/src/Slider/Slider.test.tsx +25 -0
  175. package/src/Slider/Slider.tsx +91 -0
  176. package/src/Slider/Ticks.tsx +54 -0
  177. package/src/Slider/__snapshots__/Slider.test.tsx.snap +50 -0
  178. package/src/Slider/bar.scss +24 -0
  179. package/src/Slider/factor.ts +24 -0
  180. package/src/Slider/handle.scss +32 -0
  181. package/src/Slider/percentage.ts +67 -0
  182. package/src/Slider/range.ts +92 -0
  183. package/src/Slider/slider.scss +14 -0
  184. package/src/Slider/ticks.scss +28 -0
  185. package/src/Slider/variables.scss +16 -0
  186. package/src/StartStopButton/StartStopButton.tsx +60 -0
  187. package/src/StartStopButton/play-circle.svg +1 -0
  188. package/src/StartStopButton/start-stop-button.scss +47 -0
  189. package/src/StartStopButton/stop-circle.svg +1 -0
  190. package/src/StateSelector/StateSelector.tsx +64 -0
  191. package/src/StateSelector/state-selector.scss +38 -0
  192. package/src/Stepper/Stepper.tsx +139 -0
  193. package/src/Stepper/stepper.scss +127 -0
  194. package/src/Toggle/Toggle.tsx +120 -0
  195. package/src/Toggle/toggle.scss +109 -0
  196. package/src/bootstrap.scss +14 -0
  197. package/src/index.ts +146 -0
  198. package/src/logging/appTransport.test.ts +78 -0
  199. package/src/logging/appTransport.ts +41 -0
  200. package/src/logging/describeError.test.ts +38 -0
  201. package/src/logging/describeError.ts +56 -0
  202. package/src/logging/index.ts +103 -0
  203. package/src/logging/logBuffer.test.ts +41 -0
  204. package/src/logging/logBuffer.ts +24 -0
  205. package/src/logging/sendInitialLogMessages.ts +64 -0
  206. package/src/store.ts +60 -0
  207. package/src/svg.d.ts +15 -0
  208. package/src/utils/AppTypes.ts +60 -0
  209. package/src/utils/appDirs.ts +78 -0
  210. package/src/utils/bleChannels.ts +16 -0
  211. package/src/utils/classNames.test.ts +29 -0
  212. package/src/utils/classNames.ts +25 -0
  213. package/src/utils/colors.scss +46 -0
  214. package/src/utils/colors.ts +38 -0
  215. package/src/utils/describeVersion.ts +21 -0
  216. package/src/utils/environment.ts +6 -0
  217. package/src/utils/logLibVersions.ts +103 -0
  218. package/src/utils/open.ts +46 -0
  219. package/src/utils/packageJson.ts +60 -0
  220. package/src/utils/persistentStore.ts +144 -0
  221. package/src/utils/systemReport.ts +160 -0
  222. package/src/utils/truncateMiddle.test.ts +21 -0
  223. package/src/utils/truncateMiddle.ts +20 -0
  224. package/src/utils/usageData.ts +189 -0
  225. package/src/utils/useHotKey.ts +62 -0
  226. package/src/utils/useStopwatch.test.tsx +311 -0
  227. package/src/utils/useStopwatch.ts +140 -0
  228. package/src/variables.scss +820 -0
  229. package/styles.scss +88 -0
  230. package/test/dispatchTo.ts +23 -0
  231. package/test/index.ts +7 -0
  232. package/test/jestResolver.js +28 -0
  233. package/test/setupTests.ts +27 -0
  234. package/test/testUtil.ts +20 -0
  235. package/test/testrenderer.tsx +39 -0
  236. package/tsconfig.json +9 -0
  237. package/typings/externals.d.ts +31 -0
  238. package/typings/generated/main/index.d.ts +25 -0
  239. package/typings/generated/src/About/About.d.ts +4 -0
  240. package/typings/generated/src/About/AboutButton.d.ts +8 -0
  241. package/typings/generated/src/About/ApplicationCard.d.ts +3 -0
  242. package/typings/generated/src/About/DeviceCard.d.ts +3 -0
  243. package/typings/generated/src/About/DocumentationCard.d.ts +3 -0
  244. package/typings/generated/src/About/DocumentationSection.d.ts +9 -0
  245. package/typings/generated/src/About/Section.d.ts +8 -0
  246. package/typings/generated/src/About/ShortcutButton.d.ts +6 -0
  247. package/typings/generated/src/About/SupportCard.d.ts +3 -0
  248. package/typings/generated/src/About/documentationSlice.d.ts +12 -0
  249. package/typings/generated/src/About/shortcutSlice.d.ts +11 -0
  250. package/typings/generated/src/Alert/Alert.d.ts +10 -0
  251. package/typings/generated/src/App/App.d.ts +27 -0
  252. package/typings/generated/src/App/App.test.d.ts +1 -0
  253. package/typings/generated/src/App/ConnectedToStore.d.ts +7 -0
  254. package/typings/generated/src/App/VisibilityBar.d.ts +6 -0
  255. package/typings/generated/src/App/appLayout.d.ts +17 -0
  256. package/typings/generated/src/Button/Button.d.ts +13 -0
  257. package/typings/generated/src/Card/Card.d.ts +7 -0
  258. package/typings/generated/src/Device/BrokenDeviceDialog/BrokenDeviceDialog.d.ts +4 -0
  259. package/typings/generated/src/Device/BrokenDeviceDialog/brokenDeviceDialogSlice.d.ts +12 -0
  260. package/typings/generated/src/Device/DeviceSelector/BasicDeviceInfo.d.ts +11 -0
  261. package/typings/generated/src/Device/DeviceSelector/DeviceIcon.d.ts +7 -0
  262. package/typings/generated/src/Device/DeviceSelector/DeviceList/AnimatedList.d.ts +10 -0
  263. package/typings/generated/src/Device/DeviceSelector/DeviceList/BrokenDevice.d.ts +7 -0
  264. package/typings/generated/src/Device/DeviceSelector/DeviceList/Device.d.ts +10 -0
  265. package/typings/generated/src/Device/DeviceSelector/DeviceList/DeviceList.d.ts +10 -0
  266. package/typings/generated/src/Device/DeviceSelector/DeviceList/EditDeviceButtons.d.ts +9 -0
  267. package/typings/generated/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.d.ts +7 -0
  268. package/typings/generated/src/Device/DeviceSelector/DeviceList/RenameDevice.d.ts +6 -0
  269. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +20 -0
  270. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.test.d.ts +1 -0
  271. package/typings/generated/src/Device/DeviceSelector/Favorite.d.ts +9 -0
  272. package/typings/generated/src/Device/DeviceSelector/SelectDevice.d.ts +8 -0
  273. package/typings/generated/src/Device/DeviceSelector/SelectedDevice.d.ts +7 -0
  274. package/typings/generated/src/Device/DeviceSetup/DeviceSetupView.d.ts +3 -0
  275. package/typings/generated/src/Device/deviceAutoSelectSlice.d.ts +28 -0
  276. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +18 -0
  277. package/typings/generated/src/Device/deviceLibWrapper.d.ts +8 -0
  278. package/typings/generated/src/Device/deviceLibWrapper.test.d.ts +1 -0
  279. package/typings/generated/src/Device/deviceLister.d.ts +25 -0
  280. package/typings/generated/src/Device/deviceLister.test.d.ts +2 -0
  281. package/typings/generated/src/Device/deviceSetup.d.ts +40 -0
  282. package/typings/generated/src/Device/deviceSetupSlice.d.ts +20 -0
  283. package/typings/generated/src/Device/deviceSlice.d.ts +30 -0
  284. package/typings/generated/src/Device/dfu-cc.d.ts +3 -0
  285. package/typings/generated/src/Device/initPacket.d.ts +109 -0
  286. package/typings/generated/src/Device/jprogOperations.d.ts +2 -0
  287. package/typings/generated/src/Device/sdfuOperations.d.ts +14 -0
  288. package/typings/generated/src/Dialog/Dialog.d.ts +64 -0
  289. package/typings/generated/src/Dialog/Dialog.test.d.ts +1 -0
  290. package/typings/generated/src/Dropdown/Dropdown.d.ts +16 -0
  291. package/typings/generated/src/Dropdown/Dropdown.test.d.ts +1 -0
  292. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +26 -0
  293. package/typings/generated/src/ErrorBoundary/ErrorBoundary.test.d.ts +1 -0
  294. package/typings/generated/src/ErrorDialog/ErrorDialog.d.ts +4 -0
  295. package/typings/generated/src/ErrorDialog/ErrorDialog.test.d.ts +1 -0
  296. package/typings/generated/src/ErrorDialog/errorDialogSlice.d.ts +23 -0
  297. package/typings/generated/src/ErrorDialog/errorDialogSlice.test.d.ts +1 -0
  298. package/typings/generated/src/FactoryReset/FactoryResetButton.d.ts +12 -0
  299. package/typings/generated/src/FactoryReset/FactoryResetButton.test.d.ts +1 -0
  300. package/typings/generated/src/InlineInput/InlineInput.d.ts +14 -0
  301. package/typings/generated/src/InlineInput/NumberInlineInput.d.ts +12 -0
  302. package/typings/generated/src/Log/LogEntry.d.ts +7 -0
  303. package/typings/generated/src/Log/LogViewer.d.ts +5 -0
  304. package/typings/generated/src/Log/logSlice.d.ts +12 -0
  305. package/typings/generated/src/Log/syncLogToStore.d.ts +11 -0
  306. package/typings/generated/src/Logo/Logo.d.ts +6 -0
  307. package/typings/generated/src/Main/Main.d.ts +6 -0
  308. package/typings/generated/src/MasonryLayout/MasonryLayout.d.ts +14 -0
  309. package/typings/generated/src/NavBar/NavBar.d.ts +6 -0
  310. package/typings/generated/src/NavBar/NavMenu.d.ts +3 -0
  311. package/typings/generated/src/NavBar/NavMenu.test.d.ts +1 -0
  312. package/typings/generated/src/NavBar/NavMenuItem.d.ts +10 -0
  313. package/typings/generated/src/OpenApp/openApp.d.ts +7 -0
  314. package/typings/generated/src/Panes/FeedbackPane.d.ts +3 -0
  315. package/typings/generated/src/PseudoButton/PseudoButton.d.ts +10 -0
  316. package/typings/generated/src/SerialPort/ConflictingSettingsDialog.d.ts +13 -0
  317. package/typings/generated/src/SerialPort/SerialPort.d.ts +21 -0
  318. package/typings/generated/src/SerialPort/SerialPort.test.d.ts +1 -0
  319. package/typings/generated/src/Shortcuts/ShortcutItem.d.ts +8 -0
  320. package/typings/generated/src/Shortcuts/ShortcutModal.d.ts +8 -0
  321. package/typings/generated/src/SidePanel/Group.d.ts +16 -0
  322. package/typings/generated/src/SidePanel/SidePanel.d.ts +7 -0
  323. package/typings/generated/src/Slider/Bar.d.ts +7 -0
  324. package/typings/generated/src/Slider/Factor.test.d.ts +1 -0
  325. package/typings/generated/src/Slider/Handle.d.ts +13 -0
  326. package/typings/generated/src/Slider/Slider.d.ts +15 -0
  327. package/typings/generated/src/Slider/Slider.test.d.ts +1 -0
  328. package/typings/generated/src/Slider/Ticks.d.ts +12 -0
  329. package/typings/generated/src/Slider/factor.d.ts +1 -0
  330. package/typings/generated/src/Slider/percentage.d.ts +4 -0
  331. package/typings/generated/src/Slider/range.d.ts +13 -0
  332. package/typings/generated/src/StartStopButton/StartStopButton.d.ts +16 -0
  333. package/typings/generated/src/StateSelector/StateSelector.d.ts +15 -0
  334. package/typings/generated/src/Stepper/Stepper.d.ts +26 -0
  335. package/typings/generated/src/Toggle/Toggle.d.ts +19 -0
  336. package/typings/generated/src/index.d.ts +69 -0
  337. package/typings/generated/src/logging/appTransport.d.ts +12 -0
  338. package/typings/generated/src/logging/appTransport.test.d.ts +1 -0
  339. package/typings/generated/src/logging/describeError.d.ts +2 -0
  340. package/typings/generated/src/logging/describeError.test.d.ts +1 -0
  341. package/typings/generated/src/logging/index.d.ts +9 -0
  342. package/typings/generated/src/logging/logBuffer.d.ts +9 -0
  343. package/typings/generated/src/logging/logBuffer.test.d.ts +1 -0
  344. package/typings/generated/src/logging/sendInitialLogMessages.d.ts +2 -0
  345. package/typings/generated/src/store.d.ts +65 -0
  346. package/typings/generated/src/utils/AppTypes.d.ts +49 -0
  347. package/typings/generated/src/utils/appDirs.d.ts +35 -0
  348. package/typings/generated/src/utils/bleChannels.d.ts +6 -0
  349. package/typings/generated/src/utils/classNames.d.ts +17 -0
  350. package/typings/generated/src/utils/classNames.test.d.ts +1 -0
  351. package/typings/generated/src/utils/colors.d.ts +31 -0
  352. package/typings/generated/src/utils/describeVersion.d.ts +3 -0
  353. package/typings/generated/src/utils/environment.d.ts +1 -0
  354. package/typings/generated/src/utils/logLibVersions.d.ts +2 -0
  355. package/typings/generated/src/utils/open.d.ts +15 -0
  356. package/typings/generated/src/utils/packageJson.d.ts +4 -0
  357. package/typings/generated/src/utils/persistentStore.d.ts +35 -0
  358. package/typings/generated/src/utils/systemReport.d.ts +4 -0
  359. package/typings/generated/src/utils/truncateMiddle.d.ts +2 -0
  360. package/typings/generated/src/utils/truncateMiddle.test.d.ts +1 -0
  361. package/typings/generated/src/utils/usageData.d.ts +63 -0
  362. package/typings/generated/src/utils/useHotKey.d.ts +6 -0
  363. package/typings/generated/src/utils/useStopwatch.d.ts +22 -0
  364. package/typings/generated/src/utils/useStopwatch.test.d.ts +1 -0
  365. package/typings/generated/test/dispatchTo.d.ts +3 -0
  366. package/typings/generated/test/testrenderer.d.ts +5 -0
  367. package/typings/nrf-intel-hex.d.ts +58 -0
@@ -0,0 +1,105 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import React from 'react';
8
+ import reactGA from 'react-ga';
9
+ import { fireEvent, screen, waitFor } from '@testing-library/react';
10
+
11
+ import render from '../../test/testrenderer';
12
+ import { getAppSpecificStore as store } from '../utils/persistentStore';
13
+ import { generateSystemReport } from '../utils/systemReport';
14
+ import ErrorBoundary from './ErrorBoundary';
15
+
16
+ const mockReactGA = reactGA;
17
+
18
+ jest.mock('../utils/systemReport');
19
+ jest.mock('react-ga');
20
+ jest.mock('../utils/usageData', () => ({
21
+ ...jest.requireActual('../utils/usageData'),
22
+ init: jest.fn(() => {
23
+ mockReactGA.initialize('');
24
+ }),
25
+ sendErrorReport: jest.fn(),
26
+ isEnabled: () => true,
27
+ }));
28
+
29
+ const SYSTEM_REPORT = 'system report';
30
+ const OKBUTTONTEXT = 'Restore';
31
+
32
+ jest.mocked(generateSystemReport).mockImplementation(
33
+ () =>
34
+ new Promise(res => {
35
+ res(SYSTEM_REPORT);
36
+ })
37
+ );
38
+
39
+ const Child = () => {
40
+ throw new Error();
41
+ };
42
+
43
+ describe('ErrorBoundary', () => {
44
+ beforeEach(() => {
45
+ const spy = jest.spyOn(console, 'error');
46
+ spy.mockImplementation(() => {});
47
+ });
48
+
49
+ afterEach(() => {
50
+ jest.clearAllMocks();
51
+ });
52
+
53
+ it('should send GA event', async () => {
54
+ render(
55
+ <ErrorBoundary>
56
+ <Child />
57
+ </ErrorBoundary>
58
+ );
59
+
60
+ await waitFor(() => expect(reactGA.initialize).toHaveBeenCalled());
61
+ });
62
+
63
+ it('can take custom reporting functions', () => {
64
+ const sendUsageData = jest.fn();
65
+
66
+ render(
67
+ <ErrorBoundary sendUsageData={sendUsageData}>
68
+ <Child />
69
+ </ErrorBoundary>
70
+ );
71
+ expect(sendUsageData).toHaveBeenCalled();
72
+ });
73
+
74
+ it('should render error boundary component when there is an error', () => {
75
+ render(
76
+ <ErrorBoundary>
77
+ <Child />
78
+ </ErrorBoundary>
79
+ );
80
+ const errorMessage = screen.getByText('Oops! There was a problem');
81
+ expect(errorMessage).toBeDefined();
82
+ });
83
+
84
+ it('should clear store if factory reset', async () => {
85
+ render(
86
+ <ErrorBoundary>
87
+ <Child />
88
+ </ErrorBoundary>
89
+ );
90
+ fireEvent.click(screen.getByText('Restore default settings'));
91
+ await screen.findByText(OKBUTTONTEXT);
92
+ fireEvent.click(screen.getByText(OKBUTTONTEXT));
93
+ expect(store().clear).toHaveBeenCalled();
94
+ });
95
+
96
+ it('should present system information', async () => {
97
+ render(
98
+ <ErrorBoundary>
99
+ <Child />
100
+ </ErrorBoundary>
101
+ );
102
+ const report = await screen.findByText(SYSTEM_REPORT);
103
+ expect(report).toBeDefined();
104
+ });
105
+ });
@@ -0,0 +1,186 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import React, { ReactNode } from 'react';
8
+ import { Spinner } from 'react-bootstrap';
9
+ import { getCurrentWindow } from '@electron/remote';
10
+
11
+ import Button from '../Button/Button';
12
+ import { Device } from '../Device/deviceSlice';
13
+ import FactoryResetButton from '../FactoryReset/FactoryResetButton';
14
+ import { CollapsibleGroup } from '../SidePanel/Group';
15
+ import { openUrl } from '../utils/open';
16
+ import packageJson from '../utils/packageJson';
17
+ import { getAppSpecificStore as store } from '../utils/persistentStore';
18
+ import { generateSystemReport } from '../utils/systemReport';
19
+ import {
20
+ init as initGA,
21
+ isEnabled,
22
+ isInitialized as isGAInitialized,
23
+ sendErrorReport,
24
+ } from '../utils/usageData';
25
+ import bugIcon from './bug.svg';
26
+
27
+ import './error-boundary.scss';
28
+
29
+ const sendGAEvent = (error: string) => {
30
+ if (!isEnabled()) {
31
+ return;
32
+ }
33
+ if (!isGAInitialized()) {
34
+ initGA(packageJson());
35
+ }
36
+ sendErrorReport(error);
37
+ };
38
+
39
+ interface Props {
40
+ children: ReactNode;
41
+ selectedSerialNumber?: string;
42
+ selectedDevice?: Device;
43
+ devices?: Device[];
44
+ appName?: string;
45
+ restoreDefaults?: () => void;
46
+ sendUsageData?: (message: string) => void;
47
+ }
48
+
49
+ const genericRestoreDefaults = () => {
50
+ store().clear();
51
+ getCurrentWindow().reload();
52
+ };
53
+
54
+ class ErrorBoundary extends React.Component<
55
+ Props,
56
+ { hasError: boolean; error: Error | null; systemReport: string | null }
57
+ > {
58
+ constructor(props: Props) {
59
+ super(props);
60
+ this.state = {
61
+ hasError: false,
62
+ error: null,
63
+ systemReport: null,
64
+ };
65
+ }
66
+
67
+ static getDerivedStateFromError(error: Error) {
68
+ return {
69
+ hasError: true,
70
+ error,
71
+ };
72
+ }
73
+
74
+ componentDidCatch(error: Error) {
75
+ const { devices, selectedDevice, selectedSerialNumber, sendUsageData } =
76
+ this.props;
77
+ sendUsageData != null
78
+ ? sendUsageData(error.message)
79
+ : sendGAEvent(error.message);
80
+
81
+ generateSystemReport(
82
+ new Date().toISOString().replace(/:/g, '-'),
83
+ devices,
84
+ selectedDevice,
85
+ selectedSerialNumber
86
+ ).then(report => {
87
+ this.setState({ systemReport: report });
88
+ });
89
+ }
90
+
91
+ render() {
92
+ const { hasError, error, systemReport } = this.state;
93
+
94
+ const { children, appName, restoreDefaults } = this.props;
95
+
96
+ if (!hasError) {
97
+ return children;
98
+ }
99
+
100
+ const appDisplayName = appName || packageJson().displayName;
101
+
102
+ return (
103
+ <div className="error-boundary__container">
104
+ <div className="error-boundary__header">
105
+ <h1>Oops! There was a problem</h1>
106
+ <img src={bugIcon} alt="" />
107
+ </div>
108
+ <div className="error-boundary__main">
109
+ <div className="error-boundary__info">
110
+ <div className="info-header">
111
+ nRF Connect for Desktop {appDisplayName} experienced
112
+ an unrecoverable error
113
+ </div>
114
+ <p>
115
+ If this is the first time you&apos;ve seen this
116
+ problem we recommend restarting the application.
117
+ </p>
118
+ <Button
119
+ large
120
+ variant="primary"
121
+ onClick={() => getCurrentWindow().reload()}
122
+ >
123
+ Restart application
124
+ </Button>
125
+ <p>
126
+ If restarting didn&apos;t help, you can also try
127
+ restoring to default values.
128
+ </p>
129
+ <FactoryResetButton
130
+ large
131
+ resetFn={restoreDefaults || genericRestoreDefaults}
132
+ label="Restore default settings"
133
+ variant="primary"
134
+ />
135
+ </div>
136
+ </div>
137
+ <div className="error-boundary__footer">
138
+ {error !== null && (
139
+ <div className="error-boundary__message">
140
+ <CollapsibleGroup heading="Show detailed error message">
141
+ <div className="report">
142
+ <h4>{error.message}</h4>
143
+ <pre>{error.stack}</pre>
144
+ </div>
145
+ </CollapsibleGroup>
146
+ </div>
147
+ )}
148
+ <hr />
149
+ {systemReport !== null ? (
150
+ <div className="error-boundary__message">
151
+ <CollapsibleGroup heading="Show system report">
152
+ <div className="report">
153
+ <pre>{systemReport}</pre>
154
+ </div>
155
+ </CollapsibleGroup>
156
+ </div>
157
+ ) : (
158
+ <div className="error-boundary__message--loading">
159
+ <h2 className="loading-header">
160
+ Generating system report...
161
+ </h2>
162
+ <Spinner size="sm" animation="border" />
163
+ </div>
164
+ )}
165
+ <p>
166
+ Please report the problem on DevZone if you have
167
+ experienced it multiple times
168
+ </p>
169
+ <Button
170
+ large
171
+ variant="primary"
172
+ onClick={() =>
173
+ openUrl(
174
+ 'https://devzone.nordicsemi.com/support/add'
175
+ )
176
+ }
177
+ >
178
+ Go to DevZone
179
+ </Button>
180
+ </div>
181
+ </div>
182
+ );
183
+ }
184
+ }
185
+
186
+ export default ErrorBoundary;
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#455a64"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96L17 4.41 15.59 3l-2.17 2.17C12.96 5.06 12.49 5 12 5s-.96.06-1.41.17L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8zm-4 4v3c0 .22-.03.47-.07.7l-.1.65-.37.65c-.72 1.24-2.04 2-3.46 2s-2.74-.77-3.46-2l-.37-.64-.1-.65C8.03 15.48 8 15.23 8 15v-4c0-.23.03-.48.07-.7l.1-.65.37-.65c.3-.52.72-.97 1.21-1.31l.57-.39.74-.18c.31-.08.63-.12.94-.12.32 0 .63.04.95.12l.68.16.61.42c.5.34.91.78 1.21 1.31l.38.65.1.65c.04.22.07.47.07.69v1zm-6 2h4v2h-4zm0-4h4v2h-4z"/></svg>
@@ -0,0 +1,102 @@
1
+ /*
2
+ * Copyright (c) 2021 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ @import '../variables.scss';
8
+
9
+ .error-boundary {
10
+ &__container {
11
+ background: white;
12
+ position: absolute;
13
+ left: 50%;
14
+ top: 50%;
15
+ transform: translate(-50%, -50%);
16
+ padding: 16px;
17
+ width: 700px;
18
+ border: 1px solid $gray-400;
19
+ box-shadow: 5px 6px 5px -1px rgba(0, 0, 0, 0.1);
20
+ height: 100%;
21
+ overflow-y: overlay;
22
+ @include scrollbars($white);
23
+ }
24
+
25
+ &__header {
26
+ margin-bottom: 16px;
27
+ color: $nordic-blue;
28
+ display: flex;
29
+ justify-content: space-between;
30
+ align-items: center;
31
+
32
+ img {
33
+ height: 32px;
34
+ width: 32px;
35
+ }
36
+ }
37
+
38
+ &__main {
39
+ button {
40
+ margin-right: 8px;
41
+ }
42
+ }
43
+
44
+ &__info {
45
+ .info-header {
46
+ font-weight: 700;
47
+ color: $gray-700;
48
+ }
49
+
50
+ p {
51
+ margin-top: 16px;
52
+ }
53
+ }
54
+
55
+ &__footer {
56
+ margin-top: 32px;
57
+
58
+ p {
59
+ margin-top: 16px;
60
+ }
61
+
62
+ button {
63
+ margin-top: 16px;
64
+ }
65
+ }
66
+
67
+ &__message {
68
+ margin-bottom: 16px;
69
+
70
+ &--loading {
71
+ margin-bottom: 16px;
72
+ display: flex;
73
+ justify-content: space-between;
74
+ align-items: center;
75
+
76
+ .loading-header {
77
+ color: #263238;
78
+ font-size: 10px;
79
+ font-weight: 400;
80
+ line-height: 13px;
81
+ text-transform: uppercase;
82
+ letter-spacing: 2.6416px;
83
+ }
84
+ }
85
+
86
+ .report {
87
+ border: 1px solid $gray-400;
88
+ padding: 16px;
89
+ user-select: text;
90
+ }
91
+
92
+ pre {
93
+ margin-top: 12px;
94
+ font-size: 12px;
95
+ }
96
+ }
97
+
98
+ .spinner-border {
99
+ margin-left: 16px;
100
+ border-width: 1px;
101
+ }
102
+ }
@@ -0,0 +1,70 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import React from 'react';
8
+ import {
9
+ fireEvent,
10
+ screen,
11
+ waitForElementToBeRemoved,
12
+ } from '@testing-library/react';
13
+
14
+ import render from '../../test/testrenderer';
15
+ import ErrorDialog from './ErrorDialog';
16
+ import { showDialog } from './errorDialogSlice';
17
+
18
+ describe('ErrorDialog', () => {
19
+ it('is not rendered when there is no error', () => {
20
+ render(<ErrorDialog />);
21
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
22
+ });
23
+
24
+ it('should render visible dialog with one message', () => {
25
+ render(<ErrorDialog />, [showDialog('An error occured')]);
26
+
27
+ expect(screen.getByRole('dialog')).toBeInTheDocument();
28
+ expect(screen.getByText('An error occured')).toBeInTheDocument();
29
+ });
30
+
31
+ it('should render visible dialog with two messages', () => {
32
+ render(<ErrorDialog />, [
33
+ showDialog('An error occured'),
34
+ showDialog('Another error occured'),
35
+ ]);
36
+
37
+ expect(screen.getByRole('dialog')).toBeInTheDocument();
38
+ expect(screen.getByText('An error occured')).toBeInTheDocument();
39
+ expect(screen.getByText('Another error occured')).toBeInTheDocument();
40
+ });
41
+
42
+ describe('has a close button', () => {
43
+ it('with the text "Close"', () => {
44
+ render(<ErrorDialog />, [showDialog('An error occured')]);
45
+
46
+ expect(screen.getByRole('button')).toHaveTextContent('Close');
47
+ });
48
+
49
+ it('of which the first closes the dialog', async () => {
50
+ render(<ErrorDialog />, [showDialog('An error occured')]);
51
+ fireEvent.click(screen.getByRole('button'));
52
+
53
+ await waitForElementToBeRemoved(screen.queryByRole('dialog'));
54
+ });
55
+ });
56
+
57
+ it('can have a custom error resolutions', () => {
58
+ const specialHandling = jest.fn();
59
+
60
+ render(<ErrorDialog />, [
61
+ showDialog('An error occured', {
62
+ 'Special Handling': specialHandling,
63
+ }),
64
+ ]);
65
+
66
+ fireEvent.click(screen.getByText('Special Handling'));
67
+
68
+ expect(specialHandling).toHaveBeenCalled();
69
+ });
70
+ });
@@ -0,0 +1,94 @@
1
+ /*
2
+ * Copyright (c) 2015 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import React, { Fragment } from 'react';
8
+ import ReactMarkdown from 'react-markdown';
9
+ import { useDispatch, useSelector } from 'react-redux';
10
+
11
+ import { Dialog, DialogButton } from '../Dialog/Dialog';
12
+ import {
13
+ ErrorMessage,
14
+ errorResolutions as errorResolutionsSelector,
15
+ hideDialog,
16
+ isVisible as isVisibleSelector,
17
+ messages as messagesSelector,
18
+ } from './errorDialogSlice';
19
+
20
+ import './error.scss';
21
+
22
+ const ErrorMessage = ({
23
+ error: { message, detail },
24
+ }: {
25
+ error: ErrorMessage;
26
+ }) => (
27
+ <>
28
+ <ReactMarkdown source={message} linkTarget="_blank" />
29
+ {detail != null && (
30
+ <details className="details">
31
+ <summary>Show technical details</summary>
32
+ <pre>{detail}</pre>
33
+ </details>
34
+ )}
35
+ </>
36
+ );
37
+
38
+ const MultipleErrorMessages = ({ messages }: { messages: ErrorMessage[] }) => (
39
+ <>
40
+ There are multiple errors:
41
+ <ul>
42
+ {messages.map(message => (
43
+ <li key={message.message}>
44
+ <ErrorMessage error={message} />
45
+ </li>
46
+ ))}
47
+ </ul>
48
+ </>
49
+ );
50
+
51
+ const ErrorDialog = () => {
52
+ const dispatch = useDispatch();
53
+
54
+ const isVisible = useSelector(isVisibleSelector);
55
+ const messages = useSelector(messagesSelector);
56
+
57
+ const defaultErrorResolutions = {
58
+ Close: () => dispatch(hideDialog()),
59
+ };
60
+ const errorResolutions =
61
+ useSelector(errorResolutionsSelector) || defaultErrorResolutions;
62
+
63
+ return (
64
+ <Dialog
65
+ isVisible={isVisible}
66
+ onHide={() => dispatch(hideDialog())}
67
+ className="core19-error-body"
68
+ >
69
+ <Dialog.Header title="Error" headerIcon="alert" />
70
+ <Dialog.Body>
71
+ {messages.length === 1 ? (
72
+ <ErrorMessage error={messages[0]} />
73
+ ) : (
74
+ <MultipleErrorMessages messages={messages} />
75
+ )}
76
+ </Dialog.Body>
77
+ <Dialog.Footer>
78
+ {Object.entries(errorResolutions).map(
79
+ ([label, handler], index) => (
80
+ <DialogButton
81
+ key={label}
82
+ onClick={handler}
83
+ variant={index === 0 ? 'primary' : 'secondary'}
84
+ >
85
+ {label}
86
+ </DialogButton>
87
+ )
88
+ )}
89
+ </Dialog.Footer>
90
+ </Dialog>
91
+ );
92
+ };
93
+
94
+ export default ErrorDialog;
@@ -0,0 +1,14 @@
1
+ /*
2
+ * Copyright (c) 2021 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ .core19-error-body {
8
+ user-select: text;
9
+
10
+ .details {
11
+ margin-bottom: 1rem;
12
+ font-size: 14px;
13
+ }
14
+ }
@@ -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 dispatchTo from '../../test/dispatchTo';
8
+ import { hideDialog, reducer, showDialog } from './errorDialogSlice';
9
+
10
+ const anErrorMessage = 'An error occurred';
11
+ const anotherErrorMessage = 'Another error occurred';
12
+
13
+ describe('errorDialogReducer', () => {
14
+ it('should be hidden by default', () => {
15
+ const initialState = dispatchTo(reducer);
16
+
17
+ expect(initialState.isVisible).toEqual(false);
18
+ });
19
+
20
+ it('should be visible and have the supplied message after show action has been dispatched', () => {
21
+ const withAnError = dispatchTo(reducer, [
22
+ showDialog(anErrorMessage, {}),
23
+ ]);
24
+ expect(withAnError.isVisible).toEqual(true);
25
+ expect(withAnError.messages).toContainEqual({
26
+ message: 'An error occurred',
27
+ });
28
+ });
29
+
30
+ it('should be visible and have all messages after multiple show actions have been dispatched', () => {
31
+ const withTwoErrors = dispatchTo(reducer, [
32
+ showDialog(anErrorMessage, {}),
33
+ showDialog(anotherErrorMessage, {}),
34
+ ]);
35
+ expect(withTwoErrors.isVisible).toEqual(true);
36
+ expect(withTwoErrors.messages).toContainEqual({
37
+ message: anErrorMessage,
38
+ });
39
+ expect(withTwoErrors.messages).toContainEqual({
40
+ message: anotherErrorMessage,
41
+ });
42
+ });
43
+
44
+ it('should not add message if it already exists in list', () => {
45
+ const withAnError = dispatchTo(reducer, [
46
+ showDialog(anErrorMessage, {}),
47
+ showDialog(anErrorMessage, {}),
48
+ ]);
49
+
50
+ expect(withAnError.messages).toEqual([
51
+ expect.objectContaining({ message: anErrorMessage }),
52
+ ]);
53
+ });
54
+
55
+ it('should set dialog to invisible and clear message list when hide action has been dispatched', () => {
56
+ const withAClearedError = dispatchTo(reducer, [
57
+ showDialog(anErrorMessage, {}),
58
+ hideDialog(),
59
+ ]);
60
+
61
+ expect(withAClearedError.isVisible).toEqual(false);
62
+ expect(withAClearedError.messages.length).toEqual(0);
63
+ });
64
+ });