update to lerna

This commit is contained in:
Sebastian McKenzie
2015-12-04 23:23:50 +11:00
parent d6117a9e27
commit f60261eafb
5 changed files with 5 additions and 354 deletions

126
scripts/bootstrap.js vendored
View File

@@ -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();
}
});

View File

@@ -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();
});
}