diff --git a/Makefile b/Makefile index f73cb9776d..2b285bf2a0 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,7 @@ test-cov: clean test-ci: make lint - NODE_ENV=test make bootstrap + NODE_ENV=test lerna bootstrap ./node_modules/.bin/flow check ./scripts/test-cov.sh cat ./coverage/coverage.json | ./node_modules/codecov.io/bin/codecov.io.js @@ -53,7 +53,7 @@ test-ci: publish: git pull --rebase make test - node scripts/publish.js + lerna publish make clean #./scripts/build-website.sh diff --git a/package.json b/package.json index 6b702ea164..5d7d51cd5c 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "gulp-util": "^3.0.7", "gulp-watch": "^4.3.5", "istanbul": "^0.3.5", + "lerna": "^1.0.0", "lodash": "^3.10.0", "matcha": "^0.6.0", "mkdirp": "^0.5.1", diff --git a/packages/babel-polyfill/scripts/prepublish.js b/packages/babel-polyfill/scripts/prepublish.js index bb37fec285..3adf45effd 100644 --- a/packages/babel-polyfill/scripts/prepublish.js +++ b/packages/babel-polyfill/scripts/prepublish.js @@ -1,3 +1,5 @@ +require("shelljs/global"); + function relative(loc) { return __dirname + "/../" + loc; } diff --git a/scripts/bootstrap.js b/scripts/bootstrap.js deleted file mode 100755 index bcfa2963d6..0000000000 --- a/scripts/bootstrap.js +++ /dev/null @@ -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(); - } -}); diff --git a/scripts/publish.js b/scripts/publish.js deleted file mode 100755 index 981c53b9d7..0000000000 --- a/scripts/publish.js +++ /dev/null @@ -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(); - }); -}