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.
Files changed (93) hide show
  1. package/README.md +130 -37
  2. package/bin/clever.js +1427 -718
  3. package/package.json +61 -77
  4. package/src/clever-client/auth-bridge.js +9 -12
  5. package/src/clever-client/ng.js +1 -1
  6. package/src/clever-client/operators.js +7 -7
  7. package/src/command-options.js +6 -6
  8. package/src/command-promise-handler.js +6 -6
  9. package/src/commands/accesslogs.js +38 -29
  10. package/src/commands/activity.js +62 -40
  11. package/src/commands/addon.js +65 -69
  12. package/src/commands/applications.js +33 -31
  13. package/src/commands/cancel-deploy.js +7 -7
  14. package/src/commands/config.js +9 -7
  15. package/src/commands/console.js +3 -3
  16. package/src/commands/create.js +32 -31
  17. package/src/commands/curl.js +14 -36
  18. package/src/commands/database.js +10 -30
  19. package/src/commands/delete.js +8 -8
  20. package/src/commands/deploy.js +60 -46
  21. package/src/commands/diag.js +27 -25
  22. package/src/commands/domain.js +89 -91
  23. package/src/commands/drain.js +26 -14
  24. package/src/commands/emails.js +24 -28
  25. package/src/commands/env.js +18 -18
  26. package/src/commands/features.js +12 -18
  27. package/src/commands/keycloak.js +11 -11
  28. package/src/commands/kv.js +13 -13
  29. package/src/commands/link.js +9 -8
  30. package/src/commands/login.js +19 -27
  31. package/src/commands/logout.js +1 -1
  32. package/src/commands/logs.js +20 -12
  33. package/src/commands/makeDefault.js +5 -5
  34. package/src/commands/matomo.js +7 -7
  35. package/src/commands/metabase.js +9 -9
  36. package/src/commands/ng.js +32 -32
  37. package/src/commands/notify-email.js +11 -15
  38. package/src/commands/open.js +1 -1
  39. package/src/commands/otoroshi.js +11 -11
  40. package/src/commands/profile.js +8 -8
  41. package/src/commands/published-config.js +11 -11
  42. package/src/commands/restart.js +15 -8
  43. package/src/commands/scale.js +25 -16
  44. package/src/commands/service.js +18 -9
  45. package/src/commands/ssh-keys.js +25 -29
  46. package/src/commands/ssh.js +1 -2
  47. package/src/commands/status.js +31 -22
  48. package/src/commands/stop.js +3 -3
  49. package/src/commands/tcp-redirs.js +27 -26
  50. package/src/commands/tokens.js +44 -43
  51. package/src/commands/unlink.js +7 -5
  52. package/src/commands/version.js +2 -4
  53. package/src/commands/webhooks.js +8 -10
  54. package/src/experimental-features.js +7 -5
  55. package/src/format-table.js +46 -15
  56. package/src/initial-setup.js +2 -32
  57. package/src/initial-update-notifier.js +18 -0
  58. package/src/lib/has-param.js +16 -0
  59. package/src/lib/ng-print.js +21 -24
  60. package/src/lib/operator-commands.js +58 -53
  61. package/src/lib/prompts.js +5 -5
  62. package/src/lib/slugify.js +1 -1
  63. package/src/logger.js +24 -22
  64. package/src/models/activity.js +3 -3
  65. package/src/models/addon.js +52 -53
  66. package/src/models/app_configuration.js +34 -32
  67. package/src/models/application.js +90 -77
  68. package/src/models/application_configuration.js +19 -27
  69. package/src/models/configuration.js +30 -32
  70. package/src/models/deployments.js +9 -19
  71. package/src/models/domain.js +10 -9
  72. package/src/models/drain.js +16 -15
  73. package/src/models/exit-strategy-option.js +15 -5
  74. package/src/models/fs-utils.js +4 -3
  75. package/src/models/git.js +26 -32
  76. package/src/models/ids-resolver.js +37 -41
  77. package/src/models/isomorphic-http-with-agent.js +3 -3
  78. package/src/models/json-array.js +5 -6
  79. package/src/models/log-v4.js +44 -52
  80. package/src/models/log.js +40 -45
  81. package/src/models/namespaces.js +4 -4
  82. package/src/models/ng-resources.js +49 -39
  83. package/src/models/ng.js +41 -40
  84. package/src/models/node-dns-resolver.js +3 -3
  85. package/src/models/notification.js +7 -10
  86. package/src/models/operator.js +8 -10
  87. package/src/models/organisation.js +5 -8
  88. package/src/models/send-to-api.js +18 -11
  89. package/src/models/user.js +6 -5
  90. package/src/models/utils.js +5 -8
  91. package/src/models/variables.js +18 -20
  92. package/src/parsers.js +34 -34
  93. 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 * as Operator from '../models/operator.js';
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 (provider, addonIdOrName, format) {
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(`${colors.green(name)} is up-to-date (${colors.green(versions.installed)})`);
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
- 🔄 ${colors.red(name)} is outdated
47
- • Installed version: ${colors.red(versions.installed)}
48
- • Latest version: ${colors.green(versions.latest)}
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 ${colors.green(versions.latest)} now?`,
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(`${colors.green(name)} is up-to-date and being rebuilt…`);
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 (provider, askedVersion, addonIdOrName) {
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 = askedVersion ?? await selectAnswer(
78
- `Which version do you want to update ${colors.blue(name)} to, current is ${colors.blue(versions.installed)}?`,
79
- versions.available.reverse(),
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 ${colors.red(targetVersion)} is not available`);
81
+ throw new Error(`Version ${styleText('red', targetVersion)} is not available`);
84
82
  }
