@nordicsemiconductor/pc-nrfconnect-shared 88.0.0 → 90.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 (149) hide show
  1. package/Changelog.md +34 -0
  2. package/config/tsconfig.json +1 -1
  3. package/coverage/cobertura-coverage.xml +2216 -1061
  4. package/ipc/MetaFiles.ts +17 -7
  5. package/nrfutil/device/__mocks__/device.ts +43 -0
  6. package/nrfutil/device/batch.ts +219 -0
  7. package/nrfutil/device/batchTypes.ts +133 -0
  8. package/nrfutil/device/common.ts +274 -0
  9. package/nrfutil/device/device.ts +62 -0
  10. package/nrfutil/device/erase.ts +26 -0
  11. package/nrfutil/device/eraseBatch.ts +28 -0
  12. package/nrfutil/device/firmwareRead.ts +34 -0
  13. package/nrfutil/device/firmwareReadBatch.ts +42 -0
  14. package/nrfutil/device/getCoreInfo.ts +44 -0
  15. package/nrfutil/device/getCoreInfoBatch.ts +29 -0
  16. package/nrfutil/device/getFwInfo.ts +69 -0
  17. package/nrfutil/device/getFwInfoBatch.ts +29 -0
  18. package/nrfutil/device/getProtectionStatus.ts +46 -0
  19. package/nrfutil/device/getProtectionStatusBatch.ts +32 -0
  20. package/nrfutil/device/list.ts +81 -0
  21. package/nrfutil/device/program.ts +186 -0
  22. package/nrfutil/device/programBatch.ts +69 -0
  23. package/nrfutil/device/recover.ts +26 -0
  24. package/nrfutil/device/recoverBatch.ts +28 -0
  25. package/nrfutil/device/reset.ts +41 -0
  26. package/nrfutil/device/resetBatch.ts +30 -0
  27. package/nrfutil/device/setMcuState.ts +27 -0
  28. package/nrfutil/device/setProtectionStatus.ts +27 -0
  29. package/nrfutil/index.ts +25 -0
  30. package/nrfutil/moduleVersion.ts +57 -0
  31. package/nrfutil/nrfutilLogger.ts +15 -0
  32. package/nrfutil/sandbox.ts +504 -0
  33. package/nrfutil/sandboxTypes.ts +178 -0
  34. package/package.json +2 -2
  35. package/scripts/nordic-publish.js +1 -1
  36. package/scripts/nordic-publish.ts +11 -2
  37. package/src/About/SupportCard.tsx +6 -9
  38. package/src/App/App.test.tsx +4 -0
  39. package/src/App/App.tsx +13 -2
  40. package/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.tsx +1 -1
  41. package/src/Device/DeviceSelector/DeviceSelector.test.tsx +39 -31
  42. package/src/Device/DeviceSelector/DeviceSelector.tsx +3 -12
  43. package/src/Device/deviceInfo/deviceInfo.ts +2 -3
  44. package/src/Device/deviceLibWrapper.ts +0 -66
  45. package/src/Device/deviceLister.test.ts +1 -2
  46. package/src/Device/deviceLister.ts +169 -215
  47. package/src/Device/deviceSlice.ts +2 -16
  48. package/src/Device/jprogOperations.ts +21 -69
  49. package/src/Device/sdfuOperations.ts +77 -93
  50. package/src/ErrorBoundary/ErrorBoundary.tsx +1 -1
  51. package/src/Log/LogViewer.tsx +0 -4
  52. package/src/Log/logSlice.ts +4 -7
  53. package/src/logging/sendInitialLogMessages.ts +7 -8
  54. package/src/utils/appDirs.ts +6 -11
  55. package/src/utils/logLibVersions.ts +12 -14
  56. package/src/utils/systemReport.ts +11 -17
  57. package/src/utils/usageData.ts +14 -9
  58. package/tsconfig.json +1 -0
  59. package/typings/generated/ipc/MetaFiles.d.ts +14 -7
  60. package/typings/generated/ipc/MetaFiles.d.ts.map +1 -1
  61. package/typings/generated/nrfutil/device/__mocks__/device.d.ts +23 -0
  62. package/typings/generated/nrfutil/device/__mocks__/device.d.ts.map +1 -0
  63. package/typings/generated/nrfutil/device/batch.d.ts +26 -0
  64. package/typings/generated/nrfutil/device/batch.d.ts.map +1 -0
  65. package/typings/generated/nrfutil/device/batchTypes.d.ts +78 -0
  66. package/typings/generated/nrfutil/device/batchTypes.d.ts.map +1 -0
  67. package/typings/generated/nrfutil/device/common.d.ts +125 -0
  68. package/typings/generated/nrfutil/device/common.d.ts.map +1 -0
  69. package/typings/generated/nrfutil/device/device.d.ts +30 -0
  70. package/typings/generated/nrfutil/device/device.d.ts.map +1 -0
  71. package/typings/generated/nrfutil/device/erase.d.ts +5 -0
  72. package/typings/generated/nrfutil/device/erase.d.ts.map +1 -0
  73. package/typings/generated/nrfutil/device/eraseBatch.d.ts +7 -0
  74. package/typings/generated/nrfutil/device/eraseBatch.d.ts.map +1 -0
  75. package/typings/generated/nrfutil/device/firmwareRead.d.ts +10 -0
  76. package/typings/generated/nrfutil/device/firmwareRead.d.ts.map +1 -0
  77. package/typings/generated/nrfutil/device/firmwareReadBatch.d.ts +9 -0
  78. package/typings/generated/nrfutil/device/firmwareReadBatch.d.ts.map +1 -0
  79. package/typings/generated/nrfutil/device/getCoreInfo.d.ts +22 -0
  80. package/typings/generated/nrfutil/device/getCoreInfo.d.ts.map +1 -0
  81. package/typings/generated/nrfutil/device/getCoreInfoBatch.d.ts +8 -0
  82. package/typings/generated/nrfutil/device/getCoreInfoBatch.d.ts.map +1 -0
  83. package/typings/generated/nrfutil/device/getFwInfo.d.ts +31 -0
  84. package/typings/generated/nrfutil/device/getFwInfo.d.ts.map +1 -0
  85. package/typings/generated/nrfutil/device/getFwInfoBatch.d.ts +8 -0
  86. package/typings/generated/nrfutil/device/getFwInfoBatch.d.ts.map +1 -0
  87. package/typings/generated/nrfutil/device/getProtectionStatus.d.ts +13 -0
  88. package/typings/generated/nrfutil/device/getProtectionStatus.d.ts.map +1 -0
  89. package/typings/generated/nrfutil/device/getProtectionStatusBatch.d.ts +8 -0
  90. package/typings/generated/nrfutil/device/getProtectionStatusBatch.d.ts.map +1 -0
  91. package/typings/generated/nrfutil/device/list.d.ts +19 -0
  92. package/typings/generated/nrfutil/device/list.d.ts.map +1 -0
  93. package/typings/generated/nrfutil/device/program.d.ts +27 -0
  94. package/typings/generated/nrfutil/device/program.d.ts.map +1 -0
  95. package/typings/generated/nrfutil/device/programBatch.d.ts +9 -0
  96. package/typings/generated/nrfutil/device/programBatch.d.ts.map +1 -0
  97. package/typings/generated/nrfutil/device/recover.d.ts +5 -0
  98. package/typings/generated/nrfutil/device/recover.d.ts.map +1 -0
  99. package/typings/generated/nrfutil/device/recoverBatch.d.ts +7 -0
  100. package/typings/generated/nrfutil/device/recoverBatch.d.ts.map +1 -0
  101. package/typings/generated/nrfutil/device/reset.d.ts +5 -0
  102. package/typings/generated/nrfutil/device/reset.d.ts.map +1 -0
  103. package/typings/generated/nrfutil/device/resetBatch.d.ts +8 -0
  104. package/typings/generated/nrfutil/device/resetBatch.d.ts.map +1 -0
  105. package/typings/generated/nrfutil/device/setMcuState.d.ts +6 -0
  106. package/typings/generated/nrfutil/device/setMcuState.d.ts.map +1 -0
  107. package/typings/generated/nrfutil/device/setProtectionStatus.d.ts +5 -0
  108. package/typings/generated/nrfutil/device/setProtectionStatus.d.ts.map +1 -0
  109. package/typings/generated/nrfutil/index.d.ts +11 -0
  110. package/typings/generated/nrfutil/index.d.ts.map +1 -0
  111. package/typings/generated/nrfutil/moduleVersion.d.ts +6 -0
  112. package/typings/generated/nrfutil/moduleVersion.d.ts.map +1 -0
  113. package/typings/generated/nrfutil/nrfutilLogger.d.ts +4 -0
  114. package/typings/generated/nrfutil/nrfutilLogger.d.ts.map +1 -0
  115. package/typings/generated/nrfutil/sandbox.d.ts +36 -0
  116. package/typings/generated/nrfutil/sandbox.d.ts.map +1 -0
  117. package/typings/generated/nrfutil/sandboxTypes.d.ts +135 -0
  118. package/typings/generated/nrfutil/sandboxTypes.d.ts.map +1 -0
  119. package/typings/generated/src/About/SupportCard.d.ts.map +1 -1
  120. package/typings/generated/src/App/App.d.ts.map +1 -1
  121. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +2 -6
  122. package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -1
  123. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +2 -2
  124. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts.map +1 -1
  125. package/typings/generated/src/Device/deviceLibWrapper.d.ts +1 -4
  126. package/typings/generated/src/Device/deviceLibWrapper.d.ts.map +1 -1
  127. package/typings/generated/src/Device/deviceLister.d.ts +11 -16
  128. package/typings/generated/src/Device/deviceLister.d.ts.map +1 -1
  129. package/typings/generated/src/Device/deviceLister.test.d.ts.map +1 -1
  130. package/typings/generated/src/Device/deviceSlice.d.ts +3 -3
  131. package/typings/generated/src/Device/deviceSlice.d.ts.map +1 -1
  132. package/typings/generated/src/Device/jprogOperations.d.ts.map +1 -1
  133. package/typings/generated/src/Device/sdfuOperations.d.ts.map +1 -1
  134. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +1 -1
  135. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
  136. package/typings/generated/src/Log/LogViewer.d.ts.map +1 -1
  137. package/typings/generated/src/Log/logSlice.d.ts +2 -3
  138. package/typings/generated/src/Log/logSlice.d.ts.map +1 -1
  139. package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -1
  140. package/typings/generated/src/utils/appDirs.d.ts +4 -4
  141. package/typings/generated/src/utils/appDirs.d.ts.map +1 -1
  142. package/typings/generated/src/utils/logLibVersions.d.ts.map +1 -1
  143. package/typings/generated/src/utils/systemReport.d.ts +1 -1
  144. package/typings/generated/src/utils/systemReport.d.ts.map +1 -1
  145. package/typings/generated/src/utils/usageData.d.ts +2 -0
  146. package/typings/generated/src/utils/usageData.d.ts.map +1 -1
  147. package/src/utils/describeVersion.ts +0 -21
  148. package/typings/generated/src/utils/describeVersion.d.ts +0 -4
  149. package/typings/generated/src/utils/describeVersion.d.ts.map +0 -1
