a2r
Version:
A2R Framework
98 lines (97 loc) • 4.49 kB
JavaScript
"use strict";
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 fs_1 = require("@a2r/fs");
const settings_1 = require("./settings");
const getProjectPath_1 = __importDefault(require("./getProjectPath"));
const getCleanProjectName_1 = __importDefault(require("./getCleanProjectName"));
const colors_1 = require("./colors");
const createDevServerDocker_1 = __importDefault(require("./createDevServerDocker"));
const start_1 = __importDefault(require("./watcher/start"));
const onProcessExit_1 = __importDefault(require("./onProcessExit"));
const copyProjectContentsToDocker_1 = __importDefault(require("./copyProjectContentsToDocker"));
const docker_1 = require("./docker");
const settings_2 = require("../settings");
/**
* Temporary `dev` command that will run all needed dockers for solution
*/
const start = async (info) => {
var _a;
const { options } = info;
if (options.settings) {
await (0, settings_1.setFileName)(options.settings);
}
const settings = await (0, settings_1.getSettings)();
const { projects, devServer } = settings;
if (projects.length) {
const mainProjectPath = await (0, getProjectPath_1.default)();
const mainServerPath = path_1.default.resolve(mainProjectPath, settings_2.serverPath);
const a2rInternalPath = path_1.default.resolve(mainProjectPath, settings_2.projectsInternalPath);
const cleanProjectName = settings.projectName || (await (0, getCleanProjectName_1.default)(mainProjectPath));
const cookieKey = `${cleanProjectName}_sessionId`;
const userTokenKey = `${cleanProjectName}_userToken`;
const devServerInternalPath = path_1.default.resolve(a2rInternalPath, settings_2.devServerPath);
const devServerModules = path_1.default.resolve(devServerInternalPath, 'node_modules');
const devServerEnv = path_1.default.resolve(devServerInternalPath, '.env');
await (0, fs_1.ensureDir)(devServerInternalPath);
await (0, fs_1.ensureDir)(devServerModules);
const devSettings = await (0, createDevServerDocker_1.default)(settings, settings.devServer.name, devServerModules, devServerEnv, [
[settings_2.cookieKeyKey, cookieKey],
[settings_2.userTokenKeyKey, userTokenKey],
]);
(0, colors_1.log)(`Starting ${devSettings.server.dockerName} docker...`);
await (0, execa_1.default)('docker', ['start', devSettings.server.dockerName]);
await (0, copyProjectContentsToDocker_1.default)(mainServerPath, devSettings.server.dockerName, settings_2.dockerServerPath);
await (0, docker_1.checkForFrameworkOnServer)(devSettings.server.dockerName);
const additionalFolders = new Set(['utils', 'tools']);
if ((_a = devServer.watchFolders) === null || _a === void 0 ? void 0 : _a.length) {
devServer.watchFolders.forEach((folder) => {
additionalFolders.add(folder);
});
}
await (0, start_1.default)(mainProjectPath, devServerInternalPath, Array.from(additionalFolders));
const dockerExecParams = [
'exec',
'-t',
devSettings.server.dockerName,
'npm',
'run',
'dev',
];
let killed = false;
const subProcess = (0, execa_1.default)('docker', dockerExecParams, {
stdout: process.stdout,
stderr: process.stderr,
});
process.once('SIGINT', () => {
killed = true;
(0, onProcessExit_1.default)(devSettings.server.dockerName).then(() => {
subProcess.kill();
process.exit(0);
});
});
try {
await subProcess;
}
catch (ex) {
if (!killed) {
(0, colors_1.log)(`Sub process error\n${ex.stack || ex.message}`);
}
}
}
else {
telemetry_1.out.warn(`You must add at least one project to solution before running ${(0, colors_1.terminalCommand)('--dev')} command`);
}
};
const command = {
name: 'start',
description: 'Runs watcher and server',
run: start,
args: [],
};
exports.default = command;