UNPKG

navy

Version:

Quick and powerful development environments using Docker and Docker Compose

101 lines (73 loc) 3.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = createNpmConfigProvider; var _path = _interopRequireDefault(require("path")); var _child_process = require("child_process"); var _invariant = _interopRequireDefault(require("invariant")); var _bluebird = _interopRequireDefault(require("bluebird")); var _fs = _interopRequireDefault(require("../../util/fs")); var _state = require("../../navy/state"); var _util = require("./util"); const mkdirp = _bluebird.default.promisify(require('mkdirp')); const npmContext = _path.default.join((0, _state.pathToNavyRoot)(), 'npm'); const nodeModulesPath = _path.default.join(npmContext, 'node_modules'); async function tryAndInstall(pkgName) { await mkdirp(nodeModulesPath); try { // $FlowIgnore some weird bug with execSync (0, _child_process.execSync)(`npm info ${pkgName} name`, { stdio: 'ignore' }); } catch (ex) { throw new Error(`Package "${pkgName}" not found or unreachable`); } // $FlowIgnore some weird bug with execSync (0, _child_process.execSync)(`npm i ${pkgName}`, { stdio: 'inherit', cwd: npmContext }); } function createNpmConfigProvider(navy) { return { async getNavyPath() { const envState = await navy.getState(); (0, _invariant.default)(!!envState, "STATE_NONEXISTANT: State doesn't exist for navy %s", navy.name); (0, _invariant.default)(!!envState.npmPackage, "NPM_PROVIDER_REQUIRES_PACKAGE: NPM config provider requires an NPM package for %s", navy.name); const navyPath = await (0, _util.pathToModule)(nodeModulesPath, envState.npmPackage); _fs.default.accessSync(navyPath); // see if path exists return navyPath; }, async getNavyFilePath() { return _path.default.join(await this.getNavyPath(), 'Navyfile.js'); }, async refreshConfig() { const envState = await navy.getState(); (0, _invariant.default)(!!envState, "STATE_NONEXISTANT: State doesn't exist for navy %s", navy.name); (0, _invariant.default)(!!envState.npmPackage, "NPM_PROVIDER_REQUIRES_PACKAGE: NPM config provider requires an NPM package for %s", navy.name); await tryAndInstall(envState.npmPackage); return true; }, async getLocationDisplayName() { const envState = await navy.getState(); (0, _invariant.default)(!!envState, "STATE_NONEXISTANT: State doesn't exist for navy %s", navy.name); return envState.npmPackage; }, async isDangling() { const envState = await navy.getState(); return !envState || !envState.npmPackage; } }; } createNpmConfigProvider.importCliOptions = [['--npm-package [package]', 'set the NPM package to use for docker compose config']]; createNpmConfigProvider.getImportOptionsForCLI = async opts => { if (opts.npmPackage) { await tryAndInstall(opts.npmPackage); return { configProvider: 'npm', npmPackage: opts.npmPackage }; } }; module.exports = exports.default;