"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const app_1 = require("./app");
const counsel = require("counsel");
const fs_1 = require("fs");
const child_process_1 = require("child_process");
const npm = require('npm');
const pify = require('pify');
const loadNpm = pify(npm.load);
const writeFileP = pify(fs_1.writeFile);
const logger_1 = require("./logger");
/* istanbul ignore next */
function run(opts) {
return loadNpm().then(_run);
}
exports.run = run;
/* istanbul ignore next */
function _run(opts) {
const pkg = counsel.targetProjectPackageJson;
const pkgRoot = counsel.targetProjectRoot;
const pkgFilename = counsel.targetProjectPackageJsonFilename;
const pkgNameVersion = `${pkg.name}@${pkg.version}`;
const publishRegistryUri = npm.config.get('publish_registry');
const { branch, revision } = process.env;
const readyToCycle = validatePrereqs();
/* istanbul ignore next */
if (!readyToCycle)
return Promise.resolve();
npmTest(pkgRoot);
const twIdPkg = Object.assign({}, pkg, { [app_1.pkgId]: `com.${app_1.pkgId}.npm:${pkg.name}:${pkg.version}.b${branch}.${revision}` });
return Promise.resolve()
.then(() => generateDependencyReport(pkgRoot))
.then(() => writeFileP(pkgFilename, JSON.stringify(twIdPkg, null, 2)))
.then(() => publish(publishRegistryUri, pkgRoot))
.then(() => restorePkgJson(null, pkg, pkgFilename), err => restorePkgJson(err, pkg, pkgFilename))
.then(() => logger_1.default.info(`${pkgNameVersion} published successfully to ${publishRegistryUri}`))
.catch(err => handleFail(err, pkgNameVersion));
}
/* istanbul ignore next */
function generateDependencyReport(pkgRoot) {
logger_1.default.verbose('generating dependency report');
const resp = child_process_1.spawnSync('npm', ['run', 'report'], { cwd: pkgRoot });
if (resp.status)
throw new Error(resp.stderr ? resp.stderr.toString() : 'failed to generate report');
}
exports.generateDependencyReport = generateDependencyReport;
/* istanbul ignore next */
function handleFail(err, pkgNameVersion) {
if (err.message && err.message.match('pre-existing version')) {
logger_1.default.warn(`${pkgNameVersion} already has artifact`);
return;
}
throw err;
}
exports.handleFail = handleFail;
/* istanbul ignore next */
function npmTest(pkgRoot) {
const testProc = child_process_1.spawnSync('npm', ['test'], { cwd: pkgRoot });
if (testProc.error)
throw testProc.error;
}
exports.npmTest = npmTest;
/* istanbul ignore next */
function publish(publishRegistryUri, pkgRoot) {
logger_1.default.verbose('ripcord executing npm publish');
const resp = child_process_1.spawnSync('npm', ['publish', '--registry', publishRegistryUri, '--verbose'], { cwd: pkgRoot });
if (resp.status)
throw new Error(resp.stderr ? resp.stderr.toString() : 'failed to npm publish');
}
exports.publish = publish;
/* istanbul ignore next */
function restorePkgJson(err, pkg, pkgFilename) {
return writeFileP(pkgFilename, JSON.stringify(pkg, null, 2))
.then(() => { if (err)
throw err; });
}
exports.restorePkgJson = restorePkgJson;
/**
* validates if we are ready to publish.
* throws on error, or returns bool ~= readyToCycle
* @returns {boolean} readyToCycle
* @export
*/
function validatePrereqs() {
const publishRegistryUri = npm.config.get('publish_registry');
if (!publishRegistryUri)
throw new Error([
'npm config `publish_registry` not found.',
'please add a `publish_registry` to your .npmrc'
].join(' '));
let { branch, revision } = process.env;
/* istanbul ignore next */
if (!revision)
throw new Error('env var `revision` not found');
/* istanbul ignore next */
if (!branch)
throw new Error('env var `branch` not found');
if (branch.match('refs/heads/'))
branch = branch.replace('refs/heads/', '');
/* istanbul ignore next */
if (branch !== 'master') {
logger_1.default.info(`skipping publish. branch ${branch} !== 'master'`);
return false;
}
return true;
}
exports.validatePrereqs = validatePrereqs;
//# sourceMappingURL=scmcycle.js.map