1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.computeElectronVersion = exports.getElectronPackage = exports.getElectronVersionFromInstalled = exports.getElectronVersion = void 0;
|
4 | const search_module_1 = require("@electron/rebuild/lib/search-module");
|
5 | const builder_util_1 = require("builder-util");
|
6 | const builder_util_runtime_1 = require("builder-util-runtime");
|
7 | const nodeHttpExecutor_1 = require("builder-util/out/nodeHttpExecutor");
|
8 | const fs_extra_1 = require("fs-extra");
|
9 | const path = require("path");
|
10 | const read_config_file_1 = require("read-config-file");
|
11 | const semver = require("semver");
|
12 | const config_1 = require("../util/config");
|
13 | const electronPackages = ["electron", "electron-prebuilt", "electron-prebuilt-compile", "electron-nightly"];
|
14 | async function getElectronVersion(projectDir, config) {
|
15 | if (config == null) {
|
16 | config = await (0, config_1.getConfig)(projectDir, null, null);
|
17 | }
|
18 | if (config.electronVersion != null) {
|
19 | return config.electronVersion;
|
20 | }
|
21 | return computeElectronVersion(projectDir);
|
22 | }
|
23 | exports.getElectronVersion = getElectronVersion;
|
24 | async function getElectronVersionFromInstalled(projectDir) {
|
25 | for (const name of electronPackages) {
|
26 | try {
|
27 | return (await (0, fs_extra_1.readJson)(path.join(projectDir, "node_modules", name, "package.json"))).version;
|
28 | }
|
29 | catch (e) {
|
30 | if (e.code !== "ENOENT") {
|
31 | builder_util_1.log.warn({ name, error: e }, `cannot read electron version package.json`);
|
32 | }
|
33 | }
|
34 | }
|
35 | return null;
|
36 | }
|
37 | exports.getElectronVersionFromInstalled = getElectronVersionFromInstalled;
|
38 | async function getElectronPackage(projectDir) {
|
39 | for (const name of electronPackages) {
|
40 | try {
|
41 | return await (0, fs_extra_1.readJson)(path.join(projectDir, "node_modules", name, "package.json"));
|
42 | }
|
43 | catch (e) {
|
44 | if (e.code !== "ENOENT") {
|
45 | builder_util_1.log.warn({ name, error: e }, `cannot find electron in package.json`);
|
46 | }
|
47 | }
|
48 | }
|
49 | return null;
|
50 | }
|
51 | exports.getElectronPackage = getElectronPackage;
|
52 |
|
53 | async function computeElectronVersion(projectDir) {
|
54 | const result = await getElectronVersionFromInstalled(projectDir);
|
55 | if (result != null) {
|
56 | return result;
|
57 | }
|
58 | const potentialRootDirs = [projectDir, await (0, search_module_1.getProjectRootPath)(projectDir)];
|
59 | let dependency = null;
|
60 | for await (const dir of potentialRootDirs) {
|
61 | const metadata = await (0, read_config_file_1.orNullIfFileNotExist)((0, fs_extra_1.readJson)(path.join(dir, "package.json")));
|
62 | dependency = metadata ? findFromPackageMetadata(metadata) : null;
|
63 | if (dependency) {
|
64 | break;
|
65 | }
|
66 | }
|
67 | if ((dependency === null || dependency === void 0 ? void 0 : dependency.name) === "electron-nightly") {
|
68 | builder_util_1.log.info("You are using a nightly version of electron, be warned that those builds are highly unstable.");
|
69 | const feedXml = await nodeHttpExecutor_1.httpExecutor.request({
|
70 | hostname: "github.com",
|
71 | path: `/electron/nightlies/releases.atom`,
|
72 | headers: {
|
73 | accept: "application/xml, application/atom+xml, text/xml, */*",
|
74 | },
|
75 | });
|
76 | const feed = (0, builder_util_runtime_1.parseXml)(feedXml);
|
77 | const latestRelease = feed.element("entry", false, `No published versions on GitHub`);
|
78 | const v = /\/tag\/v?([^/]+)$/.exec(latestRelease.element("link").attribute("href"))[1];
|
79 | return v.startsWith("v") ? v.substring(1) : v;
|
80 | }
|
81 | else if ((dependency === null || dependency === void 0 ? void 0 : dependency.version) === "latest") {
|
82 | builder_util_1.log.warn('Electron version is set to "latest", but it is recommended to set it to some more restricted version range.');
|
83 | try {
|
84 | const releaseInfo = JSON.parse((await nodeHttpExecutor_1.httpExecutor.request({
|
85 | hostname: "github.com",
|
86 | path: `/electron/${dependency.name === "electron-nightly" ? "nightlies" : "electron"}/releases/latest`,
|
87 | headers: {
|
88 | accept: "application/json",
|
89 | },
|
90 | })));
|
91 | const version = releaseInfo.tag_name.startsWith("v") ? releaseInfo.tag_name.substring(1) : releaseInfo.tag_name;
|
92 | builder_util_1.log.info({ version }, `resolve ${dependency.name}@${dependency.version}`);
|
93 | return version;
|
94 | }
|
95 | catch (e) {
|
96 | builder_util_1.log.warn(e);
|
97 | }
|
98 | throw new builder_util_1.InvalidConfigurationError(`Cannot find electron dependency to get electron version in the '${path.join(projectDir, "package.json")}'`);
|
99 | }
|
100 | const version = dependency === null || dependency === void 0 ? void 0 : dependency.version;
|
101 | if (version == null || !/^\d/.test(version)) {
|
102 | const versionMessage = version == null ? "" : ` and version ("${version}") is not fixed in project`;
|
103 | throw new builder_util_1.InvalidConfigurationError(`Cannot compute electron version from installed node modules - none of the possible electron modules are installed${versionMessage}.\nSee https://github.com/electron-userland/electron-builder/issues/3984#issuecomment-504968246`);
|
104 | }
|
105 | return semver.coerce(version).format();
|
106 | }
|
107 | exports.computeElectronVersion = computeElectronVersion;
|
108 | function findFromPackageMetadata(packageData) {
|
109 | for (const name of electronPackages) {
|
110 | const devDependencies = packageData.devDependencies;
|
111 | let dep = devDependencies == null ? null : devDependencies[name];
|
112 | if (dep == null) {
|
113 | const dependencies = packageData.dependencies;
|
114 | dep = dependencies == null ? null : dependencies[name];
|
115 | }
|
116 | if (dep != null) {
|
117 | return { name, version: dep };
|
118 | }
|
119 | }
|
120 | return null;
|
121 | }
|
122 |
|
\ | No newline at end of file |