UNPKG

a2r

Version:
131 lines (130 loc) 5.81 kB
"use strict"; 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;