UNPKG

@axway/axway-cli-pm

Version:

Package manager for Axway products

204 lines (167 loc) 18.2 kB
"use strict"; 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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