nw-builder 3.8.3-beta.1 → 3.8.4

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.
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.8.4] - 2022-09-20
11
+
12
+ ### Changed
13
+
14
+ - Refactor download function
15
+
16
+ ## [3.8.3-beta.1]
17
+
18
+ ### Changed
19
+
20
+ - Check for first instance of `package.json`
21
+
10
22
  ## [3.8.3] - 2022-08-26
11
23
 
12
24
  ### Changed
package/README.md CHANGED
@@ -32,6 +32,10 @@ Using pnpm:
32
32
  pnpm add nw-builder
33
33
  ```
34
34
 
35
+ ## Usage
36
+
37
+ Check out the the demo under `/test/demo` directory for examples of module usage. For CLI, type in `nwbuild --help` in your terminal.
38
+
35
39
  ## API Reference
36
40
 
37
41
  > Stay up to date via the [Changelog](https://github.com/nwjs-community/nw-builder/blob/master/.github/CHANGELOG.md).
package/bin/nwbuild.cjs CHANGED
@@ -149,4 +149,4 @@ if (cli.mode === "build") {
149
149
  nw.build();
150
150
  } else {
151
151
  nw.run();
152
- }
152
+ }
package/lib/index.cjs CHANGED
@@ -1,3 +1,4 @@
1
+ const { existsSync } = require("node:fs");
1
2
  var _ = require("lodash");
2
3
  var inherits = require("inherits");
3
4
  var EventEmitter = require("events").EventEmitter;
@@ -11,6 +12,7 @@ var spawn = require("child_process").spawn;
11
12
  var semver = require("semver");
12
13
  var platformOverrides = require("./platformOverrides.cjs");
13
14
  var deprecate = require("deprecate");
15
+ const { install } = require("nw-install");
14
16
 
15
17
  const {
16
18
  checkCache,
@@ -23,20 +25,6 @@ const {
23
25
  var NwVersions = require("./versions.cjs");
24
26
  var Version = require("./Version.cjs");
25
27
  var Utils = require("./utils.cjs");
26
- var Downloader = require("./downloader.cjs");
27
- // var platforms = require("./platforms.cjs");
28
-
29
- var pkg = require("../package.json");
30
-
31
- (async () => {
32
- let updateNotifier = undefined;
33
- try {
34
- updateNotifier = await import("update-notifier");
35
- updateNotifier.default({ pkg }).notify();
36
- } catch (e) {
37
- console.error(e);
38
- }
39
- })();
40
28
 
41
29
  // We inherit from EventEmitter for logging
42
30
  inherits(NwBuilder, EventEmitter);
@@ -325,74 +313,35 @@ NwBuilder.prototype.platformFilesForVersion = function () {
325
313
  return Promise.resolve();
326
314
  };
327
315
 
328
- NwBuilder.prototype.downloadNwjs = function () {
329
- var self = this,
330
- downloads = [];
331
-
332
- this._forEachPlatform(function (name, platform) {
333
- self.setPlatformCacheDirectory(
334
- name,
335
- platform,
336
- self._version.version,
337
- self._version.flavor,
338
- );
339
- platform.url = self._version.platforms[name + "-" + self._version.flavor];
340
-
341
- // Ensure that there is a cache folder
342
- if (self.options.forceDownload) {
343
- fs.removeSync(platform.cache);
344
- }
345
-
346
- fs.mkdirpSync(platform.cache);
347
- self.emit(
348
- "log",
349
- "Create cache folder in " +
350
- path.resolve(
351
- self.options.cacheDir,
352
- self._version.version + "-" + self._version.flavor,
353
- ),
354
- );
355
-
316
+ NwBuilder.prototype.downloadNwjs = async function () {
317
+ let options = this.options;
318
+ for await (let osName of options.platforms) {
319
+ let plat = osName.slice(0, osName.length - 2);
320
+ let arch =
321
+ osName.slice(osName.length - 2, osName.length) === "32" ? "ia32" : "x64";
322
+ this._platforms[osName].url =
323
+ this._version.platforms[osName + "-" + this._version.flavor];
324
+ this._platforms[
325
+ osName
326
+ ].cache = `${this.options.cacheDir}/${this.options.version}-${this.options.flavor}/${osName}/nwjs-${this.options.flavor}-v${this.options.version}-${plat}-${arch}`;
356
327
  if (
357
- !self.isPlatformCached(
358
- name,
359
- platform,
360
- self._version.version,
361
- self._version.flavor,
362
- )
328
+ options.forceDownload === true ||
329
+ existsSync(
330
+ `${this.options.cacheDir}/${this.options.version}-${this.options.flavor}/${osName}/nwjs-${this.options.flavor}-v${this.options.version}-${plat}-${arch}`,
331
+ ) === false
363
332
  ) {
364
- downloads.push(
365
- Downloader.downloadAndUnpack(platform.cache, platform.url).catch(
366
- function (err) {
367
- if (err.statusCode === 404) {
368
- self.emit(
369
- "log",
370
- "ERROR: The version " +
371
- self._version.version +
372
- " (" +
373
- self._version.flavor +
374
- ") does not have a corresponding build posted at " +
375
- self.options.downloadUrl +
376
- ". Please choose a version from that list.",
377
- );
378
- } else {
379
- self.emit("log", err.msg);
380
- }
381
-
382
- return Promise.reject("Unable to download NWjs.");
383
- },
384
- ),
333
+ await install(
334
+ this.options.version,
335
+ this.options.flavor,
336
+ plat,
337
+ arch,
338
+ "https://nwjs.io",
339
+ "https://dl.nwjs.io",
340
+ `${this.options.cacheDir}/${this.options.version}-${this.options.flavor}/${osName}`,
341
+ `nwjs-${this.options.flavor}-v${this.options.version}-${plat}-${arch}`,
385
342
  );
386
- self.emit("log", "Downloading: " + platform.url);
387
- } else {
388
- self.emit("log", "Using cache for: " + name);
389
343
  }
390
- });
391
-
392
- return Promise.all(downloads).then(function (data) {
393
- Downloader.clearProgressbar();
394
- return data;
395
- });
344
+ }
396
345
  };
397
346
 
398
347
  NwBuilder.prototype.buildGypModules = function () {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nw-builder",
3
- "version": "3.8.3-beta.1",
3
+ "version": "3.8.4",
4
4
  "description": "Build NW.js desktop applications for Mac, Windows and Linux.",
5
5
  "keywords": [
6
6
  "NW.js",
@@ -10,10 +10,6 @@
10
10
  "author": "Steffen Müller <steffen@mllrsohn.com>",
11
11
  "license": "MIT",
12
12
  "main": "./lib/index.cjs",
13
- "exports": {
14
- "import": "./src/api/nwbuild.js",
15
- "require": "./lib/index.cjs"
16
- },
17
13
  "type": "module",
18
14
  "homepage": "https://github.com/nwutils/nw-builder",
19
15
  "repository": {
@@ -25,14 +21,12 @@
25
21
  "lint": "eslint ./bin/**.cjs ./lib/**.cjs ./src/**.js",
26
22
  "test": "npm run test:unit && tape './test/*.cjs'",
27
23
  "test:unit": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
28
- "demo:cjs": "cd ./test/demo && npm run start:cjs",
29
- "demo:esm": "cd ./test/demo && npm run start:esm",
24
+ "demo": "cd ./test/demo && npm run start",
30
25
  "demo:cli": "nwbuild ./** --mode=build --platforms=linux32, linux64 --version=0.67.1",
31
26
  "build": "esbuild src/index.js --bundle --minify --platform=node --outfile=./dist/index.cjs"
32
27
  },
33
28
  "devDependencies": {
34
29
  "decompress-zip": "^0.3.3",
35
- "eol": "^0.9.1",
36
30
  "esbuild": "^0.15.2",
37
31
  "eslint": "^8.18.0",
38
32
  "eslint-config-tjw-jsdoc": "^1.0.3",
@@ -48,11 +42,10 @@
48
42
  "dependencies": {
49
43
  "archiver": "^5.3.1",
50
44
  "deprecate": "^1.1.1",
51
- "extract-zip": "^2.0.1",
52
45
  "graceful-fs-extra": "^2.0.0",
53
- "graceful-ncp": "^3.0.0",
54
46
  "inherits": "^2.0.4",
55
47
  "lodash": "^4.17.21",
48
+ "nw-install": "^0.3.3",
56
49
  "plist": "^3.0.5",
57
50
  "progress": "^2.0.3",
58
51
  "rcedit": "^3.0.1",
@@ -61,10 +54,8 @@
61
54
  "rimraf": "^3.0.2",
62
55
  "semver": "^7.3.7",
63
56
  "simple-glob": "^0.2.0",
64
- "tar-fs": "^2.1.1",
65
57
  "temp": "^0.9.4",
66
58
  "thenify": "^3.3.1",
67
- "update-notifier": "^6.0.2",
68
59
  "winresourcer": "^0.9.0",
69
60
  "yargs": "^17.5.1"
70
61
  },
@@ -2,13 +2,15 @@ const NwBuilder = require("../../lib/index.cjs");
2
2
 
3
3
  const nw = new NwBuilder({
4
4
  files: "./**",
5
- version: "0.67.1"
5
+ version: "0.67.1",
6
+ platforms: ["linux64"],
6
7
  });
7
8
 
8
- nw.run()
9
- .then((msg) => {
10
- console.log(msg);
11
- })
12
- .catch((error) => {
13
- console.log(error)
14
- });
9
+ // Replace `build` with `run` to run the application instead
10
+ nw.build()
11
+ .then((msg) => {
12
+ console.log(msg);
13
+ })
14
+ .catch((error) => {
15
+ console.log(error);
16
+ });
@@ -5,8 +5,7 @@
5
5
  "main": "./index.html",
6
6
  "type": "module",
7
7
  "scripts": {
8
- "start:cjs": "node ./index.cjs",
9
- "start:esm": "node ./index.js"
8
+ "start": "node ./index.cjs"
10
9
  },
11
10
  "window": {
12
11
  "title": "NW.js Demo",
@@ -1,176 +0,0 @@
1
- var request = require("request");
2
- var progress = require("progress");
3
- var fs = require("fs");
4
- var path = require("path");
5
- var zlib = require("zlib");
6
- var tar = require("tar-fs");
7
- var temp = require("temp");
8
- var ncp = require("graceful-ncp").ncp;
9
- var rimraf = require("rimraf");
10
- var extract = require("extract-zip");
11
-
12
- // Automatically track and cleanup files at exit
13
- temp.track();
14
- var isWin = /^win/.test(process.platform);
15
-
16
- // one progressbar for all downloads
17
- var bar;
18
-
19
- module.exports = {
20
- clearProgressbar: function () {
21
- bar && bar.terminate();
22
- bar = null;
23
- },
24
- downloadAndUnpack: function (cachepath, url) {
25
- var extension = path.extname(url),
26
- self = this,
27
- rq = request(url),
28
- len,
29
- stream;
30
-
31
- function format(statusCode) {
32
- return statusCode + ": " + require("http").STATUS_CODES[statusCode];
33
- }
34
-
35
- return new Promise(function (resolve, reject) {
36
- rq.proxy = true;
37
- rq.on("error", function (err) {
38
- bar && bar.terminate();
39
- reject(err);
40
- });
41
- rq.on("response", function (res) {
42
- len = parseInt(res.headers["content-length"], 10);
43
- if (res.statusCode !== 200) {
44
- reject({
45
- statusCode: res.statusCode,
46
- msg: "Recieved status code " + format(res.statusCode),
47
- });
48
- } else if (len) {
49
- if (!bar) {
50
- bar = new progress(" downloading [:bar] :percent :etas", {
51
- complete: "=",
52
- incomplete: "-",
53
- width: 20,
54
- total: len,
55
- });
56
- } else {
57
- bar.total += len;
58
- }
59
- }
60
- });
61
- rq.on("data", function (chunk) {
62
- len && bar && bar.tick(chunk.length);
63
- });
64
-
65
- if (extension === ".zip") {
66
- rq.on("response", function (res) {
67
- if (res.statusCode !== 200) return;
68
- stream = temp.createWriteStream();
69
-
70
- stream.on("finish", function () {
71
- self
72
- .extractZip(stream.path, cachepath)
73
- .then(self.stripRootFolder)
74
- .then(function (files) {
75
- resolve(files);
76
- });
77
- });
78
-
79
- rq.pipe(stream);
80
- });
81
- } else if (extension === ".gz") {
82
- rq.on("response", function (res) {
83
- if (res.statusCode !== 200) return;
84
- self
85
- .extractTar(res, cachepath)
86
- .then(self.stripRootFolder)
87
- .then(function (files) {
88
- resolve(files);
89
- });
90
- });
91
- }
92
- });
93
- },
94
- extractTar: function (tarstream, destination) {
95
- var gunzip = zlib.createGunzip(),
96
- files = [];
97
-
98
- return new Promise(function (resolve, reject) {
99
- tarstream
100
- .pipe(gunzip)
101
- .on("error", function (err) {
102
- reject(err);
103
- })
104
- .pipe(
105
- tar.extract(destination, {
106
- umask: isWin ? false : 0,
107
- map: function (header) {
108
- files.push({ path: path.basename(header.name) });
109
- return header;
110
- },
111
- }),
112
- )
113
- .on("finish", function () {
114
- resolve({ files: files, destination: destination });
115
- });
116
- });
117
- },
118
- extractZip: function (zipfile, destination) {
119
- var files = [];
120
-
121
- var onEntry = function (entry) {
122
- files.push({
123
- mode: entry.externalFileAttributes >>> 16,
124
- path: entry.fileName,
125
- });
126
- };
127
-
128
- return new Promise(function (resolve, reject) {
129
- extract(zipfile, { dir: destination, onEntry: onEntry })
130
- .catch(reject)
131
- .then(function () {
132
- // Setup chmodSync to fix permissions
133
- files.forEach(function (file) {
134
- fs.chmodSync(path.join(destination, file.path), file.mode);
135
- });
136
- resolve({ files, destination });
137
- });
138
- });
139
- },
140
- stripRootFolder: function (extracted) {
141
- var files = extracted.files,
142
- destination = extracted.destination,
143
- rootFiles = fs.readdirSync(destination),
144
- fromDir = path.join(
145
- destination,
146
- rootFiles.length === 1 ? rootFiles[0] : "",
147
- );
148
-
149
- // strip out root folder if it exists
150
- if (rootFiles.length === 1 && fs.statSync(fromDir).isDirectory()) {
151
- // strip folder from files
152
- for (var i = 0; i < files.length; i++) {
153
- var file = files[i];
154
- file.path = path.relative(rootFiles[0], file.path);
155
- if (file.path === "") {
156
- files.splice(i, 1);
157
- i--;
158
- }
159
- }
160
-
161
- return new Promise(function (resolve, reject) {
162
- // move stripped folder to destination
163
- ncp(fromDir, destination, function (err) {
164
- if (err) {
165
- return reject();
166
- } else
167
- rimraf(fromDir, function () {
168
- resolve(files);
169
- });
170
- });
171
- });
172
- } else {
173
- return Promise.resolve(files);
174
- }
175
- },
176
- };
@@ -1,7 +0,0 @@
1
- const nwbuild = () => {
2
- console.log("test if esm import works");
3
- };
4
-
5
- export {
6
- nwbuild,
7
- };
@@ -1,5 +0,0 @@
1
- import { nwbuild } from "../../src/api/nwbuild.js";
2
-
3
- nwbuild();
4
-
5
- export {};
@@ -1,131 +0,0 @@
1
- var test = require("tape"),
2
- nock = require("nock"),
3
- temp = require("temp"),
4
- path = require("path"),
5
- fs = require("fs");
6
-
7
- temp.track();
8
-
9
- var downloader = require("../lib/downloader.cjs");
10
- var fixturesZip = "./test/fixtures/test.zip";
11
- var fixturesZipStrip = "./test/fixtures/test-strip.zip";
12
- var fixturesTar = "./test/fixtures/test.tar.gz";
13
- var isWindows = process.platform === "win32";
14
-
15
- test("downloadAndUnpack: zip", function (t) {
16
- t.plan(isWindows ? 3 : 6);
17
- nock("https://amazon.s3.nw.com")
18
- .get("/test.zip")
19
- .replyWithFile(200, fixturesZip);
20
- temp.mkdir("tmpcache", function (err, dirPath) {
21
- downloader
22
- .downloadAndUnpack(dirPath, "https://amazon.s3.nw.com/test.zip")
23
- .then(function (files) {
24
- files.forEach(function (file) {
25
- t.ok(
26
- fs.existsSync(path.join(dirPath, file.path)),
27
- file.path + " unpacked",
28
- );
29
- });
30
-
31
- if (!isWindows) {
32
- t.ok(
33
- fs.statSync(path.join(dirPath, "file1")).mode.toString(8) == 100444,
34
- "444 file permission",
35
- );
36
- t.ok(
37
- fs.statSync(path.join(dirPath, "file2")).mode.toString(8) == 100666,
38
- "666 file permission",
39
- );
40
- t.ok(
41
- fs.statSync(path.join(dirPath, "file3")).mode.toString(8) == 100644,
42
- "644 file permission",
43
- ); // DOES NOT WORK ON WINDOWS
44
- }
45
- });
46
- });
47
- });
48
-
49
- test("downloadAndUnpack: zip+strip", function (t) {
50
- t.plan(isWindows ? 3 : 6);
51
- nock("https://amazon.s3.nw.com")
52
- .get("/test-strip.zip")
53
- .replyWithFile(200, fixturesZipStrip);
54
- temp.mkdir("tmpcache", function (err, dirPath) {
55
- downloader
56
- .downloadAndUnpack(dirPath, "https://amazon.s3.nw.com/test-strip.zip")
57
- .then(function (files) {
58
- files.forEach(function (file) {
59
- t.ok(
60
- fs.existsSync(path.join(dirPath, file.path)),
61
- file.path + " unpacked",
62
- );
63
- });
64
-
65
- if (!isWindows) {
66
- t.ok(
67
- fs.statSync(path.join(dirPath, "file1")).mode.toString(8) == 100444,
68
- "444 file permission",
69
- );
70
- t.ok(
71
- fs.statSync(path.join(dirPath, "file2")).mode.toString(8) == 100666,
72
- "666 file permission",
73
- );
74
- t.ok(
75
- fs.statSync(path.join(dirPath, "file3")).mode.toString(8) == 100644,
76
- "644 file permission",
77
- ); // DOES NOT WORK ON WINDOWS
78
- }
79
- });
80
- });
81
- });
82
-
83
- test("downloadAndUnpack: tar", function (t) {
84
- t.plan(isWindows ? 3 : 6);
85
- nock("https://amazon.s3.nw.com")
86
- .get("/test.tar.gz")
87
- .replyWithFile(200, fixturesTar);
88
- temp.mkdir("tmpcache", function (err, dirPath) {
89
- downloader
90
- .downloadAndUnpack(dirPath, "https://amazon.s3.nw.com/test.tar.gz")
91
- .then(function (files) {
92
- files.forEach(function (file) {
93
- t.ok(
94
- fs.existsSync(path.join(dirPath, file.path)),
95
- file.path + " unpacked",
96
- );
97
- });
98
-
99
- if (!isWindows) {
100
- t.ok(
101
- fs.statSync(path.join(dirPath, "file1")).mode.toString(8) == 100444,
102
- "444 file permission",
103
- ); // DOES NOT WORK ON WINDOWS
104
- t.ok(
105
- fs.statSync(path.join(dirPath, "file2")).mode.toString(8) == 100666,
106
- "666 file permission",
107
- );
108
- t.ok(
109
- fs.statSync(path.join(dirPath, "file3")).mode.toString(8) == 100644,
110
- "644 file permission",
111
- ); // DOES NOT WORK ON WINDOWS
112
- }
113
- });
114
- });
115
- });
116
-
117
- test("Should throw an error if you try to download a file that is not available", function (t) {
118
- t.plan(2);
119
- nock("https://doesnot.com").get("/exist.zip").reply(404);
120
- downloader
121
- .downloadAndUnpack("/", "https://doesnot.com/exist.zip")
122
- .catch(function (err) {
123
- t.equal(err.statusCode, 404, err.msg);
124
- });
125
- nock("https://doesnot.com").get("/exist.tar").reply(404);
126
- downloader
127
- .downloadAndUnpack("/", "https://doesnot.com/exist.tar")
128
- .catch(function (err) {
129
- t.equal(err.statusCode, 404, err.msg);
130
- });
131
- });