-
-
Notifications
You must be signed in to change notification settings - Fork 74
Expand file tree
/
Copy pathplugin-uninstall.js
More file actions
121 lines (108 loc) · 3.9 KB
/
plugin-uninstall.js
File metadata and controls
121 lines (108 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
'use strict';
const spawn = require('child-process-ext/spawn');
const fsp = require('fs').promises;
const fse = require('fs-extra');
const path = require('path');
const _ = require('lodash');
const isPlainObject = require('type/plain-object/is');
const yaml = require('js-yaml');
const cloudformationSchema = require('../lib/utils/serverless-utils/cloudformation-schema');
const { log, progress, style } = require('../lib/utils/serverless-utils/log');
const yamlAstParser = require('../lib/utils/yaml-ast-parser');
const npmCommandDeferred = require('../lib/utils/npm-command-deferred');
const {
getPluginInfo,
getServerlessFilePath,
validate,
} = require('../lib/commands/plugin-management');
const mainProgress = progress.get('main');
module.exports = async ({ configuration, serviceDir, configurationFilename, options }) => {
const commandRunStartTime = Date.now();
validate({ serviceDir });
const pluginInfo = getPluginInfo(options.name);
const pluginName = pluginInfo.name;
const configurationFilePath = getServerlessFilePath({ serviceDir, configurationFilename });
const context = { configuration, serviceDir, configurationFilePath, pluginName };
mainProgress.notice(`Uninstalling plugin "${pluginName}"`, { isMainEvent: true });
await uninstallPlugin(context);
await removePluginFromServerlessFile(context);
log.notice();
log.notice.success(
`Plugin "${pluginName}" uninstalled ${style.aside(
`(${Math.floor((Date.now() - commandRunStartTime) / 1000)}s)`
)}`
);
};
const uninstallPlugin = async ({ serviceDir, pluginName }) => {
await npmUninstall(pluginName, { serviceDir });
};
const removePluginFromServerlessFile = async ({ configurationFilePath, pluginName }) => {
const fileExtension = path.extname(configurationFilePath);
if (fileExtension === '.js' || fileExtension === '.ts') {
requestManualUpdate(configurationFilePath);
return;
}
if (fileExtension === '.json') {
const serverlessFileObj = await fse.readJson(configurationFilePath);
const isArrayPluginsObject = Array.isArray(serverlessFileObj.plugins);
const plugins = isArrayPluginsObject
? serverlessFileObj.plugins
: serverlessFileObj.plugins && serverlessFileObj.plugins.modules;
if (plugins) {
_.pull(plugins, pluginName);
if (!plugins.length) {
if (isArrayPluginsObject) {
delete serverlessFileObj.plugins;
} else {
delete serverlessFileObj.plugins.modules;
}
}
await fse.writeJson(configurationFilePath, serverlessFileObj);
}
return;
}
const serverlessFileObj = yaml.load(await fsp.readFile(configurationFilePath, 'utf8'), {
filename: configurationFilePath,
schema: cloudformationSchema,
});
if (serverlessFileObj.plugins != null) {
// Plugins section can be behind variables, opt-out in such case
if (isPlainObject(serverlessFileObj.plugins)) {
if (
serverlessFileObj.plugins.modules != null &&
!Array.isArray(serverlessFileObj.plugins.modules)
) {
requestManualUpdate(configurationFilePath);
return;
}
} else if (!Array.isArray(serverlessFileObj.plugins)) {
requestManualUpdate(configurationFilePath);
return;
}
}
await yamlAstParser.removeExistingArrayItem(
configurationFilePath,
Array.isArray(serverlessFileObj.plugins) ? 'plugins' : 'plugins.modules',
pluginName
);
};
const npmUninstall = async (name, { serviceDir }) => {
const { command, args } = await npmCommandDeferred;
try {
await spawn(command, [...args, 'uninstall', '--save-dev', name], {
cwd: serviceDir,
stdio: 'pipe',
});
} catch (error) {
log.error(String(error.stderrBuffer));
throw error;
}
};
const requestManualUpdate = (configurationFilePath) => {
log.notice();
log.notice.skip(
`Can't automatically remove plugin from "${path.basename(
configurationFilePath
)}" file. Please make it manually.`
);
};