clever-tools 3.14.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -37
- package/bin/clever.js +1427 -718
- package/package.json +61 -77
- package/src/clever-client/auth-bridge.js +9 -12
- package/src/clever-client/ng.js +1 -1
- package/src/clever-client/operators.js +7 -7
- package/src/command-options.js +6 -6
- package/src/command-promise-handler.js +6 -6
- package/src/commands/accesslogs.js +38 -29
- package/src/commands/activity.js +62 -40
- package/src/commands/addon.js +65 -69
- package/src/commands/applications.js +33 -31
- package/src/commands/cancel-deploy.js +7 -7
- package/src/commands/config.js +9 -7
- package/src/commands/console.js +3 -3
- package/src/commands/create.js +32 -31
- package/src/commands/curl.js +14 -36
- package/src/commands/database.js +10 -30
- package/src/commands/delete.js +8 -8
- package/src/commands/deploy.js +60 -46
- package/src/commands/diag.js +27 -25
- package/src/commands/domain.js +89 -91
- package/src/commands/drain.js +26 -14
- package/src/commands/emails.js +24 -28
- package/src/commands/env.js +18 -18
- package/src/commands/features.js +12 -18
- package/src/commands/keycloak.js +11 -11
- package/src/commands/kv.js +13 -13
- package/src/commands/link.js +9 -8
- package/src/commands/login.js +19 -27
- package/src/commands/logout.js +1 -1
- package/src/commands/logs.js +20 -12
- package/src/commands/makeDefault.js +5 -5
- package/src/commands/matomo.js +7 -7
- package/src/commands/metabase.js +9 -9
- package/src/commands/ng.js +32 -32
- package/src/commands/notify-email.js +11 -15
- package/src/commands/open.js +1 -1
- package/src/commands/otoroshi.js +11 -11
- package/src/commands/profile.js +8 -8
- package/src/commands/published-config.js +11 -11
- package/src/commands/restart.js +15 -8
- package/src/commands/scale.js +25 -16
- package/src/commands/service.js +18 -9
- package/src/commands/ssh-keys.js +25 -29
- package/src/commands/ssh.js +1 -2
- package/src/commands/status.js +31 -22
- package/src/commands/stop.js +3 -3
- package/src/commands/tcp-redirs.js +27 -26
- package/src/commands/tokens.js +44 -43
- package/src/commands/unlink.js +7 -5
- package/src/commands/version.js +2 -4
- package/src/commands/webhooks.js +8 -10
- package/src/experimental-features.js +7 -5
- package/src/format-table.js +46 -15
- package/src/initial-setup.js +2 -32
- package/src/initial-update-notifier.js +18 -0
- package/src/lib/has-param.js +16 -0
- package/src/lib/ng-print.js +21 -24
- package/src/lib/operator-commands.js +58 -53
- package/src/lib/prompts.js +5 -5
- package/src/lib/slugify.js +1 -1
- package/src/logger.js +24 -22
- package/src/models/activity.js +3 -3
- package/src/models/addon.js +52 -53
- package/src/models/app_configuration.js +34 -32
- package/src/models/application.js +90 -77
- package/src/models/application_configuration.js +19 -27
- package/src/models/configuration.js +30 -32
- package/src/models/deployments.js +9 -19
- package/src/models/domain.js +10 -9
- package/src/models/drain.js +16 -15
- package/src/models/exit-strategy-option.js +15 -5
- package/src/models/fs-utils.js +4 -3
- package/src/models/git.js +26 -32
- package/src/models/ids-resolver.js +37 -41
- package/src/models/isomorphic-http-with-agent.js +3 -3
- package/src/models/json-array.js +5 -6
- package/src/models/log-v4.js +44 -52
- package/src/models/log.js +40 -45
- package/src/models/namespaces.js +4 -4
- package/src/models/ng-resources.js +49 -39
- package/src/models/ng.js +41 -40
- package/src/models/node-dns-resolver.js +3 -3
- package/src/models/notification.js +7 -10
- package/src/models/operator.js +8 -10
- package/src/models/organisation.js +5 -8
- package/src/models/send-to-api.js +18 -11
- package/src/models/user.js +6 -5
- package/src/models/utils.js +5 -8
- package/src/models/variables.js +18 -20
- package/src/parsers.js +34 -34
- package/src/load-package-json.cjs +0 -5
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import colors from 'colors/safe.js';
|
|
2
|
-
import _ from 'lodash';
|
|
3
1
|
import dedent from 'dedent';
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
import { Logger } from '../logger.js';
|
|
8
|
-
import { sendToApi } from '../models/send-to-api.js';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import { styleText } from 'node:util';
|
|
9
4
|
import {
|
|
10
5
|
ngDisableOperator,
|
|
11
6
|
ngEnableOperator,
|
|
@@ -14,10 +9,13 @@ import {
|
|
|
14
9
|
versionCheck,
|
|
15
10
|
versionUpdate,
|
|
16
11
|
} from '../clever-client/operators.js';
|
|
12
|
+
import { Logger } from '../logger.js';
|
|
13
|
+
import { conf } from '../models/configuration.js';
|
|
17
14
|
import { findAddonsByAddonProvider } from '../models/ids-resolver.js';
|
|
15
|
+
import * as Operator from '../models/operator.js';
|
|
16
|
+
import { sendToApi } from '../models/send-to-api.js';
|
|
18
17
|
import { openBrowser } from '../models/utils.js';
|
|
19
18
|
import { confirm, selectAnswer } from './prompts.js';
|
|
20
|
-
import { conf } from '../models/configuration.js';
|
|
21
19
|
|
|
22
20
|
/**
|
|
23
21
|
* Check the version of an operator
|
|
@@ -26,8 +24,7 @@ import { conf } from '../models/configuration.js';
|
|
|
26
24
|
* @param {string} params.options.format The output format
|
|
27
25
|
* @returns {Promise<void>}
|
|
28
26
|
*/
|
|
29
|
-
export async function operatorCheckVersion
|
|
30
|
-
|
|
27
|
+
export async function operatorCheckVersion(provider, addonIdOrName, format) {
|
|
31
28
|
const realId = await Operator.getSingleRealId(addonIdOrName);
|
|
32
29
|
const name = getDisplayName(addonIdOrName);
|
|
33
30
|
const versions = await versionCheck({ provider, realId }).then(sendToApi);
|
|
@@ -39,23 +36,22 @@ export async function operatorCheckVersion (provider, addonIdOrName, format) {
|
|
|
39
36
|
case 'human':
|
|
40
37
|
default:
|
|
41
38
|
if (!versions.needUpdate || (provider === 'metabase' && versions.installed === 'community-latest')) {
|
|
42
|
-
Logger.printSuccess(`${
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
39
|
+
Logger.printSuccess(`${styleText('green', name)} is up-to-date (${styleText('green', versions.installed)})`);
|
|
40
|
+
} else {
|
|
45
41
|
Logger.println(dedent`
|
|
46
|
-
🔄 ${
|
|
47
|
-
• Installed version: ${
|
|
48
|
-
• Latest version: ${
|
|
42
|
+
🔄 ${styleText('red', name)} is outdated
|
|
43
|
+
• Installed version: ${styleText('red', versions.installed)}
|
|
44
|
+
• Latest version: ${styleText('green', versions.latest)}
|
|
49
45
|
`);
|
|
50
46
|
Logger.println();
|
|
51
47
|
|
|
52
48
|
await confirm(
|
|
53
|
-
`Do you want to update it to ${
|
|
49
|
+
`Do you want to update it to ${styleText('green', versions.latest)} now?`,
|
|
54
50
|
'No confirmation, aborting version update',
|
|
55
51
|
);
|
|
56
52
|
|
|
57
53
|
await versionUpdate({ provider, realId }, { targetVersion: versions.latest }).then(sendToApi);
|
|
58
|
-
Logger.printSuccess(`${
|
|
54
|
+
Logger.printSuccess(`${styleText('green', name)} is up-to-date and being rebuilt…`);
|
|
59
55
|
}
|
|
60
56
|
break;
|
|
61
57
|
}
|
|
@@ -68,28 +64,30 @@ export async function operatorCheckVersion (provider, addonIdOrName, format) {
|
|
|
68
64
|
* @param {{ addon_name?: string, operator_id?: string, addon_id?: string }} addonIdOrName The operator's name or ID
|
|
69
65
|
* @returns {Promise<void>}
|
|
70
66
|
*/
|
|
71
|
-
export async function operatorUpdateVersion
|
|
67
|
+
export async function operatorUpdateVersion(provider, askedVersion, addonIdOrName) {
|
|
72
68
|
const realId = await Operator.getSingleRealId(addonIdOrName);
|
|
73
69
|
const name = getDisplayName(addonIdOrName);
|
|
74
70
|
|
|
75
71
|
const versions = await versionCheck({ provider, realId }).then(sendToApi);
|
|
76
72
|
|
|
77
|
-
const targetVersion =
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
const targetVersion =
|
|
74
|
+
askedVersion ??
|
|
75
|
+
(await selectAnswer(
|
|
76
|
+
`Which version do you want to update ${styleText('blue', name)} to, current is ${styleText('blue', versions.installed)}?`,
|
|
77
|
+
versions.available.reverse(),
|
|
78
|
+
));
|
|
81
79
|
|
|
82
80
|
if (!versions.available.includes(targetVersion)) {
|
|
83
|
-
throw new Error(`Version ${
|
|
81
|
+
throw new Error(`Version ${styleText('red', targetVersion)} is not available`);
|
|
84
82
|
}
|
|
85
83
|
|
|
86
84
|
if (versions.installed === targetVersion) {
|
|
87
|
-
Logger.printSuccess(`${
|
|
85
|
+
Logger.printSuccess(`${styleText('green', name)} is already at version ${styleText('green', targetVersion)}`);
|
|
88
86
|
return;
|
|
89
87
|
}
|
|
90
88
|
|
|
91
89
|
await versionUpdate({ provider, realId }, { targetVersion }).then(sendToApi);
|
|
92
|
-
Logger.printSuccess(`${
|
|
90
|
+
Logger.printSuccess(`${styleText('green', name)} updated to ${styleText('green', targetVersion)} and being rebuilt…`);
|
|
93
91
|
}
|
|
94
92
|
|
|
95
93
|
/**
|
|
@@ -99,15 +97,15 @@ export async function operatorUpdateVersion (provider, askedVersion, addonIdOrNa
|
|
|
99
97
|
* @returns {Promise<void>}
|
|
100
98
|
* @throws {Error} If the Network Group feature is already disabled
|
|
101
99
|
*/
|
|
102
|
-
export async function operatorNgDisable
|
|
100
|
+
export async function operatorNgDisable(provider, addonIdOrName) {
|
|
103
101
|
const name = getDisplayName(addonIdOrName);
|
|
104
102
|
const operator = await Operator.getDetails(provider, addonIdOrName);
|
|
105
103
|
if (!operator.features.networkGroup?.id) {
|
|
106
|
-
throw new Error(`Network Group is already disabled on ${
|
|
104
|
+
throw new Error(`Network Group is already disabled on ${styleText('red', name)}`);
|
|
107
105
|
}
|
|
108
106
|
|
|
109
107
|
await ngDisableOperator({ provider, realId: operator.resourceId }).then(sendToApi);
|
|
110
|
-
Logger.println(`Disabling Network Group on ${
|
|
108
|
+
Logger.println(`Disabling Network Group on ${styleText('blue', name)}…`);
|
|
111
109
|
|
|
112
110
|
await operatorPrint(provider, addonIdOrName);
|
|
113
111
|
}
|
|
@@ -119,16 +117,16 @@ export async function operatorNgDisable (provider, addonIdOrName) {
|
|
|
119
117
|
* @returns {Promise<void>}
|
|
120
118
|
* @throws {Error} If the Network Group feature is already enabled
|
|
121
119
|
*/
|
|
122
|
-
export async function operatorNgEnable
|
|
120
|
+
export async function operatorNgEnable(provider, addonIdOrName) {
|
|
123
121
|
const name = getDisplayName(addonIdOrName);
|
|
124
122
|
const operator = await Operator.getDetails(provider, addonIdOrName);
|
|
125
123
|
|
|
126
124
|
if (operator.features.networkGroup?.id) {
|
|
127
|
-
throw new Error(`Network Group is already enabled on ${
|
|
125
|
+
throw new Error(`Network Group is already enabled on ${styleText('red', name)}`);
|
|
128
126
|
}
|
|
129
127
|
|
|
130
128
|
await ngEnableOperator({ provider, realId: operator.resourceId }).then(sendToApi);
|
|
131
|
-
Logger.println(`Enabling Network Group on ${
|
|
129
|
+
Logger.println(`Enabling Network Group on ${styleText('blue', name)}…`);
|
|
132
130
|
|
|
133
131
|
await operatorPrint(provider, addonIdOrName);
|
|
134
132
|
}
|
|
@@ -139,7 +137,7 @@ export async function operatorNgEnable (provider, addonIdOrName) {
|
|
|
139
137
|
* @param {string} format The output format
|
|
140
138
|
* @returns {Promise<void>}
|
|
141
139
|
*/
|
|
142
|
-
export async function operatorList
|
|
140
|
+
export async function operatorList(provider, format) {
|
|
143
141
|
const deployed = await findAddonsByAddonProvider(provider);
|
|
144
142
|
const providerName = _.capitalize(provider.replace('addon-', ''));
|
|
145
143
|
const operatorsPerOwner = _.groupBy(deployed, 'ownerId');
|
|
@@ -150,9 +148,10 @@ export async function operatorList (provider, format) {
|
|
|
150
148
|
break;
|
|
151
149
|
case 'human':
|
|
152
150
|
default:
|
|
153
|
-
|
|
154
151
|
if (deployed.length === 0) {
|
|
155
|
-
Logger.println(
|
|
152
|
+
Logger.println(
|
|
153
|
+
`🔎 No ${providerName} found, create one with ${styleText('blue', `clever addon create ${providerName.toLocaleLowerCase()}`)} command`,
|
|
154
|
+
);
|
|
156
155
|
return;
|
|
157
156
|
}
|
|
158
157
|
|
|
@@ -160,9 +159,9 @@ export async function operatorList (provider, format) {
|
|
|
160
159
|
Logger.println();
|
|
161
160
|
|
|
162
161
|
Object.values(operatorsPerOwner).forEach((operators) => {
|
|
163
|
-
Logger.println(`• ${
|
|
162
|
+
Logger.println(`• ${styleText('bold', `${operators[0].ownerId} (${operators[0].ownerName})`)}`);
|
|
164
163
|
operators.forEach((operator) => {
|
|
165
|
-
Logger.println(` • ${operator.name} ${
|
|
164
|
+
Logger.println(` • ${operator.name} ${styleText('grey', `(${operator.realId})`)}`);
|
|
166
165
|
});
|
|
167
166
|
Logger.println();
|
|
168
167
|
});
|
|
@@ -176,9 +175,12 @@ export async function operatorList (provider, format) {
|
|
|
176
175
|
* @param {{ addon_name?: string, operator_id?: string, addon_id?: string }} addonIdOrName The operator's name or ID
|
|
177
176
|
* @returns {Promise<void>}
|
|
178
177
|
*/
|
|
179
|
-
export async function operatorOpen
|
|
178
|
+
export async function operatorOpen(provider, addonIdOrName) {
|
|
180
179
|
const operator = await Operator.getDetails(provider, addonIdOrName);
|
|
181
|
-
await openBrowser(
|
|
180
|
+
await openBrowser(
|
|
181
|
+
`${conf.GOTO_URL}/${operator.addonId}`,
|
|
182
|
+
`🌐 Opening ${styleText('blue', operator.addonId)} in the browser…`,
|
|
183
|
+
);
|
|
182
184
|
}
|
|
183
185
|
|
|
184
186
|
/**
|
|
@@ -187,11 +189,11 @@ export async function operatorOpen (provider, addonIdOrName) {
|
|
|
187
189
|
* @param {{ addon_name?: string, operator_id?: string, addon_id?: string }} addonIdOrName The operator's name or ID
|
|
188
190
|
* @returns {Promise<void>}
|
|
189
191
|
*/
|
|
190
|
-
export async function operatorOpenLogs
|
|
192
|
+
export async function operatorOpenLogs(provider, addonIdOrName) {
|
|
191
193
|
const operator = await Operator.getDetails(provider, addonIdOrName);
|
|
192
194
|
await openBrowser(
|
|
193
195
|
`/organisations/${operator.ownerId}/applications/${operator.resources.entrypoint}/logs`,
|
|
194
|
-
`🌐 Opening ${
|
|
196
|
+
`🌐 Opening ${styleText('blue', operator.addonId)} logs in the Clever Cloud Console…`,
|
|
195
197
|
);
|
|
196
198
|
}
|
|
197
199
|
|
|
@@ -201,9 +203,12 @@ export async function operatorOpenLogs (provider, addonIdOrName) {
|
|
|
201
203
|
* @param {{ addon_name?: string, operator_id?: string, addon_id?: string }} addonIdOrName The operator's name or ID
|
|
202
204
|
* @returns {Promise<void>}
|
|
203
205
|
*/
|
|
204
|
-
export async function operatorOpenWebUi
|
|
206
|
+
export async function operatorOpenWebUi(provider, addonIdOrName) {
|
|
205
207
|
const operator = await Operator.getDetails(provider, addonIdOrName);
|
|
206
|
-
await openBrowser(
|
|
208
|
+
await openBrowser(
|
|
209
|
+
operator.accessUrl,
|
|
210
|
+
`🌐 Opening ${styleText('blue', operator.addonId)} Management interface in the browser…`,
|
|
211
|
+
);
|
|
207
212
|
}
|
|
208
213
|
|
|
209
214
|
/**
|
|
@@ -213,11 +218,11 @@ export async function operatorOpenWebUi (provider, addonIdOrName) {
|
|
|
213
218
|
* @param {{ addon_name?: string, operator_id?: string, addon_id?: string }} addonIdOrName The operator's name or ID
|
|
214
219
|
* @returns {Promise<void>}
|
|
215
220
|
*/
|
|
216
|
-
export async function operatorReboot
|
|
221
|
+
export async function operatorReboot(provider, addonIdOrName) {
|
|
217
222
|
const name = getDisplayName(addonIdOrName);
|
|
218
223
|
const realId = await Operator.getSingleRealId(addonIdOrName);
|
|
219
224
|
await rebootOperator({ provider, realId }).then(sendToApi);
|
|
220
|
-
Logger.println(`🔄 Restarting ${
|
|
225
|
+
Logger.println(`🔄 Restarting ${styleText('blue', name)}…`);
|
|
221
226
|
}
|
|
222
227
|
|
|
223
228
|
/**
|
|
@@ -227,11 +232,11 @@ export async function operatorReboot (provider, addonIdOrName) {
|
|
|
227
232
|
* @param {{ addon_name?: string, operator_id?: string, addon_id?: string }} addonIdOrName The operator's name or ID
|
|
228
233
|
* @returns {Promise<void>}
|
|
229
234
|
*/
|
|
230
|
-
export async function operatorRebuild
|
|
235
|
+
export async function operatorRebuild(provider, addonIdOrName) {
|
|
231
236
|
const name = getDisplayName(addonIdOrName);
|
|
232
237
|
const realId = await Operator.getSingleRealId(addonIdOrName);
|
|
233
238
|
await rebuildOperator({ provider, realId }).then(sendToApi);
|
|
234
|
-
Logger.println(`🔄 Rebuilding ${
|
|
239
|
+
Logger.println(`🔄 Rebuilding ${styleText('blue', name)}…`);
|
|
235
240
|
}
|
|
236
241
|
|
|
237
242
|
/**
|
|
@@ -241,8 +246,7 @@ export async function operatorRebuild (provider, addonIdOrName) {
|
|
|
241
246
|
* @param {string} format The output format
|
|
242
247
|
* @returns {void}
|
|
243
248
|
*/
|
|
244
|
-
export async function operatorPrint
|
|
245
|
-
|
|
249
|
+
export async function operatorPrint(provider, addonIdOrName, format = 'human') {
|
|
246
250
|
const operator = await Operator.getDetails(provider, addonIdOrName);
|
|
247
251
|
|
|
248
252
|
const dataToPrint = {
|
|
@@ -251,9 +255,10 @@ export async function operatorPrint (provider, addonIdOrName, format = 'human')
|
|
|
251
255
|
Owner: operator.ownerId,
|
|
252
256
|
};
|
|
253
257
|
|
|
254
|
-
dataToPrint.Version =
|
|
255
|
-
|
|
256
|
-
|
|
258
|
+
dataToPrint.Version =
|
|
259
|
+
provider === 'matomo'
|
|
260
|
+
? `${operator.version} (PHP ${operator.phpVersion})`
|
|
261
|
+
: `${operator.version} (Java ${operator.javaVersion})`;
|
|
257
262
|
|
|
258
263
|
dataToPrint['Access URL'] = operator.accessUrl;
|
|
259
264
|
|
|
@@ -276,6 +281,6 @@ export async function operatorPrint (provider, addonIdOrName, format = 'human')
|
|
|
276
281
|
}
|
|
277
282
|
}
|
|
278
283
|
|
|
279
|
-
function getDisplayName
|
|
284
|
+
function getDisplayName(addonIdOrName) {
|
|
280
285
|
return addonIdOrName.addon_name ?? addonIdOrName.operator_id ?? addonIdOrName.addon_id;
|
|
281
286
|
}
|
package/src/lib/prompts.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import { confirm as confirmPrompt, input, password, select } from '@inquirer/prompts';
|
|
2
2
|
|
|
3
|
-
export function promptSecret
|
|
3
|
+
export function promptSecret(message) {
|
|
4
4
|
return password({ message, mask: true }).catch(exitOnPromptError);
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
export async function confirm
|
|
7
|
+
export async function confirm(message, rejectionMessage) {
|
|
8
8
|
const answer = await confirmPrompt({ message }).catch(exitOnPromptError);
|
|
9
9
|
if (!answer) {
|
|
10
10
|
throw new Error(rejectionMessage);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
export async function confirmAnswer
|
|
14
|
+
export async function confirmAnswer(message, rejectionMessage, expectedAnswer) {
|
|
15
15
|
const answer = await input({ message }).catch(exitOnPromptError);
|
|
16
16
|
if (answer !== expectedAnswer) {
|
|
17
17
|
throw new Error(rejectionMessage);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export function selectAnswer
|
|
21
|
+
export function selectAnswer(message, choices) {
|
|
22
22
|
return select({ message, choices }).catch(exitOnPromptError);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
function exitOnPromptError
|
|
25
|
+
function exitOnPromptError(error) {
|
|
26
26
|
if (error instanceof Error && error.name === 'ExitPromptError') {
|
|
27
27
|
process.exit(1);
|
|
28
28
|
}
|
package/src/lib/slugify.js
CHANGED
|
@@ -5,6 +5,6 @@ import slugifyRaw from 'slugify';
|
|
|
5
5
|
* @param {string} string - The string to be converted to a slug
|
|
6
6
|
* @returns {string} The slugified string
|
|
7
7
|
*/
|
|
8
|
-
export function slugify
|
|
8
|
+
export function slugify(string) {
|
|
9
9
|
return slugifyRaw(string, { strict: true });
|
|
10
10
|
}
|
package/src/logger.js
CHANGED
|
@@ -1,33 +1,32 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
-
import
|
|
3
|
-
import { format } from 'node:util';
|
|
2
|
+
import { format, styleText } from 'node:util';
|
|
4
3
|
|
|
5
|
-
function getPrefix
|
|
4
|
+
function getPrefix(severity) {
|
|
6
5
|
const prefix = `[${severity.toUpperCase()}] `;
|
|
7
6
|
const prefixLength = prefix.length;
|
|
8
7
|
if (severity === 'error') {
|
|
9
|
-
return { prefix:
|
|
8
|
+
return { prefix: styleText(['bold', 'red'], prefix), prefixLength };
|
|
10
9
|
}
|
|
11
10
|
return { prefix, prefixLength };
|
|
12
11
|
}
|
|
13
12
|
|
|
14
|
-
function processApiError
|
|
13
|
+
function processApiError(error) {
|
|
15
14
|
if (error.id == null || error.message == null) {
|
|
16
15
|
return error;
|
|
17
16
|
}
|
|
18
17
|
const fields = _.map(error.fields, (msg, field) => `${field}: ${msg}`);
|
|
19
18
|
return [`${error.message} [${error.id}]`, ...fields].join('\n');
|
|
20
|
-
}
|
|
19
|
+
}
|
|
21
20
|
|
|
22
|
-
function formatLines
|
|
21
|
+
function formatLines(prefixLength, lines) {
|
|
23
22
|
const blankPrefix = _.repeat(' ', prefixLength);
|
|
24
23
|
return (lines || '')
|
|
25
24
|
.split('\n')
|
|
26
|
-
.map((line, i) => (i === 0
|
|
25
|
+
.map((line, i) => (i === 0 ? line : `${blankPrefix}${line}`))
|
|
27
26
|
.join('\n');
|
|
28
27
|
}
|
|
29
28
|
|
|
30
|
-
function consoleErrorWithoutColor
|
|
29
|
+
function consoleErrorWithoutColor(line) {
|
|
31
30
|
process.stderr.write(format(line) + '\n');
|
|
32
31
|
}
|
|
33
32
|
|
|
@@ -36,18 +35,21 @@ export const Logger = _(['debug', 'info', 'warn', 'error'])
|
|
|
36
35
|
if (process.env.CLEVER_QUIET || (!process.env.CLEVER_VERBOSE && (severity === 'debug' || severity === 'info'))) {
|
|
37
36
|
return [severity, _.noop];
|
|
38
37
|
}
|
|
39
|
-
const consoleFn =
|
|
38
|
+
const consoleFn = severity === 'error' ? consoleErrorWithoutColor : console.log;
|
|
40
39
|
const { prefix, prefixLength } = getPrefix(severity);
|
|
41
|
-
return [
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
40
|
+
return [
|
|
41
|
+
severity,
|
|
42
|
+
(err) => {
|
|
43
|
+
const message = _.get(err, 'message', err);
|
|
44
|
+
const formattedMsg = formatLines(prefixLength, processApiError(message));
|
|
45
|
+
if (process.env.CLEVER_VERBOSE && severity === 'error') {
|
|
46
|
+
consoleErrorWithoutColor('[STACKTRACE]');
|
|
47
|
+
consoleErrorWithoutColor(err);
|
|
48
|
+
consoleErrorWithoutColor('[/STACKTRACE]');
|
|
49
|
+
}
|
|
50
|
+
return consoleFn(`${prefix}${formattedMsg}`);
|
|
51
|
+
},
|
|
52
|
+
];
|
|
51
53
|
})
|
|
52
54
|
.fromPairs()
|
|
53
55
|
.value();
|
|
@@ -56,10 +58,10 @@ export const Logger = _(['debug', 'info', 'warn', 'error'])
|
|
|
56
58
|
Logger.println = console.log;
|
|
57
59
|
|
|
58
60
|
// Logger for success with a green check before the message
|
|
59
|
-
Logger.printSuccess = (message) => console.log(`${
|
|
61
|
+
Logger.printSuccess = (message) => console.log(`${styleText(['bold', 'green'], '✓')} ${message}`);
|
|
60
62
|
|
|
61
63
|
// Logger for information with a blue 'i' before the message
|
|
62
|
-
Logger.printInfo = (message) => console.log(`${
|
|
64
|
+
Logger.printInfo = (message) => console.log(`${styleText('blue', 'i')} ${message}`);
|
|
63
65
|
|
|
64
66
|
// No decoration for Logger.println
|
|
65
67
|
Logger.printJson = (obj) => {
|
package/src/models/activity.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { sendToApi } from './send-to-api.js';
|
|
2
1
|
import { getAllDeployments } from '@clevercloud/client/esm/api/v2/application.js';
|
|
2
|
+
import { sendToApi } from './send-to-api.js';
|
|
3
3
|
|
|
4
|
-
export function list
|
|
4
|
+
export function list(ownerId, appId, showAll) {
|
|
5
5
|
const limit = showAll ? null : 10;
|
|
6
6
|
return getAllDeployments({ id: ownerId, appId, limit }).then(sendToApi);
|
|
7
|
-
}
|
|
7
|
+
}
|