@nestjs/cli
Version:
Nest - modern, fast, powerful node.js web framework (@cli)
52 lines (51 loc) • 2.59 kB
JavaScript
import { confirm } from '@inquirer/prompts';
import { red } from 'ansis';
import { PackageManagerFactory } from '../lib/package-managers/index.js';
import { MauRunner } from '../lib/runners/mau.runner.js';
import { ERROR_PREFIX, INFO_PREFIX, MESSAGES } from '../lib/ui/index.js';
import { gracefullyExitOnPromptError } from '../lib/utils/gracefully-exit-on-prompt-error.js';
import { isInteractive } from '../lib/utils/is-interactive.js';
import { MAU_PACKAGE_NAME, findMauBinary } from '../lib/utils/mau.js';
import { AbstractAction } from './abstract.action.js';
const INSTALL_COMMAND = `npm install --save-dev ${MAU_PACKAGE_NAME}`;
export class DeployAction extends AbstractAction {
async handle(context) {
const binaryPath = findMauBinary() ?? (await this.installMau());
const runner = new MauRunner(binaryPath);
// Not collected: mau owns the terminal from here on, so its output and
// any prompts it shows must reach the user directly.
await runner.run(['deploy', ...context.args].join(' '));
}
async installMau() {
if (!isInteractive()) {
console.error(`\n${ERROR_PREFIX} ${MESSAGES.MAU_NOT_INSTALLED_NON_INTERACTIVE(MAU_PACKAGE_NAME, INSTALL_COMMAND)}`);
throw new Error(MESSAGES.MAU_INSTALLATION_FAILED(MAU_PACKAGE_NAME));
}
const shouldInstall = await confirm({
message: MESSAGES.MAU_INSTALLATION_QUESTION(MAU_PACKAGE_NAME),
default: true,
}).catch(gracefullyExitOnPromptError);
if (!shouldInstall) {
console.error(`\n${ERROR_PREFIX} ${MESSAGES.MAU_INSTALLATION_DECLINED(MAU_PACKAGE_NAME, INSTALL_COMMAND)}`);
throw new Error(MESSAGES.MAU_INSTALLATION_FAILED(MAU_PACKAGE_NAME));
}
console.info(`${INFO_PREFIX} ${MESSAGES.MAU_INSTALLATION_IN_PROGRESS(MAU_PACKAGE_NAME)}`);
try {
const manager = await PackageManagerFactory.find();
await manager.addDevelopment([MAU_PACKAGE_NAME], 'latest');
}
catch (error) {
if (error instanceof Error && error.message) {
console.error(red(error.message));
}
throw new Error(MESSAGES.MAU_INSTALLATION_FAILED(MAU_PACKAGE_NAME));
}
// Resolve again rather than assuming a path: the package manager decides
// where the package physically lands.
const binaryPath = findMauBinary();
if (!binaryPath) {
throw new Error(MESSAGES.MAU_INSTALLATION_FAILED(MAU_PACKAGE_NAME));
}
return binaryPath;
}
}