a2r
Version:
A2R Framework
129 lines (128 loc) • 6.21 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const execa_1 = __importDefault(require("execa"));
const telemetry_1 = require("@a2r/telemetry");
const getProjectPath_1 = __importDefault(require("./getProjectPath"));
const settings_1 = require("./settings");
const devSettings_1 = require("./devSettings");
const colors_1 = require("./colors");
const docker_1 = require("./docker");
const settings_2 = require("../settings");
const getCurrentProjectPath = async () => {
const workingDirectory = process.cwd();
const mainPath = await (0, getProjectPath_1.default)();
if (workingDirectory === mainPath) {
(0, colors_1.log)(`Command ${(0, colors_1.terminalCommand)('npm install')} must be run inside the server folder or a project folder`);
return '';
}
const settings = await (0, settings_1.getSettings)();
const validPaths = new Set([
path_1.default.resolve(mainPath, 'server'),
...settings.projects.map((p) => path_1.default.resolve(mainPath, p.path)),
]);
if (validPaths.has(workingDirectory)) {
return workingDirectory;
}
let validPath = '';
let currentPath = path_1.default.dirname(workingDirectory);
while (!validPath && currentPath !== mainPath) {
if (validPaths.has(currentPath)) {
validPath = currentPath;
}
currentPath = path_1.default.dirname(currentPath);
}
if (!validPath) {
(0, colors_1.log)(`Command ${(0, colors_1.terminalCommand)('npm install')} must be run inside the server folder or a project folder`);
}
return validPath;
};
const npmInstall = async (info) => {
const currentProjectPath = await getCurrentProjectPath();
if (currentProjectPath) {
const [install, ...packages] = info.argv;
if (install === 'install') {
const npmParams = ['install'];
if (packages && packages.length) {
npmParams.push(...packages);
}
const projectPath = path_1.default.basename(currentProjectPath);
const target = projectPath === 'server' ? 'server' : 'project';
(0, colors_1.log)(`Installing on ${target} path...`);
await (0, execa_1.default)('npm', npmParams, {
stdout: process.stdout,
stderr: process.stderr,
cwd: currentProjectPath,
});
const check = await (0, devSettings_1.settingsExist)();
if (check) {
const devSettings = await (0, devSettings_1.getSettings)();
if (target === 'server') {
const checkDocker = await (0, docker_1.dockerExists)(`name=${devSettings.server.dockerName}`, true);
if (checkDocker) {
await (0, execa_1.default)('docker', ['start', devSettings.server.dockerName]);
if (!packages || !packages.length) {
await (0, docker_1.copyPathToDocker)(path_1.default.resolve(currentProjectPath, 'package.json'), path_1.default.resolve(settings_2.dockerServerPath, 'package.json'), devSettings.server.dockerName);
}
(0, colors_1.log)('Running npm install on server docker...');
await (0, execa_1.default)('docker', [
'exec',
'-t',
devSettings.server.dockerName,
'npm',
...npmParams,
'--prefix',
'./server',
], {
stdout: process.stdout,
stderr: process.stderr,
});
}
else {
(0, colors_1.log)(`Not installing in docker because server docker doesn't exist yet`);
}
}
else {
const project = devSettings.activeProjects.find((p) => p.path === projectPath);
if (project) {
const { dockerName } = project;
const checkDocker = await (0, docker_1.dockerExists)(`name=${dockerName}`, true);
if (checkDocker) {
await (0, execa_1.default)('docker', ['start', dockerName]);
if (!packages || !packages.length) {
await (0, docker_1.copyPathToDocker)(path_1.default.resolve(currentProjectPath, 'package.json'), path_1.default.resolve(settings_2.defaultDockerWorkDir, 'package.json'), dockerName);
}
(0, colors_1.log)('Running npm install on server docker...');
await (0, execa_1.default)('docker', ['exec', '-t', dockerName, 'npm', ...npmParams], {
stdout: process.stdout,
stderr: process.stderr,
});
}
else {
(0, colors_1.log)(`Not installing in docker because project docker doesn't exist yet`);
}
}
else {
(0, colors_1.log)(`Not installing in docker because project wasn't found in running projects`);
}
}
}
else {
(0, colors_1.log)(`Not installing in docker because ${target} has never been started`);
}
}
else {
telemetry_1.out.error(`Command ${(0, colors_1.terminalCommand)(`npm ${install}`)} not supported`);
}
}
};
const command = {
name: 'npm',
description: 'Install npm packages in working directory project and its docker (if at least created)',
run: npmInstall,
args: [],
};
exports.default = command;