navy
Version:
Quick and powerful development environments using Docker and Docker Compose
71 lines (70 loc) • 2.75 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
var _path = _interopRequireDefault(require("path"));
var _chalk = _interopRequireDefault(require("chalk"));
var _invariant = _interopRequireDefault(require("invariant"));
var _ = require("../");
var _errors = require("../errors");
var _dockerClient = _interopRequireDefault(require("../util/docker-client"));
var _navyrc = _interopRequireDefault(require("../util/navyrc"));
async function _default(service, opts) {
const navy = (0, _.getNavy)(opts.navy);
const cwd = process.cwd();
const navyRc = await (0, _navyrc.default)(cwd);
if (!navyRc || !navyRc.services) {
throw new _errors.NavyError(`No valid .navyrc file was found in "${cwd}"`);
}
if (!navyRc.develop) {
throw new _errors.NavyError('No develop mounts found in .navyrc');
}
if (navyRc.services.length > 1 && !service) {
throw new _errors.NavyError('Multiple service mappings are defined in .navyrc, you need to explicitly specify what service to develop');
}
if (!service) service = navyRc.services[0];
if (navyRc.services.indexOf(service) === -1) {
throw new _errors.NavyError(`Service "${service}" is not a valid development target`);
}
const mounts = {};
Object.keys(navyRc.develop.mounts).forEach(localPath => mounts[_path.default.resolve(localPath)] = navyRc.develop.mounts[localPath]);
const state = (await navy.getState()) || {};
const stateServices = state.services || {};
await navy.saveState({
...state,
services: {
...stateServices,
[service]: {
...stateServices[service],
_develop: {
mounts,
command: navyRc.develop.command
}
}
}
});
await navy.emitAsync('cli.develop.beforeLaunch');
await navy.kill([service]);
await navy.launch([service], {
noDeps: true
});
console.log(`🚧 ${service} has now restarted in development 🚧`);
console.log(_chalk.default.dim('-----------'));
console.log();
const container = (await navy.ps()).filter(_service => _service.name === service)[0];
(0, _invariant.default)(container, "DEVELOP_NO_CONTAINER_ID: Could not determine container ID for log attachment");
const containerId = container.id;
const containerObj = _dockerClient.default.getContainer(containerId);
containerObj.attach({
stream: true,
stdout: true,
stderr: true
}).then(stream => containerObj.modem.demuxStream(stream, process.stdout, process.stderr)).catch(() => {
console.log();
console.log(_chalk.default.dim(`-------> ${service} exited`));
console.log();
});
}
module.exports = exports.default;