@nordicsemiconductor/pc-nrfconnect-shared 81.0.0 → 84.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 (48) hide show
  1. package/Changelog.md +49 -2
  2. package/config/jest.config.js +3 -4
  3. package/ipc/MetaFiles.ts +1 -0
  4. package/package.json +12 -11
  5. package/scripts/check-app-properties.ts +1 -0
  6. package/scripts/esbuild-renderer.js +1 -2
  7. package/scripts/esbuild.js +13 -16
  8. package/scripts/nordic-publish.js +1 -1
  9. package/scripts/postinstall.ts +37 -0
  10. package/src/App/App.tsx +9 -0
  11. package/src/Button/Button.tsx +1 -1
  12. package/src/Device/deviceInfo/deviceInfo.ts +12 -3
  13. package/src/Dialog/Dialog.tsx +2 -2
  14. package/src/Dialog/dialog.scss +0 -5
  15. package/src/ErrorBoundary/ErrorBoundary.tsx +3 -3
  16. package/src/ErrorBoundary/error-boundary.scss +0 -5
  17. package/src/Spinner/Spinner.tsx +22 -0
  18. package/src/index.html +22 -0
  19. package/src/index.ts +3 -2
  20. package/src/utils/appDirs.ts +6 -32
  21. package/src/utils/packageJson.ts +2 -18
  22. package/src/utils/systemReport.ts +1 -2
  23. package/tsconfig.json +9 -0
  24. package/typings/generated/ipc/MetaFiles.d.ts +1 -0
  25. package/typings/generated/ipc/MetaFiles.d.ts.map +1 -1
  26. package/typings/generated/src/App/App.d.ts +2 -1
  27. package/typings/generated/src/App/App.d.ts.map +1 -1
  28. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts +3 -1
  29. package/typings/generated/src/Device/deviceInfo/deviceInfo.d.ts.map +1 -1
  30. package/typings/generated/src/Dialog/Dialog.d.ts.map +1 -1
  31. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts +1 -1
  32. package/typings/generated/src/ErrorBoundary/ErrorBoundary.d.ts.map +1 -1
  33. package/typings/generated/src/Spinner/Spinner.d.ts +7 -0
  34. package/typings/generated/src/Spinner/Spinner.d.ts.map +1 -0
  35. package/typings/generated/src/index.d.ts +3 -2
  36. package/typings/generated/src/index.d.ts.map +1 -1
  37. package/typings/generated/src/utils/appDirs.d.ts +1 -9
  38. package/typings/generated/src/utils/appDirs.d.ts.map +1 -1
  39. package/typings/generated/src/utils/packageJson.d.ts +0 -1
  40. package/typings/generated/src/utils/packageJson.d.ts.map +1 -1
  41. package/typings/generated/src/utils/systemReport.d.ts +1 -1
  42. package/typings/generated/src/utils/systemReport.d.ts.map +1 -1
  43. package/mocks/gaMock.ts +0 -9
  44. package/scripts/check-app-properties.js +0 -2
  45. package/scripts/check-for-typescript.js +0 -3
  46. package/scripts/compile-scripts.js +0 -20
  47. package/scripts/esbuild-bootstrap.js +0 -15
  48. package/scripts/nrfconnect-license.js +0 -126
package/Changelog.md CHANGED
@@ -7,7 +7,54 @@ This project does _not_ adhere to
7
7
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html) but contrary to it
8
8
  every new version is a new major version.
9
9
 
10
- ## 81 - Unreleased
10
+ ## 84 - 2023-08-14
11
+
12
+ ### Changed
13
+
14
+ - Re-added underline (mistakenly removed) on hover for `link` variant of
15
+ `Button` component.
16
+ - Apps now have to load themselves, i.e. there is no `ReactDOM.render` done
17
+ from the launcher anymore. The app chooses which html-page will be the
18
+ entrypoint.
19
+ - Passing devices of type nrf-device-lib-js `Device` to calls from
20
+ `deviceInfo.ts` is not allowed. Passing the nrf-device-lib-js version of
21
+ `Device` is now allowed.
22
+ - `ErrorBoundary` now only requires nrf-device-lib-js `Device` type.
23
+ - `systemreport` now only required nrf-device-lib-js `Device` type.
24
+
25
+ ### Steps to upgrade when using this package
26
+
27
+ - Add an `index`-property to package.json. The following example will use the
28
+ index bundled with shared that works with our apps, but apps can also make
29
+ their own instead if needed.
30
+
31
+ ```json
32
+ {
33
+ "index": "dist/index.html"
34
+ }
35
+ ```
36
+
37
+ - Render the app
38
+
39
+ ```typescript
40
+ import { App, render } from '@nordicsemiconductor/pc-nrfconnect-shared';
41
+ ...
42
+ render(<App />);
43
+ ```
44
+
45
+ ## 83 - 2023-08-11
46
+
47
+ ### Added
48
+
49
+ - `Spinner` component.
50
+
51
+ ## 82 - 2023-08-09
52
+
53
+ ### Fixed
54
+
55
+ - Jest tests were broken due to missing config changes.
56
+
57
+ ## 81 - 2023-08-09
11
58
 
12
59
  ### Changed
13
60
 
@@ -18,6 +65,7 @@ every new version is a new major version.
18
65
 
19
66
  ### Steps to upgrade when using this package
20
67
 
68
+ - Remove the old dependency by running `npm rm pc-nrfconnect-shared`.
21
69
  - Change all references from `pc-nrfconnect-shared` to
22
70
  `@nordicsemiconductor/pc-nrfconnect-shared`
23
71
 
@@ -35,7 +83,6 @@ The tsconfig can use the namespace directly like this
35
83
  {
36
84
  "extends": "@nordicsemiconductor/pc-nrfconnect-shared/config/tsconfig.json"
37
85
  }
