nw-builder 4.0.0-rc.7 → 4.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.
File without changes
@@ -11,7 +11,7 @@ jobs:
11
11
  - uses: actions/checkout@v3
12
12
  - uses: actions/setup-node@v3
13
13
  with:
14
- node-version: "16"
14
+ node-version: "18"
15
15
 
16
16
  - run: npm ci
17
17
  - uses: JS-DevTools/npm-publish@v1
@@ -15,8 +15,8 @@ jobs:
15
15
  test:
16
16
  strategy:
17
17
  matrix:
18
- os: [ubuntu-latest]
19
- node-version: [16]
18
+ os: [macos-latest, ubuntu-latest, windows-latest]
19
+ node-version: [16, 18]
20
20
  runs-on: ${{ matrix.os }}
21
21
  steps:
22
22
  - uses: actions/checkout@v3
package/README.md CHANGED
@@ -16,8 +16,7 @@ npm install nw-builder
16
16
  ## Usage
17
17
 
18
18
  ```javascript
19
-
20
- import nwbuild from "nw-builder";
19
+ import { nwbuild } from "nw-builder";
21
20
 
22
21
  nwbuild({
23
22
  srcDir: "./nwapp",
@@ -31,18 +30,13 @@ nwbuild({
31
30
  // these are implicitely defined unless
32
31
  // you want to change some behaviour
33
32
  downloadUrl: "https://dl.nwjs.io",
34
- manifestUrl: "https://nwjs.io/versions"
33
+ manifestUrl: "https://nwjs.io/versions",
35
34
  run: false,
36
35
  noCache: false,
37
- zip: false
36
+ zip: false,
38
37
  });
39
-
40
38
  ```
41
39
 
42
- ## Team
43
-
44
- This project was created by [Steffen Müller](https://github.com/steffenmllr) and has been maintained by [Gabe Paez](https://github.com/gabepaez), [Andy Trevorah](https://github.com/trevorah), [Adam Lynch](https://github.com/adam-lynch) and [Rémy Boulanouar](https://github.com/DblK) in the past. This project is currently maintained by [Ayushman Chhabra](https://github.com/ayushmxn).
45
-
46
40
  ## Contributing
47
41
 
48
42
  1. Pick and install a Node version manager
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nw-builder",
3
- "version": "4.0.0-rc.7",
3
+ "version": "4.0.0",
4
4
  "description": "Build NW.js desktop applications for Mac, Windows and Linux.",
5
5
  "keywords": [
6
6
  "NW.js",
@@ -8,7 +8,11 @@
8
8
  "Desktop",
9
9
  "Application"
10
10
  ],
11
- "author": "Steffen Müller <steffen@mllrsohn.com>",
11
+ "author": {
12
+ "name": "Steffen Müller",
13
+ "email": "steffen@mllrsohn.com",
14
+ "url": "https://github.com/steffenmllr"
15
+ },
12
16
  "license": "MIT",
13
17
  "main": "./src/nwbuild.js",
14
18
  "type": "module",
@@ -18,12 +22,10 @@
18
22
  "url": "https://github.com/nwutils/nw-builder.git"
19
23
  },
20
24
  "scripts": {
21
- "format": "prettier --write ./src",
25
+ "format": "prettier --write \"**/*.{js,md}\"",
22
26
  "lint": "eslint ./src",
23
27
  "docs": "jsdoc ./src/nwbuild.js -d docs",
24
- "demo:run": "cd ./test/demo && node run.js",
25
- "demo:bld": "cd ./test/demo && node bld.js",
26
- "demo:cli": "cd ./test/demo && nwbuild ./nwapp --version=0.69.1 --flavour=sdk --platform=linux --arch=x64 --outDir=./build"
28
+ "demo": "cd ./test/demo && nwbuild ./nwapp --version=0.69.1 --flavour=sdk --platform=linux --arch=x64 --outDir=./build"
27
29
  },
28
30
  "devDependencies": {
29
31
  "eslint": "^8.25.0",
@@ -31,7 +33,7 @@
31
33
  "eslint-plugin-jsdoc": "^39.3.3",
32
34
  "jest": "^29.2.0",
33
35
  "jest-environment-jsdom": "^29.2.0",
34
- "jsdoc": "^3.6.11",
36
+ "jsdoc": "^4.0.0",
35
37
  "jsdom": "^20.0.0",
36
38
  "prettier": "^2.7.1"
37
39
  },
