navy
Version:
Quick and powerful development environments using Docker and Docker Compose
101 lines (73 loc) • 3.1 kB
JavaScript
;
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;