navy
Version:
Quick and powerful development environments using Docker and Docker Compose
78 lines (76 loc) • 3.09 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 _fs = require("fs");
var _fs2 = _interopRequireDefault(require("../../util/fs"));
var _state = require("../../navy/state");
var _util = require("./util");
const npmContext = _path.default.join((0, _state.pathToNavyRoot)(), 'npm');
const nodeModulesPath = _path.default.join(npmContext, 'node_modules');
async function tryAndInstall(pkgName) {
await _fs.promises.mkdir(nodeModulesPath, {
recursive: true
});
try {
(0, _child_process.execSync)(`npm info ${pkgName} name`, {
stdio: 'ignore'
});
} catch (ex) {
throw new Error(`Package "${pkgName}" not found or unreachable`);
}
(0, _child_process.execSync)(`npm i ${pkgName}`, {
stdio: 'inherit',
cwd: npmContext
});
}
function createNpmConfigProvider(navy) {
const provider = {
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);
_fs2.default.accessSync(navyPath); // see if path exists
return navyPath;
},
async getNavyFilePath() {
const navyPath = await provider.getNavyPath();
(0, _invariant.default)(navyPath, "STATE_NONEXISTANT: State doesn't exist for navy %s", navy.name);
return _path.default.join(navyPath, '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;
}
};
return provider;
}
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;