cli-engine
Version:
Generic CLI Framework
105 lines (78 loc) • 3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _user = require('./user');
var _user2 = _interopRequireDefault(_user);
var _linked = require('./linked');
var _linked2 = _interopRequireDefault(_linked);
var _cache = require('./cache');
var _cache2 = _interopRequireDefault(_cache);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _lock = require('../lock');
var _lock2 = _interopRequireDefault(_lock);
var _cliUx = require('cli-ux');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const debug = require('debug')('cli-engine:migrator');
const SALESFORCE_BUILTINS = ['salesforcedx', 'salesforce-alm', 'force-language-services', 'salesforce-lightning-cli'];
exports.default = class {
constructor(config) {
this.config = config;
let cache = new _cache2.default(config);
this.userPlugins = new _user2.default({ config, cache });
this.linkedPlugins = new _linked2.default({ config, cache });
this.cli = new _cliUx.CLI({ mock: config.mock });
this.lock = new _lock2.default(config);
}
async run() {
// short circuit quickly without having to aquire the writer lock
if (_fsExtra2.default.existsSync(this.userPlugins.userPluginsPJSONPath)) return;
if (!_fsExtra2.default.existsSync(_path2.default.join(this.userPlugins.userPluginsDir, 'plugins.json'))) return;
let pljson = await this._readPluginsJSON();
if (!pljson) return false;
let downgrade = await this.lock.upgrade();
await this._run(pljson);
await downgrade();
}
async _run(pljson) {
// prevent two parallel migrations from happening in case of a race
if (_fsExtra2.default.existsSync(this.userPlugins.userPluginsPJSONPath)) return;
debug('has existing plugins');
this.cli.action.start(`Migrating ${this.config.bin} CLI v5 plugins`);
debug('removing existing node_modules');
for (let p of pljson) {
if (SALESFORCE_BUILTINS.includes(p.name)) continue;
debug(`installing ${p.name}`);
await this._installPlugin(p.name, p.tag);
}
this.cli.action.stop();
}
async _readPluginsJSON() {
try {
let pljsonPath = _path2.default.join(this.userPlugins.userPluginsDir, 'plugins.json');
return _fsExtra2.default.readJSONSync(pljsonPath);
} catch (err) {
debug(err.message);
}
}
async _installPlugin(name, tag) {
try {
if (tag === 'symlink') {
await this._reinstallViaSymlink(name);
} else {
if (tag === '') tag = 'latest';
await this.userPlugins.install(name);
}
} catch (err) {
this.cli.warn(err);
}
}
async _reinstallViaSymlink(name) {
debug(`Installing via symlink: ${name}`);
let pluginPath = _fsExtra2.default.realpathSync(this.userPlugins.userPluginPath(name));
await this.linkedPlugins.add(pluginPath);
}
};