/*
const progress = require('progress');
const fs = require('mz/fs');
const path = require('path')
const { program } = require('commander');
const utils = require('corifeus-utils');
const execRaw = require('child_process').exec;
const pkg = require('../package.json');
let loadModules = () => {
const srcpath = `${process.cwd()}`
const modules = fs.readdirSync(srcpath).filter(file => fs.statSync(path.join(srcpath, file)).isDirectory()).filter(dir => dir.startsWith('corifeus-'));
modules.unshift('corifeus');
return modules;
}
const allProjects = loadModules()
let projects;
const projectPath = (project) => {
return `${__dirname}/../${project === 'corifeus' ? '' : project + '/' }`;
}
const getPkg = async (project) => {
const buffer = await fs.readFile(`${projectPath(project)}package.json`);
return JSON.parse(buffer.toString());
}
const extractPackages = async function (projects = allProjects) {
const pkgs = {};
await utils.array.forEachAsync(projects, async (project) => {
pkgs[project] = await getPkg(project)
}, true)
return pkgs;
};
let pkgs;
// order is important
const settings = {
'corifeus-utils': {
publish: true,
},
'corifeus-builder': {
publish: true,
},
'corifeus-server': {
publish: true,
},
'corifeus-server-deployer': {
publish: true,
},
'corifeus-builder-angular': {
publish: true,
},
'corifeus-web': {
publish: true,
},
'corifeus-web-material': {
publish: true,
},
}
const loadPublishableChildren = () => {
Object.keys(settings).forEach((publishable) => {
const setting = settings[publishable];
const children = {};
Object.keys(pkgs).forEach((pkgName) => {
const pkg = pkgs[pkgName];
const updateDependecies = (repo) => {
if (pkg.hasOwnProperty(repo) && pkg[repo].hasOwnProperty(publishable)) {
if (Object.keys(pkg[repo]).includes(publishable)) {
children[pkgName] = true;
}
}
}
updateDependecies('dependencies', publishable);
updateDependecies('devDependencies', publishable);
setting.children = Object.keys(children);
})
})
}
const init = async (commanderEnabled = true) => {
pkgs = await extractPackages()
if (commanderEnabled) {
commander
.version(pkg.version)
.usage('[options]')
.option('-v, --verbose', 'Verbose')
.option('-n, --npm', 'Npm to original registry')
.option('-p, --projects <items>', 'The list of projects', (val) => {
return val.split(',');
})
.parse(process.argv);
}
projects = commander.projects || allProjects
loadPublishableChildren();
module.exports.projects = projects
}
const exec = (project, command, bar) => {
return new Promise((resolve, reject) => {
const actualCommand = `${project === 'corifeus' ? '' : `pushd ${project}`}
${command}
${project === 'corifeus' ? '' : `popd`}
`
if (bar) {
bar.interrupt(actualCommand);
} else {
console.log(actualCommand);
}
const run = execRaw(`bash -c '
set -e
${actualCommand}
'`, {
stdio: `inherit`,
}, (e) => {
if (e) {
console.error(e);
return reject(e);
}
if (bar) {
bar.tick({
token: `${project}`
})
}
return resolve();
})
run.stdout.on('data', (data) => {
if (commander.verbose && bar) {
bar.interrupt(data)
}
if (!bar) {
console.log(data);
}
});
run.stderr.on('data', (data) => {
if (bar) {
bar.interrupt(data)
} else {
console.error(data);
}
});
})
}
const newProgress = (status, total = projects.length) => {
const bar = new progress(`${status} [:bar] :token`, {
total: total,
width: 27,
clear: true
})
bar.tick(0, {
token: `${projects[0]}`
})
return bar;
}
const grunt = async () => {
let port = 10000;
const promises = [];
const barGrunt = newProgress('grunt');
await utils.array.forEachAsync(projects, (project) => {
promises.push(exec(project, `grunt --cory-port=${++port}`, barGrunt));
})
await Promise.all(promises);
}
const publish = async () => {
let total = projects.length;
const upgradeAbleCount = await getUpgradeAbleCount();
total = total + (total * upgradeAbleCount);
const barPublish = newProgress('publish-upgrade', total);
await utils.array.forEachAsync(projects, async (project) => {
const setting = settings[project];
if (setting !== undefined && setting.hasOwnProperty('publish') ) {
await exec(project, `${commander.npm ? '' : 'grunt cory-npm'}
npm publish ${commander.npm ? ' --registry https://registry.npmjs.org' : ''}`, barPublish);
await upgrade(barPublish)
} else {
barPublish.tick({
token: '...'
})
}
}, true)
}
const getUpgradable = async () => {
const upgradeAble = {};
await utils.array.forEachAsync(projects, (project) => {
const setting = settings[project];
if (setting !== undefined && setting.hasOwnProperty('publish') && setting.hasOwnProperty('children')) {
setting.children.forEach((child) => {
upgradeAble[child] = upgradeAble[child] || [];
upgradeAble[child].push(project)
})
}
})
return upgradeAble;
}
const getUpgradeAbleCount = async() => {
const upgradeAble = await getUpgradable();
const upgrades = Object.keys(upgradeAble);
let total = upgrades.length;
upgrades.forEach(() => total++);
return total;
}
const upgrade = async (progresser) => {
const upgradeAble = await getUpgradable();
const upgrades = Object.keys(upgradeAble);
if (progresser === undefined) {
const total = await getUpgradeAbleCount();
progresser = progresser || newProgress('upgrade', total);
}
const promises = [];
await utils.array.forEachAsync(upgrades, async (project) => {
progresser.tick({
token: project
})
const pkgFile = `${projectPath(project)}package.json`;
const pkg = await getPkg(project);
await utils.array.forEachAsync(upgradeAble[project], async(linkUpdate) => {
const updateDependecies = async (repo) => {
if (pkg.hasOwnProperty(repo) && pkg[repo].hasOwnProperty(linkUpdate)) {
const linkPkg = await getPkg(linkUpdate);
pkg[repo][linkUpdate] = `^${linkPkg.version}`;
}
}
await updateDependecies('dependencies', linkUpdate);
await updateDependecies('devDependencies', linkUpdate);
promises.push(fs.writeFile(pkgFile, JSON.stringify(pkg, null, 4)));
progresser.interrupt(`${project} => new pkg ${linkUpdate}`);
progresser.tick({
token: linkUpdate
})
})
})
await Promise.all(promises);
}
const link = async() => {
const upgradeAble = await getUpgradable();
const upgradeAbleKeys = Object.keys(upgradeAble);
const projectsGenerated = projects.filter((project) => (settings[project] || {}).hasOwnProperty('children') );
let total = projectsGenerated.length + upgradeAbleKeys.length;
const progress = newProgress('link', total);
let promises = [];
await utils.array.forEachAsync(projectsGenerated, (project) => {
const setting = settings[project] || {};
if (setting.hasOwnProperty('publish') && setting.hasOwnProperty('children')) {
promises.push(
exec(project, `yarn unlink || true
yarn link`, progress)
)
}
})
await Promise.all(promises);
promises = [];
await utils.array.forEachAsync(upgradeAbleKeys , (project) => {
let command = ``
upgradeAble[project].forEach((link) => {
command += `yarn link ${link}
`;
})
promises.push(exec(project, command, progress))
})
await Promise.all(promises);
}
module.exports = {
projects: projects,
settings: settings,
exec: exec,
projectPath: projectPath,
newProgress: newProgress,
grunt: grunt,
publish: publish,
upgrade: upgrade,
link: link,
extractPackages: extractPackages,
loadModules: loadModules,
init: init
}
*/