a2r
Version:
A2R Framework
131 lines (130 loc) • 5.81 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable @typescript-eslint/naming-convention */
const os_1 = __importDefault(require("os"));
const path_1 = __importDefault(require("path"));
const execa_1 = __importDefault(require("execa"));
const chalk_1 = __importDefault(require("chalk"));
const get_port_1 = __importDefault(require("get-port"));
const fs_1 = require("@a2r/fs");
const devSettings_1 = require("./devSettings");
const getProjectPath_1 = __importDefault(require("./getProjectPath"));
const getCleanProjectName_1 = __importDefault(require("./getCleanProjectName"));
const onProcessExit_1 = __importDefault(require("./onProcessExit"));
const docker_1 = require("./docker");
const colors_1 = require("./colors");
const copyProjectContentsToDocker_1 = __importDefault(require("./copyProjectContentsToDocker"));
const watchNextProject_1 = __importDefault(require("./watcher/watchNextProject"));
const settings_1 = require("../settings");
const devNext = async (project) => {
var _a;
const devSettings = await (0, devSettings_1.getSettings)();
const mainProjectPath = await (0, getProjectPath_1.default)();
const a2rInternalPath = path_1.default.resolve(mainProjectPath, settings_1.projectsInternalPath);
const cleanProjectName = await (0, getCleanProjectName_1.default)(mainProjectPath);
const currentProjectPath = path_1.default.resolve(mainProjectPath, project.path);
const projectInternalPath = path_1.default.resolve(mainProjectPath, a2rInternalPath, project.path);
const projectModulesPath = path_1.default.resolve(projectInternalPath, 'node_modules');
const projectEnvPath = path_1.default.resolve(projectInternalPath, '.env');
await (0, fs_1.ensureDir)(projectInternalPath);
await (0, fs_1.ensureDir)(projectModulesPath);
const dockerImage = project.dockerBase || settings_1.defaultDockerImage;
const projectDockerName = project.dockerName || `${cleanProjectName}-${project.path}`;
const dockerWorkingDir = project.dockerWorkingDir || settings_1.defaultDockerWorkDir;
const checkImage = await (0, docker_1.imageExists)(dockerImage);
if (!checkImage) {
(0, colors_1.log)(`Pulling docker image ${dockerImage}...`);
const pullParams = ['pull', dockerImage];
await (0, execa_1.default)('docker', pullParams);
}
else {
(0, colors_1.log)(`Base image (${dockerImage}) already exists`);
}
await (0, docker_1.stop)(projectDockerName);
await (0, docker_1.rm)(projectDockerName);
const desiredPort = parseInt((((_a = project.env) === null || _a === void 0 ? void 0 : _a.PORT) || ''), 10);
const currentPort = await (0, get_port_1.default)({ port: desiredPort || undefined });
if (desiredPort && desiredPort !== currentPort) {
(0, colors_1.log)(`Port ${chalk_1.default.whiteBright(desiredPort)} is already in use, starting ${project.path} at port ${chalk_1.default.greenBright(currentPort)}`);
}
const envVars = Object.entries(devSettings.keys).map(([key, value]) => `${key}=${value}`);
Object.entries(project.env || {}).forEach(([key, value]) => {
if (key === 'PORT') {
envVars.push(`PORT=${currentPort}`);
}
else {
envVars.push(`${key}=${value}`);
}
});
await (0, fs_1.writeFile)(projectEnvPath, envVars.join('\n'));
const networkParams = [];
if (os_1.default.platform() !== 'darwin') {
networkParams.push(...['--network', 'host']);
}
else {
networkParams.push(...['-p', `${currentPort}:${currentPort}`]);
}
const dockerParams = [
'create',
'-it',
'-w',
dockerWorkingDir,
'--env-file',
projectEnvPath,
'-v',
`${projectModulesPath}:${dockerWorkingDir}/node_modules`,
...networkParams,
'--name',
projectDockerName,
dockerImage,
];
await (0, execa_1.default)('docker', dockerParams);
await (0, copyProjectContentsToDocker_1.default)(currentProjectPath, projectDockerName, dockerWorkingDir);
(0, colors_1.log)(`Starting ${projectDockerName} docker...`);
await (0, execa_1.default)('docker', ['start', projectDockerName]);
await (0, watchNextProject_1.default)(project.path, projectDockerName, dockerWorkingDir);
const modulesInstalled = !!(await (0, fs_1.readDir)(projectModulesPath)).length;
if (!modulesInstalled) {
(0, colors_1.log)(`Modules not installed in docker, running npm install`);
await (0, execa_1.default)('docker', ['exec', '-t', projectDockerName, 'npm', 'install'], {
stdout: process.stdout,
stderr: process.stderr,
});
}
await (0, devSettings_1.addActiveProject)(Object.assign(Object.assign({}, project), { dockerBase: dockerImage, dockerName: projectDockerName, dockerWorkingDir }));
const dockerExecParams = [
'exec',
'-t',
projectDockerName,
'npm',
'run',
'dev',
'--',
'--port',
currentPort.toString(),
];
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)(projectDockerName).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}`);
}
}
};
exports.default = devNext;