85
83
 
86
84
  if (versions.installed === targetVersion) {
87
- Logger.printSuccess(`${colors.green(name)} is already at version ${colors.green(targetVersion)}`);
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(`${colors.green(name)} updated to ${colors.green(targetVersion)} and being rebuilt…`);
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 (provider, addonIdOrName) {
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 ${colors.red(name)}`);
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 ${colors.blue(name)}…`);
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 (provider, addonIdOrName) {
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 ${colors.red(name)}`);
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 ${colors.blue(name)}…`);
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 (provider, format) {
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(`🔎 No ${providerName} found, create one with ${colors.blue(`clever addon create ${providerName.toLocaleLowerCase()}`)} command`);
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(`• ${colors.bold(`${(operators[0].ownerId)} (${(operators[0].ownerName)})`)}`);
162
+ Logger.println(`• ${styleText('bold', `${operators[0].ownerId} (${operators[0].ownerName})`)}`);
164
163
  operators.forEach((operator) => {
165
- Logger.println(` • ${operator.name} ${colors.grey(`(${operator.realId})`)}`);
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 (provider, addonIdOrName) {
178
+ export async function operatorOpen(provider, addonIdOrName) {
180
179
  const operator = await Operator.getDetails(provider, addonIdOrName);
181
- await openBrowser(`${conf.GOTO_URL}/${operator.addonId}`, `🌐 Opening ${colors.blue(operator.addonId)} in the browser…`);
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 (provider, addonIdOrName) {
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 ${colors.blue(operator.addonId)} logs in the Clever Cloud Console…`,
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 (provider, addonIdOrName) {
206
+ export async function operatorOpenWebUi(provider, addonIdOrName) {
205
207
  const operator = await Operator.getDetails(provider, addonIdOrName);
206
- await openBrowser(operator.accessUrl, `🌐 Opening ${colors.blue(operator.addonId)} Management interface in the browser…`);
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 (provider, addonIdOrName) {
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 ${colors.blue(name)}…`);
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 (provider, addonIdOrName) {
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 ${colors.blue(name)}…`);
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 (provider, addonIdOrName, format = 'human') {
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 = provider === 'matomo'
255
- ? `${operator.version} (PHP ${operator.phpVersion})`
256
- : `${operator.version} (Java ${operator.javaVersion})`;
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 (addonIdOrName) {
284
+ function getDisplayName(addonIdOrName) {
280
285
  return addonIdOrName.addon_name ?? addonIdOrName.operator_id ?? addonIdOrName.addon_id;
281
286
  }
@@ -1,28 +1,28 @@
1
1
  import { confirm as confirmPrompt, input, password, select } from '@inquirer/prompts';
2
2
 
3
- export function promptSecret (message) {
3
+ export function promptSecret(message) {
4
4
  return password({ message, mask: true }).catch(exitOnPromptError);
5
5
  }
6
6
 
7
- export async function confirm (message, rejectionMessage) {
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 (message, rejectionMessage, expectedAnswer) {
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 (message, choices) {
21
+ export function selectAnswer(message, choices) {
22
22
  return select({ message, choices }).catch(exitOnPromptError);
23
23
  }
24
24
 
25
- function exitOnPromptError (error) {
25
+ function exitOnPromptError(error) {
26
26
  if (error instanceof Error && error.name === 'ExitPromptError') {
27
27
  process.exit(1);
28
28
  }
@@ -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 (string) {
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 colors from 'colors/safe.js';
3
- import { format } from 'node:util';
2
+ import { format, styleText } from 'node:util';
4
3
 
5
- function getPrefix (severity) {
4
+ function getPrefix(severity) {
6
5
  const prefix = `[${severity.toUpperCase()}] `;
7
6
  const prefixLength = prefix.length;
8
7
  if (severity === 'error') {
9
- return { prefix: colors.bold.red(prefix), prefixLength };
8
+ return { prefix: styleText(['bold', 'red'], prefix), prefixLength };
10
9
  }
11
10
  return { prefix, prefixLength };
12
11
  }
13
12
 
14
- function processApiError (error) {
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 (prefixLength, lines) {
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) ? line : `${blankPrefix}${line}`)
25
+ .map((line, i) => (i === 0 ? line : `${blankPrefix}${line}`))
27
26
  .join('\n');
28
27
  }
29
28
 
30
- function consoleErrorWithoutColor (line) {
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 = (severity === 'error') ? consoleErrorWithoutColor : console.log;
38
+ const consoleFn = severity === 'error' ? consoleErrorWithoutColor : console.log;
40
39
  const { prefix, prefixLength } = getPrefix(severity);
41
- return [severity, (err) => {
42
- const message = _.get(err, 'message', err);
43
- const formattedMsg = formatLines(prefixLength, processApiError(message));
44
- if (process.env.CLEVER_VERBOSE && severity === 'error') {
45
- consoleErrorWithoutColor('[STACKTRACE]');
46
- consoleErrorWithoutColor(err);
47
- consoleErrorWithoutColor('[/STACKTRACE]');
48
- }
49
- return consoleFn(`${prefix}${formattedMsg}`);
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(`${colors.bold.green('✓')} ${message}`);
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(`${colors.bold.blue('i')} ${message}`);
64
+ Logger.printInfo = (message) => console.log(`${styleText('blue', 'i')} ${message}`);
63
65
 
64
66
  // No decoration for Logger.println
65
67
  Logger.printJson = (obj) => {
@@ -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 (ownerId, appId, showAll) {
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
+ }