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.
- package/.github/{CHANGELOG.md → CHANGELOG-3.md} +0 -0
- package/.github/workflows/cd.yml +1 -1
- package/.github/workflows/ci.yml +2 -2
- package/README.md +3 -9
- package/package.json +10 -8
- package/src/bld/compress.js +30 -30
- package/src/bld/osxCfg.js +88 -0
- package/src/bld/package.js +5 -1
- package/src/get/getManifest.js +21 -0
- package/src/get/getReleaseInfo.js +21 -0
- package/src/nwbuild.js +39 -12
- package/test/demo/nwapp/package.json +11 -1
- package/test/demo/bld.js +0 -12
- package/test/demo/run.js +0 -12
|
File without changes
|
package/.github/workflows/cd.yml
CHANGED
package/.github/workflows/ci.yml
CHANGED
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
|
|
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":
|
|
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
|
|
25
|
+
"format": "prettier --write \"**/*.{js,md}\"",
|
|
22
26
|
"lint": "eslint ./src",
|
|
23
27
|
"docs": "jsdoc ./src/nwbuild.js -d docs",
|
|
24
|
-
"demo
|
|
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": "^
|
|
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.
|
|
44
|
+
"plist": "^3.0.6",
|
|
43
45
|
"progress": "^2.0.3",
|
|
44
46
|
"rcedit": "^3.0.1",
|
|
45
47
|
"tar": "^6.1.11",
|
package/src/bld/compress.js
CHANGED
|
@@ -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(
|
|
10
|
-
console.log(archive.pointer() +
|
|
11
|
-
console.log(
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
41
|
+
archive.pipe(output);
|
|
42
42
|
|
|
43
|
-
|
|
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 };
|
package/src/bld/package.js
CHANGED
|
@@ -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
|
-
|
|
36
|
+
manifestUrl = "https://nwjs.io/versions",
|
|
37
37
|
noCache = false,
|
|
38
38
|
zip = false,
|
|
39
39
|
run = false,
|
|
40
40
|
}) => {
|
|
41
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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
|
|
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