@@ -31,7 +31,7 @@ Expecting one of '${n.join("', '")}'`);let i=`${e}Help`;return this.on(i,s=>{let
31
31
  `+o+"}":"{"+u.join(",")+"}",ee=o,i;default:}}us.exports=function(t,e,r){var n;if(ee="",N0="",typeof r=="number")for(n=0;n<r;n+=1)N0+=" ";else typeof r=="string"&&(N0=r);if(Oe=e,e&&typeof e!="function"&&(typeof e!="object"||typeof e.length!="number"))throw new Error("JSON.stringify");return q0("",{"":t})}});var Fs=E(Vt=>{"use strict";Vt.parse=as();Vt.stringify=As()});var cs=E((sh,ls)=>{var el=typeof JSON<"u"?JSON:Fs();ls.exports=function(t,e){e||(e={}),typeof e=="function"&&(e={cmp:e});var r=e.cmp&&function(n){return function(i){return function(s,o){var u={key:s,value:i[s]},a={key:o,value:i[o]};return n(u,a)}}}(e.cmp);return function n(i){if(typeof i!="object"||i===null)return el.stringify(i);if(tl(i)){for(var s=[],o=0;o<i.length;o++)s.push(n(i[o]));return"["+s.join(",")+"]"}else{for(var u=rl(i).sort(r&&r(i)),s=[],o=0;o<u.length;o++){var a=u[o];s.push(n(a)+":"+n(i[a]))}return"{"+s.join(",")+"}"}}(t)};var tl=Array.isArray||function(t){return{}.toString.call(t)==="[object Array]"},rl=Object.keys||function(t){var e=Object.prototype.hasOwnProperty||function(){return!0},r=[];for(var n in t)e.call(t,n)&&r.push(n);return r}});var hs=E((oh,fs)=>{var nl=require("crypto").createHash,Es=require("buffer").Buffer,il=cs();fs.exports=function(e,r,n){return e=typeof e=="string"||Es.isBuffer(e)?e:il(e),nl(r||"sha1").update(e,Es.isBuffer(e)?null:"utf8").digest(n||"hex")}});var ps=E((ah,Cs)=>{function sl(t){return function(e){return e?.[t]}}Cs.exports=sl});var P0=E((uh,Ds)=>{var ol=Array.isArray;Ds.exports=ol});var ds=E((Ah,Bs)=>{var al=typeof global=="object"&&global&&global.Object===Object&&global;Bs.exports=al});var L0=E((Fh,gs)=>{var ul=ds(),Al=typeof self=="object"&&self&&self.Object===Object&&self,Fl=ul||Al||Function("return this")();gs.exports=Fl});var k0=E((lh,ms)=>{var ll=L0(),cl=ll.Symbol;ms.exports=cl});var bs=E((ch,ys)=>{var _s=k0(),vs=Object.prototype,El=vs.hasOwnProperty,fl=vs.toString,u0=_s?_s.toStringTag:void 0;function hl(t){var e=El.call(t,u0),r=t[u0];try{t[u0]=void 0;var n=!0}catch{}var i=fl.call(t);return n&&(e?t[u0]=r:delete t[u0]),i}ys.exports=hl});var Ss=E((Eh,ws)=>{var Cl=Object.prototype,pl=Cl.toString;function Dl(t){return pl.call(t)}ws.exports=Dl});var Gt=E((fh,Is)=>{var xs=k0(),Bl=bs(),dl=Ss(),gl="[object Null]",ml="[object Undefined]",Os=xs?xs.toStringTag:void 0;function _l(t){return t==null?t===void 0?ml:gl:Os&&Os in Object(t)?Bl(t):dl(t)}Is.exports=_l});var Ts=E((hh,Rs)=>{function vl(t){return t!=null&&typeof t=="object"}Rs.exports=vl});var j0=E((Ch,$s)=>{var yl=Gt(),bl=Ts(),wl="[object Symbol]";function Sl(t){return typeof t=="symbol"||bl(t)&&yl(t)==wl}$s.exports=Sl});var Wt=E((ph,Ns)=>{var xl=P0(),Ol=j0(),Il=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Rl=/^\w*$/;function Tl(t,e){if(xl(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||Ol(t)?!0:Rl.test(t)||!Il.test(t)||e!=null&&t in Object(e)}Ns.exports=Tl});var Jt=E((Dh,qs)=>{function $l(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}qs.exports=$l});var Ls=E((Bh,Ps)=>{var Nl=Gt(),ql=Jt(),Pl="[object AsyncFunction]",Ll="[object Function]",kl="[object GeneratorFunction]",jl="[object Proxy]";function Ml(t){if(!ql(t))return!1;var e=Nl(t);return e==Ll||e==kl||e==Pl||e==jl}Ps.exports=Ml});var js=E((dh,ks)=>{var Hl=L0(),Ul=Hl["__core-js_shared__"];ks.exports=Ul});var Us=E((gh,Hs)=>{var Kt=js(),Ms=function(){var t=/[^.]+$/.exec(Kt&&Kt.keys&&Kt.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function Vl(t){return!!Ms&&Ms in t}Hs.exports=Vl});var Gs=E((mh,Vs)=>{var Gl=Function.prototype,Wl=Gl.toString;function Jl(t){if(t!=null){try{return Wl.call(t)}catch{}try{return t+""}catch{}}return""}Vs.exports=Jl});var Js=E((_h,Ws)=>{var Kl=Ls(),Yl=Us(),Xl=Jt(),zl=Gs(),Zl=/[\\^$.*+?()[\]{}|]/g,Ql=/^\[object .+?Constructor\]$/,ec=Function.prototype,tc=Object.prototype,rc=ec.toString,nc=tc.hasOwnProperty,ic=RegExp("^"+rc.call(nc).replace(Zl,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function sc(t){if(!Xl(t)||Yl(t))return!1;var e=Kl(t)?ic:Ql;return e.test(zl(t))}Ws.exports=sc});var Ys=E((vh,Ks)=>{function oc(t,e){return t?.[e]}Ks.exports=oc});var Yt=E((yh,Xs)=>{var ac=Js(),uc=Ys();function Ac(t,e){var r=uc(t,e);return ac(r)?r:void 0}Xs.exports=Ac});var A0=E((bh,zs)=>{var Fc=Yt(),lc=Fc(Object,"create");zs.exports=lc});var eo=E((wh,Qs)=>{var Zs=A0();function cc(){this.__data__=Zs?Zs(null):{},this.size=0}Qs.exports=cc});var ro=E((Sh,to)=>{function Ec(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}to.exports=Ec});var io=E((xh,no)=>{var fc=A0(),hc="__lodash_hash_undefined__",Cc=Object.prototype,pc=Cc.hasOwnProperty;function Dc(t){var e=this.__data__;if(fc){var r=e[t];return r===hc?void 0:r}return pc.call(e,t)?e[t]:void 0}no.exports=Dc});var oo=E((Oh,so)=>{var Bc=A0(),dc=Object.prototype,gc=dc.hasOwnProperty;function mc(t){var e=this.__data__;return Bc?e[t]!==void 0:gc.call(e,t)}so.exports=mc});var uo=E((Ih,ao)=>{var _c=A0(),vc="__lodash_hash_undefined__";function yc(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=_c&&e===void 0?vc:e,this}ao.exports=yc});var Fo=E((Rh,Ao)=>{var bc=eo(),wc=ro(),Sc=io(),xc=oo(),Oc=uo();function Me(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}Me.prototype.clear=bc;Me.prototype.delete=wc;Me.prototype.get=Sc;Me.prototype.has=xc;Me.prototype.set=Oc;Ao.exports=Me});var co=E((Th,lo)=>{function Ic(){this.__data__=[],this.size=0}lo.exports=Ic});var fo=E(($h,Eo)=>{function Rc(t,e){return t===e||t!==t&&e!==e}Eo.exports=Rc});var F0=E((Nh,ho)=>{var Tc=fo();function $c(t,e){for(var r=t.length;r--;)if(Tc(t[r][0],e))return r;return-1}ho.exports=$c});var po=E((qh,Co)=>{var Nc=F0(),qc=Array.prototype,Pc=qc.splice;function Lc(t){var e=this.__data__,r=Nc(e,t);if(r<0)return!1;var n=e.length-1;return r==n?e.pop():Pc.call(e,r,1),--this.size,!0}Co.exports=Lc});var Bo=E((Ph,Do)=>{var kc=F0();function jc(t){var e=this.__data__,r=kc(e,t);return r<0?void 0:e[r][1]}Do.exports=jc});var mo=E((Lh,go)=>{var Mc=F0();function Hc(t){return Mc(this.__data__,t)>-1}go.exports=Hc});var vo=E((kh,_o)=>{var Uc=F0();function Vc(t,e){var r=this.__data__,n=Uc(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}_o.exports=Vc});var bo=E((jh,yo)=>{var Gc=co(),Wc=po(),Jc=Bo(),Kc=mo(),Yc=vo();function He(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}He.prototype.clear=Gc;He.prototype.delete=Wc;He.prototype.get=Jc;He.prototype.has=Kc;He.prototype.set=Yc;yo.exports=He});var So=E((Mh,wo)=>{var Xc=Yt(),zc=L0(),Zc=Xc(zc,"Map");wo.exports=Zc});var Io=E((Hh,Oo)=>{var xo=Fo(),Qc=bo(),e2=So();function t2(){this.size=0,this.__data__={hash:new xo,map:new(e2||Qc),string:new xo}}Oo.exports=t2});var To=E((Uh,Ro)=>{function r2(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}Ro.exports=r2});var l0=E((Vh,$o)=>{var n2=To();function i2(t,e){var r=t.__data__;return n2(e)?r[typeof e=="string"?"string":"hash"]:r.map}$o.exports=i2});var qo=E((Gh,No)=>{var s2=l0();function o2(t){var e=s2(this,t).delete(t);return this.size-=e?1:0,e}No.exports=o2});var Lo=E((Wh,Po)=>{var a2=l0();function u2(t){return a2(this,t).get(t)}Po.exports=u2});var jo=E((Jh,ko)=>{var A2=l0();function F2(t){return A2(this,t).has(t)}ko.exports=F2});var Ho=E((Kh,Mo)=>{var l2=l0();function c2(t,e){var r=l2(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this}Mo.exports=c2});var Vo=E((Yh,Uo)=>{var E2=Io(),f2=qo(),h2=Lo(),C2=jo(),p2=Ho();function Ue(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}Ue.prototype.clear=E2;Ue.prototype.delete=f2;Ue.prototype.get=h2;Ue.prototype.has=C2;Ue.prototype.set=p2;Uo.exports=Ue});var Jo=E((Xh,Wo)=>{var Go=Vo(),D2="Expected a function";function Xt(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(D2);var r=function(){var n=arguments,i=e?e.apply(this,n):n[0],s=r.cache;if(s.has(i))return s.get(i);var o=t.apply(this,n);return r.cache=s.set(i,o)||s,o};return r.cache=new(Xt.Cache||Go),r}Xt.Cache=Go;Wo.exports=Xt});var Yo=E((zh,Ko)=>{var B2=Jo(),d2=500;function g2(t){var e=B2(t,function(n){return r.size===d2&&r.clear(),n}),r=e.cache;return e}Ko.exports=g2});var zo=E((Zh,Xo)=>{var m2=Yo(),_2=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,v2=/\\(\\)?/g,y2=m2(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(_2,function(r,n,i,s){e.push(i?s.replace(v2,"$1"):n||r)}),e});Xo.exports=y2});var Qo=E((Qh,Zo)=>{function b2(t,e){for(var r=-1,n=t==null?0:t.length,i=Array(n);++r<n;)i[r]=e(t[r],r,t);return i}Zo.exports=b2});var s1=E((eC,i1)=>{var e1=k0(),w2=Qo(),S2=P0(),x2=j0(),O2=1/0,t1=e1?e1.prototype:void 0,r1=t1?t1.toString:void 0;function n1(t){if(typeof t=="string")return t;if(S2(t))return w2(t,n1)+"";if(x2(t))return r1?r1.call(t):"";var e=t+"";return e=="0"&&1/t==-O2?"-0":e}i1.exports=n1});var a1=E((tC,o1)=>{var I2=s1();function R2(t){return t==null?"":I2(t)}o1.exports=R2});var A1=E((rC,u1)=>{var T2=P0(),$2=Wt(),N2=zo(),q2=a1();function P2(t,e){return T2(t)?t:$2(t,e)?[t]:N2(q2(t))}u1.exports=P2});var zt=E((nC,F1)=>{var L2=j0(),k2=1/0;function j2(t){if(typeof t=="string"||L2(t))return t;var e=t+"";return e=="0"&&1/t==-k2?"-0":e}F1.exports=j2});var c1=E((iC,l1)=>{var M2=A1(),H2=zt();function U2(t,e){e=M2(e,t);for(var r=0,n=e.length;t!=null&&r<n;)t=t[H2(e[r++])];return r&&r==n?t:void 0}l1.exports=U2});var f1=E((sC,E1)=>{var V2=c1();function G2(t){return function(e){return V2(e,t)}}E1.exports=G2});var C1=E((oC,h1)=>{var W2=ps(),J2=f1(),K2=Wt(),Y2=zt();function X2(t){return K2(t)?W2(Y2(t)):J2(t)}h1.exports=X2});var b1=require("child_process");var Cr=Re(hr(),1),{program:rt,createCommand:kE,createArgument:jE,createOption:ME,CommanderError:HE,InvalidArgumentError:UE,InvalidOptionArgumentError:VE,Command:GE,Argument:WE,Option:JE,Help:KE}=Cr.default;var Ve=Re(require("fs")),w1=Re(sn()),S1=Re(rs()),x1=Re(hs());var D1=require("child_process"),de=require("fs"),B1=Re(C1()),d1=t=>t.map(e=>`\`${e}\``).join(", "),M0=t=>e=>{let r=(0,B1.default)(e)(t);return r==null||r===""},Be=t=>{console.error(t),process.exit(1)},Zt=t=>{console.warn(t)},g1=(t,e)=>{t.length!==0&&Be(`${e}: ${d1(t)}`)},m1=(t,e,r)=>{let n=e.filter(i=>!t.includes(i));g1(n,r)},z2=(t,e,r)=>{e.some(n=>t.includes(n))||Be(`${r}: ${d1(e)}`)},Z2=t=>{let r=["name","version","description","displayName","engines.nrfconnect"].filter(M0(t));g1(r,"package.json is missing these mandatory properties")},Q2=t=>{if(M0(t)("homepage")&&Zt("Please provide a property `homepage` in package.json."),M0(t)("nrfConnectForDesktop")&&Zt("Please provide a property `nrfConnectForDesktop.html` in package.json"),M0(t)("repository.url"))Zt("Please provide a property `repository.url` in package.json.");else if((0,de.existsSync)("./.git")){let e=(0,D1.execSync)("git remote get-url origin",{encoding:"utf-8"}).trimEnd(),r=t.repository?.url,n=o=>o?.replace(/\.git$/,""),i=o=>o?.replace(/^git@github\.com:/,"github.com/").replace(/^https:\/\//,""),s=o=>i(n(o));s(e)!==s(r)&&Be(`package.json says the repository is located at \`${r}\` but \`git remote get-url origin\` says it is at \`${e}\`.`)}},eE=t=>{m1(t.files??[],["LICENSE","dist/","Changelog.md"],"These entries are missing in the property `files` in package.json"),z2(t.files??[],["resources/*","resources/icon.*","resources/"],"One of these entries must be in the property `files` in package.json")},p1=t=>new RegExp(`^## ${t}`,"mi"),tE=(t,e)=>{if((0,de.existsSync)("./Changelog.md")||Be("The mandatory file `Changelog.md` is missing."),e){t.version==null&&Be("package.json must specify a `version`.");let r=(0,de.readFileSync)("./Changelog.md","utf8");r.match(p1(t.version))||Be(`Found no entry for the current version packageJson.version ${t.version} in \`Changelog.md\`.`),r.match(p1("unreleased"))&&Be("There must not be an entry `unreleased` in `Changelog.md`.")}},rE=t=>{try{return(0,de.readdirSync)(t)}catch{throw Be(`Unable to read directory \`${t}\`.`),new Error}},nE=()=>{m1(rE("./resources"),["icon.svg","icon.icns","icon.ico","icon.png"],"In the directory `resources` these files are missing")},_1=({checkChangelogHasCurrentEntry:t})=>{let e=JSON.parse((0,de.readFileSync)("./package.json","utf8"));Z2(e),Q2(e),eE(e),tE(e,t),nE()},iE=require.main===module;iE&&_1({checkChangelogHasCurrentEntry:!1});var v1=_1;var ue=new w1.default,sE=t=>t!=null&&typeof t=="object"&&"message"in t,c0=t=>sE(t)?t.message:String(t),oE=(t,e)=>{let r="/.pc-tools/nrfconnect-apps";return process.env.REPO_DIR?process.env.REPO_DIR:t?r:`${r}/${e}`},aE=(t,e)=>{let r="https://developer.nordicsemi.com/.pc-tools/nrfconnect-apps";return process.env.REPO_URL?process.env.REPO_URL:t?r:`${r}/${e}`},uE=()=>{rt.description("Publish to nordic repository").requiredOption("-s, --source <source>","Specify the source to publish (e.g. official).").option("-n, --no-pack","Publish existing .tgz file at the root directory without npm pack.").option("--create-source <source name>",'Do not fail if the source specifiec with --source does not yet exist but instead create a new source with this name (e.g. "Release Test").').parse();let t=rt.opts(),e=t.source==="official";return{doPack:t.pack,doCreateSource:t.createSource!=null,sourceName:t.createSource,deployOfficial:e,sourceDir:oE(e,t.source),sourceUrl:aE(e,t.source)}},AE=()=>JSON.parse(Ve.default.readFileSync("./package.json","utf-8")),FE=()=>{console.log("Packing current package"),(0,b1.execSync)("npm pack")},lE=t=>{if(!Ve.default.existsSync(t))throw new Error(`Package \`${t}\` to publish is not found`)},cE=t=>{try{return(0,x1.default)(Ve.default.readFileSync(t))}catch(e){throw new Error(`Unable to read file when verifying shasum: ${t}.
32
32
  Error: ${c0(e)}`)}},EE=t=>{let e=AE(),{name:r,version:n}=e,i=`${r}-${n}.tgz`;t.doPack?FE():lE(i);let s=cE(i);return console.log(`Package name: ${r} version: ${n}`),{name:r,version:n,filename:i,shasum:s,sourceUrl:t.sourceUrl,isOfficial:t.deployOfficial,appInfoName:`${r}.json`,releaseNotesFilename:`${r}-Changelog.md`,iconFilename:`${r}.svg`,packageJson:e}},fE=t=>new Promise((e,r)=>{console.log(`Connecting to ftp://${t.user}@${t.host}:${t.port}`),ue.once("error",n=>{ue.removeAllListeners("ready"),r(n)}),ue.once("ready",()=>{ue.removeAllListeners("error"),e()}),ue.connect(t)}),hE=t=>new Promise((e,r)=>{console.log(`Creating source directory ${t}`),ue.mkdir(t,!0,n=>{n?r(new Error("Failed to create source directory.")):e()})}),CE=t=>new Promise((e,r)=>{console.log(`Changing to directory ${t}`),ue.cwd(t,n=>{n?r(new Error(`
33
33
  Error: Failed to change to directory. Check whether it exists on the FTP server.
34
- If you want to create a new source, use the --create-source option.`)):e()})}),H0=t=>new Promise((e,r)=>{console.log(`Downloading file ${t}`);let n="";ue.get(t,(i,s)=>{if(i)return r(i);s.once("close",()=>e(n)),s.on("data",o=>{n+=o})})}),pE=async t=>{try{let e=await H0(t);return JSON.parse(e)}catch(e){return console.log(`App info file will be created from scratch due to: ${c0(e)}`),{}}},DE=(t,e)=>{let r=t["dist-tags"]?.latest;if(r!=null&&(console.log(`Latest published version ${r}`),S1.default.lte(e.version,r)&&e.isOfficial))throw new Error("Current package version cannot be published, bump it higher");return{...t,"dist-tags":{...t["dist-tags"],latest:e.version},versions:{...t.versions,[e.version]:{dist:{tarball:`${e.sourceUrl}/${e.filename}`,shasum:e.shasum}}}}},Ge=(t,e)=>new Promise((r,n)=>{console.log(`Uploading file ${e}`),ue.put(t,e,i=>i?n(i):r())}),BE=async t=>{let e=await pE(t.name);return DE(e,t)},dE=async t=>{try{await H0("source.json")}catch{return{name:t,apps:[]}}throw new Error("`--create-source` given, but a `source.json` already exists on the server.")},gE=async()=>{let t;try{t=await H0("source.json");let e=JSON.parse(t);if(e==null||typeof e!="object"||e.name==null||e.apps!==void 0&&!Array.isArray(e.apps))throw new Error("`source.json` does not have the expected content.");return e}catch(e){let r="Unable to read `source.json` on the server.\nError: ",n=c0(e),i=t==null?"":`Content: \`${t}\``;throw new Error(r+n+i)}},mE=async(t,e)=>{let r=await(e.doCreateSource?dE(e.sourceName):gE());return{name:r.name,apps:[...new Set(r.apps).add(`${t.sourceUrl}/${t.appInfoName}`)].sort()}},_E=async t=>{try{let e=await H0(t.appInfoName);return JSON.parse(e).versions}catch(e){return console.log(`No previous app versions found due to: ${c0(e)}`),{}}},y1=()=>{throw new Error("This must never happen, because the properties were already checked before")},vE=async t=>{let e=await _E(t),{name:r,displayName:n,description:i,homepage:s,version:o}=t.packageJson;return{name:r,displayName:n??y1(),description:i??y1(),homepage:s,iconUrl:`${t.sourceUrl}/${t.iconFilename}`,releaseNotesUrl:`${t.sourceUrl}/${t.releaseNotesFilename}`,latestVersion:o,versions:{...e,[o]:{tarballUrl:`${t.sourceUrl}/${t.filename}`,shasum:t.shasum}}}},yE=(t,e)=>Ge(Buffer.from(JSON.stringify(e,void 0,2)),t.name),bE=t=>Ge(Buffer.from(JSON.stringify(t,void 0,2)),"source.json"),wE=(t,e)=>Ge(Buffer.from(JSON.stringify(e,void 0,2)),t.appInfoName),SE=t=>Ge(t.filename,t.filename),xE=t=>{let e="Changelog.md";if(!Ve.default.existsSync(e)){let r=`There should be a changelog called "${e}". Please provide it!`;return Promise.reject(new Error(r))}return Ge(e,t.releaseNotesFilename)},OE=t=>{let e="resources/icon.svg";if(!Ve.default.existsSync(e)){let r=`There must be an icon called "${e}". Please provide it!`;return Promise.reject(new Error(r))}return Ge(e,t.iconFilename)},IE=async()=>{try{let t={host:process.env.REPO_HOST||"localhost",port:Number(process.env.REPO_PORT)||21,user:process.env.REPO_USER||"anonymous",password:process.env.REPO_PASS||"anonymous@"},e=uE();v1({checkChangelogHasCurrentEntry:e.deployOfficial});let r=EE(e);await fE(t),e.doCreateSource&&await hE(e.sourceDir),await CE(e.sourceDir);let n=await BE(r),i=await mE(r,e),s=await vE(r);await xE(r),await OE(r),await SE(r),await yE(r,n),await wE(r,s),await bE(i),console.log("Done")}catch(t){console.error(c0(t)),process.exitCode=1}ue.end()};IE();
34
+ If you want to create a new source, use the --create-source option.`)):e()})}),H0=t=>new Promise((e,r)=>{console.log(`Downloading file ${t}`);let n="";ue.get(t,(i,s)=>{if(i)return r(i);s.once("close",()=>e(n)),s.on("data",o=>{n+=o})})}),pE=async t=>{try{let e=await H0(t);return JSON.parse(e)}catch(e){return console.log(`App info file will be created from scratch due to: ${c0(e)}`),{}}},DE=(t,e)=>{let r=t["dist-tags"]?.latest;if(r!=null&&(console.log(`Latest published version ${r}`),S1.default.lte(e.version,r)&&e.isOfficial))throw new Error("Current package version cannot be published, bump it higher");return{...t,"dist-tags":{...t["dist-tags"],latest:e.version},versions:{...t.versions,[e.version]:{dist:{tarball:`${e.sourceUrl}/${e.filename}`,shasum:e.shasum}}}}},Ge=(t,e)=>new Promise((r,n)=>{console.log(`Uploading file ${e}`),ue.put(t,e,i=>i?n(i):r())}),BE=async t=>{let e=await pE(t.name);return DE(e,t)},dE=async t=>{try{await H0("source.json")}catch{return{name:t,apps:[]}}throw new Error("`--create-source` given, but a `source.json` already exists on the server.")},gE=async()=>{let t;try{t=await H0("source.json");let e=JSON.parse(t);if(e==null||typeof e!="object"||e.name==null||e.apps!==void 0&&!Array.isArray(e.apps))throw new Error("`source.json` does not have the expected content.");return e}catch(e){let r="Unable to read `source.json` on the server.\nError: ",n=c0(e),i=t==null?"":`Content: \`${t}\``;throw new Error(r+n+i)}},mE=async(t,e)=>{let r=await(e.doCreateSource?dE(e.sourceName):gE());return{name:r.name,apps:[...new Set(r.apps).add(`${t.sourceUrl}/${t.appInfoName}`)].sort()}},_E=async t=>{try{let e=await H0(t.appInfoName);return JSON.parse(e).versions}catch(e){return console.log(`No previous app versions found due to: ${c0(e)}`),{}}},y1=()=>{throw new Error("This must never happen, because the properties were already checked before")},vE=async t=>{let e=await _E(t),{name:r,displayName:n,description:i,homepage:s,version:o,nrfConnectForDesktop:u}=t.packageJson,a=u?.nrfutil;return{name:r,displayName:n??y1(),description:i??y1(),homepage:s,iconUrl:`${t.sourceUrl}/${t.iconFilename}`,releaseNotesUrl:`${t.sourceUrl}/${t.releaseNotesFilename}`,latestVersion:o,versions:{...e,[o]:{tarballUrl:`${t.sourceUrl}/${t.filename}`,shasum:t.shasum,nrfutilModules:a}}}},yE=(t,e)=>Ge(Buffer.from(JSON.stringify(e,void 0,2)),t.name),bE=t=>Ge(Buffer.from(JSON.stringify(t,void 0,2)),"source.json"),wE=(t,e)=>Ge(Buffer.from(JSON.stringify(e,void 0,2)),t.appInfoName),SE=t=>Ge(t.filename,t.filename),xE=t=>{let e="Changelog.md";if(!Ve.default.existsSync(e)){let r=`There should be a changelog called "${e}". Please provide it!`;return Promise.reject(new Error(r))}return Ge(e,t.releaseNotesFilename)},OE=t=>{let e="resources/icon.svg";if(!Ve.default.existsSync(e)){let r=`There must be an icon called "${e}". Please provide it!`;return Promise.reject(new Error(r))}return Ge(e,t.iconFilename)},IE=async()=>{try{let t={host:process.env.REPO_HOST||"localhost",port:Number(process.env.REPO_PORT)||21,user:process.env.REPO_USER||"anonymous",password:process.env.REPO_PASS||"anonymous@"},e=uE();v1({checkChangelogHasCurrentEntry:e.deployOfficial});let r=EE(e);await fE(t),e.doCreateSource&&await hE(e.sourceDir),await CE(e.sourceDir);let n=await BE(r),i=await mE(r,e),s=await vE(r);await xE(r),await OE(r),await SE(r),await yE(r,n),await wE(r,s),await bE(i),console.log("Done")}catch(t){console.error(c0(t)),process.exitCode=1}ue.end()};IE();
35
35
  /*! Bundled license information:
36
36
 
37
37
  xregexp/xregexp-all.js:
@@ -378,8 +378,16 @@ const failBecauseOfMissingProperty = () => {
378
378
  const getUpdatedAppInfo = async (app: App): Promise<AppInfo> => {
379
379
  const versions = await downloadExistingVersions(app);
380
380
 
381
- const { name, displayName, description, homepage, version } =
382
- app.packageJson;
381
+ const {
382
+ name,
383
+ displayName,
384
+ description,
385
+ homepage,
386
+ version,
387
+ nrfConnectForDesktop,
388
+ } = app.packageJson;
389
+
390
+ const nrfutilModules = nrfConnectForDesktop?.nrfutil;
383
391
 
384
392
  return {
385
393
  name,
@@ -394,6 +402,7 @@ const getUpdatedAppInfo = async (app: App): Promise<AppInfo> => {
394
402
  [version]: {
395
403
  tarballUrl: `${app.sourceUrl}/${app.filename}`,
396
404
  shasum: app.shasum,
405
+ nrfutilModules,
397
406
  },
398
407
  },
399
408
  };
@@ -8,18 +8,15 @@ import React from 'react';
8
8
  import { useDispatch, useSelector } from 'react-redux';
9
9
  import { getCurrentWindow } from '@electron/remote';
10
10
 
11
+ import NrfutilDeviceLib from '../../nrfutil/device/device';
11
12
  import Button from '../Button/Button';
12
13
  import Card from '../Card/Card';
13
- import { setVerboseDeviceLibLogging } from '../Device/deviceLibWrapper';
14
14
  import {
15
15
  deviceInfo,
16
16
  getDevices,
17
17
  selectedSerialNumber,
18
18
  } from '../Device/deviceSlice';
19
- import {
20
- isLoggingVerboseSelector,
21
- toggleIsLoggingVerbose,
22
- } from '../Log/logSlice';
19
+ import { isLoggingVerbose, setIsLoggingVerbose } from '../Log/logSlice';
23
20
  import { Toggle } from '../Toggle/Toggle';
24
21
  import { persistIsLoggingVerbose } from '../utils/persistentStore';
25
22
  import systemReport from '../utils/systemReport';
@@ -30,7 +27,7 @@ export default () => {
30
27
  const dispatch = useDispatch();
31
28
  const devices = useSelector(getDevices);
32
29
  const currentSerialNumber = useSelector(selectedSerialNumber);
33
- const verboseLogging = useSelector(isLoggingVerboseSelector);
30
+ const verboseLogging = useSelector(isLoggingVerbose);
34
31
  const currentDevice = useSelector(deviceInfo);
35
32
 
36
33
  return (
@@ -74,9 +71,9 @@ export default () => {
74
71
  <Toggle
75
72
  id="enableVerboseLoggin"
76
73
  label="VERBOSE LOGGING"
77
- onToggle={() => {
78
- setVerboseDeviceLibLogging(!verboseLogging);
79
- dispatch(toggleIsLoggingVerbose());
74
+ onToggle={isToggled => {
75
+ NrfutilDeviceLib.setVerboseLogging(isToggled);
76
+ dispatch(setIsLoggingVerbose(isToggled));
80
77
  }}
81
78
  isToggled={verboseLogging}
82
79
  variant="primary"
@@ -15,6 +15,10 @@ jest.mock('../Log/LogViewer', () => ({
15
15
  default: () => null,
16
16
  }));
17
17
 
18
+ jest.mock('../logging/index.ts', () => ({
19
+ initialise: () => {},
20
+ }));
21
+
18
22
  const renderApp = (panes: Pane[]) => {
19
23
  const dummyReducer = (s = null) => s;
20
24
  const dummyNode = <div />;
package/src/App/App.tsx CHANGED
@@ -6,13 +6,14 @@
6
6
 
7
7
  import 'focus-visible';
8
8
 
9
- import React, { FC, ReactNode, useEffect, useMemo } from 'react';
9
+ import React, { FC, ReactNode, useEffect, useMemo, useRef } from 'react';
10
10
  import Carousel from 'react-bootstrap/Carousel';
11
11
  import ReactDOM from 'react-dom';
12
12
  import { useDispatch, useSelector } from 'react-redux';
13
13
  import { Reducer } from 'redux';
14
14
 
15
15
  import { inMain as openWindow } from '../../ipc/openWindow';
16
+ import { setNrfutilLogger } from '../../nrfutil/nrfutilLogger';
16
17
  import About from '../About/About';
17
18
  import BrokenDeviceDialog from '../Device/BrokenDeviceDialog/BrokenDeviceDialog';
18
19
  import { setAutoReselect } from '../Device/deviceAutoSelectSlice';
@@ -25,12 +26,13 @@ import ErrorBoundary from '../ErrorBoundary/ErrorBoundary';
25
26
  import ErrorDialog from '../ErrorDialog/ErrorDialog';
26
27
  import FlashMessages from '../FlashMessage/FlashMessage';
27
28
  import LogViewer from '../Log/LogViewer';
29
+ import logger from '../logging';
28
30
  import NavBar from '../NavBar/NavBar';
29
31
  import FeedbackPane, { FeedbackPaneProps } from '../Panes/FeedbackPane';
30
32
  import classNames from '../utils/classNames';
31
33
  import packageJson from '../utils/packageJson';
32
34
  import { getPersistedCurrentPane } from '../utils/persistentStore';
33
- import { init as usageDataInit } from '../utils/usageData';
35
+ import { init as usageDataInit, setUsageLogger } from '../utils/usageData';
34
36
  import useHotKey from '../utils/useHotKey';
35
37
  import {
36
38
  currentPane as currentPaneSelector,
@@ -93,6 +95,15 @@ const ConnectedApp: FC<ConnectedAppProps> = ({
93
95
  children,
94
96
  autoReselectByDefault = false,
95
97
  }) => {
98
+ const initialisedLogger = useRef(false);
99
+
100
+ if (!initialisedLogger.current) {
101
+ logger.initialise();
102
+ setNrfutilLogger(logger);
103
+ setUsageLogger(logger);
104
+ initialisedLogger.current = true;
105
+ }
106
+
96
107
  usePersistedPane();
97
108
  const isLogVisible = useSelector(isLogVisibleSelector);
98
109
  const currentPane = useSelector(currentPaneSelector);
@@ -5,8 +5,8 @@
5
5
  */
6
6
 
7
7
  import React, { ReactNode } from 'react';
8
- import { SerialPort } from '@nordicsemiconductor/nrf-device-lib-js';
9
8
 
9
+ import { SerialPort } from '../../../../nrfutil/device/common';
10
10
  import { displayedDeviceName } from '../../deviceInfo/deviceInfo';
11
11
  import { Device } from '../../deviceSlice';
12
12
 
@@ -13,10 +13,12 @@ import {
13
13
  } from '@testing-library/react';
14
14
 
15
15
  import render from '../../../test/testrenderer';
16
- import { Device, setDevices } from '../deviceSlice';
16
+ import { addDevice, Device, removeDevice } from '../deviceSlice';
17
17
  import { jprogDeviceSetup } from '../jprogOperations';
18
18
  import DeviceSelector from './DeviceSelector';
19
19
 
20
+ jest.mock('../../../nrfutil/device/device');
21
+
20
22
  const testDevice: Device = {
21
23
  id: 1,
22
24
  hwInfo: {
@@ -92,17 +94,23 @@ const testDevice: Device = {
92
94
  },
93
95
  };
94
96
 
97
+ const deviceSetupMock: ReturnType<typeof jprogDeviceSetup> = {
98
+ supportsProgrammingMode: jest.fn(() => true),
99
+ getFirmwareOptions: jest.fn(() => [
100
+ { key: 'PCATest', programDevice: jest.fn() },
101
+ ]),
102
+ isExpectedFirmware: jest.fn(
103
+ (device: Device) => () =>
104
+ Promise.resolve({
105
+ device,
106
+ validFirmware: false,
107
+ })
108
+ ),
109
+ tryToSwitchToApplicationMode: jest.fn(() => () => Promise.resolve(null)),
110
+ };
111
+
95
112
  const validFirmware = {
96
- deviceSetups: [
97
- jprogDeviceSetup([
98
- {
99
- key: 'PCATest',
100
- fw: 'firmware/invalidDevice.hex',
101
- fwVersion: 'fw-1.0.0',
102
- fwIdAddress: 0x6000,
103
- },
104
- ]),
105
- ],
113
+ deviceSetups: [deviceSetupMock],
106
114
  allowCustomDevice: false,
107
115
  };
108
116
 
@@ -112,7 +120,7 @@ describe('DeviceSelector', () => {
112
120
  <DeviceSelector
113
121
  deviceListing={{
114
122
  nordicUsb: true,
115
- serialPort: true,
123
+ serialPorts: true,
116
124
  jlink: true,
117
125
  mcuBoot: true,
118
126
  }}
@@ -126,7 +134,7 @@ describe('DeviceSelector', () => {
126
134
  <DeviceSelector
127
135
  deviceListing={{
128
136
  nordicUsb: true,
129
- serialPort: true,
137
+ serialPorts: true,
130
138
  jlink: true,
131
139
  mcuBoot: true,
132
140
  }}
@@ -141,12 +149,12 @@ describe('DeviceSelector', () => {
141
149
  <DeviceSelector
142
150
  deviceListing={{
143
151
  nordicUsb: true,
144
- serialPort: true,
152
+ serialPorts: true,
145
153
  jlink: true,
146
154
  mcuBoot: true,
147
155
  }}
148
156
  />,
149
- [setDevices([testDevice])]
157
+ [addDevice(testDevice)]
150
158
  );
151
159
  expect(screen.getByText(testDevice.serialNumber)).toBeInTheDocument();
152
160
  });
@@ -156,12 +164,12 @@ describe('DeviceSelector', () => {
156
164
  <DeviceSelector
157
165
  deviceListing={{
158
166
  nordicUsb: true,
159
- serialPort: true,
167
+ serialPorts: true,
160
168
  jlink: true,
161
169
  mcuBoot: true,
162
170
  }}
163
171
  />,
164
- [setDevices([testDevice]), setDevices([])]
172
+ [addDevice(testDevice), removeDevice(testDevice)]
165
173
  );
166
174
  expect(screen.queryByText(testDevice.serialNumber)).toBeNull();
167
175
  });
@@ -171,12 +179,12 @@ describe('DeviceSelector', () => {
171
179
  <DeviceSelector
172
180
  deviceListing={{
173
181
  nordicUsb: true,
174
- serialPort: true,
182
+ serialPorts: true,
175
183
  jlink: true,
176
184
  mcuBoot: true,
177
185
  }}
178
186
  />,
179
- [setDevices([testDevice])]
187
+ [addDevice(testDevice)]
180
188
  );
181
189
  fireEvent.click(screen.getByText('Select device'));
182
190
  fireEvent.click(screen.getByTestId('show-more-device-info'));
@@ -188,12 +196,12 @@ describe('DeviceSelector', () => {
188
196
  <DeviceSelector
189
197
  deviceListing={{
190
198
  nordicUsb: true,
191
- serialPort: true,
199
+ serialPorts: true,
192
200
  jlink: true,
193
201
  mcuBoot: true,
194
202
  }}
195
203
  />,
196
- [setDevices([testDevice])]
204
+ [addDevice(testDevice)]
197
205
  );
198
206
 
199
207
  fireEvent.click(screen.getByText('Select device'));
@@ -206,12 +214,12 @@ describe('DeviceSelector', () => {
206
214
  <DeviceSelector
207
215
  deviceListing={{
208
216
  nordicUsb: true,
209
- serialPort: true,
217
+ serialPorts: true,
210
218
  jlink: true,
211
219
  mcuBoot: true,
212
220
  }}
213
221
  />,
214
- [setDevices([testDevice])]
222
+ [addDevice(testDevice)]
215
223
  );
216
224
  fireEvent.click(screen.getByText('Select device'));
217
225
  fireEvent.click(screen.getByText(testDevice.serialNumber));
@@ -226,7 +234,7 @@ describe('DeviceSelector', () => {
226
234
  <DeviceSelector
227
235
  deviceListing={{
228
236
  nordicUsb: true,
229
- serialPort: true,
237
+ serialPorts: true,
230
238
  jlink: true,
231
239
  mcuBoot: true,
232
240
  }}
@@ -244,7 +252,7 @@ describe('DeviceSelector', () => {
244
252
  allowCustomDevice: true,
245
253
  }}
246
254
  />,
247
- [setDevices([testDevice])]
255
+ [addDevice(testDevice)]
248
256
  );
249
257
  fireEvent.click(screen.getByText('Select device'));
250
258
  fireEvent.click(screen.getByText(testDevice.serialNumber));
@@ -258,7 +266,7 @@ describe('DeviceSelector', () => {
258
266
  <DeviceSelector
259
267
  deviceListing={{
260
268
  nordicUsb: true,
261
- serialPort: true,
269
+ serialPorts: true,
262
270
  jlink: true,
263
271
  mcuBoot: true,
264
272
  }}
@@ -276,7 +284,7 @@ describe('DeviceSelector', () => {
276
284
  allowCustomDevice: false,
277
285
  }}
278
286
  />,
279
- [setDevices([testDevice])]
287
+ [addDevice(testDevice)]
280
288
  );
281
289
 
282
290
  fireEvent.click(screen.getByText('Select device'));
@@ -296,13 +304,13 @@ describe('DeviceSelector', () => {
296
304
  <DeviceSelector
297
305
  deviceListing={{
298
306
  nordicUsb: true,
299
- serialPort: true,
307
+ serialPorts: true,
300
308
  jlink: true,
301
309
  mcuBoot: true,
302
310
  }}
303
311
  deviceSetupConfig={validFirmware}
304
312
  />,
305
- [setDevices([testDevice])]
313
+ [addDevice(testDevice)]
306
314
  );
307
315
 
308
316
  fireEvent.click(screen.getByText('Select device'));
@@ -318,13 +326,13 @@ describe('DeviceSelector', () => {
318
326
  <DeviceSelector
319
327
  deviceListing={{
320
328
  nordicUsb: true,
321
- serialPort: true,
329
+ serialPorts: true,
322
330
  jlink: true,
323
331
  mcuBoot: true,
324
332
  }}
325
333
  deviceSetupConfig={validFirmware}
326
334
  />,
327
- [setDevices([testDevice])]
335
+ [addDevice(testDevice)]
328
336
  );
329
337
 
330
338
  fireEvent.click(screen.getByText('Select device'));
@@ -6,8 +6,8 @@
6
6
 
7
7
  import React, { useCallback, useEffect, useState } from 'react';
8
8
  import { useDispatch, useSelector } from 'react-redux';
9
- import { DeviceTraits } from '@nordicsemiconductor/nrf-device-lib-js';
10
9
 
10
+ import { DeviceTraits } from '../../../nrfutil/device/common';
11
11
  import useHotKey from '../../utils/useHotKey';
12
12
  import {
13
13
  getWaitingToAutoReselect,
@@ -31,13 +31,8 @@ import DeviceList from './DeviceList/DeviceList';
31
31
  import SelectDevice from './SelectDevice';
32
32
  import SelectedDevice from './SelectedDevice';
33
33
 
34
- interface OutdatedDeviceTraits {
35
- serialPort?: boolean;
36
- serialport?: boolean;
37
- }
38
-
39
34
  export interface Props {
40
- deviceListing: DeviceTraits & OutdatedDeviceTraits;
35
+ deviceListing: DeviceTraits;
41
36
  deviceSetupConfig?: DeviceSetupConfig;
42
37
  onDeviceSelected?: (device: Device, autoReselected: boolean) => void;
43
38
  onDeviceDeselected?: () => void;
@@ -104,13 +99,9 @@ export default ({
104
99
  );
105
100
 
106
101
  const doStartWatchingDevices = useCallback(() => {
107
- const patchedDeviceListing = {
108
- serialPorts: deviceListing.serialPort || deviceListing.serialport,
109
- ...deviceListing,
110
- };
111
102
  dispatch(
112
103
  startWatchingDevices(
113
- patchedDeviceListing,
104
+ deviceListing,
114
105
  onDeviceConnected,
115
106
  onDeviceDisconnected,
116
107
  onDeviceDeselected,
@@ -28,8 +28,7 @@
28
28
  through CSS, e.g. to change the colours.
29
29
  */
30
30
 
31
- import type { Device as NrfdlDevice } from '@nordicsemiconductor/nrf-device-lib-js';
32
-
31
+ import { NrfutilDevice } from '../../../nrfutil';
33
32
  import type { Device as WrappedDevice } from '../deviceSlice';
34
33
 
35
34
  import nrf51logo from '!!@svgr!./nRF51-Series-logo.svg';
@@ -41,7 +40,7 @@ import ppkLogo from '!!@svgr!./ppk-logo.svg';
41
40
  import unknownLogo from '!!@svgr!./unknown-logo.svg';
42
41
  import unknownNordicLogo from '!!@svgr!./unknown-nordic-logo.svg';
43
42
 
44
- type Device = NrfdlDevice | WrappedDevice;
43
+ type Device = NrfutilDevice | WrappedDevice;
45
44
 
46
45
  type DevicePCA =
47
46
  | 'PCA10028'
@@ -7,24 +7,11 @@
7
7
  import { app } from '@electron/remote';
8
8
  import {
9
9
  createContext,
10
- Error,
11
- LogEvent,
12
10
  ModuleVersion,
13
- setLogLevel,
14
- setLogPattern,
15
11
  setTimeoutConfig,
16
- startLogEvents,
17
- stopLogEvents,
18
12
  } from '@nordicsemiconductor/nrf-device-lib-js';
19
13
  import path from 'path';
20
14
 
21
- import { isLoggingVerbose } from '../Log/logSlice';
22
- import logger from '../logging';
23
- import {
24
- getIsLoggingVerbose,
25
- persistIsLoggingVerbose,
26
- } from '../utils/persistentStore';
27
-
28
15
  let deviceLibContext = 0n;
29
16
  export const getDeviceLibContext = () => {
30
17
  if (deviceLibContext === 0n) initDeviceLib();
@@ -55,59 +42,6 @@ const initDeviceLib = () => {
55
42
  });
56
43
  };
57
44
 
58
- export const logNrfdlLogs = (evt: LogEvent) => {
59
- if (process.env.NODE_ENV === 'production' && !isLoggingVerbose()) return;
60
- switch (evt.level) {
61
- case 'NRFDL_LOG_TRACE':
62
- logger.verbose(evt.message);
63
- break;
64
- case 'NRFDL_LOG_DEBUG':
65
- logger.debug(evt.message);
66
- break;
67
- case 'NRFDL_LOG_INFO':
68
- logger.info(evt.message);
69
- break;
70
- case 'NRFDL_LOG_WARNING':
71
- logger.warn(evt.message);
72
- break;
73
- case 'NRFDL_LOG_ERROR':
74
- logger.error(evt.message);
75
- break;
76
- case 'NRFDL_LOG_CRITICAL':
77
- logger.error(evt.message);
78
- break;
79
- }
80
- };
81
-
82
- export const forwardLogEventsFromDeviceLib = () => {
83
- setLogPattern(getDeviceLibContext(), '[%n][%l](%T.%e) %v');
84
- setVerboseDeviceLibLogging(getIsLoggingVerbose());
85
-
86
- // Only the first reset after selecting "reset with verbose logging" is relevant
87
- persistIsLoggingVerbose(false);
88
-
89
- const taskId = startLogEvents(
90
- getDeviceLibContext(),
91
- (err?: Error) => {
92
- if (err)
93
- logger.logError(
94
- 'Error while listening to log messages from nrf-device-lib',
95
- err
96
- );
97
- },
98
- (evt: LogEvent) => logNrfdlLogs(evt)
99
- );
100
- return () => {
101
- stopLogEvents(taskId);
102
- };
103
- };
104
-
105
- export const setVerboseDeviceLibLogging = (verboseLogging: boolean) =>
106
- setLogLevel(
107
- getDeviceLibContext(),
108
- verboseLogging ? 'NRFDL_LOG_TRACE' : 'NRFDL_LOG_ERROR'
109
- );
110
-
111
45
  type KnownModule = 'nrfdl' | 'nrfdl-js' | 'jprog' | 'JlinkARM';
112
46
 
113
47
  const findTopLevel = (module: KnownModule, versions: ModuleVersion[]) =>
@@ -4,8 +4,7 @@
4
4
  * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
5
  */
6
6
 
7
- import { DeviceTraits } from '@nordicsemiconductor/nrf-device-lib-js';
8
-
7
+ import { DeviceTraits } from '../../nrfutil/device/common';
9
8
  import { hasValidDeviceTraits } from './deviceLister';
10
9
 
11
10
  const allFalseDeviceTraits: DeviceTraits = {