@axway/axway-cli-pm
Version:
Package manager for Axway products
204 lines (167 loc) • 18.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _npmPackageArg = _interopRequireDefault(require("npm-package-arg"));
var _semver = _interopRequireDefault(require("semver"));
var _snooplogg = _interopRequireDefault(require("snooplogg"));
var _path = require("path");
var _utils = require("../utils.js");
var _amplifyCliUtils = require("@axway/amplify-cli-utils");
var _pm = require("../pm.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _default = {
aliases: ['!un', '!unlink', '!r', 'rm', '!remove'],
args: [{
name: 'package',
hint: 'package[@version]',
desc: 'The package name and version to uninstall',
redact: false,
required: true
}],
desc: 'Removes the specified package',
options: {
'--json': {
callback: ({
ctx,
value
}) => ctx.jsonMode = value,
desc: 'Outputs removed packages as JSON'
}
},
skipExtensionUpdateCheck: true,
async action({
argv,
cli,
console
}) {
const {
highlight,
note
} = _snooplogg.default.styles;
const {
fetchSpec,
name,
type
} = (0, _npmPackageArg.default)(argv.package);
const installed = await (0, _pm.find)(name);
if (!installed) {
const err = new Error(`Package "${name}" is not installed`);
err.code = 'ENOTFOUND';
throw err;
}
const installedVersions = Object.keys(installed.versions);
const replacement = {};
const versions = [];
if (type === 'range') {
for (const ver of installedVersions) {
if (_semver.default.satisfies(ver, fetchSpec)) {
versions.push({
version: ver,
...installed.versions[ver]
});
delete installed.versions[ver];
}
}
} else if (type === 'version') {
const info = installed.versions[fetchSpec];
if (info) {
versions.push({
version: fetchSpec,
...info
});
delete installed.versions[fetchSpec];
}
} else if (type === 'tag' && fetchSpec === 'latest') {
let version;
for (const ver of installedVersions) {
if (!version || _semver.default.gt(ver, version)) {
version = ver;
}
}
if (version) {
versions.push({
version,
...installed.versions[version]
});
delete installed.versions[version];
}
}
if (!versions.length) {
const err = new Error(`"${name}${fetchSpec === 'latest' ? '' : `@${fetchSpec}`}" is not installed`);
err.code = 'ENOTFOUND';
throw err;
} // check if we're NOT uninstalling all versions, and if so, suggest a replacement
if (installedVersions.length > versions.length) {
const removed = versions.map(v => v.version);
const toSelectFrom = installedVersions.filter(v => !removed.includes(v));
let newVersion;
for (const ver of toSelectFrom) {
if (!newVersion || _semver.default.gt(ver, newVersion)) {
newVersion = ver;
}
}
replacement.path = installed.versions[newVersion].path;
replacement.version = newVersion;
} // unregister extension
const tasks = [{
title: `Unregistering ${highlight(name)} extension`,
task: async () => {
const cfg = await (0, _amplifyCliUtils.loadConfig)();
if (replacement.path) {
await cfg.set(`extensions.${name}`, replacement.path);
} else {
await cfg.delete(`extensions.${name}`);
}
await cfg.save();
}
}]; // add uninstall tasks
for (const {
managed,
path,
version
} of versions) {
if (managed && path.startsWith(_pm.packagesDir)) {
tasks.push({
title: `Uninstalling ${highlight(`${name}@${version}`)} ${note(`(${path})`)}`,
task: async () => {
await (0, _pm.uninstallPackage)(path);
const parent = (0, _path.dirname)(path);
if (!_fsExtra.default.readdirSync(parent).filter(file => file !== '.DS_Store').length) {
await _fsExtra.default.remove(parent);
}
}
});
}
} // run the tasks
if (tasks.length) {
try {
await (0, _utils.runListr)({
console,
json: argv.json,
tasks
});
if (!argv.json && replacement.path) {
console.log(`\n${highlight(`${name}@${replacement.version}`)} is now the active version`);
}
} catch (err) {// squelch
}
}
const cfg = await (0, _amplifyCliUtils.loadConfig)();
await cfg.delete('update.notified');
await cfg.save();
const results = {
installed,
replacement,
uninstalled: versions
};
if (argv.json) {
console.log(JSON.stringify(results, null, 2));
}
await cli.emitAction('axway:pm:uninstall', results);
}
};
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMvdW5pbnN0YWxsLmpzIiwibmFtZXMiOlsiYWxpYXNlcyIsImFyZ3MiLCJuYW1lIiwiaGludCIsImRlc2MiLCJyZWRhY3QiLCJyZXF1aXJlZCIsIm9wdGlvbnMiLCJjYWxsYmFjayIsImN0eCIsInZhbHVlIiwianNvbk1vZGUiLCJza2lwRXh0ZW5zaW9uVXBkYXRlQ2hlY2siLCJhY3Rpb24iLCJhcmd2IiwiY2xpIiwiY29uc29sZSIsImhpZ2hsaWdodCIsIm5vdGUiLCJzbm9vcGxvZ2ciLCJzdHlsZXMiLCJmZXRjaFNwZWMiLCJ0eXBlIiwicGFja2FnZSIsImluc3RhbGxlZCIsImVyciIsIkVycm9yIiwiY29kZSIsImluc3RhbGxlZFZlcnNpb25zIiwiT2JqZWN0Iiwia2V5cyIsInZlcnNpb25zIiwicmVwbGFjZW1lbnQiLCJ2ZXIiLCJzZW12ZXIiLCJzYXRpc2ZpZXMiLCJwdXNoIiwidmVyc2lvbiIsImluZm8iLCJndCIsImxlbmd0aCIsInJlbW92ZWQiLCJtYXAiLCJ2IiwidG9TZWxlY3RGcm9tIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJuZXdWZXJzaW9uIiwicGF0aCIsInRhc2tzIiwidGl0bGUiLCJ0YXNrIiwiY2ZnIiwic2V0IiwiZGVsZXRlIiwic2F2ZSIsIm1hbmFnZWQiLCJzdGFydHNXaXRoIiwicGFja2FnZXNEaXIiLCJwYXJlbnQiLCJmcyIsInJlYWRkaXJTeW5jIiwiZmlsZSIsInJlbW92ZSIsImpzb24iLCJsb2ciLCJyZXN1bHRzIiwidW5pbnN0YWxsZWQiLCJKU09OIiwic3RyaW5naWZ5IiwiZW1pdEFjdGlvbiJdLCJzb3VyY2VzIjpbImNvbW1hbmRzL3VuaW5zdGFsbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IG5wYSBmcm9tICducG0tcGFja2FnZS1hcmcnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHNub29wbG9nZyBmcm9tICdzbm9vcGxvZ2cnO1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcnVuTGlzdHIgfSBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSAnQGF4d2F5L2FtcGxpZnktY2xpLXV0aWxzJztcbmltcG9ydCB7IGZpbmQsIHBhY2thZ2VzRGlyLCB1bmluc3RhbGxQYWNrYWdlIH0gZnJvbSAnLi4vcG0uanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGFsaWFzZXM6IFsgJyF1bicsICchdW5saW5rJywgJyFyJywgJ3JtJywgJyFyZW1vdmUnIF0sXG5cdGFyZ3M6IFtcblx0XHR7XG5cdFx0XHRuYW1lOiAncGFja2FnZScsXG5cdFx0XHRoaW50OiAncGFja2FnZVtAdmVyc2lvbl0nLFxuXHRcdFx0ZGVzYzogJ1RoZSBwYWNrYWdlIG5hbWUgYW5kIHZlcnNpb24gdG8gdW5pbnN0YWxsJyxcblx0XHRcdHJlZGFjdDogZmFsc2UsXG5cdFx0XHRyZXF1aXJlZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0ZGVzYzogJ1JlbW92ZXMgdGhlIHNwZWNpZmllZCBwYWNrYWdlJyxcblx0b3B0aW9uczoge1xuXHRcdCctLWpzb24nOiB7XG5cdFx0XHRjYWxsYmFjazogKHsgY3R4LCB2YWx1ZSB9KSA9PiBjdHguanNvbk1vZGUgPSB2YWx1ZSxcblx0XHRcdGRlc2M6ICdPdXRwdXRzIHJlbW92ZWQgcGFja2FnZXMgYXMgSlNPTidcblx0XHR9XG5cdH0sXG5cdHNraXBFeHRlbnNpb25VcGRhdGVDaGVjazogdHJ1ZSxcblx0YXN5bmMgYWN0aW9uKHsgYXJndiwgY2xpLCBjb25zb2xlIH0pIHtcblx0XHRjb25zdCB7IGhpZ2hsaWdodCwgbm90ZSB9ID0gc25vb3Bsb2dnLnN0eWxlcztcblx0XHRjb25zdCB7IGZldGNoU3BlYywgbmFtZSwgdHlwZSB9ID0gbnBhKGFyZ3YucGFja2FnZSk7XG5cdFx0Y29uc3QgaW5zdGFsbGVkID0gYXdhaXQgZmluZChuYW1lKTtcblxuXHRcdGlmICghaW5zdGFsbGVkKSB7XG5cdFx0XHRjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFBhY2thZ2UgXCIke25hbWV9XCIgaXMgbm90IGluc3RhbGxlZGApO1xuXHRcdFx0ZXJyLmNvZGUgPSAnRU5PVEZPVU5EJztcblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cblx0XHRjb25zdCBpbnN0YWxsZWRWZXJzaW9ucyA9IE9iamVjdC5rZXlzKGluc3RhbGxlZC52ZXJzaW9ucyk7XG5cdFx0Y29uc3QgcmVwbGFjZW1lbnQgPSB7fTtcblx0XHRjb25zdCB2ZXJzaW9ucyA9IFtdO1xuXG5cdFx0aWYgKHR5cGUgPT09ICdyYW5nZScpIHtcblx0XHRcdGZvciAoY29uc3QgdmVyIG9mIGluc3RhbGxlZFZlcnNpb25zKSB7XG5cdFx0XHRcdGlmIChzZW12ZXIuc2F0aXNmaWVzKHZlciwgZmV0Y2hTcGVjKSkge1xuXHRcdFx0XHRcdHZlcnNpb25zLnB1c2goeyB2ZXJzaW9uOiB2ZXIsIC4uLmluc3RhbGxlZC52ZXJzaW9uc1t2ZXJdIH0pO1xuXHRcdFx0XHRcdGRlbGV0ZSBpbnN0YWxsZWQudmVyc2lvbnNbdmVyXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZlcnNpb24nKSB7XG5cdFx0XHRjb25zdCBpbmZvID0gaW5zdGFsbGVkLnZlcnNpb25zW2ZldGNoU3BlY107XG5cdFx0XHRpZiAoaW5mbykge1xuXHRcdFx0XHR2ZXJzaW9ucy5wdXNoKHsgdmVyc2lvbjogZmV0Y2hTcGVjLCAuLi5pbmZvIH0pO1xuXHRcdFx0XHRkZWxldGUgaW5zdGFsbGVkLnZlcnNpb25zW2ZldGNoU3BlY107XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSAndGFnJyAmJiBmZXRjaFNwZWMgPT09ICdsYXRlc3QnKSB7XG5cdFx0XHRsZXQgdmVyc2lvbjtcblx0XHRcdGZvciAoY29uc3QgdmVyIG9mIGluc3RhbGxlZFZlcnNpb25zKSB7XG5cdFx0XHRcdGlmICghdmVyc2lvbiB8fCBzZW12ZXIuZ3QodmVyLCB2ZXJzaW9uKSkge1xuXHRcdFx0XHRcdHZlcnNpb24gPSB2ZXI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh2ZXJzaW9uKSB7XG5cdFx0XHRcdHZlcnNpb25zLnB1c2goeyB2ZXJzaW9uLCAuLi5pbnN0YWxsZWQudmVyc2lvbnNbdmVyc2lvbl0gfSk7XG5cdFx0XHRcdGRlbGV0ZSBpbnN0YWxsZWQudmVyc2lvbnNbdmVyc2lvbl07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCF2ZXJzaW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGVyciA9IG5ldyBFcnJvcihgXCIke25hbWV9JHtmZXRjaFNwZWMgPT09ICdsYXRlc3QnID8gJycgOiBgQCR7ZmV0Y2hTcGVjfWB9XCIgaXMgbm90IGluc3RhbGxlZGApO1xuXHRcdFx0ZXJyLmNvZGUgPSAnRU5PVEZPVU5EJztcblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cblx0XHQvLyBjaGVjayBpZiB3ZSdyZSBOT1QgdW5pbnN0YWxsaW5nIGFsbCB2ZXJzaW9ucywgYW5kIGlmIHNvLCBzdWdnZXN0IGEgcmVwbGFjZW1lbnRcblx0XHRpZiAoaW5zdGFsbGVkVmVyc2lvbnMubGVuZ3RoID4gdmVyc2lvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCByZW1vdmVkID0gdmVyc2lvbnMubWFwKHYgPT4gdi52ZXJzaW9uKTtcblx0XHRcdGNvbnN0IHRvU2VsZWN0RnJvbSA9IGluc3RhbGxlZFZlcnNpb25zLmZpbHRlcih2ID0+ICFyZW1vdmVkLmluY2x1ZGVzKHYpKTtcblx0XHRcdGxldCBuZXdWZXJzaW9uO1xuXHRcdFx0Zm9yIChjb25zdCB2ZXIgb2YgdG9TZWxlY3RGcm9tKSB7XG5cdFx0XHRcdGlmICghbmV3VmVyc2lvbiB8fCBzZW12ZXIuZ3QodmVyLCBuZXdWZXJzaW9uKSkge1xuXHRcdFx0XHRcdG5ld1ZlcnNpb24gPSB2ZXI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJlcGxhY2VtZW50LnBhdGggPSBpbnN0YWxsZWQudmVyc2lvbnNbbmV3VmVyc2lvbl0ucGF0aDtcblx0XHRcdHJlcGxhY2VtZW50LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuXHRcdH1cblxuXHRcdC8vIHVucmVnaXN0ZXIgZXh0ZW5zaW9uXG5cdFx0Y29uc3QgdGFza3MgPSBbXG5cdFx0XHR7XG5cdFx0XHRcdHRpdGxlOiBgVW5yZWdpc3RlcmluZyAke2hpZ2hsaWdodChuYW1lKX0gZXh0ZW5zaW9uYCxcblx0XHRcdFx0dGFzazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNmZyA9IGF3YWl0IGxvYWRDb25maWcoKTtcblx0XHRcdFx0XHRpZiAocmVwbGFjZW1lbnQucGF0aCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgY2ZnLnNldChgZXh0ZW5zaW9ucy4ke25hbWV9YCwgcmVwbGFjZW1lbnQucGF0aCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGF3YWl0IGNmZy5kZWxldGUoYGV4dGVuc2lvbnMuJHtuYW1lfWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCBjZmcuc2F2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XTtcblxuXHRcdC8vIGFkZCB1bmluc3RhbGwgdGFza3Ncblx0XHRmb3IgKGNvbnN0IHsgbWFuYWdlZCwgcGF0aCwgdmVyc2lvbiB9IG9mIHZlcnNpb25zKSB7XG5cdFx0XHRpZiAobWFuYWdlZCAmJiBwYXRoLnN0YXJ0c1dpdGgocGFja2FnZXNEaXIpKSB7XG5cdFx0XHRcdHRhc2tzLnB1c2goe1xuXHRcdFx0XHRcdHRpdGxlOiBgVW5pbnN0YWxsaW5nICR7aGlnaGxpZ2h0KGAke25hbWV9QCR7dmVyc2lvbn1gKX0gJHtub3RlKGAoJHtwYXRofSlgKX1gLFxuXHRcdFx0XHRcdHRhc2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdGF3YWl0IHVuaW5zdGFsbFBhY2thZ2UocGF0aCk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHBhcmVudCA9IGRpcm5hbWUocGF0aCk7XG5cdFx0XHRcdFx0XHRpZiAoIWZzLnJlYWRkaXJTeW5jKHBhcmVudCkuZmlsdGVyKGZpbGUgPT4gZmlsZSAhPT0gJy5EU19TdG9yZScpLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBmcy5yZW1vdmUocGFyZW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHJ1biB0aGUgdGFza3Ncblx0XHRpZiAodGFza3MubGVuZ3RoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBydW5MaXN0cih7IGNvbnNvbGUsIGpzb246IGFyZ3YuanNvbiwgdGFza3MgfSk7XG5cblx0XHRcdFx0aWYgKCFhcmd2Lmpzb24gJiYgcmVwbGFjZW1lbnQucGF0aCkge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKGBcXG4ke2hpZ2hsaWdodChgJHtuYW1lfUAke3JlcGxhY2VtZW50LnZlcnNpb259YCl9IGlzIG5vdyB0aGUgYWN0aXZlIHZlcnNpb25gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdC8vIHNxdWVsY2hcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjZmcgPSBhd2FpdCBsb2FkQ29uZmlnKCk7XG5cdFx0YXdhaXQgY2ZnLmRlbGV0ZSgndXBkYXRlLm5vdGlmaWVkJyk7XG5cdFx0YXdhaXQgY2ZnLnNhdmUoKTtcblxuXHRcdGNvbnN0IHJlc3VsdHMgPSB7XG5cdFx0XHRpbnN0YWxsZWQsXG5cdFx0XHRyZXBsYWNlbWVudCxcblx0XHRcdHVuaW5zdGFsbGVkOiB2ZXJzaW9uc1xuXHRcdH07XG5cblx0XHRpZiAoYXJndi5qc29uKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKSk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgY2xpLmVtaXRBY3Rpb24oJ2F4d2F5OnBtOnVuaW5zdGFsbCcsIHJlc3VsdHMpO1xuXHR9XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7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