UNPKG

@speedy-js/mono

Version:

Monorepo development & continuous integration tooling.

160 lines 6.03 kB
"use strict"; 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