@speedy-js/mono
Version:
Monorepo development & continuous integration tooling.
160 lines • 6.03 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MonorepoBuilder = void 0;
/**
* Module dependencies
*/
const chokidar_1 = __importDefault(require("chokidar"));
const chalk_1 = __importDefault(require("chalk"));
const shelljs_1 = __importDefault(require("shelljs"));
const _1 = require(".");
/**
* Expose `MonorepoBuilder`
*/
class MonorepoBuilder {
constructor(options) {
this.options = options;
this.buildProcessPool = {};
this.buildPromisePool = {};
this.pendingMessages = [];
}
/**
* bootstrap builder
*/
async bootstrap() {
this.packages = (0, _1.loadMonorepoPackages)(this.options.cwd);
}
/**
* Watch packages
*/
watch(options = {}) {
const watcher = chokidar_1.default.watch(this.options.cwd, {
ignoreInitial: true,
ignored: [/\/node_modules\//, /\/lib\//, /\/esm\//],
});
const excludedPackages = options.exclude || [];
const hanldeFileUpdate = async (file) => {
const targetPkg = this.packages.find((pkg) => {
return file.startsWith(`${pkg.dir}/src`);
});
if (targetPkg && !excludedPackages.includes(targetPkg.name)) {
this.createBuildProcess(targetPkg);
}
};
watcher.on('change', hanldeFileUpdate);
}
/**
* Create a build process.
*
* @param pkg
* @param script
*/
createBuildProcess(pkg, script) {
if (this.buildProcessPool[pkg.name]) {
return;
}
if (!pkg.packageJson.scripts.dev) {
console.log(chalk_1.default.bold(` [WARN] ${(0, _1.styled)(`[${pkg.name}]`)} does not have a dev script.`));
return;
}
console.log(chalk_1.default.bold(` ${(0, _1.styled)(`[${pkg.name}]`)} join the build process.`));
const ps = shelljs_1.default.exec(script || 'npm run dev', {
// @ts-ignore
async: true,
cwd: pkg.dir,
stdio: [0, 1, 2, 'ipc'],
});
if (typeof ps.code !== 'undefined' && ps.code !== 0) {
console.log(chalk_1.default.bold(` [WARN] ${(0, _1.styled)(`[${pkg.name}]`)} build failed.`));
}
this.buildProcessPool[pkg.name] = ps;
return ps;
}
/**
* watch process stdin
*/
enableStdinFeature(options = {}) {
const excludedPackages = options.exclude || [];
process.stdin &&
process.stdin.on('data', async (chunk) => {
const originalCommand = chunk.toString('utf-8');
let parsed = originalCommand.trim();
if (parsed === 'ps') {
console.log(Object.keys(this.buildProcessPool)
.map((pkgName) => {
const ps = this.buildProcessPool[pkgName];
return `${chalk_1.default.gray(`${ps.pid}`)}\t${pkgName}`;
})
.join('\n'));
}
this.pendingMessages.push(parsed);
process.nextTick(async () => {
if (this.pendingMessages.length !== 1) {
this.pendingMessages = [];
return;
}
parsed = this.pendingMessages[0];
this.pendingMessages = [];
if (parsed === 'n') {
const choices = this.packages
.filter((pkg) => {
return (!this.buildProcessPool[pkg.name] &&
!this.buildPromisePool[pkg.name] &&
!excludedPackages.includes(pkg.name));
})
.map((pkg) => {
return {
name: `${pkg.key} ${chalk_1.default.gray(`(${pkg.name}`)}`,
value: pkg.name,
};
});
const prompt = require('inquirer').prompt({
name: 'pkgName',
message: 'Choose a package to build:',
choices,
type: 'list',
default: choices[0],
});
const { pkgName } = await prompt;
/**
* Fixes: https://github.com/SBoudrias/Inquirer.js/issues/894
*/
prompt.ui.close();
prompt.ui.rl.input.resume();
parsed = pkgName;
}
const matchedPkg = this.packages.find((pkg) => {
return pkg.key === parsed || pkg.name === parsed;
});
if (matchedPkg) {
this.createBuildProcess(matchedPkg);
}
});
});
}
/**
* Handle process exit
*/
onProcessExit() {
const exitHandler = () => {
Object.keys(this.buildProcessPool).forEach((name) => {
const ps = this.buildProcessPool[name];
if (ps && ps.kill) {
ps.kill();
console.log(`Exit sub process ${name}`);
}
});
process.removeListener('exit', exitHandler);
process.removeListener('SIGINT', exitHandler);
};
// do something when app is closing
process.on('exit', exitHandler);
// catches ctrl+c event
process.on('SIGINT', exitHandler);
}
}
exports.MonorepoBuilder = MonorepoBuilder;
//# sourceMappingURL=monorepo-builder.js.map