#! /usr/bin/env node const { join } = require('path'); const Graph = require("graph-data-structure"); const semver = require('semver'); const { readdirSync } = require('fs'); const { execSync } = require('child_process'); const version = process.argv[2]; if (!semver.valid(version)) { console.error('Missing required valid version parameter'); process.exit(1); } execSync(`yarn reset-versions ${version}`); const packagesDir = join(__dirname, '../packages'); const packages = readdirSync(packagesDir); const graph = packages.reduce((graph, pkg) => { graph.addNode(pkg); graph.addEdge('neutrino', pkg); Object .keys(require(join(packagesDir, `${pkg}/package.json`)).dependencies) .filter(dep => dep.includes('neutrino')) .forEach(dep => graph.addEdge(dep, pkg)); return graph; }, new Graph()); graph .topologicalSort() .forEach(p => { console.log(`Publishing ${p}@${version}`); const cwd = join(packagesDir, p); const pkgJson = join(cwd, 'package.json'); const pkg = require(pkgJson); const upgradedDeps = []; Object .keys(pkg.dependencies) .forEach(dep => { if (!dep.includes('neutrino-')) { return; } upgradedDeps.push(dep); }); if (upgradedDeps.length) { execSync(`yarn upgrade ${upgradedDeps.join(' ')}`, { cwd }); } execSync(`npm publish`, { cwd }); });