From 244abfbaaed2999bdf2c7ae688f7db99c1cba2c2 Mon Sep 17 00:00:00 2001 From: develar Date: Tue, 21 Jan 2020 08:23:18 +0100 Subject: [PATCH] feat: support resolving of `latest` version for electron-nightly --- .circleci/config.yml | 2 +- .idea/dictionaries/develar.xml | 1 + docker/node/Dockerfile | 2 +- .../src/electron/electronVersion.ts | 54 ++++++++++--------- .../src/providers/GitHubProvider.ts | 1 - test/out/__snapshots__/ExtraBuildTest.js.snap | 6 +++ test/src/ExtraBuildTest.ts | 12 +++++ 7 files changed, 49 insertions(+), 29 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 20177117aa..110c581868 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2 jobs: build: docker: - - image: circleci/node:12.13.1 + - image: circleci/node:12.14.1 steps: - checkout - restore_cache: diff --git a/.idea/dictionaries/develar.xml b/.idea/dictionaries/develar.xml index 1bd6e0d4db..9a263a3c6c 100644 --- a/.idea/dictionaries/develar.xml +++ b/.idea/dictionaries/develar.xml @@ -267,6 +267,7 @@ napi netlify nevershow + nightlies nokeys nomacver noninteractive diff --git a/docker/node/Dockerfile b/docker/node/Dockerfile index 8522a6bb8a..a34ae68cb7 100644 --- a/docker/node/Dockerfile +++ b/docker/node/Dockerfile @@ -1,6 +1,6 @@ FROM electronuserland/builder:base -ENV NODE_VERSION 12.13.1 +ENV NODE_VERSION 12.14.1 # this package is used for snapcraft and we should not clear apt list - to avoid apt-get update during snap build RUN curl -L https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz | tar xz -C /usr/local --strip-components=1 && \ diff --git a/packages/app-builder-lib/src/electron/electronVersion.ts b/packages/app-builder-lib/src/electron/electronVersion.ts index 577a3219dd..d574e5cc10 100644 --- a/packages/app-builder-lib/src/electron/electronVersion.ts +++ b/packages/app-builder-lib/src/electron/electronVersion.ts @@ -1,4 +1,5 @@ import { InvalidConfigurationError, log } from "builder-util" +import { parseXml } from "builder-util-runtime" import { httpExecutor } from "builder-util/out/nodeHttpExecutor" import { readJson } from "fs-extra" import { Lazy } from "lazy-val" @@ -57,32 +58,27 @@ export async function computeElectronVersion(projectDir: string, projectMetadata return result } - const electronVersionFromMetadata = findFromPackageMetadata(await projectMetadata!!.value) - const electronPackageName = findFromPackageMetadata(await projectMetadata!!.value) - - if (electronPackageName === "electron-nightly") { - log.warn("You are using a nightly version of electron, be warned that those builds are highly unstable.") - try { - const releaseInfo = JSON.parse((await httpExecutor.request({ - hostname: "github.com", - path: "/electron/nightlies/releases/latest", - headers: { - accept: "application/json", - }, - }))!!) - return (releaseInfo.tag_name.startsWith("v")) ? releaseInfo.tag_name.substring(1) : releaseInfo.tag_name - } - catch (e) { - log.warn(e) - } - throw new InvalidConfigurationError(`Cannot find electron in '${path.join(projectDir, "package.json")}'`) + const dependency = findFromPackageMetadata(await projectMetadata!!.value) + if (dependency?.name === "electron-nightly") { + log.info("You are using a nightly version of electron, be warned that those builds are highly unstable.") + const feedXml = await httpExecutor.request({ + hostname: "github.com", + path: `/electron/nightlies/releases.atom`, + headers: { + accept: "application/xml, application/atom+xml, text/xml, */*", + }, + }) + const feed = parseXml(feedXml!!) + const latestRelease = feed.element("entry", false, `No published versions on GitHub`) + const v = latestRelease.element("link").attribute("href").match(/\/tag\/v?([^\/]+)$/)!![1] + return v.startsWith("v") ? v.substring(1) : v } - else if (electronPackageName === "electron" || electronPackageName === "electron-prebuilt" || electronPackageName === "electron-prebuilt-compile" && electronVersionFromMetadata === "latest") { + else if (dependency?.version === "latest") { log.warn("Electron version is set to \"latest\", but it is recommended to set it to some more restricted version range.") try { const releaseInfo = JSON.parse((await httpExecutor.request({ hostname: "github.com", - path: "/electron/electron/releases/latest", + path: `/electron/${dependency?.name === "electron-nightly" ? "nightlies" : "electron"}/releases/latest`, headers: { accept: "application/json", }, @@ -96,15 +92,21 @@ export async function computeElectronVersion(projectDir: string, projectMetadata throw new InvalidConfigurationError(`Cannot find electron dependency to get electron version in the '${path.join(projectDir, "package.json")}'`) } - if (electronVersionFromMetadata == null || !/^\d/.test(electronVersionFromMetadata)) { - const versionMessage = electronVersionFromMetadata == null ? "" : ` and version ("${electronVersionFromMetadata}") is not fixed in project` + const version = dependency?.version + if (version == null || !/^\d/.test(version)) { + const versionMessage = version == null ? "" : ` and version ("${version}") is not fixed in project` throw new 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`) } - return semver.coerce(electronVersionFromMetadata)!!.toString() + return semver.coerce(version)!!.toString() +} + +interface NameAndVersion { + readonly name: string + readonly version: string } -function findFromPackageMetadata(packageData: any): string | null { +function findFromPackageMetadata(packageData: any): NameAndVersion | null { for (const name of electronPackages) { const devDependencies = packageData.devDependencies let dep = devDependencies == null ? null : devDependencies[name] @@ -113,7 +115,7 @@ function findFromPackageMetadata(packageData: any): string | null { dep = dependencies == null ? null : dependencies[name] } if (dep != null) { - return dep + return {name, version: dep} } } return null diff --git a/packages/electron-updater/src/providers/GitHubProvider.ts b/packages/electron-updater/src/providers/GitHubProvider.ts index 7cf3d4edff..372f5c0153 100644 --- a/packages/electron-updater/src/providers/GitHubProvider.ts +++ b/packages/electron-updater/src/providers/GitHubProvider.ts @@ -59,7 +59,6 @@ export class GitHubProvider extends BaseGitHubProvider { break } } - } } catch (e) { diff --git a/test/out/__snapshots__/ExtraBuildTest.js.snap b/test/out/__snapshots__/ExtraBuildTest.js.snap index 988a0c01df..3758647dea 100644 --- a/test/out/__snapshots__/ExtraBuildTest.js.snap +++ b/test/out/__snapshots__/ExtraBuildTest.js.snap @@ -127,3 +127,9 @@ Object { "linux": Array [], } `; + +exports[`retrieve latest electron-nightly version 1`] = ` +Object { + "linux": Array [], +} +`; diff --git a/test/src/ExtraBuildTest.ts b/test/src/ExtraBuildTest.ts index 0318940cf2..85d68f8471 100644 --- a/test/src/ExtraBuildTest.ts +++ b/test/src/ExtraBuildTest.ts @@ -69,6 +69,18 @@ test.ifAll.ifLinuxOrDevMac("retrieve latest electron version", app({ }), })) +test.ifAll.ifLinuxOrDevMac("retrieve latest electron-nightly version", app({ + targets: linuxDirTarget, +}, { + projectDirCreated: projectDir => modifyPackageJson(projectDir, data => { + data.devDependencies = { + ...data.devDependencies, + "electron-nightly": "latest", + } + delete data.build.electronVersion + }), +})) + test.ifAll.ifDevOrLinuxCi("override targets in the config", app({ targets: linuxDirTarget, }, {