Files
cloudron-box/release/versionsformat.js
2015-09-17 12:11:14 -07:00

72 lines
3.1 KiB
JavaScript

#!/usr/bin/env node
'use strict';
var fs = require('fs'),
safe = require('safetydance'),
semver = require('semver'),
util = require('util'),
url = require('url');
exports = module.exports = {
verifyFile: verifyFile,
verify: verify
};
function verify(versionsJson) {
if (!versionsJson || typeof versionsJson !== 'object') return new Error('versions must be valid object');
// check all the keys
var sortedVersions = Object.keys(versionsJson).sort(semver.compare);
for (var i = 0; i < sortedVersions.length; i++) {
var version = sortedVersions[i];
var versionInfo = versionsJson[version];
if (typeof versionInfo.imageId !== 'number') return new Error('version ' + version + ' does not have proper imageId');
if (typeof versionInfo.imageName !== 'string' || !versionInfo.imageName.length) return new Error('version ' + version + ' does not have proper imageName');
if ('changeLog' in versionsJson[version] && !util.isArray(versionInfo.changeLog)) return new Error('version ' + version + ' does not have proper changeLog');
if (typeof versionInfo.date !== 'string' || ((new Date(versionInfo.date)).toString() === 'Invalid Date')) return new Error('invalid date or missing date');
if (versionInfo.next !== null) {
if (typeof versionInfo.next !== 'string') return new Error('version ' + version + ' does not have "string" next');
if (!semver.valid(versionInfo.next)) return new Error('version ' + version + ' has non-semver next');
if (!(versionInfo.next in versionsJson)) return new Error('version ' + version + ' points to non-existent version');
}
if (typeof versionInfo.sourceTarballUrl !== 'string') return new Error('version ' + version + ' does not have proper sourceTarballUrl');
if ('author' in versionsJson[version] && typeof versionInfo.author !== 'string') return new Error('author must be a string');
var tarballUrl = url.parse(versionInfo.sourceTarballUrl);
if (tarballUrl.protocol !== 'https:') return new Error('sourceTarballUrl must be https');
if (!/.tar.gz$/.test(tarballUrl.path)) return new Error('sourceTarballUrl must be tar.gz');
var nextVersion = versionInfo.next;
// despite having the 'next' field, the appstore code currently relies on all versions being sorted based on semver.compare (see boxversions.js)
if (nextVersion && semver.gt(version, nextVersion)) return new Error('next version cannot be less than current @' + version);
}
// check that package.json version is in versions.json
var currentVersion = require('../package.json').version;
if (sortedVersions.indexOf(currentVersion) === -1) {
return new Error('package.json version is not present in versions.json');
}
return null;
}
function verifyFile(versionsFileName) {
// check if the json is valid
var versions = safe.JSON.parse(fs.readFileSync(versionsFileName));
if (!versions) {
return new Error(versionsFileName + ' is not valid json : ' + safe.error);
}
return verify(versions);
}