@@ -39,7 +41,7 @@
39
41
  "archiver": "^5.3.1",
40
42
  "cli-progress": "^3.11.2",
41
43
  "extract-zip": "^2.0.1",
42
- "plist": "^3.0.5",
44
+ "plist": "^3.0.6",
43
45
  "progress": "^2.0.3",
44
46
  "rcedit": "^3.0.1",
45
47
  "tar": "^6.1.11",
@@ -1,49 +1,49 @@
1
1
  import fs from "node:fs";
2
2
  import archiver from "archiver";
3
3
 
4
- const compress = (outDir, type="zip") => {
4
+ const compress = (outDir, type = "zip") => {
5
5
  const output = fs.createWriteStream(`${outDir}.${type}`);
6
6
  const archive = archiver("zip");
7
7
 
8
8
  return new Promise((res, rej) => {
9
- output.on('close', function() {
10
- console.log(archive.pointer() + ' total bytes');
11
- console.log('archiver has been finalized and the output file descriptor has closed.');
9
+ output.on("close", function () {
10
+ console.log(archive.pointer() + " total bytes");
11
+ console.log(
12
+ "archiver has been finalized and the output file descriptor has closed.",
13
+ );
12
14
  });
13
15
 
14
16
  // This event is fired when the data source is drained no matter what was the data source.
15
- // It is not part of this library but rather from the NodeJS Stream API.
16
- // @see: https://nodejs.org/api/stream.html#stream_event_end
17
- output.on('end', function() {
18
- console.log('Data has been drained');
19
- res(0);
20
- });
17
+ // It is not part of this library but rather from the NodeJS Stream API.
18
+ // @see: https://nodejs.org/api/stream.html#stream_event_end
19
+ output.on("end", function () {
20
+ console.log("Data has been drained");
21
+ res(0);
22
+ });
21
23
 
22
- archive.on('warning', function(err) {
23
- if (err.code === 'ENOENT') {
24
- // log warning
25
- console.log(err);
26
- } else {
27
- // throw error
24
+ archive.on("warning", function (err) {
25
+ if (err.code === "ENOENT") {
26
+ // log warning
27
+ console.log(err);
28
+ } else {
29
+ // throw error
30
+ console.log(err);
31
+ rej(1);
32
+ }
33
+ });
34
+
35
+ // good practice to catch this error explicitly
36
+ archive.on("error", function (err) {
28
37
  console.log(err);
29
38
  rej(1);
30
- }
31
- });
32
-
33
- // good practice to catch this error explicitly
34
- archive.on('error', function(err) {
35
- console.log(err);
36
- rej(1);
37
- });
38
-
39
- archive.pipe(output);
39
+ });
40
40
 
41
- archive.directory(outDir, false);
41
+ archive.pipe(output);
42
42
 
43
- archive.finalize();
43
+ archive.directory(outDir, false);
44
44
 
45
+ archive.finalize();
45
46
  });
46
-
47
47
  };
48
48
 
49
- export { compress };
49
+ export { compress };
@@ -0,0 +1,88 @@
1
+ import fs from "node:fs/promises";
2
+
3
+ import plist from "plist";
4
+
5
+ const setOsxConfig = async (pkg, outDir, releaseInfo) => {
6
+ // Rename CFBundleDisplayName in Contents/Info.plist
7
+ let contents_info_plist_path = `${outDir}/nwjs.app/Contents/Info.plist`;
8
+ let contents_info_plist_json = plist.parse(
9
+ await fs.readFile(contents_info_plist_path, "utf-8"),
10
+ );
11
+ contents_info_plist_json.CFBundleDisplayName = pkg.name;
12
+ let contents_info_plist = plist.build(contents_info_plist_json);
13
+ await fs.writeFile(contents_info_plist_path, contents_info_plist);
14
+
15
+ // Rename CFBundleDisplayName in Contents/Resources/en.lproj/InfoPlist.strings
16
+
17
+ // Rename Helper apps in Contents/Framework.framework/Versions/n.n.n.n/Helpers
18
+ let helper_app_path_alerts = (name = "nwjs") =>
19
+ `${outDir}/nwjs.app/Contents/Frameworks/nwjs Framework.framework/Versions/${releaseInfo.components.chromium}/Helpers/${name} Helper (Alerts).app`;
20
+ let helper_app_path_gpu = (name = "nwjs") =>
21
+ `${outDir}/nwjs.app/Contents/Frameworks/nwjs Framework.framework/Versions/${releaseInfo.components.chromium}/Helpers/${name} Helper (GPU).app`;
22
+ let helper_app_path_plugin = (name = "nwjs") =>
23
+ `${outDir}/nwjs.app/Contents/Frameworks/nwjs Framework.framework/Versions/${releaseInfo.components.chromium}/Helpers/${name} Helper (Plugin).app`;
24
+ let helper_app_path_renderer = (name = "nwjs") =>
25
+ `${outDir}/nwjs.app/Contents/Frameworks/nwjs Framework.framework/Versions/${releaseInfo.components.chromium}/Helpers/${name} Helper (Renderer).app`;
26
+ let helper_app_path = (name = "nwjs") =>
27
+ `${outDir}/nwjs.app/Contents/Frameworks/nwjs Framework.framework/Versions/${releaseInfo.components.chromium}/Helpers/${name} Helper.app`;
28
+ await fs.rename(helper_app_path_alerts(), helper_app_path_alerts(pkg.name));
29
+ await fs.rename(helper_app_path_gpu(), helper_app_path_gpu(pkg.name));
30
+ await fs.rename(helper_app_path_plugin(), helper_app_path_plugin(pkg.name));
31
+ await fs.rename(
32
+ helper_app_path_renderer(),
33
+ helper_app_path_renderer(pkg.name),
34
+ );
35
+ await fs.rename(helper_app_path(), helper_app_path(pkg.name));
36
+
37
+ let helper_app_alerts_plist_path = `${helper_app_path_alerts(
38
+ pkg.name,
39
+ )}/Contents/Info.plist`;
40
+ let helper_app_gpu_plist_path = `${helper_app_path_gpu(
41
+ pkg.name,
42
+ )}/Contents/Info.plist`;
43
+ let helper_app_plugin_plist_path = `${helper_app_path_plugin(
44
+ pkg.name,
45
+ )}/Contents/Info.plist`;
46
+ let helper_app_render_plist_path = `${helper_app_path_renderer(
47
+ pkg.name,
48
+ )}/Contents/Info.plist`;
49
+ let helper_app_plist_path = `${helper_app_path(
50
+ pkg.name,
51
+ )}/Contents/Info.plist`;
52
+
53
+ let helper_app_alerts_plist_json = plist.parse(
54
+ await fs.readFile(helper_app_alerts_plist_path, "utf-8"),
55
+ );
56
+ let helper_app_gpu_plist_json = plist.parse(
57
+ await fs.readFile(helper_app_gpu_plist_path, "utf-8"),
58
+ );
59
+ let helper_app_plugin_plist_json = plist.parse(
60
+ await fs.readFile(helper_app_plugin_plist_path, "utf-8"),
61
+ );
62
+ let helper_app_render_plist_json = plist.parse(
63
+ await fs.readFile(helper_app_render_plist_path, "utf-8"),
64
+ );
65
+ let helper_app_plist_json = plist.parse(
66
+ await fs.readFile(helper_app_plist_path, "utf-8"),
67
+ );
68
+
69
+ helper_app_alerts_plist_json.CFBundleDisplayName = pkg.name;
70
+ helper_app_gpu_plist_json.CFBundleDisplayName = pkg.name;
71
+ helper_app_render_plist_json.CFBundleDisplayName = pkg.name;
72
+ helper_app_plugin_plist_json.CFBundleDisplayName = pkg.name;
73
+ helper_app_plist_json.CFBundleDisplayName = pkg.name;
74
+
75
+ let helper_app_alerts_plist = plist.build(helper_app_alerts_plist_json);
76
+ let helper_app_gpu_plist = plist.build(helper_app_gpu_plist_json);
77
+ let helper_app_render_plist = plist.build(helper_app_render_plist_json);
78
+ let helper_app_plugin_plist = plist.build(helper_app_plugin_plist_json);
79
+ let helper_app_plist = plist.build(helper_app_plist_json);
80
+
81
+ await fs.writeFile(helper_app_alerts_plist_path, helper_app_alerts_plist);
82
+ await fs.writeFile(helper_app_gpu_plist_path, helper_app_gpu_plist);
83
+ await fs.writeFile(helper_app_plugin_plist_path, helper_app_plugin_plist);
84
+ await fs.writeFile(helper_app_render_plist_path, helper_app_render_plist);
85
+ await fs.writeFile(helper_app_plist_path, helper_app_plist);
86
+ };
87
+
88
+ export { setOsxConfig };
@@ -2,9 +2,10 @@ import fs from "node:fs";
2
2
 
3
3
  import { compress } from "./compress.js";
4
4
  import { setLinuxConfig } from "./linuxCfg.js";
5
+ import { setOsxConfig } from "./osxCfg.js";
5
6
  import { setWinConfig } from "./winCfg.js";
6
7
 
7
- const packager = async (srcDir, nwDir, outDir, platform, zip) => {
8
+ const packager = async (srcDir, nwDir, outDir, platform, zip, releaseInfo) => {
8
9
  fs.rmSync(outDir, { force: true, recursive: true });
9
10
  fs.cpSync(nwDir, outDir, { recursive: true });
10
11
  fs.cpSync(
@@ -31,6 +32,9 @@ const packager = async (srcDir, nwDir, outDir, platform, zip) => {
31
32
  case "win":
32
33
  setWinConfig(pkg, outDir);
33
34
  break;
35
+ case "osx":
36
+ setOsxConfig(pkg, outDir, releaseInfo);
37
+ break;
34
38
  default:
35
39
  break;
36
40
  }
@@ -0,0 +1,21 @@
1
+ import https from "node:https";
2
+
3
+ export const getManifest = (manifestUrl) => {
4
+ let chunks = undefined;
5
+
6
+ return new Promise((resolve, reject) => {
7
+ https.get(manifestUrl, (res) => {
8
+ res.on("data", (chunk) => {
9
+ chunks += chunk;
10
+ });
11
+
12
+ res.on("error", (e) => {
13
+ reject(e);
14
+ });
15
+
16
+ res.on("end", () => {
17
+ resolve(chunks);
18
+ });
19
+ });
20
+ });
21
+ };
@@ -0,0 +1,21 @@
1
+ import fs from "node:fs/promises";
2
+
3
+ import { getManifest } from "./getManifest.js";
4
+
5
+ export const getReleaseInfo = async (version, cacheDir, manifestUrl) => {
6
+ let releaseData = undefined;
7
+ try {
8
+ await fs.access(`${cacheDir}/manifest.json`);
9
+ console.log(`[ INFO ] Manifest file already exists locally under ${cacheDir}`)
10
+ } catch(e) {
11
+ console.log(`[ ERROR ] Manifest file does not exist locally`);
12
+ console.log(`[ INFO ] Downloading latest manifest file under ${cacheDir}`);
13
+ const data = await getManifest(manifestUrl);
14
+ await fs.writeFile(`${cacheDir}/manifest.json`, data.slice(9));
15
+ } finally {
16
+ let manifestData = await fs.readFile(`${cacheDir}/manifest.json`);
17
+ let manifestJson = JSON.parse(manifestData);
18
+ releaseData = manifestJson.versions.find(release => release.version === `v${version}`);
19
+ }
20
+ return releaseData;
21
+ };
package/src/nwbuild.js CHANGED
@@ -1,8 +1,8 @@
1
- import fs from "node:fs";
2
-
1
+ import fs from "node:fs/promises";
3
2
  import { decompress } from "./get/decompress.js";
4
3
  import { develop } from "./run/develop.js";
5
4
  import { download } from "./get/download.js";
5
+ import { getReleaseInfo } from "./get/getReleaseInfo.js";
6
6
  import { remove } from "./get/remove.js";
7
7
  import { packager } from "./bld/package.js";
8
8
 
@@ -33,33 +33,60 @@ const nwbuild = async ({
33
33
  outDir,
34
34
  // flags
35
35
  downloadUrl = "https://dl.nwjs.io",
36
- // manifestUrl = "https://nwjs.io/versions",
36
+ manifestUrl = "https://nwjs.io/versions",
37
37
  noCache = false,
38
38
  zip = false,
39
39
  run = false,
40
40
  }) => {
41
- // validate inputs
41
+ let pkgPath = `${srcDir}/package.json`;
42
+ let pkgExist = true;
43
+ let pkgData = null;
44
+
45
+ try {
46
+ await fs.access(pkgPath, fs.constants.F_OK);
47
+ } catch (e) {
48
+ pkgExist = false;
49
+ }
50
+
51
+ if (pkgExist === true) {
52
+ pkgData = await fs.readFile(pkgPath, "utf8");
53
+ pkgData = JSON.parse(pkgData);
54
+ if (pkgData.nwbuild !== undefined) {
55
+ srcDir = pkgData.nwbuild.srcDir ?? srcDir;
56
+ cacheDir = pkgData.nwbuild.cacheDir ?? cacheDir;
57
+ version = pkgData.nwbuild.version ?? version;
58
+ flavour = pkgData.nwbuild.flavour ?? flavour;
59
+ platform = pkgData.nwbuild.platform ?? platform;
60
+ arch = pkgData.nwbuild.arch ?? arch;
61
+ outDir = pkgData.nwbuild.outDir ?? outDir;
62
+ }
63
+ }
42
64
 
65
+ let releaseInfo = await getReleaseInfo(version, cacheDir, manifestUrl);
43
66
  let nwDir = `${cacheDir}/nwjs${
44
67
  flavour === "sdk" ? "-sdk" : ""
45
68
  }-v${version}-${platform}-${arch}`;
46
69
 
47
- if (noCache === true || fs.existsSync(nwDir) === false) {
48
- await fs.rmSync(nwDir, { force: true, recursive: true });
70
+ let fileExists = true;
71
+
72
+ try {
73
+ await fs.access(nwDir, fs.constants.F_OK);
74
+ } catch (e) {
75
+ fileExists = false;
76
+ }
77
+
78
+ if (noCache === true || fileExists === false) {
79
+ await fs.rm(nwDir, { force: true, recursive: true });
49
80
  await download(version, flavour, platform, arch, downloadUrl, cacheDir);
50
81
  await decompress(platform, cacheDir);
51
82
  await remove(platform, cacheDir);
52
83
  }
53
84
 
54
- // run app
55
-
56
85
  if (run === true) {
57
86
  await develop(srcDir, nwDir, platform);
58
87
  } else {
59
- await packager(srcDir, nwDir, outDir, platform, zip);
88
+ await packager(srcDir, nwDir, outDir, platform, zip, releaseInfo);
60
89
  }
61
-
62
- // macos config
63
90
  };
64
91
 
65
- export default nwbuild;
92
+ export { nwbuild };
@@ -1,4 +1,14 @@
1
1
  {
2
2
  "name": "nwdemo",
3
- "main": "index.html"
3
+ "main": "index.html",
4
+ "product_string": "nwdemo",
5
+ "nwbuild": {
6
+ "srcDir": "./nwapp",
7
+ "version": "0.70.1",
8
+ "flavour": "sdk",
9
+ "platform": "osx",
10
+ "arch": "x64",
11
+ "outDir": "./build",
12
+ "run": false
13
+ }
4
14
  }
package/test/demo/bld.js DELETED
@@ -1,12 +0,0 @@
1
- import { nwbuild } from "../../src/nwbuild.js";
2
-
3
- nwbuild({
4
- srcDir: "./nwapp",
5
- cacheDir: "./cache",
6
- version: "0.69.1",
7
- flavour: "sdk",
8
- platform: "linux",
9
- arch: "x64",
10
- outDir: "./build",
11
- zip: true,
12
- });
package/test/demo/run.js DELETED
@@ -1,12 +0,0 @@
1
- import { nwbuild } from "../../src/nwbuild.js";
2
-
3
- nwbuild({
4
- srcDir: "./nwapp",
5
- cacheDir: "./cache",
6
- version: "0.69.1",
7
- flavour: "sdk",
8
- platform: "linux",
9
- arch: "x64",
10
- outDir: "./build",
11
- run: true,
12
- });