Skip to content

Commit 1cd696f

Browse files
committed
feat(config-provider): flatten command hierarchy
Restructure config-provider commands to remove the `env` level: - `clever config-provider` - display help (doc-only) - `clever config-provider list` - list all configuration providers - `clever config-provider get <id>` - list environment variables - `clever config-provider set <id> <name> <value>` - set a variable - `clever config-provider rm <id> <name>` - remove a variable - `clever config-provider import <id>` - import variables from stdin - `clever config-provider open <id>` - open in Console Closes #1027
1 parent 0132290 commit 1cd696f

13 files changed

+501
-0
lines changed

docs/llms-documentation.md

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,127 @@ clever config update [options]
591591
--name <name> Set application name
592592
```
593593

594+
## config-provider
595+
596+
**Description:** Manage configuration providers
597+
598+
**Since:** unreleased
599+
600+
**Usage**
601+
```
602+
clever config-provider
603+
```
604+
605+
### config-provider get
606+
607+
**Description:** List environment variables of a configuration provider
608+
609+
**Since:** unreleased
610+
611+
**Usage**
612+
```
613+
clever config-provider get <addon-id|config-provider-id|addon-name> [options]
614+
```
615+
616+
**Arguments**
617+
```
618+
addon-id|config-provider-id|addon-name Add-on ID, real ID (config_xxx) or name (if unambiguous)
619+
```
620+
621+
**Options**
622+
```
623+
-F, --format <format> Output format (human, json, shell) (default: human)
624+
```
625+
626+
### config-provider import
627+
628+
**Description:** Load environment variables from STDIN
629+
(WARNING: this deletes all current variables and replaces them with the new list loaded from STDIN)
630+
631+
**Since:** unreleased
632+
633+
**Usage**
634+
```
635+
clever config-provider import <addon-id|config-provider-id|addon-name> [options]
636+
```
637+
638+
**Arguments**
639+
```
640+
addon-id|config-provider-id|addon-name Add-on ID, real ID (config_xxx) or name (if unambiguous)
641+
```
642+
643+
**Options**
644+
```
645+
-F, --format <format> Input format (name-equals-value, json) (default: name-equals-value)
646+
```
647+
648+
### config-provider list
649+
650+
**Description:** List configuration providers
651+
652+
**Since:** unreleased
653+
654+
**Usage**
655+
```
656+
clever config-provider list [options]
657+
```
658+
659+
**Options**
660+
```
661+
-F, --format <format> Output format (human, json) (default: human)
662+
```
663+
664+
### config-provider open
665+
666+
**Description:** Open the configuration provider in Clever Cloud Console
667+
668+
**Since:** unreleased
669+
670+
**Usage**
671+
```
672+
clever config-provider open <addon-id|config-provider-id|addon-name>
673+
```
674+
675+
**Arguments**
676+
```
677+
addon-id|config-provider-id|addon-name Add-on ID, real ID (config_xxx) or name (if unambiguous)
678+
```
679+
680+
### config-provider rm
681+
682+
**Description:** Remove an environment variable from a configuration provider
683+
684+
**Since:** unreleased
685+
686+
**Usage**
687+
```
688+
clever config-provider rm <addon-id|config-provider-id|addon-name> <variable-name>
689+
```
690+
691+
**Arguments**
692+
```
693+
addon-id|config-provider-id|addon-name Add-on ID, real ID (config_xxx) or name (if unambiguous)
694+
variable-name Name of the environment variable
695+
```
696+
697+
### config-provider set
698+
699+
**Description:** Add or update an environment variable named <variable-name> with the value <variable-value>
700+
701+
**Since:** unreleased
702+
703+
**Usage**
704+
```
705+
clever config-provider set <addon-id|config-provider-id|addon-name> <variable-name> <variable-value>
706+
```
707+
708+
**Arguments**
709+
```
710+
addon-id|config-provider-id|addon-name Add-on ID, real ID (config_xxx) or name (if unambiguous)
711+
variable-name Name of the environment variable
712+
variable-value Value of the environment variable
713+
```
714+
594715
## console
595716

596717
**Description:** Open an application in the Console

src/commands/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ These options are available for all commands:
2222
|[`clever applications`](./applications/applications.docs.md)|List linked applications|
2323
|[`clever cancel-deploy`](./cancel-deploy/cancel-deploy.docs.md)|Cancel an ongoing deployment|
2424
|[`clever config`](./config/config.docs.md)|Display or edit the configuration of your application|
25+
|[`clever config-provider`](./config-provider/config-provider.docs.md)|Manage configuration providers|
2526
|[`clever console`](./console/console.docs.md)|Open an application in the Console|
2627
|[`clever create`](./create/create.docs.md)|Create an application|
2728
|[`clever curl`](./curl/curl.docs.md)|Query Clever Cloud's API using Clever Tools credentials|
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { z } from 'zod';
2+
import { defineArgument } from '../../lib/define-argument.js';
3+
4+
export const configProviderIdOrNameArg = defineArgument({
5+
schema: z.string(),
6+
description: 'Add-on ID, real ID (config_xxx) or name (if unambiguous)',
7+
placeholder: 'addon-id|config-provider-id|addon-name',
8+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { defineCommand } from '../../lib/define-command.js';
2+
3+
export const configProviderCommand = defineCommand({
4+
description: 'Manage configuration providers',
5+
since: 'unreleased',
6+
options: {},
7+
args: [],
8+
// Parent command - no handler, only contains subcommands
9+
handler: null,
10+
});
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# 📖 `clever config-provider` command reference
2+
3+
## ➡️ `clever config-provider` <kbd>Since unreleased</kbd>
4+
5+
Manage configuration providers
6+
7+
```bash
8+
clever config-provider
9+
```
10+
11+
## ➡️ `clever config-provider get` <kbd>Since unreleased</kbd>
12+
13+
List environment variables of a configuration provider
14+
15+
```bash
16+
clever config-provider get <addon-id|config-provider-id|addon-name> [options]
17+
```
18+
19+
### 📥 Arguments
20+
21+
|Name|Description|
22+
|---|---|
23+
|`addon-id|config-provider-id|addon-name`|Add-on ID, real ID (config_xxx) or name (if unambiguous)|
24+
25+
### ⚙️ Options
26+
27+
|Name|Description|
28+
|---|---|
29+
|`-F`, `--format` `<format>`|Output format (human, json, shell) (default: human)|
30+
31+
## ➡️ `clever config-provider import` <kbd>Since unreleased</kbd>
32+
33+
Load environment variables from STDIN
34+
(WARNING: this deletes all current variables and replaces them with the new list loaded from STDIN)
35+
36+
```bash
37+
clever config-provider import <addon-id|config-provider-id|addon-name> [options]
38+
```
39+
40+
### 📥 Arguments
41+
42+
|Name|Description|
43+
|---|---|
44+
|`addon-id|config-provider-id|addon-name`|Add-on ID, real ID (config_xxx) or name (if unambiguous)|
45+
46+
### ⚙️ Options
47+
48+
|Name|Description|
49+
|---|---|
50+
|`-F`, `--format` `<format>`|Input format (name-equals-value, json) (default: name-equals-value)|
51+
52+
## ➡️ `clever config-provider list` <kbd>Since unreleased</kbd>
53+
54+
List configuration providers
55+
56+
```bash
57+
clever config-provider list [options]
58+
```
59+
60+
### ⚙️ Options
61+
62+
|Name|Description|
63+
|---|---|
64+
|`-F`, `--format` `<format>`|Output format (human, json) (default: human)|
65+
66+
## ➡️ `clever config-provider open` <kbd>Since unreleased</kbd>
67+
68+
Open the configuration provider in Clever Cloud Console
69+
70+
```bash
71+
clever config-provider open <addon-id|config-provider-id|addon-name>
72+
```
73+
74+
### 📥 Arguments
75+
76+
|Name|Description|
77+
|---|---|
78+
|`addon-id|config-provider-id|addon-name`|Add-on ID, real ID (config_xxx) or name (if unambiguous)|
79+
80+
## ➡️ `clever config-provider rm` <kbd>Since unreleased</kbd>
81+
82+
Remove an environment variable from a configuration provider
83+
84+
```bash
85+
clever config-provider rm <addon-id|config-provider-id|addon-name> <variable-name>
86+
```
87+
88+
### 📥 Arguments
89+
90+
|Name|Description|
91+
|---|---|
92+
|`addon-id|config-provider-id|addon-name`|Add-on ID, real ID (config_xxx) or name (if unambiguous)|
93+
|`variable-name`|Name of the environment variable|
94+
95+
## ➡️ `clever config-provider set` <kbd>Since unreleased</kbd>
96+
97+
Add or update an environment variable named <variable-name> with the value <variable-value>
98+
99+
```bash
100+
clever config-provider set <addon-id|config-provider-id|addon-name> <variable-name> <variable-value>
101+
```
102+
103+
### 📥 Arguments
104+
105+
|Name|Description|
106+
|---|---|
107+
|`addon-id|config-provider-id|addon-name`|Add-on ID, real ID (config_xxx) or name (if unambiguous)|
108+
|`variable-name`|Name of the environment variable|
109+
|`variable-value`|Value of the environment variable|
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { getConfigProviderEnv } from '@clevercloud/client/esm/api/v4/addon.js';
2+
import { toNameEqualsValueString } from '@clevercloud/client/esm/utils/env-vars.js';
3+
import { defineCommand } from '../../lib/define-command.js';
4+
import { Logger } from '../../logger.js';
5+
import { resolveConfigProviderId } from '../../models/config-provider.js';
6+
import { sendToApi } from '../../models/send-to-api.js';
7+
import { envFormatOption } from '../global.options.js';
8+
import { configProviderIdOrNameArg } from './config-provider.args.js';
9+
10+
export const configProviderGetCommand = defineCommand({
11+
description: 'List environment variables of a configuration provider',
12+
since: 'unreleased',
13+
options: {
14+
format: envFormatOption,
15+
},
16+
args: [configProviderIdOrNameArg],
17+
async handler(options, addonIdOrRealIdOrName) {
18+
const { format } = options;
19+
const { realId } = await resolveConfigProviderId(addonIdOrRealIdOrName);
20+
21+
// API returns an array of { name, value } objects
22+
const envVars = await getConfigProviderEnv({ configurationProviderId: realId }).then(sendToApi);
23+
24+
switch (format) {
25+
case 'json':
26+
Logger.printJson(envVars);
27+
break;
28+
case 'shell':
29+
Logger.println(toNameEqualsValueString(envVars, { addExports: true }));
30+
break;
31+
case 'human':
32+
default:
33+
Logger.println(toNameEqualsValueString(envVars, { addExports: false }));
34+
}
35+
},
36+
});
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { updateConfigProviderEnv } from '@clevercloud/client/esm/api/v4/addon.js';
2+
import { z } from 'zod';
3+
import { defineCommand } from '../../lib/define-command.js';
4+
import { defineOption } from '../../lib/define-option.js';
5+
import { Logger } from '../../logger.js';
6+
import { resolveConfigProviderId } from '../../models/config-provider.js';
7+
import { sendToApi } from '../../models/send-to-api.js';
8+
import * as variables from '../../models/variables.js';
9+
import { configProviderIdOrNameArg } from './config-provider.args.js';
10+
11+
const importFormatOption = defineOption({
12+
name: 'format',
13+
schema: z.enum(['name-equals-value', 'json']).default('name-equals-value'),
14+
description: 'Input format (name-equals-value, json)',
15+
aliases: ['F'],
16+
placeholder: 'format',
17+
});
18+
19+
export const configProviderImportCommand = defineCommand({
20+
description:
21+
'Load environment variables from STDIN\n(WARNING: this deletes all current variables and replaces them with the new list loaded from STDIN)',
22+
since: 'unreleased',
23+
options: {
24+
format: importFormatOption,
25+
},
26+
args: [configProviderIdOrNameArg],
27+
async handler(options, addonIdOrRealIdOrName) {
28+
const { format } = options;
29+
const { realId } = await resolveConfigProviderId(addonIdOrRealIdOrName);
30+
31+
// readVariablesFromStdin returns { NAME: "value" } format
32+
// but the API expects [{ name, value }] format
33+
const envVarsObject = await variables.readVariablesFromStdin(format);
34+
const envVarsArray = Object.entries(envVarsObject).map(([name, value]) => ({ name, value }));
35+
36+
await updateConfigProviderEnv({ configurationProviderId: realId }, envVarsArray).then(sendToApi);
37+
38+
Logger.println('Environment variables have been set');
39+
},
40+
});
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { defineCommand } from '../../lib/define-command.js';
2+
import { styleText } from '../../lib/style-text.js';
3+
import { Logger } from '../../logger.js';
4+
import { findAddonsByAddonProvider } from '../../models/ids-resolver.js';
5+
import { humanJsonOutputFormatOption } from '../global.options.js';
6+
7+
export const configProviderListCommand = defineCommand({
8+
description: 'List configuration providers',
9+
since: 'unreleased',
10+
options: {
11+
format: humanJsonOutputFormatOption,
12+
},
13+
args: [],
14+
async handler(options) {
15+
const { format } = options;
16+
const deployed = await findAddonsByAddonProvider('config-provider');
17+
const providersPerOwner = Object.groupBy(deployed, (provider) => provider.ownerId);
18+
19+
switch (format) {
20+
case 'json':
21+
Logger.printJson(providersPerOwner);
22+
break;
23+
case 'human':
24+
default:
25+
if (deployed.length === 0) {
26+
Logger.println(
27+
`No configuration provider found, create one with ${styleText('blue', 'clever addon create config-provider')} command`,
28+
);
29+
return;
30+
}
31+
32+
Logger.println(`Found ${deployed.length} configuration provider${deployed.length > 1 ? 's' : ''}:`);
33+
Logger.println();
34+
35+
Object.values(providersPerOwner).forEach((providers) => {
36+
Logger.println(`${styleText('bold', `${providers[0].ownerId} (${providers[0].ownerName})`)}`);
37+
providers.forEach((provider) => {
38+
Logger.println(` ${provider.name} ${styleText('grey', `(${provider.realId})`)}`);
39+
});
40+
Logger.println();
41+
});
42+
break;
43+
}
44+
},
45+
});

0 commit comments

Comments
 (0)