@interaktiv/dia-scripts
Version:
CLI toolbox with common scripts for most sort of projects at DIA
111 lines (88 loc) • 2.87 kB
JavaScript
;
const path = require('path');
const fs = require('fs-extra');
const AdmZip = require('adm-zip');
const axios = require('axios');
const mkdirp = require('mkdirp');
const mv = require('mv');
const rimraf = require('rimraf');
const {
ux
} = require('cli-ux');
const logSymbols = require('log-symbols');
const {
ifConfig,
PMD_DIR,
parseEnv,
pkg,
TMP_DIR
} = require('../../utils');
const {
success: successIcon,
error: failIcon
} = logSymbols;
const unzipToDir = (src, dir) => new Promise((resolve, reject) => {
const zip = new AdmZip(src);
zip.extractAllToAsync(dir, true, error => error ? reject(error) : resolve(dir));
});
const promisfyMv = (src, dest) => new Promise((resolve, reject) => mv(src, dest, {
mkdirp: true
}, error => error ? reject(error) : resolve(dest)));
const {
config: {
pmd: {
version: versionFromPackage = '6.18.0'
} = {}
} = {}
} = pkg;
const pmdVersion = parseEnv('npm_package_config_pmd_version', ifConfig('pmd', versionFromPackage, '6.18.0'));
const BACKUP_DIR = path.join(TMP_DIR);
const DOWNLOAD_PATH = path.join(TMP_DIR, `pmd-bin-${pmdVersion}.zip`);
const UNZIP_PATH = DOWNLOAD_PATH.replace(/\.zip$/, '');
const PMD_DOWNLOAD_URL = `https://github.com/pmd/pmd/releases/download/pmd_releases%2F${pmdVersion}/pmd-bin-${pmdVersion}.zip`;
const cleanup = () => {
rimraf.sync(DOWNLOAD_PATH);
rimraf.sync(BACKUP_DIR);
};
async function run() {
ux.action.start(`Downloading PMD bin v${pmdVersion}`);
const response = await axios.get(PMD_DOWNLOAD_URL, {
responseType: 'arraybuffer'
});
ux.action.stop(successIcon);
ux.action.start('Installing PMD bin');
cleanup();
const hasPmdAlready = await fs.exists(PMD_DIR);
if (hasPmdAlready) await promisfyMv(PMD_DIR, BACKUP_DIR);
const binary = response.data;
mkdirp.sync(path.dirname(DOWNLOAD_PATH));
await fs.writeFile(DOWNLOAD_PATH, binary);
await unzipToDir(DOWNLOAD_PATH, TMP_DIR);
await promisfyMv(UNZIP_PATH, PMD_DIR);
const PMD_RULESET = path.join(BACKUP_DIR, 'ruleset.xml');
if (await fs.exists(PMD_RULESET)) {
const PMD_RULESET_DEST = path.join(PMD_DIR, path.basename(PMD_RULESET));
await fs.copy(PMD_RULESET, PMD_RULESET_DEST);
}
cleanup();
ux.action.stop(successIcon);
ux.log('\nFinished successfully');
}
(async () => {
try {
await run();
} catch (err) {
ux.action.stop(failIcon);
if (err.response) {
process.exitCode = err.response.status;
throw new Error(err);
}
if (err.request) {
// The request was made but no response was received
// `error.request` is an instance of XMLHttpRequest in the browser and an instance of
// http.ClientRequest in node.js
process.exitCode = err.request.statusCode;
} // Something happened in setting up the request that triggered an Error
throw err;
}
})();