update to lerna
This commit is contained in:
126
scripts/bootstrap.js
vendored
126
scripts/bootstrap.js
vendored
@@ -1,126 +0,0 @@
|
||||
require("shelljs/global");
|
||||
|
||||
var ProgressBar = require("progress");
|
||||
var mkdirp = require("mkdirp");
|
||||
var rimraf = require("rimraf");
|
||||
var child = require("child_process");
|
||||
var async = require("async");
|
||||
var path = require("path");
|
||||
var pad = require("pad");
|
||||
var fs = require("fs");
|
||||
|
||||
var CURRENT_VERSION = fs.readFileSync(__dirname + "/../VERSION", "utf8").trim();
|
||||
|
||||
// uninstall global babel install
|
||||
try {
|
||||
exec("npm uninstall -g babel");
|
||||
} catch (err) {}
|
||||
|
||||
// get packages
|
||||
var packages = [];
|
||||
ls("packages/*").forEach(function (loc) {
|
||||
var name = path.basename(loc);
|
||||
if (name[0] === ".") return;
|
||||
|
||||
var pkgLoc = __dirname + "/../packages/" + name + "/package.json";
|
||||
if (!fs.existsSync(pkgLoc)) return;
|
||||
|
||||
var pkg = require(pkgLoc);
|
||||
packages.push({
|
||||
folder: name,
|
||||
pkg: pkg,
|
||||
name: pkg.name
|
||||
});
|
||||
});
|
||||
|
||||
var completed = false;
|
||||
|
||||
var bar = new ProgressBar(":packagename ╢:bar╟", {
|
||||
total: packages.length,
|
||||
complete: "█",
|
||||
incomplete: "░",
|
||||
clear: true,
|
||||
|
||||
// terminal columns - package name length - additional characters length
|
||||
width: process.stdout.columns - 50 - 3
|
||||
});
|
||||
|
||||
async.parallelLimit(packages.map(function (root) {
|
||||
return function (done) {
|
||||
//console.log(root.name);
|
||||
|
||||
var tasks = [];
|
||||
var nodeModulesLoc = process.cwd() + "/packages/" + root.folder + "/node_modules";
|
||||
|
||||
tasks.push(function (done) {
|
||||
mkdirp(nodeModulesLoc, done);
|
||||
});
|
||||
|
||||
tasks.push(function (done) {
|
||||
async.each(packages, function (sub, done) {
|
||||
var ver = false;
|
||||
if (root.pkg.dependencies) ver = root.pkg.dependencies[sub.name];
|
||||
if (root.pkg.devDependencies && !ver) ver = root.pkg.devDependencies[sub.name];
|
||||
if (!ver) return done();
|
||||
|
||||
// ensure that this is referring to a local package
|
||||
if (ver[0] !== "^" || ver[1] !== CURRENT_VERSION[0]) return done();
|
||||
|
||||
var linkSrc = process.cwd() + "/packages/" + sub.folder;
|
||||
var linkDest = nodeModulesLoc + "/" + sub.name;
|
||||
|
||||
//console.log("Linking", linkSrc, "to", linkDest);
|
||||
|
||||
rimraf(linkDest, function (err) {
|
||||
if (err) return done(err);
|
||||
|
||||
fs.mkdir(linkDest, function (err) {
|
||||
if (err) return done(err);
|
||||
|
||||
fs.writeFile(linkDest + "/package.json", JSON.stringify({
|
||||
name: sub.name,
|
||||
version: require(linkSrc + "/package.json").version
|
||||
}, null, " "), function (err) {
|
||||
if (err) return done(err);
|
||||
|
||||
fs.writeFile(linkDest + "/index.js", 'module.exports = require("' + linkSrc + '");', done);
|
||||
});
|
||||
});
|
||||
});
|
||||
}, done);
|
||||
});
|
||||
|
||||
tasks.push(function (done) {
|
||||
child.exec("npm install", {
|
||||
cwd: process.cwd() + "/packages/" + root.folder
|
||||
}, function (err, stdout, stderr) {
|
||||
if (err != null) {
|
||||
done(stderr);
|
||||
} else {
|
||||
//stdout = stdout.trim();
|
||||
//if (stdout) console.log(stdout);
|
||||
done();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
tasks.push(function (done) {
|
||||
if (!completed) bar.tick({
|
||||
packagename: pad(root.name.slice(0, 50), 50)
|
||||
});
|
||||
done();
|
||||
});
|
||||
|
||||
async.series(tasks, done);
|
||||
};
|
||||
}), 4, function (err) {
|
||||
// don't display the ticker if we hit an error and we still have workers
|
||||
completed = true;
|
||||
|
||||
if (err) {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
} else {
|
||||
process.exit();
|
||||
}
|
||||
});
|
||||
@@ -1,226 +0,0 @@
|
||||
require("shelljs/global");
|
||||
|
||||
var readline = require("readline-sync");
|
||||
var semver = require("semver");
|
||||
var chalk = require("chalk");
|
||||
var child = require("child_process");
|
||||
var async = require("async");
|
||||
var fs = require("fs");
|
||||
|
||||
//
|
||||
|
||||
var PACKAGE_LOC = __dirname + "/../packages";
|
||||
var VERSION_LOC = __dirname + "/../VERSION";
|
||||
|
||||
var NPM_OWNERS = fs.readFileSync(__dirname + "/../NPM_OWNERS", "utf8").trim().split("\n");
|
||||
var changedPackages = [];
|
||||
var changedFiles = [VERSION_LOC];
|
||||
|
||||
var CURRENT_VERSION = fs.readFileSync(VERSION_LOC, "utf8").trim();
|
||||
console.log("Current version:", CURRENT_VERSION);
|
||||
|
||||
var FORCE_VERSION = process.env.FORCE_VERSION;
|
||||
FORCE_VERSION = FORCE_VERSION ? FORCE_VERSION.split(",") : [];
|
||||
|
||||
var NEW_VERSION = getVersion();
|
||||
fs.writeFileSync(VERSION_LOC, NEW_VERSION, "utf8");
|
||||
|
||||
//
|
||||
|
||||
try {
|
||||
checkUpdatedPackages();
|
||||
updateChangedPackages();
|
||||
updateTag();
|
||||
build();
|
||||
publish();
|
||||
} catch (err) {
|
||||
onError(err);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
var createdTag = false;
|
||||
|
||||
function updateTag() {
|
||||
var NEW_TAG_NAME = "v" + NEW_VERSION;
|
||||
execSync("git commit -m " + NEW_TAG_NAME, true);
|
||||
execSync("git tag " + NEW_TAG_NAME, true);
|
||||
createdTag = true;
|
||||
}
|
||||
|
||||
function removeTag() {
|
||||
if (createdTag) {
|
||||
console.error(chalk.red("Attempting to roll back tag creation."));
|
||||
exec("git tag -d v" + NEW_VERSION, true);
|
||||
}
|
||||
}
|
||||
|
||||
function build() {
|
||||
execSync("make build-dist");
|
||||
}
|
||||
|
||||
function getVersion() {
|
||||
var input = readline.question("New version (Leave blank for new patch): ");
|
||||
|
||||
var ver = semver.valid(input);
|
||||
if (!ver) {
|
||||
ver = semver.inc(CURRENT_VERSION, input || "patch");
|
||||
}
|
||||
|
||||
if (ver) {
|
||||
return ver;
|
||||
} else {
|
||||
console.log("Version provided is not valid semver.");
|
||||
return getVersion();
|
||||
}
|
||||
}
|
||||
|
||||
function execSync(cmd, log) {
|
||||
var out = child.execSync(cmd, {
|
||||
encoding: "utf8"
|
||||
}).trim();
|
||||
|
||||
console.log("$ " + cmd);
|
||||
|
||||
if (log) {
|
||||
if (out) console.log(out);
|
||||
} else {
|
||||
return out;
|
||||
}
|
||||
}
|
||||
|
||||
function getPackageLocation(name) {
|
||||
return PACKAGE_LOC + "/" + name;
|
||||
}
|
||||
|
||||
function getPackageConfig(name) {
|
||||
return require(getPackageLocation(name) + "/package.json");
|
||||
}
|
||||
|
||||
function updateDepsObject(deps) {
|
||||
for (var depName in deps) {
|
||||
// ensure this was generated and we're on the same major
|
||||
if (deps[depName][0] !== "^" || deps[depName][1] !== NEW_VERSION[0]) continue;
|
||||
|
||||
if (changedPackages.indexOf(depName) >= 0) {
|
||||
deps[depName] = "^" + NEW_VERSION;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkUpdatedPackages() {
|
||||
var packageNames = fs.readdirSync(PACKAGE_LOC).filter(function (name) {
|
||||
return name[0] !== "." && fs.statSync(PACKAGE_LOC + "/" + name).isDirectory();
|
||||
});
|
||||
|
||||
var lastTagCommit = execSync("git rev-list --tags --max-count=1");
|
||||
var lastTag = execSync("git describe " + lastTagCommit);
|
||||
|
||||
packageNames.forEach(function (name) {
|
||||
var config = getPackageConfig(name);
|
||||
if (config.private) return;
|
||||
|
||||
// check if package has changed since last release
|
||||
var diff = execSync("git diff " + lastTag + " -- " + getPackageLocation(name));
|
||||
if (diff || FORCE_VERSION.indexOf("*") >= 0 || FORCE_VERSION.indexOf(name) >= 0) {
|
||||
console.log(chalk.green("Changes detected to package", name));
|
||||
changedPackages.push(name);
|
||||
}
|
||||
});
|
||||
|
||||
if (!changedPackages.length && !FORCE_VERSION.length) {
|
||||
throw new Error(chalk.red("No packages changed."));
|
||||
}
|
||||
}
|
||||
|
||||
function updateChangedPackages() {
|
||||
changedPackages.forEach(function (name) {
|
||||
var pkgLoc = getPackageLocation(name) + "/package.json";
|
||||
var pkg = require(pkgLoc);
|
||||
|
||||
// set new version
|
||||
pkg.version = NEW_VERSION;
|
||||
|
||||
// updated dependencies
|
||||
updateDepsObject(pkg.dependencies);
|
||||
updateDepsObject(pkg.devDependencies);
|
||||
|
||||
// write new package
|
||||
fs.writeFileSync(pkgLoc, JSON.stringify(pkg, null, " ") + "\n");
|
||||
|
||||
// push to be git committed
|
||||
changedFiles.push(pkgLoc);
|
||||
});
|
||||
|
||||
changedFiles.forEach(function (loc) {
|
||||
execSync("git add " + loc, true);
|
||||
});
|
||||
}
|
||||
|
||||
function publish() {
|
||||
changedPackages.forEach(function (name) {
|
||||
// prepublish script
|
||||
var prePub = getPackageLocation(name) + "/scripts/prepublish.js";
|
||||
if (fs.existsSync(prePub)) require(prePub);
|
||||
});
|
||||
|
||||
async.parallelLimit(changedPackages.map(function (name) {
|
||||
return function run(done) {
|
||||
var loc = getPackageLocation(name);
|
||||
|
||||
child.exec("cd " + loc + " && npm publish --tag prerelease", function (err, stdout, stderr) {
|
||||
if (err || stderr) {
|
||||
err = stderr || err.stack;
|
||||
console.error(err);
|
||||
if (err.indexOf("You cannot publish over the previously published version") < 0) {
|
||||
return run(done);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(stdout.trim());
|
||||
|
||||
// postpublish script
|
||||
var postPub = loc + "/scripts/postpublish.js";
|
||||
if (fs.existsSync(postPub)) require(postPub);
|
||||
|
||||
done();
|
||||
});
|
||||
};
|
||||
}), 4, function (err) {
|
||||
onError(err);
|
||||
ship();
|
||||
});
|
||||
}
|
||||
|
||||
function onError(err) {
|
||||
if (!err) return;
|
||||
console.log(chalk.red("There was a problem publishing."));
|
||||
removeTag();
|
||||
console.log(err.stack || err);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
function ship() {
|
||||
async.parallelLimit(changedPackages.map(function (name) {
|
||||
return function (done) {
|
||||
var loc = getPackageLocation(name);
|
||||
while (true) {
|
||||
try {
|
||||
execSync("npm dist-tag rm " + name + " prerelease", true);
|
||||
execSync("npm dist-tag add " + name + "@" + NEW_VERSION + " stable");
|
||||
execSync("npm dist-tag add " + name + "@" + NEW_VERSION + " latest");
|
||||
break;
|
||||
} catch (err) {
|
||||
console.error(err.stack);
|
||||
}
|
||||
}
|
||||
done();
|
||||
};
|
||||
}), 4, function (err) {
|
||||
onError(err);
|
||||
execSync("git push", true);
|
||||
execSync("git push --tags", true);
|
||||
console.log(chalk.green("Successfully shipped " + NEW_VERSION));
|
||||
process.exit();
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user