diff --git a/src/interfaces/appstore.js b/src/interfaces/appstore.js index ba442c235..cfc17d592 100644 --- a/src/interfaces/appstore.js +++ b/src/interfaces/appstore.js @@ -21,7 +21,7 @@ const { installModule, removeModule } = require('../modules') const { isTheServerModule, findModulesWithKeyword, - getLatestServerVersion, + getLatestServerVersionInfo, getAuthor } = require('../modules') const { SERVERROUTESPREFIX } = require('../constants') @@ -123,9 +123,9 @@ module.exports = function(app) { app.get(`${SERVERROUTESPREFIX}/appstore/available/`, (req, res) => { findPluginsAndWebapps() .then(([plugins, webapps]) => { - getLatestServerVersion(app.config.version) - .then(serverVersion => { - const result = getAllModuleInfo(plugins, webapps, serverVersion) + getLatestServerVersionInfo(app.config.version) + .then(({version}) => { + const result = getAllModuleInfo(plugins, webapps, version) res.send(JSON.stringify(result)) }) .catch(err => { @@ -172,7 +172,8 @@ module.exports = function(app) { updates: [], installing: [], storeAvailable: true, - isInDocker: process.env.IS_IN_DOCKER === 'true' + isInDocker: process.env.IS_IN_DOCKER === 'true', + nodeVersion: {} } } diff --git a/src/modules.test.js b/src/modules.test.js index ffb04d48b..1c5b2a39b 100644 --- a/src/modules.test.js +++ b/src/modules.test.js @@ -58,6 +58,7 @@ describe('modulesWithKeyword', () => { }) describe('checkForNewServerVersion', () => { + const newMinorVersionInfo = { version: '1.18.0', disttag: 'latest', minimumNodeVersio: '10'} it('normal version upgrade', done => { checkForNewServerVersion( '1.17.0', @@ -65,77 +66,82 @@ describe('checkForNewServerVersion', () => { if (err) { done(err) } else { - chai.expect(newVersion).to.equal('1.18.0') + chai.expect(newVersion).to.equal(newMinorVersionInfo.version) done() } }, - () => Promise.resolve('1.18.0') + () => Promise.resolve(newMinorVersionInfo) ) }) it('normal version does not upgrade to beta', done => { + const newBetaVersion = { version: '1.18.0-beta.2', disttag: 'latest', minimumNodeVersio: '10'} checkForNewServerVersion( '1.17.0', err => { done('callback should not be called') }, - () => Promise.resolve('1.18.0-beta.1') + () => Promise.resolve(newBetaVersion) ) done() }) it('beta upgrades to same minor newer beta', done => { + const newerBetaVersionInfo = { version: '1.18.0-beta.2', disttag: 'latest', minimumNodeVersio: '10'} checkForNewServerVersion( '1.18.0-beta.1', (err, newVersion) => { if (err) { done(err) } else { - chai.expect(newVersion).to.equal('1.18.0-beta.2') + chai.expect(newVersion).to.equal(newerBetaVersionInfo.version) done() } }, - () => Promise.resolve('1.18.0-beta.2') + () => Promise.resolve(newerBetaVersionInfo) ) }) it('beta upgrades to same normal version', done => { + const sameNormalVersion = { version: '1.18.0', disttag: 'latest', minimumNodeVersio: '10'} checkForNewServerVersion( '1.18.0-beta.2', (err, newVersion) => { if (err) { done(err) } else { - chai.expect(newVersion).to.equal('1.18.0') + chai.expect(newVersion).to.equal(sameNormalVersion.version) done() } }, - () => Promise.resolve('1.18.0') + () => Promise.resolve(sameNormalVersion) ) }) it('beta upgrades to newer normal version', done => { + const newerNormalVersion = { version: '1.19.0', disttag: 'latest', minimumNodeVersio: '10'} checkForNewServerVersion( '1.18.0-beta.2', (err, newVersion) => { if (err) { done(err) } else { - chai.expect(newVersion).to.equal('1.19.0') + chai.expect(newVersion).to.equal(newerNormalVersion.version) done() } }, - () => Promise.resolve('1.19.0') + () => Promise.resolve(newerNormalVersion) ) }) it('beta does not upgrade to newer minor beta', done => { + const nextMinorBetaVersion = { version: '1.18.0-beta.2', disttag: 'latest', minimumNodeVersio: '10'} checkForNewServerVersion( '1.17.0-beta.1', err => { done('callback should not be called') }, - () => Promise.resolve('1.18.0-beta.2') + () => Promise.resolve(nextMinorBetaVersion) ) done() }) diff --git a/src/modules.ts b/src/modules.ts index 18cadd0f7..07b204215 100644 --- a/src/modules.ts +++ b/src/modules.ts @@ -268,10 +268,16 @@ function doFetchDistTags() { return fetch('http://registry.npmjs.org/-/package/signalk-server/dist-tags') } -function getLatestServerVersion( +export interface ServerVersionInfo { + version: string + disttag: string + minimumNodeVersion: string +} + +function getLatestServerVersionInfo( currentVersion: string, distTags = doFetchDistTags -): Promise { +): Promise { return new Promise((resolve, reject) => { distTags() .then(npmjsResults => npmjsResults.json()) @@ -279,14 +285,29 @@ function getLatestServerVersion( const prereleaseData = semver.prerelease(currentVersion) if (prereleaseData) { if (semver.satisfies(npmjsParsed.latest, `>${currentVersion}`)) { - resolve(npmjsParsed.latest) + return [npmjsParsed.latest, 'latest'] } else { - resolve(npmjsParsed[prereleaseData[0]]) + return [npmjsParsed[prereleaseData[0]], 'beta'] } } else { - resolve(npmjsParsed.latest) + return([npmjsParsed.latest, 'latest']) } }) + .then(([version, disttag]) => { + return fetch('https://registry.npmjs.org/signalk-server', { + headers: { + Accept: 'application/vnd.npm.install-v1+json' + } + }) + .then(res => res.json()) + .then(moduleMetadata => { + resolve({ + version, + disttag, + minimumNodeVersion: `${moduleMetadata.versions[version].engines}` + }) + }) + }) .catch(reject) }) } @@ -299,10 +320,10 @@ function checkForNewServerVersion( ) => any, getLatestServerVersionP: ( version: string - ) => Promise = getLatestServerVersion + ) => Promise = getLatestServerVersionInfo ) { getLatestServerVersionP(currentVersion) - .then((version: string) => { + .then(({version}) => { if (semver.satisfies(new SemVer(version), `>${currentVersion}`)) { serverUpgradeIsAvailable(undefined, version) } @@ -331,7 +352,7 @@ module.exports = { removeModule, isTheServerModule, findModulesWithKeyword, - getLatestServerVersion, + getLatestServerVersionInfo, checkForNewServerVersion, getAuthor, restoreModules