38
-
39
86
  ```
40
87
 
41
88
  The package.json can be changed as follows:
@@ -23,9 +23,6 @@ module.exports = (disabledMocks = []) => ({
23
23
  : {
24
24
  packageJson$: `${mockDir}/packageJsonMock.ts`,
25
25
  }),
26
- ...(disabledMocks.includes('react-ga')
27
- ? {}
28
- : { '^react-ga$': `${mockDir}/gaMock.ts` }),
29
26
  ...(disabledMocks.includes('serialport')
30
27
  ? {}
31
28
  : { serialport: `${mockDir}/emptyMock.ts` }),
@@ -33,7 +30,9 @@ module.exports = (disabledMocks = []) => ({
33
30
  transform: {
34
31
  '^.+\\.[jt]sx?$': '@swc/jest',
35
32
  },
36
- transformIgnorePatterns: ['node_modules/(?!(pc-nrfconnect-shared)/)'],
33
+ transformIgnorePatterns: [
34
+ 'node_modules/(?!(@nordicsemiconductor/pc-nrfconnect-shared)/)',
35
+ ],
37
36
  setupFilesAfterEnv: [`${__dirname}/../test/setupTests.ts`],
38
37
  snapshotSerializers: ['enzyme-to-json/serializer'],
39
38
  resolver: `${__dirname}/../test/jestResolver.js`,
package/ipc/MetaFiles.ts CHANGED
@@ -61,4 +61,5 @@ export interface PackageJson {
61
61
  url: UrlString;
62
62
  };
63
63
  scripts?: ObjectContainingOptionalStrings;
64
+ html?: string;
64
65
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nordicsemiconductor/pc-nrfconnect-shared",
3
- "version": "81.0.0",
3
+ "version": "84.0.0",
4
4
  "description": "Shared commodities for developing pc-nrfconnect-* packages",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,10 +9,9 @@
9
9
  "author": "Nordic Semiconductor ASA",
10
10
  "license": "ISC",
11
11
  "bin": {
12
- "check-for-typescript": "./scripts/check-for-typescript.js",
13
- "check-app-properties": "./scripts/check-app-properties.js",
14
- "nordic-publish": "./scripts/nordic-publish.js",
15
- "nrfconnect-license": "./scripts/nrfconnect-license.js",
12
+ "check-for-typescript": "./scripts/check-for-typescript.ts",
13
+ "check-app-properties": "./scripts/check-app-properties.ts",
14
+ "nrfconnect-license": "./scripts/nrfconnect-license.ts",
16
15
  "run-esbuild": "./scripts/esbuild.js"
17
16
  },
18
17
  "files": [
@@ -27,9 +26,10 @@
27
26
  "./test",
28
27
  "./typings",
29
28
  "./styles.scss",
30
- "LICENSE",
31
- "Changelog.md",
32
- "README.md"
29
+ "./tsconfig.json",
30
+ "./LICENSE",
31
+ "./Changelog.md",
32
+ "./README.md"
33
33
  ],
34
34
  "main": "src",
35
35
  "scripts": {
@@ -38,14 +38,15 @@
38
38
  "check:lint": "eslint --color .",
39
39
  "check:types": "tsc --noEmit",
40
40
  "check:license": "ts-node scripts/nrfconnect-license.ts check",
41
- "clean-generate-types": "rimraf ./typings/generated",
42
41
  "generate-types": "tsc --emitDeclarationOnly --declaration --declarationMap --outDir ./typings/generated --rootDir .",
43
42
  "prepare": "ts-node scripts/installHusky.ts",
44
43
  "release-shared": "ts-node scripts/release-shared.ts",
45
- "prepare-shared-release": "ts-node scripts/prepare-shared-release.ts"
44
+ "prepare-shared-release": "ts-node scripts/prepare-shared-release.ts",
45
+ "clean": "rimraf dist typings/generated dist scripts/nordic-publish.js",
46
+ "postinstall": "ts-node scripts/postinstall.ts"
46
47
  },
47
48
  "peerDependencies": {
48
- "@nordicsemiconductor/nrf-device-lib-js": "*"
49
+ "@nordicsemiconductor/nrf-device-lib-js": ">=0.6.13"
49
50
  },
50
51
  "dependencies": {
51
52
  "@electron/remote": "^2.0.4",
@@ -68,6 +68,7 @@ const checkMandatoryProperties = (packageJson: PackageJson) => {
68
68
  `description`,
69
69
  `displayName`,
70
70
  `engines.nrfconnect`,
71
+ `html`,
71
72
  ];
72
73
 
73
74
  const missingProperties = mandatoryProperties.filter(
@@ -38,7 +38,7 @@ function options(additionalOptions) {
38
38
  const outdir = outfile ? undefined : './dist';
39
39
 
40
40
  return {
41
- format: 'cjs',
41
+ format: 'iife',
42
42
  outfile,
43
43
  outdir,
44
44
  target: 'chrome89',
@@ -54,7 +54,6 @@ function options(additionalOptions) {
54
54
  'electron',
55
55
  'serialport',
56
56
  '@electron/remote',
57
- 'react',
58
57
  '@nordicsemiconductor/nrf-device-lib-js',
59
58
 
60
59
  // App dependencies
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  const fs = require('fs');
9
- const join = require('path').join;
9
+ const { join, basename } = require('path');
10
10
  const { build } = require('./esbuild-renderer');
11
11
 
12
12
  const entry = [
@@ -19,25 +19,22 @@ const entry = [
19
19
  build({ entryPoints: [entry] });
20
20
 
21
21
  const distFolder = join(process.cwd(), 'dist');
22
+
22
23
  if (!fs.existsSync(distFolder)) {
23
24
  fs.mkdirSync(distFolder);
24
25
  }
25
26
 
26
- fs.copyFileSync(
27
- join(
28
- process.cwd(),
29
- './node_modules/@nordicsemiconductor/pc-nrfconnect-shared/scripts/nordic-publish.js'
30
- ),
31
- join(distFolder, 'nordic-publish.js')
27
+ const sharedPath = join(
28
+ process.cwd(),
29
+ 'node_modules/@nordicsemiconductor/pc-nrfconnect-shared'
32
30
  );
33
31
 
34
- fs.copyFileSync(
35
- join(
36
- process.cwd(),
37
- './node_modules/@nordicsemiconductor/pc-nrfconnect-shared/dist/bootstrap.css'
38
- ),
39
- join(distFolder, 'bootstrap.css')
40
- );
32
+ const copyFileToDist = file =>
33
+ fs.copyFileSync(join(sharedPath, file), join(distFolder, basename(file)));
34
+
35
+ copyFileToDist('scripts/nordic-publish.js');
36
+ copyFileToDist('dist/bootstrap.css');
37
+ copyFileToDist('src/index.html');
41
38
 
42
39
  if (process.argv.includes('--include-bootloader')) {
43
40
  if (!fs.existsSync(`${process.cwd()}/fw`)) {
@@ -46,8 +43,8 @@ if (process.argv.includes('--include-bootloader')) {
46
43
 
47
44
  fs.copyFileSync(
48
45
  join(
49
- process.cwd(),
50
- './node_modules/@nordicsemiconductor/pc-nrfconnect-shared/fw/bootloader/graviton_bootloader_v1.0.1-[nRF5_SDK_15.0.1-1.alpha_f76d012].zip'
46
+ sharedPath,
47
+ '/fw/bootloader/graviton_bootloader_v1.0.1-[nRF5_SDK_15.0.1-1.alpha_f76d012].zip'
51
48
  ),
52
49
  join(
53
50
  process.cwd(),
@@ -28,7 +28,7 @@ Expecting one of '${n.join("', '")}'`);let i=`${e}Help`;return this.on(i,s=>{let
28
28
  `+o+"]":"["+u.join(",")+"]",ee=o,i}if(Oe&&typeof Oe=="object")for(s=Oe.length,r=0;r<s;r+=1)n=Oe[r],typeof n=="string"&&(i=q0(n,a),i&&u.push(Ht(n)+(ee?": ":":")+i));else for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(i=q0(n,a),i&&u.push(Ht(n)+(ee?": ":":")+i));return i=u.length===0?"{}":ee?`{
29
29
  `+ee+u.join(`,
30
30
  `+ee)+`
31
- `+o+"}":"{"+u.join(",")+"}",ee=o,i;default:}}as.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 As=E(Ut=>{"use strict";Ut.parse=os();Ut.stringify=us()});var ls=E((sh,Fs)=>{var el=typeof JSON<"u"?JSON:As();Fs.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 fs=E((oh,Es)=>{var nl=require("crypto").createHash,cs=require("buffer").Buffer,il=ls();Es.exports=function(e,r,n){return e=typeof e=="string"||cs.isBuffer(e)?e:il(e),nl(r||"sha1").update(e,cs.isBuffer(e)?null:"utf8").digest(n||"hex")}});var Cs=E((ah,hs)=>{function sl(t){return function(e){return e?.[t]}}hs.exports=sl});var P0=E((uh,ps)=>{var ol=Array.isArray;ps.exports=ol});var Bs=E((Ah,Ds)=>{var al=typeof global=="object"&&global&&global.Object===Object&&global;Ds.exports=al});var L0=E((Fh,ds)=>{var ul=Bs(),Al=typeof self=="object"&&self&&self.Object===Object&&self,Fl=ul||Al||Function("return this")();ds.exports=Fl});var k0=E((lh,gs)=>{var ll=L0(),cl=ll.Symbol;gs.exports=cl});var ys=E((ch,vs)=>{var ms=k0(),_s=Object.prototype,El=_s.hasOwnProperty,fl=_s.toString,u0=ms?ms.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}vs.exports=hl});var ws=E((Eh,bs)=>{var Cl=Object.prototype,pl=Cl.toString;function Dl(t){return pl.call(t)}bs.exports=Dl});var Vt=E((fh,Os)=>{var Ss=k0(),Bl=ys(),dl=ws(),gl="[object Null]",ml="[object Undefined]",xs=Ss?Ss.toStringTag:void 0;function _l(t){return t==null?t===void 0?ml:gl:xs&&xs in Object(t)?Bl(t):dl(t)}Os.exports=_l});var Rs=E((hh,Is)=>{function vl(t){return t!=null&&typeof t=="object"}Is.exports=vl});var j0=E((Ch,Ts)=>{var yl=Vt(),bl=Rs(),wl="[object Symbol]";function Sl(t){return typeof t=="symbol"||bl(t)&&yl(t)==wl}Ts.exports=Sl});var Gt=E((ph,$s)=>{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)}$s.exports=Tl});var Wt=E((Dh,Ns)=>{function $l(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}Ns.exports=$l});var Ps=E((Bh,qs)=>{var Nl=Vt(),ql=Wt(),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}qs.exports=Ml});var ks=E((dh,Ls)=>{var Hl=L0(),Ul=Hl["__core-js_shared__"];Ls.exports=Ul});var Hs=E((gh,Ms)=>{var Jt=ks(),js=function(){var t=/[^.]+$/.exec(Jt&&Jt.keys&&Jt.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function Vl(t){return!!js&&js in t}Ms.exports=Vl});var Vs=E((mh,Us)=>{var Gl=Function.prototype,Wl=Gl.toString;function Jl(t){if(t!=null){try{return Wl.call(t)}catch{}try{return t+""}catch{}}return""}Us.exports=Jl});var Ws=E((_h,Gs)=>{var Kl=Ps(),Yl=Hs(),Xl=Wt(),zl=Vs(),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))}Gs.exports=sc});var Ks=E((vh,Js)=>{function oc(t,e){return t?.[e]}Js.exports=oc});var Kt=E((yh,Ys)=>{var ac=Ws(),uc=Ks();function Ac(t,e){var r=uc(t,e);return ac(r)?r:void 0}Ys.exports=Ac});var A0=E((bh,Xs)=>{var Fc=Kt(),lc=Fc(Object,"create");Xs.exports=lc});var Qs=E((wh,Zs)=>{var zs=A0();function cc(){this.__data__=zs?zs(null):{},this.size=0}Zs.exports=cc});var to=E((Sh,eo)=>{function Ec(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}eo.exports=Ec});var no=E((xh,ro)=>{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}ro.exports=Dc});var so=E((Oh,io)=>{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)}io.exports=mc});var ao=E((Ih,oo)=>{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}oo.exports=yc});var Ao=E((Rh,uo)=>{var bc=Qs(),wc=to(),Sc=no(),xc=so(),Oc=ao();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;uo.exports=Me});var lo=E((Th,Fo)=>{function Ic(){this.__data__=[],this.size=0}Fo.exports=Ic});var Eo=E(($h,co)=>{function Rc(t,e){return t===e||t!==t&&e!==e}co.exports=Rc});var F0=E((Nh,fo)=>{var Tc=Eo();function $c(t,e){for(var r=t.length;r--;)if(Tc(t[r][0],e))return r;return-1}fo.exports=$c});var Co=E((qh,ho)=>{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}ho.exports=Lc});var Do=E((Ph,po)=>{var kc=F0();function jc(t){var e=this.__data__,r=kc(e,t);return r<0?void 0:e[r][1]}po.exports=jc});var go=E((Lh,Bo)=>{var Mc=F0();function Hc(t){return Mc(this.__data__,t)>-1}Bo.exports=Hc});var _o=E((kh,mo)=>{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}mo.exports=Vc});var yo=E((jh,vo)=>{var Gc=lo(),Wc=Co(),Jc=Do(),Kc=go(),Yc=_o();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;vo.exports=He});var wo=E((Mh,bo)=>{var Xc=Kt(),zc=L0(),Zc=Xc(zc,"Map");bo.exports=Zc});var Oo=E((Hh,xo)=>{var So=Ao(),Qc=yo(),e2=wo();function t2(){this.size=0,this.__data__={hash:new So,map:new(e2||Qc),string:new So}}xo.exports=t2});var Ro=E((Uh,Io)=>{function r2(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}Io.exports=r2});var l0=E((Vh,To)=>{var n2=Ro();function i2(t,e){var r=t.__data__;return n2(e)?r[typeof e=="string"?"string":"hash"]:r.map}To.exports=i2});var No=E((Gh,$o)=>{var s2=l0();function o2(t){var e=s2(this,t).delete(t);return this.size-=e?1:0,e}$o.exports=o2});var Po=E((Wh,qo)=>{var a2=l0();function u2(t){return a2(this,t).get(t)}qo.exports=u2});var ko=E((Jh,Lo)=>{var A2=l0();function F2(t){return A2(this,t).has(t)}Lo.exports=F2});var Mo=E((Kh,jo)=>{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}jo.exports=c2});var Uo=E((Yh,Ho)=>{var E2=Oo(),f2=No(),h2=Po(),C2=ko(),p2=Mo();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;Ho.exports=Ue});var Wo=E((Xh,Go)=>{var Vo=Uo(),D2="Expected a function";function Yt(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(Yt.Cache||Vo),r}Yt.Cache=Vo;Go.exports=Yt});var Ko=E((zh,Jo)=>{var B2=Wo(),d2=500;function g2(t){var e=B2(t,function(n){return r.size===d2&&r.clear(),n}),r=e.cache;return e}Jo.exports=g2});var Xo=E((Zh,Yo)=>{var m2=Ko(),_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});Yo.exports=y2});var Zo=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 i1=E((eC,n1)=>{var Qo=k0(),w2=Zo(),S2=P0(),x2=j0(),O2=1/0,e1=Qo?Qo.prototype:void 0,t1=e1?e1.toString:void 0;function r1(t){if(typeof t=="string")return t;if(S2(t))return w2(t,r1)+"";if(x2(t))return t1?t1.call(t):"";var e=t+"";return e=="0"&&1/t==-O2?"-0":e}n1.exports=r1});var o1=E((tC,s1)=>{var I2=i1();function R2(t){return t==null?"":I2(t)}s1.exports=R2});var u1=E((rC,a1)=>{var T2=P0(),$2=Gt(),N2=Xo(),q2=o1();function P2(t,e){return T2(t)?t:$2(t,e)?[t]:N2(q2(t))}a1.exports=P2});var Xt=E((nC,A1)=>{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}A1.exports=j2});var l1=E((iC,F1)=>{var M2=u1(),H2=Xt();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}F1.exports=U2});var E1=E((sC,c1)=>{var V2=l1();function G2(t){return function(e){return V2(e,t)}}c1.exports=G2});var h1=E((oC,f1)=>{var W2=Cs(),J2=E1(),K2=Gt(),Y2=Xt();function X2(t){return K2(t)?W2(Y2(t)):J2(t)}f1.exports=X2});var b1=require("child_process");var hr=Re(fr(),1),{program:tt,createCommand:kE,createArgument:jE,createOption:ME,CommanderError:HE,InvalidArgumentError:UE,InvalidOptionArgumentError:VE,Command:GE,Argument:WE,Option:JE,Help:KE}=hr.default;var Ve=Re(require("fs")),w1=Re(nn()),S1=Re(ts()),x1=Re(fs());var D1=require("child_process"),de=require("fs"),B1=Re(h1()),d1=t=>t.map(e=>`\`${e}\``).join(", "),zt=t=>e=>{let r=(0,B1.default)(e)(t);return r==null||r===""},Be=t=>{console.error(t),process.exit(1)},C1=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(zt(t));g1(r,"package.json is missing these mandatory properties")},Q2=t=>{if(zt(t)("homepage")&&C1("Please provide a property `homepage` in package.json."),zt(t)("repository.url"))C1("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=()=>{tt.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=tt.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}.
31
+ `+o+"}":"{"+u.join(",")+"}",ee=o,i;default:}}as.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 As=E(Ut=>{"use strict";Ut.parse=os();Ut.stringify=us()});var ls=E((sh,Fs)=>{var el=typeof JSON<"u"?JSON:As();Fs.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 fs=E((oh,Es)=>{var nl=require("crypto").createHash,cs=require("buffer").Buffer,il=ls();Es.exports=function(e,r,n){return e=typeof e=="string"||cs.isBuffer(e)?e:il(e),nl(r||"sha1").update(e,cs.isBuffer(e)?null:"utf8").digest(n||"hex")}});var Cs=E((ah,hs)=>{function sl(t){return function(e){return e?.[t]}}hs.exports=sl});var P0=E((uh,ps)=>{var ol=Array.isArray;ps.exports=ol});var Bs=E((Ah,Ds)=>{var al=typeof global=="object"&&global&&global.Object===Object&&global;Ds.exports=al});var L0=E((Fh,ds)=>{var ul=Bs(),Al=typeof self=="object"&&self&&self.Object===Object&&self,Fl=ul||Al||Function("return this")();ds.exports=Fl});var k0=E((lh,gs)=>{var ll=L0(),cl=ll.Symbol;gs.exports=cl});var ys=E((ch,vs)=>{var ms=k0(),_s=Object.prototype,El=_s.hasOwnProperty,fl=_s.toString,u0=ms?ms.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}vs.exports=hl});var ws=E((Eh,bs)=>{var Cl=Object.prototype,pl=Cl.toString;function Dl(t){return pl.call(t)}bs.exports=Dl});var Vt=E((fh,Os)=>{var Ss=k0(),Bl=ys(),dl=ws(),gl="[object Null]",ml="[object Undefined]",xs=Ss?Ss.toStringTag:void 0;function _l(t){return t==null?t===void 0?ml:gl:xs&&xs in Object(t)?Bl(t):dl(t)}Os.exports=_l});var Rs=E((hh,Is)=>{function vl(t){return t!=null&&typeof t=="object"}Is.exports=vl});var j0=E((Ch,Ts)=>{var yl=Vt(),bl=Rs(),wl="[object Symbol]";function Sl(t){return typeof t=="symbol"||bl(t)&&yl(t)==wl}Ts.exports=Sl});var Gt=E((ph,$s)=>{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)}$s.exports=Tl});var Wt=E((Dh,Ns)=>{function $l(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}Ns.exports=$l});var Ps=E((Bh,qs)=>{var Nl=Vt(),ql=Wt(),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}qs.exports=Ml});var ks=E((dh,Ls)=>{var Hl=L0(),Ul=Hl["__core-js_shared__"];Ls.exports=Ul});var Hs=E((gh,Ms)=>{var Jt=ks(),js=function(){var t=/[^.]+$/.exec(Jt&&Jt.keys&&Jt.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function Vl(t){return!!js&&js in t}Ms.exports=Vl});var Vs=E((mh,Us)=>{var Gl=Function.prototype,Wl=Gl.toString;function Jl(t){if(t!=null){try{return Wl.call(t)}catch{}try{return t+""}catch{}}return""}Us.exports=Jl});var Ws=E((_h,Gs)=>{var Kl=Ps(),Yl=Hs(),Xl=Wt(),zl=Vs(),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))}Gs.exports=sc});var Ks=E((vh,Js)=>{function oc(t,e){return t?.[e]}Js.exports=oc});var Kt=E((yh,Ys)=>{var ac=Ws(),uc=Ks();function Ac(t,e){var r=uc(t,e);return ac(r)?r:void 0}Ys.exports=Ac});var A0=E((bh,Xs)=>{var Fc=Kt(),lc=Fc(Object,"create");Xs.exports=lc});var Qs=E((wh,Zs)=>{var zs=A0();function cc(){this.__data__=zs?zs(null):{},this.size=0}Zs.exports=cc});var to=E((Sh,eo)=>{function Ec(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}eo.exports=Ec});var no=E((xh,ro)=>{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}ro.exports=Dc});var so=E((Oh,io)=>{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)}io.exports=mc});var ao=E((Ih,oo)=>{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}oo.exports=yc});var Ao=E((Rh,uo)=>{var bc=Qs(),wc=to(),Sc=no(),xc=so(),Oc=ao();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;uo.exports=Me});var lo=E((Th,Fo)=>{function Ic(){this.__data__=[],this.size=0}Fo.exports=Ic});var Eo=E(($h,co)=>{function Rc(t,e){return t===e||t!==t&&e!==e}co.exports=Rc});var F0=E((Nh,fo)=>{var Tc=Eo();function $c(t,e){for(var r=t.length;r--;)if(Tc(t[r][0],e))return r;return-1}fo.exports=$c});var Co=E((qh,ho)=>{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}ho.exports=Lc});var Do=E((Ph,po)=>{var kc=F0();function jc(t){var e=this.__data__,r=kc(e,t);return r<0?void 0:e[r][1]}po.exports=jc});var go=E((Lh,Bo)=>{var Mc=F0();function Hc(t){return Mc(this.__data__,t)>-1}Bo.exports=Hc});var _o=E((kh,mo)=>{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}mo.exports=Vc});var yo=E((jh,vo)=>{var Gc=lo(),Wc=Co(),Jc=Do(),Kc=go(),Yc=_o();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;vo.exports=He});var wo=E((Mh,bo)=>{var Xc=Kt(),zc=L0(),Zc=Xc(zc,"Map");bo.exports=Zc});var Oo=E((Hh,xo)=>{var So=Ao(),Qc=yo(),e2=wo();function t2(){this.size=0,this.__data__={hash:new So,map:new(e2||Qc),string:new So}}xo.exports=t2});var Ro=E((Uh,Io)=>{function r2(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}Io.exports=r2});var l0=E((Vh,To)=>{var n2=Ro();function i2(t,e){var r=t.__data__;return n2(e)?r[typeof e=="string"?"string":"hash"]:r.map}To.exports=i2});var No=E((Gh,$o)=>{var s2=l0();function o2(t){var e=s2(this,t).delete(t);return this.size-=e?1:0,e}$o.exports=o2});var Po=E((Wh,qo)=>{var a2=l0();function u2(t){return a2(this,t).get(t)}qo.exports=u2});var ko=E((Jh,Lo)=>{var A2=l0();function F2(t){return A2(this,t).has(t)}Lo.exports=F2});var Mo=E((Kh,jo)=>{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}jo.exports=c2});var Uo=E((Yh,Ho)=>{var E2=Oo(),f2=No(),h2=Po(),C2=ko(),p2=Mo();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;Ho.exports=Ue});var Wo=E((Xh,Go)=>{var Vo=Uo(),D2="Expected a function";function Yt(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(Yt.Cache||Vo),r}Yt.Cache=Vo;Go.exports=Yt});var Ko=E((zh,Jo)=>{var B2=Wo(),d2=500;function g2(t){var e=B2(t,function(n){return r.size===d2&&r.clear(),n}),r=e.cache;return e}Jo.exports=g2});var Xo=E((Zh,Yo)=>{var m2=Ko(),_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});Yo.exports=y2});var Zo=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 i1=E((eC,n1)=>{var Qo=k0(),w2=Zo(),S2=P0(),x2=j0(),O2=1/0,e1=Qo?Qo.prototype:void 0,t1=e1?e1.toString:void 0;function r1(t){if(typeof t=="string")return t;if(S2(t))return w2(t,r1)+"";if(x2(t))return t1?t1.call(t):"";var e=t+"";return e=="0"&&1/t==-O2?"-0":e}n1.exports=r1});var o1=E((tC,s1)=>{var I2=i1();function R2(t){return t==null?"":I2(t)}s1.exports=R2});var u1=E((rC,a1)=>{var T2=P0(),$2=Gt(),N2=Xo(),q2=o1();function P2(t,e){return T2(t)?t:$2(t,e)?[t]:N2(q2(t))}a1.exports=P2});var Xt=E((nC,A1)=>{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}A1.exports=j2});var l1=E((iC,F1)=>{var M2=u1(),H2=Xt();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}F1.exports=U2});var E1=E((sC,c1)=>{var V2=l1();function G2(t){return function(e){return V2(e,t)}}c1.exports=G2});var h1=E((oC,f1)=>{var W2=Cs(),J2=E1(),K2=Gt(),Y2=Xt();function X2(t){return K2(t)?W2(Y2(t)):J2(t)}f1.exports=X2});var b1=require("child_process");var hr=Re(fr(),1),{program:tt,createCommand:kE,createArgument:jE,createOption:ME,CommanderError:HE,InvalidArgumentError:UE,InvalidOptionArgumentError:VE,Command:GE,Argument:WE,Option:JE,Help:KE}=hr.default;var Ve=Re(require("fs")),w1=Re(nn()),S1=Re(ts()),x1=Re(fs());var D1=require("child_process"),de=require("fs"),B1=Re(h1()),d1=t=>t.map(e=>`\`${e}\``).join(", "),zt=t=>e=>{let r=(0,B1.default)(e)(t);return r==null||r===""},Be=t=>{console.error(t),process.exit(1)},C1=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","html"].filter(zt(t));g1(r,"package.json is missing these mandatory properties")},Q2=t=>{if(zt(t)("homepage")&&C1("Please provide a property `homepage` in package.json."),zt(t)("repository.url"))C1("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=()=>{tt.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=tt.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
34
  If you want to create a new source, use the --create-source option.`)):e()})}),M0=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 M0(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 M0("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 M0("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 M0(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();
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ts-node
2
+
3
+ /*
4
+ * Copyright (c) 2015 Nordic Semiconductor ASA
5
+ *
6
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
7
+ */
8
+
9
+ import { execSync } from 'child_process';
10
+ import { existsSync } from 'fs';
11
+ import { resolve } from 'path';
12
+
13
+ import { build } from './esbuild-renderer';
14
+
15
+ if (!existsSync(`scripts/nordic-publish.js`)) {
16
+ console.log('Building nordic-publish.js');
17
+ const command = `npx esbuild scripts/nordic-publish.ts --bundle --outfile=scripts/nordic-publish.js --platform=node --log-level=warning --minify`;
18
+ execSync(command, { encoding: 'utf-8' });
19
+ }
20
+
21
+ if (!existsSync(`dist/bootstrap.css`)) {
22
+ console.log('Building bootstrap.css');
23
+ build({
24
+ logLevel: 'warning',
25
+ entryPoints: ['./src/bootstrap.scss'],
26
+ outfile: 'dist/bootstrap.css',
27
+ sourcemap: false,
28
+ });
29
+ }
30
+
31
+ if (!existsSync(`typings/generated/src/index.d.ts`)) {
32
+ console.log('Generating types');
33
+ const root = resolve(__dirname, '..');
34
+ process.chdir(root);
35
+
36
+ execSync('npm run generate-types', { encoding: 'utf-8' });
37
+ }
package/src/App/App.tsx CHANGED
@@ -8,6 +8,7 @@ import 'focus-visible';
8
8
 
9
9
  import React, { FC, ReactNode, useEffect, useMemo } from 'react';
10
10
  import Carousel from 'react-bootstrap/Carousel';
11
+ import ReactDOM from 'react-dom';
11
12
  import { useDispatch, useSelector } from 'react-redux';
12
13
  import { Reducer } from 'redux';
13
14
 
@@ -250,3 +251,11 @@ const useAllPanes = (
250
251
 
251
252
  return allPanes;
252
253
  };
254
+
255
+ export const render = (App: React.ReactElement) => {
256
+ const container = document.getElementById('webapp');
257
+ if (container == null) {
258
+ throw new Error('Unable to find root element <div id="webapp"></div>');
259
+ }
260
+ ReactDOM.render(App, container);
261
+ };
@@ -59,7 +59,7 @@ const Button: React.FC<ButtonProps> = ({
59
59
  variant === 'danger' &&
60
60
  'tw-bg-red tw-text-white active:enabled:tw-bg-red-700',
61
61
  variant === 'link' &&
62
- 'tw-bg-transparent tw-p-0 tw-text-nordicBlue',
62
+ 'tw-bg-transparent tw-p-0 tw-text-nordicBlue hover:tw-underline',
63
63
  variant === 'link-button' &&
64
64
  'tw-border tw-border-nordicBlue tw-bg-white tw-text-nordicBlue active:enabled:tw-bg-gray-50',
65
65
  className
@@ -28,7 +28,9 @@
28
28
  through CSS, e.g. to change the colours.
29
29
  */
30
30
 
31
- import type { Device } from '../deviceSlice';
31
+ import type { Device as NrfdlDevice } from '@nordicsemiconductor/nrf-device-lib-js';
32
+
33
+ import type { Device as WrappedDevice } from '../deviceSlice';
32
34
 
33
35
  import nrf51logo from '!!@svgr!./nRF51-Series-logo.svg';
34
36
  import nrf52logo from '!!@svgr!./nRF52-Series-logo.svg';
@@ -39,6 +41,8 @@ import ppkLogo from '!!@svgr!./ppk-logo.svg';
39
41
  import unknownLogo from '!!@svgr!./unknown-logo.svg';
40
42
  import unknownNordicLogo from '!!@svgr!./unknown-nordic-logo.svg';
41
43
 
44
+ type Device = NrfdlDevice | WrappedDevice;
45
+
42
46
  type DevicePCA =
43
47
  | 'PCA10028'
44
48
  | 'PCA10031'
@@ -184,7 +188,7 @@ const deviceByPca = (device: Device) =>
184
188
 
185
189
  const NORDIC_VENDOR_ID = '1915';
186
190
  const isNordicDevice = (device: Device) =>
187
- device.serialport?.vendorId === NORDIC_VENDOR_ID;
191
+ device.serialPorts?.[0]?.vendorId === NORDIC_VENDOR_ID;
188
192
 
189
193
  const ppkDeviceInfo = (device: Device): DeviceInfo => ({
190
194
  name: device.usb?.product,
@@ -217,11 +221,16 @@ const unknownDevice = (device: Device): DeviceInfo => ({
217
221
  export const deviceInfo = (device: Device): DeviceInfo =>
218
222
  deviceByPca(device) || deviceByUsb(device) || unknownDevice(device);
219
223
 
224
+ const hasNickname = (
225
+ device: Device
226
+ ): device is WrappedDevice & Required<Pick<WrappedDevice, 'nickname'>> =>
227
+ 'nickname' in device && device.nickname !== undefined;
228
+
220
229
  export const displayedDeviceName = (
221
230
  device: Device,
222
231
  { respectNickname = true } = {}
223
232
  ) => {
224
- if (respectNickname && device.nickname) {
233
+ if (respectNickname && hasNickname(device)) {
225
234
  return device.nickname;
226
235
  }
227
236
 
@@ -5,10 +5,10 @@
5
5
  */
6
6
 
7
7
  import React, { ReactNode } from 'react';
8
- import { Spinner } from 'react-bootstrap';
9
8
  import Modal from 'react-bootstrap/Modal';
10
9
 
11
10
  import Button, { ButtonVariants } from '../Button/Button';
11
+ import Spinner from '../Spinner/Spinner';
12
12
 
13
13
  import './dialog.scss';
14
14
 
@@ -67,7 +67,7 @@ Dialog.Header = ({
67
67
  <Modal.Header closeButton={false}>
68
68
  <div>
69
69
  <b>{title}</b>
70
- {showSpinner && <Spinner size="sm" animation="border" />}
70
+ {showSpinner && <Spinner size="sm" className="tw-pl-4" />}
71
71
  </div>
72
72
  {headerIcon && <span className={`mdi mdi-${headerIcon}`} />}
73
73
  </Modal.Header>
@@ -30,11 +30,6 @@
30
30
  .mdi {
31
31
  font-size: 20px;
32
32
  }
33
-
34
- .spinner-border {
35
- margin-left: 16px;
36
- border-width: 1px;
37
- }
38
33
  }
39
34
 
40
35
  .modal-body {
@@ -5,13 +5,13 @@
5
5
  */
6
6
 
7
7
  import React, { ReactNode } from 'react';
8
- import { Spinner } from 'react-bootstrap';
9
8
  import { getCurrentWindow } from '@electron/remote';
9
+ import { Device } from '@nordicsemiconductor/nrf-device-lib-js';
10
10
 
11
11
  import Button from '../Button/Button';
12
- import { Device } from '../Device/deviceSlice';
13
12
  import FactoryResetButton from '../FactoryReset/FactoryResetButton';
14
13
  import { CollapsibleGroup } from '../SidePanel/Group';
14
+ import Spinner from '../Spinner/Spinner';
15
15
  import { openUrl } from '../utils/open';
16
16
  import packageJson from '../utils/packageJson';
17
17
  import { getAppSpecificStore as store } from '../utils/persistentStore';
@@ -159,7 +159,7 @@ class ErrorBoundary extends React.Component<
159
159
  <h2 className="loading-header">
160
160
  Generating system report...
161
161
  </h2>
162
- <Spinner size="sm" animation="border" />
162
+ <Spinner size="sm" className="tw-pl-4" />
163
163
  </div>
164
164
  )}
165
165
  <p>
@@ -94,9 +94,4 @@
94
94
  font-size: 12px;
95
95
  }
96
96
  }
97
-
98
- .spinner-border {
99
- margin-left: 16px;
100
- border-width: 1px;
101
- }
102
97
  }
@@ -0,0 +1,22 @@
1
+ /*
2
+ * Copyright (c) 2023 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import React from 'react';
8
+ import { Spinner } from 'react-bootstrap';
9
+
10
+ export default ({
11
+ size,
12
+ className,
13
+ }: {
14
+ size: 'sm' | 'lg';
15
+ className?: string;
16
+ }) => (
17
+ <Spinner
18
+ size={size === 'sm' ? 'sm' : undefined}
19
+ animation="border"
20
+ className={`tw-preflight tw-border ${className || ''}`}
21
+ />
22
+ );
package/src/index.html ADDED
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <link rel="stylesheet" href="bootstrap.css">
8
+ <link rel="stylesheet" href="bundle.css">
9
+ <script>
10
+ const path = require('path');
11
+ const launcherPath = require('@electron/remote').app.getAppPath()
12
+ module.paths.unshift(path.join(launcherPath, '/node_modules'));
13
+ document.write(
14
+ '<link rel="stylesheet" href="'+launcherPath+'/dist/fonts.css" type="text/css" />'
15
+ );
16
+ </script>
17
+ <script src="bundle.js" defer></script>
18
+ </head>
19
+ <body>
20
+ <div id="webapp"></div>
21
+ </body>
22
+ </html>
package/src/index.ts CHANGED
@@ -8,7 +8,7 @@ import { hideDialog, showDialog } from './ErrorDialog/errorDialogSlice';
8
8
 
9
9
  export const ErrorDialogActions = { hideDialog, showDialog };
10
10
 
11
- export { default as App, type PaneProps } from './App/App';
11
+ export { default as App, render, type PaneProps } from './App/App';
12
12
  export { default as Logo } from './Logo/Logo';
13
13
  export {
14
14
  default as DeviceSelector,
@@ -46,6 +46,8 @@ export { default as InlineInput } from './InlineInput/InlineInput';
46
46
  export { default as NumberInlineInput } from './InlineInput/NumberInlineInput';
47
47
  export { default as NumberInputSliderWithUnit } from './NumberInputWithSlider/NumberInputSliderWithUnit';
48
48
 
49
+ export { default as Spinner } from './Spinner/Spinner';
50
+
49
51
  export { default as MasonryLayout } from './MasonryLayout/MasonryLayout';
50
52
 
51
53
  export { default as useStopwatch } from './utils/useStopwatch';
@@ -57,7 +59,6 @@ export { default as bleChannels } from './utils/bleChannels';
57
59
  export { colors } from './utils/colors';
58
60
 
59
61
  export {
60
- setAppDirs,
61
62
  getAppDir,
62
63
  getAppFile,
63
64
  getAppDataDir,
@@ -7,37 +7,18 @@
7
7
  import { getGlobal } from '@electron/remote';
8
8
  import path from 'path';
9
9
 
10
- import { loadPackageJson } from './packageJson';
10
+ import packageJson from './packageJson';
11
11
 
12
12
  const getUserDataDir = () => getGlobal('userDataDir');
13
13
 
14
- declare global {
15
- interface Window {
16
- appDir: string;
17
- appDataDir: string;
18
- appLogDir: string;
19
- }
20
- }
21
-
22
- function setAppDirs(
23
- newAppDir: string,
24
- newAppDataDir: string,
25
- newAppLogDir: string
26
- ) {
27
- window.appDir = newAppDir;
28
- window.appDataDir = newAppDataDir;
29
- window.appLogDir = newAppLogDir;
30
-
31
- loadPackageJson(getAppFile('package.json'));
32
- }
33
-
34
14
  /**
35
15
  * Get the filesystem path of the currently loaded app.
36
16
  *
37
17
  * @returns {string|undefined} Absolute path of current app.
38
18
  */
39
19
  function getAppDir() {
40
- return window.appDir;
20
+ const html = packageJson()?.html ?? '';
21
+ return __filename.replace(html, '');
41
22
  }
42
23
 
43
24
  /**
@@ -56,7 +37,7 @@ function getAppFile(filename: string) {
56
37
  * @returns {string|undefined} Absolute path of data directory of the current app.
57
38
  */
58
39
  function getAppDataDir() {
59
- return window.appDataDir;
40
+ return `${getUserDataDir()}${path.basename(getAppDir())}`;
60
41
  }
61
42
 
62
43
  /**
@@ -65,14 +46,7 @@ function getAppDataDir() {
65
46
  * @returns {string|undefined} Absolute path of data directory of the current app.
66
47
  */
67
48
  function getAppLogDir() {
68
- return window.appLogDir;
49
+ return `${getAppDataDir()}/logs`;
69
50
  }
70
51
 
71
- export {
72
- setAppDirs,
73
- getAppDir,
74
- getAppFile,
75
- getAppDataDir,
76
- getAppLogDir,
77
- getUserDataDir,
78
- };
52
+ export { getAppDir, getAppFile, getAppDataDir, getAppLogDir, getUserDataDir };