@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.
- package/Changelog.md +34 -0
- package/config/tsconfig.json +1 -1
- package/coverage/cobertura-coverage.xml +2216 -1061
- package/ipc/MetaFiles.ts +17 -7
- package/nrfutil/device/__mocks__/device.ts +43 -0
- package/nrfutil/device/batch.ts +219 -0
- package/nrfutil/device/batchTypes.ts +133 -0
- package/nrfutil/device/common.ts +274 -0
- package/nrfutil/device/device.ts +62 -0
- package/nrfutil/device/erase.ts +26 -0
- package/nrfutil/device/eraseBatch.ts +28 -0
- package/nrfutil/device/firmwareRead.ts +34 -0
- package/nrfutil/device/firmwareReadBatch.ts +42 -0
- package/nrfutil/device/getCoreInfo.ts +44 -0
- package/nrfutil/device/getCoreInfoBatch.ts +29 -0
- package/nrfutil/device/getFwInfo.ts +69 -0
- package/nrfutil/device/getFwInfoBatch.ts +29 -0
- package/nrfutil/device/getProtectionStatus.ts +46 -0
- package/nrfutil/device/getProtectionStatusBatch.ts +32 -0
- package/nrfutil/device/list.ts +81 -0
- package/nrfutil/device/program.ts +186 -0
- package/nrfutil/device/programBatch.ts +69 -0
- package/nrfutil/device/recover.ts +26 -0
- package/nrfutil/device/recoverBatch.ts +28 -0
- package/nrfutil/device/reset.ts +41 -0
- package/nrfutil/device/resetBatch.ts +30 -0
- package/nrfutil/device/setMcuState.ts +27 -0
- package/nrfutil/device/setProtectionStatus.ts +27 -0
- package/nrfutil/index.ts +25 -0
- package/nrfutil/moduleVersion.ts +57 -0
- package/nrfutil/nrfutilLogger.ts +15 -0
- package/nrfutil/sandbox.ts +504 -0
- package/nrfutil/sandboxTypes.ts +178 -0
- package/package.json +2 -2
- package/scripts/nordic-publish.js +1 -1
- package/scripts/nordic-publish.ts +11 -2
- package/src/About/SupportCard.tsx +6 -9
- package/src/App/App.test.tsx +4 -0
- package/src/App/App.tsx +13 -2
- package/src/Device/DeviceSelector/DeviceList/MoreDeviceInfo.tsx +1 -1
- package/src/Device/DeviceSelector/DeviceSelector.test.tsx +39 -31
- package/src/Device/DeviceSelector/DeviceSelector.tsx +3 -12
- package/src/Device/deviceInfo/deviceInfo.ts +2 -3
- package/src/Device/deviceLibWrapper.ts +0 -66
- package/src/Device/deviceLister.test.ts +1 -2
- package/src/Device/deviceLister.ts +169 -215
- package/src/Device/deviceSlice.ts +2 -16
- package/src/Device/jprogOperations.ts +21 -69
- package/src/Device/sdfuOperations.ts +77 -93
- package/src/ErrorBoundary/ErrorBoundary.tsx +1 -1
- package/src/Log/LogViewer.tsx +0 -4
- package/src/Log/logSlice.ts +4 -7
- package/src/logging/sendInitialLogMessages.ts +7 -8
- package/src/utils/appDirs.ts +6 -11
- package/src/utils/logLibVersions.ts +12 -14
- package/src/utils/systemReport.ts +11 -17
- package/src/utils/usageData.ts +14 -9
- package/tsconfig.json +1 -0
- package/typings/generated/ipc/MetaFiles.d.ts +14 -7
- package/typings/generated/ipc/MetaFiles.d.ts.map +1 -1
- package/typings/generated/nrfutil/device/__mocks__/device.d.ts +23 -0
- package/typings/generated/nrfutil/device/__mocks__/device.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/batch.d.ts +26 -0
- package/typings/generated/nrfutil/device/batch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/batchTypes.d.ts +78 -0
- package/typings/generated/nrfutil/device/batchTypes.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/common.d.ts +125 -0
- package/typings/generated/nrfutil/device/common.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/device.d.ts +30 -0
- package/typings/generated/nrfutil/device/device.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/erase.d.ts +5 -0
- package/typings/generated/nrfutil/device/erase.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/eraseBatch.d.ts +7 -0
- package/typings/generated/nrfutil/device/eraseBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/firmwareRead.d.ts +10 -0
- package/typings/generated/nrfutil/device/firmwareRead.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/firmwareReadBatch.d.ts +9 -0
- package/typings/generated/nrfutil/device/firmwareReadBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getCoreInfo.d.ts +22 -0
- package/typings/generated/nrfutil/device/getCoreInfo.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getCoreInfoBatch.d.ts +8 -0
- package/typings/generated/nrfutil/device/getCoreInfoBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getFwInfo.d.ts +31 -0
- package/typings/generated/nrfutil/device/getFwInfo.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getFwInfoBatch.d.ts +8 -0
- package/typings/generated/nrfutil/device/getFwInfoBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getProtectionStatus.d.ts +13 -0
- package/typings/generated/nrfutil/device/getProtectionStatus.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/getProtectionStatusBatch.d.ts +8 -0
- package/typings/generated/nrfutil/device/getProtectionStatusBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/list.d.ts +19 -0
- package/typings/generated/nrfutil/device/list.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/program.d.ts +27 -0
- package/typings/generated/nrfutil/device/program.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/programBatch.d.ts +9 -0
- package/typings/generated/nrfutil/device/programBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/recover.d.ts +5 -0
- package/typings/generated/nrfutil/device/recover.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/recoverBatch.d.ts +7 -0
- package/typings/generated/nrfutil/device/recoverBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/reset.d.ts +5 -0
- package/typings/generated/nrfutil/device/reset.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/resetBatch.d.ts +8 -0
- package/typings/generated/nrfutil/device/resetBatch.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/setMcuState.d.ts +6 -0
- package/typings/generated/nrfutil/device/setMcuState.d.ts.map +1 -0
- package/typings/generated/nrfutil/device/setProtectionStatus.d.ts +5 -0
- package/typings/generated/nrfutil/device/setProtectionStatus.d.ts.map +1 -0
- package/typings/generated/nrfutil/index.d.ts +11 -0
- package/typings/generated/nrfutil/index.d.ts.map +1 -0
- package/typings/generated/nrfutil/moduleVersion.d.ts +6 -0
- package/typings/generated/nrfutil/moduleVersion.d.ts.map +1 -0
- package/typings/generated/nrfutil/nrfutilLogger.d.ts +4 -0
- package/typings/generated/nrfutil/nrfutilLogger.d.ts.map +1 -0
- package/typings/generated/nrfutil/sandbox.d.ts +36 -0
- package/typings/generated/nrfutil/sandbox.d.ts.map +1 -0
- package/typings/generated/nrfutil/sandboxTypes.d.ts +135 -0
- package/typings/generated/nrfutil/sandboxTypes.d.ts.map +1 -0
- package/typings/generated/src/About/SupportCard.d.ts.map +1 -1
- package/typings/generated/src/App/App.d.ts.map +1 -1
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts +2 -6
- package/typings/generated/src/Device/DeviceSelector/DeviceSelector.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +2 -2
- package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceLibWrapper.d.ts +1 -4
- package/typings/generated/src/Device/deviceLibWrapper.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceLister.d.ts +11 -16
- package/typings/generated/src/Device/deviceLister.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceLister.test.d.ts.map +1 -1
- package/typings/generated/src/Device/deviceSlice.d.ts +3 -3
- package/typings/generated/src/Device/deviceSlice.d.ts.map +1 -1
- package/typings/generated/src/Device/jprogOperations.d.ts.map +1 -1
- package/typings/generated/src/Device/sdfuOperations.d.ts.map +1 -1
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +1 -1
- package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
- package/typings/generated/src/Log/LogViewer.d.ts.map +1 -1
- package/typings/generated/src/Log/logSlice.d.ts +2 -3
- package/typings/generated/src/Log/logSlice.d.ts.map +1 -1
- package/typings/generated/src/logging/sendInitialLogMessages.d.ts.map +1 -1
- package/typings/generated/src/utils/appDirs.d.ts +4 -4
- package/typings/generated/src/utils/appDirs.d.ts.map +1 -1
- package/typings/generated/src/utils/logLibVersions.d.ts.map +1 -1
- package/typings/generated/src/utils/systemReport.d.ts +1 -1
- package/typings/generated/src/utils/systemReport.d.ts.map +1 -1
- package/typings/generated/src/utils/usageData.d.ts +2 -0
- package/typings/generated/src/utils/usageData.d.ts.map +1 -1
- package/src/utils/describeVersion.ts +0 -21
- package/typings/generated/src/utils/describeVersion.d.ts +0 -4
- 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 {
|
|
382
|
-
|
|
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(
|
|
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
|
-
|
|
79
|
-
dispatch(
|
|
74
|
+
onToggle={isToggled => {
|
|
75
|
+
NrfutilDeviceLib.setVerboseLogging(isToggled);
|
|
76
|
+
dispatch(setIsLoggingVerbose(isToggled));
|
|
80
77
|
}}
|
|
81
78
|
isToggled={verboseLogging}
|
|
82
79
|
variant="primary"
|
package/src/App/App.test.tsx
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
152
|
+
serialPorts: true,
|
|
145
153
|
jlink: true,
|
|
146
154
|
mcuBoot: true,
|
|
147
155
|
}}
|
|
148
156
|
/>,
|
|
149
|
-
[
|
|
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
|
-
|
|
167
|
+
serialPorts: true,
|
|
160
168
|
jlink: true,
|
|
161
169
|
mcuBoot: true,
|
|
162
170
|
}}
|
|
163
171
|
/>,
|
|
164
|
-
[
|
|
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
|
-
|
|
182
|
+
serialPorts: true,
|
|
175
183
|
jlink: true,
|
|
176
184
|
mcuBoot: true,
|
|
177
185
|
}}
|
|
178
186
|
/>,
|
|
179
|
-
[
|
|
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
|
-
|
|
199
|
+
serialPorts: true,
|
|
192
200
|
jlink: true,
|
|
193
201
|
mcuBoot: true,
|
|
194
202
|
}}
|
|
195
203
|
/>,
|
|
196
|
-
[
|
|
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
|
-
|
|
217
|
+
serialPorts: true,
|
|
210
218
|
jlink: true,
|
|
211
219
|
mcuBoot: true,
|
|
212
220
|
}}
|
|
213
221
|
/>,
|
|
214
|
-
[
|
|
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
|
-
|
|
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
|
-
[
|
|
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
|
-
|
|
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
|
-
[
|
|
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
|
-
|
|
307
|
+
serialPorts: true,
|
|
300
308
|
jlink: true,
|
|
301
309
|
mcuBoot: true,
|
|
302
310
|
}}
|
|
303
311
|
deviceSetupConfig={validFirmware}
|
|
304
312
|
/>,
|
|
305
|
-
[
|
|
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
|
-
|
|
329
|
+
serialPorts: true,
|
|
322
330
|
jlink: true,
|
|
323
331
|
mcuBoot: true,
|
|
324
332
|
}}
|
|
325
333
|
deviceSetupConfig={validFirmware}
|
|
326
334
|
/>,
|
|
327
|
-
[
|
|
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
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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 '
|
|
8
|
-
|
|
7
|
+
import { DeviceTraits } from '../../nrfutil/device/common';
|
|
9
8
|
import { hasValidDeviceTraits } from './deviceLister';
|
|
10
9
|
|
|
11
10
|
const allFalseDeviceTraits: DeviceTraits = {
|