@ima/cli
Version:
IMA.js CLI tool to build, develop and work with IMA.js applications.
71 lines (70 loc) • 2.54 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.builder = exports.handler = exports.describe = exports.command = void 0;
const child_process_1 = require("child_process");
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const logger_1 = require("@ima/dev-utils/logger");
const cli_1 = require("../lib/cli");
/**
* Starts ima application in production mode.
*
* @param {CliArgs} args
* @returns {Promise<void>}
*/
const start = async (args) => {
try {
const serverPath = args.server
? path_1.default.resolve(args.rootDir, args.server)
: path_1.default.resolve(args.rootDir, 'server/server.js');
// Validate server file exists
if (!fs_1.default.existsSync(serverPath)) {
logger_1.logger.error(`Server file not found at: ${serverPath}`);
process.exit(1);
}
logger_1.logger.info('Starting production server...');
// Spawn node process with the server
const serverProcess = (0, child_process_1.spawn)('node', [serverPath], {
stdio: 'inherit',
env: { ...process.env },
});
// Handle server process events
serverProcess.on('error', error => {
logger_1.logger.error(`Failed to start server process: ${error.message}`);
process.exit(1);
});
// Forward SIGTERM and SIGINT to the child process
const signals = ['SIGTERM', 'SIGINT'];
signals.forEach(signal => {
process.on(signal, () => {
if (serverProcess.pid) {
process.kill(serverProcess.pid, signal);
}
process.exit();
});
});
}
catch (error) {
if (error instanceof Error) {
logger_1.logger.error(`Failed to start server: ${error.message}`);
}
else {
logger_1.logger.error('Failed to start server: Unknown error');
}
process.exit(1);
}
};
const CMD = 'start';
exports.command = CMD;
exports.describe = 'Start the application in production mode';
exports.handler = (0, cli_1.handlerFactory)(start);
exports.builder = {
server: {
type: 'string',
description: 'Custom path to the server file (relative to project root)',
default: 'server/server.js',
},
};